# HG changeset patch
# User heinrichsweikamp
# Date 1263305159 -3600
# Node ID 96a35aeda5f2d89d77df68a6c991aede7ab97d8f
Initial setup
diff -r 000000000000 -r 96a35aeda5f2 code_part1/OSTC_code_asm_part1/18f4685_ostc_mkII.lkr
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/code_part1/OSTC_code_asm_part1/18f4685_ostc_mkII.lkr Tue Jan 12 15:05:59 2010 +0100
@@ -0,0 +1,32 @@
+// File: 18f4685.lkr
+// Sample linker script for the PIC18F4685 processor
+
+// Not intended for use with MPLAB C18. For C18 projects,
+// use the linker scripts provided with that product.
+
+LIBPATH .
+
+CODEPAGE NAME=page START=0x0 END=0x17EFF
+CODEPAGE NAME=idlocs START=0x200000 END=0x200007 PROTECTED
+CODEPAGE NAME=config START=0x300000 END=0x30000D PROTECTED
+CODEPAGE NAME=devid START=0x3FFFFE END=0x3FFFFF PROTECTED
+CODEPAGE NAME=eedata START=0xF00000 END=0xF003FF PROTECTED
+
+ACCESSBANK NAME=accessram START=0x0 END=0x5F
+DATABANK NAME=gpr0 START=0x60 END=0xFF
+DATABANK NAME=gpr1 START=0x100 END=0x1FF
+DATABANK NAME=gpr2 START=0x200 END=0x2FF
+DATABANK NAME=gpr3 START=0x300 END=0x3FF
+DATABANK NAME=gpr4 START=0x400 END=0x4FF
+DATABANK NAME=gpr5 START=0x500 END=0x5FF
+DATABANK NAME=gpr6 START=0x600 END=0x6FF
+DATABANK NAME=gpr7 START=0x700 END=0x7FF
+DATABANK NAME=gpr8 START=0x800 END=0x8FF
+DATABANK NAME=gpr9 START=0x900 END=0x9FF
+DATABANK NAME=gpr10 START=0xA00 END=0xAFF
+DATABANK NAME=gpr11 START=0xB00 END=0xBFF
+DATABANK NAME=gpr12 START=0xC00 END=0xCFF
+DATABANK NAME=sfr13 START=0xD00 END=0xDFF PROTECTED
+DATABANK NAME=sfr14 START=0xE00 END=0xEFF PROTECTED
+DATABANK NAME=sfr15 START=0xF00 END=0xF5F PROTECTED
+ACCESSBANK NAME=accesssfr START=0xF60 END=0xFFF PROTECTED
diff -r 000000000000 -r 96a35aeda5f2 code_part1/OSTC_code_asm_part1/MAIN.ASM
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/code_part1/OSTC_code_asm_part1/MAIN.ASM Tue Jan 12 15:05:59 2010 +0100
@@ -0,0 +1,144 @@
+
+; OSTC - diving computer code
+; Copyright (C) 2008 HeinrichsWeikamp GbR
+
+; 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 3 of the License, or
+; (at your option) any later version.
+
+; This program is distributed in the hope that it will be useful,
+; but WITHOUT ANY WARRANTY; without even the implied warranty of
+; 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, see .
+
+
+; it under the terms of the GNU General Public License as published by
+; the Free Software Foundation, either versio
+; includes and isr
+; written by: Matthias Heinrichs, info@heinrichsweikamp.com
+; written: 041013
+; last updated: 081219
+; known bugs:
+; ToDo:
+
+
+ LIST P=18F4685 ;directive to define processor
+ #include ;processor specific variable definitions
+
+ #include definitions.asm ; Defines, I/O Ports and variables
+
+ ORG 0x0000
+ goto start ; Start!
+
+ ORG 0x0008
+ bra HighInt ;High Priority Interrups
+
+ ORG 0x0018 ;Low Priority Interrups
+; *** low priority interrupts not used
+ bra HighInt ;High Priority Interrups
+
+HighInt:
+ movff BSR,0x102 ;save BSR register
+ movlb b'00000001' ;select Bank1
+
+ movff STATUS,status_temp ;save STATUS register
+ movff WREG,wreg_temp ;save working register
+
+ movf PORTB,W ;move portb into latch register
+
+ btfsc PIR1,TMR1IF ;Timer1 INT (external 32.768kHz Clock)
+ call timer1int
+
+ btfsc INTCON,TMR0IF ;Timer0 INT (Debounce Timer)
+ call timer0int
+
+ btfsc PIR2,TMR3IF ;Timer3 INT (Delay for PWM Buzzer)
+ call timer3int
+
+ btfsc PIR1,RCIF ; UART
+ call uartint
+
+ btfsc INTCON,INT0IF ; Switch left
+ call schalter_links
+
+ btfsc INTCON3,INT1IF ; switch right
+ call schalter_rechts
+
+ movff wreg_temp,WREG ;restore working register
+ movff status_temp,STATUS ;restore STATUS register
+ movff 0x102,BSR ;restore BSR register
+ retfie
+
+ ORG 0x00100 ;
+#include text_table.asm ; includes textmacros
+#include displaytext.asm ; sends texts to wordprocessor
+#include math.asm ; mathematical functions
+#include wait.asm ; waitroutines
+#include valconv.asm ; outputs to POSTINC2
+#include eeprom_rs232.asm ; Internal EEPROM and RS232 Interface
+#include oled_samsung.asm ; Attached in 80-System 8-Bit Mode
+#include menu_custom.asm ; Menu "Custom FunctionsI" and "Custom FunctionsII"
+#include menu.asm ; Main Menu and Setup Menu
+#include menu_reset.asm ; Submenu "Reset"
+#include menu_settime.asm ; Submenu "Set Time"
+#include ms5535.asm ; Interface to MS5535A,B or C pressure sensor
+#include pled_outputs.asm ; div. PLED outputs and background debugger
+#include i2c_eeprom.asm ; for external I2C EEPROM and general I2C Routines
+#include menu_logbook.asm ; Submenu "Logbook"
+#include interface.asm ; Interface routines
+#include menu_ppO2.asm ; Constant ppO2 setup menu
+#include menu_battery.asm ; Submenu "Battery Info"
+#include menu_gassetup.asm ; Menu "Gas Setup"
+#include isr.asm ; Interrupt service routine (RTC&Sensor)
+#include surfmode.asm ; Mainroutines for Surfacemode
+#include divemode.asm ; Mainroutines for Divemode
+#include divemode_menu.asm ; Underwater menu
+#include sleepmode.asm ; Mainroutines for Sleepmode
+#include adc_rtc.asm ; A/D converter (battery control) and RTC init
+#include temp_extrema.asm ; Takes care of the temperature extrema logger
+#include sync_clock.asm ; syncs RTC with PC
+#include tempcomp.asm ; extra temperature compensation
+#include start.asm ; Startup and init, checks background debugger
+#include simulator.asm ; Stand-alone simulator routines
+#include io.asm ; Low-Level I/O access
+
+ ORG 0x0A000 ; keep free for new c_code
+ nop
+
+ ORG deco_main_calc_hauptroutine
+ return ;Dummy
+ ORG deco_main_calc_without_deco
+ return ;Dummy
+ ORG deco_main_clear_tissue
+ return ;Dummy
+ ORG deco_main_calc_desaturation_time
+ return ;Dummy
+ ORG deco_main_calc_wo_deco_step_1_m
+ return ;Dummy
+ ORG deco_main_hash
+ return ;Dummy
+ ORG main_clear_CNS_fraction
+ return ;Dummy
+ ORG main_calc_CNS_fraction
+ return ;Dummy
+ ORG main_calc_CNS_decrease_15min
+ return ;Dummy
+ ORG main_push_tissues_to_vault
+ return ;Dummy
+ ORG main_pull_tissues_from_vault
+ return ;Dummy
+
+
+ MESSG "OSTC - diving computer code, Copyright (C) 2009 HeinrichsWeikamp GbR"
+ MESSG "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"
+ MESSG "Free Software Foundation, either version 3 of the License, or (at your option) any later version."
+ MESSG "This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY"
+ MESSG "or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details."
+ MESSG "You should have received a copy of the GNU General Public License along with this program.If not, see http://www.gnu.org/licenses/."
+
+ END ; end of program
+
diff -r 000000000000 -r 96a35aeda5f2 code_part1/OSTC_code_asm_part1/MAIN.COD
Binary file code_part1/OSTC_code_asm_part1/MAIN.COD has changed
diff -r 000000000000 -r 96a35aeda5f2 code_part1/OSTC_code_asm_part1/MAIN.HEX
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/code_part1/OSTC_code_asm_part1/MAIN.HEX Tue Jan 12 15:05:59 2010 +0100
@@ -0,0 +1,2364 @@
+:020000040000FA
+:0400000082EF47F054
+:0200080008D01E
+:0800180000D0E0CF02F101016C
+:10002000D8CF01F1E8CF00F181509EB0A1EC38F0BB
+:10003000F2B488EC38F0A1B29DEC38F09EBA47ECEF
+:1000400038F0F2B276EC38F0F0B07CEC38F000C169
+:0C005000E8FF01C1D8FF02C1E0FF100072
+:10010000001210180606080A0A0C0606080A060A53
+:1001100006060808060E06060A0A08140C0A060A4D
+:1001200008060606101010101010101010101010F5
+:1001300010101010101010101010101010101010BF
+:10014000101010101014161416120C140E1414148F
+:100150000E180A0608080A060C0A08080808060607
+:10016000040A0C120A0A0A060A0E140808061214D7
+:10017000040E140806100E0C0606080606060606EF
+:10018000080804040A16161614080A080806060ABF
+:100190000808040A0E140A0C0A141010101010108B
+:1001A000101010101010101010101010101010104F
+:1001B000101010101010101010101410120E08084B
+:1001C00006141414141414141414141414141414FD
+:1001D00014141414141414141414141414141414DF
+:1001E0001414141414141414141414140A0A0A08F9
+:1001F0000808080E0614100A100C06060606060863
+:10020000020E0E080808060606060A0A0408040E6E
+:100210001412140E0A0E0C100E0A0A0A0E0C10000C
+:100300000000010F0019010F0002010F4102010F4F
+:100310004102010F1423010F1441010F1423010F97
+:10032000145F010F147D010F14B9010F7302010F47
+:100330000018010F0000010F3202010F0A1E010F09
+:100340000A37010F0A50010F0A69010F0A82010FD3
+:100350001423010F2041010F205F010F209B010F8B
+:100360000600010F3702010F0E02010F2802010FD4
+:100370003202010F1423010F6400010F6419010FF1
+:10038000644B010F6464010F0000010F2823010F6B
+:100390002823010F2823010F2823010F2823010FF1
+:1003A0002823010F2823010F2823010F2823010FE1
+:1003B0002823010F2823010F2823010F2823010FD1
+:1003C0002823010F2823010F2823010F2823010FC1
+:1003D0002823010F2823010F2823010F2823010FB1
+:1003E0002823010F2823010F2823010F2823010FA1
+:1003F0002823010F2823010F2823010F2823010F91
+:100400002823010F2823010F2823010F0023010FA8
+:100410000041010F005F010F007D010F009B010FE4
+:1004200000B9010F00D7010F0023010F0041010F98
+:10043000005F010F007D010F009B010F00B9010F4C
+:1004400000D7010F6696010F0000010F6CD8010F55
+:100450006CD8010F6400010F0000010F0000010FB4
+:100460000000010F0000010F0000010F0000010F4C
+:100470000000010F0000010F0000010F0000010F3C
+:100480000000010F2802010F1423010F147D010F3A
+:10049000557D010F557D010F557D020F557D010FD3
+:1004A0000000010F0A02010F0000010F0000010F00
+:1004B0001423010F1441010F0E02010F0000010F60
+:1004C000145F010F0A02010F0009010F557D020F91
+:1004D0000012010F001B010F0024010F002D010F5E
+:1004E0000036010F6432010F6419010F6432010FED
+:1004F000644B010F6464010F6400010F6419010F64
+:100500001441010F4141010F4141010F6432010FBC
+:100510000A00010F0A19010F0A32010F0A4B010FDD
+:100520006432010F557D010F6978010F693C010F9D
+:100530004102010F149B010F2A48010F3C02010FD9
+:100540003460010F3478010F644B010F0000010F7C
+:100550000008010F0227010F0230010F557D010F26
+:100560001441010F2823010F2823010F2823010F15
+:100570002823010F2823010F2823010F2823010F0F
+:100580002823010F2823010F2823010F2823010FFF
+:100590002823010F2823010F2823010F2823010FEF
+:1005A0002823010F2823010F2823010F2823010FDF
+:1005B0002823010F2823010F2823010F2823010FCF
+:1005C0002823010F2823010F2823010F2823010FBF
+:1005D0002823010F2823010F2823010F2823010FAF
+:1005E0002823010F0D02010F000000000201010F7E
+:1005F0000230010F0000010F0000010F0000010F89
+:100600000023010F0041010F005F010F007D010F6A
+:10061000009B010F00B9010F00D7010F0023010F4C
+:100620000041010F005F010F007D010F009B010FD2
+:1006300000B9010F00D7010F0023010F0041010F86
+:10064000005F010F007D010F009B010F00B9010F3A
+:1006500000D7010F0023010F0041010F005F010FC0
+:10066000007D010F009B010F00B9010F00D7010FA2
+:100670000023010F0041010F005F010F007D010FFA
+:10068000009B010F00B9010F00D7010F0023010FDC
+:100690000041010F005F010F007D010F009B010F62
+:1006A00000B9010F00D7010F0A02010F557D010F9C
+:1006B000020C010F6419010F6400010F6400010FA7
+:1006C0006419010F6400010F020C010F6464010F33
+:1006D0001441010F021E010F147D010F1E02010FB4
+:1006E0001423010F6419010F6432010F644B010FD1
+:1006F0006464010F6400010F6432010F0000000FF9
+:100700001423010F2802010F6923010F6923010F30
+:100710006923010F0101010F41A8010F0730010BEF
+:100720007887010F0227010F00D8010F0A08010F77
+:100730000A10010F0000010F1802010F0023010F22
+:100740000041010F007D010F009B010F145F010F9D
+:100750001441010F145F010F147D010F149B010F51
+:100760006432010F6400010F5A36010F145F010F4C
+:08077000147D010F149B010F21
+:1007B0004275696C64696E67204D443220486173EC
+:1007C000687D506C6561736520576169742E2E2EAB
+:1007D0007D7D4865696E72696368735765696B6191
+:1007E0006D70204F535443327D7D4D656E753F7D56
+:1007F0004D656E753A7D4C6F67626F6F6B7D4761BB
+:10080000732053657475707D5365742054696D65EC
+:100810007D7D5265736574204D656E757D7D536574
+:100820007475707D457869747D7D576169742E2E6D
+:100830007D7D4D443220486173683A7D4465736123
+:10084000747D496E746572666163657D537461720F
+:10085000747D446174617D7D4865616465727D7DF0
+:1008600050726F66696C657D446F6E652E7D436165
+:100870006E63656C2052657365747D7D54696D652A
+:100880003A7D446174653A7D53657420486F757292
+:10089000737D52657365742E2E2E7D7D4C6F67625D
+:1008A0006F6F6B7D437573746F6D2046756E6374E7
+:1008B000696F6E7320497D7D5265736574204D6547
+:1008C0006E757D7D5365742054696D653A7D4D6FFD
+:1008D00072657D7D4465636F706C616E7D7D47617F
+:1008E000736C6973747D4D6F72657D7D4578697435
+:1008F0007D7D4E6F466C797D5374617274204469BE
+:100900007665205B636D5D7D456E64204469766528
+:100910002020205B636D5D7D456E642044656C61C5
+:10092000792020205B735D7D506F776572204F6664
+:10093000662020205B735D7D5072652D6D656E7540
+:10094000202020205B735D7D76656C6F6369747910
+:100950005B6D2F6D696E5D7D57616B652D757020C8
+:10096000205B6D4261725D7D6D61782E537572669C
+:100970002E5B6D4261725D7D474620646973706CC9
+:10098000617920205B255D7D6D696E2E204F3220C0
+:100990004469732E5B255D7D44697665206D656EC7
+:1009A000757320205B735D7D53617475726174652E
+:1009B000207820205B255D7D4465736174757261CC
+:1009C000746520785B255D7D4E6F466C79205261A1
+:1009D00074696F205B255D7D474620616C61726D97
+:1009E000203120205B255D7D474620616C61726D62
+:1009F000203220205B255D7D4465636F204F666655
+:100A00007365745B646D5D7D70704F32206C6F77C1
+:100A1000205B634261725D7D70704F322068696750
+:100A2000685B634261725D7D73686F772070704FA1
+:100A3000325B634261725D7D73616D706C696E677C
+:100A4000207261746520207D44697669736F72201D
+:100A500054656D702020207D44697669736F722023
+:100A60004465636F6461747D44697669736F722055
+:100A70004E6F74557365307D44697669736F72206B
+:100A800070704F322020207D44697669736F722028
+:100A9000446562756720207D44697669736F7220B2
+:100AA0004E6F74557365327D73686F7720434E5374
+:100AB000202020205B255D7D4C6F67626F6F6B206F
+:100AC0006F6666736574207D4C6173742044656342
+:100AD0006F2061745B6D5D7D456E642041706E6F4B
+:100AE00065205B6D696E5D7D53686F77205662612E
+:100AF0007474205B3D315D7D546869732070726F42
+:100B00006772616D2069737D64697374726962755F
+:100B100074656420696E207468657D7D686F70659A
+:100B200020746861742069742077696C6C20626538
+:100B30007D7D75736566756C2C20627574205749D0
+:100B400054484F55547D414E592057415252414EC1
+:100B500054593B20776974686F75747D6576656E4E
+:100B60002074686520696D706C6965647D7D77614E
+:100B70007272616E7479206F667D4D4552434841B3
+:100B80004E544142494C495459206F727D7D46492B
+:100B9000544E45535320464F5220417D50415254AC
+:100BA0004943554C415220505552504F53452E7D8C
+:100BB0005365652074686520474E552047656E650E
+:100BC00072616C7D5075626C6963204C6963656EFF
+:100BD000736520666F727D7D6D6F726520646574CC
+:100BE00061696C733A7D7777772E6865696E726993
+:100BF0006368737765696B616D702E64657D4465AC
+:100C0000636F73746F707D7D6D2F6D696E7D4E6F38
+:100C10002053746F707D4465636F73756D7D446997
+:100C2000766574696D657D7D44657074687D46691F
+:100C3000727374204761733F7D7D44656661756C96
+:100C4000743A7D7D4D696E757465737D4D6F6E74FC
+:100C50006820207D446179202020207D59656172C3
+:100C60002020207D536574207D7D47617323207D86
+:100C70005965737D43757272656E743A7D7D5365F7
+:100C8000747570204D656E753A7D437573746F6D24
+:100C90002046756E6374696F6E73497D4465636F3A
+:100CA000747970653A7D5A482D4C3136204F437D1A
+:100CB0004761756765202020207D47617567657DE8
+:100CC0005A482D4C31362043437D41637469766523
+:100CD000204761733F207D7D4761732053657475A4
+:100CE00070202D204761736C6973747D4465707446
+:100CF00068202B7D4465707468202D7D4261636B94
+:100D00007D7D436F6E73742E2070704F322053655B
+:100D10007475707D436F6E7374616E742070704F64
+:100D2000322053657475707D5350237D4261747415
+:100D300065727920496E666F7D7D4261747465725B
+:100D40007920496E666F726D6174696F6E7D43794B
+:100D5000636C65733A7D41706E6F657D4C61737431
+:100D600020436F6D706C6574653A7D7D4C6F77655F
+:100D700073742056626174743A7D4C6F7765737436
+:100D80002061743A7D7D546D696E3A7D546D617851
+:100D90003A7D536574204761737D4F32202B7D7DF2
+:100DA0004F32202D7D7D4865202B7D7D4865202D8F
+:100DB0007D7D457869747D7D44656C6574657D7D58
+:100DC00044656275673A7D7D4F4E207D4F46467D76
+:100DD00044656C2E20616C6C7D7D556E6578706508
+:100DE000637465642072657365742066726F6D7DCF
+:100DF000446976656D6F64652120506C656173652B
+:100E00002068656C707D616E64207265706F7274AD
+:100E100020746865204465627567207D496E666F41
+:100E2000726D6174696F6E2062656C6F77217D7D74
+:100E30004261696C6F75747D41706E6F6520202012
+:100E4000207D44657363656E747D5375726661635E
+:100E5000657D517569743F7D4D6F72657D7D436F12
+:100E60006E6669726D3A7D7D4D656E7520323A7D94
+:100E700043616E63656C7D7D4F4B217D53746F7054
+:100E80007761742E7D7D4E4F54205553454421216A
+:100E90002121217D4E4F54205553454421212121AC
+:100EA000212121212121217D4E6F742075736564DC
+:100EB000217D4E6F7420757365642121217D4C3135
+:100EC000362D4746204F437D437573746F6D204622
+:100ED000756E6374696F6E7349497D7D4746204C1A
+:100EE0006F772020202020205B255D7D474620480D
+:100EF00069676820202020205B255D7D6E6F74204F
+:100F000075736564202020202020207D6E6F742062
+:100F100075736564202020202020207D6E6F742052
+:100F200075736564202020202020207D6E6F742042
+:100F300075736564202020202020207D53686F7702
+:100F400020736563732E205B3D315D7D6E6F742071
+:100F500075736564202020202020207D6E6F742012
+:100F600075736564202020202020207D4176722E1C
+:100F7000204465707468205B3D315D7D6E6F742028
+:100F800075736564202020202020207D6E6F7420E2
+:100F900075736564202020202020207D6E6F7420D2
+:100FA00075736564202020202020207D6E6F7420C2
+:100FB00075736564202020202020207D6E6F7420B2
+:100FC00075736564202020202020207D6E6F7420A2
+:100FD00075736564202020202020207D6E6F742092
+:100FE00075736564202020202020207D6E6F742082
+:100FF00075736564202020202020207D6E6F742072
+:1010000075736564202020202020207D6E6F742061
+:1010100075736564202020202020207D6E6F742051
+:1010200075736564202020202020207D6E6F742041
+:1010300075736564202020202020207D6E6F742031
+:1010400075736564202020202020207D6E6F742021
+:1010500075736564202020202020207D6E6F742011
+:1010600075736564202020202020207D6E6F742001
+:1010700075736564202020202020207D6E6F7420F1
+:1010800075736564202020202020207D6E6F7420E1
+:1010900075736564202020202020207D6E6F7420D1
+:1010A00075736564202020202020207D6E6F7420C1
+:1010B00075736564202020202020207D6E6F7420B1
+:1010C00075736564202020202020207D6E6F7420A1
+:1010D00075736564202020202020207D4375737463
+:1010E0006F6D2046756E6374696F6E732049497D1C
+:1010F0004E6F742055736564212121212121217DAA
+:101100004E6F7420557365642121212121212121F5
+:10111000217D4E4F54205553454421212121217DCD
+:1011200070704F32202B7D7D70704F32202D7D7D71
+:1011300044696C2E7D7D4465636F747970653A20D7
+:101140005A482D4C3136204F437D466F72204F70E8
+:10115000656E20436972637569742020207D44693F
+:10116000766572732E20537570706F7274732035AC
+:10117000207D5472696D69782047617365732E20F4
+:1011800020202020207D436F6E6669677572652080
+:10119000796F757220676173207D696E2047617376
+:1011A0007365747570206D656E752E20207D4368A3
+:1011B00065636B204346313120262043463132207F
+:1011C000217D4465636F747970653A204761756766
+:1011D00065202020207D4469766574696D652077DF
+:1011E000696C6C20626520696E7D4D696E757465F1
+:1011F000733A5365636F6E64732E2020207D4F53C6
+:101200005443322077696C6C206E6F74202020204C
+:10121000207D636F6D70757465204465636F2C204D
+:101220004E6F466C797D74696D6520616E642044F3
+:10123000657361742E2D2020207D74696D65206199
+:101240007420616C6C21202020202020207D4465AA
+:10125000636F747970653A5A482D4C313620434398
+:10126000207D466F72202853656D692D29436C6F70
+:1012700073656420207D43697263756974207265AB
+:101280006272656174686572737D436F6E666967CB
+:10129000757265207468652033202020207D536599
+:1012A00074506F696E747320696E2070704F322DA8
+:1012B000207D5365747570206D656E752E20352008
+:1012C0006261696C2D7D6F75742061726520617635
+:1012D00061696C61626C652E207D4465636F747911
+:1012E00070653A2041706E6F65202020207D4F533D
+:1012F0005443322077696C6C20646973706C617937
+:10130000207D656163682064657363656E74207316
+:10131000657061722D7D6174656C7920696E204DF8
+:10132000696E3A5365632E20207D57696C6C20747A
+:10133000656D706F72616C6C79207365747D73611B
+:101340006D706C657261746520746F2031207365F7
+:10135000637D4E6F204465636F2063616C63756CC1
+:101360006174696F6E7D4465636F747970653A204E
+:101370004C31362D4746204F437D4465636F6D7079
+:1013800072657373696F6E2063616C2D207D637568
+:101390006C6174696F6E7320776974682074686516
+:1013A000207D47462D4D6574686F64202847465F51
+:1013B0006C6F2F47467D5F6869292E2043686563FF
+:1013C0006B20434633322026207D43463333212091
+:1013D0004F70656E2043697263756974207D77690B
+:1013E000746820446565702053746F70732E2020DC
+:1013F000207D4465636F747970653A204C31362DD9
+:1014000047462043437D4465636F6D707265737317
+:10141000696F6E2063616C2D207D63756C617469EA
+:101420006F6E73207769746820746865207D474605
+:101430002D4D6574686F64202847465F6C6F2F4799
+:10144000467D5F6869292E20436865636B204346AB
+:1014500033322026207D4346333321436C6F73653E
+:101460006420436972637569747D77697468204488
+:101470006565702053746F70732E2020207D446545
+:10148000636F6D6F6465206368616E6765642120BA
+:10149000207D4C31362D47462043437D4E6F7420CE
+:1014A000666F756E647D536574506F696E747D7D73
+:1014B0004E6F204465636F7D4772617068737D7DF8
+:1014C000446973706C61797D4E6F206465636F7DD4
+:1014D000536561726368206D6F64756C657D4578D6
+:1014E00069747D7D52657365742043462C47617332
+:1014F0002026204465636F7D44697361626C6520BA
+:101500006D6F64756C657D7D53696D756C61746F0D
+:10151000727D4F5354432053696D756C61746F72C3
+:101520007D7D537461727420446976657D7D2B20C6
+:10153000316D7D7D2D20316D7D7D2B31306D7D7D3B
+:101540002D31306D7D7D457869747D7D6E6F7420A1
+:101550007573657D787D4461746520666F726D6119
+:10156000743A7D7D5365747570204D656E752032BB
+:101570003A7D4D4D444459597D7D44444D4D595912
+:101580007D7D59594D4D44447D7D4F535443207DBD
+:101590004261696C7D7D41697220207D41697220C4
+:1015A000207D43616C6962726174657D4D61782054
+:1015B00044657074687D6E6F747D666F756E6421AE
+:1015C0007D7D6D563A7D4E6577204346206164648B
+:1015D0006564217D4E657720437573746F6D467524
+:1015E0006E6374696F6E737D776572652061646484
+:1015F00065642120436865636B7D43462049206113
+:101600006E64204346204949204D656E757D666FA6
+:10161000722044657461696C73217D7D53616C69CE
+:101620006E6974793A7D426F74746F6D2054696D80
+:10163000653A7D7D4D61782E2044657074683A7DF1
+:1016400043616C63756C617465204465636F7D7D77
+:1016500053686F77204465636F706C616E7D4C6575
+:101660006164205469737D7D4C65616420546973A5
+:101670007D7D53746F7077617463687D52657365A7
+:1016800074204C6F67626F6F6B7D5265626F6F7411
+:10169000204F5354437D5265736574204465636FD6
+:1016A000646174617D7D2C8B01D81200278D05D873
+:1016B000279D12002C8B01D812000B6F800EA66E96
+:1016C000F86A020EF76EFC0EF66E0BC14CF1000EBE
+:1016D0002CBB010E4D6F040E4E6F4F6BF0EC0BF0F8
+:1016E0004851F6264951F7220900F55027BD02D08E
+:1016F000E8CF7DF00900F55027BD02D0E8CF7CF09F
+:101700000900F5500108E8CF7EF00900F5CF1BF184
+:101710000D6B0E6BF66AF86A010EF76E01D02C9B0A
+:101720000900F5500D27000E0E230B2FF9D72CBB07
+:10173000F6D7F86AB00E0D25F66E070E0E21F76E7D
+:1017400027AD20EE60F009007D0EF56201D00AD0D1
+:10175000F550DE6E09007D0EF56201D003D0F55024
+:10176000DE6EF1D727AD26EC0EF0120032C14CF13F
+:1017700033C14DF13C0E4E6F4F6B4FD848C133F122
+:101780004CC132F11200D89046334533472FFBD776
+:101790001200D8904B334A3349334833472FF9D797
+:1017A00012004951FF08496F4851D890FF08486F0F
+:1017B00012001F975451525D506F55515359516F3C
+:1017C000D8A812001F8750C154F151C155F1526978
+:1017D00053695451525D506F55515359516F120016
+:1017E0004A6B4B6B4C514E03F350486FF450496FAA
+:1017F0004C514F03F3504927F4504A234D514E03A7
+:10180000F3504927F4504A23D8B04B2B4D514F0386
+:10181000F3504A27F4504B231200486B496B4E514A
+:101820004F11D8B4FF0C010E476F4FBF05D0472BA7
+:10183000D8904E374F37F9D7D890483749374E515F
+:101840004C5F4F51D8A04F294D5FD8B005D04E51B5
+:101850004C274F514D2301D048814707D8B412007F
+:10186000D8904F334E33E8D7200E476F4B514D6F12
+:101870004A514C6F4951536F4851526F4B6B4A6BF1
+:10188000496B486B556B546BD890523753374C3774
+:101890004D37543755374F51555DD8A452EF0CF0A2
+:1018A0004E51545DD8A05CEF0CF04E51545FD8A05F
+:1018B00055074F51555FD880483749374A374B371E
+:1018C000472F44EF0CF01200D89075337433762F05
+:1018D000FBD71200D8907A33793378337733762F69
+:1018E000F9D712007851FF08786F7751D890FF0828
+:1018F000776F12002A978351815D7F6F84518259DF
+:10190000806FD8A812002A877FC183F180C184F13B
+:10191000816982698351815D7F6F84518259806FB3
+:101920001200796B7A6B7B517D03F350776FF45023
+:10193000786F7B517E03F3507827F45079237C51E4
+:101940007D03F3507827F4507923D8B07A2B7C515B
+:101950007E03F3507927F4507A2312000A6FBAEF0E
+:101960000CF000000000000000000000000000007B
+:101970000000000000000000000000000000000067
+:101980000000000000000000000000000000000057
+:101990000000000000000000000000000000000047
+:1019A0000000000000000000000000000A2FB1EF5E
+:1019B0000CF01200096FE6EF0CF0000000000000D0
+:1019C0000000000000000000000000000000000017
+:1019D0000000000000000000000000000000000007
+:1019E00000000000000000000000000000000000F7
+:1019F00000000000000000000000000000000000E7
+:101A0000000000000000630EAEEC0CF0092FDDEFCB
+:101A10000CF01200630E3261326F32C134F1356B5B
+:101A20001F950A0E3A6F366B67D8010E3A6F366B08
+:101A30001F8562D8120032C134F1356B1F85F1D792
+:101A400032C134F1356B1F95640E3A6F366B54D842
+:101A5000E8D7259F376F1F8B372B372F1F9B238B83
+:101A6000372B372F239B32C134F133C135F11F950A
+:101A7000100E3A6F270E366F1FAD3ED8E80E3A6F44
+:101A8000030E366F23BB07D025BF03D01F85372D2C
+:101A90001F9523B91F851FAD2FD81F9D640E3A6F68
+:101AA000366B27B924D023BB09D025BF03D01F85AF
+:101AB000372D1F9523B91F8523BB1F851DD80A0EFF
+:101AC0003A6F366B23BB09D025BF03D01F85372D56
+:101AD0001F9523B91F8523BB1F8529B708D00CD8B4
+:101AE000010E3A6F366B1F8524A506D824952799D9
+:101AF000386B382B23991200396B3651355DD8A0DD
+:101B00000ED004E13A51345DD8A009D03651355F8A
+:101B10003A51345FD8A03507392B1F85EED7382FBF
+:101B20001200382B300E39251FB504D01FBF04D04A
+:101B3000200E01D0258FDE6E372F12002E0EDE6EA6
+:101B400023891200A96E31D0A96E2BD02B91010EE2
+:101B5000AA6E690E03D02691AA6A640EAD6E238F19
+:101B6000040EA96E9D9A9E9A09EC4AF049D8AECF10
+:101B7000A8FFFBEC49F026BF11D017D8FDEC49F0C7
+:101B8000A8CFADFF37D8A93EF1D70BEC4AF09E9A0B
+:101B90009D8AAA6A269F239FEAEF47F0FF0EAD6E4B
+:101BA000F4D7A69EA69CA6801200A69EA69CA684FC
+:101BB000F29E550EA76EAA0EA76EA682F28EA6B250
+:101BC000FED7A6941200948C948E240EAC6E900EC8
+:101BD000AB6E080EB86EB06A220EAF6EAE6A9E6A29
+:101BE0009D8A1200AC6AAB6A9D9A949C949E829CDA
+:101BF000829E1200ABAE12000000ACA2FBD7120016
+:101C00009E9A269F436B446B9EBA12000000000010
+:101C1000000000009EBA120000000000000000005A
+:101C20009EBA120000000000000000009EBA1200E0
+:101C300000000000000000009EBA1200442FE4D70C
+:101C4000432FE1D7AB98AB88268F1200DE6A7BC0AA
+:101C5000FAF17AC0F9F134EC5AF00101FAC17BF0E3
+:101C6000F9C17AF01200106F10C17DF0210E2FD94A
+:101C7000D8901035000ED8B0010E2ED9D89010355E
+:101C80002BD912000F6F0FC17CF0200E20D9000E4F
+:101C900023D90F5121D91200220E19D984807AC07C
+:101CA00083FF809480847BC083FF80948084210E96
+:101CB0000ED9D8901035000ED8B0010E0DD9D8909D
+:101CC0001037102909D9200E02D9000E05D90F515D
+:101CD00003D9220EFCD884807AC083FF809480844C
+:101CE0007BC083FF809480841200220EF0D8848011
+:101CF0007AC083FF809480847BC083FF809480843B
+:101D00001200836A80968194809A8494809484924D
+:101D10001200F4512BEC10F0F5C11CF11C51B2DF94
+:101D2000F75133EC0EF0E1DF1C2B1C51F663F6D7B4
+:101D30001C51A8DFF75133EC0EF0D7DFF5C11CF1D1
+:101D40001C51A0DFF85133EC0EF0CFDF1C2B1C51DF
+:101D5000F663F6D71C5196DFF85133EC0EF0C5DF71
+:101D6000F7C11CF11C517FDFF5518CDF95DF1C2B77
+:101D70001C51F863F7D7F7C11CF11C5174DFF65101
+:101D800081DF8ADF1C2B1C51F863F7D7FF0E2BEC89
+:101D900010F01200F4512BEC10F0350E98D8F7C16A
+:101DA0001CF1D8901C35000ED8B0010E95D8D890F3
+:101DB0001C3592D8360E8BD8F8C11CF1D8901C3542
+:101DC000000ED8B0010E88D8D8901C3585D8370EB3
+:101DD0007ED8F5C11CF11C517FD8F6C11CF11C51F5
+:101DE0007BD8200E74D8000E77D8F5C11CF11C5199
+:101DF00073D8210E6CD8F7C11CF1D8901C35000E99
+:101E0000D8B0010E69D8D8901C3566D8220E5FD89C
+:101E1000F5C11CF1F6C11DF11C511D5F1D2BF7C151
+:101E20001CF1F8C11EF11C511E5F1E2B84801EC1C7
+:101E30001CF17AC083FF809480847BC083FF8094F0
+:101E400080847AC083FF809480847BC083FF8094E9
+:101E500080841C2FEED71D2FEAD7000E38D8FF0E36
+:101E60002BEC10F01200350E32D8000E35D8000ED3
+:101E700033D8360E2CD8010E2FD83F0E2DD8370E62
+:101E800026D8000E29D8EF0E27D8200E20D8000E15
+:101E900023D8000E21D8210E1AD8000E1DD8000E0E
+:101EA0001BD8220E14D88480836A0A0E1E6F1E0E61
+:101EB0001D6F1C6B80948084809480841C2FFAD7C3
+:101EC0001D2FF7D71E2FF3D7000E01D812008490D4
+:101ED000836E8094808412008480836E80948084DA
+:101EE00012008096200EDAEC0CF081840000809ABB
+:101EF00000008482FA0EDAEC0CF0FA0EDAEC0CF048
+:101F0000848400008492020EAEEC0CF084820A0EEF
+:101F1000DAEC0CF0240EDBDF020ED9DF000EDCDF82
+:101F2000000EDADF030ED3DF000ED6DF300ED4DF73
+:101F3000180ECDDF000ED0DF280ECEDFF80EC7DF83
+:101F4000000ECADF0F0EC8DFF90EC1DF000EC4DFBE
+:101F50000F0EC2DF100EBBDF000EBEDF000EBCDFB7
+:101F60000CD881DF8086200EDAEC0CF0050EAFDF96
+:101F7000000EB2DF010EB0DF1200700EA8DF1F0EE0
+:101F8000ABDF000EA9DF710EA2DF230EA5DF800EEE
+:101F9000A3DF720E9CDF2A0E9FDF800E9DDF730E83
+:101FA00096DF150E99DF110E97DF740E90DF1C0E71
+:101FB00093DF110E91DF750E8ADF1B0E8DDF150E7C
+:101FC0008BDF760E84DF1A0E87DF150E85DF770E26
+:101FD0007EDF1C0E81DF180E7FDF780E78DF210E8A
+:101FE0007BDF150E79DF1200700E71DF140E74DFC7
+:101FF000000E72DF710E6BDF170E6EDF000E6CDFEE
+:10200000720E65DF150E68DF800E66DF730E5FDF10
+:10201000150E62DF110E60DF740E59DF140E5CDFE7
+:102020000B0E5ADF750E53DF1B0E56DF150E54DFF5
+:10203000760E4DDF130E50DF0E0E4EDF770E47DFAC
+:102040001C0E4ADF180E48DF780E41DF150E44DF04
+:102050000E0E42DF12002E6F2EC12FF1030E2F172E
+:10206000000E2F4F500E2F4FA00E2F4FF80E306F37
+:102070002EC12FF11C0E2F172F432F43000E2F4F71
+:10208000040E2F4F080E2F4F0C0E2F4F100E2F4FF8
+:10209000140E2F4F200E2F4F3F0E316F3133303340
+:1020A00031333033313330332EC12FF12E6B313396
+:1020B0002E3331332E3331332E33E00E2F172F438F
+:1020C0002F432F432F432F43000E2F4F040E2F4F2C
+:1020D000080E2F4F0C0E2F4F100E2F4F140E2F4F98
+:1020E000200E2F4F3F0E316F31332E3331332E33CD
+:1020F00031332E3331332E3331332E332EC17AF038
+:1021000030C17BF01200E46F1F0EE46505D0010EB4
+:10211000AA6E200EE45F01D0AA6AE451040DF350C8
+:10212000820FA96ED1EC0DF0A850AA6A1200E46FDC
+:102130001F0EE46505D0010EAA6E200EE45F01D0EB
+:10214000AA6AE451040DF350820FA96ED1EC0DF090
+:10215000A8CF32F1A92AD1EC0DF0A8CF33F1AA6AA9
+:1021600012009A0EE36F2A8D010EAA6E04D0240E7F
+:10217000E36F2A9DAA6A1F8F33EC0FF0010EBA6F2E
+:10218000219921972099AA6BA56B229D229F27EC6C
+:102190002AF0010EE8CF7FF02AAD04D0BA0E5DEC34
+:1021A0000BF003D01B0E5DEC0BF0000EE8CF7FF0C0
+:1021B000B86B21912193140EE8CF7DF0230EE8CF68
+:1021C0007CF020EE60F0AAC132F1000E2ABD200E94
+:1021D000322732C1DCF1386B382B376B1BEC0DF03A
+:1021E0003A0EDE6E200EDE6E26EC0EF0E351AA25CE
+:1021F0005DEC0BF01F0EDC5DD8B411D0260EDC5D5B
+:10220000D8B40DD0270EDC5DD8B409D0280EDC5D23
+:10221000D8B405D0290EDC5DD8B401D003D0010EAE
+:10222000DC6F01D0DC6B140EE8CF7DF0410EE8CFFF
+:102230007CF020EE60F02B0EDE6E2F0EDE6E2D0E8B
+:10224000DE6E3A0EDE6E200EDE6E2B0E22BD2D0EE1
+:10225000DE6E26EC0EF0140EE8CF7DF05F0EE8CFB8
+:102260007CF020EE60F0310EDE6E2F0EDE6E310E51
+:10227000DE6E300EDE6E3A0EDE6E200EDE6E310E3B
+:10228000DE6E300E22BFDE6E200EDE6E26EC0EF00D
+:10229000140EE8CF7DF07D0EE8CF7CF020EE60F0EC
+:1022A000590E56EC0BF0A551800FA96ED1EC0DF034
+:1022B000A8CF32F1A551810FA96ED1EC0DF0A8CFB6
+:1022C00033F1339F386B382B376B375129EC0DF0D6
+:1022D000280EDE6E310EA8AE380EDC67310EDE6ED3
+:1022E000350EA8BEDE6E420EDE6E290EDE6E200EAC
+:1022F000DE6E200EDE6E200EDE6E26EC0EF0140E6C
+:10230000E8CF7DF09B0EE8CF7CF020EE60F0610E10
+:1023100056EC0BF0A551820FA96ED1EC0DF0A8CFB1
+:1023200032F1A551830FA96ED1EC0DF0A8CF33F196
+:10233000386B382B376B375129EC0DF0200EDE6EE1
+:10234000200EDE6E200EDE6E26EC0EF00B0E5DEC27
+:102350000BF0FCEC12F02FEC1DF034EC2FF021B35D
+:102360000FD021B11AD020B3EAEF47F020B151ECE1
+:102370003BF020B1CCEC40F0209120B91CD0EDD73F
+:10238000BA2B070EBA6302D0010EBA6FB86B2FECEE
+:102390001DF0FCEC12F02193E0D7AA6A010E2ABDD1
+:1023A000AA6EBA4F0FD0BA4F17D0BA4F19D0BA4F42
+:1023B0001BD0BA4F39D0020E2AAD010EBA6FAA6AED
+:1023C000ADEF13F0AA2BAABBAA6BAA51040DF3CF51
+:1023D000A5F1010EBA6FECD6227D020EBA6FE8D6D7
+:1023E000227F030EBA6FE4D6A551800FA96ED1ECFF
+:1023F0000DF0A8CF32F1A551810FA96ED1EC0DF0EF
+:10240000A8CF33F1339FA551820FA96E32C1A8FF27
+:10241000D5EC0DF0A551830FA96E33C1A8FFD5EC03
+:102420000DF0040EBA6FC4D6A551820FA96ED1EC7F
+:102430000DF0A8CF32F1A551830FA96ED1EC0DF0AC
+:10244000A8CF33F1A551810FA96ED1EC0DF0A8CF23
+:10245000A6F1010EDC6305D032673269322B336B93
+:1024600016D022AD0BD0010E22BF0A0E325F000E35
+:10247000A6BF335B7F0E33BF336F09D0010E22BF7F
+:102480000A0E3227000EA6BF332333BF336BA5518C
+:10249000820FA96E32C1A8FFD5EC0DF0A551830FB4
+:1024A000A96E33C1A8FFD5EC0DF0050EBA6F80D62A
+:1024B000E46F1F0EE46505D0010EAA6E200EE45FE6
+:1024C00001D0AA6AE451040DF350800FA96ED1EC3B
+:1024D0000DF0A8CF32F1A92AD1EC0DF0A8CF33F13D
+:1024E000AA6A1200CF4F14D0CF4F19D01200CF4F8D
+:1024F0000FD0CF4F14D0CF4F19D0CF4F1ED0CF4FCA
+:1025000023D0CF4F28D0CF4F2FD0CF4F34D0120071
+:102510000B0E3DD8C2EC12F0020ECF6F12000C0E63
+:1025200049D8C2EC12F0030ECF6F1200110E2FD853
+:10253000C2EC12F0040ECF6F1200120E3BD8C2ECA8
+:1025400012F0050ECF6F1200130E34D8C2EC12F049
+:10255000060ECF6F1200060ECF6F1D0E3ED8C2ECD6
+:1025600012F0070ECF6F1200200E24D8C2EC12F02A
+:10257000080ECF6F1200210E1DD8C2EC12F0010E12
+:10258000CF6F1200326F3267120079EF28F0396F87
+:1025900097EC10F032C152F133C153F1395158EC7C
+:1025A00012F032C154F133C155F1D9EC0BF01FA731
+:1025B000FF0C000C396F97EC10F032C154F133C1AD
+:1025C00055F1395158EC12F032C152F133C153F187
+:1025D000D9EC0BF01FA7FF0C000C396F97EC10F033
+:1025E00032C154F133C155F1CFC152F1536BD9EC23
+:1025F0000BF01FA7FF0C000C280E2BA3C80EE56FD5
+:10260000050EDAEC0CF081B008D0E52FF9D781B0D7
+:1026100006D02B8324872499120081A2F1D7249716
+:1026200024992B9307EC4AF012002B97010EBA6FF6
+:102630001F9F33EC0FF0B86B209921912193208FCD
+:102640002187D0EC1DF02FEC1DF02497249942EC4B
+:1026500013F021B124D020AFEAEF47F020B151ECC4
+:102660003BF020B1CCEC40F020B18FEC3AF020B13F
+:1026700070EC45F0209120B9EAEF47F020B3EAEF83
+:1026800047F0E5D724A908D02183BA2B060EBA65F6
+:1026900018D0010EBA6F15D024B721811200BA4F9D
+:1026A000ECEF2BF0BA4FA8EF33F0BA4F0CEF15F068
+:1026B000BA4FAAEF13F0BA4F67EF13F0BA4FEAEF31
+:1026C00047F0B86B21B72FEC1DF024991200010ED2
+:1026D000BA6F1F9F33EC0FF0B86B209921912193B3
+:1026E000208F218721EC1EF02FEC1DF024972499D8
+:1026F00042EC13F0050EBA6304D0060EBA6F2FEC4D
+:102700001DF021B115D020AF90D720B151EC3BF096
+:1027100020B1CCEC40F020B18FEC3AF020B170EC5D
+:1027200045F0209120B981D720B3EAEF47F0E0D7F8
+:10273000BA4FAFEF16F0BA4F68EF31F0BA4F8AEFE9
+:1027400032F0BA4FEEEF48F0BA4FEEEF48F0050E18
+:10275000BA6F6ED72B97010EBA6F1F9F33EC0FF035
+:10276000EEEC1DF0B86B209921912193208F2187E9
+:10277000F7EC13F09BEC14F02FEC1DF02497249948
+:1027800042EC13F021B117D020AFEAEF47F020B1AF
+:1027900051EC3BF020B1CCEC40F020B18FEC3AF0A2
+:1027A00020B170EC45F0209120B9EAEF47F020B35A
+:1027B000EAEF47F0E5D7BA4FB7EF10F0BA4FB1EFF5
+:1027C00010F0BA4FA4D0BA4F03D0BA4F5CD036D075
+:1027D0002B87220EA4EC0DF0A82A060EA86201D0C9
+:1027E000A86AD5EC0DF0040EBA6F2499BBD7220E5F
+:1027F000A4EC0DF0A86604D0650E5DEC0BF01200A1
+:10280000A82E04D0660E5DEC0BF01200A82E04D0AA
+:10281000680E5DEC0BF01200A82E04D08A0E5DEC61
+:102820000BF01200A82E04D0980E5DEC0BF01200F5
+:10283000A82E1200EC0E5DEC0BF012002BA7EAEFB5
+:1028400047F033EC0FF027EC2AF0010EE8CF7FF0D1
+:10285000EB0E5DEC0BF0000EE8CF7FF0220EA4EC47
+:102860000DF0070EA802F350C10FBA6F070E396FB3
+:10287000BA515DEC0BF0BA2B392FFAD71E0E97EC3C
+:1028800048F0EAEF47F0010EBA6F1F9F33EC0FF0EC
+:102890000CEC1EF0B86B209921912193208F218799
+:1028A000FDEC14F0D7EC14F02FEC1DF024972499D4
+:1028B00042EC13F0030EBA6304D0060EBA6F2FEC8D
+:1028C0001DF021B117D020AFEAEF47F020B151EC55
+:1028D0003BF020B1CCEC40F020B18FEC3AF020B1CD
+:1028E00070EC45F0209120B9AAEF13F020B3EAEF85
+:1028F00047F0DED7BA4F4CD0BA4F6CD0BA4F2AD778
+:10290000BA4F28D7BA4F26D7050EBA6F26D71A0E58
+:10291000A4EC0DF0A82A630EA8640AD0690EA86082
+:1029200007D01A0EA2EC0DF0030EBA6F24991AD735
+:10293000640EA86EF6D71A0EA4EC0DF0630EA86410
+:1029400021D8690EA8601ED85F0EE8CF7CF0530E28
+:10295000E8CF7DF0000EE8CF7EF020EE60F0A8CF4B
+:1029600032F1336B1F8F030E29EC0DF01F9F6B0E9E
+:10297000DE6E670EDE6E2F0EDE6E6C0EDE6E26ECE9
+:102980000EF01200640EA86E1A0EA2EC0DF01200EA
+:102990005B0EA4EC0DF0A82A020EA86401D0A86A70
+:1029A0005B0EA2EC0DF0010EBA6F249973D75B0E8B
+:1029B000A4EC0DF0A86604D0030E5AEC0BF0120044
+:1029C000A82E04D0040E5AEC0BF01200050E5AEC9F
+:1029D0000BF01200270EA4EC0DF0A82A010EA8643B
+:1029E00001D0A86A270EA2EC0DF02A85010EA8627C
+:1029F0002A95020EBA6F24994DD7270EA4EC0DF03C
+:102A0000A86603D0830E5DEC0BF0A806A866FED680
+:102A1000820E5DEC0BF01200010EBA6F33EC0FF07A
+:102A20003CEC1EF0B86B209921912193208F2187D7
+:102A30003CEC1EF02FEC1DF02497249942EC13F08F
+:102A400021B116D020AFF1D520B151EC3BF020B12F
+:102A5000CCEC40F020B18FEC3AF020B170EC45F0B6
+:102A6000209120B915EF13F020B3EAEF47F0E6D735
+:102A7000BA4F08D0BA4F3AD0BA4F16D0BA4F05D095
+:102A8000BA4F20D0030EBA6FD3D5BAEC20F0BA6F8C
+:102A9000BA6701D0F7D781EC0EF0000E9B6E7E0E68
+:102AA000D36EFF0000EF00F0BAEC20F0BA6FBA6707
+:102AB00001D0E8D733EC0FF0190E5DEC0BF088EC89
+:102AC00016F0E0D7BAEC20F0BA6FBA6701D0DAD7C7
+:102AD00033EC0FF0190E5DEC0BF08DC100F58EC1DB
+:102AE00001F520EC80F00101EAEF47F0BAEC20F0AC
+:102AF000BA6FBA6701D0C6D733EC0FF0190E5DEC90
+:102B00000BF08DC100F58EC101F520EC80F00101C4
+:102B1000AA6A030EA96E336B150EE2D8150EE0D823
+:102B2000150EDED8150EDCD8150EDAD8150ED8D84D
+:102B3000010EA86E210EA2EC0DF0A86A220EA2ECE6
+:102B40000DF0A86A230EA2EC0DF0000EA86A270E65
+:102B5000A2EC0DF0A86A5A0EA2EC0DF0A86A5B0E6A
+:102B6000A2EC0DF0640E1A0EA2EC0DF01F0EA86E72
+:102B70001B0EA2EC0DF0A86A1C0EA2EC0DF0A86AC8
+:102B80001D0EA2EC0DF0A86A1E0EA2EC0DF0A86AB4
+:102B90001F0EA2EC0DF0A86A200EA2EC0DF0640E40
+:102BA000A86E240EA2EC0DF0250EA2EC0DF0260E60
+:102BB000A2EC0DF0010ECC6FCD6B7F0EA96E336BC6
+:102BC000640E8ED81E0E8CD8F00E8AD8780E88D857
+:102BD000050E86D8070E84D8040E336F338F880E07
+:102BE0007FD8040E336F338F4C0E7AD8140E78D8FA
+:102BF000140E76D81E0E74D86E0E72D85A0E70D877
+:102C00003C0E6ED8640E6CD8780E6AD80A0E68D85E
+:102C1000130E66D8A00E64D8960E62D80A0E60D83D
+:102C2000060E5ED8060E5CD8000E5AD8000E58D894
+:102C30000C0E56D8000E54D8140E52D8336B338F66
+:102C4000000E4ED8030E4CD80A0E4AD8000E48D8B3
+:102C5000010EAA6E7F0EA96E336B1E0E41D85A0E5E
+:102C60003FD8460E3DD88C0E3BD8780E39D8000E92
+:102C700037D8000E35D8000E33D8000E31D8000EEC
+:102C80002FD8000E2DD8000E2BD8000E29D8000EFC
+:102C900027D8000E25D8000E23D8000E21D8000E0C
+:102CA0001FD8000E1DD8000E1BD8000E19D8000E1C
+:102CB00017D8000E15D8000E13D8000E11D8000E2C
+:102CC0000FD8000E0DD8000E0BD8000E09D8000E3C
+:102CD00007D8000E05D8000E03D8AA6AEAEF47F01D
+:102CE000326FA92A32C1A8FFD5EC0DF0A92A33C151
+:102CF000A8FFD5EC0DF0A92A32C1A8FFD5EC0DF044
+:102D0000A92A339F33C1A8FFD5EC0DF0336B120015
+:102D1000BD6BBE6B020E366F376B400E3A6F23935E
+:102D20003B693B51EAEC2AF03A2FFAD7C584A0EC74
+:102D30002BF0070EDAEC0CF0372FEFD7362FECD74D
+:102D40002393BD6BBE6BFD0EDEEC2AF0FD0EDEECB8
+:102D50002AF0FE0EDEEC2AF0BD6BBE6B120033ECE7
+:102D60000FF0219521992197B86B219121932099FA
+:102D7000229122932295BB6B27EC2AF0010EE8CF1B
+:102D80007FF01D0E5DEC0BF0000EE8CF7FF0160E0D
+:102D90005DEC0BF0170E5DEC0BF0E9EC16F0180E85
+:102DA0005DEC0BF02497249924B7AEEC17F024B90E
+:102DB0007AEC17F021B942D020B151EC3BF020B1B0
+:102DC000CCEC40F0209120B991D020B3EAEF47F04D
+:102DD000EBD7460EE8CF7DF0410EE8CF7CF020EE39
+:102DE00060F005C132F1386B382B376B1BEC0DF0FE
+:102DF0003A0EDE6E04C132F1386B382B376B1BECA8
+:102E00000DF0200EDE6E200EDE6E26EC0EF0460E6D
+:102E1000E8CF7DF05F0EE8CF7CF020EE60F007C1D8
+:102E2000F1F106C1F2F108C1F3F132EC23F0200E0A
+:102E3000DE6E200EDE6E26EC0EF0120007C132F1BF
+:102E4000324F1F0E324F1C0E324F1F0E324F1E0ECE
+:102E5000324F1F0E324F1E0E324F1F0E324F1F0EBB
+:102E6000324F1E0E324F1F0E324F1E0E324F1F0EAC
+:102E7000066502D0010E066F200EE8CF7DF09B0E96
+:102E8000E8CF7CF0080E396FA8EC1CF0050E0A6F35
+:102E9000036B209120A1FED7209107EC17F0460E7E
+:102EA000E8CF7DF0410EE8CF7CF020EE60F005C168
+:102EB00032F1386B382B376B1BEC0DF03A0EDE6EAF
+:102EC00004C132F1386B382B376B1BEC0DF03A0E26
+:102ED000DE6E03C132F1386B382B376B1BEC0DF013
+:102EE000200EDE6E26EC0EF00A2FD4D7010EBA6F3C
+:102EF00069EF13F022B12189BB2BBBC1BCF1BC4FE0
+:102F00002185BC4F2285BC4F2283BC4F2281200EDD
+:102F1000E8CF7DF09B0EE8CF7CF020EE60F05E0EF7
+:102F200056EC0BF0BBC1BCF1BC2F04D05A0E56ECD2
+:102F30000BF00FD0BC2F04D05B0E56EC0BF009D079
+:102F4000BC2F04D05C0E56EC0BF003D05D0E56EC9B
+:102F50000BF026EC0EF0FCEC12F012002499036B3F
+:102F600022B120D022B310D022B515D021B506D081
+:102F7000052B170E05651CD0056B1AD0042B3B0ED4
+:102F8000046516D0046B14D0062B1F0E066510D0F6
+:102F9000010E066F0DD0072B0C0E076509D0010E30
+:102FA000076F06D0082B140E086502D0080E086FB4
+:102FB000E9EC16F0FCEC12F012007C6B080E7B6F53
+:102FC0006CC17DF16DC17EF191EC0CF0100E772794
+:102FD000270E782372C181F173C182F177C183F129
+:102FE00078C184F17AEC0CF07FC185F180C186F163
+:102FF0002AB71ED0239585C17BF186C17CF185C19E
+:103000007DF186C17EF191EC0CF0110E766F6AECC9
+:103010000CF085C181F186C182F177C183F178C15D
+:1030200084F17AEC0CF07FC187F180C188F117D070
+:10303000238585C17BF186C17CF185C17DF186C187
+:103040007EF191EC0CF00F0E766F6AEC0CF085516E
+:1030500077278651782377C187F178C188F16AC1D3
+:1030600081F16BC182F1FA0E836F846B7AEC0CF004
+:103070007FC17BF180C17CF185C17DF186C17EF18C
+:1030800091EC0CF077C174F178C175F10C0E766F8C
+:1030900064EC0CF074C177F175C178F12AA70DD0FA
+:1030A0006451772765517823100E7727270E7823F0
+:1030B00077C189F178C18AF10FD064C181F165C10E
+:1030C00082F177C183F178C184F17AEC0CF07FC191
+:1030D00077F180C178F1E8D766C168F167C169F11D
+:1030E000C80E6827000E692368C17BF169C17CF1B5
+:1030F00085C17DF186C17EF191EC0CF077C174F150
+:1031000078C175F10D0E766F64EC0CF074C18BF123
+:1031100075C18CF162C174F163C175F1010E766FF6
+:1031200064EC0CF074518B2775518C23B80E8B27EF
+:103130000B0E8C2370C181F171C182F189C183F1C1
+:103140008AC184F17AEC0CF07FC17BF180C17CF103
+:103150008BC17DF18CC17EF191EC0CF00C0E766F81
+:103160006AEC0CF02AB772EC0CF0E80E7727030E2D
+:10317000782377C18DF178C18EF125AD04D0C6C119
+:103180008DF1C7C18EF16EC168F16FC169F1640E36
+:103190006827000E692368C17BF169C17CF187C192
+:1031A0007DF188C17EF191EC0CF00B0E766F6AEC2C
+:1031B0000CF0249D23B509D0C80E7727000E782384
+:1031C00077C197F178C198F11200C80E816F826BB8
+:1031D00077C183F178C184F17AEC0CF02AB7248DA1
+:1031E0007FC197F180C198F11200D4D8A00E3D6F35
+:1031F0000C0E586F08D91200E3D857C171F156C1AF
+:1032000070F11200C7D8900EF2D7DAD857C173F117
+:1032100056C172F11200238F596B000EA96E010E78
+:10322000AA6ED1EC0DF0AA6AC80EA864A8CF59F115
+:10323000B1D80D0E586F540E3D6FE5D8C1D857C1A7
+:103240005BF156C15AF10D0E586F580E3D6FDBD829
+:10325000B7D857C15DF156C15CF10D0E586F640EC1
+:103260003D6FD1D8ADD857C15FF156C15EF10D0E9B
+:10327000586F680E3D6FC7D8A3D857C161F156C1CA
+:1032800060F15BC163F1D8906333D8906333D89019
+:1032900063335AC162F1D8805BA1D8906233D88081
+:1032A0005BA3D8906233D8805BA5D89062335CC1B1
+:1032B00064F1D8805DA1D8906433D8805DA3D890A4
+:1032C0006433D8805DA5D8906433D8805DA7D8904A
+:1032D0006433D8805DA9D8906433D8805DABD89032
+:1032E00064335DC165F1D8805AA1D8906533D88028
+:1032F0005AA3D8906533D8805AA5D8906533D89012
+:103300006533D8906533D89065335FC166F1D88056
+:103310005EAFD8906637D8805EADD8906637676B61
+:103320005FBF67835FBD678161C16AF1D88060AFAD
+:10333000D8906A376B6B61BF6B815EC16CF16C9D1D
+:103340005CB16C8D6C9F5CB36C8F6D6B5CB56D818B
+:103350005CB76D835CB96D855CBB6D876F6B60C15D
+:103360006EF16E9F239F120080820000808E00000D
+:1033700000000000000000000000809E120080920B
+:103380000000808E0000000000000000000000002F
+:10339000809E1200E9DFF3DFE7DFF1DFE5DFEFDF3B
+:1033A000E3DFEDDFE1DFEBDFDFDFE9DFDDDFE7DFFD
+:1033B000DBDFE5DFE4DFE3DFE2DFE1DFE0DF1200B8
+:1033C000080E586F10D83DC157F1080E586F0BD832
+:1033D0003DC156F1808E000000000000000000009A
+:1033E0000000809E1200808E00000000000000009F
+:1033F00000000000809E80A8D89080B8D8803D371B
+:10340000582FF1D71200809E8082030E585F808E65
+:10341000000000000000000000000000809E00008E
+:1034200000000000000000000000808E000000008E
+:103430000000000000000000809E0000000000006E
+:10344000000000000000808E00000000000000006E
+:1034500000000000809E3DAF80923DBF8082D890EA
+:103460003D37808E000000000000000000000000DA
+:10347000809E582FF0D71200DB6FD9C1DAF1D8C186
+:10348000D9F1D7C1D8F1D6C1D7F1D5C1D6F1DBC1B9
+:10349000D5F12AA51200C80EE8CF7CF0640EE8CF63
+:1034A0007DF0000EE8CF7EF0000EE8CF7FF0FF0E3B
+:1034B0002BEC10F020EE60F0D551DE6ED651DE6EB2
+:1034C000D751DE6ED851DE6ED951DE6EDA51DE6E26
+:1034D000200EDE6E26EC0EF01200FFEC49F00FEC31
+:1034E0004AF071EC0FF033EC0FF0FF0E2BEC10F004
+:1034F000850E5DEC0BF0860E5DEC0BF0870E5DEC3F
+:103500000BF0880E5DEC0BF0640EE8CF7CF00A0E39
+:10351000E8CF7DF0000EE8CF7EF0000EE8CF7FF020
+:10352000FF0E2BEC10F020EE60F0D551DE6ED65180
+:10353000DE6ED751DE6ED851DE6ED951DE6EDA51B5
+:10354000DE6E2E0EDE6E200EDE6E1FC132F1386B87
+:10355000382B376B20EC0DF0200EDE6E20C132F1DF
+:10356000386B382B376B20EC0DF026EC0EF07D0E0F
+:10357000E8CF7CF00A0EE8CF7DF0000EE8CF7EF0B9
+:10358000000EE8CF7FF0FF0E2BEC10F020EE60F085
+:1035900021C132F1386B382B376B20EC0DF0200E47
+:1035A000DE6E22C132F1386B382B376B20EC0DF018
+:1035B000200EDE6E23C132F1386B382B376B20ECD6
+:1035C0000DF0200EDE6E24C132F1386B382B376BD4
+:1035D00020EC0DF0200EDE6E25C132F1386B382B59
+:1035E000376B20EC0DF026EC0EF0960EE8CF7CF059
+:1035F0000A0EE8CF7DF0000EE8CF7EF0000EE8CF97
+:103600007FF0FF0E2BEC10F020EE60F026C132F1BF
+:10361000386B382B376B20EC0DF0200EDE6E27C197
+:1036200032F1386B382B376B20EC0DF0200EDE6E4C
+:1036300028C132F1386B382B376B20EC0DF0200E9F
+:10364000DE6E29C132F1386B382B376B20EC0DF070
+:10365000200EDE6E2AC132F1386B382B376B20EC2E
+:103660000DF026EC0EF024A7FED7FDEC49F0120079
+:10367000E00E2BEC10F00B0E5AEC0BF0560E5DEC3E
+:103680000BF0570E5DEC0BF0FF0E2BEC10F0120060
+:10369000000EE8CFF4F13C0EE8CFF5F1EF0EE8CFE5
+:1036A000F6F15A0EE8CFF7F19F0EE8CFF8F1CAEC29
+:1036B0000EF0A7EC1EF013EC1FF01200E9DFE00E95
+:1036C0002BEC10F0540E5DEC0BF0FF0E2BEC10F019
+:1036D000080E396F910EE8CF7CF0000EE8CF7DF038
+:1036E000A8EC1CF012002BB512007A0E3CEC1AF07C
+:1036F000B90EE8CF7CF0770EE8CF7DF0010EE8CF71
+:103700007EF0000EE8CF7FF0FF0E2BEC10F020EEE5
+:1037100060F022C532F1386B382B376B20EC0DF09E
+:10372000270EDE6E26EC0EF0000EE8CF7EF01200C3
+:10373000AFDFE00E2BEC10F0550E5DEC0BF0FF0E42
+:103740002BEC10F012002BB5120020BF34D0790EF4
+:103750003CEC1AF0E00E2BEC10F0520E5DEC0BF08E
+:10376000FF0E2BEC10F0760EE8CF7CF05E0EE8CF6B
+:103770007DF0010EE8CF7EF0000EE8CF7FF0FF0E67
+:103780002BEC10F020EE60F02BC532F1386B382BAB
+:10379000376B0AEC0DF06D0EDE6E24C532F1386B1E
+:1037A000382B376B0AEC0DF0270EDE6E26EC0EF090
+:1037B000000EE8CF7EF02BB51200780E3CEC1AF02C
+:1037C000B90EE8CF7CF0770EE8CF7DF0010EE8CFA0
+:1037D0007EF0000EE8CF7FF0FF0E2BEC10F020EE15
+:1037E00060F031C532F1C70E3261326F1F9F386B06
+:1037F000382B376B20EC0DF0270EDE6E26EC0EF02A
+:1038000032C532F1080E83EC10F0326101D060D77E
+:10381000770E3CEC1AF0910EE8CF7CF0000EE8CF6A
+:103820007DF0000EE8CF7EF0FF0E2BEC10F020EEC6
+:1038300060F0470EDE6E460EDE6E3A0EDE6E32C56C
+:1038400032F1386B382B376B20EC0DF0250EDE6E25
+:10385000200EDE6E26EC0EF01200410EE8CF7CF05A
+:10386000690EE8CF7DF0000EE8CF7EF0FF0E2BEC66
+:1038700010F020EE60F0EBC132F11F8F386B382B67
+:10388000376B20EC0DF01F9F6D0EDE6E690EDE6E45
+:103890006E0EDE6E200EDE6E26EC0EF05F0EE8CFB2
+:1038A0007CF0640EE8CF7DF0000EE8CF7EF0FF0ED6
+:1038B0002BEC10F020EE60F0ECC132F11F8F386B72
+:1038C000382B376B20EC0DF01F9F6D0EDE6E200E37
+:1038D000DE6E26EC0EF012002BB51200760E3CECDC
+:1038E0001AF05A0EE8CF7CF0000EE8CF7DF0000E03
+:1038F000E8CF7EF0FF0E2BEC10F020EE60F02D0EE6
+:103900001FB72B0EDE6E45C132F1386B382B376B8B
+:103910000AEC0DF0530E56EC0BF026EC0EF02B8952
+:103920001200080E396F5A0EE8CF7CF0000EE8CF77
+:103930007DF02B990DD0060E396F020EE8CF7CF08A
+:10394000730EE8CF7DF004D0010EE8CF7EF003D0F7
+:10395000000EE8CF7EF020EE60F0200EDE6E392FF4
+:10396000FCD726EC0EF0000EE8CF7EF01200630EBE
+:103970003CEC1AF0320EE8CF7CF0000EE8CF7DF080
+:10398000000EE8CF7EF0000EE8CF7FF0FF0E2BECAC
+:1039900010F020EE60F019C132F1326705D01AC183
+:1039A00032F1326701D039D02DAF34D0B72F01D0EA
+:1039B00034D02D8F060EB76125D819C132F11AC146
+:1039C00033F1B6EC0BF0335132C133F1326F490EA3
+:1039D000DE6E6E0EDE6E740EDE6E3A0EDE6E386BCE
+:1039E000382B376B1BEC0DF03A0EDE6E33C132F123
+:1039F000386B382B376B1BEC0DF0200EDE6E26EC8F
+:103A00000EF012002D9F050EB76F12002D8F050EC0
+:103A1000B76F1200B72F01D0CCD72D9F060EB7611C
+:103A2000F5DF05C132F1386B382B376B1BEC0DF02D
+:103A30003A0EDE6E04C132F1386B382B376B1BEC5B
+:103A40000DF03A0EDE6E03C132F1386B382B376B56
+:103A50001BEC0DF0200EDE6E26EC0EF01200230E95
+:103A6000E8CF7CF0000EE8CF7DF0000EE8CF7EF0CE
+:103A7000000EE8CF7FF0FF0E2BEC10F020EE60F090
+:103A8000B80EDE6E26EC0EF0410EE8CF7CF0000E94
+:103A9000E8CF7DF0000EE8CF7EF0000EE8CF7FF09B
+:103AA000FF0E2BEC10F020EE60F0B80EDE6E26EC70
+:103AB0000EF05F0EE8CF7CF0000EE8CF7DF0000E38
+:103AC000E8CF7EF0000EE8CF7FF0FF0E2BEC10F079
+:103AD00020EE60F0B80EDE6E26EC0EF07D0EE8CF24
+:103AE0007CF0000EE8CF7DF0000EE8CF7EF0000EF7
+:103AF000E8CF7FF0FF0E2BEC10F020EE60F0B80E58
+:103B0000DE6E26EC0EF09B0EE8CF7CF0000EE8CFC8
+:103B10007DF0000EE8CF7EF0000EE8CF7FF0FF0EC4
+:103B20002BEC10F020EE60F0B80EDE6E26EC0EF0FE
+:103B3000B90EE8CF7CF0000EE8CF7DF0000EE8CFA4
+:103B40007EF0000EE8CF7FF0FF0E2BEC10F020EEA1
+:103B500060F0B80EDE6E26EC0EF0BAC139F1394FC6
+:103B6000230E394F410E394F5F0E394F7D0E394FBD
+:103B70009B0E394FB90EE8CF7CF0000EE8CF7DF0F8
+:103B8000000EE8CF7EF0000EE8CF7FF0FF0E2BECAA
+:103B900010F020EE60F0B70EDE6E26EC0EF0120094
+:103BA00027EC2AF0010EE8CF7FF0050E5DEC0BF05C
+:103BB000000EE8CF7FF0060E5DEC0BF0070E5DEC1B
+:103BC0000BF0090E5DEC0BF00A0E5DEC0BF08E0EA7
+:103BD0005DEC0BF00B0E5DEC0BF0120027EC2AF005
+:103BE000010EE8CF7FF0620E5DEC0BF0000EE8CF27
+:103BF0007FF0630E5DEC0BF0990E5DEC0BF0140E94
+:103C00005AEC0BF0640E5DEC0BF08E0E5DEC0BF0DD
+:103C10000B0E5DEC0BF0120027EC2AF0010EE8CF42
+:103C20007FF0020E5AEC0BF0000EE8CF7FF0010E91
+:103C30005AEC0BF0810E5DEC0BF00B0E5DEC0BF013
+:103C4000120027EC2AF0010EE8CF7FF0900E5DEC19
+:103C50000BF0000EE8CF7FF0080E5DEC0BF06E0E5F
+:103C60005DEC0BF0710E5DEC0BF0F70E5DEC0BF004
+:103C70000B0E5DEC0BF0120027EC2AF0010EE8CFE2
+:103C80007FF01C0E5DEC0BF0000EE8CF7FF0150E00
+:103C90005DEC0BF0F50E5DEC0BF01C0E5AEC0BF02E
+:103CA0001D0E5AEC0BF01E0E5AEC0BF00B0E5DECD9
+:103CB0000BF0120027EC2AF0010EE8CF7FF0F80E8F
+:103CC0005DEC0BF0000EE8CF7FF0F90E5DEC0BF031
+:103CD000150E5AEC0BF0160E5AEC0BF0170E5AECB0
+:103CE0000BF0180E5AEC0BF00B0E5DEC0BF0120003
+:103CF000650E3CEC1AF097C199F198C19AF1640EE7
+:103D0000E8CF7CF0000EE8CF7DF0000EE8CF7EF02B
+:103D1000000EE8CF7FF0FF0E2BEC10F020EE60F0ED
+:103D20002D0E24BDDE6E97C132F198C133F1030E22
+:103D3000386F1F8F020E29EC0DF01F9FB00EDE6E44
+:103D4000430EDE6E200EDE6E26EC0EF012002BB55A
+:103D50001200750E3CEC1AF097C199F198C19AF1D6
+:103D6000D80EE8CF7CF0410EE8CF7DF0000EE8CF12
+:103D70007EF0000EE8CF7FF0FF0E2BEC10F020EE6F
+:103D800060F02D0E24BDDE6E97C132F198C133F183
+:103D9000030E386F1F8F020E29EC0DF01F9FB00E1F
+:103DA000DE6E200EDE6E26EC0EF01200740E3CEC81
+:103DB0001AF0780EE8CF7CF0000EE8CF7DF0000E10
+:103DC000E8CF7EF0FF0E2BEC10F020EE60F0700ECE
+:103DD000DE6E700EDE6E4F0EDE6E320EDE6E3A0E50
+:103DE000DE6E48C132F149C133F12987010E29EC59
+:103DF0000DF02997200EDE6E26EC0EF012000A0E52
+:103E0000396F780EE8CF7CF0000EE8CF7DF0A8EC9B
+:103E10001CF01200C00EE8CF7CF0410EE8CF7DF020
+:103E2000050E396F95D52ABB12002BB51200730E03
+:103E30003CEC1AF0C00EE8CF7CF0410EE8CF7DF0EC
+:103E4000000EE8CF7EF0000EE8CF7FF0FF0E2BECE7
+:103E500010F0640E10C532F1D880325511C532F120
+:103E6000D8803257090E83EC10F011C533F132655A
+:103E700001D005D0336703D0050E396F69D5150E13
+:103E800032630AD0336708D020EE60F0080E53EC9E
+:103E90000BF026EC0EF0120020EE60F01F8F386B56
+:103EA000382B376B20EC0DF02F0EDE6E11C532F182
+:103EB000386B382B376B20EC0DF0200EDE6E1F9F19
+:103EC00026EC0EF01200550EE8CF7DF0000EE8CF84
+:103ED0007EF0000EE8CF7FF0AA6A220EA4EC0DF06F
+:103EE000A86622D07D0EE8CF7CF0FF0E2BEC10F000
+:103EF00020EE60F04F0EDE6E26EC0EF0550EE8CF91
+:103F00007DF0000EE8CF7EF0000EE8CF7FF0960E39
+:103F1000E8CF7CF0FF0E2BEC10F020EE60F0430EAB
+:103F2000DE6E26EC0EF01200A806A86601D0120084
+:103F3000A806A8662BD07D0EE8CF7CF0FF0E2BECF8
+:103F400010F020EE60F0430EDE6E550EE8CF7DF0EF
+:103F5000000EE8CF7EF0000EE8CF7FF026EC0EF0EA
+:103F6000960EE8CF7CF0FF0E2BEC10F020EE60F008
+:103F7000430EDE6E550EE8CF7DF0000EE8CF7EF0EA
+:103F8000000EE8CF7FF026EC0EF01200A806A8661F
+:103F900001D01200A806A8662BD07D0EE8CF7CF0D9
+:103FA00020EE60F0470EDE6E550EE8CF7DF0000E7D
+:103FB000E8CF7EF0000EE8CF7FF0FF0E2BEC10F084
+:103FC00026EC0EF0960EE8CF7CF020EE60F0460E68
+:103FD000DE6E550EE8CF7DF0000EE8CF7EF0000ECD
+:103FE000E8CF7FF0FF0E2BEC10F026EC0EF0120065
+:103FF0007D0EE8CF7CF020EE60F0470EDE6E550EB1
+:10400000E8CF7DF0000EE8CF7EF0000EE8CF7FF025
+:10401000FF0E2BEC10F026EC0EF0960EE8CF7CF0A5
+:1040200020EE60F0460EDE6E550EE8CF7DF0000EFD
+:10403000E8CF7EF0000EE8CF7FF0FF0E2BEC10F003
+:1040400026EC0EF01200710E3CEC1AF02ABB1200A6
+:1040500028BF120029A124D0870EE8CF7CF05A0E89
+:10406000E8CF7DF0000EE8CF7EF0000EE8CF7FF0C5
+:10407000FF0E2BEC10F020EE60F0240EA4EC0DF0FF
+:10408000A8CF32F1336B030E29EC0DF0420EDE6E39
+:10409000610EDE6E720EDE6E1F9F26EC0EF058D0A3
+:1040A000820EE8CF7CF0640EE8CF7DF0010EE8CF01
+:1040B0007EF0000EE8CF7FF0FF0E2BEC10F0210E0B
+:1040C000A4EC0DF0A8CFD1F1D105040DF350070FEA
+:1040D000A96ED1EC0DF0A8CF11F5D105040DF35068
+:1040E000060FA96ED1EC0DF0A8CFD0F111C50AF1E1
+:1040F000D880640E0A55D880A856A8CF10F5640E53
+:1041000010C532F1D880325511C532F1D8803257FE
+:1041100011C533F1150E326306D0336704D0090E92
+:104120005AEC0BF015D020EE60F01F8F386B382B57
+:10413000376B20EC0DF02F0EDE6E11C532F1386BAF
+:10414000382B376B20EC0DF01F9F26EC0EF000D0C3
+:10415000000EE8CFF4F17A0EE8CFF5F1AF0EE8CF1C
+:10416000F6F1520EE8CFF7F19F0EE8CFF8F189ECA7
+:104170000EF01200000EE8CFF4F1440EE8CFF5F196
+:10418000920EE8CFF6F1220EE8CFF7F1650EE8CFF8
+:10419000F8F1CAEC0EF0FF0EE8CFF4F1460EE8CFCE
+:1041A000F5F1900EE8CFF6F1230EE8CFF7F1640EAB
+:1041B000E8CFF8F189EC0EF08F0E5DEC0BF0910E6C
+:1041C0005DEC0BF0920E5DEC0BF0010EBA6F000E81
+:1041D000E8CFF4F1600EE8CFF5F18F0EE8CFF6F1FD
+:1041E000270EE8CFF7F1330EE8CFF8F1CAEC0EF066
+:1041F000BAC139F1600E394F600E394F780EE8CFF1
+:104200007CF0270EE8CF7DF0000EE8CF7EF0000EA8
+:10421000E8CF7FF0FF0E2BEC10F020EE60F0B70E31
+:10422000DE6E26EC0EF0209921912193249924979B
+:10423000B86B640EDAEC0CF034EC2FF021B315D02F
+:1042400021B10ED020B151EC3BF020B1CCEC40F0CC
+:10425000209120B903D020B301D0EED7000C010C7F
+:10426000BA4FFCD7BA4FFBD7F9D7BA2B030EBA63B4
+:1042700002D0010EBA6FABD7720E3CEC1AF090C1AF
+:1042800033F18FC132F1A6EC2AF0270E336171D0E1
+:104290002BBBE0EC21F02B9B20EE60F0030E536F64
+:1042A000E80E526F33C155F132C154F1542B000E58
+:1042B0005523D9EC0BF01FA780D8180EE8CF7CF05F
+:1042C000000EE8CF7DF0020EE8CF7EF0000EE8CFC2
+:1042D0007FF0FF0E2BEC10F0000E536F630E526F49
+:1042E00033C155F132C154F1D9EC0BF01FA70AD0FC
+:1042F0001F8F2987386B382B376B375129EC0DF01E
+:104300001F9F02D0300EDE6E26EC0EF02997010EB4
+:10431000E8CF7EF0320EE8CF7CF0280EE8CF7DF0BB
+:10432000FF0E2BEC10F090C133F18FC132F1A6ECEF
+:104330002AF020EE60F02E0EDE6E000E536F090E96
+:10434000526F33C155F132C154F1D9EC0BF01FA7B4
+:1043500007D0040E386F2485000E29EC0DF002D032
+:10436000300EDE6E26EC0EF02495000EE8CF7EF0C7
+:1043700012002BABE0EC21F020EE60F0180EE8CF3D
+:104380007CF0000EE8CF7DF0020EE8CF7EF0000E4C
+:10439000E8CF7FF0FF0E2BEC10F029871F8F386BD2
+:1043A000382B376B375129EC0DF01F9F26EC0EF0A0
+:1043B0002997000EE8CF7EF01200200EDE6E12006C
+:1043C000000EE8CFF4F1180EE8CFF5F15A0EE8CF61
+:1043D000F6F1000EE8CFF7F15A0EE8CFF8F1CAEC8B
+:1043E0000EF02B8B1200680E3CEC1AF0960EE8CF04
+:1043F0007CF0000EE8CF7DF0000EE8CF7EF0000EDE
+:10440000E8CF7FF0FF0E2BEC10F020EE60F00E0EE8
+:1044100056EC0BF0200EDE6E20C532F121C533F1D3
+:10442000B6EC0BF01F8F325133C132F1336F386B62
+:10443000382B376B20EC0DF03A0EDE6E33C132F1C3
+:10444000386B382B376B1BEC0DF01F9F26EC0EF0F2
+:104450001200670E3CEC1AF07D0EE8CF7CF0000EE7
+:10446000E8CF7DF0000EE8CF7EF0000EE8CF7FF0C1
+:10447000FF0E2BEC10F020EE60F0230E56EC0BF04C
+:10448000200EDE6ECCC132F1CDC133F1B6EC0BF0B3
+:104490001F8F325133C132F1336F386B382B376B8A
+:1044A00020EC0DF03A0EDE6E33C132F1320732BF2E
+:1044B000326B386B382B376B1BEC0DF01F9F26ECE3
+:1044C0000EF0120020BD1200620E3CEC1AF0190E24
+:1044D000E8CF7CF0000EE8CF7DF0000EE8CF7EF054
+:1044E000000EE8CF7FF0FF0E2BEC10F020EE60F016
+:1044F0008DC132F18EC133F11F8F386B382B376B82
+:10450000375129EC0DF01F9F6D0EDE6E620EDE6ED0
+:10451000610EDE6E720EDE6E200EDE6E26EC0EF08A
+:104520001200660E3CEC1AF01F0E83EC10F0326F96
+:10453000010E326324D0AF0EE8CF7CF0000EE8CF3E
+:104540007DF0000EE8CF7EF0000EE8CF7FF0FF0E8A
+:104550002BEC10F020EE60F0C2C132F1C3C133F198
+:10456000010E386F24851F8F020E29EC0DF01F9F5E
+:10457000560EDE6E200EDE6E26EC0EF01200FF0EE2
+:10458000E8CFF4F1AE0EE8CFF5F1C20EE8CFF6F1C8
+:10459000000EE8CFF7F11F0EE8CFF8F189EC0EF02E
+:1045A000100E526F0E0E536FC2C154F1C3C155F1BC
+:1045B000D9EC0BF01FB742D0B80E546F0B0E556FED
+:1045C000C2C152F1C3C153F1D9EC0BF01FB733D0C4
+:1045D00050C14CF151C14DF1140E4E6F4F6B0DECAB
+:1045E0000CF048C10AF1020E0A650A6FFF0EE8CF0F
+:1045F000F4F1B50EE8CFF5F1BB0EE8CFF6F11F0EE2
+:10460000E8CFF7F1210EE8CFF8F189EC0EF0DF0EDC
+:10461000E8CFF4F1AF0EE8CFF5F1C10EE8CFF6F137
+:10462000010EE8CFF7F10AC1F8F1CAEC0EF0FF0E67
+:104630002BEC10F01200010E0A6FD8D71E0E0A6F75
+:10464000FF0EE8CFF4F1B50EE8CFF5F1BB0EE8CFE1
+:10465000F6F11F0EE8CFF7F1210EE8CFF8F1CAEC22
+:104660000EF0D5D75B0EA4EC0DF0A8660ED0F1C10C
+:1046700032F11F8F386B382B376B1BEC0DF01F9FFF
+:104680002F0EDE6EF2C132F112D05B0EA4EC0DF0F3
+:10469000A82E1FD0F2C132F11F8F386B382B376B29
+:1046A0001BEC0DF01F9F2F0EDE6EF1C132F11F8F3C
+:1046B000386B382B376B1BEC0DF01F9F2F0EDE6E07
+:1046C000F3C132F11F8F386B382B376B1BEC0DF0B9
+:1046D0001200F3C132F11F8F386B382B376B1BEC94
+:1046E0000DF01F9F2F0EDE6EF1C132F11F8F386B60
+:1046F000382B376B1BEC0DF01F9F2F0EDE6EF2C1B7
+:1047000032F11F8F386B382B376B1BEC0DF012001A
+:104710005B0EA4EC0DF0A86615D0F1C132F11F8F2D
+:10472000386B382B376B1BEC0DF01F9F2F0EDE6E96
+:10473000F2C132F11F8F386B382B376B1BEC0DF049
+:104740001F9F12005B0EA4EC0DF0A82EE6D7F2C15D
+:1047500032F11F8F386B382B376B1BEC0DF01F9F1E
+:104760002F0EDE6EF1C132F11F8F386B382B376B95
+:104770001BEC0DF01F9F1200640E3CEC1AF04B0E68
+:10478000E8CF7CF0000EE8CF7DF0000EE8CF7EF0A1
+:10479000000EE8CF7FF0FF0E2BEC10F020EE60F063
+:1047A00007C1F1F106C1F2F108C1F3F132EC23F0D7
+:1047B00026EC0EF01200000EE8CFF4F1000EE8CF68
+:1047C000F5F11A0EE8CFF6F1410EE8CFF7F1640EDD
+:1047D000E8CFF8F1CAEC0EF012002BB51200700E03
+:1047E0003CEC1AF0B80EE8CF7CF0000EE8CF7DF07C
+:1047F000010EE8CF7EF0000EE8CF7FF0FF0E2BEC2D
+:1048000010F020EE60F091C132F192C133F1A6ECCC
+:104810002AF01F8F2485030E29EC0DF01F9F1F9D8A
+:1048200026EC0EF0000EE8CF7EF0120020BF120042
+:10483000410E3CEC1AF028BF99D02ABB97D0260E27
+:1048400083EC10F0326F010E326301D08FD0A5C11E
+:1048500032F1A6C133F11F9F20EE60F0386B382B88
+:10486000376B1F8D375129EC0DF0140EE8CF7CF01B
+:10487000780EE8CF7DF0010EE8CF7EF0FF0E2BEC36
+:1048800010F026EC0EF0000EE8CF7EF0120020BFF4
+:104890001200E00E2BEC10F08C0E5DEC0BF0FF0E16
+:1048A0002BEC10F0550EE8CF7CF05A0EE8CF7DF0DF
+:1048B000010EE8CF7EF0FF0E2BEC10F0E1C132F1DB
+:1048C0001F9F20EE60F0386B382B376B20EC0DF01B
+:1048D0003A0EDE6EE2C132F1386B382B376B1BECCF
+:1048E0000DF026EC0EF0000EE8CF7EF01200000E68
+:1048F000E8CFF4F13C0EE8CFF5F1770EE8CFF6F112
+:104900005A0EE8CFF7F19F0EE8CFF8F1CAEC0EF09F
+:104910001200E00E2BEC10F08B0E5DEC0BF0FF0E96
+:104920002BEC10F0910EE8CF7CF05A0EE8CF7DF022
+:10493000010EE8CF7EF0FF0E2BEC10F0DCC132F15F
+:1049400020EE60F0386B382B376B20EC0DF03A0E10
+:10495000DE6EDDC132F1386B382B376B1BEC0DF09E
+:1049600026EC0EF0000EE8CF7EF01200A5C132F169
+:10497000A6C133F11F9F1F8D20EE60F0386B382BDE
+:10498000376B1F8D375129EC0DF03A0EDE6EA7C143
+:1049900032F1386B382B376B1BEC0DF0140EE8CF6F
+:1049A0007CF05A0EE8CF7DF0010EE8CF7EF0FF0ECE
+:1049B0002BEC10F026EC0EF01F9D000EE8CF7EF0E1
+:1049C0001200000EE8CFF4F1360EE8CFF5F1660ED6
+:1049D000E8CFF6F13E0EE8CFF7F19F0EE8CFF8F101
+:1049E000CAEC0EF0120020BF1200560E3CEC1AF07A
+:1049F000E00E2BEC10F01B0E5AEC0BF0FF0E2BEC24
+:104A000010F0500EE8CF7CF06E0EE8CF7DF0000E77
+:104A1000E8CF7EF0FF0E2BEC10F020EE60F017C117
+:104A200032F118C133F1020E325F000E335BB6EC87
+:104A30000BF032C10AF133C132F1336B000E1F9F0C
+:104A40001F8D386B382B376B1F8D375129EC0DF0CC
+:104A50003A0EDE6E0AC132F1386B382B376B1BEC25
+:104A60000DF01F9F26EC0EF0550E3CEC1AF0500E88
+:104A7000E8CF7CF03E0EE8CF7DF0000EE8CF7EF070
+:104A8000FF0E2BEC10F020EE60F093C132F194C1D8
+:104A900033F1A6EC2AF01F8F2485030E29EC0DF0CC
+:104AA0001F9F6D0EDE6E200EDE6E26EC0EF01200E5
+:104AB000610E3CEC1AF0000EE8CF7CF0000EE8CF5F
+:104AC0007DF0000EE8CF7EF0000EE8CF7FF0FF0E05
+:104AD0002BEC10F020EE60F0060E53EC0BF0AA6AFF
+:104AE000A96AD1EC0DF0A8CF32F1A92AD1EC0DF0D2
+:104AF000A8CF33F11F8F386B382B376B375129EC28
+:104B00000DF0200EDE6E560EDE6E010E326F1F8F20
+:104B1000386B382B376B20EC0DF02E0EDE6E320E1C
+:104B2000326F1F8F386B382B376B1BEC0DF01F9FCC
+:104B300026EC0EF012006F0E3CEC1AF0DBEC23F0CA
+:104B40001F0E5DEC0BF029B107D0200E5DEC0BF0D1
+:104B50007A0E5DEC0BF006D0EE0E5DEC0BF0890EDC
+:104B60005DEC0BF0210E5DEC0BF0220E5DEC0BF01A
+:104B700012006F0E3CEC1AF0F00E5DEC0BF0F10E33
+:104B80005DEC0BF0190E5AEC0BF0930E5DEC0BF094
+:104B9000F40E5DEC0BF01200640EE8CF7DF0000E19
+:104BA000E8CF7CF0000EE8CF7EF0FF0E2BEC10F08B
+:104BB00020EE60F0530EDE6E650EDE6E6C0EDE6E65
+:104BC000180EA4EC0DF0A8CF32F11F8F386B382BE4
+:104BD000376B20EC0DF02F0EDE6E190EA4EC0DF0ED
+:104BE000A8CF32F11F8F386B382B376B20EC0DF0CC
+:104BF00026EC0EF07B0E5DEC0BF07C0E5DEC0BF00A
+:104C00007D0E5DEC0BF07E0E5DEC0BF01200FE0EE7
+:104C10005DEC0BF0FA0E5DEC0BF0FB0E5DEC0BF0B7
+:104C2000FC0E5DEC0BF0FD0E5DEC0BF01200FF0EC8
+:104C3000E8CFF4F17CC0F5F17CC0F6F1140EF62754
+:104C40007A0EE8CFF7F1322732078A0E3261326FDF
+:104C500032C1F8F1CAEC0EF0000EE8CFF4F17CC0DE
+:104C6000F5F17CC0F6F1140EF62732C1F7F1F72BFF
+:104C70008B0EE8CFF8F1CAEC0EF01200000EE8CF70
+:104C8000F4F133C1F5F17D0EE8CFF6F1640EE8CF13
+:104C9000F7F19F0EE8CFF8F1CAEC0EF012006E0E9D
+:104CA0003CEC1AF02BC532F1326706D0CFEC27F07E
+:104CB000EF0E5DEC0BF012001F8F640EE8CF7DF05D
+:104CC000000EE8CF7CF0336F42EC0EF020EE60F087
+:104CD0002BC532F13251D8B43EEF26F0386B382B69
+:104CE000376B20EC0DF06D0EDE6E26EC0EF08C0EA8
+:104CF000E8CF7DF0000EE8CF7CF020EE60F024C518
+:104D000032F1386B382B376B1BEC0DF0270EDE6E53
+:104D100026EC0EF017EC26F0640EE8CF7DF0190EAD
+:104D2000E8CF7CF0336F42EC0EF020EE60F02CC543
+:104D300032F13251D8B43EEF26F0386B382B376B56
+:104D400020EC0DF06D0EDE6E26EC0EF08C0EE8CF32
+:104D50007DF0190EE8CF7CF020EE60F025C532F131
+:104D6000386B382B376B1BEC0DF0270EDE6E26EC04
+:104D70000EF017EC26F0640EE8CF7DF0320EE8CF8F
+:104D80007CF0336F42EC0EF020EE60F02DC532F176
+:104D90003251D8B43EEF26F0386B382B376B20EC0D
+:104DA0000DF06D0EDE6E26EC0EF08C0EE8CF7DF071
+:104DB000320EE8CF7CF020EE60F026C532F1386B81
+:104DC000382B376B1BEC0DF0270EDE6E26EC0EF049
+:104DD00017EC26F0640EE8CF7DF04B0EE8CF7CF0A8
+:104DE000336F42EC0EF020EE60F02EC532F13251FE
+:104DF000D8B43EEF26F0386B382B376B20EC0DF033
+:104E00006D0EDE6E26EC0EF08C0EE8CF7DF04B0EB4
+:104E1000E8CF7CF020EE60F027C532F1386B382BFC
+:104E2000376B1BEC0DF0270EDE6E26EC0EF017EC48
+:104E300026F0640EE8CF7DF0640EE8CF7CF0336F8F
+:104E400042EC0EF020EE60F02FC532F13251D8B4B2
+:104E50003EEF26F0386B382B376B20EC0DF06D0EE3
+:104E6000DE6E26EC0EF08C0EE8CF7DF0640EE8CFFF
+:104E70007CF020EE60F028C532F1386B382B376BB0
+:104E80001BEC0DF0270EDE6E26EC0EF017EC26F074
+:104E900012006D0E3CEC1AF0640EE8CF7DF0000EAF
+:104EA000E8CF7EF01F8F020E0A6FE70E096F336B9B
+:104EB000332B040E0A27190E0927640EE8CF7DF064
+:104EC00009C17CF020EE60F0470EDE6E33C132F196
+:104ED000386B382B376B20EC0DF03A0EDE6E0AC1C2
+:104EE000A9FFD1EC0DF0A8CF32F1386B382B376B1E
+:104EF00020EC0DF02F0EDE6EA92AD1EC0DF0A8CF1C
+:104F000032F1386B382B376B20EC0DF01B0EA4EC14
+:104F10000DF033C132F1A832322FFDD70F0ED8A0D9
+:104F20000A0E1B6F26EC0EF00F0E1B6F050E33637F
+:104F3000BFD71200640EE8CF7DF0000EE8CF7EF000
+:104F40001F8F230E0A6FE70E096FE66B0A2BE62B05
+:104F5000190E092709C17CF0640EE8CF7DF020EE20
+:104F600060F0530EDE6E500EDE6EE6C132F1386B2D
+:104F7000382B376B20EC0DF03A0EDE6E0AC1A9FF1C
+:104F8000D1EC0DF0A8CF32F1336B030E29EC0DF00C
+:104F900026EC0EF0030EE663D9D71F9F1200000E19
+:104FA000E8CFF4F1000EE8CFF5F17D0EE8CFF6F191
+:104FB000520EE8CFF7F19F0EE8CFF8F1CAEC0EF0F1
+:104FC00012006C0E3CEC1AF0000EE8CF7CF0550E8F
+:104FD000E8CF7DF0000EE8CF7EF0000EE8CF7FF046
+:104FE000FF0E2BEC10F020EE60F0B80EDE6E26EC1B
+:104FF0000EF0190EE8CF7CF0550EE8CF7DF0000ED4
+:10500000E8CF7EF0000EE8CF7FF0FF0E2BEC10F023
+:1050100020EE60F0B80EDE6E26EC0EF0320EE8CF19
+:105020007CF0550EE8CF7DF0000EE8CF7EF0000E4C
+:10503000E8CF7FF0FF0E2BEC10F020EE60F0B80E02
+:10504000DE6E26EC0EF04B0EE8CF7CF0550EE8CF6E
+:105050007DF0000EE8CF7EF0000EE8CF7FF0FF0E6F
+:105060002BEC10F020EE60F0B80EDE6E26EC0EF0A9
+:10507000640EE8CF7CF0550EE8CF7DF0000EE8CF4F
+:105080007EF0000EE8CF7FF0FF0E2BEC10F020EE4C
+:1050900060F0B80EDE6E26EC0EF0BAC139F1000EEB
+:1050A000394F000E394F190E394F320E394F4B0E12
+:1050B000394F640EE8CF7CF0550EE8CF7DF0000E3E
+:1050C000E8CF7EF0000EE8CF7FF0FF0E2BEC10F063
+:1050D00020EE60F0B70EDE6E26EC0EF012007F0EB2
+:1050E0005DEC0BF0800E5DEC0BF0840E5DEC0BF0D4
+:1050F0001200000EE8CFF4F1380EE8CFF5F1580EAB
+:10510000E8CFF6F1450EE8CFF7F1730EE8CFF8F1EE
+:10511000CAEC0EF0FF0EE8CFF4F13A0EE8CFF5F14D
+:10512000560EE8CFF6F1460EE8CFF7F1720EE8CF53
+:10513000F8F189EC0EF03C0EE8CF7CF0470EE8CF9A
+:105140007DF0000EE8CF7EF0010EE8CF7FF0E00E9C
+:105150002BEC10F020EE60F0430EDE6E460EDE6E9D
+:1051600039C132F1386B382B376B20EC0DF0210E42
+:10517000DE6E26EC0EF0000EE8CF7FF0FF0E2BEC7B
+:1051800010F01200680E3CEC1AF0690E3CEC1AF0BC
+:10519000FF0EE8CFF4F1190EE8CFF5F1780EE8CF65
+:1051A000F6F1520EE8CFF7F19F0EE8CFF8F189EC57
+:1051B0000EF025EE33F0100E0A6F096BFF0EE8CFEC
+:1051C000F4F11C0E0925E8CFF5F11C0E0925E8CFF6
+:1051D000F6F1092B092B640EE8CFF7F1DECFF8F1D9
+:1051E000D890F833D890F833640EF8279D0EF86104
+:1051F000F86FCAEC0EF00A2FE1D725EE43F0100E3F
+:105200000A6F096BFF0EE8CFF4F1560E0925E8CFBF
+:10521000F5F1560E0925E8CFF6F1092B092B640E9E
+:10522000E8CFF7F1DECFF8F1D890F833D890F83323
+:10523000640EF8279D0EF861F86FCAEC0EF00A2F85
+:10524000E1D7540EE8CF7DF0200EE8CF7CF0FF0EC2
+:105250002BEC10F020EE60F04E0EDE6E320EDE6EA5
+:1052600026EC0EF0540EE8CF7DF05A0EE8CF7CF01D
+:10527000FF0E2BEC10F020EE60F0480EDE6E650E97
+:10528000DE6E26EC0EF0120027EC2AF0010EE8CFBD
+:105290007FF0030E5DEC0BF0000EE8CF7FF0440EC4
+:1052A0005DEC0BF0450E5DEC0BF0460E5DEC0BF08B
+:1052B000470E5DEC0BF0480E5DEC0BF0490E5DEC1B
+:1052C0000BF04A0E5DEC0BF0120027EC2AF0010EF9
+:1052D000E8CF7FF0030E5DEC0BF0000EE8CF7FF01F
+:1052E0004B0E5DEC0BF04C0E5DEC0BF04D0E5DECDF
+:1052F0000BF04E0E5DEC0BF04F0E5DEC0BF0500E14
+:105300005DEC0BF0510E5DEC0BF0120027EC2AF077
+:10531000010EE8CF7FF00F0E5AEC0BF0000EE8CF35
+:105320007FF0100E5AEC0BF0110E5AEC0BF0120E2F
+:105330005AEC0BF0130E5AEC0BF012002BB51200C6
+:1053400020BF120020BD12006A0E3CEC1AF0A80E1D
+:10535000E8CF7CF0410EE8CF7DF0000EE8CF7EF084
+:10536000000EE8CF7FF0FF0E2BEC10F020EE60F087
+:1053700018C532F1326706D0070E53EC0BF026EC5D
+:105380000EF012002DBB1200336B1F8F030E29ECA1
+:105390000DF01F9F26EC0EF0120030EC80F00101A2
+:1053A0001A0E5AEC0BF020EE60F0230EDE6E63C591
+:1053B00032F163C50AF11F8F386B382B376B20EC45
+:1053C0000DF0200EDE6E280EDE6E100E0A6105D086
+:1053D0004E0EDE6E320EDE6E04D0480EDE6E650EB0
+:1053E000DE6E290EDE6E200EDE6E640EE8CF7DF0DE
+:1053F000190EE8CF7CF0000EE8CF7EF0FF0E2BEC0C
+:1054000010F026EC0EF020EE60F015EE33F00A2BD3
+:10541000E6CF32F10A2FFCD7386B382B376B20ECF4
+:105420000DF0250EDE6E200EDE6E640EE8CF7DF0F0
+:10543000320EE8CF7CF0000EE8CF7EF0FF0E2BECB2
+:1054400010F026EC0EF01F9F1200000E01D0FF0E90
+:10545000E8CFF4F1000EE8CFF5F11A0EE8CFF6F13F
+:10546000000EE8CFF7F19F0EE8CFF8F1CAEC0EF08E
+:1054700012002BB5120028BF12002ABB12002BB954
+:1054800012006B0E3CEC1AF05A0EE8CF7CF0000EC6
+:10549000E8CF7DF0000EE8CF7EF0FF0E2BEC10F091
+:1054A00020EE60F0430EDE6E4E0EDE6E530EDE6EAC
+:1054B0003A0EDE6E65C532F11F8F386B382B376BB5
+:1054C00020EC0DF01F9F250EDE6E26EC0EF0120074
+:1054D000400EA4EC0DF0010EA8622BD0C80EE8CF50
+:1054E0007CF0000EE8CF7DF0000EE8CF7EF0000EDD
+:1054F000E8CF7FF0E00E2BEC10F020EE60F0400ED5
+:10550000326F180E336F322B94EC2AF07D0EA862A6
+:1055100001D004D0A8CFDEFF332FF5D726EC0EF054
+:10552000FF0E2BEC10F0120032C1A9FFD1EC0DF0F0
+:105530001200180E396FC80EE8CF7CF0000EE8CFCD
+:105540007DF0A8EC1CF012001200120025BD120024
+:105550001A0EA4EC0DF0A8CF0AF1690E0A61120030
+:10556000630E0A65120032C14CF133C14DF1640E75
+:105570004E6F4F6BF0EC0BF00AC14EF14F6B34ECF9
+:105580000CF048C132F149C133F112003B6F010EFA
+:10559000BD27000EBE23BEAF02D0BD6BBE6B3B2F3E
+:1055A000F6D712003B6F010EBD5F000EBE5BBEAFB3
+:1055B00002D07F0EBE6F3B2FF6D712009CD8010E93
+:1055C000BD27000EBE232391BEAF1200BD6BBE6B84
+:1055D0002381120023B31CD823A30BD82383000EEE
+:1055E000BD2BBE232391BEAF1200BD6BBE6B2381CA
+:1055F00012003B6FC580A4D8A60EC96EA1D894D85E
+:10560000BEC1C9FF9DD890D8BDC1C9FF99D88CD85B
+:105610003BC1C9FF95D888D812003B6B3C6B229FD9
+:10562000229DC5848DD8C5808BD8A60EC96E88D81A
+:10563000C5BCF7D73CC1C9FF83D876D83BC1C9FFE9
+:105640007FD872D8C5827CD8A70EC96E79D86CD89D
+:10565000C58676D822BD05D0228DFD0EC962229D59
+:1056600011D022BF05D0228FFD0EC96209D00AD009
+:10567000FE0EC96205D03BC1BDF13CC1BEF10DD0EB
+:10568000229F229D010E3B27000E3C233CBF03D0EE
+:10569000C58856D8DDD7BD6BBE6BC58451D8229F57
+:1056A000229D1200C5844CD8C5804AD8A60EC96E6A
+:1056B00047D8C5BCF7D7BEC1C9FF42D835D8BDC190
+:1056C000C9FF3ED831D8C5823BD8A70EC96E38D89D
+:1056D0002BD8C58635D8C950C58432D81200E2DF30
+:1056E000010EBD27000EBE232391BEAF1200BD6B7D
+:1056F000BE6B238112003B6FC58022D8A60EC96EF7
+:105700001FD812D8BEC1C9FF1BD80ED8BDC1C9FF52
+:1057100017D80AD83BC1C9FF13D806D8C58410D8FA
+:10572000060EDAEC0CF01200C5BC01D812004D0ECA
+:105730003CEC1AF0FBEC49F00BD89E96C46B1200BF
+:10574000C42F01D0F4D79EA6FBD7C46B9E9612003F
+:10575000C66A4E0E3CEC1AF0C56AC76A94969488E5
+:105760008296090EC46F8286000082B804D08296A9
+:105770008296C42FF8D79486C66A0A0EDAEC0CF02B
+:10578000000EC76E280EC66E000EC56E080EC86EDF
+:10579000FDEC49F04F0E3CEC1AF01200C56FC580CD
+:1057A000CFDF900EC96ECCDFBFDFC5C1C9FFC8DF38
+:1057B000BBDFC584C5DF12009E96C580C1DF910E98
+:1057C000C96EBEDFB1DFC586BBDFC9CFC5F1C588F5
+:1057D000B7DFC584B5DF12002595299533EC0FF0AE
+:1057E000259325972599BC6BBB6BC16B010EE8CF48
+:1057F0007FF00C0E5DEC0BF0000EE8CF7FF0A56B98
+:10580000A66BA8EC2BF00DEC2BF0396B3A6B050E68
+:10581000BA6F010EE8CF7FF00C0E5DEC0BF0000EBE
+:10582000E8CF7FF0229D229F010EA527000EA62320
+:10583000A6BF27D0010ED2EC2AF052EC2BF022BDED
+:1058400005D0228DFA0EC962229D10D022BF05D04C
+:10585000228FFA0EC96207D809D0BDC1BFF1BEC1FF
+:10586000C0F1C12B13D0229F229D1200010E3927B7
+:10587000000E3A233ABF01D0D7D725A915EF13F070
+:105880002CD0C151D8B4F9D7258327D0030EC6EC4C
+:105890002AF025A704D0A751C163E0D264D025B374
+:1058A0001CD0F7DA050EBA6316D0C1C1ACF1BFC186
+:1058B000AAF1C0C1ABF1A5C191F1A6C192F139C164
+:1058C000F0F13AC1A8F1030EAA27000EAB23030E94
+:1058D000915F000E925BBA2FC1D225A97DD727EC2C
+:1058E0002AF0010EE8CF7FF01A0E5DEC0BF0000EEF
+:1058F000E8CF7FF00B0E5DEC0BF020992191219306
+:10590000219724992497B86B010E25B5AD51BA6F34
+:10591000259525992FEC1DF034EC2FF021B3A9D259
+:1059200021B10ED020B151EC3BF020B1CCEC40F0D5
+:10593000209120B915EF13F020B3EAEF47F0ECD730
+:105940002191060EBA6302D015EF13F0BAC1ADF182
+:105950002585BB51050DF350BA25A76F33EC0FF029
+:105960002587C16B43D725979BEC1CF0000EE8CF31
+:105970007CF0000EE8CF7DF020EE60F0230EDE6EAE
+:105980001C0E97EC10F0326703D0336701D016D0AD
+:10599000010E3227000E332332C152F133C153F1CD
+:1059A000A7C154F1556BD9EC0BF050C132F151C184
+:1059B00033F11F8F0A0E29EC0DF007D0A7C132F189
+:1059C000386B382B376B1BEC0DF0200EDE6E6FEC56
+:1059D0002BF0C9CF32F1289D0A0EA96F0D0E32654A
+:1059E00014D06FEC2BF0C9CF32F1288DBDC1AFF1CF
+:1059F000BEC1AEF1200EC6EC2AF052EC2BF0C9CF9E
+:105A0000A9F1AFC1BDF1AEC1BEF132C1F1F16FEC90
+:105A10002BF0C9CFF2F16FEC2BF0C9CFF3F132ECE0
+:105A200023F0200EDE6E6FEC2BF0C9CF32F1386B15
+:105A3000382B376B1BEC0DF03A0EDE6E6FEC2BF053
+:105A4000C9CF32F1386B382B376B1BEC0DF026ECDD
+:105A50000EF0190EE8CF7CF0050EE8CF7DF020EEB9
+:105A600060F06FEC2BF0C9CF32F16FEC2BF0C9CFA7
+:105A700033F132C14CF133C14DF1A40E4E6F4F6B77
+:105A80000DEC0CF048C1C6F149C1C7F1C62B000EA0
+:105A9000C7231F8F030E29EC0DF06D0EDE6E200E56
+:105AA000DE6E6FEC2BF0C9CF32F16FEC2BF0C9CF6B
+:105AB00033F132C14CF133C14DF13C0E4E6F4F6B9F
+:105AC000F0EC0BF01F8F386B382B376B375129EC0C
+:105AD0000DF0270EDE6E6FEC2BF0C9CF32F1325194
+:105AE0004827000E492348C14CF149C14DF19F0E92
+:105AF0004E6F4F6B0DEC0CF048C14CF149C14DF1AC
+:105B0000A9514E6F4F6B0DEC0CF048C1C8F149C163
+:105B1000C9F1C82B000EC9231F8F386B382B376B88
+:105B20001BEC0DF0220EDE6E200EDE6E6FEC2BF005
+:105B3000C9CF32F16FEC2BF0C9CF33F1030E386FC0
+:105B40001F8F020E29EC0DF0B00EDE6E430EDE6EDE
+:105B500026EC0EF0320EE8CF7CF0050EE8CF7DF09B
+:105B600020EE60F06FEC2BF0C9CF32F16FEC2BF030
+:105B7000C9CF33F11F8F386B382B376B375129EC76
+:105B80000DF06D0EDE6E620EDE6E610EDE6E720E5A
+:105B9000DE6E200EDE6E010EDE6E6FEC2BF0C9CFD6
+:105BA00032F16FEC2BF0C9CF33F1B6EC0BF01F8F55
+:105BB000325133C132F1336F386B382B376B20ECF5
+:105BC0000DF03A0EDE6E33C132F1386B382B376B85
+:105BD0001BEC0DF01F9F26EC0EF028AD4DD06FECA6
+:105BE0002BF06FEC2BF06FEC2BF06FEC2BF06FECDD
+:105BF0002BF06FEC2BF06FEC2BF06FEC2BF06FECCD
+:105C00002BF06FEC2BF06FEC2BF06FEC2BF06FECBC
+:105C10002BF06FEC2BF06FEC2BF06FEC2BF06FECAC
+:105C20002BF06FEC2BF06FEC2BF0C9CFB1F1B199E9
+:105C3000B19BB19DB19FB12BB1C1EBF16FEC2BF0DA
+:105C4000C9CFB2F1B299B29BB29DB29FB2C1ECF191
+:105C50006FEC2BF0C9CFB3F16FEC2BF0C9CFB4F1DF
+:105C60006FEC2BF0C9CFB5F16FEC2BF0C9CFB6F1CB
+:105C70006FEC2BF06FEC2BF0010EE8CFF4F14B0E34
+:105C8000E8CFF5F1EF0EE8CFF6F1000EE8CFF7F12F
+:105C90009F0EE8CFF8F1CAEC0EF06FEC2BF0B86B6A
+:105CA0006FEC2BF09E0E386F229F050EB96F4B0ED6
+:105CB000DC6FB92933EC0EF0C8C1CAF1C9C1CBF110
+:105CC000CB2B64D822BF24D0C6C14EF1C7C14FF13F
+:105CD00032C14CF133C14DF10DEC0CF04B0E4827A5
+:105CE000A1EC2EF048C1DCF1485142EC0EF0B92B8A
+:105CF000B95133EC0EF0FF0E2BEC10F04CEC0EF023
+:105D0000CA4F02D043D8FCD7CB2FFAD7382FD4D7DD
+:105D100020992191219324992497B86B34EC2FF08A
+:105D200021B179D021B31ED120B151EC3BF020B18B
+:105D3000CCEC40F0209120B96ED020B3EAEF47F0D0
+:105D4000EDD74851DC6301D012004851DC650FD01B
+:105D5000DCC149F14907495142EC0EF0FF0E2BEC32
+:105D600010F075EC0EF048514963F4D7120048C1A9
+:105D700049F14907495142EC0EF0FF0E2BEC10F0AF
+:105D800075EC0EF0DC514963F4D712006FEC2BF088
+:105D9000C9CF32F16FEC2BF0C9CF33F16FEC2BF0A0
+:105DA000C9CFB8F1289BB8BF288BB89FFD0E3263CE
+:105DB00005D0FD0E336302D0228F1200B22F23D004
+:105DC000ECC1B2F128AB11D06FEC2BF0B807000E8C
+:105DD000C9B8020FC9BA010FEF6FEF6701D005D044
+:105DE0006FEC2BF0B807EF2FFBD7040EB86306D08B
+:105DF0006FEC2BF0B8076FEC2BF0B8076FEC2BF0C3
+:105E0000B82FFCD71200B86701D012006FEC2BF04E
+:105E1000B82FFCD712002099B86BAAC1BDF1ABC155
+:105E2000BEF191C1A5F192C1A6F1ACC1C1F1F0C121
+:105E300039F1A8C13AF1C1072593BB07BC6B050E28
+:105E4000BA6FBB2B33EC0FF0E4D425B3EDEF2BF09E
+:105E5000BC6B050EBA6FBB2B33EC0FF0BFC1BDF1AD
+:105E6000C0C1BEF109EF2CF024B9218324B72181F0
+:105E70001200BA2B070EBA6301D0E7D7BC29BA6368
+:105E800002D0060EBA6FB86B2FEC1DF02499219347
+:105E900043D52589BC2B29B50CD027EC2AF0010E5F
+:105EA000E8CF7FF01A0E5DEC0BF0000EE8CF7FF02C
+:105EB0002985140EE8CF7DF0BB51050DF350C15D6F
+:105EC0001E0DF350050FE8CF7CF020EE60F0C1C14D
+:105ED00032F1386B382B376B1BEC0DF0200EDE6E79
+:105EE0006FEC2BF0C9CF32F10D0E326504D06FECA0
+:105EF0002BF0C9CF32F132C1F1F16FEC2BF0C9CFE9
+:105F0000F2F16FEC2BF0C9CFF3F188EC23F06FECDA
+:105F10002BF06FEC2BF0200EDE6E6FEC2BF0C9CF68
+:105F200032F16FEC2BF0C9CF33F11F8F2485030EB4
+:105F300029EC0DF06D0EDE6E200EDE6E6FEC2BF098
+:105F4000C9CF32F16FEC2BF0C9CF33F11F8F386B13
+:105F5000382B376B375129EC0DF0270EDE6E26EC0F
+:105F60000EF01200010EBA6FCFEC27F06FEC28F0A4
+:105F7000E1EC27F020992191219324992497B86B83
+:105F800034EC2FF021B315D021B10DD020B151EC5C
+:105F90003BF020B1CCEC40F0209120B93CD720B3AD
+:105FA000EAEF47F0EDD7BA4F36D7BA4F18D0BA4F0D
+:105FB00007D0BA2B040EBA6302D0010EBA6FD8D73D
+:105FC000BAEC20F0BA6FBA6701D025D733EC0FF0E6
+:105FD0000C0E5DEC0BF088EC16F015EF13F0BAEC3C
+:105FE00020F0BA6FBA6701D016D733EC0FF00C0E61
+:105FF0005DEC0BF0010ED2EC2AF0BDC1A5F1BEC1E3
+:10600000A6F1010EBF27000EC023C0BFBF6BC0BFEB
+:10601000C06BA5C1BDF1A6C1BEF152EC2BF0C86F9B
+:10602000FE0EC86331D0BFC1BDF1C0C1BEF1C851C1
+:106030007BEC2BF0010EBF27000EC023C0BFBF6B4F
+:10604000C0BFC06B010EA527000EA623A6AF06D0C9
+:10605000A56BA66BBFC1BDF1C0C1BEF1FF0E7BEC4D
+:106060002BF0010EC6EC2AF0A5C152F1A6C153F1E6
+:10607000BDC154F1BEC155F1D9EC0BF05067EED75C
+:106080005167ECD7ECEF2BF00DEC2BF0020EC6ECC9
+:106090002AF0BDC1C8F1BEC1C9F1020ED2EC2AF08E
+:1060A000A5C1BDF1A6C1BEF152EC2BF0BFC1BDF13F
+:1060B000C0C1BEF17BEC2BF0A5C1BDF1A6C1BEF104
+:1060C000FF0E7BEC2BF0010EA527000EA623A6AF3A
+:1060D00002D0A56BA66B010EBF27000EC023C0BF68
+:1060E000BF6BC0BFC06BA5C152F1A6C153F1C8C1FF
+:1060F00054F1C9C155F1D9EC0BF05067D1D75167B4
+:10610000CFD7ECEF2BF02D939D9A09EC4AF05EEC83
+:1061100049F06B0EAD6EFAEC0DF00BEC4AF09D8A77
+:10612000D7EF39F028959D9A09EC4AF020EC80F0E1
+:10613000010130EC80F0010118EC80F00101010E4A
+:10614000CC6FCD6B680EAD6EFAEC0DF020850BECCC
+:106150004AF09D8AD7EF39F028939D9A09EC4AF0CE
+:10616000AA6AAAD80BEC4AF09D8AD7EF39F02A9F89
+:106170009D9A09EC4AF0010EAA6E9ED8AA6A0BEC11
+:106180004AF09D8AD7EF39F0279F9D9A09EC4AF093
+:10619000FAEC0DF0010EAD6EFAEC0DF0320EAD6EB4
+:1061A00029EE4AF0100E396FFAEC0DF0DECFADFF9C
+:1061B000392FFAD70BEC4AF09D8AD7EF39F0259B9F
+:1061C0009D9A09EC4AF033EC0FF027EC2AF0010E0F
+:1061D000E8CF7FF00F0E5DEC0BF0000EE8CF7FF004
+:1061E000050E436FAA0EAD6EFAEC0DF0432FFAD7F1
+:1061F000550EAD6E100E5DEC0BF00DEC2BF0010E9C
+:10620000BD27000EBE23110E5DEC0BF055D8FAEC45
+:106210000DF0C2C1ADFFFAEC0DF0C3C1ADFFFAEC59
+:106220000DF0010EAD6EFAEC0DF0320EAD6E120EE9
+:106230005DEC0BF0436B446BC580A0EC2BF0A60E1D
+:10624000C96EA0EC2BF0C5BCF7D7BEC1C9FFA0EC4E
+:106250002BF094EC2BF0BDC1C9FFA0EC2BF094EC1B
+:106260002BF0C582A0EC2BF0A70EC96EA0EC2BF092
+:1062700094EC2BF0130E5DEC0BF0FAEC0DF0C586F0
+:10628000A0EC2BF0C9CFADFF010E4327000E442335
+:1062900044BF04D0C588A0EC2BF0EFD7C584A0EC98
+:1062A0002BF0140E5DEC0BF0FA0EDAEC0CF00BECAC
+:1062B0004AF09D8A67EF39F0436BA96AD1EC0DF083
+:1062C000A8CFADFFA92AFAEC0DF0432FF7D71200A3
+:1062D000010EBA6F219921972099AA6B229D229FC6
+:1062E00033EC0FF027EC2AF0010EE8CF7FF06F0EB1
+:1062F0005DEC0BF0000EE8CF7FF0B86B219121939D
+:10630000140EE8CF7DF0230EE8CF7CF020EE60F095
+:10631000700E56EC0BF0AAC132F1322B1F8F386B86
+:10632000382B376B0AEC0DF0200EDE6E280EDE6E79
+:10633000C00E56EC0BF0200EDE6E210EA4EC0DF01C
+:10634000A8CFD1F1D105040DF350060FA96ED1EC01
+:106350000DF0A8CF32F11F8F386B382B376B0AEC5A
+:106360000DF02F0EDE6ED105040DF350070FA96E50
+:10637000D1EC0DF0A8CF32F11F8F386B382B376B73
+:106380000AEC0DF0290EDE6E26EC0EF0140EE8CFAE
+:106390007DF0410EE8CF7CF020EE60F0610E56EC0F
+:1063A0000BF0AA51240FA96ED1EC0DF0A8CF32F159
+:1063B000336B1F8F030E29EC0DF01F9F420EDE6E14
+:1063C000610EDE6E720EDE6E200EDE6E26EC0EF0BC
+:1063D000140EE8CF7DF05F0EE8CF7CF020EE60F089
+:1063E000BE0E56EC0BF026EC0EF0140EE8CF7DF04E
+:1063F0007D0EE8CF7CF020EE60F0BF0E56EC0BF087
+:1064000026EC0EF0140EE8CF7DF09B0EE8CF7CF06A
+:1064100020EE60F0590E56EC0BF0310EDE6E2E0EB3
+:10642000DE6E300EDE6E300EDE6E26EC0EF00B0EE3
+:106430005DEC0BF0FCEC12F02FEC1DF034EC2FF0C7
+:1064400021B30FD021B11ED020B3EAEF47F020B125
+:1064500051EC3BF020B1CCEC40F0209120B91CD0A5
+:10646000EDD7BA2B020EBA6301D0BA2B070EBA636E
+:1064700002D0010EBA6FB86B2FEC1DF0FCEC12F0DD
+:106480002193DCD7BA4F3ED0BA4F0AD0BA4F08D0CA
+:10649000BA4F1AD0BA4F2CD0020EBA6F69EF13F070
+:1064A000AA51240FA96ED1EC0DF0A8CF32F1322BF6
+:1064B000FB0E326302D0FA0E326F32C1A8FFD5EC68
+:1064C0000DF0030EBA6F19D7AA51240FA96ED1ECA3
+:1064D0000DF0A8CF32F13207FF0E326302D0000E6A
+:1064E000326F32C1A8FFD5EC0DF0040EBA6F05D79C
+:1064F000AA51240FA96E640EA86ED5EC0DF0050EFE
+:10650000BA6FFBD6AA2B030EAA6301D0AA6B010EA9
+:10651000BA6FF3D633EC0FF027EC2AF0010EE8CF78
+:106520007FF0720E5DEC0BF0000EE8CF7FF0230ED3
+:10653000E8CF7CF0000EE8CF7DF0000EE8CF7EF0D3
+:1065400020EE60F0730E56EC0BF0320EA4EC0DF062
+:10655000A8CF32F1330EA4EC0DF0A8CF33F11F8F8A
+:10656000386B382B376B375129EC0DF0200EDE6E6F
+:10657000280EDE6E340EA4EC0DF0A8CF32F1350EED
+:10658000A4EC0DF0A8CF33F11F8F386B382B376B8D
+:10659000375129EC0DF0290EDE6E26EC0EF0410E7F
+:1065A000E8CF7CF020EE60F0750E56EC0BF02F0E6D
+:1065B000A4EC0DF0A8CFF1F1300EA4EC0DF0A8CFB3
+:1065C000F2F1310EA4EC0DF0A8CFF3F132EC23F090
+:1065D00026EC0EF05F0EE8CF7CF020EE60F0760E39
+:1065E00056EC0BF0280EA4EC0DF0A8CF32F1290EDA
+:1065F000A4EC0DF0A8CF33F1010E386F1F8F020EFF
+:1066000029EC0DF01F9F560EDE6E26EC0EF07D0E6F
+:10661000E8CF7CF020EE60F0770E56EC0BF02A0EFF
+:10662000A4EC0DF0A8CFF1F12B0EA4EC0DF0A8CF47
+:10663000F2F12C0EA4EC0DF0A8CFF3F132EC23F024
+:1066400026EC0EF09B0EE8CF7CF020EE60F0780E8A
+:1066500056EC0BF0360EA4EC0DF0A8CF32F1370E4D
+:10666000A4EC0DF0A8CF33F1030E386F1F8F020E8C
+:1066700029EC0DF01F9FB00EDE6E200EDE6E280E90
+:10668000DE6E380EA4EC0DF0A8CFF1F1390EA4ECBB
+:106690000DF0A8CFF2F13A0EA4EC0DF0A8CFF3F173
+:1066A00032EC23F0290EDE6E200EDE6E26EC0EF0AC
+:1066B000B90EE8CF7CF020EE60F0790E56EC0BF0CE
+:1066C0003B0EA4EC0DF0A8CF32F13C0EA4EC0DF083
+:1066D000A8CF33F1030E386F1F8F020E29EC0DF097
+:1066E0001F9FB00EDE6E200EDE6E280EDE6E3D0E9B
+:1066F000A4EC0DF0A8CFF1F13E0EA4EC0DF0A8CF64
+:10670000F2F13F0EA4EC0DF0A8CFF3F132EC23F040
+:10671000290EDE6E200EDE6E26EC0EF081A0FED776
+:1067200024972499219134EC2FF021B10DD020B37E
+:10673000EAEF47F020B151EC3BF020B1CCEC40F057
+:10674000209120B901D0EFD7030EBA6F69EF13F093
+:10675000010EBA6F33EC0FF0B86B209921912193A1
+:1067600027EC2AF0010EE8CF7FF06A0E5DEC0BF00B
+:10677000000EE8CF7FF0AA6BA56B050E096F020E25
+:106780000A6F140EE8CF7DF0040E0A271E0E0927AB
+:106790000951E8CF7CF020EE60F0470EDE6EAAC112
+:1067A00032F1322B1F8F386B382B376B0AEC0DF020
+:1067B0003A0EDE6EF5EC37F026EC0EF0280EE8CF40
+:1067C0007DF00951E8CF7CF020EE60F0210EA96E3B
+:1067D000D1EC0DF0A804AA6302D02A0EDE6EF5EC0F
+:1067E00037F026EC0EF0300EE8CF7DF00951E8CFFF
+:1067F0007CF020EE60F00AC1A9FFA92AD1EC0DF0CF
+:10680000A8CF32F13253000E32651AD0EEEC37F0D9
+:106810000AC1A9FFD1EC0DF0A8CF32F1386B382BAB
+:10682000376B20EC0DF02F0EDE6EA92AD1EC0DF0A7
+:10683000A8CF32F1386B382B376B20EC0DF03FD0FE
+:106840000AC1A9FFD1EC0DF0A8CF32F13253150ED9
+:10685000326517D0640E326108D0E7EC37F0386B40
+:10686000382B376B20EC0DF02AD04F0EDE6E320E37
+:10687000DE6E200EDE6E386B382B376B20EC0DF0A1
+:106880001ED0326352EC34F0410EDE6E490EDE6EE5
+:10689000520EDE6E200EDE6E386B382B376B20EC1E
+:1068A0000DF00DD0450EDE6E520EDE6E520EDE6E17
+:1068B000200EDE6E386B382B376B20EC0DF0F5ECCC
+:1068C00037F026EC0EF0690EE8CF7DF00951E8CFE5
+:1068D0007CF020EE60F0200EDE6E690EDE6E6E0E35
+:1068E000DE6E200EDE6EAA511C0FA96ED1EC0DF0EB
+:1068F000A8CF32F1386B382B376B20EC0DF06D0ED2
+:10690000DE6EF5EC37F026EC0EF0FF0E2BEC10F0FF
+:10691000AA2B050EAA63C1EF33F00B0E5DEC0BF052
+:10692000FCEC12F02FEC1DF034EC2FF021B30FD063
+:1069300021B11ED020B3EAEF47F020B151EC3BF07B
+:1069400020B1CCEC40F0209120B90ED0EDD7BA2B7D
+:10695000070EBA6302D0010EBA6FB86B2FEC1DF0B0
+:10696000FCEC12F02193E0D7020EBA6F18EF13F08F
+:10697000BA4F09D0BA4F0CD0BA4F0FD0BA4F12D07D
+:10698000BA4F15D0F1D7000EAA6F000EA56F14D024
+:10699000010EAA6F040EA56F0FD0020EAA6F080E8B
+:1069A000A56F0AD0030EAA6F0C0EA56F05D0040EBA
+:1069B000AA6F100EA56F00D0010EBA6F299321990E
+:1069C00021972099229D33EC0FF01E0E5DEC0BF009
+:1069D0000B0E5DEC0BF0B86B219121934ADA410E5E
+:1069E000E8CF7CF0140EE8CF7DF020EE60F04F0E83
+:1069F000DE6E320EDE6E3A0EDE6E200EDE6EA551BB
+:106A0000060FA96ED1EC0DF0A8CF32F1386B382B00
+:106A1000376B20EC0DF0250EDE6E200EDE6E280E9C
+:106A2000DE6E4D0EDE6E4F0EDE6E440EDE6E3A0EE4
+:106A3000DE6E120E83EC10F00A0DF3CF4CF1F4CFA2
+:106A40004DF1A551060FA96ED1EC0DF0A8CF4EF176
+:106A50004F6B0DEC0CF00A0E485F48C132F1000E8E
+:106A6000495B49C133F1386B382B376B375129EC0F
+:106A70000DF06D0EDE6E290EDE6E200EDE6E200E27
+:106A8000DE6E26EC0EF05F0EE8CF7CF020EE60F0BC
+:106A9000480EDE6E650EDE6E3A0EDE6E200EDE6E87
+:106AA000A551070FA96ED1EC0DF0A8CF32F1386BCC
+:106AB000382B376B20EC0DF0250EDE6E200EDE6ECF
+:106AC000200EDE6E26EC0EF07D0EE8CF7CF020EE80
+:106AD00060F02B0EDE6E2F0EDE6E2D0EDE6E3A0E89
+:106AE000DE6E200EDE6E2B0E22BD2D0EDE6E26EC2F
+:106AF0000EF09B0EE8CF7CF020EE60F0590E56ECC5
+:106B00000BF0A551040FA96ED1EC0DF0A8CF32F116
+:106B1000386B382B376B20EC0DF02F0EDE6EA55145
+:106B2000050FA96ED1EC0DF0A8CF32F1386B382BE0
+:106B3000376B20EC0DF0200EDE6E200EDE6E26ECA4
+:106B40000EF0FCEC12F02FEC1DF034EC2FF021B322
+:106B50000FD021B11AD020B3EAEF47F020B151ECA9
+:106B60003BF020B1CCEC40F0209120B918D0EDD70B
+:106B7000BA2B070EBA6302D0010EBA6FB86B2FECB6
+:106B80001DF0FCEC12F02193E0D7BA4F90D0BA4F31
+:106B900011D0BA4F43D0BA4F06D0BA4F69D0AAC16C
+:106BA000BAF1BA2BD7D5227D040EBA6F14D7010ED5
+:106BB000BA6F09D7A551060FA96ED1EC0DF0A8CF79
+:106BC00032F122BD07D0322B650E326310D0040E95
+:106BD000326F0DD03207030E326309D0A551070F73
+:106BE000A96ED1EC0DF0640E326FA850325FA55142
+:106BF000070FA96ED1EC0DF0A8503225336F650E4A
+:106C0000336302D0040E326FA551060FA96E32C154
+:106C1000A8FFD5EC0DF0020EBA6FDDD6A551070F17
+:106C2000A96ED1EC0DF0A8CF32F122BD06D0322BE7
+:106C30005C0E326307D0326B05D03207FF0E326331
+:106C400001D0326BA551060FA96ED1EC0DF0A85002
+:106C50003225336F650E336301D03207A551070F1C
+:106C6000A96E32C1A8FFD5EC0DF0030EBA6FB3D6F2
+:106C7000A551040FA96ED1EC0DF0A8CF32F1A551AA
+:106C8000050FA96ED1EC0DF0A8CF33F1A551060F79
+:106C9000A96E32C1A8FFD5EC0DF0A551070FA96E62
+:106CA00033C1A8FFD5EC0DF0050EBA6F94D633ECC6
+:106CB0000FF0010EBA6F6D0E5DEC0BF00B0E5DEC7C
+:106CC0000BF0B86B21912193D4D89ED9410EE8CF17
+:106CD0007CF0140EE8CF7DF020EE60F0690E56ECEB
+:106CE0000BF01B0EA4EC0DF0AAC132F1322BA8322E
+:106CF000322FFDD7D8A004D0600E56EC0BF006D092
+:106D0000200EDE6E200EDE6E200EDE6E26EC0EF005
+:106D10005F0EE8CF7CF0140EE8CF7DF020EE60F03F
+:106D2000580E56EC0BF0200EDE6E210EA96ED1EC43
+:106D30000DF0A804AA6304D0600E56EC0BF006D048
+:106D4000200EDE6E200EDE6E200EDE6E26EC0EF0C5
+:106D50007D0EE8CF7CF0140EE8CF7DF020EE60F0E1
+:106D60006B0E56EC0BF026EC0EF09B0EE8CF7CF091
+:106D7000140EE8CF7DF020EE60F06C0E56EC0BF0B8
+:106D800026EC0EF0FCEC12F02FEC1DF034EC2FF0A2
+:106D900021B30FD021B11AD020B3EAEF47F020B1D0
+:106DA00051EC3BF020B1CCEC40F0209120B9F7D66B
+:106DB000EDD7BA2B070EBA6302D0010EBA6FB86BCB
+:106DC0002FEC1DF0FCEC12F02193E0D7BA4FEFD678
+:106DD000BA4F11D0BA4F05D0BA4F23D0BA4F35D0E1
+:106DE000DED6AAC1A8FFA82A210EA96ED5EC0DF007
+:106DF000030EBA6F66D71B0EA4EC0DF0AAC132F1D8
+:106E0000322B324FA870324FA872324FA874324FD3
+:106E1000A876324FA8781B0EA2EC0DF0020EBA6FC6
+:106E200050D7AA511C0FA96ED1EC0DF0A8CF32F1AA
+:106E3000322B640E326302D0630E326F32C1A8FF70
+:106E4000D5EC0DF0040EBA6F3CD7AA511C0FA96EF9
+:106E5000D1EC0DF0A8CF32F13207FF0E326302D031
+:106E6000000E326F32C1A8FFD5EC0DF0050EBA6FDF
+:106E700028D727EC2AF0010EE8CF7FF0020EE8CFEA
+:106E80007CF0000EE8CF7DF020EE60F05F0E56EC57
+:106E90000BF0AAC132F1322B1F8F386B382B376BB6
+:106EA0000AEC0DF03A0EDE6E200EDE6E26EC0EF0D1
+:106EB000020EE8CF7CF0320EE8CF7DF020EE60F0DD
+:106EC000A551070FA96ED1EC0DF0A8CF32F13253C6
+:106ED000000E32651DD0EEEC37F0A551060FA96EFD
+:106EE000D1EC0DF0A8CF32F1386B382B376B20EC9A
+:106EF0000DF02F0EDE6EA551070FA96ED1EC0DF02F
+:106F0000A8CF32F1386B382B376B20EC0DF041D025
+:106F1000A551060FA96ED1EC0DF0A8CF32F1325376
+:106F2000150E3263326517D0640E326108D0E7EC7B
+:106F300037F0386B382B376B20EC0DF02AD04F0E22
+:106F4000DE6E320EDE6E200EDE6E386B382B376B47
+:106F500020EC0DF01ED032630ED0410EDE6E490ED5
+:106F6000DE6E520EDE6E200EDE6E386B382B376B07
+:106F700020EC0DF00ED0450EDE6E520EDE6E520E7F
+:106F8000DE6E200EDE6E386B382B376B20EC0DF08A
+:106F900000D0200EDE6E690EDE6E6E0EDE6E200EEE
+:106FA000DE6EAA511C0FA96ED1EC0DF0A8CF32F104
+:106FB000386B382B376B20EC0DF06D0EDE6E200E2B
+:106FC000DE6E26EC0EF0000EE8CF7FF012004E0EC3
+:106FD000DE6E580EDE6E200EDE6E1200540EDE6E79
+:106FE000580EDE6E200EDE6E12001B0EA4EC0DF0AD
+:106FF000AAC132F1322BA832322FFDD7FF0ED8A012
+:10700000490E2BEC10F01200A551060FA96ED1EC21
+:107010000DF0A8CF33F1AA511C0FA96ED1EC0DF0E1
+:10702000A8CF32F10A0E322733513203F3CF4CF19D
+:10703000F4CF4DF10A0E4E6F4F6B0DEC0CF048C1C2
+:1070400032F149C133F1370EE8CF7DF0230EE8CF9E
+:107050007CF020EE60F0280EDE6E700EDE6E700E9C
+:10706000DE6E4F0EDE6E320EDE6E3A0EDE6E030EFA
+:1070700029EC0DF0420EDE6E610EDE6E720EDE6EDB
+:10708000290EDE6E200EDE6E26EC0EF0120025BDFF
+:107090001FD0AECF43F1600E435F434F258B434F6C
+:1070A000248B434F258D434F2681434F278F434FDA
+:1070B0002881434F2883434F2885434F2B81434FDB
+:1070C0002A8F434F2D83AE509E9AAB98AB88120007
+:1070D0002CB7F9D709EC4AF0AE6601D0AE2AAE5013
+:1070E000640DF3CFC6F1F4CFC7F1EDD7F292D5BE60
+:1070F00009D02487D58E1200F090D5BE03D0248904
+:10710000D58E1200F294D56AD76AD66AD58E12004F
+:10711000F294D59ED76AD66A1200F19C2A91000E8D
+:10712000D56ED58E1200F18C1200F19A2A93000EC2
+:10713000D56ED58E1200F18A1200A192B19ECA942A
+:1071400012009E9001EC4AF0080ECF60412B080E11
+:10715000CF5E412B0F0E416502D00FEC39F020A914
+:1071600001D0120023BF1200422B010E42630AD04D
+:10717000239D3F6B406B9B6B9C6B05EC19F0F5EC12
+:1071800018F01200020E42630FD0FCEC18F002EC73
+:1071900019F0DDEC17F08D513F278E5140239751A8
+:1071A0009B2798519C231200030E426301D0E5D720
+:1071B000040E426301D0E9D7050E426301D0DDD74A
+:1071C000060E426301D0E1D7070E426301D0D5D746
+:1071D000DCDF426B020E3E6FD89040333F33D890D5
+:1071E0009C339B333E2FF8D740C18EF13FC18DF1C8
+:1071F0009CC198F19BC197F1238D25AD04D0E80E79
+:107200009F6F030EA06F1F979F518D5D8F6FA051D1
+:107210008E59906FD8A812008F6B906B1200416B43
+:107220002081D89420A31CD0A82BA905A86502D042
+:10723000A86B2287172BD8B4182B22A911D0A72B03
+:107240003B0EA76505D0A76B2087A52BD8B4A62B2E
+:107250002AAB06D0DD2B3B0EDD6502D0DD6BDC2BCF
+:10726000032B3B0E03651200036B2085042B3B0EA2
+:1072700004651200046B052B170E05651200056BE3
+:10728000062B07C176F1764F1F0E764F1C0E764FF8
+:107290001F0E764F1E0E764F1F0E764F1E0E764F28
+:1072A0001F0E764F1F0E764F1E0E764F1F0E764F17
+:1072B0001E0E764F1F0E06651200010E066F072B7D
+:1072C0000C0E07651200010E076F082B120044EC2C
+:1072D00048F0326B32C118F5BDEC0FF0A8EC2BF082
+:1072E000E3EC0DF071EC0FF058EC25F0B7EC1CF06E
+:1072F000BCEC23F0A3C100F5A4C101F5A3C102F5C4
+:10730000A4C103F528BF0CD02ABB0AD0F3EC21F0AE
+:1073100029EC22F0C5EC28F023EC20F063EC1FF000
+:1073200028AF03D0670E5DEC0BF02AAB03D0740ED0
+:107330005DEC0BF0B86BB96B209D209F239D956B86
+:10734000966B996B9A6B050EB76F0BEC4AF0FDECE0
+:1073500049F0259D2C97000EE8CF7CF0000EE8CF79
+:107360007DF0000EE8CF7EF0000EE8CF7FF0FF0E3C
+:107370002BEC10F02497249968EC2AF0010ECF6FC3
+:10738000470E3CEC1AF00C0E83EC10F00A6F0AC1A9
+:1073900013F50B0E83EC10F00A6F0AC112F530ECF6
+:1073A00080F00101480E3CEC1AF0FCEC12F020A138
+:1073B0001BD029A101D000D0B7EC1CF08FEC3AF023
+:1073C00051EC3BF070EC45F091EC22F019EC3BF005
+:1073D00062EC3AF077EC12F023EC20F063EC1FF053
+:1073E0002CB142EF45F0209132EC3BF023BD62EC32
+:1073F00022F023BD78EC1EF023BDCCEC40F0239DA1
+:1074000020B52BEC3AF020BF15EF13F020B35DEF61
+:107410003BF020B985EF44F025BBDFEF30F024BB13
+:10742000ECEF46F026B1ABEF0DF02BB1A6EF0DF06F
+:1074300027BFC4EF30F028B142EF47F028B3ACEFDC
+:1074400030F028B592EF30F02ABFB7EF30F02DB30F
+:1074500083EF30F0ACD7BCEC23F066EC3AF095EC5F
+:1074600046F068EC2AF052EC3AF028BF09D02ABB6B
+:1074700007D029EC22F0F3EC21F020ADC5EC28F088
+:1074800044EC3AF0209512002781010ECC5F000EEB
+:10749000CD5BCC671200CD67120027910FEC4AF04C
+:1074A000CC2B120020C532F121C533F1326705D053
+:1074B000336703D0196B1A6B1200010E1927000EE7
+:1074C0001A23120027B111EC4AF0120005EC4AF021
+:1074D000490E3CEC1AF09FC102F5A0C103F50A6BFE
+:1074E0000AC111F54F0E0A6F0AC110F58DC100F5E2
+:1074F0008EC101F50B0E83EC10F00A6F0AC112F574
+:107500000C0E83EC10F00A6F0AC113F540EC80F00A
+:1075100001014A0E3CEC1AF007EC4AF0120094927A
+:107520008282249182A42481829294820A0EAEECFB
+:107530000CF0249382A424839492829224B174D078
+:1075400024B364D0948229A944D0299F2999320E6A
+:10755000A4EC0DF0A8CF39F1330EA4EC0DF0A8CFB8
+:107560003AF1D890010E3927000E3A2339C1A8FF0D
+:10757000320EA2EC0DF03AC1A8FF330EA2EC0DF0D2
+:10758000340EA4EC0DF0A8CF39F1350EA4EC0DF0BB
+:10759000A8CF3AF1D890010E3927000E3A2339C10D
+:1075A000A8FF340EA2EC0DF03AC1A8FF350EA2ECF4
+:1075B0000DF007C1A8FF2F0EA2EC0DF006C1A8FF29
+:1075C000300EA2EC0DF008C1A8FF310EA2EC0DF0B8
+:1075D000120029AF1200299F320EA4EC0DF0A8CFA3
+:1075E00039F1330EA4EC0DF0A8CF3AF1D890010E8A
+:1075F0003927000E3A2339C1A8FF320EA2EC0DF054
+:107600003AC1A8FF330EA2EC0DF01200FFEC49F0D6
+:10761000640EDAEC0CF001EC4AF0640EDAEC0CF0DB
+:10762000FFEC49F029891200FFEC49F0298F2999D4
+:10763000120020AD1200B92B040E83EC10F0B965D6
+:107640001200209D25EC2AF028BF04D02ABB02D0CE
+:10765000C5EC28F062EC22F058EC25F0B96B2497C9
+:107660002499120024B718D024B907D0D59EF294DB
+:10767000D76AD66AF292F0901200249927EC2AF089
+:10768000010EE8CF7FF0040E5DEC0BF0000EE8CFAA
+:107690007FF0208DB86B1200249720AD1200208F50
+:1076A0001200B82B030E83EC10F0050FD8B0FF0EBC
+:1076B000E806B86512002089120017EC41F0520E5E
+:1076C0003CEC1AF033EC0FF038EC1BF013EC1FF02D
+:1076D000A7EC1EF02ABB208728BF04D02ABB02D00B
+:1076E0005EEC1BF020A145D028BF09D02ABB17D0E3
+:1076F00029B118D06EEC3EF038EC3CF01ED020AD35
+:1077000016EC24F062EC40F02CB3F3EC24F024BF30
+:1077100004D0248FF2EC40F010D0249F0ED0E5EC82
+:107720003BF00BD0230EA4EC0DF0010EA86200D0AC
+:107730009EEC29F038EC3CF000D062EC40F023B72E
+:1077400091EC22F020BDDBEC3BF020BF39EC44F0A3
+:1077500015EC3CF02CB142EF45F02CB3F3EC24F0E7
+:107760002091260E83EC10F0326F010E326301D0AF
+:10777000268326A30BD020BD08D016EC24F029B117
+:107780009EEC29F027B56EEC3EF0269320AFD0ECAE
+:1077900041F020BF15EC42F020A32ED323BD7FEC97
+:1077A00040F0239D20B59EEC40F022B753EC3DF015
+:1077B0000300000097D7B92B040E83EC10F0B965D5
+:1077C0001200209DDBEC23F0120089EC24F022B99A
+:1077D0000DD047EC24F0E22B3C0EE26302D0E26BCA
+:1077E000E12B269722B912002687120026A7120045
+:1077F0000BD877EC24F0E06BE26BE16BDD6BDC6BBC
+:10780000916B926B26971200DEC152F1DFC153F1EA
+:1078100091C154F192C155F1D9EC0BF01FA71200A0
+:1078200091C1DEF192C1DFF11200FDEC49F032C5E9
+:1078300032F10E0E83EC10F0326132EC3CF027BBDB
+:10784000FBEC49F01FC532F1322D120066C532F152
+:107850000E0E83EC10F0326132EC3CF027BBFBECF7
+:1078600049F01200FBEC49F0020EB06F288B1200B9
+:1078700024BFCDD0248FF2EC40F039EC3EF08DC126
+:107880004CF18EC14DF10A0E4E6F000E4F6B0DEC98
+:107890000CF048C14CF149C14DF1D0C14EF14F6BD4
+:1078A000F0EC0BF048C14CF149C14DF1640E4E6F44
+:1078B000000E4F6B0DEC0CF048C107F529B118C54F
+:1078C00007F528EC80F0010165C532F11B0E83EC51
+:1078D00010F0325DD8B039EC2AF025A18DD08FC1DF
+:1078E0004CF190C14DF1640E4E6F4F6B0DEC0CF0EE
+:1078F000326B1B0EA4EC0DF0A8A00AD01C0EA4EC59
+:107900000DF04851A86004D0A8CF32F1010E336FBA
+:107910001B0EA4EC0DF0A8A210D01D0EA4EC0DF0CF
+:107920004851A8600AD01D0EA4EC0DF03251A86495
+:1079300004D0A8CF32F1020E336F1B0EA4EC0DF071
+:10794000A8A410D01E0EA4EC0DF04851A8600AD0D7
+:107950001E0EA4EC0DF03251A86404D0A8CF32F171
+:10796000030E336F1B0EA4EC0DF0A8A610D01F0E53
+:10797000A4EC0DF04851A8600AD01F0EA4EC0DF045
+:107980003251A86404D0A8CF32F1040E336F1B0E1D
+:10799000A4EC0DF0A8A810D0200EA4EC0DF04851D6
+:1079A000A8600AD0200EA4EC0DF03251A86404D0D7
+:1079B000A8CF32F1050E336F450E3CEC1AF03307B9
+:1079C00032C11BF53351040DF350070FA96ED1ECF2
+:1079D0000DF0A8CF1DF53351040DF350060FA96E1D
+:1079E000D1EC0DF01DC50AF1D880640E0A55D8807F
+:1079F000A856A8CF1CF50AD0460E3CEC1AF0326B04
+:107A000032C11BF532C11CF532C11DF51200249F95
+:107A100028BF12002ABB1200420E3CEC1AF029ECDF
+:107A20003DF000EC80F00101430E3CEC1AF023C560
+:107A3000CEF1CE6712002BC50AF10A6729D025B115
+:107A40005EEC1BF02591AA6B22C5ABF173EC1BF029
+:107A500012008DC100F58EC101F50B0E83EC10F004
+:107A60000A6F0AC112F50C0E83EC10F00A6F0AC1FE
+:107A700013F5100E83EC10F00A6F0AC117F51D0EF6
+:107A800083EC10F00A6F0AC11EF544EC48F01200B6
+:107A900025A198EC1BF025812BC5AAF124C5ABF1DB
+:107AA000A3EC1BF012002297268307EC4AF022BBBE
+:107AB00008D0228BBDC1BFF1BEC1C0F12F0EC6ECF4
+:107AC0002AF08F51DEEC2AF09051DEEC2AF0AE6BFA
+:107AD000B12D02D0020EAE27B22D02D0020EAE277B
+:107AE000B32D02D0020EAE27B42D02D0030EAE2766
+:107AF000B52D02D0090EAE27B62D02D0000EAE274E
+:107B000028AB11D0010EAE27AF6BB051AF27B06BD1
+:107B100028A703D0020EAE27AF8928A903D0010EF3
+:107B2000AE27AF8BAE8FAE51DEEC2AF028AB16D06D
+:107B3000AF51DEEC2AF028A70CD0180EA4EC0DF003
+:107B4000A850DEEC2AF0190EA4EC0DF0A850DEECE3
+:107B50002AF028A903D0D151DEEC2AF0289B2897DF
+:107B60002899B12F01D07AD8B22F01D06CD8B32F79
+:107B700001D05ED8B42F01D04DD8B52F01D018D880
+:107B8000B62F01D010D8B1BFB16BB2BFB26BB3BFCB
+:107B9000B36BB4BFB46BB5BFB56BB6BFB66B440EB9
+:107BA0003CEC1AF012001A0E83EC10F0B66F1200C3
+:107BB00031C9B5F1B551DEEC2AF030C9B5F1B55196
+:107BC000DEEC2AF033C9B5F1B551DEEC2AF032C94A
+:107BD000B5F1B551DEEC2AF035C9B5F1B551DEECA1
+:107BE0002AF034C9B5F1B551DEEC2AF037C9B5F148
+:107BF000B551DEEC2AF036C9B5F1B551DEEC2AF00C
+:107C000038C9B5F1B551DEEC2AF0190E83EC10F04D
+:107C1000B56F1200000EDEEC2AF0000EDEEC2AF04A
+:107C2000000EDEEC2AF0180E83EC10F0B46F120098
+:107C3000000EDEEC2AF0000EDEEC2AF0170E83ECCC
+:107C400010F0B36F1200AA51DEEC2AF0AB51DEEC5B
+:107C50002AF0160E83EC10F0B26F12009751DEEC92
+:107C60002AF09851DEEC2AF0150E83EC10F0B16F7B
+:107C7000120020A32DD08DC152F18EC153F195C1B8
+:107C800054F196C155F18DC195F18EC196F1D9ECA3
+:107C90000BF050C14CF151C14DF1270E4E6F4F6B9F
+:107CA000F0EC0BF048C145F149C146F1070E476FB2
+:107CB000C3EC0BF0630E456501D0456F050E83ECF8
+:107CC00010F0455DD8A004D0218B6CEC1CF01200A4
+:107CD00021AB1200219B91EC1CF0120029B1120083
+:107CE0008DC14CF18EC14DF10A0E4E6F4F6B0DECF4
+:107CF0000CF048C14CF149C14DF1D0C14EF14F6B70
+:107D0000F0EC0BF048C154F149C155F1130E83EC6E
+:107D100010F0640DF3CF52F1F4CF53F1D9EC0BF026
+:107D200027951FB72785279B48C154F149C155F1B5
+:107D3000120E83EC10F0640DF3CF52F1F4CF53F137
+:107D4000D9EC0BF01FA704D0278B050EB06F288B42
+:107D500048C154F149C155F1110E83EC10F0640D86
+:107D6000F3CF52F1F4CF53F1D9EC0BF01FB705D09C
+:107D7000278B2785040EB06F288B27B506D027A345
+:107D800007D0FFEC1EF0279303D0D6EC1EF027831C
+:107D9000120020C54CF121C54DF14C6707D04D674D
+:107DA00005D0010ECC6FCD6B279112004CC104F5AC
+:107DB0004DC105F50D0E83EC10F04E6F4EC106F56A
+:107DC0004B0E3CEC1AF01CEC80F001014C0E3CEC2C
+:107DD0001AF004C54CF105C54DF14C6707D04D674D
+:107DE00005D0010ECC6FCD6B279112004CC1CCF1A8
+:107DF0004DC1CDF12781120020A758EF40F02ABBDA
+:107E000003DDA3C100F5A4C101F50C0E83EC10F055
+:107E10000A6F0AC113F5470E3CEC1AF030EC80F003
+:107E20000101B7DF480E3CEC1AF0FD0EDEEC2AF043
+:107E3000FD0EDEEC2AF0FE0EDEEC2AF0BFC1BDF135
+:107E4000C0C1BEF1FA0EDEEC2AF0FA0EDEEC2AF02A
+:107E5000200EDEEC2AF00751DEEC2AF00651DEECB3
+:107E60002AF00851DEEC2AF00551DEEC2AF004512C
+:107E7000DEEC2AF02AAB11D0DEC132F1DFC133F1E2
+:107E8000A6EC2AF032C1DEF133C1DFF1DE51DEECC7
+:107E90002AF0DF51DEEC2AF010D091C132F192C10C
+:107EA00033F1A6EC2AF032C191F133C192F1915134
+:107EB000DEEC2AF09251DEEC2AF0A551DEEC2AF03D
+:107EC000A651DEEC2AF0A751DEEC2AF0AC51DEEC34
+:107ED0002AF0AD51DEEC2AF0A351DEEC2AF0A451D9
+:107EE000DEEC2AF020C532F121C533F13251DEEC4F
+:107EF0002AF03351DEEC2AF0060EA4EC0DF0A85067
+:107F0000DEEC2AF0070EA4EC0DF0A850DEEC2AF00F
+:107F10000A0EA4EC0DF0A850DEEC2AF00B0EA4EC37
+:107F20000DF0A850DEEC2AF00E0EA4EC0DF0A850D7
+:107F3000DEEC2AF00F0EA4EC0DF0A850DEEC2AF0D7
+:107F4000120EA4EC0DF0A850DEEC2AF0130EA4ECF7
+:107F50000DF0A850DEEC2AF0160EA4EC0DF0A8509F
+:107F6000DEEC2AF0170EA4EC0DF0A850DEEC2AF09F
+:107F7000180EA4EC0DF0A850DEEC2AF0190EA4ECBB
+:107F80000DF0A850DEEC2AF0210EA4EC0DF0A85064
+:107F9000DEEC2AF0010EDEEC2AF0320EDEEC2AF0E6
+:107FA000C251DEEC2AF0C351DEEC2AF0140E83EC51
+:107FB00010F02ABB010EDEEC2AF0020E396F393BBD
+:107FC000150E83EC10F03925DEEC2AF0020E396F25
+:107FD000393B160E83EC10F03925DEEC2AF0020E48
+:107FE000396F393B170E83EC10F03925DEEC2AF09F
+:107FF000030E396F393B180E83EC10F03925DEEC97
+:108000002AF0090E396F393B190E83EC10F039252F
+:10801000DEEC2AF0000E396F393B1A0E83EC10F0BB
+:108020003925DEEC2AF01A0EA4EC0DF0A850DEEC97
+:108030002AF0000EDEEC2AF0FB0EDEEC2AF0FB0E3E
+:10804000DEEC2AF0020EA4EC0DF0A8CF39F1030EFD
+:10805000A4EC0DF0A8CF3AF1D890010E3927000E0C
+:108060003A2339C1A8FF020EA2EC0DF03AC1A8FFD5
+:10807000030EA2EC0DF01C0E97EC10F0326703D04B
+:10808000336701D012D0010E3227000E3323700E59
+:10809000820FA96E32C1A8FFD5EC0DF0700E830FD0
+:1080A000A96E33C1A8FFD5EC0DF0259D0BEC4AF06D
+:1080B0002DB169EC49F060EC80F00101196B1A6B8D
+:1080C00067EF39F020A712002ABB0CD02093B72B02
+:1080D000020E83EC10F0020FD8B0FF0EE806B76571
+:1080E00020831200B72B3C0EB7631200B76B2093AE
+:1080F000E02B1E0E83EC10F0E06320831200CCEC2A
+:1081000040F020B3A8EC40F020B3BBEC40F0219D40
+:1081100097519963218D98519A63218D21BDA7ECC8
+:108120001EF0219F8D519563218F8E519663218F73
+:1081300025BD218F21BF3CEC21F0120070EC45F0F1
+:10814000E2EC40F0EDEC23F095EC46F020951200C7
+:1081500091C152F192C153F18FC154F190C155F1C7
+:10816000D9EC0BF01FA712008FC191F190C192F1D1
+:10817000EDEC23F01200ACC152F1ADC153F197C147
+:1081800054F198C155F1D9EC0BF01FB7120097C10B
+:10819000ACF198C1ADF112002299000E83EC10F001
+:1081A000526F536B8FC154F190C155F1D9EC0BF064
+:1081B0001FA705D020B7B76B20832289120020A704
+:1081C0002093120023B709D00C0EC36501D0120012
+:1081D000070EB06F288B238712000D0EC365F8D7EA
+:1081E000239712008FC115F190C116F11551112777
+:1081F00016511223000E1323142315511127165163
+:108200001223000E1323142317C14EF118C14FF18E
+:1082100011C148F112C149F113C14AF114C14BF126
+:1082200034EC0CF048C193F149C194F11200510EA5
+:108230003CEC1AF0916B926B936B946BF4EC0FF037
+:108240005A0EA4EC0DF0000EA864BDEC0FF0116BFB
+:10825000126B136B146B010E176F186B010EDE6F30
+:10826000DF6BE16BE26BDC6BDD6BA56BA66BA76B69
+:10827000A86BE06BB76BB86BB06B289B2B9BD2697C
+:10828000E86B25910DEC2BF0A4C103F5A3C102F519
+:1082900097C1ACF198C1ADF10A6B0AC14EF20AC1A7
+:1082A0004FF202EE50F0200E0A6FEE6A0A2FFDD751
+:1082B00002EE70F0200E0A6F010EEE6E0A2FFCD750
+:1082C00002EE90F0EE6AEE6A200E83EC10F0A8CF7A
+:1082D00015F5210E83EC10F0A8CF14F52D9B2C83FF
+:1082E000290E83EC10F0326F010E32632C93140EC2
+:1082F00083EC10F0A96F150E83EC10F0B16F160E21
+:1083000083EC10F0B26F170E83EC10F0B36F180E01
+:1083100083EC10F0B46F190E83EC10F0B56F1A0EE9
+:1083200083EC10F0B66F2AAB02D0010EA96F240EB9
+:10833000A4EC0DF029B1A8CF18F50FEC4AF0239763
+:10834000229B209D2097268325ADF2EC0DF0210E77
+:10835000A4EC0DF0A8CFD1F1D105040DF350070F17
+:10836000A96ED1EC0DF0A8CF11F5D105040DF35095
+:10837000060FA96ED1EC0DF0A8CFD0F111C50AF10E
+:10838000D880640E0A55D880A856A8CF10F5326B55
+:1083900032C11BF532C11CF532C11DF52B951200FF
+:1083A00024B718D024A91200249724992A99208D43
+:1083B000209FB96B2ABB0AD0010EE8CF7FF0040ED4
+:1083C0005DEC0BF0000EE8CF7FF012008D0E5DEC3F
+:1083D0000BF012002497249920AD14D02AAB03D0BF
+:1083E0002093209D1200208F209DCFEC27F09BEC46
+:1083F00025F02C992B9F010EBA6FE1EC27F0249900
+:10840000249712002CB7ABD005EC4AF0060EB06FE3
+:10841000288B2CA31200116B126B136B146B020EC2
+:10842000176F186BF2EC40F0120024B715D024A996
+:1084300012002DB9FFD026B91CD126BDF3D0249946
+:10844000B96BBA2B060E2BBD040EBA6302D0010E17
+:10845000BA6FE1EC27F0120024972499208F209D19
+:10846000B96B2DB9E7D026BBB0D126B902D126BD54
+:10847000D9D026B500D12CB9BEEF42F02BBF0BD01E
+:10848000BA4FDAD0BA4F8AD1BA4F53D0BA4F45D08B
+:10849000BA4F05D21200BA4FBCD0BA4F17D0BA4F5C
+:1084A000C3D0BA4F03D0BA4FFAD112002C732CA309
+:1084B0000AD0116B126B136B146B020E176F186BD3
+:1084C000F2EC40F0ECD1E1EC24F0E9D15A0EA4EC4E
+:1084D0000DF0A86608D0F4EC0FF0010EA86E5A0E4D
+:1084E000A2EC0DF007D0BDEC0FF0000EA86E5A0EF6
+:1084F000A2EC0DF013EC1FF0A7EC1EF03CEC21F009
+:10850000EDEC23F02ABBCBD128BFC9D125B198EC23
+:108510001BF025A15EEC1BF0C2D1CFEC27F0B9EC2B
+:1085200025F0010EBA6F2B8FE1EC27F024992497E8
+:10853000120029B126D12685CFEC27F0D0C1A8FFA3
+:10854000180EA2EC0DF011C5A8FF190EA2EC0DF04B
+:10855000CCEC25F0010EBA6FE1EC27F01200208F71
+:10856000209D249924972C89CFEC27F007EC26F046
+:108570002B9F010EBA6FE1EC27F01200BA4F8FD19A
+:10858000BA4F39D0BA4F3ED0BA4F2ED0BA4F25D0BD
+:1085900086D107EC26F0980E526F3A0E536FC6C183
+:1085A00054F1C7C155F1D9EC0BF01FA705D0980EB7
+:1085B000C66F3A0EC76F1200E80E526F030E536F6C
+:1085C000C6C154F1C7C155F1D9EC0BF01FB7120069
+:1085D000E80EC66F030EC76F1200E80EC65F030EEB
+:1085E000C75B050EBA6FD5D7E80EC627030EC723A3
+:1085F000040EBA6FCED7640EC627000EC723020E34
+:10860000BA6FC7D7640EC65F000EC75B030EBA6FA2
+:10861000C0D7268DCFEC27F030EC80F00101C2EC02
+:1086200028F01200269D3BD12D89CFEC27F0CDEC10
+:1086300029F012002D9933D12689220EA4EC0DF0D9
+:10864000030EA8640DD00CD02B8533EC0FF0A4ECF6
+:108650002AF023C5CEF1CE671200A5EC2AF0120055
+:10866000CFEC27F023C5CEF1CE6712004FEC26F0F9
+:108670001200269914D1BA4F6FD0BA4F4ED0BA4FCC
+:1086800038D0BA4F17D0BA4F01D01200190EA4EC4F
+:108690000DF0A8CF32F13207FF0E326301D0322B3A
+:1086A00032C1A8FF190EA2EC0DF0CCEC25F0050E9E
+:1086B000BA6F1200190EA4EC0DF0A8CF32F1322BD4
+:1086C000650E326302D0040E326F180EA4EC0DF06A
+:1086D000A8503225336F650E336301D0320732C1A3
+:1086E000A8FF190EA2EC0DF0CCEC25F0040EBA6F29
+:1086F0001200180EA4EC0DF0A8CF32F13207030ED1
+:10870000326301D0322B32C1A8FF180EA2EC0DF05B
+:10871000CCEC25F0030EBA6F1200180EA4EC0DF08D
+:10872000A8CF32F1322B650E326302D0050E326FC4
+:10873000190EA4EC0DF0A8503225336F650E33638B
+:1087400001D0320732C1A8FF180EA2EC0DF0CCEC1C
+:1087500025F0020EBA6F1200190EA4EC0DF0A8CF8E
+:1087600011F5180EA4EC0DF0A8CFD0F111C50AF147
+:10877000D880640E0A55A856A8CF10F52887288BF4
+:108780008ED0268BCFEC27F029912A8949EC27F04F
+:108790002981010EBA6FE1EC27F0120029B10AD04D
+:1087A000268BCFEC27F049EC27F0010EBA6FE1ECF5
+:1087B00027F012002B8D268BCFEC27F09AEC27F0B8
+:1087C000010EBA6FE1EC27F012002AB92FD029A1CF
+:1087D0002DD0230EBA25A96ED1EC0DF0A8CF18F537
+:1087E0002B9D210EA4EC0DF0A8CFD1F1D105040DE5
+:1087F000F350070FA96ED1EC0DF0A8CF11F5D105FC
+:10880000040DF350060FA96ED1EC0DF0A8CFD0F1F6
+:1088100011C50AF1D880640E0A55D880A856A8CF91
+:1088200010F50AEC1FF02889288B39D0326B32C141
+:1088300018F5269BBAC1D1F1BA05040DF350070F04
+:10884000A96ED1EC0DF0A8CF11F5BA05040DF350C7
+:10885000060FA96ED1EC0DF0A8CFD0F111C50AF129
+:10886000D880640E0A55A856A8CF10F52889288B01
+:1088700016D020AF12002DB945D02CB93ED026A974
+:1088800008D02BB531D023C5CEF1CE6702D04FEC46
+:1088900026F0B92B0A0E83EC10F0B96512002BA557
+:1088A0000DD02B9533EC0FF0A7EC1EF0EDEC23F080
+:1088B00025B198EC1BF025A15EEC1BF02B95209FB9
+:1088C000209D13EC1FF0CFEC27F038EC1BF016ECDA
+:1088D00024F0B96B26992D99269B269D26952B9DD4
+:1088E0002C99249724991200A4EC2AF023C5CEF1E8
+:1088F000CE67CFD7A5EC2AF0CCD707EC26F0E1EC79
+:1089000027F0C7D7CDEC29F0C4D729EE4AF0100ED6
+:10891000396FDE660DD0392FFCD733EC0FF0010E26
+:108920005DEC0BF0020E5DEC0BF070EC80F00101E1
+:1089300081EC0EF0F2EC0DF0A56BA66B939C939E70
+:10894000819C819E20B509D820B14FD820A9EAEF9B
+:1089500047F0000003000000F5D770EC45F02CB1A3
+:1089600042EF45F052EC3AF044EC3AF0A62B0E0EF2
+:10897000A66526D072D895EC46F01AEC80F001017D
+:10898000A1C1A3F1A2C1A4F18DC1A1F18EC1A2F137
+:10899000A66B070E97EC10F032C152F133C153F1C0
+:1089A000A1C154F1A2C155F1D9EC0BF01FB701D010
+:1089B00007D0070E97EC10F032C1A1F133C1A2F13C
+:1089C0008DC100F58EC101F50B0E83EC10F00A6F1E
+:1089D0000AC112F50C0E83EC10F00A6F0AC113F5F0
+:1089E00040EC80F00101209512008FEC3AF027A1B5
+:1089F00005D00DEC4AF00000030000000FEC4AF037
+:108A0000A52B050EA56512D028D8060E97EC10F000
+:108A100032C152F133C153F18DC154F18EC155F1C0
+:108A2000D9EC0BF020891FB72099A56B209124B7B2
+:108A30000AD024B908D0F292F0902A932A9124996E
+:108A40002497D59E1200F292F0902A932A912499AD
+:108A50002497D59E20992787120002EC19F0030075
+:108A6000000003000000030005EC19F0F5EC18F01D
+:108A700003000000030000000300FCEC18F0DDEC34
+:108A800017F01200F26AF16AF06AC290F2EC0DF08F
+:108A9000100E926E806A936A816A1D0E946E826ACD
+:108AA000956A836A966A846AD56ACD6ACA6A9B6A3D
+:108AB000020ED36ED180EAC137F10F0E396F030079
+:108AC0000000392FFCD7FBEC49F00400050EAEEC9A
+:108AD0000CF0FDEC49F003000000372FF4D7EBD782
+:108AE000C2800000C282C2B2FED7C4CF4DF1C3CF54
+:108AF0004CF1C60E4E6F030E4F6FF0EC0BF0640E90
+:108B00004E6F4F6B34EC0CF048C1C2F149C1C3F158
+:108B1000C290C2C154F1C3C155F1280E526F0A0E62
+:108B2000536FD9EC0BF02C911FB703D0020EEA6FF4
+:108B30002C818DC154F18EC155F1990E526F3A0EB0
+:108B4000536FD9EC0BF02C911FA703D0030EEA6FE3
+:108B50002C81299B299D280EA4EC0DF0A8CF54F15F
+:108B6000290EA4EC0DF0A8CF55F1D00E526F070ED0
+:108B7000536FD9EC0BF01FA7298B940E526F110E77
+:108B8000536FD9EC0BF01FA7298D29AB73D029ADFA
+:108B900071D0680EA86E280EA2EC0DF0100EA86E13
+:108BA000290EA2EC0DF007C1A8FF2A0EA2EC0DF0D1
+:108BB00006C1A8FF2B0EA2EC0DF008C1A8FF2C0ED9
+:108BC000A2EC0DF097C1A8FF2D0EA2EC0DF098C1FC
+:108BD000A8FF2E0EA2EC0DF0A86A2F0EA2EC0DF04D
+:108BE000A86A300EA2EC0DF0A86A310EA2EC0DF0CE
+:108BF000A86A320EA2EC0DF0A86A330EA2EC0DF0BA
+:108C0000A86A340EA2EC0DF0A86A350EA2EC0DF0A5
+:108C100097C1A8FF360EA2EC0DF098C1A8FF370E41
+:108C2000A2EC0DF007C1A8FF380EA2EC0DF006C1B2
+:108C3000A8FF390EA2EC0DF008C1A8FF3A0EA2EC75
+:108C40000DF097C1A8FF3B0EA2EC0DF098C1A8FF54
+:108C50003C0EA2EC0DF007C1A8FF3D0EA2EC0DF0FA
+:108C600006C1A8FF3E0EA2EC0DF008C1A8FF3F0E02
+:108C7000A2EC0DF0280EA4EC0DF0A8CF54F1290EB3
+:108C8000A4EC0DF0A8CF55F1C2C152F1C3C153F10C
+:108C9000D9EC0BF01FA71200C2C1A8FF280EA2EC4E
+:108CA0000DF0C3C1A8FF290EA2EC0DF007C1A8FF6B
+:108CB0002A0EA2EC0DF006C1A8FF2B0EA2EC0DF0BF
+:108CC00008C1A8FF2C0EA2EC0DF097C1A8FF2D0E35
+:108CD000A2EC0DF098C1A8FF2E0EA2EC0DF0120030
+:108CE000800ECF6ECE6A3C0E036111D03C0E046143
+:108CF0000ED0180E05610BD0200E066108D00C0EA8
+:108D0000076105D0640E086102D09D801200000E3C
+:108D1000036F000E046F0C0E056F020E066F080E37
+:108D2000076F090E086F9D801200360EA4EC0DF03F
+:108D3000A8CF54F1370EA4EC0DF0A8CF55F197C190
+:108D400052F198C153F1D9EC0BF01FA719D097C17C
+:108D5000A8FF360EA2EC0DF098C1A8FF370EA2ECCA
+:108D60000DF007C1A8FF380EA2EC0DF006C1A8FF58
+:108D7000390EA2EC0DF008C1A8FF3A0EA2EC0DF0DE
+:108D80003B0EA4EC0DF0A8CF54F13C0EA4EC0DF07A
+:108D9000A8CF55F197C152F198C153F1D9EC0BF01E
+:108DA0001FB7120097C1A8FF3B0EA2EC0DF098C1AF
+:108DB000A8FF3C0EA2EC0DF007C1A8FF3D0EA2ECEF
+:108DC0000DF006C1A8FF3E0EA2EC0DF008C1A8FFF1
+:108DD0003F0EA2EC0DF01200249B9D9A09EC4AF084
+:108DE0009E9A620EAD6EFAEC0DF000EC0EF0AECF76
+:108DF00005F1180E0561056B00EC0EF0AECF04F125
+:108E00003C0E0461046B00EC0EF0AECF03F13C0E9F
+:108E10000361036B00EC0EF0AECF07F10C0E07659B
+:108E200001D0076F00EC0EF0AECF06F107C132F1B2
+:108E3000324F1F0E324F1C0E324F1F0E324F1E0E7E
+:108E4000324F1F0E324F1E0E324F1F0E324F1F0E6B
+:108E5000324F1E0E324F1F0E324F1E0E324F1F0E5C
+:108E6000066502D0010E066F00EC0EF0AECF08F1E1
+:108E7000640E0861086B0BEC4AF09E9A20859D8A6F
+:108E8000D7EF39F028919D9A09EC4AF09E9A660E28
+:108E9000AD6EFAEC0DF000EC0EF0AECF32F100EC5E
+:108EA0000EF0AECF33F1596BFA0EDAEC0CF0FA0E8D
+:108EB000DAEC0CF0FA0EDAEC0CF0FA0EDAEC0CF05C
+:108EC00032C152F133C153F197C154F198C155F1F8
+:108ED000D9EC0BF050511FB7000E506F50C1ADFFD1
+:108EE00050C1A8FF50C159F1010EAA6E000EA96E23
+:108EF000D5EC0DF0000EAA6E0BEC4AF09E9A9D8AFE
+:108F0000D7EF39F00101ABEC48F020B36DEC1AF06B
+:108F1000FC6A01EE09F0EE6A0A0EEA62FCD7F2EC96
+:108F20000DF070EC46F00BEC19F0239D23ADFED74D
+:108F30008F6B906B196B1A6B20892DEC45F0209983
+:108F40008DC19FF18EC1A0F18DC1A1F18EC1A2F1A1
+:108F50008DC1A3F18EC1A4F1CC2B0A6B0AC111F50E
+:108F60004F0E0A6F0AC110F58DC100F58EC101F5D3
+:108F700020EC80F0010130EC80F0010118EC80F071
+:108F8000010166EC3AF0010140EC80F00101010EB4
+:108F9000A96E010EAA6ED1EC0DF0A8CF39F1A92A65
+:108FA000D1EC0DF0A8CF3AF1AA6A010E396304D0D2
+:108FB000320E3A6301D00ED0010EA96E010EAA6ED8
+:108FC000010EA86ED5EC0DF0A92A320EA86ED5ECD4
+:108FD0000DF0AA6A01EC4AF00FEC4AF071EC0FF0C8
+:108FE000000EE8CF7CF0000EE8CF7DF0000EE8CF59
+:108FF0007EF0000EE8CF7FF0FF0E2E6F2EC17AF0CC
+:10900000FF0E2E6F2EC17BF0A8EC2BF0A3C19FF1B9
+:10901000A4C1A0F1AA6A5C0EA4EC0DF0290EA8620E
+:1090200001D006D02DD8290EA86E5C0EA2EC0DF052
+:109030001F0E97EC10F09A0E326304D0020E3363C9
+:1090400001D006D027B777EC48F027B792EC48F06C
+:109050001F6B206B216B226B236B246B256B266BA4
+:10906000276B286B296B2A6B2B6B2C6B2D6B270EB8
+:10907000A4EC0DF02A85010EA8622A9567EF39F05D
+:1090800086EC29F0140E53D0289F29912A9BAA6AB6
+:10909000220EA4EC0DF0010EA86206D0288F000E5F
+:1090A0000A6F0AC11FF51200020EA86206D02981BC
+:1090B000000E0A6F0AC11FF51200030EA86206D047
+:1090C0002A8B000E0A6F0AC11FF51200040EA86257
+:1090D00005D0010E0A6F0AC11FF51200050EA86225
+:1090E00012002981010E0A6F0AC11FF5120033EC2C
+:1090F0000FF044EC29F00A0E396FC80EDAEC0CF0D0
+:109100002497249920B1CCEC40F020B1390720916C
+:10911000396701D0120020B3120024B7120024B91D
+:109120001200F0D733EC0FF065EC29F0E4D7396F7B
+:10913000C80EDAEC0CF02497249920B1CCEC40F066
+:1091400020B139072091396701D0120024B71200ED
+:1091500024B91200F2D76C0ED36E110E926E806A93
+:10916000030E936E816ADD0E946E826A000E966E17
+:10917000846A000E956E836A400E9B6E1F0ED56E3C
+:10918000070ECD6ED00EF26E050EF16E080EF06E6B
+:10919000210E9D6E000EA06ED06A000EC26E0E0EE5
+:1091A000C16E8A0EC06EC66A000EC76E280EC66EED
+:1091B000000EC56E080EC86EBD6ABA6A070EB46EA0
+:1091C000200E6F6E240EAC6E900EAB6E080EB86E55
+:1091D000B06A220EAF6EAE6A9E6A1200010EEB6F8D
+:1091E0000F0EEC6F010EBA6FB86B208F218733EC36
+:1091F0000FF05AEC1EF024972499219121932DEC25
+:109200001CF02FEC1DF042EC13F020A109D051EC22
+:109210003BF0CCEC40F08FEC3AF070EC45F0209154
+:1092200021B11DEF49F020AF15EF13F020B967EF22
+:1092300013F020B3EAEF47F0E6D7BA4F1CD0BA4F8D
+:109240000AD0BA4F10D0BA4F79D0BA4F58D0040EC6
+:10925000BA6F69EF13F0020EEB27C70EEB61EB6FED
+:10926000020EBA6FC8D7030EEC27630EEC61EC6FE9
+:10927000030EBA6FC0D7258D2C87ECC14CF14D6B16
+:10928000640E4E6F4F6BF0EC0BF0E80E4827030EA8
+:10929000492348C1C6F149C1C7F1C6C18DF1C7C153
+:1092A0008EF121912193209F249724995EEC49F01F
+:1092B0002083500E3CEC1AF05DEF3BF02D81530EF5
+:1092C0003CEC1AF062EC80F00101540E3CEC1AF018
+:1092D00012002D91530E3CEC1AF064EC80F0010169
+:1092E000540E3CEC1AF0470E3CEC1AF030EC80F0D7
+:1092F0000101C9EC3EF0480E3CEC1AF0120033ECD0
+:109300000FF01CEC43F02497249920A109D051ECD4
+:109310003BF0CCEC40F08FEC3AF070EC45F0209153
+:1093200024B709D024B907D020B967EF13F020B3D0
+:10933000EAEF47F0EAD7050EBA6F56D717EC41F0BF
+:10934000258D2C87ECC14CF14D6B640E4E6F4F6B2D
+:10935000F0EC0BF0E80E4827030E492348C1C6F194
+:1093600049C1C7F1C6C18DF1C7C18EF15EEC49F0AC
+:10937000010EE8CF7FF00C0E5DEC0BF0000EE8CF95
+:109380007FF01E0EED6F2DEC1CF003EC4AF06DEC3F
+:109390003CF029EC3DF000EC80F00101430E3CEC88
+:1093A0001AF0ED2FF2D7EB2FECD723C5CEF1CE6715
+:1093B00016D0FFEC49F069EC49F0259D2C97FA0E88
+:1093C000DAEC0CF0FA0EDAEC0CF0FA0EDAEC0CF047
+:1093D00001EC4AF0010EEB6F050EBA6F05D76DEC8C
+:1093E0003CF029EC3DF000EC80F0010123C5CEF10A
+:1093F000CE67F5D7DED78188120081981200818868
+:1094000012008198120081781200818812008198E0
+:1094100012008186120081961200818612008196C8
+:069420001200817612002B
+:02A0000000005E
+:020000040001F9
+:020000001200EC
+:020020001200CC
+:020030001200BC
+:020034001200B8
+:020040001200AC
+:0200500012009C
+:0200600012008C
+:0200800012006C
+:0200C400120028
+:0200C800120024
+:0200E00012000C
+:020000040030CA
+:0300010008180ECE
+:020005008080F9
+:060008003FC03FE03F4055
+:00000001FF
diff -r 000000000000 -r 96a35aeda5f2 code_part1/OSTC_code_asm_part1/MAIN.err
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/code_part1/OSTC_code_asm_part1/MAIN.err Tue Jan 12 15:05:59 2010 +0100
@@ -0,0 +1,11 @@
+Warning[203] Q:\DATA\OSTC2\CODE_PART1\OSTC_CODE_ASM_PART1\PLED_OUTPUTS.ASM 2855 : Found opcode in column 1. (return)
+Warning[203] Q:\DATA\OSTC2\CODE_PART1\OSTC_CODE_ASM_PART1\PLED_OUTPUTS.ASM 2858 : Found opcode in column 1. (return)
+Warning[203] Q:\DATA\OSTC2\CODE_PART1\OSTC_CODE_ASM_PART1\DIVEMODE.ASM 164 : Found opcode in column 1. (sleep)
+Warning[203] Q:\DATA\OSTC2\CODE_PART1\OSTC_CODE_ASM_PART1\DIVEMODE.ASM 165 : Found opcode in column 1. (nop)
+Warning[203] Q:\DATA\OSTC2\CODE_PART1\OSTC_CODE_ASM_PART1\DIVEMODE_MENU.ASM 411 : Found opcode in column 1. (bra)
+Message[301] Q:\DATA\OSTC2\CODE_PART1\OSTC_CODE_ASM_PART1\MAIN.ASM 137 : MESSAGE: (OSTC - diving computer code, Copyright (C) 2009 HeinrichsWeikamp GbR)
+Message[301] Q:\DATA\OSTC2\CODE_PART1\OSTC_CODE_ASM_PART1\MAIN.ASM 138 : MESSAGE: (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)
+Message[301] Q:\DATA\OSTC2\CODE_PART1\OSTC_CODE_ASM_PART1\MAIN.ASM 139 : MESSAGE: (Free Software Foundation, either version 3 of the License, or (at your option) any later version.)
+Message[301] Q:\DATA\OSTC2\CODE_PART1\OSTC_CODE_ASM_PART1\MAIN.ASM 140 : MESSAGE: (This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY)
+Message[301] Q:\DATA\OSTC2\CODE_PART1\OSTC_CODE_ASM_PART1\MAIN.ASM 141 : MESSAGE: (or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.)
+Message[301] Q:\DATA\OSTC2\CODE_PART1\OSTC_CODE_ASM_PART1\MAIN.ASM 142 : MESSAGE: (You should have received a copy of the GNU General Public License along with this program.If not, see http://www.gnu.org/licenses/.)
diff -r 000000000000 -r 96a35aeda5f2 code_part1/OSTC_code_asm_part1/adc_rtc.asm
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/code_part1/OSTC_code_asm_part1/adc_rtc.asm Tue Jan 12 15:05:59 2010 +0100
@@ -0,0 +1,242 @@
+
+; OSTC - diving computer code
+; Copyright (C) 2008 HeinrichsWeikamp GbR
+
+; 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 3 of the License, or
+; (at your option) any later version.
+
+; This program is distributed in the hope that it will be useful,
+; but WITHOUT ANY WARRANTY; without even the implied warranty of
+; 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, see .
+
+
+; routines for AD converter, Realtime clock initialisation
+; written by: Matthias Heinrichs, info@heinrichsweikamp.com
+; written: 10/30/05
+; last updated: 05/15/08
+; known bugs:
+; ToDo:
+
+get_battery_voltage: ; starts ADC and waits until fnished
+ bsf ADCON0,0 ; power on ADC
+ nop
+ bsf ADCON0,1 ; start ADC
+get_battery_voltage2:
+ btfsc ADCON0,1 ; Wait...
+ bra get_battery_voltage2
+
+; 3.3V/1024=3,2227mV Input/Bit=9,6680mV Battery/Bit.
+; Example: 434*9,6680mV=4195,9mV Battery.
+
+ movff ADRESH,xA+1
+ movff ADRESL,xA+0
+ movlw LOW d'966'
+ movwf xB+0
+ movlw HIGH d'966'
+ movwf xB+1
+ call mult16x16 ; AD_Result*966
+ movlw d'100'
+ movwf xB+0
+ clrf xB+1
+ call div32x16 ;xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder
+ movff xC+0,batt_voltage+0 ; store value
+ movff xC+1,batt_voltage+1
+ bcf ADCON0,0 ; power off ADC
+
+ ; Check if we should enter deep-sleep mode
+
+ movff batt_voltage+0,sub_b+0
+ movff batt_voltage+1,sub_b+1
+ movlw LOW d'2600' ; must be greater then 2600mV...
+ movwf sub_a+0
+ movlw HIGH d'2600'
+ movwf sub_a+1
+ call sub16 ; sub_c = sub_a - sub_b
+ bcf enter_error_sleep ; Clear flag
+ btfsc neg_flag ; neg_flag=1 if eeprom40:41 < 2000
+ bra get_battery_voltage3 ; Battery in OK range
+
+ movlw d'2'
+ movwf fatal_error_code ; Battery very low!
+ bsf enter_error_sleep ; enter error routine
+
+get_battery_voltage3:
+ movff amb_pressure+0,sub_b+0
+ movff amb_pressure+1,sub_b+1
+ movlw LOW d'15001' ; must be lower then 15001mBar
+ movwf sub_a+0
+ movlw HIGH d'15001'
+ movwf sub_a+1
+ call sub16 ; sub_c = sub_a - sub_b
+ bcf enter_error_sleep ; Clear flag
+ btfss neg_flag ;
+ bra get_battery_voltage4 ; Pressure in OK range
+
+ movlw d'3'
+ movwf fatal_error_code ; too deep
+ bsf enter_error_sleep ; enter error routine
+ ; Continue with rest of routine
+
+get_battery_voltage4:
+ ; check if the battery control memory needs to be initialised!
+ bcf initialize_battery1 ; clear check-flags
+ bcf initialize_battery2
+
+ read_int_eeprom d'40' ; get lowest battery voltage seen in mV
+ movff EEDATA,sub_b+0
+ read_int_eeprom d'41'
+ movff EEDATA,sub_b+1
+
+ movlw LOW d'2000' ; must be greater then 2000mV...
+ movwf sub_a+0
+ movlw HIGH d'2000'
+ movwf sub_a+1
+ call sub16 ; sub_c = sub_a - sub_b
+ btfss neg_flag ; neg_flag=1 if eeprom40:41 < 2000
+ bsf initialize_battery1 ; battery need to be initialised
+
+ movlw LOW d'4500' ; must be lower then 4500mV...
+ movwf sub_a+0
+ movlw HIGH d'4500'
+ movwf sub_a+1
+ call sub16 ; sub_c = sub_a - sub_b
+ btfss neg_flag ; neg_flag=1 if eeprom40:41 < 4500
+ bsf initialize_battery2 ; battery need to be initialised
+
+ btfss initialize_battery1 ; battery need to be initialised?
+ bra get_battery_no_init ; No, we have already valid values, just check for new extremas
+
+ btfss initialize_battery2 ; battery need to be initialised?
+ bra get_battery_no_init ; No, we have already valid values, just check for new extremas
+
+ ; Init EEPROM for battery control
+ ; Reset lowest battery seen
+ movlw LOW d'4200' ; reset to 4.2V
+ movwf EEDATA
+ write_int_eeprom d'40'
+ movlw HIGH d'4200' ; reset to 4.2V
+ movwf EEDATA
+ write_int_eeprom d'41'
+ movff month,EEDATA
+ write_int_eeprom d'42'
+ movff day,EEDATA
+ write_int_eeprom d'43'
+ movff year,EEDATA
+ write_int_eeprom d'44'
+ movff temperature+0,EEDATA
+ write_int_eeprom d'45'
+ movff temperature+1,EEDATA
+ write_int_eeprom d'46'
+ ; Reset charge statistics
+ clrf EEDATA ; last complete charge
+ write_int_eeprom d'47'
+ clrf EEDATA ; last complete charge
+ write_int_eeprom d'48'
+ clrf EEDATA ; last complete charge
+ write_int_eeprom d'49'
+ clrf EEDATA ; total cycles
+ write_int_eeprom d'50'
+ clrf EEDATA ; total cycles
+ write_int_eeprom d'51'
+ clrf EEDATA ; total complete cycles
+ write_int_eeprom d'52'
+ clrf EEDATA ; total complete cycles
+ write_int_eeprom d'53'
+ ; Reset temperature extremas
+ movff temperature+0,EEDATA ; Reset mimimum extrema
+ write_int_eeprom d'54'
+ movff temperature+1,EEDATA
+ write_int_eeprom d'55'
+ movff month,EEDATA
+ write_int_eeprom d'56'
+ movff day,EEDATA
+ write_int_eeprom d'57'
+ movff year,EEDATA
+ write_int_eeprom d'58'
+ movff temperature+0,EEDATA ; Reset maximum extrema
+ write_int_eeprom d'59'
+ movff temperature+1,EEDATA
+ write_int_eeprom d'60'
+ movff month,EEDATA
+ write_int_eeprom d'61'
+ movff day,EEDATA
+ write_int_eeprom d'62'
+ movff year,EEDATA
+ write_int_eeprom d'63'
+
+get_battery_no_init:
+ read_int_eeprom d'40' ; get lowest battery voltage seen in mV
+ movff EEDATA,sub_b+0
+ read_int_eeprom d'41'
+ movff EEDATA,sub_b+1
+ movff batt_voltage+0,sub_a+0
+ movff batt_voltage+1,sub_a+1
+ call sub16 ; sub_c = sub_a - sub_b
+ btfss neg_flag ; new lowest battery voltage?
+ return ; no, quit routine
+ ; Yes, store new value together with the date and temperature values
+ movff batt_voltage+0,EEDATA
+ write_int_eeprom d'40'
+ movff batt_voltage+1,EEDATA
+ write_int_eeprom d'41'
+ movff month,EEDATA
+ write_int_eeprom d'42'
+ movff day,EEDATA
+ write_int_eeprom d'43'
+ movff year,EEDATA
+ write_int_eeprom d'44'
+ movff temperature+0,EEDATA
+ write_int_eeprom d'45'
+ movff temperature+1,EEDATA
+ write_int_eeprom d'46'
+ return
+
+RTCinit: ; resets RTC
+ movlw 0x80
+ movwf TMR1H
+ clrf TMR1L
+
+; Reset RTC if any part of the time/date is out of range
+ movlw d'60' ; Limit
+ cpfslt secs ; Check part
+ bra RTCinit2 ; Reset time...
+ movlw d'60' ; Limit
+ cpfslt mins ; Check part
+ bra RTCinit2 ; Reset time...
+ movlw d'24' ; Limit
+ cpfslt hours ; Check part
+ bra RTCinit2 ; Reset time...
+ movlw d'32' ; Limit
+ cpfslt day ; Check part
+ bra RTCinit2 ; Reset time...
+ movlw d'12' ; Limit
+ cpfslt month ; Check part
+ bra RTCinit2 ; Reset time...
+ movlw d'100' ; Limit
+ cpfslt year ; Check part
+ bra RTCinit2 ; Reset time...
+
+ bsf PIE1, TMR1IE
+ return
+
+RTCinit2:
+ movlw .00
+ movwf secs
+ movlw .00
+ movwf mins
+ movlw .12
+ movwf hours
+ movlw .2
+ movwf day
+ movlw .8
+ movwf month
+ movlw .09
+ movwf year
+ bsf PIE1, TMR1IE
+ return
\ No newline at end of file
diff -r 000000000000 -r 96a35aeda5f2 code_part1/OSTC_code_asm_part1/alt_wait.asm
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/code_part1/OSTC_code_asm_part1/alt_wait.asm Tue Jan 12 15:05:59 2010 +0100
@@ -0,0 +1,399 @@
+; OSTC - diving computer code
+; Copyright (C) 2008 HeinrichsWeikamp GbR
+; 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 3 of the License, or
+; (at your option) any later version.
+; This program is distributed in the hope that it will be useful,
+; but WITHOUT ANY WARRANTY; without even the implied warranty of
+; 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, see .
+; Wait routines
+; written by: chsw, info@heinrichsweikamp.com
+; written: 01/31/04
+; last updated: 11/05/07
+; known bugs:
+; ToDo:
+ IFDEF Clk_4_MHZ
+ MESSG "wait_v2i: switched to 4 MHZ operation"
+ ELSE
+ IFDEF Clk_8_MHZ
+ MESSG "wait_v2i: switched to 8 MHZ operation"
+ ELSE
+ IFDEF Clk_16_MHZ
+ MESSG "wait_v2i: switched to 16 MHZ operation"
+ ELSE
+ IFDEF Clk_20_MHZ
+ MESSG "wait_v2i: switched to 20 MHZ operation"
+ ELSE
+ ERROR "wait_v2i: Operating Frequency has to be specified by #DEFINE Clk_4_MHZ or Clk_8_MHZ"
+ ENDIF
+ ENDIF
+ ENDIF
+ IFDEF Clk_16_MHZ
+; ==========================================================
+; WAIT 10 MICROSECONDS - 16 MHZ
+; ==========================================================
+WAIT10US macro wait_temp
+ movlw wait_temp
+ IFNDEF DEBUG
+ call WAIT10USX
+ ENDIF
+ endm
+
+WAIT10USX movwf wait_temp
+ goto JumpIn10us
+WAIT10USX2 nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+JumpIn10us:
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ decfsz wait_temp,1
+ goto WAIT10USX2
+ return
+; ==========================================================
+; WAIT 1 MILLISECOND - 16 MHZ
+; ==========================================================
+WAITMS macro waitms_temp
+ movlw waitms_temp
+ IFNDEF DEBUG
+ call WAITMSX
+ ENDIF
+ endm
+WAITMSX movwf waitms_temp
+ goto JumpInMSX
+WAITMSX2 nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+JumpInMSX:
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ WAIT10US d'99'
+ decfsz waitms_temp,1
+ goto WAITMSX2
+ return
+ ELSE
+ IFDEF Clk_8_MHZ
+; ==========================================================
+; WAIT 10 MICROSECONDS - 8 MHZ
+; ==========================================================
+WAIT10US macro wait_temp
+ movlw wait_temp
+ IFNDEF DEBUG
+ call WAIT10USX
+ ENDIF
+ endm
+WAIT10USX movwf wait_temp
+ goto JumpIn10us
+WAIT10USX2 nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+JumpIn10us:
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ decfsz wait_temp,1
+ goto WAIT10USX2
+ return
+; ==========================================================
+; WAIT 1 MILLISECOND - 8 MHZ
+; ==========================================================
+WAITMS macro waitms_temp
+ movlw waitms_temp
+ IFNDEF DEBUG
+ call WAITMSX
+ ENDIF
+ endm
+WAITMSX movwf waitms_temp
+ goto JumpInMSX
+
+WAITMSX2 nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+JumpInMSX:
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ WAIT10US d'99'
+ decfsz waitms_temp,1
+ goto WAITMSX2
+ return
+ ELSE
+ IFDEF Clk_4_MHZ
+; ==========================================================
+; WAIT 10 MICROSECONDS - 4 MHZ
+; ==========================================================
+WAIT10US macro wait_temp
+ movlw wait_temp
+ IFNDEF DEBUG
+ call WAIT10USX
+ ENDIF
+ endm
+WAIT10USX movwf wait_temp
+ goto JumpIn10us
+WAIT10USX2 nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+JumpIn10us:
+ decfsz wait_temp,1
+ goto WAIT10USX2
+ return
+; ==========================================================
+; WAIT 1 MILLISECOND - 4 MHZ
+; ==========================================================
+WAITMS macro waitms_temp
+ movlw waitms_temp
+ IFNDEF DEBUG
+ call WAITMSX
+ ENDIF
+ endm
+WAITMSX movwf waitms_temp
+ goto JumpInMSX
+
+WAITMSX2 nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+JumpInMSX:
+ WAIT10US d'99'
+ decfsz waitms_temp,1
+ goto WAITMSX2
+ return
+ ELSE
+ IFDEF Clk_20_MHZ
+ ==========================================================
+; WAIT 10 MICROSECONDS - 20 MHZ
+; ==========================================================
+WAIT10US macro wait_temp
+ movlw wait_temp
+ IFNDEF DEBUG
+ call WAIT10USX
+ ENDIF
+ endm
+WAIT10USX movwf wait_temp
+ goto JumpIn10us
+WAIT10USX2 nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+JumpIn10us:
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ decfsz wait_temp,1
+ goto WAIT10USX2
+ return
+; ==========================================================
+; WAIT 1 MILLISECOND - 20 MHZ
+; ==========================================================
+WAITMS macro waitms_temp
+ movlw waitms_temp
+ IFNDEF DEBUG
+ call WAITMSX
+ ENDIF
+ endm
+WAITMSX movwf waitms_temp
+ goto JumpInMSX
+
+WAITMSX2 nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+JumpInMSX:
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ WAIT10US d'99'
+ decfsz waitms_temp,1
+ goto WAITMSX2
+ return
+ ENDIF
+ ENDIF
+ ENDIF
+ ENDIF
+ ENDIF
+
+
+wait_one_second:
+ WAITMS d'250'
+ WAITMS d'250'
+ WAITMS d'250'
+ WAITMS d'250'
+ return
diff -r 000000000000 -r 96a35aeda5f2 code_part1/OSTC_code_asm_part1/changelog.txt
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/code_part1/OSTC_code_asm_part1/changelog.txt Tue Jan 12 15:05:59 2010 +0100
@@ -0,0 +1,2 @@
+New in 1.50 Stable:
+- Initial release for OSTC Mk.2
diff -r 000000000000 -r 96a35aeda5f2 code_part1/OSTC_code_asm_part1/dd_font2display.asm
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/code_part1/OSTC_code_asm_part1/dd_font2display.asm Tue Jan 12 15:05:59 2010 +0100
@@ -0,0 +1,55 @@
+
+; OSTC - diving computer code
+; Copyright (C) 2008 HeinrichsWeikamp GbR
+
+; 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 3 of the License, or
+; (at your option) any later version.
+
+; This program is distributed in the hope that it will be useful,
+; but WITHOUT ANY WARRANTY; without even the implied warranty of
+; 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, see .
+
+
+; DIGIT DRAW (dd)
+; routines for nice digit OLED output
+; written by: Christian Weikamp, info@heinrichsweikamp.com
+; written: 08/11/07
+; last updated: 12/17/07
+; known bugs:
+; ToDo:
+
+; -----------------------------
+; Routines, accessible
+; -----------------------------
+; DD_Main
+; DD_Graph_tissue
+; dd_print_mini_font
+
+; -----------------------------
+; DD_Main: (alpha)
+; -----------------------------
+; INPUT (for main only):
+; is different in mini_font and print graph
+; temp_font_select = width:0 (for digits before decpoint)
+; temp2_pointer_row = width:1
+; temp_pointer_column = width:2
+; temp2_pointer_column = width:3
+; temp_pointer_decpoint = width:4
+; temp_font_select = width:5 (for decpoint and following digits)
+; letter
+
+DD_Main:
+return
+dd_print_mini_font:
+return
+DD_Graph_tissue:
+return
+DD_graf_Main:
+return
+
diff -r 000000000000 -r 96a35aeda5f2 code_part1/OSTC_code_asm_part1/debugcodes.txt
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/code_part1/OSTC_code_asm_part1/debugcodes.txt Tue Jan 12 15:05:59 2010 +0100
@@ -0,0 +1,52 @@
+Byte38 im EEPROM=1:
+
+a - PLED Serial and Firmware version updated
+b - PLED Ambient pressure updated
+c - PLED Clock updated
+e - PLED Temperature updated
+d - PLED Date updated
+f - PLED Battery voltage updated
+g - PLED NoFly time updated
+h - PLED Desaturation time updated
+h - PLED Tissue saturation graph divemode updated
+i - PLED Tissue saturation graph surfacemode updated
+j - PLED const. ppO2 value surfacemode updated
+k - PLED cns value updated
+l - PLED Divemenu cursor updated
+m - PLED Divemode gaslist updated
+n - PLED Decoplan updated
+o - PLED Divemode menu updated
+p - PLED max Depth updated
+q - PLED Surfacemode startgas updated
+r - PLED Depth updated
+s - PLED Divemode active gas updated
+t - PLED ppO2 value divemode updated
+u - PLED Temperature divemode updated
+v - PLED Velocity updated
+w - PLED Gradient Factor updated
+x - PLED complete ascend time updated
+y - PLED decompression updated
+z - PLED NDL updated
+A - PLED Divetime updated
+B - Decompression algorithm started
+C - Decompression algorithm finished
+D - Profile Sample stored
+E - Decompression gas set
+F - Decompression gas reset
+G - Desaturation time calculation started
+H - Desaturation time calculation finished
+I - Surfmode/sleepmode desaturation calculation started
+J - Surfmode/sleepmode desaturation calculation finished
+K - calculate noflytime percentage started
+L - calculate noflytime percentage finished
+M - I2C Bus Timeout
+N - I2C Bus Failed
+O - I2C Bus Restored
+P - Stand-alone Simulator started
+Q - Divemode init started
+R - Divemode init finished
+S - Tissues copy start
+T - Tissue copy done.
+U - Average Depth Display updated
+V - Gauge mode Stopwatch updated
+
diff -r 000000000000 -r 96a35aeda5f2 code_part1/OSTC_code_asm_part1/definitions.asm
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/code_part1/OSTC_code_asm_part1/definitions.asm Tue Jan 12 15:05:59 2010 +0100
@@ -0,0 +1,622 @@
+; OSTC - diving computer code
+; Copyright (C) 2008 HeinrichsWeikamp GbR
+
+; This program is free software: you can redistribute it and/or modifyn 3 of the License, or
+; (at your option) any later version.
+
+; This program is distributed in the hope that it will be useful,
+; but WITHOUT ANY WARRANTY; without even the implied warranty of
+; 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, see .
+
+
+; Defines, I/O Ports and variables
+; written by: Matthias Heinrichs, info@heinrichsweikamp.com
+; written: 10/30/05
+; last updated: 01/23/08
+; known bugs:
+; ToDo:
+
+;#DEFINE NO_SENSOR_MODE ; uses Dummy values
+
+#DEFINE softwareversion_x d'1' ; Software version XX.YY
+#DEFINE softwareversion_y d'50' ; Software version XX.YY
+
+#DEFINE max_custom_number d'41' ; Number of last used custom function
+
+#DEFINE logbook_profile_version 0x20 ; Do not touch!
+
+#DEFINE T0CON_debounce b'00000000' ; Timer0 Switch Debounce
+
+#DEFINE FT_SMALL .0
+#DEFINE FT_MEDIUM .1
+#DEFINE FT_LARGE .2
+
+; Define max. 5 Binary Custom Functions here (add more in menu_custom.asm)
+#DEFINE binary_cf1 d'31'
+#DEFINE binary_cf2 d'38'
+#DEFINE binary_cf3 d'39'
+#DEFINE binary_cf4 d'40'
+#DEFINE binary_cf5 d'41'
+
+#DEFINE wp_fontwidth .14
+#DEFINE wp_fontheight .24
+
+; Color Definitions: 8Bit RGB b'RRRGGGBB'
+#DEFINE color_red b'11100000'
+#DEFINE color_blue b'00000011'
+#DEFINE color_green b'00011100'
+#DEFINE color_white b'11111111'
+#DEFINE color_black b'00000000'
+#DEFINE color_deepblue b'00000001'
+#DEFINE color_grey d'73'
+
+
+;Configuration bits
+ CONFIG OSC = IRCIO67 ;Internal oscillator block, port function on RA6 and RA7
+ CONFIG FCMEN = OFF ;Fail-Safe Clock Monitor disabled
+ CONFIG IESO = OFF ;Oscillator Switchover mode disabled
+
+ CONFIG PWRT = ON ;PWRT enabled
+ CONFIG BOREN = OFF ;Brown-out Reset disabled in hardware and software
+
+ CONFIG WDT = OFF ;WDT disabled
+ CONFIG WDTPS = 128 ;1:128
+
+ CONFIG MCLRE = ON ;MCLR pin enabled; RE3 input pin disabled
+ CONFIG LPT1OSC = OFF ;Timer1 configured for higher power operation
+ CONFIG PBADEN = OFF ;PORTB<4> and PORTB<1:0> Configured as Digital I/O Pins on Reset
+
+ CONFIG DEBUG = OFF ;Background debugger disabled, RB6 and RB7 configured as general purpose I/O pins
+ CONFIG XINST = OFF ;Instruction set extension and Indexed Addressing mode disabled (Legacy mode)
+ CONFIG LVP = OFF ;Single-Supply ICSP disabled
+ CONFIG STVREN = OFF ;Stack full/underflow will not cause Reset
+
+
+;Variable definitions
+; arrays are in hex size!! 20 = .032
+
+ CBLOCK 0x060 ;Bank 0
+ letter:.026 ;letter buffer
+ win_color1
+ win_color2
+ win_top
+ win_leftx2
+ win_font
+ win_invert
+ wp_temp
+ ENDC
+; the following is used by the C-code up to 0x0E0!!
+ CBLOCK 0x0E0 ;Bank 0
+ ENDC
+
+ CBLOCK 0x100 ;Bank 1
+ wreg_temp ;variables used for context saving during ISR
+ status_temp
+ bsr_temp
+
+ secs ;realtime clock
+ mins
+ hours
+ day
+ month
+ year
+
+ waitms_temp ;variables required for wait routines
+ wait_temp ; " + used to copy data to c code + used for temp/testing
+ ; never use wait_temp in interrupt routines (isr) and never call any wait routine in interrupts
+
+ textnumber ;for textdisplay and textlookup
+ textlength
+ textaddress:2
+
+ LastSetRow
+ LastSetColumn
+ average_depth_hold:4 ; Holds Sum of depths
+ b0_lo ; Temp (calculate_average)
+ b0_hi ; Temp (calculate_average)
+ average_divesecs:2 ; Used for resetable average depth display
+ surface_interval:2 ; Surface Interval [mins]
+ grayvalue ; 4 Bit Greyvalue
+
+ draw_box_temp1
+ draw_box_temp2
+ draw_box_temp3
+
+ flag1 ;Flag register
+ flag2
+ flag3
+ flag4
+ flag5 ; has to be exacly here, is modified by c-code (no sensor int)
+ flag6
+ flag7
+ flag8
+ flag9
+ flag10
+ flag11
+ flag12
+ flag13
+ flag14
+ flag15
+
+ oled1_temp ;Temp variables for display output
+ oled2_temp
+ oled3_temp
+ oled4_temp ; Used in "Displaytext"
+
+ lo ;bin to dec conversion routine
+ hi
+ lo_temp
+ hi_temp
+ temp3 ; used in valconv math
+ temp4 ; used in valconv math
+ ignore_digits
+
+ temp1 ;Multipurpose Temp variables used in valconv math
+ temp2 ; used in valconv math
+
+ ext_ee_temp1 ; External EEPROM Temp 1 used in I2C EEPROM
+ ext_ee_temp2 ; External EEPROM Temp 2 used in I2C EEPROM
+
+ isr1_temp ;ISR temp variables
+ isr2_temp
+ isr3_temp:2
+
+ timer1int_counter1 ;Timer 1 counter
+ timer1int_counter2 ;Timer 1 counter
+
+ uart1_temp ;RS232 temp variables
+ uart2_temp
+
+ divA:2 ;math routines
+ divB
+ xC:4
+ xA:2
+ xB:2
+ sub_c:2
+ sub_a:2
+ sub_b:2
+
+ dLSB ;Pressure sensor interface
+ dMSB
+ clock_count
+ temperature_correction ; additional temperature correction value
+ W1:2
+ W2:2
+ W3:2
+ W4:2
+ C1:2
+ C2:2
+ C3:2
+ C3_temp:2
+ C4:2
+ C5:2
+ C6:2
+ D1:2
+ D2:2
+
+ isr_divA:2
+ isr_divB
+ isr_xC:4
+ isr_xA:2
+ isr_xB:2
+ isr_sub_c:2
+ isr_sub_a:2
+ isr_sub_b:2
+
+ xdT:2
+ xdT2:2
+ OFF:2
+ SENS:2
+ amb_pressure:2 ; ambient pressure [mBar]
+ rel_pressure:2 ; amb_pressure - surface pressure [mBar]
+ max_pressure:2 ; Max. pressure for the dive [mBar]
+ avr_rel_pressure:2 ; Average rel. pressure (Average depth) for the dive [mBar]
+ last_pressure:2
+ temperature:2
+ last_temperature:2
+ temperature_temp:2
+ Dx:2
+
+ last_surfpressure:2 ;Divemode
+ last_surfpressure_15min:2
+ last_surfpressure_30min:2
+ divemins:2 ;Minutes
+ divesecs ;seconds
+ samplesecs ; counts the seconds until the next sample is stored in divemode
+ samplesecs_value ; holds the CF20 value
+ decodata:2 ;Deco data
+ mintemp:2 ;min temperature
+ ProfileFlagByte ; stores number of addional bytes per sample
+ EventByte ; Stores the Event type plus flags
+ AlarmType ; 0= No Alarm
+ ; 1= SLOW
+ ; 2= DecoStop missed
+ ; 3= DeepStop missed
+ ; 4= ppO2 Low Warning
+ ; 5= ppO2 High Warning
+ ; 6= manual marker
+
+ divisor_temperature ; divisors for profile storage
+ divisor_deco
+ divisor_tank
+ divisor_ppo2
+ divisor_deco_debug
+ divisor_nuy2
+
+ timeout_counter ;Timeout counter variables
+ timeout_counter2
+ timeout_counter3 ;pre-menu timeout counter
+
+ menupos ;cursor position
+ menupos2
+ menupos3
+
+ eeprom_address:2 ;external EEPROM
+ eeprom_header_address:2
+
+ divenumber ;Logbook
+
+ batt_voltage:2 ;Battery voltage in mV
+
+ i2c_temp ;IēC timeout counter
+ i2c_temp2
+
+ sim_pressure:2 ; hold simulated pressure in mBar if in Simulator mode
+
+ profile_temp:2 ; temp variable for profile view
+ profile_temp2:2 ; temp variable for profile view
+
+ nofly_time:2 ; No Fly time in Minutes (Calculated after Dive)
+
+ deco_status ; =0 if decompression calculation done
+
+ cf_checker_counter ; counts custom functions to check for warning symbol
+
+ char_I_O2_ratio ; 02 ratio
+
+ active_gas ; Holds number of active gas
+
+ last_diluent ; backup of diluent percentage in const ppO2 mode
+ last_cns ; backup of last cns value
+ last_ppO2_value ; last calculated ppO2 value
+
+; ontime_since_last_charge:2 ; Ontime in minutes since last complete charge cycle
+; sleeptime_since_last_charge:2; Sleeptime in hours since last complete charge
+
+ debug_char:6 ; For debugmode
+ debug_temp ; For debugmode
+
+ apnoe_mins ; single descent minutes for Apnoe mode
+ apnoe_secs ; single descent seconds for Apnoe mode
+ apnoe_max_pressure:2 ; Max. Pressure in Apnoe mode
+ apnoe_timeout_counter ; counts minutes for apnoe timeout
+ apnoe_surface_mins ; Surface interval mins for Apnoe mode
+ apnoe_surface_secs ; Surface interval secs for Apnoe mode
+ customfunction_temp1 ; start of custom function descriptors
+ customfunction_temp2 ; used in GETCUSTOM8 and GETCUSTOM15
+
+ switch_timeout ; used for hold-down count function
+
+ temp5 ; used in PLED_MultiGF,...
+ temp6 ; used in PLED_MultiGF,...
+ char_last_pointer ; for MultiGF
+ MultiGF_seconds ; Counter for seconds in Multi-GF mode
+
+ fatal_error_code ; holds error code value
+
+ logbook_temp1 ; Temp used in logbook display&Divemode
+ logbook_temp2 ; Temp used in logbook display&Divemode
+ logbook_temp3 ; Temp used in logbook display&Divemode
+ logbook_temp4 ; Temp used in logbook display&Divemode
+ logbook_temp5 ; Temp used in logbook display&Divemode
+ logbook_temp6 ; Temp used in logbook display&Divemode
+
+ convert_value_temp:3 ; used in menu_battery_state_convert_date
+ box_temp:5
+ win_color1_temp
+ win_color2_temp ; Backup color registers
+
+ ENDC
+
+ CBLOCK 0x200 ;Bank 2
+ int_O_tissue_for_debug:.32 ; deco_main_debug copies pressure of tissue to this variable
+ int_O_GF_spare____:2; // 0x240
+ int_O_GF_step:2; // 0x242
+ int_O_gtissue_limit:2; // 0x244
+ int_O_gtissue_press:2; // 0x246
+ int_O_limit_GF_low:2; // 0x248
+ int_O_gtissue_press_at_GF_low:2; // 0x24A
+ ENDC
+ CBLOCK 0x24E ;Bank 2
+ char_O_GF_low_pointer; // 0x24E
+ char_O_actual_pointer; // 0x24F
+ ENDC
+ CBLOCK 0x250 ;Bank 2
+ char_IO_deco_table:.32; // 0x250
+ ENDC
+ CBLOCK 0x270 ;Bank 2
+ char_I_table_deco_done:.32; // 0x270
+ ENDC
+ CBLOCK 0x290 ;Bank 2
+ int_O_calc_tissue_call_counter:2
+ ENDC
+ CBLOCK 0x380 ;Bank 3
+ ; some used in C code!
+ ENDC
+
+ CBLOCK 0x500
+; used by deco_main c-code for data transfer with the asm code
+; input of c-code
+ int_I_pres_respiration:2; ; 0x500
+ int_I_pres_surface:2; ; 0x502
+ int_I_temp:2; ; 0x504
+ char_I_temp; ; 0x506
+ char_I_actual_ppO2; ; 0x507
+ int_I_spare_3:2;
+ int_I_spare_4:2;
+ int_I_spare_5:2;
+ int_I_spare_6:2;
+ char_I_N2_ratio; ; 0x510
+ char_I_He_ratio; ; 0x511
+ char_I_saturation_multiplier; ; for conservatism/safety values 1.0 (no conservatism) to 1.5 (50% faster saturation
+ char_I_desaturation_multiplier; ; for conservatism/safety values 0.66 (50% slower desaturation) to 1.0 (no conservatism); consveratism used in calc_tissue(), calc_tissue_step_1_min() and sim_tissue_1min()
+ char_I_GF_Hi_percentage; ; 0x514
+ char_I_GF_Lo_percentage; ; 0x515
+ char_I_GF_Spare; ; 0x516
+ char_I_deco_distance; ; 0x517
+ char_I_const_ppO2; ; 0x518 new in v.101 (C-Code), new in v109 (asm)
+ char_I_deco_ppO2_change; ; 0x519 new in v.101
+ char_I_deco_ppO2; ; 0x51A new in v.101
+ char_I_deco_gas_change; ; 0x51B new in v.101
+ char_I_deco_N2_ratio; ; 0x51C new in v.101
+ char_I_deco_He_ratio; ; 0x51D new in v.101
+ char_I_depth_last_deco; ; 0x51E new in v.101
+ char_I_deco_model; ; 0x51F new in v.102
+; output of c-code:
+ int_O_desaturation_time:2; ; 0x520
+ char_O_nullzeit; ; 0x522
+ char_O_deco_status; ; 0x523
+ char_O_array_decotime:7; ; 0x524
+ char_O_array_decodepth:6; ; 0x52B
+ char_O_ascenttime; ; 0x531
+ char_O_gradient_factor; ; 0x532
+ char_O_tissue_saturation:.32; ; 0x533, He starts at 0x543
+ char_O_array_gradient_weighted:.16 ; 0x553
+ char_O_gtissue_no; ; 0x563
+ char_O_diluent; ; 0x564 new in v.101 (C-Code), new in v109 (asm)
+ char_O_CNS_fraction; ; 0x565 new in v.101
+ char_O_relative_gradient_GF; ; 0x566 new in v.102
+
+ ENDC
+
+ CBLOCK 0x700 ;Bank 7
+; variables used exclusively in dd:
+ dd_temp_BSR ; has to be first in bank7
+ temp_pointer_row
+ temp_pointer_column
+ temp2_pointer_row
+ temp2_pointer_column
+ temp_selected_char
+ temp_font_HIGH
+ temp_font_LOW
+ temp_font_height
+ temp2_font_height
+ temp_font_width
+ temp2_font_width
+ temp_diff_font_width
+ temp2_diff_font_width
+ temp_font_offset_left
+ temp_font_offset_right
+ temp_pos
+ DDflag
+ dd_oled_brightness_offset ; value will be subtracted from "dd_grayvalue" in dd_font2display_vxxx.asm
+ dd_grayvalue
+ dd2_temp
+ dd3_temp
+ dd_pos_decpoint
+ dd_grayvalue_temp
+ dd_grayvalue_temp2
+ ENDC
+
+ CBLOCK 0x94A ;Bank 9
+ char_O_hash:.16 ; MD2 hash values = d'16'
+ ENDC
+
+
+; C-code Routines
+; PART 3
+;#DEFINE main_wordprocessor 0x0B410
+#DEFINE main_wordprocessor 0x0B468
+
+; C-code Routines
+; PART 2
+#DEFINE deco_main_calc_hauptroutine 0x10000
+#DEFINE deco_main_calc_without_deco 0x10020
+#DEFINE main_clear_CNS_fraction 0x10030
+#DEFINE main_calc_CNS_decrease_15min 0x10034
+#DEFINE main_calc_percentage 0x10038
+#DEFINE deco_main_clear_tissue 0x10040
+#DEFINE main_calc_CNS_fraction 0x10050
+#DEFINE deco_main_calc_desaturation_time 0x10060
+#DEFINE deco_main_calc_wo_deco_step_1_m 0x10080
+#DEFINE deco_main_debug 0x100A0
+#DEFINE main_DD2_write_incon42 0x100B0
+#DEFINE main_DD2_write_incon24 0x100B4
+
+#DEFINE deco_main_gradient_array 0x100C0
+#DEFINE deco_main_hash 0x100E0
+#DEFINE main_push_tissues_to_vault 0x100C4
+#DEFINE main_pull_tissues_from_vault 0x100C8
+
+;I/O Ports (I=Input, O=Output)
+#DEFINE sensor_SDO PORTA,1 ;O
+#DEFINE oled_rw PORTA,2 ;0
+#DEFINE oled_hv PORTA,3 ;O
+#DEFINE sensor_SDI PORTA,4 ;I
+#DEFINE oled_cs PORTA,5 ;O
+#DEFINE sensor_CLK PORTA,7 ;O
+
+#DEFINE SWITCH2 PORTB,0 ;I (Right)
+#DEFINE SWITCH1 PORTB,1 ;I (Left)
+#DEFINE oled_vdd PORTB,2 ;O
+#DEFINE LED_blue PORTB,3 ;0
+#DEFINE LED_red PORTB,4 ;O
+
+#DEFINE CHRG_OUT PORTC,1 ;O
+#DEFINE CHRG_IN PORTC,2 ;I
+
+#DEFINE oled_d1 PORTD,0 ;O
+#DEFINE oled_d2 PORTD,1 ;O
+#DEFINE oled_d3 PORTD,2 ;O
+#DEFINE oled_d4 PORTD,3 ;O
+#DEFINE oled_d5 PORTD,4 ;O
+#DEFINE oled_d6 PORTD,5 ;O
+#DEFINE oled_d7 PORTD,6 ;O
+#DEFINE oled_d8 PORTD,7 ;O
+
+#DEFINE oled_rs PORTE,0 ;0
+#DEFINE oled_nreset PORTE,1 ;0
+#DEFINE oled_e_nwr PORTE,2 ;0
+
+; Flags
+#DEFINE FLAG_scale flag1,0 ; Wordprocessor
+#DEFINE FLAG_truncated flag1,1 ; Wordprocessor
+#DEFINE pre_zero_flag flag1,2 ; leading zeros
+#DEFINE neg_flag flag1,3 ; e.g. Sub_16 (sub_c = sub_a - sub_b)
+#DEFINE FLAG_row_prime flag1,4 ; Wordproceesor
+#DEFINE leading_zeros flag1,5 ; display leading zeros?
+#DEFINE show_last3 flag1,6 ; show only three figures
+#DEFINE leftbind flag1,7 ; leftbinded output
+
+#DEFINE onesecupdate flag2,0 ;=1 after any second
+#DEFINE divemode flag2,1 ;=1 if in divemode
+#DEFINE oneminupdate flag2,2 ;=1 after any minute
+#DEFINE realdive flag2,3 ; dive was longer then one minute?
+#DEFINE sleepmode flag2,4 ;=1 if in sleepmode
+#DEFINE same_row flag2,5 ;=1 if pixel pair is in same row (display_profile)
+#DEFINE premenu flag2,6 ; Premenu/Divemenu selected
+#DEFINE menubit flag2,7 ; menu
+
+#DEFINE menubit2 flag3,0 ; menu
+#DEFINE menubit3 flag3,1 ; menu
+#DEFINE set_minutes flag3,2 ; set minutes (not hours)
+#DEFINE cursor flag3,3 ; display cursor
+#DEFINE menubit4 flag3,4 ; quit set time
+#DEFINE display_velocity flag3,5 ; velocity is displayed
+#DEFINE temp_changed flag3,6 ; temperature changed
+#DEFINE pres_changed flag3,7 ; pressure changed
+
+#DEFINE set_year flag4,0 ; Menu Settime
+#DEFINE set_day flag4,1 ; Menu Settime
+#DEFINE set_month flag4,2 ; Menu Settime
+#DEFINE store_sample flag4,3 ;=1 after any CF20 seconds in divemode
+#DEFINE divemode2 flag4,4 ; displayed divetime stopped?
+#DEFINE header_stored flag4,5 ; header already stored
+#DEFINE first_FD flag4,6 ; 1st 0xFD in EEPROM found
+#DEFINE first_FA flag4,6 ; 1st 0xFA in EEPROM found
+#DEFINE second_FD flag4,7 ; 2nd 0xFD in EEPROM found
+#DEFINE second_FA flag4,7 ; 2nd 0xFA in EEPROM found
+
+#DEfINE eeprom_overflow flag5,0 ; EEPROM overflowed (>32KB)
+#DEFINE eeprom_blockwrite flag5,1 ; EEPROM blockwrite active
+#DEFINE neg_flag_xdT flag5,2 ; xdT negative (2nd order temperature calculation)
+#DEFINE low_battery_state flag5,3 ;=1 if battery low
+#DEFINE DP_done flag5,4 ; valconv
+#DEFINE DP_done2 flag5,5 ; valconv
+#DEFINE pressure_refresh flag5,6 ; Pressure and temperature refreshed
+#DEFINE no_sensor_int flag5,7 ; block any further access to pressure sensor
+
+#DEFINE cc_active flag6,0 ;=1: Constant Current mode aktive (Charger)
+#DEFINE cv_active flag6,1 ;=1: Constant Voltage mode aktive (Charger)
+#DEFINE ignore_digit5 flag6,2 ;=1: ignores digit 5 in valconv
+#DEFINE switch_left flag6,3 ;=1: left switch pressed
+#DEFINE switch_right flag6,4 ;=1: right switch pressed
+#DEFINE uart_settime flag6,5 ;=1: enter time sync routine
+#DEFINE neg_temp flag6,6 ;=1: temperature below zero
+#DEFINE twosecupdate flag6,7 ;=1: after any two seconds
+
+#DEFINE dekostop_active flag7,0 ;=1: in deocompression mode
+#DEFINE all_dives_shown flag7,1 ;=1: all dives in loogbook shown, abort further scanning
+#DEFINE return_from_profileview flag7,2 ;=1: set cursor to same position again
+#DEFINE logbook_profile_view flag7,3 ;=1: Show details/profile in logbook
+#DEFINE logbook_page_not_empty flag7,4 ;=1: actual logbook page is not empty
+#DEFINE dump_external_eeprom flag7,5 ;=1: enter download-routine
+#DEFINE simulatormode_active flag7,6 ;=1: Simulator mode active, override pressure sensor readings
+#DEFINE all_zeros_flag flag7,7 ;=1: display all zeros from here (valconv_v2.asm)
+
+#DEFINE internal_eeprom_write flag8,0 ;=1: start routine to access internal EEPROM BANK 0 via the UART
+#DEFINE update_divetime flag8,1 ;=1: update divetime display
+#DEFINE display_set_xgas flag8,2 ;=1: Display Set Gas menu in Divemode
+#DEFINE FLAG_active_descent flag8,3 ;=1: A Descent in Apnoe mode is active
+#DEFINE display_see_deco flag8,4 ;=1: Display decoplan in Divemode
+#DEFINE display_set_gas flag8,5 ;=1: Display Gaslist menu in Divemode
+#DEFINE display_set_graphs flag8,6 ;=1: Display "Display Menu" in Divemode
+#DEFINE rs232_recieve_overflow flag8,7 ;=1: An RS232 timeout overflow occoured
+
+#DEFINE nofly_active flag9,0 ;=1: Do not fly!
+#DEFINE ppO2_display_active flag9,1 ;=1: ppO2 value is displayed
+#DEFINE ppO2_show_value flag9,2 ;=1: show ppO2 value!
+#DEFINE show_startup_screen flag9,3 ;=1: Show startup screen with MD2 hash
+#DEFINE ignore_digit3 flag9,4 ;=1: ignores digits 3-5 in valconv
+#DEFINE ppO2_warn_value flag9,5 ;=1: warn about ppO2!
+#DEFINE output_to_postinc_only flag9,6 ;=1: Do not call wordprocessor in output
+#DEFINE uart_send_hash flag9,7 ;=1: Send the MD2 hash via UART
+
+#DEFINE uart_compensate_temp flag10,0 ;=1: Enter Temperature compensation routine
+#DEFINE uart_send_int_eeprom flag10,1 ;=1: Send internal EEPROM BANK 0
+#DEFINE uart_reset_decodata flag10,2 ;=1: Reset deco data
+#DEFINE manual_gas_changed flag10,3 ;=1: Manual Gas changed during dive
+#DEFINE stored_gas_changed flag10,4 ;=1: Stored Gas changed during dive
+#DEFINE event_occured flag10,5 ;=1: An Event has occured during the current sample interval
+#DEFINE new_profile_format flag10,6 ;=1: Current Dive in Logbook uses new ProfileFormat
+#DEFINE gauge_mode flag10,7 ;=1: Gauge mode active
+
+#DEFINE FLAG_const_ppO2_mode flag11,0 ;=1: const ppO2 mode active
+#DEFINE gas_setup_page2 flag11,1 ;=1: page two of gassetup active
+#DEFINE logbook_header_drawn flag11,2 ;=1: The "Logbook" Header in the List view is already drawn
+#DEFINE ignore_digit4 flag11,3 ;=1: Ignores digits 4-5 in valconv
+#DEFINE charge_done flag11,4 ;=1: Complete charge cycle done
+#DEFINE initialize_battery1 flag11,5 ;=1: Battery memory need to be initialised
+#DEFINE initialize_battery2 flag11,6 ;=1: Battery memory need to be initialised
+#DEFINE charge_started flag11,7 ;=1: Charger started in CC mode
+
+#DEFINE switch_left_isr flag12,0 ;=1: left switch pressed (Only modified in ISR!)
+#DEFINE switch_right_isr flag12,1 ;=1: right switch pressed (Only modified in ISR!)
+#DEFINE debug_mode flag12,2 ;=1: Debugmode active
+#DEFINE neg_flag_isr flag12,3 ;=1: ISR Negative flag (Math)
+#DEFINE select_bailoutgas flag12,4 ;=1: Select Bailout instead of Setpoint in Gaslist
+#DEFINE FLAG_apnoe_mode flag12,5 ;=1: Apnoe mode selected
+#DEFINE customfunction_page flag12,6 ;=1: Use 2nd Page of Custom Functions
+#DEFINE uart_send_int_eeprom2 flag12,7 ;=1: Send internal EEPROM BANK 1
+
+#DEFINE internal_eeprom_write2 flag13,0 ;=1: start routine to access internal EEPROM BANK 1 via the UART
+#DEFINE button_delay_done flag13,1 ;=1: Button was pressed for more then 500ms, start counting
+#DEFINE multi_gf_display flag13,2 ;=1: Display the Multi-GF screen instead of normal divemode screen
+#DEFINE deco_mode_changed flag13,3 ;=1: The Decomode was changes, show decomode description!
+#DEFINE pled_velocity_display flag13,4 ;=1: Velocity is displayed
+#DEFINE depth_greater_100m flag13,5 ;=1: Depth is greater then 100m
+#DEFINE display_set_setpoint flag13,6 ;=1: SetPoint list active
+#DEFINE divemode_menu_page flag13,7 ;=1: Use 2nd Page of Divemode Menu
+
+#DEFINE enter_error_sleep flag14,0 ;=1: Sleep immediately displaying the error using LED codes
+#DEFINE stopwatch_active flag14,1 ;=1: Show Stopwatch in Divemode
+;free
+#DEFINE standalone_simulator flag14,3 ;=1: Standalone Simulator active
+#DEFINE display_set_simulator flag14,4 ;=1: Show Divemode simulator menu
+#DEFINE displaytext_high flag14,5 ;=1: Show/Use Texts 255-511 in Texttable
+;free
+#DEFINE displaytext_invert flag14,7 ;=1: inverts word prozessor output
+
+#DEFINE restore_deco_data flag15,0 ;=1: Restore Decodata after the dive from 0x380 buffer
+#DEFINE uart_store_tissue_data flag15,1 ;=1: Store tissue data for next simualted dive!
+;free
+#DEFINE flip_display flag15,3 ;=1: Flip Display
+#DEFINE display_see_l_tissue flag15,4 ;=1: Leading Tissue details are now displayed
+;free
+;free
+#DEFINE show_interval flag15,7 ;=1: Show Interval, =0: Show Clock in Surfacemode
+
diff -r 000000000000 -r 96a35aeda5f2 code_part1/OSTC_code_asm_part1/displaytext.asm
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/code_part1/OSTC_code_asm_part1/displaytext.asm Tue Jan 12 15:05:59 2010 +0100
@@ -0,0 +1,173 @@
+
+; OSTC - diving computer code
+; Copyright (C) 2008 HeinrichsWeikamp GbR
+
+; 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 3 of the License, or
+; (at your option) any later version.
+
+; This program is distributed in the hope that it will be useful,
+; but WITHOUT ANY WARRANTY; without even the implied warranty of
+; 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, see .
+
+
+; Displays from text_table_vx.asm
+; written by: Matthias Heinrichs, info@heinrichsweikamp.com
+; written: 10/30/05
+; last updated: 081215
+; known bugs:
+; ToDo:
+
+
+; These macros output to POSTINC only
+OUTPUTTEXT macro textnumber ; For Texts 1-254
+ movlw textnumber
+ call displaytext0
+ endm
+
+OUTPUTTEXTH macro textnumber ; For Texts 255-511
+ movlw LOW textnumber ; Use only Lower 8 Bit
+ call displaytext0_h
+ endm
+
+displaytext0_h:
+ bsf displaytext_high ; Highbit set
+ rcall displaytext0
+ return
+
+displaytext0:
+ bsf output_to_postinc_only
+ rcall displaytext1
+ bcf output_to_postinc_only
+ return
+
+; These macros output to POSTINC and call the wordprocessor
+DISPLAYTEXT macro textnumber
+ movlw textnumber
+ call displaytext1
+ endm
+
+DISPLAYTEXTH macro textnumber
+ movlw LOW textnumber ; Use only Lower 8 Bit
+ call displaytext1h
+ endm
+
+displaytext1h:
+ bsf displaytext_high ; Highbit set
+ rcall displaytext1
+ return
+
+displaytext1:
+ movwf textnumber
+ movlw b'10000000'
+ movwf EECON1
+
+ clrf TBLPTRU
+ movlw textpos_pointer_high
+ movwf TBLPTRH
+ movlw textpos_pointer_low ; base address -4 for position table
+ movwf TBLPTRL
+
+ movff textnumber,xA+0
+ movlw d'0'
+ btfsc displaytext_high ; Highbit set?
+ movlw d'1' ; Yes!
+ movwf xA+1 ; Set High Bit
+ movlw d'4' ; times 4 for adress
+ movwf xB+0
+ clrf xB+1
+ call mult16x16 ;xA*xB=xC
+ movf xC+0,W
+ addwf TBLPTRL,F ; set adress, data can be read
+ movf xC+1,W
+ addwfc TBLPTRH,F ; High byte, if required
+
+ TBLRD*+
+ movf TABLAT,W
+ btfsc output_to_postinc_only ; output to postinc only?
+ bra displaytext1_1 ; Yes
+ movff WREG,win_leftx2
+
+displaytext1_1:
+ TBLRD*+
+ movf TABLAT,W
+ btfsc output_to_postinc_only ; output to postinc only?
+ bra displaytext1_2 ; Yes
+ movff WREG,win_top
+
+displaytext1_2:
+ TBLRD*+
+ movf TABLAT,W ; ScaleY
+ sublw d'1' ; -1
+ movff WREG,win_font
+
+ TBLRD*+
+ movff TABLAT,grayvalue ; grayvalue
+
+ clrf textaddress+0
+ clrf textaddress+1
+ clrf TBLPTRL ; Set Pointer for textlength table 0x0100
+ clrf TBLPTRU
+ movlw 0x01
+ movwf TBLPTRH
+ bra displaytext1b
+
+displaytext1a:
+ bcf displaytext_high ; Clear flag
+ ; Get textadress from textlength table
+displaytext1b:
+ TBLRD*+
+ movf TABLAT,W
+ addwf textaddress+0,F
+ movlw d'0'
+ addwfc textaddress+1,F
+ decfsz textnumber,F
+ bra displaytext1b
+
+ btfsc displaytext_high ; Highbit set?
+ bra displaytext1a ; Yes, add 256 loops
+
+displaytext2: ; copies text to wordprocessor
+ clrf TBLPTRU
+
+ movlw text_pointer_low
+ addwf textaddress+0,W
+ movwf TBLPTRL
+ movlw text_pointer_high ; Base address Texts
+ addwfc textaddress+1,W
+ movwf TBLPTRH
+
+ btfss output_to_postinc_only ; output to postinc only?
+ lfsr FSR2,letter ; no!
+
+displaytext2a:
+ TBLRD*+
+ movlw '}' ; Text finished?
+ cpfseq TABLAT
+ bra displaytext3
+ bra display_text_exit
+
+displaytext3:
+ movf TABLAT,W
+ movwf POSTINC2
+
+ TBLRD*+
+ movlw '}' ; Text finished?
+ cpfseq TABLAT
+ bra displaytext4
+ bra display_text_exit
+displaytext4:
+ movf TABLAT,W
+ movwf POSTINC2
+
+ bra displaytext2a
+
+display_text_exit:
+ btfss output_to_postinc_only ; output to postinc only?
+ call word_processor
+ return
diff -r 000000000000 -r 96a35aeda5f2 code_part1/OSTC_code_asm_part1/divemode.asm
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/code_part1/OSTC_code_asm_part1/divemode.asm Tue Jan 12 15:05:59 2010 +0100
@@ -0,0 +1,1544 @@
+
+; OSTC - diving computer code
+; Copyright (C) 2008 HeinrichsWeikamp GbR
+
+; 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 3 of the License, or
+; (at your option) any later version.
+
+; This program is distributed in the hope that it will be useful,
+; but WITHOUT ANY WARRANTY; without even the implied warranty of
+; 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, see .
+
+
+; Mainroutines for divemode
+; written by: Matthias Heinrichs, info@heinrichsweikamp.com
+; written: 10/01/05
+; last updated: 15/05/08
+; known bugs:
+; ToDo:
+
+diveloop:
+ call diveloop_boot ; Boot tasks for all modes
+
+; Startup Tasks for all modes
+ ostc_debug 'R' ; Sends debug-information to screen if debugmode active
+ call PLED_ClearScreen ; clean up OLED
+ call PLED_divemode_mask ; Display mask
+ call PLED_active_gas_divemode ; Display gas, if required
+ call PLED_temp_divemode ; Displays temperature
+
+ btfsc FLAG_apnoe_mode
+ bsf realdive ; Set Realdive flag in Apnoe mode
+
+ btfsc gauge_mode
+ bra diveloop_loop ; Skip in gauge mode
+ btfsc FLAG_apnoe_mode
+ bra diveloop_loop ; Skip in apnoe mode
+
+; Startup Tasks for deco modes
+ call PLED_display_ndl_mask ; display "no stop" if not in gauge or apnoe mode
+
+diveloop_loop: ; The diveloop starts here
+ btfss onesecupdate ; tasks any new second
+ bra diveloop_loop2
+
+ btfsc gauge_mode ; Only in gauge mode
+ bra diveloop_loop1a ; One Second Tasks in Gauge mode
+ btfsc FLAG_apnoe_mode ; Only in apnoe mode
+ bra diveloop_loop1b ; One Second Tasks in Apnoe mode
+ btfsc FLAG_const_ppO2_mode ; only in const_ppO2_mode
+ bra diveloop_loop1c ; One Second Tasks in const_ppO2 mode
+
+; Tasks only for OC modes
+ call check_ppO2 ; check ppO2 and displays warning if required
+ call calc_deko_divemode ; calculate decompression and display result (any two seconds)
+ bra diveloop_loop1x ; Common Tasks
+
+; Tasks only for Gauge mode
+diveloop_loop1a:
+ btfss premenu ; Is the divemode menu active?
+ call PLED_divemins ; display (new) divetime!
+ call timeout_divemode ; dive finished? This routine sets the required flags
+
+ btfsc stopwatch_active ; =1: Show Average Depth instead of Temperature
+ call PLED_stopwatch_show ; Show stopwatch only in Average mode
+
+ btfsc twosecupdate ; two seconds after the last call
+ bra diveloop_loop1a2 ; Common Tasks
+
+ bsf twosecupdate ; Routines used in the "other second"
+ call calc_average_depth ; calculate average depth
+
+ bra diveloop_loop1x ; Common Tasks
+
+diveloop_loop1a2:
+ bcf twosecupdate
+ bra diveloop_loop1x ; Common Tasks
+
+; Tasks only for Apnoe mode
+diveloop_loop1b:
+ call divemode_apnoe_tasks ; 1 sec. Apnoe tasks
+ bra diveloop_loop1x ; Common Tasks
+
+; Tasks only for ppO2 mode
+diveloop_loop1c:
+ call PLED_const_ppO2_value ; display const ppO2 setting in [Bar]
+ call calc_deko_divemode ; calculate decompression and display result (any two seconds)
+ bra diveloop_loop1x ; Common Tasks
+
+; Common Tasks for all modes
+diveloop_loop1x:
+ call timeout_divemode ; dive finished? This routine sets the required flags
+ btfsc low_battery_state ; If battery is low, then...
+ call update_batt_voltage_divemode ; Display Battery Symbol/Voltage!
+ btfsc premenu ; is Menu? displayed?
+ call timeout_premenu_divemode ; No, so check for timeout premenu
+ btfsc menubit ; is the Dive mode menu displayed?
+ call timeout_divemenu ; Yes, so check for timeout divemenu
+ call set_leds_divemode ; Sets warnings, if required. Also Sets buzzer
+ btfsc enter_error_sleep ; Enter Fatal Error Routine?
+ goto fatal_error_sleep ; Yes (In Sleepmode_vxx.asm!)
+
+ btfsc stopwatch_active ; =1: Show Average Depth instead of Temperature
+ call PLED_stopwatch_show ; Show stopwatch only in Average mode
+
+ bcf onesecupdate ; one seconds update done
+
+ GETCUSTOM8 d'38' ; Show seconds (=1?)
+ movwf lo
+ movlw d'1'
+ cpfseq lo ; =1?
+ bra diveloop_loop2 ; No, minutes only
+ bsf update_divetime ; Set Update flag
+
+
+diveloop_loop2:
+ btfss update_divetime ; display new divetime?
+ bra diveloop_loop3 ; No
+ btfsc premenu ; Is the divemode menu active?
+ bra diveloop_loop2a ; Yes
+ call PLED_divemins ; Display (new) divetime!
+ btfsc FLAG_const_ppO2_mode ; only in const_ppO2_mode
+ call PLED_const_ppO2_value ; display const ppO2 setting in [Bar]
+ btfsc ppO2_show_value ; show ppO2?
+ call check_ppO2 ; check ppO2 and displays warning if required
+
+diveloop_loop2a:
+ bcf update_divetime ; clear flag
+
+
+diveloop_loop3:
+ btfss menubit ; Divemode menu active?
+ call test_switches_divemode ; No, Check switches normal
+
+ btfsc menubit ; Divemode menu active?
+ call test_switches_divemode_menu ; Yes, check switches divemode menu
+
+ btfss divemode ; Dive finished?
+ bra end_dive ; Dive finished!
+
+ btfsc pressure_refresh ; new pressure available?
+ call update_divemode1 ; Yes, display new depth
+ bcf pressure_refresh ; until new pressure is available
+
+ btfsc oneminupdate ; one minute tasks
+ call update_divemode60 ; Update clock, etc.
+
+ btfsc store_sample ; store new sample?
+ call store_dive_data ; Store profile data
+
+ btfss menubit ; Sleep only with inactive menu...
+ sleep
+
+ nop
+ bra diveloop_loop ; Loop the divemode
+
+timeout_premenu_divemode:
+ incf timeout_counter3,F ; Yes...
+
+ GETCUSTOM8 d'4' ; loads premenu_timeout into WREG
+ cpfsgt timeout_counter3 ; ... longer then premenu_timeout
+ return ; No!
+
+ bcf premenu ; Yes, so clear "Menu?" and clear pre_menu bit
+ call PLED_menu_clear ; Remove "Menu?"
+ return
+
+divemode_apnoe_tasks: ; 1 sec. Apnoe tasks
+ call PLED_display_apnoe_descent ; Show descent timer
+
+ btfsc divemode2 ; Time running?
+ bra divemode_apnoe_tasks2 ; New descent, reset data if flag is set
+
+ call PLED_display_apnoe_surface
+ incf apnoe_surface_secs,F
+ movlw d'60'
+ cpfseq apnoe_surface_secs
+ bra divemode_apnoe_tasks1
+ clrf apnoe_surface_secs
+ incf apnoe_surface_mins,F
+
+divemode_apnoe_tasks1:
+ bcf FLAG_active_descent ; Clear flag
+ btfsc divemode2 ; Time running?
+ return ; Yes, return
+
+ bsf FLAG_active_descent ; Set Flag
+ return
+
+divemode_apnoe_tasks2:
+ btfss FLAG_active_descent ; Are descending?
+ return ; No, We are at the surface
+ rcall apnoe_calc_maxdepth ; Yes!
+
+divemode_apnoe_tasks3:
+ call PLED_apnoe_clear_surface ; Clear Surface timer
+
+ clrf apnoe_timeout_counter ; Delete timeout
+ clrf apnoe_surface_secs
+ clrf apnoe_surface_mins
+ clrf apnoe_secs
+ clrf apnoe_mins ; Reset Descent time
+ clrf max_pressure+0
+ clrf max_pressure+1 ; Reset Max. Depth
+ bcf FLAG_active_descent ; Clear flag
+ return
+
+apnoe_calc_maxdepth:
+ movff apnoe_max_pressure+0,sub_a+0
+ movff apnoe_max_pressure+1,sub_a+1
+ movff max_pressure+0,sub_b+0
+ movff max_pressure+1,sub_b+1
+ call sub16 ; sub_c = sub_a - sub_b
+ ; apnoe_max_pressure neg_flag=1
+ ; max_pressure<=apnoe_max_pressure -> neg_flag=0
+ btfss neg_flag
+ return
+ ;apnoe_max_pressure threshold (every two seconds)
+
+ ; calculate ppO2 in 0.1Bar (e.g. 150 = 1.50Bar ppO2)
+ movff amb_pressure+0,xA+0
+ movff amb_pressure+1,xA+1
+ movlw LOW d'10'
+ movwf xB+0
+ movlw HIGH d'10'
+ clrf xB+1
+ call div16x16 ; xC=p_amb/10
+ movff xC+0,xA+0
+ movff xC+1,xA+1
+ movff char_I_O2_ratio,xB+0
+ clrf xB+1
+ call mult16x16 ; char_I_O2_ratio * p_amb/10
+ movff xC+0,xA+0
+ movff xC+1,xA+1
+ movlw LOW d'100'
+ movwf xB+0
+ movlw HIGH d'100'
+ clrf xB+1
+ call div16x16 ; xC=(char_I_O2_ratio * p_amb/10)/100
+
+; Copy ppO2 for CNS calculation
+ movff xC+0, char_I_actual_ppO2 ; copy last ppO2 to buffer register
+ btfsc FLAG_const_ppO2_mode ; do in const_ppO2_mode
+ movff char_I_const_ppO2, char_I_actual_ppO2 ; copy last ppO2 to buffer register
+
+; Calculate CNS
+ call main_calc_CNS_fraction ; calculate CNS
+ movlb b'00000001' ; rambank 1 selected
+
+; Check if CNS should be displayed
+ movff char_O_CNS_fraction,lo ; copy into bank1
+ GETCUSTOM8 d'27' ; cns_display_high
+ subwf lo,W
+ btfsc STATUS,C
+ call PLED_display_cns ; Show CNS
+
+; Check for decompression gases if in decomode
+divemode_check_decogases: ; CALLed from Simulator
+ btfss dekostop_active
+ bra reset_decompression_gases ; While in NDL, do not set deompression gas
+; 1. Find active gas with deepest change depth < current depth
+; 2. Set Decogas
+
+ movff rel_pressure+0,xA+0
+ movff rel_pressure+1,xA+1
+ movlw d'100'
+ movwf xB+0
+ clrf xB+1
+ call div16x16 ; compute depth in full m -> result in xC+0
+ clrf lo ; clear depth for comparison
+
+; check gas1
+ read_int_eeprom d'27' ; read flag register
+ btfss EEDATA,0 ; check active flag
+ bra check_decogas2 ; skip inactive gases!
+ read_int_eeprom d'28' ; read gas_change_depth
+ movf xC+0,W ; load depth in m into WREG
+ cpfslt EEDATA ; gas_change_depth > current depth?
+ bra check_decogas2 ; W < EEDATA -> current depth lower then gas_change_depth
+
+ movff EEDATA,lo ; deepest gas_change_depth in lo
+ movlw d'1'
+ movwf hi ; Decogas # in hi (1-5)
+
+check_decogas2:
+ read_int_eeprom d'27' ; read flag register
+ btfss EEDATA,1 ; check active flag
+ bra check_decogas3 ; skip inactive gases!
+ read_int_eeprom d'29' ; read gas_change_depth
+ movf xC+0,W ; load depth in m into WREG
+ cpfslt EEDATA ; gas_change_depth > current depth?
+ bra check_decogas3 ; W < EEDATA -> current depth lower then gas_change_depth
+
+ read_int_eeprom d'29' ; read gas_change_depth
+ movf lo,W ; load current gas_change_depth into WREG
+ cpfsgt EEDATA ; last gas_change_depth > current gas_change_depth ?
+ bra check_decogas3 ; W < lo -> last gas_change_depth > current gas_change_depth
+ movff EEDATA,lo ; deepest gas_change_depth in lo
+ movlw d'2'
+ movwf hi ; Decogas # in hi (1-5)
+
+check_decogas3:
+ read_int_eeprom d'27' ; read flag register
+ btfss EEDATA,2 ; check active flag
+ bra check_decogas4 ; skip inactive gases!
+ read_int_eeprom d'30' ; read gas_change_depth
+ movf xC+0,W ; load depth in m into WREG
+ cpfslt EEDATA ; gas_change_depth > current depth?
+ bra check_decogas4 ; W < EEDATA -> current depth lower then gas_change_depth
+
+ read_int_eeprom d'30' ; read gas_change_depth
+ movf lo,W ; load current gas_change_depth into WREG
+ cpfsgt EEDATA ; last gas_change_depth > current gas_change_depth ?
+ bra check_decogas4 ; W < lo -> last gas_change_depth > current gas_change_depth
+ movff EEDATA,lo ; deepest gas_change_depth in lo
+ movlw d'3'
+ movwf hi ; Decogas # in hi (1-5)
+
+check_decogas4:
+ read_int_eeprom d'27' ; read flag register
+ btfss EEDATA,3 ; check active flag
+ bra check_decogas5 ; skip inactive gases!
+ read_int_eeprom d'31' ; read gas_change_depth
+ movf xC+0,W ; load depth in m into WREG
+ cpfslt EEDATA ; gas_change_depth > current depth?
+ bra check_decogas5 ; W < EEDATA -> current depth lower then gas_change_depth
+
+ read_int_eeprom d'31' ; read gas_change_depth
+ movf lo,W ; load current gas_change_depth into WREG
+ cpfsgt EEDATA ; last gas_change_depth > current gas_change_depth ?
+ bra check_decogas5 ; W < lo -> last gas_change_depth > current gas_change_depth
+ movff EEDATA,lo ; deepest gas_change_depth in lo
+ movlw d'4'
+ movwf hi ; Decogas # in hi (1-5)
+
+check_decogas5:
+ read_int_eeprom d'27' ; read flag register
+ btfss EEDATA,4 ; check active flag
+ bra check_decogas_done ; skip inactive gases!
+ read_int_eeprom d'32' ; read gas_change_depth
+ movf xC+0,W ; load depth in m into WREG
+ cpfslt EEDATA ; gas_change_depth > current depth?
+ bra check_decogas_done ; W < EEDATA -> current depth lower then gas_change_depth
+
+ read_int_eeprom d'32' ; read gas_change_depth
+ movf lo,W ; load current gas_change_depth into WREG
+ cpfsgt EEDATA ; last gas_change_depth > current gas_change_depth ?
+ bra check_decogas_done ; W < lo -> last gas_change_depth > current gas_change_depth
+ movff EEDATA,lo ; deepest gas_change_depth in lo
+ movlw d'5'
+ movwf hi ; Decogas # in hi (1-5)
+
+check_decogas_done:
+ ostc_debug 'E' ; Sends debug-information to screen if debugmode active
+
+ decf hi,F ; Gas 0-4
+ movff lo, char_I_deco_gas_change ; copy change_depth
+
+ movf hi,W ; Gas 0-4
+ mullw d'4'
+ movf PRODL,W
+ addlw d'7' ; = address for He ratio
+ movwf EEADR
+ call read_eeprom ; Read He ratio
+ movff EEDATA,char_I_deco_He_ratio ; And copy into hold register
+
+
+ movf hi,W ; Gas 0-4
+ mullw d'4'
+ movf PRODL,W
+ addlw d'6' ; = address for O2 ratio
+ movwf EEADR
+ call read_eeprom ; Read O2 ratio
+
+ movff char_I_deco_He_ratio, wait_temp ; copy into bank1 register
+ bsf STATUS,C ; Borrow bit
+ movlw d'100' ; 100%
+ subfwb wait_temp,W ; minus He
+ bsf STATUS,C ; Borrow bit
+ subfwb EEDATA,F ; minus O2
+ movff EEDATA, char_I_deco_N2_ratio ; = N2!
+ bra skip_decompression_gases
+
+reset_decompression_gases: ; reset the deco gas while in NDL
+ ostc_debug 'F' ; Sends debug-information to screen if debugmode active
+ clrf lo
+ movff lo, char_I_deco_gas_change ; clear
+ movff lo, char_I_deco_N2_ratio ; clear
+ movff lo, char_I_deco_He_ratio ; clear
+skip_decompression_gases:
+;call PLED_gaschange_DEBUG
+ return
+
+calc_deko_divemode2:
+ bcf twosecupdate
+
+ btfsc gauge_mode ; ignore decompression calculation in gauge mode
+ return
+ btfsc FLAG_apnoe_mode ; ignore decompression calculation in apnoe mode
+ return
+
+ ostc_debug 'B' ; Sends debug-information to screen if debugmode active
+ call divemode_prepare_flags_for_deco
+ call deco_main_calc_hauptroutine ; calc_tissue
+ movlb b'00000001' ; rambank 1 selected
+ ostc_debug 'C' ; Sends debug-information to screen if debugmode active
+
+ movff char_O_deco_status,deco_status ;
+ tstfsz deco_status ; deco_status=0 if decompression calculation done
+ return ; calculation not yet finished!
+
+ movff char_O_array_decodepth+0,wait_temp ; copy ceiling to temp register
+ tstfsz wait_temp ; Ceiling<0m?
+ bra calc_deko_divemode3 ; Yes!
+
+ btfsc dekostop_active
+ call PLED_display_ndl_mask ; Clear deco data, display nostop time
+ bcf dekostop_active ; clear flag
+
+ clrf decodata+0 ; for profile memory
+ movff char_O_nullzeit,decodata+1 ; nostop time
+
+ call PLED_display_ndl ; display no deco limit
+ return
+
+divemode_prepare_flags_for_deco:
+ movff amb_pressure+0,int_I_pres_respiration+0 ; lo and copy result to deco routine
+ movff amb_pressure+1,int_I_pres_respiration+1 ; hi
+ GETCUSTOM8 d'11' ; Saturation multiplier %
+ movwf wait_temp
+ movff wait_temp,char_I_saturation_multiplier
+ GETCUSTOM8 d'12' ; Desaturation multiplier %
+ movwf wait_temp
+ movff wait_temp,char_I_desaturation_multiplier
+ GETCUSTOM8 d'16' ; Deco distance to decostop in 1/10 meter for simulation
+ movwf wait_temp
+ movff wait_temp,char_I_deco_distance
+ GETCUSTOM8 d'29' ; Depth Last Deco in meter for simulation
+ movwf wait_temp
+ movff wait_temp,char_I_depth_last_deco
+ call restart_set_modes_and_flags ; Sets decomode (char_I_deco_model) and flags (again)
+ return
+
+calc_deko_divemode3:
+ btfss dekostop_active
+ call PLED_display_deko_mask ; clear nostop time, display decodata
+ bsf dekostop_active ; Set flag
+
+ movff char_O_array_decodepth+0,decodata+0 ; ceiling
+ movff char_O_array_decotime,decodata+1 ; length of first stop in minues
+
+ call PLED_display_deko ; display decodata
+ return
+
+store_dive_data: ; CF20 seconds gone
+ bcf store_sample ; update only any CF20 seconds
+ bsf update_divetime ; update divemins every CF20 seconds
+
+ call clear_LEDg ; LEDg off
+
+ btfsc header_stored ; Header already stored?
+ bra store_dive_data2 ; Yes, store only profile data
+ bsf header_stored ; Store header
+
+ movff eeprom_address+0, eeprom_header_address+0 ; store startposition
+ movff eeprom_address+1, eeprom_header_address+1 ; store startposition
+
+; shift address for header
+; the header will be stored after the dive
+ incf_eeprom_address d'47' ; Macro, that adds 8Bit to eeprom_address:2 with banking at 0x8000
+
+store_dive_data2:
+ movf rel_pressure+0,W ; store depth with every sample
+ call write_external_eeprom
+ movf rel_pressure+1,W
+ call write_external_eeprom
+
+;First, find out how many bytes will append to this sample....
+ clrf ProfileFlagByte ; clear number of bytes to append
+
+; Check Extented informations
+ decfsz divisor_temperature,W ; Check divisor
+ bra check_extended1
+ movlw d'2' ; Information length
+ addwf ProfileFlagByte,F ; add to ProfileFlagByte
+check_extended1:
+ decfsz divisor_deco,W ; Check divisor
+ bra check_extended2
+ movlw d'2' ; Information length
+ addwf ProfileFlagByte,F ; add to ProfileFlagByte
+check_extended2:
+ decfsz divisor_tank,W ; Check divisor
+ bra check_extended3
+ movlw d'2' ; Information length
+ addwf ProfileFlagByte,F ; add to ProfileFlagByte
+check_extended3:
+ decfsz divisor_ppo2,W ; Check divisor
+ bra check_extended4
+ movlw d'3' ; Information length
+ addwf ProfileFlagByte,F ; add to ProfileFlagByte
+check_extended4:
+ decfsz divisor_deco_debug,W; Check divisor
+ bra check_extended5
+ movlw d'9' ; Information length
+ addwf ProfileFlagByte,F ; add to ProfileFlagByte
+check_extended5:
+ decfsz divisor_nuy2,W ; Check divisor
+ bra check_extended6
+ movlw d'0' ; Information length
+ addwf ProfileFlagByte,F ; add to ProfileFlagByte
+check_extended6:
+
+; Second, check global event flag
+ btfss event_occured ; Check global event flag
+ bra store_dive_data3 ; No Event
+ movlw d'1'
+ addwf ProfileFlagByte,F ; add one byte (The EventByte)
+
+ clrf EventByte ; reset EventByte
+
+ movf AlarmType,W ; Type of Alarm Bit 0-3
+ addwf EventByte,F ; Copy to EventByte Bit 0-3
+ clrf AlarmType ; Reset AlarmType
+
+; Third, check events and add aditional bytes
+ btfss manual_gas_changed ; Check flag
+ bra check_event1
+ movlw d'2' ; Information length
+ addwf ProfileFlagByte,F ; add to ProfileFlagByte
+ bsf EventByte,4 ; Also set Flag in EventByte!
+check_event1:
+ btfss stored_gas_changed ; Check flag
+ bra check_event2
+ movlw d'1' ; Information length
+ addwf ProfileFlagByte,F ; add to ProfileFlagByte
+ bsf EventByte,5 ; Also set Flag in EventByte!
+check_event2:
+ bsf ProfileFlagByte,7 ; Set EventByte Flag in ProfileFlagByte
+
+store_dive_data3:
+ movf ProfileFlagByte,W ; finally, write ProfileFlagByte!
+ call write_external_eeprom
+
+ btfss event_occured ; Check global event flag (again)
+ bra store_dive_data4 ; No Event
+
+; Store the EventByte + additional bytes now
+ movf EventByte,W
+ call write_external_eeprom
+
+ btfss manual_gas_changed ; Check flag
+ bra store_dive_data3a
+ read_int_eeprom d'24' ; % O2 Gas6
+ movf EEDATA,W
+ call write_external_eeprom
+ read_int_eeprom d'25' ; % He Gas6
+ movf EEDATA,W
+ call write_external_eeprom
+
+store_dive_data3a:
+ btfss stored_gas_changed ; Check flag
+ bra store_dive_data3b
+ movf active_gas,W ; Store active gas
+ call write_external_eeprom
+
+store_dive_data3b:
+
+store_dive_data4:
+ bcf event_occured ; Clear the global event flag
+ bcf manual_gas_changed ; Clear all events
+ bcf stored_gas_changed ; Clear all events
+
+; Store extended informations
+ decfsz divisor_temperature,F ; Check divisor
+ bra store_extended1
+ rcall store_dive_temperature
+store_extended1:
+ decfsz divisor_deco,F ; Check divisor
+ bra store_extended2
+ rcall store_dive_decodata
+store_extended2:
+ decfsz divisor_tank,F ; Check divisor
+ bra store_extended3
+ rcall store_dive_tankdata
+store_extended3:
+ decfsz divisor_ppo2,F ; Check divisor
+ bra store_extended4
+ rcall store_dive_ppo2
+store_extended4:
+ decfsz divisor_deco_debug,F; Check divisor
+ bra store_extended5
+ rcall store_dive_decodebug
+store_extended5:
+ decfsz divisor_nuy2,F ; Check divisor
+ bra store_extended6
+ rcall store_dive_nuy2
+store_extended6:
+
+; The next block is required to take care of "store never"
+ btfsc divisor_temperature,7 ; Test highest Bit (Register must have been zero before the "decfsz" command!)
+ clrf divisor_temperature ; And clear register again, so it will never reach zero...
+ btfsc divisor_deco,7 ; Test highest Bit (Register must have been zero before the "decfsz" command!)
+ clrf divisor_deco ; And clear register again, so it will never reach zero...
+ btfsc divisor_tank,7 ; Test highest Bit (Register must have been zero before the "decfsz" command!)
+ clrf divisor_tank ; And clear register again, so it will never reach zero...
+ btfsc divisor_ppo2,7 ; Test highest Bit (Register must have been zero before the "decfsz" command!)
+ clrf divisor_ppo2 ; And clear register again, so it will never reach zero...
+ btfsc divisor_deco_debug,7 ; Test highest Bit (Register must have been zero before the "decfsz" command!)
+ clrf divisor_deco_debug ; And clear register again, so it will never reach zero...
+ btfsc divisor_nuy2,7 ; Test highest Bit (Register must have been zero before the "decfsz" command!)
+ clrf divisor_nuy2 ; And clear register again, so it will never reach zero...
+
+ ostc_debug 'D' ; Sends debug-information to screen if debugmode active
+ return ; Done.
+
+store_dive_nuy2:
+ GETCUSTOM8 d'26'
+ movwf divisor_nuy2 ; Reload divisor from CF
+ return
+
+store_dive_decodebug:
+ movff 0x931,divisor_deco_debug ; Used as temp
+ movf divisor_deco_debug,W ; copy to WREG
+ call write_external_eeprom ; Store in EEPROM
+ movff 0x930,divisor_deco_debug ; Used as temp
+ movf divisor_deco_debug,W ; copy to WREG
+ call write_external_eeprom ; Store in EEPROM
+ movff 0x933,divisor_deco_debug ; Used as temp
+ movf divisor_deco_debug,W ; copy to WREG
+ call write_external_eeprom ; Store in EEPROM
+ movff 0x932,divisor_deco_debug ; Used as temp
+ movf divisor_deco_debug,W ; copy to WREG
+ call write_external_eeprom ; Store in EEPROM
+ movff 0x935,divisor_deco_debug ; Used as temp
+ movf divisor_deco_debug,W ; copy to WREG
+ call write_external_eeprom ; Store in EEPROM
+ movff 0x934,divisor_deco_debug ; Used as temp
+ movf divisor_deco_debug,W ; copy to WREG
+ call write_external_eeprom ; Store in EEPROM
+ movff 0x937,divisor_deco_debug ; Used as temp
+ movf divisor_deco_debug,W ; copy to WREG
+ call write_external_eeprom ; Store in EEPROM
+ movff 0x936,divisor_deco_debug ; Used as temp
+ movf divisor_deco_debug,W ; copy to WREG
+ call write_external_eeprom ; Store in EEPROM
+ movff 0x938,divisor_deco_debug ; Used as temp
+ movf divisor_deco_debug,W ; copy to WREG
+ call write_external_eeprom ; Store in EEPROM
+ GETCUSTOM8 d'25'
+ movwf divisor_deco_debug ; Reload divisor from CF
+ return
+
+store_dive_ppo2:
+ movlw 0x00 ; Dummy
+ call write_external_eeprom
+ movlw 0x00 ; Dummy
+ call write_external_eeprom
+ movlw 0x00 ; Dummy
+ call write_external_eeprom
+ GETCUSTOM8 d'24'
+ movwf divisor_ppo2 ; Reload divisor from CF
+ return
+
+store_dive_tankdata:
+ movlw d'0' ; Dummy Tank1
+ call write_external_eeprom
+ movlw d'0' ; Dummy Tank2
+ call write_external_eeprom
+ GETCUSTOM8 d'23'
+ movwf divisor_tank ; Reload divisor from CF
+ return
+
+store_dive_decodata:
+ movf decodata+0,W ; =0:no stop dive, if in deco mode: ceiling in m
+ call write_external_eeprom
+ movf decodata+1,W ; no stop time of length of first stop
+ call write_external_eeprom
+ GETCUSTOM8 d'22'
+ movwf divisor_deco ; Reload divisor from CF
+ return
+
+store_dive_temperature:
+ movf temperature+0,W ; append temperature to current sample!
+ call write_external_eeprom
+ movf temperature+1,W
+ call write_external_eeprom
+ GETCUSTOM8 d'21'
+ movwf divisor_temperature ; Reload divisor from CF
+ return
+
+calc_velocity: ; called every two seconds
+ btfss divemode
+ bra do_not_display_velocity ; display velocity only in divemode
+
+calc_velocity2:
+ movff amb_pressure+0,sub_a+0
+ movff amb_pressure+1,sub_a+1
+ movff last_pressure+0,sub_b+0
+ movff last_pressure+1,sub_b+1
+ movff amb_pressure+0,last_pressure+0 ; store old value for velocity
+ movff amb_pressure+1,last_pressure+1
+
+ call sub16 ; sub_c = amb_pressure - last_pressure
+
+ movff sub_c+0,xA+0
+ movff sub_c+1,xA+1
+ movlw d'39' ;77 when called every second....
+ movwf xB+0
+ clrf xB+1
+ call mult16x16 ; differential pressure in mBar*77...
+ movff xC+0,divA+0
+ movff xC+1,divA+1
+ movlw d'7'
+ movwf divB
+ call div16 ; devided by 2^7 equals velocity in m/min
+
+ movlw d'99'
+ cpfsgt divA
+ bra calc_velocity3
+ movwf divA ; divA=99
+
+calc_velocity3:
+
+ GETCUSTOM8 d'5' ; threshold for display vertical velocity
+ subwf divA+0,W ;
+
+ btfss STATUS,C
+ bra do_not_display_velocity
+
+update_velocity:
+ bsf display_velocity
+ call PLED_display_velocity
+ return
+
+do_not_display_velocity:
+ btfss display_velocity ; Velocity was not displayed, do not delete
+ return
+
+ bcf display_velocity ; Velocity was displayed, delete velocity now
+ call PLED_display_velocity_clear
+ return
+
+check_ppO2: ; check current ppO2 and display warning if required
+ btfsc FLAG_const_ppO2_mode ; ignore in ppO2 mode....
+ return
+
+ movff amb_pressure+0,xA+0
+ movff amb_pressure+1,xA+1
+ movlw d'10'
+ movwf xB+0
+ clrf xB+1
+ call div16x16 ; xC=p_amb/10
+ movff xC+0,xA+0
+ movff xC+1,xA+1
+ movff char_I_O2_ratio,xB+0
+ clrf xB+1
+ call mult16x16 ; char_I_O2_ratio * p_amb/10
+
+; Check if ppO2 should be displayed
+ movff xC+0,sub_b+0
+ movff xC+1,sub_b+1
+ GETCUSTOM8 d'19' ; ppo2_display_high
+ mullw d'100' ; ppo2_display_high*100
+ movff PRODL,sub_a+0
+ movff PRODH,sub_a+1
+ call sub16
+ bcf ppO2_show_value ; clear flag
+ btfsc neg_flag
+ bsf ppO2_show_value ; set flag if required
+
+;check if we are within our warning thresholds!
+ bcf ppO2_warn_value ; clear flag
+ movff xC+0,sub_b+0
+ movff xC+1,sub_b+1
+ GETCUSTOM8 d'18' ; ppo2_warning_high
+ mullw d'100' ; ppo2_warning_high*100
+ movff PRODL,sub_a+0
+ movff PRODH,sub_a+1
+ call sub16
+ btfss neg_flag
+ bra check_ppO2_0 ; Not too high
+
+ bsf ppO2_warn_value ; set flag
+ movlw d'5' ; Type of Alarm
+ movwf AlarmType ; Copy to Alarm Register
+ bsf event_occured ; Set Event Flag
+
+check_ppO2_0:
+ movff xC+0,sub_b+0
+ movff xC+1,sub_b+1
+ GETCUSTOM8 d'17' ; ppo2_warning_low
+ mullw d'100' ; ppo2_warning_low*100
+ movff PRODL,sub_a+0
+ movff PRODH,sub_a+1
+ call sub16
+ btfsc neg_flag
+ bra check_ppO2_1 ; Not too low
+
+ bsf ppO2_warn_value ; set flag
+ bsf ppO2_show_value ; show ppO2 if below threshold!
+ movlw d'4' ; Type of Alarm
+ movwf AlarmType ; Copy to Alarm Register
+ bsf event_occured ; Set Event Flag
+
+check_ppO2_1:
+ btfsc ppO2_show_value ; show value?
+ bra check_ppO2_2 ; yes!
+
+ btfss ppO2_display_active ; is the value displayed?
+ bra check_ppO2_3 ; No, so clear not required
+
+ call PLED_show_ppO2_clear; Clear ppO2 value
+ bcf ppO2_display_active ; clear flag
+ bra check_ppO2_3 ; done
+
+check_ppO2_2:
+ call PLED_show_ppO2 ; Display ppO2 (stored in xC)
+ bsf ppO2_display_active ; Set flag
+
+check_ppO2_3:
+ return ; done
+
+
+calculate_noflytime:
+ ; calculate nofly time
+ movff int_O_desaturation_time+0,xA+0
+ movff int_O_desaturation_time+1,xA+1
+ tstfsz xA+0 ; Desat=0?
+ bra calculate_noflytime2
+ tstfsz xA+1 ; Desat=0?
+ bra calculate_noflytime2
+ ; Desaturation time = zero
+ movlw d'1'
+ movwf nofly_time+0 ; Clear nofly time
+ clrf nofly_time+1 ; Clear nofly time
+ bcf nofly_active ; Clear flag
+ return
+
+calculate_noflytime2:
+ movff xA+0,int_I_temp+0
+ movff xA+1,int_I_temp+1
+ GETCUSTOM8 .13 ; nofly_time_ratio
+ movwf xB+0
+ movff xB,char_I_temp
+ ostc_debug 'K' ; Sends debug-information to screen if debugmode active
+ call main_calc_percentage
+ movlb b'00000001' ; select ram bank 1
+ ostc_debug 'L' ; Sends debug-information to screen if debugmode active
+ movff int_I_temp+0,xA+0
+ movff int_I_temp+1,xA+1
+ tstfsz xA+0 ; Desat=0?
+ bra calculate_noflytime_2_final
+ tstfsz xA+1 ; Desat=0?
+ bra calculate_noflytime_2_final
+ ; noflytime = zero
+ movlw d'1'
+ movwf nofly_time+0 ; Clear nofly time
+ clrf nofly_time+1 ; Clear nofly time
+ bcf nofly_active ; Clear flag
+ return
+calculate_noflytime_2_final:
+ movff xA+0,nofly_time+0
+ movff xA+1,nofly_time+1
+ bsf nofly_active ; Set flag
+ return
+
+end_dive:
+ btfss realdive ; dive longer then one minute
+ goto end_dive_common ; No, discard everything
+
+ ; Dive finished (and longer then one minute or Apnoe timeout occured)
+
+ btfsc FLAG_apnoe_mode ; Calc max. depth (again) for very short apnoe dives
+ rcall apnoe_calc_maxdepth
+
+ ; calculate desaturation time
+ movff last_surfpressure_30min+0,int_I_pres_respiration+0 ; copy surface air pressure to deco routine
+ movff last_surfpressure_30min+1,int_I_pres_respiration+1 ; 30min old values
+
+ GETCUSTOM8 d'12' ; Desaturation multiplier %
+ movwf wait_temp
+ movff wait_temp,char_I_desaturation_multiplier
+
+ ostc_debug 'G' ; Sends debug-information to screen if debugmode active
+ call deco_main_calc_desaturation_time ; calculate desaturation time
+ movlb b'00000001' ; select ram bank 1
+ rcall calculate_noflytime ; Calc NoFly time
+ ostc_debug 'H' ; Sends debug-information to screen if debugmode active
+ ; store header and ...
+ movlw 0xFD ; .... End-of-Profile Bytes
+ call write_external_eeprom
+ movlw 0xFD
+ call write_external_eeprom
+ movlw 0xFE ; This positon will be overwritten for the next profile
+ call write_external_eeprom ; and is required to find the newest dive after a firmware reset
+
+ movff eeprom_header_address+0, eeprom_address+0 ; set header adress
+ movff eeprom_header_address+1, eeprom_address+1 ; write header
+
+ movlw 0xFA ; Header start
+ call write_external_eeprom
+ movlw 0xFA
+ call write_external_eeprom
+ movlw logbook_profile_version ; Defined in definitions_vxyy.asm
+ call write_external_eeprom
+ movf month,W ; Date
+ call write_external_eeprom
+ movf day,W
+ call write_external_eeprom
+ movf year,W
+ call write_external_eeprom
+ movf hours,W ; End of dive time
+ call write_external_eeprom
+ movf mins,W
+ call write_external_eeprom
+
+ btfss FLAG_apnoe_mode ; Store apnoe max or normal max (Which is only max from the last descent)
+ bra end_dive1 ; Store normal depth
+
+ movff apnoe_max_pressure+0,lo
+ movff apnoe_max_pressure+1,hi
+ call adjust_depth_with_salinity ; computes salinity setting into lo:hi [mBar]
+ movff lo,apnoe_max_pressure+0
+ movff hi,apnoe_max_pressure+1
+
+ movf apnoe_max_pressure+0,W ; Max. depth
+ call write_external_eeprom
+ movf apnoe_max_pressure+1,W
+ call write_external_eeprom
+ bra end_dive2 ; skip
+
+end_dive1:
+ movff max_pressure+0,lo
+ movff max_pressure+1,hi
+ call adjust_depth_with_salinity ; computes salinity setting into lo:hi [mBar]
+ movff lo,max_pressure+0
+ movff hi,max_pressure+1
+
+ movf max_pressure+0,W ; Max. depth
+ call write_external_eeprom
+ movf max_pressure+1,W
+ call write_external_eeprom
+
+end_dive2:
+ movf divemins+0,W ; divetime minutes
+ call write_external_eeprom
+ movf divemins+1,W
+ call write_external_eeprom
+ movf divesecs,W ; divetime seconds
+ call write_external_eeprom
+ movf mintemp+0,W ; minimum temperature
+ call write_external_eeprom
+ movf mintemp+1,W
+ call write_external_eeprom
+ movf last_surfpressure_30min+0,W ; airpressure before dive
+ call write_external_eeprom
+ movf last_surfpressure_30min+1,W
+ call write_external_eeprom
+ movff int_O_desaturation_time+0,lo ;
+ movff int_O_desaturation_time+1,hi
+ movf lo,W ; desaturation time in minutes
+ call write_external_eeprom
+ movf hi,W ;
+ call write_external_eeprom
+
+ ; Gases....
+ read_int_eeprom d'6' ; Read byte (stored in EEDATA)
+ movf EEDATA,W
+ call write_external_eeprom
+ read_int_eeprom d'7' ; Read byte (stored in EEDATA)
+ movf EEDATA,W
+ call write_external_eeprom
+
+ read_int_eeprom d'10' ; Read byte (stored in EEDATA)
+ movf EEDATA,W
+ call write_external_eeprom
+ read_int_eeprom d'11' ; Read byte (stored in EEDATA)
+ movf EEDATA,W
+ call write_external_eeprom
+
+ read_int_eeprom d'14' ; Read byte (stored in EEDATA)
+ movf EEDATA,W
+ call write_external_eeprom
+ read_int_eeprom d'15' ; Read byte (stored in EEDATA)
+ movf EEDATA,W
+ call write_external_eeprom
+
+ read_int_eeprom d'18' ; Read byte (stored in EEDATA)
+ movf EEDATA,W
+ call write_external_eeprom
+ read_int_eeprom d'19' ; Read byte (stored in EEDATA)
+ movf EEDATA,W
+ call write_external_eeprom
+
+ read_int_eeprom d'22' ; Read byte (stored in EEDATA)
+ movf EEDATA,W
+ call write_external_eeprom
+ read_int_eeprom d'23' ; Read byte (stored in EEDATA)
+ movf EEDATA,W
+ call write_external_eeprom
+
+ read_int_eeprom d'24' ; % O2 Gas6
+ movf EEDATA,W
+ call write_external_eeprom
+ read_int_eeprom d'25' ; % He Gas6
+ movf EEDATA,W
+ call write_external_eeprom
+ read_int_eeprom d'33' ; start gas
+ movf EEDATA,W
+ call write_external_eeprom
+
+ movlw softwareversion_x ; Firmware version
+ call write_external_eeprom
+ movlw softwareversion_y
+ call write_external_eeprom
+ movf batt_voltage+0,W ; Battery voltage
+ call write_external_eeprom
+ movf batt_voltage+1,W
+ call write_external_eeprom
+
+ GETCUSTOM8 d'20' ; sampling rate in WREG
+ btfsc FLAG_apnoe_mode ; Apnoe mode?
+ movlw d'1' ; Apnoe sampling rate
+ call write_external_eeprom
+
+ movlw d'2' ; information size temperature
+ movwf temp1 ; copy to bits 0-3
+ swapf temp1,F ; swap nibbels 0-3 with 4-7
+ GETCUSTOM8 d'21' ; Divisor temperature
+ addwf temp1,W ; copy to bits 0-3, result in WREG
+ call write_external_eeprom
+
+ movlw d'2' ; information size deco
+ movwf temp1 ; copy to bits 0-3
+ swapf temp1,F ; swap nibbels 0-3 with 4-7
+ GETCUSTOM8 d'22' ; Divisor deco
+ addwf temp1,W ; copy to bits 0-3, result in WREG
+ call write_external_eeprom
+
+ movlw d'2' ; information size tank
+ movwf temp1 ; copy to bits 0-3
+ swapf temp1,F ; swap nibbels 0-3 with 4-7
+ GETCUSTOM8 d'23' ; Divisor Tank
+ addwf temp1,W ; copy to bits 0-3, result in WREG
+ call write_external_eeprom
+
+ movlw d'3' ; information size pp02
+ movwf temp1 ; copy to bits 0-3
+ swapf temp1,F ; swap nibbels 0-3 with 4-7
+ GETCUSTOM8 d'24' ; Divisor pp02
+ addwf temp1,W ; copy to bits 0-3, result in WREG
+ call write_external_eeprom
+
+ movlw d'9' ; information size Decodebug
+ movwf temp1 ; copy to bits 0-3
+ swapf temp1,F ; swap nibbels 0-3 with 4-7
+ GETCUSTOM8 d'25' ; Divisor Decodebug
+ addwf temp1,W ; copy to bits 0-3, result in WREG
+ call write_external_eeprom
+
+ movlw d'0' ; information size nuy2
+ movwf temp1 ; copy to bits 0-3
+ swapf temp1,F ; swap nibbels 0-3 with 4-7
+ GETCUSTOM8 d'26' ; Divisor nuy2
+ addwf temp1,W ; copy to bits 0-3, result in WREG
+ call write_external_eeprom
+
+ read_int_eeprom d'26' ; Read Salinity from EEPROM
+ movf EEDATA,W
+ call write_external_eeprom ; Store Salinity to Dive
+
+ movlw d'0' ; Spare
+ call write_external_eeprom
+
+ movlw 0xFB ; Header stop
+ call write_external_eeprom
+ movlw 0xFB
+ call write_external_eeprom
+
+ ; Increase total dive counter
+ read_int_eeprom d'2' ; Read byte (stored in EEDATA)
+ movff EEDATA,temp1 ; Low byte
+ read_int_eeprom d'3' ; Read byte (stored in EEDATA)
+ movff EEDATA,temp2 ; high byte
+ bcf STATUS,C
+ movlw d'1'
+ addwf temp1
+ movlw d'0'
+ addwfc temp2
+ movff temp1,EEDATA
+ write_int_eeprom d'2' ; write byte stored in EEDATA
+ movff temp2,EEDATA
+ write_int_eeprom d'3' ; write byte stored in EEDATA
+
+ GETCUSTOM15 .28 ; Logbook Offset -> lo, hi
+ tstfsz lo ; lo=0?
+ bra change_logbook_offset1 ; No, adjust offset
+ tstfsz hi ; hi=0?
+ bra change_logbook_offset1 ; No, adjust offset
+ bra change_logbook_offset2 ; lo=0 and hi=0 -> skip Offset routine
+change_logbook_offset1:
+ movlw d'1'
+ addwf lo
+ movlw d'0'
+ addwfc hi
+ movlw d'112' ; CF28 *4 Bytes...
+ addlw 0x82
+ movwf EEADR
+ movff lo,EEDATA
+ call write_eeprom ; Lowbyte
+ movlw d'112' ; CF28 *4 Bytes...
+ addlw 0x83
+ movwf EEADR
+ movff hi,EEDATA
+ call write_eeprom ; Highbyte
+
+change_logbook_offset2:
+ bcf simulatormode_active ; if we were in simulator mode
+ call clear_LEDusb
+
+end_dive_common:
+ btfsc restore_deco_data ; Restore decodata?
+ call simulator_restore_tissue_data ; Yes!
+
+ call deco_main_gradient_array
+ movlb b'00000001' ; select ram bank 1
+
+ clrf surface_interval+0
+ clrf surface_interval+1 ; Clear surface interval timer
+
+ goto surfloop ; and return to surfaceloop
+
+timeout_divemode:
+ btfss realdive ; Dive longer then one minute
+ return
+
+ btfsc FLAG_apnoe_mode ; In Apnoe mode?
+ bra timeout_divemode2 ; Yes, use CF30 [min] for timeout
+
+ btfsc simulatormode_active ; In Simulator mode?
+ bra timeout_divemode3 ; Yes, use fixed 5 seconds timeout
+
+ bcf divemode
+ incf timeout_counter,F
+ GETCUSTOM8 d'2' ; diveloop_timeout
+ addlw d'2' ; adds two seconds in case timout=zero!
+ btfsc STATUS,C ; > 255?
+ movlw d'255' ; Set to 255...
+ decf WREG,F ; Limit to 254
+ cpfsgt timeout_counter
+ bsf divemode
+ return
+
+timeout_divemode2:
+ incf timeout_counter,F ; seconds...
+ movlw d'60'
+ cpfseq timeout_counter ; timeout_counter=60?
+ return ; No.
+
+ clrf timeout_counter
+ bcf divemode
+ incf apnoe_timeout_counter,F
+ GETCUSTOM8 d'30' ; apnoe timeout [min]
+ cpfseq apnoe_timeout_counter
+ bsf divemode
+ return
+
+timeout_divemode3:
+ bcf divemode
+ incf timeout_counter,F
+ movlw d'5' ; Fixed timeout of 5 seconds
+ cpfsgt timeout_counter
+ bsf divemode
+ return
+
+update_divemode1: ; update any second
+ call set_dive_modes ; tests if depth>threshold
+
+ btfsc divemode
+ call set_max_depth ; update max. depth if required
+
+ btfsc divemode
+ call set_min_temp ; store min. temp if required
+
+ bcf temp_changed ; Display temperature?
+ movf temperature+0,W
+ cpfseq last_temperature+0
+ bsf temp_changed ; Yes
+ movf temperature+1,W
+ cpfseq last_temperature+1
+ bsf temp_changed ; Yes
+ btfsc temp_changed
+ call PLED_temp_divemode ; Displays temperature
+
+ bcf pres_changed ; Display new depth?
+ movf amb_pressure+0,W
+ cpfseq last_pressure+0
+ bsf pres_changed ; Yes
+ movf amb_pressure+1,W
+ cpfseq last_pressure+1
+ bsf pres_changed ; Yes
+
+ btfsc simulatormode_active ; always update depth when in simulator mode
+ bsf pres_changed
+
+ btfsc pres_changed
+ call PLED_depth ; Displays new depth
+ return
+
+update_divemode60: ; update any minute
+ call get_battery_voltage ; gets battery voltage
+ call set_powersafe ; red LED blinking if battery is low
+ call PLED_max_pressure ; No, use normal max. depth
+ call check_temp_extrema ; check for new temperature extremas
+ bcf oneminupdate
+ return
+
+set_max_depth:
+ movff max_pressure+0,sub_a+0
+ movff max_pressure+1,sub_a+1
+ movff rel_pressure+0,sub_b+0
+ movff rel_pressure+1,sub_b+1
+ call sub16 ; sub_c = sub_a - sub_b
+ ; max_pressure neg_flag=1
+ ; rel_pressure<=max_pressure -> neg_flag=0
+ btfss neg_flag
+ return
+ ;max_pressure neg_flag=1
+ ; T<=mintemp -> neg_flag=0
+ btfsc neg_flag
+ return
+ ;mintemp>=T
+ movff temperature+0,mintemp+0
+ movff temperature+1,mintemp+1
+ return
+
+set_dive_modes:
+ bcf divemode2 ; Stop time
+
+ GETCUSTOM8 .0 ; loads dive_threshold in WREG
+ movwf sub_a+0 ; dive_treshold is in cm
+ clrf sub_a+1
+
+ movff rel_pressure+0,sub_b+0
+ movff rel_pressure+1,sub_b+1
+
+ call sub16 ; sub_c = sub_a - sub_b
+
+ btfss neg_flag
+ bra set_dive_modes2 ; too shallow (rel_pressure this was no real dive
+ return
+
+set_powersafe:
+ btfsc low_battery_state ; battery warning alread active?
+ bra set_powersafe2 ; Yes, but is it still required?
+ ; battery voltage in mV (value*256+Lowbyte=actual treshold)
+ movlw d'12' ; 3,328V
+ cpfsgt batt_voltage+1
+ bra set_powersafe1
+ return
+
+set_powersafe1:
+ movlw d'7' ; Type of Alarm (Battery Low)
+ movwf AlarmType ; Copy to Alarm Register
+ bsf event_occured ; Set Event Flag
+ bsf low_battery_state ; set flag for battery warning
+ return ; return
+
+set_powersafe2:
+ movlw d'13' ; 3,584V
+ cpfsgt batt_voltage+1
+ bra set_powersafe1 ; Still to low
+ bcf low_battery_state ; clear flag for battery warning mode
+ return
+
+calc_average_depth:
+ ; 1. Add new 2xdepth to the Sum of depths registers
+ movff rel_pressure+0,b0_lo
+ movff rel_pressure+1,b0_hi
+
+ movf b0_lo,w
+ addwf average_depth_hold+0,F
+ movf b0_hi,w
+ addwfc average_depth_hold+1,F
+ movlw d'0'
+ addwfc average_depth_hold+2,F
+ addwfc average_depth_hold+3,F ; Will work up to 9999mBar*60*60*24=863913600mBar
+
+ movf b0_lo,w
+ addwf average_depth_hold+0,F
+ movf b0_hi,w
+ addwfc average_depth_hold+1,F
+ movlw d'0'
+ addwfc average_depth_hold+2,F
+ addwfc average_depth_hold+3,F ; Will work up to 9999mBar*60*60*24=863913600mBar
+
+ ; 2. Compute Average Depth on base of average_divesecs:2
+
+ movff average_divesecs+0,xB+0
+ movff average_divesecs+1,xB+1 ; Copy
+ movff average_depth_hold+0,xC+0
+ movff average_depth_hold+1,xC+1
+ movff average_depth_hold+2,xC+2
+ movff average_depth_hold+3,xC+3
+
+ call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder
+ movff xC+0,avr_rel_pressure+0
+ movff xC+1,avr_rel_pressure+1
+ return
+
+
+diveloop_boot:
+ ostc_debug 'Q' ; Sends debug-information to screen if debugmode active
+ clrf max_pressure+0 ; clear some variables
+ clrf max_pressure+1
+
+ clrf avr_rel_pressure+0
+ clrf avr_rel_pressure+1
+
+ call PLED_brightness_low
+ read_int_eeprom d'90' ; Brightness offset? (Dim>0, Normal = 0)
+ movlw d'0'
+ cpfsgt EEDATA
+ call PLED_brightness_full
+
+ clrf average_depth_hold+0
+ clrf average_depth_hold+1
+ clrf average_depth_hold+2
+ clrf average_depth_hold+3 ; Clear average depth register
+ movlw d'1'
+ movwf average_divesecs+0
+ clrf average_divesecs+1
+
+ movlw d'1'
+ movwf apnoe_max_pressure+0
+ clrf apnoe_max_pressure+1
+ clrf apnoe_surface_mins
+ clrf apnoe_surface_secs
+ clrf apnoe_mins
+ clrf apnoe_secs
+ clrf divemins+0
+ clrf divemins+1
+ clrf divesecs
+ clrf samplesecs
+ clrf apnoe_timeout_counter ; timeout in minutes
+ clrf timeout_counter ; takes care of the timeout
+ clrf timeout_counter2 ; Here: counts to six, then store deco data and temperature
+ clrf AlarmType ; Clear all alarms
+ bcf event_occured ; clear flag
+ bcf depth_greater_100m ; clear flag
+ setf last_diluent ; to be displayed after first calculation (range: 0 to 100 [%])
+ clrf char_last_pointer
+ bcf dekostop_active
+ call get_free_EEPROM_location ; get last position in external EEPROM, may be up to 2 secs!
+
+ movff last_surfpressure_30min+1,int_I_pres_surface+1 ; HIGH copy surfacepressure to deco routine
+ movff last_surfpressure_30min+0,int_I_pres_surface+0 ; LOW copy surfacepressure to deco routine
+ movff temperature+0,mintemp+0 ; Reset Min-Temp registers
+ movff temperature+1,mintemp+1 ; Reset Min-Temp registers
+
+ clrf wait_temp ; Used to clear Bankx registers
+ movff wait_temp,char_O_GF_low_pointer
+ movff wait_temp,char_O_actual_pointer
+ lfsr FSR0,0x250
+ movlw 0x20
+ movwf wait_temp
+clear_deco_lists: ; Clear Deco list
+ clrf POSTINC0
+ decfsz wait_temp,F
+ bra clear_deco_lists
+ lfsr FSR0,0x270
+ movlw 0x20
+ movwf wait_temp
+set_no_forced_stops: ; Init Deco list
+ movlw 0x01
+ movwf POSTINC0
+ decfsz wait_temp,F
+ bra set_no_forced_stops
+ lfsr FSR0,0x290 ; clear int_O_calc_tissue_call_counter (DEBUG)
+ clrf POSTINC0
+ clrf POSTINC0
+
+; Load GF values into RAM
+ GETCUSTOM8 d'32' ; GF low
+ movff EEDATA,char_I_GF_Lo_percentage
+ GETCUSTOM8 d'33' ; GF high
+ movff EEDATA,char_I_GF_Hi_percentage
+
+; Start with active Stopwatch?
+ bsf stopwatch_active
+ GETCUSTOM8 d'41' ; =1: Start with active Stopwatch
+ movwf lo
+ movlw d'1'
+ cpfseq lo ; CF41=1?
+ bcf stopwatch_active ; No!
+
+; Init profile recording parameters
+ GETCUSTOM8 d'20' ; sample rate
+ movwf samplesecs_value ; to avoid EEPROM access in the ISR
+ GETCUSTOM8 d'21'
+ movwf divisor_temperature ; load divisors for profile storage
+ GETCUSTOM8 d'22'
+ movwf divisor_deco
+ GETCUSTOM8 d'23'
+ movwf divisor_tank
+ GETCUSTOM8 d'24'
+ movwf divisor_ppo2
+ GETCUSTOM8 d'25'
+ movwf divisor_deco_debug
+ GETCUSTOM8 d'26'
+ movwf divisor_nuy2
+
+ btfss FLAG_apnoe_mode ; In Apnoe mode?
+ bra divemode1
+; Overwrite some parameters in Apnoe mode....
+ movlw d'1'
+ movwf samplesecs_value ; to avoid EEPROM access in the ISR
+
+divemode1:
+ read_int_eeprom d'36' ; Read mix 1 ppO2
+ btfsc FLAG_const_ppO2_mode
+ movff EEDATA,char_I_const_ppO2 ; Set ppO2 setpoint if in ppO2 mode
+
+ call clear_LEDnofly ; Clear flags
+ bcf low_battery_state ; clear flag for battery warning mode
+ bcf header_stored
+ bcf premenu
+ bcf realdive
+ bsf update_divetime ; set flag
+ btfss simulatormode_active ; do not disable in simulator mode!
+ call disable_rs232 ; Disable RS232 unless in external O2 Sensor mode
+
+ read_int_eeprom d'33' ; Read byte (stored in EEDATA)
+ movff EEDATA,active_gas ; Read start gas (1-5)
+
+; Read Start Gas and configure char_I_He_ratio, char_I_O2_ratio and char_I_N2_ratio
+ decf active_gas,W ; Gas 0-4
+ mullw d'4'
+ movf PRODL,W
+ addlw d'7' ; = address for He ratio
+ movwf EEADR
+ call read_eeprom ; Read He ratio
+ movff EEDATA,char_I_He_ratio ; And copy into hold register
+ decf active_gas,W ; Gas 0-4
+ mullw d'4'
+ movf PRODL,W
+ addlw d'6' ; = address for O2 ratio
+ movwf EEADR
+ call read_eeprom ; Read O2 ratio
+ movff EEDATA, char_I_O2_ratio ; O2 ratio
+ movff char_I_He_ratio, wait_temp ; copy into bank1 register
+ bsf STATUS,C ; Borrow bit
+ movlw d'100' ; 100%
+ subfwb wait_temp,W ; minus He
+ bsf STATUS,C ; Borrow bit
+ subfwb EEDATA,F ; minus O2
+ movff EEDATA, char_I_N2_ratio ; = N2!
+
+; New in 1.09 - DecoGas can be configured to achieve exact decompression proposal
+ ; required variables
+ ; These values are set when the OSTC is in decompression mode - will be done in routine "check_decogas"
+ ; char_I_deco_gas_change; ; next gas change in meter
+ ; char_I_deco_N2_ratio; ; next gas N2
+ ; char_I_deco_He_ratio; ; next gas He
+ clrf lo
+ movff lo, char_I_deco_gas_change ; clear
+ movff lo, char_I_deco_N2_ratio ; clear
+ movff lo, char_I_deco_He_ratio ; clear
+ bcf multi_gf_display ; Do not display the multi-gf table screen
+ return
\ No newline at end of file
diff -r 000000000000 -r 96a35aeda5f2 code_part1/OSTC_code_asm_part1/divemode_menu.asm
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/code_part1/OSTC_code_asm_part1/divemode_menu.asm Tue Jan 12 15:05:59 2010 +0100
@@ -0,0 +1,755 @@
+
+; OSTC - diving computer code
+; Copyright (C) 2008 HeinrichsWeikamp GbR
+
+; 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 3 of the License, or
+; (at your option) any later version.
+
+; This program is distributed in the hope that it will be useful,
+; but WITHOUT ANY WARRANTY; without even the implied warranty of
+; 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, see .
+
+
+; Underwater Menu (Set Gas, Decoplan, etc.)
+; written by: Matthias Heinrichs, info@heinrichsweikamp.com
+; written: 11/11/05
+; last updated: 090305
+; known bugs:
+; ToDo:
+
+
+test_switches_divemode:
+ ; checks switches in divemode
+ btfsc switch_left
+ bra test_switches_divemode2
+
+ btfss switch_right
+ return
+
+ bcf switch_left ; Left button pressed!
+ bcf switch_right
+
+ bcf select_bailoutgas ; Clear Flag for Bailout list
+ bsf premenu ; Set Flag for premenu
+ bcf menubit
+ clrf timeout_counter3 ; timeout_divemenu
+
+ btfsc FLAG_apnoe_mode ; In Apnoe mode?
+ bra test_switches_divemode1 ; Yes!
+
+test_switches_divemode0:
+ WIN_INVERT .1
+ DISPLAYTEXT .4 ;Menu?
+ WIN_INVERT .0
+ return
+
+test_switches_divemode1:
+ DISPLAYTEXT .141 ;Quit?
+ return
+
+test_switches_divemode2:
+ bcf switch_left ; Also reactivate left button if there was a right press without prior left press
+ bcf switch_right ; enable right button again
+
+ btfss premenu
+ bra set_marker ; No Pre-Menu displayed -> Set Markerflag!
+
+ btfss FLAG_apnoe_mode ; In Apnoe mode?
+ bra test_switches_divemode2a; No!
+
+ ; Yes, so quit Apnoe mode at once...
+ bcf divemode ; Clear Divemode flag...
+ bcf premenu ; clear premenu flag
+ return
+
+test_switches_divemode2a:
+ bsf menubit ; Enter Divemode-Menu!
+ bcf premenu ; clear premenu flag
+ call PLED_clear_divemode_menu ; Clear dive mode menu area
+ call PLED_divemode_menu_mask_first ; Write Divemode menu1 mask
+ bcf display_set_simulator ; Clear Simulator-Menu flag
+ bcf divemode_menu_page ; Start in Menu Page one
+ movlw d'1'
+ movwf menupos ; reset cursor in divemode menu
+ call PLED_divemenu_cursor ; show cursor
+ bcf switch_right
+ bcf switch_left ; Left button pressed!
+ return
+
+set_marker:
+ btfsc standalone_simulator ; Standalone Simualtor active?
+ bra divemode_menu_simulator ; Yes, Show simulator menu!
+
+ call set_LEDg ; LEDg on
+ movlw d'6' ; Type of Alarm (Manual Marker)
+ movwf AlarmType ; Copy to Alarm Register
+ bsf event_occured ; Set Event Flag
+
+ btfss stopwatch_active ; =1: Reset Average registers
+ return
+; Maker Set, also reset average Depth....
+ clrf average_depth_hold+0
+ clrf average_depth_hold+1
+ clrf average_depth_hold+2
+ clrf average_depth_hold+3 ; Clear average depth register
+ movlw d'2'
+ movwf average_divesecs+0
+ clrf average_divesecs+1
+ call calc_average_depth
+ return
+
+test_switches_divemode_menu:
+ btfsc switch_left
+ bra test_switches_divemode_menu3
+ btfss switch_right
+ return
+
+ btfsc display_see_l_tissue ; Is the leading tissue info screen active
+ bra divemenu_see_leading_tissue2; Yes, quit menu
+
+ btfsc display_see_deco ; Is the Decoplan displayed?
+ bra divemenu_see_decoplan2 ; Yes, exit menu on left button press
+
+ btfsc display_set_graphs ; Is the Graph displayed?
+ bra divemode_set_graphs2 ; Yes, exit menu on right button press
+
+ bcf switch_right ; Left button pressed
+ clrf timeout_counter3 ; timout_divemenu!
+ incf menupos,F
+
+; Following routine configures the number of menu entries for the different modes
+ movlw d'6' ; number of available gases+1, ; number of menu options+1
+ btfsc display_set_setpoint ; In SetPoint Menu?
+ movlw d'4' ; Number of entries for this menu+1
+
+ cpfseq menupos ; =limit?
+ bra test_switches_divemode_menu1; No!
+ movlw d'1' ; Yes, reset to position 1!
+ movwf menupos
+test_switches_divemode_menu1:
+ call PLED_divemenu_cursor ; update cursor
+ return
+
+test_switches_divemode_menu3:
+ bcf switch_left
+ bcf switch_right
+ bsf menubit ; Enter Divemode-Menu!
+ bcf premenu ; clear premenu flag
+ clrf timeout_counter3
+
+ btfsc display_see_l_tissue ; Is the leading tissue info screen active
+ bra divemenu_see_leading_tissue2; Yes, quit menu
+
+ btfsc display_set_gas ; Are we in the "Gaslist" or "SetPoint" menu?
+ bra divemenu_set_gas2 ; Yes, so set gas and exit menu
+
+ btfsc display_see_deco ; Is the Decoplan displayed?
+ bra divemenu_see_decoplan2 ; Yes, exit menu on right button press
+
+ btfsc display_set_graphs ; Is the Graph displayed?
+ bra divemode_set_graphs2 ; Yes, exit menu on right button press
+
+ btfsc display_set_xgas ; Are we in the "Set Gas" menu?
+ bra divemenu_set_xgas2 ; Yes, so configure gas or set menu and exit menu
+
+ btfsc display_set_simulator ; Are we in the Divemode Simulator menu?
+ goto divemode_menu_simulator2 ; Yes, so adjust depth or set and exit
+
+ btfsc divemode_menu_page ; Are we in the second menu page?
+ bra test_switches_divemode_menu4; Yes, use second page items
+; Options for Menu 1
+ dcfsnz menupos,F
+ bra divemenu_see_decoplan ; display the full decoplan
+ dcfsnz menupos,F
+ bra divemenu_set_gas ; Set gas sub-menu
+ dcfsnz menupos,F
+ bra divemode_set_xgas ; Configure the extra gas / Select Bailout
+ dcfsnz menupos,F
+ bra divemenu_enter_second ; Enter second Menu page
+ dcfsnz menupos,F
+ bra timeout_divemenu2 ; Quit divemode menu
+ return
+
+test_switches_divemode_menu4:
+; Options for Menu 2
+ dcfsnz menupos,F
+ bra divemode_set_graphs ; Show saturation graphs
+ dcfsnz menupos,F
+ bra divemode_toggle_brightness ; Toggle OLED-Brightness
+ dcfsnz menupos,F
+ bra divemenu_see_leading_tissue ; Display details about leading tissue
+ dcfsnz menupos,F
+ bra toggle_stopwatch ; Toggle Stopwatch
+ dcfsnz menupos,F
+ bra timeout_divemenu2 ; Quit divemode menu
+ return
+
+toggle_stopwatch:
+ btg stopwatch_active ; Toggle Flag
+
+ btfss stopwatch_active ; Show Stopwatch?
+ bra toggle_stopwatch2 ; No, remove outputs
+
+ clrf average_depth_hold+0
+ clrf average_depth_hold+1
+ clrf average_depth_hold+2
+ clrf average_depth_hold+3 ; Clear average depth register
+ movlw d'2'
+ movwf average_divesecs+0
+ clrf average_divesecs+1
+ call calc_average_depth
+
+ bra timeout_divemenu2 ; quit menu!
+
+toggle_stopwatch2:
+ call PLED_stopwatch_remove ; Remove Stopwatch Outputs
+ bra timeout_divemenu2 ; quit menu!
+
+divemode_toggle_brightness:
+ read_int_eeprom d'90' ; Brightness offset? (Dim>0, Normal = 0)
+ tstfsz EEDATA ; Was dimmed?
+ bra divemode_toggle_brightness1 ; Yes...
+
+ call PLED_brightness_low
+ movlw d'1'
+ movwf EEDATA ; Copy to EEDATA
+ write_int_eeprom d'90' ; Brightness offset? (Dim=1, Normal = 0)
+ bra divemode_toggle_brightness3
+
+divemode_toggle_brightness1:
+ call PLED_brightness_full
+ movlw d'0'
+ movwf EEDATA ; Copy to EEDATA
+ write_int_eeprom d'90' ; Brightness offset? (Dim=1, Normal = 0)
+
+divemode_toggle_brightness3:
+; Now, redraw all outputs (All modes)
+ call PLED_active_gas_divemode ; Display gas, if required
+ call PLED_temp_divemode ; Displays temperature
+ call PLED_depth ; Displays new depth...
+ call PLED_max_pressure ; ...and max. depth
+
+ btfsc FLAG_apnoe_mode ; Ignore in Apnoe mode
+ bra timeout_divemenu2 ; quit menu!
+ btfsc gauge_mode ; Ignore in Gauge mode
+ bra timeout_divemenu2 ; quit menu!
+
+; Redraw Outputs in Deco modes
+ btfsc dekostop_active
+ call PLED_display_deko_mask ; clear nostop time, display decodata
+ btfss dekostop_active
+ call PLED_display_ndl_mask ; Clear deco data, display nostop time
+ bra timeout_divemenu2 ; quit menu!
+
+divemenu_enter_second:
+ call PLED_clear_divemode_menu ; Clear dive mode menu area
+ call PLED_divemode_menu_mask_second ; Write Divemode menu1 mask
+ movlw d'1'
+ movwf menupos ; reset cursor to first item in divemode menu page two
+ bsf divemode_menu_page ; Enter Menu Page two
+ call PLED_divemenu_cursor ; show cursor
+ bcf switch_right
+ bcf switch_left ; Left button pressed!
+ return
+
+divemode_set_xgas: ; Set the extra gas...
+ btfsc FLAG_const_ppO2_mode ; are we in ppO2 mode?
+ bra divemenu_set_bailout ; Yes, so display Bailot list...
+
+ bsf display_set_xgas ; Set Flag
+ call PLED_clear_divemode_menu ; Clear Menu
+
+ movff char_I_O2_ratio, EEDATA ; Reset Gas6 to current gas
+ write_int_eeprom d'24'
+ movff char_I_He_ratio, EEDATA
+ write_int_eeprom d'25'
+
+ call PLED_divemode_set_xgas ; Show mask
+
+ movlw d'1'
+ movwf menupos ; reset cursor
+ call PLED_divemenu_cursor ; update cursor
+
+ return
+
+divemode_menu_simulator:
+ bsf menubit ; Enter Divemode-Menu!
+ bcf premenu ; clear premenu flag
+ bcf switch_right
+ bcf switch_left ; Left button pressed!
+ bsf display_set_simulator ; Set Flag
+ call PLED_clear_divemode_menu ; Clear Menu
+ call PLED_divemode_simulator_mask; Show mask
+ bcf divemode_menu_page ; Start in Menu Page one
+ movlw d'1'
+ movwf menupos ; reset cursor
+ call PLED_divemenu_cursor ; update cursor
+ return
+
+divemode_menu_simulator2:
+ dcfsnz menupos,F
+ bra timeout_divemenu2 ; quit underwater menu!
+ dcfsnz menupos,F
+ bra divemode_menu_simulator_p1 ; Adjust +1m
+ dcfsnz menupos,F
+ bra divemode_menu_simulator_m1 ; Adjust -1m
+ dcfsnz menupos,F
+ bra divemode_menu_simulator_p10 ; Adjust +10m
+ dcfsnz menupos,F
+ bra divemode_menu_simulator_m10 ; Adjust -10m
+ bra timeout_divemenu2 ; quit underwater menu!
+
+divemode_menu_simulator_common:
+ call PLED_divemode_simulator_mask ; Redraw Simualtor mask
+
+ ; Check limits (140m and 0m)
+ movlw LOW d'15000'
+ movwf sub_a+0
+ movlw HIGH d'15000'
+ movwf sub_a+1
+ movff sim_pressure+0,sub_b+0
+ movff sim_pressure+1,sub_b+1
+ call sub16 ; sub_c = sub_a - sub_b
+ btfss neg_flag
+ bra divemode_menu_simulator_common2
+ ; Too deep, limit to 140m
+ movlw LOW d'15000'
+ movwf sim_pressure+0
+ movlw HIGH d'15000'
+ movwf sim_pressure+1
+ return
+
+divemode_menu_simulator_common2:
+ movlw LOW d'1000'
+ movwf sub_a+0
+ movlw HIGH d'1000'
+ movwf sub_a+1
+ movff sim_pressure+0,sub_b+0
+ movff sim_pressure+1,sub_b+1
+ call sub16 ; sub_c = sub_a - sub_b
+ btfsc neg_flag
+ return
+ ; Too shallow, limit to 1m
+ movlw LOW d'1000'
+ movwf sim_pressure+0
+ movlw HIGH d'1000'
+ movwf sim_pressure+1
+ return
+
+divemode_menu_simulator_m10:
+ movlw LOW d'1000'
+ subwf sim_pressure+0,F
+ movlw HIGH d'1000'
+ subwfb sim_pressure+1,F
+ movlw d'5'
+ movwf menupos ; reset cursor
+ bra divemode_menu_simulator_common
+
+divemode_menu_simulator_p10:
+ movlw LOW d'1000'
+ addwf sim_pressure+0,F
+ movlw HIGH d'1000'
+ addwfc sim_pressure+1,F
+ movlw d'4'
+ movwf menupos ; reset cursor
+ bra divemode_menu_simulator_common
+
+divemode_menu_simulator_p1:
+ movlw d'100'
+ addwf sim_pressure+0,F
+ movlw d'0'
+ addwfc sim_pressure+1,F
+ movlw d'2'
+ movwf menupos ; reset cursor
+ bra divemode_menu_simulator_common
+
+divemode_menu_simulator_m1:
+ movlw d'100'
+ subwf sim_pressure+0,F
+ movlw d'0'
+ subwfb sim_pressure+1,F
+ movlw d'3'
+ movwf menupos ; reset cursor
+ bra divemode_menu_simulator_common
+
+divemode_set_graphs:
+ bsf display_set_graphs ; set flag
+ call PLED_clear_divemode_menu ; Clear Menu
+ call deco_main_calc_desaturation_time ; calculate desaturation time
+ movlb b'00000001' ; select ram bank 1
+ call PLED_saturation_graph_divemode ; Display saturation graph
+ return
+
+divemode_set_graphs2:
+ bcf display_set_graphs ; clear flag
+ bra timeout_divemenu2 ; quit menu!
+
+divemenu_see_leading_tissue:
+ bsf display_see_l_tissue ; Set Flag
+ call PLED_clear_divemode_menu ; Clear Menu
+ call PLED_show_leading_tissue ; Show infos about leading tissue
+ return
+
+divemenu_see_leading_tissue2:
+ bcf display_see_l_tissue ; Clear Flag
+ bra timeout_divemenu2 ; quit menu!
+
+divemenu_see_decoplan:
+ bsf display_see_deco ; set flag
+
+ read_int_eeprom d'34'
+ movlw d'3'
+ cpfsgt EEDATA ; in multi-gf mode? Z16 GF OC=4 and Z16 GF CC=5
+ bra divemenu_see_decoplan1 ; No!
+
+bra divemenu_see_decoplan1 ; Show normal plan! ToDo: MultiGF Plan....
+
+ bsf multi_gf_display ; Yes, display the multi-gf table screen
+ call PLED_ClearScreen ; clean up OLED
+ call PLED_MultiGF_deco_mask
+
+ movff char_O_deco_status,deco_status ;
+ tstfsz deco_status ; deco_status=0 if decompression calculation done
+ return ; calculation not yet finished!
+
+ call PLED_MultiGF_deco_all ; Display the new screen
+ return
+
+divemenu_see_decoplan1:
+ call PLED_clear_divemode_menu ; Clear Menu
+
+ movff char_O_deco_status,deco_status ;
+ tstfsz deco_status ; deco_status=0 if decompression calculation done
+ return ; calculation not yet finished!
+
+ call PLED_decoplan ; display the Decoplan
+ return
+
+divemenu_see_decoplan2:
+ bcf display_see_deco ; clear flag
+ bra timeout_divemenu2 ; quit menu!
+
+divemenu_set_xgas2:
+ dcfsnz menupos,F
+ bra divemenu_set_xgas2_exit ; Use the gas6 configured and exit
+ dcfsnz menupos,F
+ bra divemenu_set_xgas2_o2plus ; Adjust O2+
+ dcfsnz menupos,F
+ bra divemenu_set_xgas2_o2minus ; Adjust O2-
+ dcfsnz menupos,F
+ bra divemenu_set_xgas2_heplus ; Adjust He+
+ dcfsnz menupos,F
+ bra divemenu_set_xgas2_heminus ; Adjust He-
+ return
+
+divemenu_set_xgas2_heminus:
+ read_int_eeprom d'25' ; He value
+ movff EEDATA,lo
+ decf lo,F ; decrease He
+ movlw d'255'
+ cpfseq lo
+ bra divemenu_set_xgas2_heminus2
+ incf lo,F ; limit to min=0
+divemenu_set_xgas2_heminus2:
+ movff lo, EEDATA
+ write_int_eeprom d'25' ; He Value
+
+ call PLED_divemode_set_xgas ; Redraw menu
+ movlw d'5'
+ movwf menupos ; reset cursor
+ return
+
+divemenu_set_xgas2_heplus:
+ read_int_eeprom d'25' ; He value
+ movff EEDATA,lo
+ incf lo,F ; increase He
+ movlw d'101'
+ cpfseq lo
+ bra divemenu_set_xgas2_heplus2
+ movlw d'4' ; O2 Limit
+ movwf lo
+divemenu_set_xgas2_heplus2: ; test if O2+He>100...
+ read_int_eeprom d'24' ; O2 value
+ movf EEDATA,W
+ addwf lo,W ; add He value
+ movwf hi ; store in temp
+ movlw d'101'
+ cpfseq hi ; O2 and He > 100?
+ bra divemenu_set_xgas2_heplus3 ; No!
+ decf lo,F ; reduce He again = unchanged after operation
+divemenu_set_xgas2_heplus3: ; save current value
+ movff lo, EEDATA
+ write_int_eeprom d'25' ; He Value
+
+ call PLED_divemode_set_xgas ; Redraw menu
+ movlw d'4'
+ movwf menupos ; reset cursor
+ return
+
+divemenu_set_xgas2_o2minus:
+ read_int_eeprom d'24' ; O2 value
+ movff EEDATA,lo
+ decf lo,F ; decrease O2
+ movlw d'3' ; Limit-1
+ cpfseq lo
+ bra divemenu_set_xgas2_o2minus2
+ incf lo,F ; limit to min=9
+divemenu_set_xgas2_o2minus2:
+ movff lo, EEDATA
+ write_int_eeprom d'24' ; O2 Value
+
+ call PLED_divemode_set_xgas ; Redraw menu
+ movlw d'3'
+ movwf menupos ; reset cursor
+ return
+
+divemenu_set_xgas2_o2plus:
+ read_int_eeprom d'24' ; O2 value
+ movff EEDATA,lo
+ incf lo,F ; increase O2
+ movlw d'101'
+ cpfseq lo
+ bra divemenu_set_xgas2_o2plus2
+ movlw d'5' ; O2 limit
+ movwf lo
+divemenu_set_xgas2_o2plus2: ; test if O2+He>100...
+ read_int_eeprom d'25' ; He value
+ movf EEDATA,W
+ addwf lo,W ; add O2 value
+ movwf hi ; store in temp
+ movlw d'101'
+ cpfseq hi ; O2 and He > 100?
+ bra divemenu_set_xgas2_o2plus3 ; No!
+ decf lo,F ; reduce O2 again = unchanged after operation
+divemenu_set_xgas2_o2plus3: ; save current value
+ movff lo, EEDATA
+ write_int_eeprom d'24' ; O2 Value
+
+ call PLED_divemode_set_xgas ; Redraw menu
+ movlw d'2'
+ movwf menupos ; reset cursor
+ return
+
+divemenu_set_xgas2_exit:
+ read_int_eeprom d'25' ; Read He ratio
+ movff EEDATA,char_I_He_ratio ; And copy into hold register
+
+ read_int_eeprom d'24' ; Read O2 ratio
+ movff EEDATA, char_I_O2_ratio ; O2 ratio
+ movff char_I_He_ratio, wait_temp ; copy into bank1 register
+ bsf STATUS,C ;
+ movlw d'100' ; 100%
+ subfwb wait_temp,W ; minus He
+ subfwb EEDATA,F ; minus O2
+ movff EEDATA, char_I_N2_ratio ; = N2!
+ bsf manual_gas_changed ; set event flag
+ bsf event_occured ; set global event flag
+ bra timeout_divemenu2 ; quit underwater menu!
+
+divemenu_set_bailout:
+ bsf display_set_gas ; set flag
+ call PLED_clear_divemode_menu ; Clear Menu
+
+ bcf FLAG_const_ppO2_mode ; Delete Flag to show all bailouts
+ bsf select_bailoutgas ; Set Flag for Bailout list
+ call PLED_gas_list ; Display all 5 gases
+ bsf FLAG_const_ppO2_mode ; Reset Flag
+
+ movlw d'1'
+ movwf menupos ; reset cursor
+ call PLED_divemenu_cursor ; update cursor
+ return
+
+divemenu_set_gas:
+ btfsc FLAG_const_ppO2_mode ; in ppO2 mode?
+ bra divemenu_set_setpoint ; Yes, display SetPoint/Sensor result list
+
+ bsf display_set_gas ; set flag
+ call PLED_clear_divemode_menu ; Clear Menu
+ call PLED_gas_list ; Display all 5 gases
+ movlw d'1'
+ movwf menupos ; reset cursor
+ call PLED_divemenu_cursor ; update cursor
+ return
+
+divemenu_set_setpoint:
+ bsf display_set_setpoint ; set flag
+ bsf display_set_gas ; set flag
+
+ call PLED_clear_divemode_menu ; Clear Menu
+ call PLED_splist_start ; Display SetPoints and Sensor results
+ movlw d'1'
+ movwf menupos ; reset cursor
+ call PLED_divemenu_cursor ; update cursor
+
+ return
+
+
+divemenu_set_gas2:
+ btfsc select_bailoutgas ; Are we in the Bailout list?
+ bra divemenu_set_gas2a ; Yes, choose gas
+
+ btfss FLAG_const_ppO2_mode ; are we in ppO2 mode?
+ bra divemenu_set_gas2a ; no, choose gas
+ ; Yes, so select SP 1-3 or Sensor mode
+
+divemenu_set_gas1:
+ movlw d'35' ; offset in memory
+ addwf menupos,W ; add SP number 0-2
+ movwf EEADR
+ call read_eeprom ; Read SetPoint
+ movff EEDATA, char_I_const_ppO2 ; Use SetPoint
+
+divemenu_set_gas1a:
+ bcf display_set_setpoint ; Clear Display Flag
+; Now, Set correct Diluent (again)
+ read_int_eeprom d'33' ; Read byte (stored in EEDATA)
+ movff EEDATA,active_gas ; Read start gas (1-5)
+
+ decf active_gas,W ; Gas 0-4
+ mullw d'4'
+ movf PRODL,W
+ addlw d'7' ; = address for He ratio
+ movwf EEADR
+ call read_eeprom ; Read He ratio
+ movff EEDATA,char_I_He_ratio ; And copy into hold register
+ decf active_gas,W ; Gas 0-4
+ mullw d'4'
+ movf PRODL,W
+ addlw d'6' ; = address for O2 ratio
+ movwf EEADR
+ call read_eeprom ; Read O2 ratio
+ movff EEDATA, char_I_O2_ratio ; O2 ratio
+ movff char_I_He_ratio, wait_temp ; copy into bank1 register
+ bsf STATUS,C ; Borrow bit
+ movlw d'100' ; 100%
+ subfwb wait_temp,W ; minus He
+ bsf STATUS,C ; Borrow bit
+ subfwb EEDATA,F ; minus O2
+ movff EEDATA, char_I_N2_ratio ; = N2!
+
+ call PLED_active_gas_clear ; Clear gas in case of AIR (Will be redrawn)
+
+ bsf stored_gas_changed ; set event flag
+ bsf event_occured ; set global event flag
+ bra timeout_divemenu2 ; quit menu!
+
+divemenu_set_gas2a:
+ clrf lo ; clear Setpoint, PLED_const_ppO2_value now displayes "Bail"
+ movff lo,char_I_const_ppO2
+
+ bcf display_set_gas ; clear flag
+ movff menupos,active_gas ; copy into active gas register
+ decf menupos,W ; # of selected gas (0-4)
+ mullw d'4' ; times 4...
+ movf PRODL,W ;
+ addlw d'7' ; +7 = address for He ratio
+ movwf EEADR
+ call read_eeprom ; Read He ratio
+ movff EEDATA,char_I_He_ratio ; And copy into hold register
+
+ decf menupos,W ; # of selected gas (0-4)
+ mullw d'4' ; times 4...
+ movf PRODL,W ;
+ addlw d'6' ; +6 = address for O2 ratio
+ movwf EEADR
+ call read_eeprom ; Read O2 ratio
+ movff EEDATA, char_I_O2_ratio ; O2 ratio
+ movff char_I_He_ratio, wait_temp ; copy into bank1 register
+ bsf STATUS,C ;
+ movlw d'100' ; 100%
+ subfwb wait_temp,W ; minus He
+ subfwb EEDATA,F ; minus O2
+ movff EEDATA, char_I_N2_ratio ; = N2!
+ bsf stored_gas_changed ; set event flag
+ bsf event_occured ; set global event flag
+ bra timeout_divemenu2 ; quit menu!
+
+timeout_divemenu:
+ btfss menubit ; is the Dive mode menu displayed?
+ return ; No
+
+ btfsc display_see_l_tissue ; Are the leading tissue details displayed?
+ bra timeout_divemenu7 ; Yes, update them
+
+ btfsc display_set_simulator ; Is the Simulator Mask active?
+ bra timeout_divemenu6 ; Yes, update Simulator mask
+
+
+ btfss display_see_deco ; Is the decoplan active?
+ bra timeout_divemenu1 ; No, skip updating the decoplan
+
+ btfsc multi_gf_display ; display the multi-gf table screen?
+ bra timeout_divemenu3 ; Yes...
+
+ movff char_O_deco_status,deco_status ;
+ tstfsz deco_status ; deco_status=0 if decompression calculation done
+ bra timeout_divemenu1 ; No, skip updating the decoplan
+
+ call PLED_decoplan ; update the Decoplan
+
+timeout_divemenu1:
+ incf timeout_counter3,F ; increase timeout_counter3
+ GETCUSTOM8 d'10' ; loads timeout_divemenu into WREG
+ cpfsgt timeout_counter3 ; ... longer then timeout_divemenu
+ return ; No!
+timeout_divemenu2: ; quit divemode menu
+ btfss multi_gf_display ; Was the Multi-GF Table displayed?
+ bra timeout_divemenu2a ; No, normal OLED rebuild
+
+; Restore some outputs
+ bcf multi_gf_display ; Do not display the multi-gf table screen
+ call PLED_ClearScreen ; Yes, clean up OLED first
+ call PLED_temp_divemode ; Displays temperature
+ call PLED_max_pressure ; Max. Depth
+ btfsc dekostop_active
+ call PLED_display_deko_mask ; clear nostop time, display decodata
+ btfss dekostop_active
+ call PLED_display_ndl_mask ; Clear deco data, display nostop time
+
+timeout_divemenu2a:
+ bcf multi_gf_display ; Do not display the multi-gf table screen
+ bcf menubit
+ bcf premenu ; Yes, clear flags and menu, display dive time and mask again
+ call PLED_active_gas_divemode ; Display gas, if required
+ call PLED_clear_divemode_menu; Clear dive mode menu
+ call PLED_divemode_mask ; Display mask
+ call PLED_divemins ; Display (new) divetime!
+ clrf timeout_counter3 ; Also clear timeout
+ bcf display_see_deco ; clear all display flags
+ bcf display_see_l_tissue
+ bcf display_set_gas
+ bcf display_set_graphs
+ bcf display_set_xgas
+ bcf display_set_setpoint
+ bcf display_set_simulator
+ bcf switch_left ; and debounce switches
+ bcf switch_right
+ return
+
+timeout_divemenu3:
+ call PLED_MultiGF_deco_mask
+
+ movff char_O_deco_status,deco_status ;
+ tstfsz deco_status ; deco_status=0 if decompression calculation done
+ bra timeout_divemenu1 ; No, skip updating the decoplan
+
+ call PLED_MultiGF_deco_all ; Display the new screen
+ bra timeout_divemenu1 ; Check timeout
+
+timeout_divemenu6:
+ ; Update Simulator Mask
+ call PLED_divemode_simulator_mask; Show mask
+ call PLED_divemenu_cursor ; update cursor
+ bra timeout_divemenu1 ; Check timeout
+
+timeout_divemenu7:
+ ; Update Leading tissue infos
+ call PLED_show_leading_tissue ; Update infos about leading tissue
+ bra timeout_divemenu1 ; Check timeout
\ No newline at end of file
diff -r 000000000000 -r 96a35aeda5f2 code_part1/OSTC_code_asm_part1/docu/COPYING__GNU_GPLv3_deutsch.txt
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/code_part1/OSTC_code_asm_part1/docu/COPYING__GNU_GPLv3_deutsch.txt Tue Jan 12 15:05:59 2010 +0100
@@ -0,0 +1,541 @@
+GNU General Public License
+
+Deutsche Übersetzung der Version 3, 29. Juni 2007
+
+Copyright Đ 2007 Free Software Foundation, Inc. (http://fsf.org/) 51 Franklin Street, Fifth Floor,
+Boston, MA 02110-1301, USA
+
+Es ist jedermann gestattet, diese Lizenzurkunde zu vervielfältigen und unveränderte Kopien zu
+verbreiten; Änderungen sind jedoch nicht erlaubt.
+
+Diese Übersetzung ist kein rechtskräftiger Ersatz für die englischsprachige Originalversion!
+
+Vorwort
+
+Die GNU General Public License die Allgemeine Öffentliche GNU-Lizenz ist eine freie
+Copyleft-Lizenz für Software und andere Arten von Werken.
+
+Die meisten Lizenzen für Software und andere nutzbaren Werke sind daraufhin entworfen worden,
+Ihnen die Freiheit zu nehmen, die Werke mit anderen zu teilen und zu verändern. Im Gegensatz
+dazu soll Ihnen die GNU General Public License die Freiheit garantieren, alle Versionen eines
+Programms zu teilen und zu verändern. Sie soll sicherstellen, daß die Software für alle ihre
+Benutzer frei bleibt. Wir, die Free Software Foundation, nutzen die GNU General Public License
+für den größten Teil unserer Software; sie gilt außerdem für jedes andere Werk, dessen Autoren es
+auf diese Weise freigegeben haben. Auch Sie können diese Lizenz auf Ihre Programme anwenden.
+
+Wenn wir von freier Software sprechen, so beziehen wir uns auf Freiheit, nicht auf den Preis.
+Unsere Allgemeinen Öffentlichen Lizenzen sind darauf angelegt, sicherzustellen, daß Sie die
+Freiheit haben, Kopien freier Software zu verbreiten (und dafür etwas zu berechnen, wenn Sie
+möchten), die Möglichkeit, daß Sie die Software als Quelltext erhalten oder den Quelltext auf
+Wunsch bekommen, daß Sie die Software ändern oder Teile davon in neuen freien Programmen
+verwenden dürfen und daß Sie wissen, daß Sie dies alles tun dürfen.
+
+Um Ihre Rechte zu schützen, müssen wir andere daran hindern, Ihnen diese Rechte zu verweigern
+oder Sie aufzufordern, auf diese Rechte zu verzichten. Aus diesem Grunde tragen Sie eine
+Verantwortung, wenn Sie Kopien der Software verbreiten oder die Software verändern: die
+Verantwortung, die Freiheit anderer zu respektieren.
+
+Wenn Sie beispielsweise die Kopien eines solchen Programms verbreiten kostenlos oder gegen
+Bezahlung müssen Sie an die Empfänger dieselben Freiheiten weitergeben, die Sie selbst erhalten
+haben. Sie müssen sicherstellen, daß auch die Empfänger die Software im Quelltext erhalten bzw.
+den Quelltext erhalten können. Und Sie müssen ihnen diese Bedingungen zeigen, damit sie ihre
+Rechte kennen.
+
+Software-Entwickler, die die GNU GPL nutzen, schützen Ihre Rechte in zwei Schritten: (1) Sie
+machen ihr Urheberrecht (Copyright) auf die Software geltend, und (2) sie bieten Ihnen diese
+Lizenz an, die Ihnen das Recht gibt, die Software zu vervielfältigen, zu verbreiten und/oder zu
+verändern.
+
+Um die Entwickler und Autoren zu schützen, stellt die GPL darüberhinaus klar, daß für diese freie
+Software keinerlei Garantie besteht. Um sowohl der Anwender als auch der Autoren Willen
+erfordert die GPL, daß modifizierte Versionen der Software als solche gekennzeichnet werden,
+damit Probleme mit der modifizierten Software nicht fälschlicherweise mit den Autoren der
+Originalversion in Verbindung gebracht werden.
+
+Manche Geräte sind daraufhin entworfen worden, ihren Anwendern zu verweigern, modifizierte
+Versionen der darauf laufenden Software zu installieren oder laufen zu lassen, wohingegen der
+Hersteller diese Möglichkeit hat. Dies ist grundsätzlich unvereinbar mit dem Ziel, die Freiheit der
+Anwender zu schützen, die Software zu modifizieren. Derartige gezielte mißbräuchliche
+Verhaltensmuster finden auf dem Gebiet persönlicher Gebrauchsgegenstände statt also genau
+dort, wo sie am wenigsten akzeptabel sind. Aus diesem Grunde wurde diese Version der GPL
+daraufhin entworfen, diese Praxis für diese Produkte zu verbieten. Sollten derartige Probleme
+substantiell auf anderen Gebieten auftauchen, sind wir bereit, diese Regelung auf diese Gebiete
+auszudehnen, soweit dies notwendig ist, um die Freiheit der Benutzer zu schützen.
+
+Schließlich und endlich ist jedes Computerprogramm permanent durch Software-Patente bedroht.
+Staaten sollten es nicht zulassen, daß Patente die Entwicklung und Anwendung von Software für
+allgemein einsetzbare Computer einschränken, aber in Staaten, wo dies geschieht, wollen wir die
+spezielle Gefahr vermeiden, daß Patente dazu verwendet werden, ein freies Programm im
+Endeffekt proprietär zu machen. Um dies zu verhindern, stellt die GPL sicher, daß Patente nicht
+verwendet werden können, um das Programm nicht-frei zu machen.
+
+Es folgen die präzisen Bedingungen für das Kopieren, Verbreiten und Modifizieren.
+LIZENZBEDINGUNGEN
+0. Definitionen
+
+Diese Lizenz bezieht sich auf die Version 3 der GNU General Public License.
+
+Mit Urheberrecht sind auch urheberrechtähnliche Rechte gemeint, die auf andere Arten von
+Werken Anwendung finden, beispielsweise auf Fotomasken in der Halbleitertechnologie.
+
+Das Programm bezeichnet jedes urheberrechtlich schützbare Werk, das unter diese Lizenz
+gestellt wurde. Jeder Lizenznehmer wird als Sie angeredet. Lizenznehmer und Empfänger
+können natürliche oder rechtliche Personen sein.
+
+Ein Werk zu modifizieren bedeutet, aus einem Werk zu kopieren oder es ganz oder teilweise auf
+eine Weise umzuarbeiten, die eine urheberrechtliche Erlaubnis erfordert und kein Eins-zu-eins-
+Kopieren darstellt. Das daraus hervorgehende Werk wird als modifizierte Version des früheren
+Werks oder als auf dem früheren Werk basierendes Werk bezeichnet.
+
+Ein betroffenes Werk bezeichnet entweder das unmodifizierte Programm oder ein auf dem
+Programm basierendes Werk.
+
+Ein Werk zu propagieren bezeichnet jedwede Handlung mit dem Werk, für die man wegen
+Verletzung anwendbaren Urheberrechts direkt oder indirekt zur Verantwortung gezogen würde,
+ausgenommen das Ausführen auf einem Computer oder das Modifizieren einer privaten Kopie. von
+Modifikationen, die an niemanden weitergegeben werden. Unter das Propagieren eines Werks
+fallen Kopieren, Weitergeben (mit oder ohne Modifikationen), öffentliches Zugänglichmachen und
+in manchen Staaten noch weitere Tätigkeiten.
+
+Ein Werk zu übertragen bezeichnet jede Art von Propagation, die es Dritten ermöglicht, das
+Werk zu kopieren oder Kopien zu erhalten. Reine Interaktion mit einem Benutzer über ein
+Computer-Netzwerk ohne Übergabe einer Kopie ist keine Übertragung.
+
+Eine interaktive Benutzerschnittstelle zeigt angemessene rechtliche Hinweise in dem Umfang,
+daß sie eine zweckdienliches und deutlich sichtbare Funktion bereitstellt, die (1) einen
+angemessenen Copyright-Vermerk zeigt und (2) dem Benutzer mitteilt, daß keine Garantie für das
+Werk besteht (ausgenommen in dem Umfang, in dem Garantie gewährt wird), daß Lizenznehmer
+das Werk gemäß dieser Lizenz übertragen dürfen und wie man ein Exemplar dieser Lizenz zu
+Gesicht bekommen kann. Wenn die Benutzerschnittstelle eine Liste von Benutzerkommandos oder
+Optionen anzeigt, zum Beispiel ein Menü, dann erfüllt ein deutlich sichtbarer Punkt in dieser Liste
+dieses Kriterium.
+1. Quelltext
+
+Der Quelltext eines Werkes bezeichnet diejenige Form des Werkes, die für Bearbeitungen
+vorzugsweise verwendet wird. Objekt-Code bezeichnet jede Nicht-Quelltext-Form eines Werks.
+
+Eine Standardschnittstelle bezeichnet eine Schnittstelle, die entweder ein offizieller Standard
+eines anerkannten Standardisierungsgremiums ist oder im Falle von Schnittstellen, die für eine
+spezielle Programmiersprache spezifiziert wurden eine Schnittstelle, die unter Entwicklern, die in
+dieser Programmiersprache arbeiten, weithin gebräuchlich ist.
+
+Die Systembibliotheken eines ausführbaren Werks enthalten alles, ausgenommen das Werk als
+Ganzes, was (a) normalerweise zum Lieferumfang einer Hauptkomponente gehört, aber selbst nicht
+die Hauptkomponente ist, und (b) ausschließlich dazu dient, das Werk zusammen mit der
+Hauptkomponente benutzen zu können oder eine Standardschnittstelle zu implementieren, für die
+eine Implementation als Quelltext öffentlich erhältlich ist. Eine Hauptkomponente bezeichnet in
+diesem Zusammenhang eine größere wesentliche Komponente (Betriebssystemkern, Fenstersystem
+usw.) des spezifischen Betriebssystems (soweit vorhanden), auf dem das ausführbare Werk läuft,
+oder des Compilers, der zur Erzeugung des Objekt-Codes eingesetzt wurde, oder des für die
+Ausführung verwendeten Objekt-Code-Interpreters.
+
+Der korrespondierende Quelltext eines Werks in Form von Objekt-Code bezeichnet den
+vollständigen Quelltext, der benötigt wird, um das Werk zu erzeugen, es zu installieren, um (im
+Falle eines ausführbaren Werks) den Objekt-Code auszuführen und um das Werk zu modifizieren,
+einschließlich der Skripte zur Steuerung dieser Aktivitäten. Er schließt jedoch nicht die
+Systembibliotheken, allgemein einsetzbare Werkzeuge oder allgemein erhältliche freie
+Computerprogramme mit ein, die in unmodifizierter Form verwendet werden, um die o.a.
+Tätigkeiten durchzuführen, die aber nicht Teil des Werks sind. Zum Beispiel enthält der
+korrespondierende Quelltext die zum Programmquelltext gehörenden
+Schnittstellendefinitionsdateien sowie die Quelltexte von dynamisch eingebundenen Bibliotheken
+und Unterprogrammen, auf die das Werk konstruktionsbedingt angewiesen ist, beispielsweise
+durch komplexe Datenkommunikation oder Ablaufsteuerung zwischen diesen Unterprogrammen
+und anderen Teilen des Werks.
+
+Der korrespondierende Quelltext braucht nichts zu enthalten, das der Anwender aus anderen Teilen
+des korrespondierenden Quelltextes automatisch regenerieren kann.
+
+Der korrespondierende Quelltext eines Werks in Quelltextform ist das Werk selbst.
+2. Grundlegende Genehmigungen
+
+Alle unter dieser Lizenz gewährten Rechte werden gewährt auf Grundlage des Urheberrechts an
+dem Programm, und sie sind unwiderruflich, solange die festgelegten Bedingungen erfüllt sind.
+Diese Lizenz erklärt ausdrücklich Ihr uneingeschränktes Recht zur Ausführung des unmodifizierten
+Programms. Die beim Ausführen eines betroffenen Werks erzeugten Ausgabedaten fallen unter
+diese Lizenz nur dann, wenn sie, in Anbetracht ihres Inhalts, ein betroffenes Werk darstellen. Diese
+Lizenz erkennt Ihr im Urheberrecht vorgesehenes Recht auf angemessene Benutzung oder seine
+Entsprechung an.
+
+Sie dürfen betroffene Werke, die Sie nicht übertragen, uneingeschränkt erzeugen, ausführen und
+propagieren, solange Ihre Lizenz ansonsten in Kraft bleibt. Sie dürfen betroffene Werke an Dritte
+übertragen für den einzigen Zweck, Modifikationen exklusiv für Sie durchzuführen oder
+Einrichtungen für Sie bereitzustellen, um diese Werke auszuführen, vorausgesetzt, Sie erfüllen alle
+Bedingungen dieser Lizenz für das Übertragen von Material, dessen Urheberrecht nicht bei Ihnen
+liegt. Diejenigen, die auf diese Weise betroffene Werke für Sie anfertigen oder ausführen, müssen
+dies ausschließlich in Ihrem Namen tun, unter Ihrer Anleitung und Kontrolle und unter
+Bedingungen, die ihnen verbieten, außerhalb ihrer Beziehung zu Ihnen weitere Kopien Ihres
+urheberrechtlich geschützten Materials anzufertigen.
+
+Übertragung ist in jedem Fall ausschließlich unter den unten aufgeführten Bedingungen gestattet.
+Unterlizensierung ist nicht gestattet, ist aber wegen §10 unnötig.
+3. Schutz von Anwenderrechten vor Umgehungsverbotgesetzen
+
+Kein betroffenes Werk darf als Teil eines wirksamen technischen Mechanismus' unter jedwedem
+anwendbarem Recht betrachtet werden, das die Auflagen von Artikel 11 des am 20. Dezember
+1996 verabschiedeten WIPO-Urheberrechtsvertrags oder unter vergleichbaren Gesetzen, die die
+Umgehung derartiger Mechanismen verbietet oder einschränkt.
+
+Wenn Sie ein betroffenes Werk übertragen, verzichten Sie auf jedes Recht, die Umgehung
+technischer Mechanismen zu verbieten, insoweit diese Umgehung durch die Ausübung der von
+dieser Lizenz gewährten Rechte in bezug auf das betroffene Werk herbeigeführt wird, und Sie
+weisen jede Absicht von sich, die Benutzung oder Modifikation des Werks zu beschränken, um
+Ihre Rechtsansprüche oder Rechtsansprüche Dritter zum Verbot der Umgehung technischer
+Mechanismen gegen die Anwender des Werks durchzusetzen.
+4. Unveränderte Kopien
+
+Sie dürfen auf beliebigen Medien unveränderte Kopien des Quelltextes des Programms, wie sie ihn
+erhalten, übertragen, sofern Sie auf deutliche und angemessene Weise auf jeder Kopie einen
+angemessenen Urheberrechts-Vermerk veröffentlichen, alle Hinweise intakt lassen, daß diese
+Lizenz und sämtliche gemäß §7 hinzugefügten Einschränkungen auf den Quelltext anwendbar sind,
+alle Hinweise auf das Nichtvorhandensein einer Garantie intakt lassen und allen Empfängern
+gemeinsam mit dem Programm ein Exemplar dieser Lizenz zukommen lassen.
+
+Sie dürfen für jede übertragene Kopie ein Entgelt oder auch kein Entgelt verlangen, und Sie
+dürfen Kundendienst- oder Garantieleistungen gegen Entgelt anbieten.
+5. Übertragung modifizierter Quelltextversionen
+
+Sie dürfen ein auf dem Programm basierendes Werk oder die nötigen Modifikationen, um es aus
+dem Programm zu generieren, kopieren und übertragen in Form von Quelltext unter den
+Bestimmungen von §4, vorausgesetzt, daß Sie zusätzlich alle im folgenden genannten Bedingungen
+erfüllen:
+
+a) Das veränderte Werk muß auffällige Vermerke tragen, die besagen, daß Sie es modifiziert
+haben, und die ein darauf bezogenes Datum angeben.
+b) Das veränderte Werk muß auffällige Vermerke tragen, die besagen, daß es unter dieser
+Lizenz einschließlich der gemäß §7 hinzugefügten Bedingungen herausgegeben wird. Diese
+Anforderung wandelt die Anforderung aus §4 ab, alle Hinweise intakt zu lassen.
+c) Sie müssen das Gesamtwerk als Ganzes gemäß dieser Lizenz an jeden lizensieren, der in
+den Besitz einer Kopie gelangt. Diese Lizenz wird daher ggf. einschließlich zusätzlicher
+Bedingungen gemäß §7 für das Werk als Ganzes und alle seine Teile gelten, unabhängig davon,
+wie diese zusammengepackt werden. Diese Lizenz erteilt keine Erlaubnis, das Werk in irgendeiner
+anderen Weise zu lizensieren, setzt aber eine derartige Erlaubnis nicht außer Kraft, wenn Sie sie
+diese gesondert erhalten haben.
+d) Wenn das Werk über interaktive Benutzerschnittstellen verfügt, müssen diese jeweils
+angemessene rechtliche Hinweise anzeigen. Wenn allerdings das Programm interaktive
+Benutzerschnittstellen hat, die keine angemessenen rechtlichen Hinweise anzeigen, braucht Ihr
+Werk nicht dafür zu sorgen, daß sie dies tun.
+
+Die Zusammenstellung eines betroffenen Werks mit anderen gesonderten und unabhängigen
+Werken, die nicht ihrer Natur nach Erweiterungen des betroffenen Werks sind und die nicht mit
+ihm in einer Weise kombiniert sind, um ein größeres Programm zu bilden, in oder auf einem
+Speicher- oder Verbreitungsmedium wird als Aggregat bezeichnet, wenn die Zusammenstellung
+und das sich für sie ergebende Urheberrecht nicht dazu verwendet werden, den Zugriff oder die
+Rechte der Benutzer der Zusammenstellung weiter einzuschränken, als dies die einzelnen Werke
+erlauben. Die Aufnahme des betroffenen Werks in ein Aggregat sorgt nicht dafür, daß diese Lizenz
+auf die anderen Teile des Aggregats wirke.
+6. Übertragung in Nicht-Quelltext-Form
+
+Sie dürfen ein betroffenes Werk in Form von Objekt-Code unter den Bedingungen der Paragraphen
+4 und 5 kopieren und übertragen vorausgesetzt, daß Sie außerdem den maschinenlesbaren
+korrespondierenden Quelltext unter den Bedingungen dieser Lizenz übertragen auf eine der
+folgenden Weisen:
+
+a) Sie übertragen den Objekt-Code in einem physikalischen Produkt (einschließlich ein
+physikalisches Speichermedium) gemeinsam mit dem korrespondierenden Quelltext, der sich
+unveränderlich auf einem haltbaren physikalischen Medium befindet, das üblicherweise für den
+Austausch von Software verwendet wird.
+b) Sie übertragen den Objekt-Code in einem physikalischen Produkt (einschließlich ein
+physikalisches Speichermedium) gemeinsam mit einem schriftlichen Angebot, das mindestens drei
+Jahre lang gültig sein muß und so lange, wie Sie Ersatzteile und Kundendienst für dieses
+Produktmodell anbieten, jedem, der im Besitz des Objekt-Codes ist, entweder (1) eine Kopie des
+korrespondierenden Quelltextes der gesamten Software, die in dem Produkt enthalten und von
+dieser Lizenz betroffen ist, zur Verfügung zu stellen auf einem haltbaren physikalischen Medium,
+das üblicherweise für den Austausch von Software verwendet wird, und zu nicht höheren Kosten
+als denen, die begründbar durch den physikalischen Vorgang der Übertragung des Quelltextes
+anfallen, oder (2) kostenlosen Zugriff, um den korrespondierenden Quelltext von einem Netzwerk-
+Server zu kopieren.
+c) Sie übertragen Kopien des Objekt-Codes gemeinsam mit einer Kopie des schriftlichen
+Angebots, den korrespondierenden Quelltext zur Verfügung zu stellen. Diese Alternative ist nur für
+gelegentliche, nicht-kommerzielle Übertragung zulässig und nur, wenn Sie den Objekt-Code als
+mit einem entsprechenden Angebot gemäß Absatz 6b erhalten haben.
+d)
+
+Sie übertragen den Objekt-Code dadurch, daß Sie Zugriff auf eine dafür vorgesehene Stelle
+gewähren, und bieten gleichwertigen Zugriff auf den korrespondierenden Quelltext auf gleichem
+Weg auf dieselbe Stelle und ohne zusätzliche Kosten. Sie müssen nicht von den Empfängern
+verlangen, den korrespondierenden Quelltext gemeinsam mit dem Objekt-Code zu kopieren. Wenn
+es sich bei der für das Kopieren vorgesehenen Stelle um einen Netzwerk-Server handelt, darf sich
+der korrespondierende Quelltext auf einem anderen Server befinden (von Ihnen oder von einem
+Dritten betrieben), der gleichwertige Kopiermöglichkeiten unterstützt vorausgesetzt Sie legen
+dem Objekt-Code klare Anleitungen bei, die besagen, wo der korrespondierende Quelltext zu
+finden ist. Unabhängig davon, welcher Netzwerk-Server den korrespondierenden Quelltext
+beherbergt, bleiben Sie verpflichtet, sicherzustellen, daß dieser lange genug bereitgestellt wird, um
+diesen Bedingungen zu genügen.
+e) Sie übertragen den Objekt-Code unter Verwendung von Peer-To-Peer-Übertragung
+vorausgesetzt, Sie informieren andere Teilnehmer darüber, wo der Objekt-Code und der
+korrespondierende Quelltext des Werks unter den Bedingungen von Absatz 6d öffentlich und
+kostenfrei angeboten werden.
+
+Ein abtrennbarer Anteil des Objekt-Codes, dessen Quelltext von dem korrespondierenden Quelltext
+als Systembibliothek ausgeschlossen ist, braucht bei der Übertragung des Werks als Objekt-Code
+nicht miteinbezogen zu werden.
+
+Ein Benutzerprodukt ist entweder (1) ein Endbenutzerprodukt, womit ein materieller
+persönlicher Besitz gemeint ist, der normalerweise für den persönlichen oder familiären Gebrauch
+oder im Haushalt eingesetzt wird, oder (2) alles, was für den Einbau in eine Wohnung hin
+entworfen oder dafür verkauft wird. Bei der Entscheidung, ob ein Produkt ein Endbenutzerprodukt
+ist, sollen Zweifelsfälle als erfaßt gelten. Wenn ein spezieller Anwender ein spezielles Produkt
+erhält, bezeichnet normalerweise einsetzen eine typische oder weitverbreitete Anwendung dieser
+Produktklasse, unabhängig vom Status des speziellen Anwenders oder der Art und Weise, wie der
+spezielle Anwender des spezielle Produkt tatsächlich einsetzt oder wie von ihm erwartet wird, daß
+er es einsetzt. Ein Produkt gilt als Endbenutzerprodukt unabhängig davon, ob es substantiellen
+kommerziellen, industriellen oder nicht-endbenutzerspezifischen Nutzen hat, es sei denn, dieser
+Nutzen stellt das einzige signifikante Anwendungsgebiet des Produkts dar.
+
+Mit Installationsinformationen für ein Benutzerprodukt sind jedwede Methoden, Prozeduren,
+Berechtigungsschlüssel oder andere informationen gemeint, die notwendig sind, um modifizierte
+Versionen eines betroffenen Werks, die aus einer modifizierten Version seines korrespondierenden
+Quelltextes hervorgegangen sind, auf dem Produkt zu installieren und auszuführen. Die
+Informationen müssen ausreichen, um sicherzustellen, daß das Weiterfunktionieren des
+modifizierten Objekt-Codes in keinem Fall verhindert oder gestört wird aus dem einzigen Grunde,
+weil Modifikationen vorgenommen worden sind.
+
+Wenn Sie Objekt-Code gemäß diesem Paragraphen innerhalb oder zusammen mit oder speziell für
+den Gebrauch innerhalb eines Benutzerprodukts übertragen und die Übertragung als Teil einer
+Transaktion stattfindet, in der das Recht auf den Besitz und die Benutzung des Benutzerprodukts
+dauerhaft auf den Empfänger übergeht (unabhängig davon, wie diese Transaktion charakterisiert
+ist), müssen dem gemäß diesem Paragraphen mitübertragenen korrespondierenden Quelltext die
+Installationsinformationen beiliegen. Diese Anforderung gilt jedoch nicht, wenn weder Sie noch
+irgendeine Drittpartei die Möglichkeit behält, modifizierten Objekt-Code auf dem Benutzerprodukt
+zu installieren (zum Beispiel, wenn das Werk in einem ROM installiert wurde).
+
+Die Anforderung, Installationsinformationen bereitzustellen, schließt keine Anforderung mit ein,
+weiterhin Kundendienst, Garantie oder Updates für ein Werk bereitzustellen, das vom Empfänger
+modifiziert oder installiert worden ist, oder für das Benutzerprodukt, in dem das Werk modifiziert
+oder installiert worden ist. Der Zugriff auf ein Computer-Netzwerk darf verweigert werden, wenn
+die Modifikation selbst die Funktion des Netzwerks grundlegend nachteilig beeinflußt oder wenn
+sie die Regeln und Protokolle für die Kommunikation über das Netzwerk verletzt.
+
+Der korrespondierende Quelltext und die Installationsinformationen, die in Übereinstimmung mit
+diesem Paragraphen übertragen werden, müssen in einem öffentlich dokumentierten Format
+vorliegen (für das eine Implementation in Form von Quelltext öffentlich zugänglich ist), und sie
+dürfen keine speziellen Passwörter oder Schlüssel für das Auspacken, Lesen oder Kopieren
+erfordern.
+7. Zusätzliche Bedingungen
+
+Zusätzliche Genehmigungen sind Bedingungen, die die Bedingungen dieser Lizenz ergänzen,
+indem sie Ausnahmen von einer oder mehreren Auflagen zulassen. Zusätzliche Genehmigungen
+zur Anwendung auf das gesamte Programm sollen so betrachtet werden, als wären sie in dieser
+Lizenz enthalten, soweit dies unter anwendbarem Recht zulässig ist. Wenn zusätzliche
+Genehmigungen nur für einen Teil des Programms gelten, darf dieser Teil separat unter diesen
+Genehmigungen verwendet werden; das gesamte Programm jedoch unterliegt weiterhin dieser
+Lizenz ohne Beachtung der zusätzlichen Genehmigungen.
+
+Ungeachtet jeglicher anderer Regelungen dieser Lizenz dürfen Sie für Material, das Sie einem
+betroffenen Werk hinzufügen (sofern Sie durch die Urheberrechtsinhaber dieses Materials
+autorisiert sind), die Bedingungen dieser Lizenz um folgendes ergänzen:
+
+a) Gewährleistungsausschluß oder Haftungsbegrenzung abweichend von §§15 und 16 dieser
+Lizenz oder
+b) die Anforderung, spezifizierte sinnvolle rechtliche Hinweise oder Autorenschaftshinweise
+in diesem Material oder in den angemessenen rechtlichen Hinweisen, die von den sie enthaltenen
+Werken angezeigt werden, zu erhalten, oder
+c) das Verbot, die Herkunft des Materials falsch darzustellen oder die Anforderung, daß
+modifizierte Versionen des Materials auf angemessens Weise als vom Original verschieden
+markiert werden, oder
+d) Begrenzung der Verwendung der Namen von Lizenzgebern oder Autoren des Materials für
+Werbezwecke oder
+e) das Zurückweisen der Einräumung von Rechten gemäß dem Markenrecht zur Benutzung
+gewisser Produktnamen, Produkt- oder Service-Marken oder
+f) die Erfordernis der Freistellung des Lizenznehmers und der Autoren des Materials durch
+jeden, der die Software (oder modifizierte Versionen davon) überträgt, mit vertraglichen Prämissen
+der Verantwortung gegenüber dem Empfänger für jede Verantwortung, die diese vertraglichen
+Prämissen diesen Lizenzgebern und Autoren direkt auferlegen.
+
+Alle anderen hinzugefügten einschränkenden Bedingungen werden als zusätzliche
+Einschränkungen im Sinne von §10 betrachtet. Wenn das Programm, wie Sie es erhalten haben,
+oder ein Teil davon dieser Lizenz untersteht zuzüglich einer weiteren Bedingung, die eine
+zusätzliche Einschränkung darstellt, dürfen Sie diese Bedingung entfernen. Wenn ein
+Lizenzdokument eine zusätzliche Einschränkung enthält, aber die Relizensierung unter dieser
+Lizenz erlaubt, dürfen Sie dem betroffenen Werk Material hinzufügen, das den Bedingungen jenes
+Lizenzdokuments unterliegt, unter der Voraussetzung, daß die zusätzlichen Einschränkungen bei
+einer derartigen Relizensierung oder Übertragung verfallen.
+
+Wenn Sie einem betroffenen Werk in Übereinstimmung mit diesem Paragraphen Bedingungen
+hinzufügen, müssen Sie in den betroffenen Quelltextdateien eine Aufstellung der zusätzlichen
+Bedingungen plazieren, die auf diese Quelltextdatei Anwendung finden, oder einen Hinweis darauf,
+wo die Zusätzlichen Bedingungen zu finden sind.
+
+Zusätzliche Bedingungen, seien es Genehmigungen oder Einschränkungen, dürfen in Form einer
+separaten schriftlichen Lizenz oder in Form von Ausnahmen festgelegt werden; die o.a.
+Anforderungen gelten in jedem Fall.
+8. Kündigung
+
+Sie dürfen das Programm nicht verbreiten oder modifizieren, sofern es nicht durch diese Lizenz
+ausdrücklich gestattet ist. Jeder anderweitige Versuch der Verbreitung oder Modifizierung ist
+nichtig und beendet automatisch Ihre Rechte unter dieser Lizenz (einschließlich aller
+Patentlizenzen gemäß §11 Abs. 3).
+
+Wenn Sie jedoch alle Verletzungen dieser Lizenz beenden, wird Ihre Lizenz durch einen speziellen
+Urheberrechtsinhaber wiederhergestellt, und zwar (a) vorübergehend, solange nicht bzw. bis der
+Rechteinhaber Ihre Lizenz ausdrücklich und endgültig kündigt, und (b) dauerhaft, sofern es der
+Rechteinhaber versäumt, Sie auf sinnvolle Weise auf die Lizenzverletzung innerhalb von 60 Tagen
+ab deren Beendigung hinzuweisen.
+
+Darüberhinaus wird Ihre Lizenz durch einen speziellen Urheberrechtsinhaber permanent
+wiederhergestellt, wenn Sie der Rechteinhaber auf sinnvolle Weise auf die Verletzung hinweist,
+wenn außerdem dies das erste Mal ist, daß Sie auf die Verletzung dieser Lizenz (für jedes Werk)
+des Rechteinhabers hingewiesen werden, und wenn Sie die Verletzung innerhalb von 30 Tagen ab
+dem Eingang des Hinweises einstellen.
+
+Die Beendigung Ihrer Rechte unter dieser Lizenz beendet nicht die Lizenzen Dritter, die von Ihnen
+Kopien oder Rechte unter dieser Lizenz erhalten haben. Wenn Ihre Rechte beendet und nicht
+dauerhaft wiederhergestellt worden sind, sind Sie nicht berechtigt, neue Lizenzen für dasselbe
+Material gemäß §10 zu erhalten.
+9. Annahme der Lizenz keine Voraussetzung für den Besitz von Kopien
+
+Um eine Kopie des Programms auszuführen, ist es nicht erforderlich, daß Sie diese Lizenz
+annehmen. Die nebenbei stattfindende Verbreitung eines betroffenen Werks, die sich ausschließlich
+als Konsequenz der Teilnahme an einer Peer-To-Peer-Datenübertragung ergibt, um eine Kopie
+entgegennehmen zu können, erfordert ebenfalls keine Annahme dieser Lizenz. Jedoch gibt Ihnen
+nichts außer dieser Lizenz die Erlaubnis, das Programm oder jedes betroffene Werk zu verbreiten
+oder zu verändern. Diese Handlungen verstoßen gegen das Urheberrecht, wenn Sie diese Lizenz
+nicht anerkennen. Indem Sie daher ein betroffenes Werk verändern oder propagieren, erklären Sie
+Ihr Einverständnis mit dieser Lizenz, die Ihnen diese Tätigkeiten erlaubt.
+10. Automatische Lizensierung nachgeordneter Anwender
+
+Jedesmal, wenn Sie ein betroffenes Werk übertragen, erhält der Empfänger automatisch vom
+ursprünglichen Lizenzgeber die Lizenz, das Werk auszuführen, zu verändern und zu propagieren
+in Übereinstimmung mit dieser Lizenz. Sie sind nicht dafür verantwortlich, die Einhaltung dieser
+Lizenz durch Dritte durchzusetzen.
+
+Eine Organisations-Transaktion ist entweder eine Transaktion, bei der die Kontrolle über eine
+Organisation oder das im wesentlichen gesamte Kapital einer solchen, übertragen wird, oder sie ist
+die Aufteilung einer Organisation in mehrere oder die Fusion mehrerer Organisationen zu einer.
+Wenn die Propagation eines betroffenen Werks durch eine Organisations-Transaktion erfolgt,
+erhält jeder an der Transaktion Beteiligte, der eine Kopie des Werks erhält, zugleich jedwede
+Lizenz an dem Werk, die der Interessenvorgänger des Beteiligten hatte, sowie das Recht auf den
+Besitz des korrespondierenden Quelltextes des Werks vom Interessenvorgänger, wenn dieser ihn
+hat oder mit vertretbarem Aufwand beschaffen kann.
+
+Sie dürfen keine zusätzlichen Einschränkungen bzgl. der Ausübung der unter dieser Lizenz
+gewährten oder zugesicherten Rechte vornehmen. Beispielsweise dürfen Sie keine Lizenzgebühr
+oder sonstige Gebühr für die Ausübung der unter dieser Lizenz gewährten Rechte verlangen, und
+Sie dürfen keine Rechtsstreitigkeit beginnen (eingeschlossen Kreuz- oder Gegenansprüche in einem
+Gerichtsverfahren), in der Sie unterstellen, daß irgendein Patentanspruch durch Erzeugung,
+Anwendung, Verkauf, Verkaufsangebot oder Import des Programms oder irgendeines Teils davon
+verletzt wurde.
+11. Patente
+
+Ein Kontributor ist ein Urheberrechtsinhaber, der die Benutzung des Programms oder eines auf
+dem Programm basierenden Werks unter dieser Lizenz erlaubt. Das auf diese Weise lizensierte
+Werk bezeichnen wir als die Kontributor-Version des Kontributors.
+
+Die wesentlichen Patentansprüche eines Kontributors sind all diejenigen Patentansprüche, die der
+Kontributor besitzt oder kontrolliert, ob bereits erworben oder erst in Zukunft zu erwerben, die
+durch irgendeine Weise des gemäß dieser Lizenz erlaubten Erzeugens, Ausführens oder Verkaufens
+seiner Kontributor-Version verletzt würden. Dies schließt keine Patentansprüche ein, die erst als
+Konsequenz weiterer Modifizierung seiner Kontributor-Version entstünden. Für den Zweck dieser
+Definition schließt "Kontrolle" das Recht mit ein, Unterlizenzen für ein Patent zu erteilen auf eine
+Weise, die mit den Erfordernissen dieser Lizenz vereinbar ist.
+
+Jeder Kontributor gewährt Ihnen eine nicht-exklusive, weltweite und gebührenfreie Patentlizenz
+gemäß den wesentlichen Patentansprüchen des Kontributors, den Inhalt seiner Kontributor-Version
+zu erzeugen, zu verkaufen, zum Verkauf anzubieten, zu importieren und außerdem auszuführen, zu
+modifizieren und zu propagieren.
+
+In den folgenden drei Absätzen ist eine Patentlizenz jedwede ausdrückliche Vereinbarung oder
+Verpflichtung, wie auch immer benannt, ein Patent nicht geltend zu machen (beispielsweise eine
+ausdrückliche Erlaubnis, ein Patent zu nutzen oder eine Zusicherung, bei Patentverletzung nicht zu
+klagen). Jemandem eine solche Patentlizenz zu erteilen bedeutet, eine solche Vereinbarung oder
+Verpflichtung zu beschließen, ein Patent nicht gegen ihn durchzusetzen.
+
+Wenn Sie ein betroffenes Werk übertragen, das wissentlich auf eine Patentlizenz angewiesen ist,
+und wenn der korrespondierende Quelltext nicht für jeden zum Kopieren zur Verfügung gestellt
+wird kostenlos, unter den Bedingungen dieser Lizenz und über einen öffentlich zugänglichen
+Netzwerk-Server oder andere leicht zugängliche Mittel , dann müssen Sie entweder (1) dafür
+sorgen, daß der korrespondierende Quelltext auf diese Weise verfügbar gemacht wird oder (2)
+dafür sorgen, daß Ihnen selbst die Vorteile der Patentlizenz für dieses spezielle Werk entzogen
+werden oder (3) in einer mit den Erfordernissen dieser Lizenz vereinbaren Weise bewirken, daß die
+Patentlizenz auf nachgeordnete Empfänger ausgedehnt wird. Wissentlich angewiesen sein
+bedeutet, daß Sie tatsächliches Wissen darüber haben, daß außer wegen der Patentlizenz Ihre
+Übertragung des betroffenen Werks in einen Staat oder die Benutzung des betroffenen Werks durch
+Ihren Empfänger in einem Staat, eins oder mehrere identifizierbare Patente in diesem Staat
+verletzen würden, deren Gültigkeit Ihnen glaubhaft erscheint.
+
+Wenn Sie, als Folge von oder in Verbindung mit einer einzelnen Transaktion oder Vereinbarung,
+ein betroffenes Werk übertragen oder durch Vermittlung einer Übertragung propagieren, und Sie
+gewähren einigen Empfängern eine Patentlizenz, die ihnen das Benutzen, Propagieren,
+Modifizieren und Übertragen einer speziellen Kopie des betroffenen Werks gestatten, dann wird
+die von Ihnen gewährte Patentlizenz automatisch auf alle Empfänger des betroffenen Werks und
+darauf basierender Werke ausgedehnt.
+
+Eine Patentlizenz ist diskriminierend, wenn sie in ihrem Gültigkeitsbereich die speziell unter
+dieser Lizenz gewährten Rechte nicht einschließt, wenn sie die Ausübung dieser Rechte verbietet
+oder wenn sie die Nichtausübung einer oder mehrerer dieser Rechte zur Bedingung hat. Sie dürfen
+ein betroffenes Werk nicht übertragen, wenn Sie Partner in einem Vertrag mit einer Drittpartei sind,
+die auf dem Gebiet der Verbreitung von Software geschäftlich tätig ist, gemäß dem Sie dieser
+Drittpartei Zahlungen leisten, die auf dem Maß Ihrer Aktivität des Übertragens des Werks basieren,
+und gemäß dem die Drittpartei eine diskriminierende Patentlizenz all denjenigen gewährt, die das
+Werk von Ihnen erhielten, (a) in Verbindung mit von Ihnen übertragenen Kopien des betroffenen
+Werks (oder Kopien dieser Kopien) oder (b) hauptsächlich für und in Verbindung mit spezifischen
+Produkten oder Zusammenstellungen, die das betroffene Werk enthalten, es sei denn, Sie sind in
+diesen Vertrag vor dem 28. März 2007 eingetreten oder die Patentlizenz wurde vor diesem Datum
+erteilt.
+
+Nichts in dieser Lizenz soll in einer Weise ausgelegt werden, die irgendeine implizite Lizenz oder
+sonstige Abwehr gegen Rechtsverletzung ausschließt oder begrenzt, die Ihnen ansonsten gemäß
+anwendbarem Patentrecht zustünde.
+12. Keine Preisgabe der Freiheit Dritter
+
+Sollten Ihnen (durch Gerichtsbeschluß, Vergleich oder anderweitig) Bedingungen auferlegt
+werden, die den Bedingungen dieser Lizenz widersprechen, so befreien Sie diese Umstände nicht
+von den Bestimmungen dieser Lizenz. Wenn es Ihnen nicht möglich ist, ein betroffenes Werk unter
+gleichzeitiger Beachtung der Bedingungen in dieser Lizenz und Ihrer anderweitigen
+Verpflichtungen zu übertragen, dann dürfen Sie als Folge das Programm überhaupt nicht
+übertragen. Wenn Sie zum Beispiel Bedingungen akzeptieren, die Sie dazu verpflichten, von denen,
+denen Sie das Programm übertragen haben, eine Gebühr für die weitere Übertragung einzufordern,
+dann besteht der einzige Weg, sowohl jene Bedingungen als auch diese Lizenz zu befolgen darin,
+ganz auf die Übertragung des Programms zu verzichten.
+13. Nutzung zusammen mit der GNU Affero General Public License
+
+Ungeachtet anderer Regelungen dieser Lizenz, ist es Ihnen gestattet, ein betroffenes Werk mit
+einem Werk zu einem einzelnen, kombinierten Werk zu verbinden (linken) oder zu kombinieren,
+das unter Version 3 der GNU Affero General Public License steht, und das Ergebnis zu übertragen.
+Die Bedingungen dieser Lizenz bleiben weiterhin auf denjenigen Teil anwendbar, der das
+betroffene Werk darstellt, aber die speziellen Anforderungen der GNU Affero General Public
+License, §13, die sich auf Interaktion über ein Computer-Netzwerk beziehen, werden auf die
+Kombination als solche anwendbar.
+14. Überarbeitungen dieser Lizenz
+
+Die Free Software Foundation kann von Zeit zu Zeit überarbeitete und/oder neue Versionen der
+General Public License veröffentlichen. Solche neuen Versionen werden vom Grundprinzip her der
+gegenwärtigen entsprechen, können aber im Detail abweichen, um neuen Problemen und
+Anforderungen gerecht zu werden.
+
+Jede Version dieser Lizenz hat eine eindeutige Versionsnummer. Wenn in einem Programm
+angegeben wird, daß es dieser Lizenz in einer bestimmten Versionsnummer oder jeder späteren
+Version (or any later version) unterliegt, so haben Sie die Wahl, entweder den Bestimmungen
+der genannten Version zu folgen oder denen jeder beliebigen späteren Version, die von der Free
+Software Foundation veröffentlicht wurde. Wenn das Programm keine Versionsnummer angibt,
+können Sie eine beliebige Version wählen, die je von der Free Software Foundation veröffentlicht
+wurde.
+15. Gewährleistungsausschluß
+
+Es besteht keinerlei Gewährleistung für das Programm, soweit dies gesetzlich zulässig ist. Sofern
+nicht anderweitig schriftlich bestätigt, stellen die Urheberrechtsinhaber und/oder Dritte das
+Programm so zur Verfügung, wie es ist, ohne irgendeine Gewährleistung, weder ausdrücklich
+noch implizit, einschließlich aber nicht begrenzt auf die implizite Gewährleistung der
+Marktreife oder der Verwendbarkeit für einen bestimmten Zweck. Das volle Risiko bezüglich
+Qualität und Leistungsfähigkeit des Programms liegt bei Ihnen. Sollte sich das Programm als
+fehlerhaft herausstellen, liegen die Kosten für notwendigen Service, Reparatur oder Korrektur bei
+Ihnen.
+16. Haftungsbegrenzung
+
+In keinem Fall, außer wenn durch geltendes Recht gefordert oder schriftlich zugesichert, ist
+irgendein Urheberrechtsinhaber oder irgendein Dritter, der das Programm wie oben erlaubt
+modifiziert oder übertragen hat, Ihnen gegenüber für irgendwelche Schäden haftbar, einschließlich
+jeglicher allgemeiner oder spezieller Schäden, Schäden durch Seiteneffekte (Nebenwirkungen) oder
+Folgeschäden, die aus der Benutzung des Programms oder der Unbenutzbarkeit des Programms
+folgen (einschließlich aber nicht beschränkt auf Datenverluste, fehlerhafte Verarbeitung von
+Daten, Verluste, die von Ihnen oder anderen getragen werden müssen, oder dem Unvermögen des
+Programms, mit irgendeinem anderen Programm zusammenzuarbeiten), selbst wenn ein
+Urheberrechtsinhaber oder Dritter über die Möglichkeit solcher Schäden unterrichtet worden war.
+17. Interpretation von §§ 15 und 16
+
+Sollten der o.a. Gewährleistungsausschluß und die o.a. Haftungsbegrenzung aufgrund ihrer
+Bedingungen gemäß lokalem Recht unwirksam sein, sollen Bewertungsgerichte dasjenige lokale
+Recht anwenden, das einer absoluten Aufhebung jeglicher zivilen Haftung in Zusammenhang mit
+dem Programm am nächsten kommt, es sei denn, dem Programm lag eine entgeltliche
+Garantieerklärung oder Haftungsübernahme bei.
+ENDE DER LIZENZBEDINGUNGEN
diff -r 000000000000 -r 96a35aeda5f2 code_part1/OSTC_code_asm_part1/docu/COPYING__GNU_GPLv3_english.txt
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/code_part1/OSTC_code_asm_part1/docu/COPYING__GNU_GPLv3_english.txt Tue Jan 12 15:05:59 2010 +0100
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc.
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. 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
+them 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 prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. 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.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey 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;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If 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 convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU 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 that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ 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.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+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.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ 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
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+
+ Copyright (C)
+
+ 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 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ 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, see .
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ Copyright (C)
+ This program 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, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+.
+
+ The GNU 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 Lesser General
+Public License instead of this License. But first, please read
+.
\ No newline at end of file
diff -r 000000000000 -r 96a35aeda5f2 code_part1/OSTC_code_asm_part1/docu/README_howtocompile.pdf
Binary file code_part1/OSTC_code_asm_part1/docu/README_howtocompile.pdf has changed
diff -r 000000000000 -r 96a35aeda5f2 code_part1/OSTC_code_asm_part1/eeprom_rs232.asm
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/code_part1/OSTC_code_asm_part1/eeprom_rs232.asm Tue Jan 12 15:05:59 2010 +0100
@@ -0,0 +1,237 @@
+; OSTC - diving computer code
+; Copyright (C) 2008 HeinrichsWeikamp GbR
+
+; 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 3 of the License, or
+; (at your option) any later version.
+
+; This program is distributed in the hope that it will be useful,
+; but WITHOUT ANY WARRANTY; without even the implied warranty of
+; 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, see .
+
+
+; internal EEPROM and RS232 UART interface
+; written by: Matthias Heinrichs, info@heinrichsweikamp.com
+; written: 02/01/06
+; last updated: 090109
+; known bugs:
+; ToDo:
+
+write_int_eeprom macro eeprom_address
+ movlw eeprom_address
+ call write_int_eeprom_1
+ endm
+
+write_int_eeprom_1:
+ movwf EEADR
+ bra write_eeprom ; writes and "returns" after write
+
+read_int_eeprom macro eeprom_address
+ movlw eeprom_address
+ call read_int_eeprom_1
+ endm
+
+read_int_eeprom_1:
+ movwf EEADR
+ bra read_eeprom ; reads and "returns" after write
+
+internal_eeprom_access_b1: ; accesses internal EEPROM BANK 1 via the UART
+ bcf internal_eeprom_write2 ; clear flag!
+ movlw d'1'
+ movwf EEADRH ;BANK1
+ movlw "i"
+ bra internal_eeprom_access1 ; Continue with bank1 and bank0 common routines
+
+internal_eeprom_access_b0: ; accesses internal EEPROM BANK 0 via the UART
+ bcf internal_eeprom_write ; clear flag!
+ clrf EEADRH ; Bank0
+ movlw "d"
+; bra internal_eeprom_access1 ; Continue with bank1 and bank0 common routines
+
+internal_eeprom_access1:
+ movwf TXREG ; Send command echo ("i" or "d")
+ bsf no_sensor_int ; No Sensor Interrupt
+ movlw d'4'
+ movwf EEADR
+ bcf PIE1,RCIE ; no interrupt for UART
+ bcf PIR1,RCIF ; clear flag
+ call set_LEDusb ; LEDusb ON
+
+internal_eeprom_access2:
+ rcall rs232_get_byte ; Get byte to write...
+ movff RCREG,EEDATA ; copy to write register
+ call set_LEDy ; show activity
+
+ btfsc rs232_recieve_overflow ; overflow recieved?
+ bra internal_eeprom_access3 ; Yes, abort!
+
+ rcall write_eeprom ; No, write one byte
+ call clear_LEDy
+ movff EEDATA,TXREG ; Send echo!
+ rcall rs232_wait_tx ; Wait for UART
+ incfsz EEADR,F ; Do until EEADR rolls to zero
+ bra internal_eeprom_access2
+internal_eeprom_access2a:
+ call clear_LEDusb ; LEDusb OFF
+ bcf PIR1,RCIF ; clear flag
+ bsf PIE1,RCIE ; re-enable interrupt for UART
+ clrf EEADRH ; Point to Bank0 again
+ bcf rs232_recieve_overflow ; Clear Flag
+ bcf no_sensor_int ; Renable Sensor Interrupt
+ goto restart
+
+internal_eeprom_access3: ; Overflow! Abort writing
+ movlw 0xFF
+ movwf TXREG ; Error Byte
+ bra internal_eeprom_access2a ; Quit
+
+read_eeprom: ; reads from internal eeprom
+ bcf EECON1,EEPGD
+ bcf EECON1,CFGS
+ bsf EECON1,RD
+ return
+
+write_eeprom: ; writes into internal eeprom
+ bcf EECON1,EEPGD
+ bcf EECON1,CFGS
+ bsf EECON1,WREN
+
+ bcf INTCON,GIE ; even the RTC will be delayed for the next 5 instructions...
+ movlw 0x55
+ movwf EECON2
+ movlw 0xAA
+ movwf EECON2
+ bsf EECON1,WR
+ bsf INTCON,GIE ; ...but the flag for the ISR routines were still set, so they will interrupt now!
+
+write_eep2:
+ btfsc EECON1,WR
+ bra write_eep2 ; wait about 4ms...
+ bcf EECON1,WREN
+ return
+
+
+
+; RS232 Routines:
+;enable_rs232_19k2_tx:
+; bsf TRISC,6 ; TX Pin
+; movlw b'00100100' ; initialise serial port for 19200/8/N/1 BRGH=1
+; movwf TXSTA
+; return
+;
+;disable_rs232_19k2_tx:
+; bcf TRISC,6 ; TX Pin
+; movlw b'00000100' ; Only receiver mode, BRGH=1
+; movwf TXSTA
+; bsf PORTC,6 ; TX PIN
+; return
+;
+;enable_rs232_19k2:
+; bsf TRISC,6 ; TX Pin IO Ports must be input in order to activate the module
+; bsf TRISC,7 ; RX Pin
+;
+; movlw b'00100100' ; initialise serial port for 19200/8/N/1 BRGH=1
+; movwf TXSTA
+; movlw b'10000000'
+; movwf RCSTA
+; movlw b'00001000' ; BRG16=1
+; movwf BAUDCON
+; bsf RCSTA,CREN ; Enable
+; movlw d'0'
+; movwf SPBRGH
+; movlw d'207' ; Take care of the baud rate when changing Fosc!
+; movwf SPBRG
+; clrf RCREG
+; bcf PIE1,RCIE ; disable interrupt for RS232
+; clrf PIR1
+; return
+;
+
+enable_rs232: ;IO Ports must be input in order to activate the module
+ bsf TRISC,6 ; TX Pin
+ bsf TRISC,7 ; RX Pin
+
+ movlw b'00100100' ; BRGH=1
+ movwf TXSTA
+ movlw b'10010000'
+ movwf RCSTA
+ movlw b'00001000'
+ movwf BAUDCON
+ clrf SPBRGH
+ movlw d'34' ; Take care of the baud rate when changing Fosc!
+ movwf SPBRG
+ clrf RCREG
+ clrf PIR1
+ bsf PIE1,RCIE ; enable interrupt for RS232
+ return
+
+disable_rs232:
+ clrf TXSTA
+ clrf RCSTA
+ bcf PIE1,RCIE ; disable interrupt for RS232
+ bcf TRISC,6 ; TX Pin
+ bcf TRISC,7 ; RX Pin
+ bcf PORTC,6 ; TX Pin
+ bcf PORTC,7 ; RX Pin
+ return
+
+rs232_wait_tx:
+ btfss RCSTA,SPEN ; Transmitter active?
+ return ; No, return!
+ nop
+ btfss TXSTA,TRMT ; RS232 Busy?
+ bra rs232_wait_tx ; yes, wait...
+ return ; Done.
+
+
+rs232_get_byte:
+ bcf PIR1,RCIF ; clear flag
+ bcf rs232_recieve_overflow ; clear flag
+ clrf uart1_temp
+rs232_get_byte2:
+ clrf uart2_temp
+rs232_get_byte3:
+ btfsc PIR1,RCIF ; data arrived?
+ return ; data received
+
+ nop ; Wait 1us * 255 * 255 = 65ms+x Timeout/Byte
+ nop
+ nop
+ nop
+ btfsc PIR1,RCIF ; data arrived?
+ return
+
+ nop
+ nop
+ nop
+ nop
+ btfsc PIR1,RCIF ; data arrived?
+ return
+
+ nop
+ nop
+ nop
+ nop
+ btfsc PIR1,RCIF ; data arrived?
+ return
+ nop
+ nop
+ nop
+ nop
+ btfsc PIR1,RCIF ; data arrived?
+ return
+
+ decfsz uart2_temp,F
+ bra rs232_get_byte3
+ decfsz uart1_temp,F
+ bra rs232_get_byte2
+ ; timeout occoured (about 20ms)
+ bcf RCSTA,CREN ; Clear receiver status
+ bsf RCSTA,CREN
+ bsf rs232_recieve_overflow ; set flag
+ return ; and return anyway
\ No newline at end of file
diff -r 000000000000 -r 96a35aeda5f2 code_part1/OSTC_code_asm_part1/fisch_128x64.inc
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/code_part1/OSTC_code_asm_part1/fisch_128x64.inc Tue Jan 12 15:05:59 2010 +0100
@@ -0,0 +1,513 @@
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x0f, 0xff, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x0f, 0xff, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x0f, 0xff, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0xff, 0xf0, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0xff, 0xf0, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0xff, 0xf0, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0xff, 0xf0, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x0f, 0xff, 0xf0, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x0f, 0xff, 0xf0, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x0f, 0xff, 0xf0, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x0f, 0xff, 0xf0, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x0f, 0xff, 0xf0, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x0f, 0xff, 0xf0, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x0f, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x0f, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00;
+ db 0x00, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x0f, 0xff;
+ db 0xff, 0x0f, 0xff, 0xff, 0xff, 0xf0, 0xff, 0xff;
+ db 0x0f, 0xff, 0xff, 0xff, 0x0f, 0xff, 0x0f, 0xff;
+ db 0xff, 0x0f, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00;
+ db 0x00, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x0f, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0x0f, 0xff, 0xff, 0xff, 0x0f, 0x0f, 0x0f, 0xff;
+ db 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00;
+ db 0x0f, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x0f, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0x0f, 0xff, 0xff, 0xff, 0x0f, 0x0f, 0x0f, 0xff;
+ db 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x0f, 0x00;
+ db 0x0f, 0x0f, 0x00, 0x0f, 0x00, 0xf0, 0xf0, 0x0f;
+ db 0x00, 0x0f, 0x00, 0x0f, 0x0f, 0x0f, 0x0f, 0x00;
+ db 0x0f, 0x0f, 0x0f, 0x0f, 0xf0, 0x0f, 0x00, 0x00;
+ db 0x0f, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x0f, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x0f, 0x0f;
+ db 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0xf0, 0xf0, 0xff;
+ db 0x0f, 0x0f, 0x0f, 0xff, 0x0f, 0x0f, 0x0f, 0x0f;
+ db 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f;
+ db 0x0f, 0x0f, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00;
+ db 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x0f, 0x00;
+ db 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0xf0, 0xf0, 0xff;
+ db 0x0f, 0x0f, 0x00, 0x0f, 0x0f, 0x0f, 0x0f, 0x00;
+ db 0x0f, 0x0f, 0x00, 0xff, 0x0f, 0x0f, 0x0f, 0x0f;
+ db 0x0f, 0x0f, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00;
+ db 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x0f, 0x0f;
+ db 0xff, 0x0f, 0x0f, 0x0f, 0x0f, 0xf0, 0xf0, 0xff;
+ db 0x0f, 0x0f, 0xff, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f;
+ db 0xff, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f;
+ db 0x0f, 0x0f, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00;
+ db 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x0f, 0x00;
+ db 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0xf0, 0xf0, 0x0f;
+ db 0x0f, 0x0f, 0x00, 0x0f, 0xf0, 0x00, 0xff, 0x00;
+ db 0x0f, 0x0f, 0x0f, 0x0f, 0xf0, 0x0f, 0x0f, 0x0f;
+ db 0x0f, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00;
+ db 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xf0, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x0f;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00;
+ db 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xf0, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x0f;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00;
+ db 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00;
+ db 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00;
+ db 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00;
+ db 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00;
+ db 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x0f, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00;
+ db 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0x00, 0x00, 0x0f, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00;
+ db 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xf0, 0x0f, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00;
+ db 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xf0, 0x0f, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xf0, 0x00;
+ db 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00;
+ db 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xf0, 0xff, 0xf0, 0x00, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0x00;
+ db 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xf0, 0xff, 0xff, 0x0f;
+ db 0xf0, 0x0f, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00;
+ db 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, 0x00;
+ db 0xf0, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0x00;
+ db 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0x0f, 0xff, 0xff, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0x00, 0x0f, 0xff, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xf0;
+ db 0x0f, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0x00;
+ db 0x00, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0;
+ db 0x00, 0xf0, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x0f, 0xf0;
+ db 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x0f, 0xf0, 0x0f, 0xff;
+ db 0x0f, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0xf0, 0x00, 0x0f, 0xff, 0x0f, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0xff, 0x00, 0x0f, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff;
+ db 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+ db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;
+
\ No newline at end of file
diff -r 000000000000 -r 96a35aeda5f2 code_part1/OSTC_code_asm_part1/i2c_eeprom.asm
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/code_part1/OSTC_code_asm_part1/i2c_eeprom.asm Tue Jan 12 15:05:59 2010 +0100
@@ -0,0 +1,365 @@
+
+; OSTC - diving computer code
+; Copyright (C) 2008 HeinrichsWeikamp GbR
+; 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 3 of the License, or
+; (at your option) any later version.
+; This program is distributed in the hope that it will be useful,
+; but WITHOUT ANY WARRANTY; without even the implied warranty of
+; 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, see .
+; provides routines for external EEPROM via I2C
+; written by: Matthias Heinrichs, info@heinrichsweikamp.com
+; written: 10/30/05
+; last updated: 08/21/06
+; known bugs:
+; ToDo: use 2nd 32KB from external EEPROM for something
+
+incf_eeprom_address macro ext_ee_temp1 ; Will increase eeprom_address:2 with the 8Bit value "ext_ee_temp1" and takes
+ movlw ext_ee_temp1 ; care of bank switching at 0x8000
+ call incf_eeprom_address0
+ endm
+
+incf_eeprom_address0:
+ movwf ext_ee_temp1
+incf_eeprom_address1:
+ movlw d'1' ; increase address
+ addwf eeprom_address+0,F
+ movlw d'0'
+ addwfc eeprom_address+1,F
+ btfss eeprom_address+1,7 ; at address 8000?
+ bra incf_eeprom_address2 ; No, continue
+
+ ; Yes, clear eeprom_address:2
+ clrf eeprom_address+0 ; Clear eeprom address
+ clrf eeprom_address+1
+
+incf_eeprom_address2:
+ decfsz ext_ee_temp1,F ; All done?
+ bra incf_eeprom_address1 ; No, continue
+ return ; Done.
+
+decf_eeprom_address macro ext_ee_temp1 ; Will decrease eeprom_address:2 with the 8Bit value "ext_ee_temp1" and takes
+ movlw ext_ee_temp1 ; care of bank switching at 0x8000
+ call decf_eeprom_address0
+ endm
+
+decf_eeprom_address0:
+ movwf ext_ee_temp1
+decf_eeprom_address1:
+ movlw d'1' ; decrease address
+ subwf eeprom_address+0,F
+ movlw d'0'
+ subwfb eeprom_address+1,F
+
+ btfss eeprom_address+1,7 ; at address 8000?
+ bra decf_eeprom_address2 ; No, continue
+
+ movlw b'01111111' ; yes, reset highbyte
+ movwf eeprom_address+1
+
+decf_eeprom_address2:
+ decfsz ext_ee_temp1,F ; All done?
+ bra decf_eeprom_address1 ; No, continue
+ return ; Done.
+
+
+write_external_eeprom: ; data in WREG
+ ; increase address eeprom_address+0:eeprom_address+1 after write
+ ; with banking after 7FFF
+ rcall I2CWRITE ; writes WREG into EEPROM@eeprom_address
+ movlw d'1' ; increase address
+ addwf eeprom_address+0,F
+ movlw d'0'
+ addwfc eeprom_address+1,F
+ bcf eeprom_overflow
+ btfss eeprom_address+1,7 ; at address 8000?
+ return ; no, return
+
+ clrf eeprom_address+0 ; Clear eeprom address
+ clrf eeprom_address+1
+ bsf eeprom_overflow ; and set overflow bit
+ return
+write_external_eeprom_block: ; Writes a block of 64Byte (one page in external EEPROM without stop condition
+ btfsc eeprom_blockwrite ; Blockwrite continue?
+ rcall I2CWRITE_BLOCK2
+ btfss eeprom_blockwrite ; Blockwrite start?
+ rcall I2CWRITE_BLOCK
+ bsf eeprom_blockwrite ; After the start, do blockwriting for the next 63Bytes!
+
+ movlw d'0' ; increase address
+ incf eeprom_address+0,F
+ addwfc eeprom_address+1,F
+ bcf eeprom_overflow
+
+ btfss eeprom_address+1,7 ; at address 8000
+ return ; no, return
+
+ clrf eeprom_address+0 ; Clear eeprom address
+ clrf eeprom_address+1
+ bsf eeprom_overflow ; and set overflow bit
+ return
+I2CWRITE_BLOCK:
+ movwf ext_ee_temp1 ; Data byte in WREG
+ bsf SSPCON2,SEN ; Start condition
+ rcall WaitMSSP
+ movlw b'10100110' ; Bit0=0: WRITE, Bit0=1: READ
+ movwf SSPBUF ; control byte
+ rcall WaitMSSP
+ rcall I2C_WaitforACK
+ movff eeprom_address+1,SSPBUF ; High Address byte
+ rcall WaitMSSP
+ rcall I2C_WaitforACK
+ movff eeprom_address+0,SSPBUF ; Low Address byte
+ rcall WaitMSSP
+ rcall I2C_WaitforACK
+I2CWRITE_BLOCK2:
+ movff ext_ee_temp1, SSPBUF ; Data Byte
+ rcall WaitMSSP
+ rcall I2C_WaitforACK
+ return
+
+
+get_free_EEPROM_location: ; Searches 0xFD, 0xFD, 0xFE and sets Pointer to 0xFE
+ clrf ext_ee_temp1 ; low address counter
+ clrf ext_ee_temp2 ; high address counter
+ bcf second_FD ; clear flags
+ bcf first_FD
+get_free_EEPROM_location3:
+ bsf SSPCON2, PEN ; Stop condition
+ rcall WaitMSSP
+ bsf SSPCON2,SEN ; Start condition
+ rcall WaitMSSP
+ movlw b'10100110' ; Bit0=0: WRITE, Bit0=1: READ
+ movwf SSPBUF ; control byte
+ rcall WaitMSSP
+ btfsc SSPCON2,ACKSTAT
+ bra get_free_EEPROM_location3 ; EEPROM NOT acknowledged, retry!
+
+ movff ext_ee_temp2,SSPBUF ; High Address byte
+ rcall WaitMSSP
+ rcall I2C_WaitforACK
+ movff ext_ee_temp1,SSPBUF ; Low Address byte
+ rcall WaitMSSP
+ rcall I2C_WaitforACK
+
+ bsf SSPCON2,RSEN ; Start condition
+ rcall WaitMSSP
+ movlw b'10100111' ; Bit0=0: WRITE, Bit0=1: READ
+ movwf SSPBUF ; control byte
+ rcall WaitMSSP
+ rcall I2C_WaitforACK
+
+get_free_EEPROM_location2:
+ bsf SSPCON2, RCEN ; Enable recieve mode
+ rcall WaitMSSP
+ btfsc first_FD
+ bra test_2nd_FD
+ bsf first_FD ; found first 0xFD?
+ movlw 0xFD
+ cpfseq SSPBUF
+ bcf first_FD ; No
+ bra get_free_EEPROM_location2c
+
+test_2nd_FD:
+ btfsc second_FD
+ bra test_FE
+ bsf second_FD ; found second 0xFD?
+ movlw 0xFD
+ cpfseq SSPBUF
+ bra get_free_EEPROM_location2b ;No, clear both flags
+ bra get_free_EEPROM_location2c
+test_FE:
+ movlw 0xFE ; found the final 0xFE?
+ cpfseq SSPBUF
+ bra get_free_EEPROM_location2b ;No, clear both flags
+ movff ext_ee_temp1,eeprom_address+0 ;Yes, copy ext_ee_temp1->eeprom_address+0 and
+ movff ext_ee_temp2,eeprom_address+1 ;ext_ee_temp2->eeprom_address+1
+ bra get_free_EEPROM_location4 ; Done.
+
+get_free_EEPROM_location2b:
+ bcf second_FD ; clear both flags!
+ bcf first_FD
+get_free_EEPROM_location2c:
+ movlw d'1' ; and increase search address
+ addwf ext_ee_temp1,F
+ movlw d'0'
+ addwfc ext_ee_temp2,F
+
+ btfsc ext_ee_temp2,7 ; 8000 reached?
+ bra get_free_EEPROM_location3b ; yes
+
+ bsf SSPCON2, ACKEN ; no, send Ack
+ rcall WaitMSSP
+ bra get_free_EEPROM_location2 ; and continue search
+get_free_EEPROM_location3b:
+ clrf eeprom_address+0 ; Not found in entire EEPROM, set to address 0
+ clrf eeprom_address+1
+get_free_EEPROM_location4:
+ bsf SSPCON2, PEN ; Stop
+ rcall WaitMSSP
+
+ bcf second_FD ; clear flags
+ bcf first_FD
+ return ; return
+
+
+I2CREAD:
+ bsf SSPCON2, PEN ; Stop
+ rcall WaitMSSP
+ bsf SSPCON2,SEN ; Start condition
+ rcall WaitMSSP
+ movlw b'10100110' ; Bit0=0: WRITE, Bit0=1: READ
+ movwf SSPBUF ; control byte
+ rcall WaitMSSP
+ btfsc SSPCON2,ACKSTAT
+ bra I2CREAD ; EEPROM NOT acknowledged, retry!
+ movff eeprom_address+1,SSPBUF ; High Address byte
+ rcall WaitMSSP
+ rcall I2C_WaitforACK
+ movff eeprom_address+0,SSPBUF ; Low Address byte
+ rcall WaitMSSP
+ rcall I2C_WaitforACK
+
+ bsf SSPCON2,RSEN ; Start condition
+ rcall WaitMSSP
+ movlw b'10100111' ; Bit0=0: WRITE, Bit0=1: READ
+ movwf SSPBUF ; control byte
+ rcall WaitMSSP
+ rcall I2C_WaitforACK
+
+ bsf SSPCON2, RCEN ; Enable recieve mode
+ rcall WaitMSSP
+ movf SSPBUF,W ; copy read byte into WREG
+ bsf SSPCON2, PEN ; Stop
+ rcall WaitMSSP
+ return
+
+I2CREAD2: ; same as I2CREAD but with automatic address increase
+ rcall I2CREAD
+ movlw d'1'
+ addwf eeprom_address+0,F
+ movlw d'0'
+ addwfc eeprom_address+1,F
+ bcf eeprom_overflow
+ btfss eeprom_address+1,7 ; at 0x8000?
+ return ; no, return
+
+ clrf eeprom_address+0 ; Yes, clear address
+ clrf eeprom_address+1
+ bsf eeprom_overflow ; and set overflow bit
+ return
+
+I2CWRITE:
+ movwf ext_ee_temp1 ; Data byte
+ bsf SSPCON2,SEN ; Start condition
+ rcall WaitMSSP
+ movlw b'10100110' ; Bit0=0: WRITE, Bit0=1: READ
+ movwf SSPBUF ; control byte
+ rcall WaitMSSP
+ rcall I2C_WaitforACK
+ movff eeprom_address+1,SSPBUF ; High Address byte
+ rcall WaitMSSP
+ rcall I2C_WaitforACK
+ movff eeprom_address+0,SSPBUF ; Low Address byte
+ rcall WaitMSSP
+ rcall I2C_WaitforACK
+ movff ext_ee_temp1, SSPBUF ; Data Byte
+ rcall WaitMSSP
+ rcall I2C_WaitforACK
+ bsf SSPCON2,PEN ; Stop condition
+ rcall WaitMSSP
+ WAITMS d'6' ; Write delay
+ return
+
+I2C_WaitforACK:
+ btfsc SSPCON2,ACKSTAT ; checks for ACK bit from slave
+ rcall I2CFail
+ return
+
+I2CFail:
+ ostc_debug 'M' ; Sends debug-information to screen if debugmode active
+ call set_LEDy
+ rcall I2CReset ; I2C Reset
+ bcf PIR1,SSPIF
+ clrf i2c_temp
+ return
+
+WaitMSSP:
+ decfsz i2c_temp,F ; check for timeout during I2C action
+ bra WaitMSSP2
+ bra I2CFail ; timeout occured
+WaitMSSP2:
+ btfss PIR1,SSPIF
+ bra WaitMSSP
+ clrf i2c_temp
+ bcf PIR1,SSPIF
+ return
+
+I2CReset: ; Something went wrong (Slave holds SDA low?)
+ clrf SSPCON1 ; wake-up slave and reset entire module
+ ostc_debug 'N' ; Sends debug-information to screen if debugmode active
+ clrf SSPCON2
+ clrf SSPSTAT
+ bcf TRISC,3 ; SCL OUTPUT
+ bsf TRISC,4 ; SDA Input
+ bcf PORTC,3
+ movlw d'9'
+ movwf i2c_temp ; clock-out 9 clock cycles manually
+I2CReset_1:
+ bsf PORTC,3 ; SCL=1
+ nop
+ btfsc PORTC,4 ; SDA=1?
+ bra I2CReset_2 ; =1, SDA has been released from slave
+ bcf PORTC,3 ; SCL=0
+ bcf PORTC,3
+ decfsz i2c_temp,F
+ bra I2CReset_1 ; check for nine clock cycles
+I2CReset_2:
+ bsf TRISC,3 ; SCL Input
+ clrf SSPCON1 ; set IēC Mode
+ WAITMS d'10' ; Reset-Timeout for I2C devices
+ movlw b'00000000'
+ movwf SSPSTAT
+ movlw b'00101000'
+ movwf SSPCON1
+ movlw b'00000000'
+ movwf SSPCON2
+ movlw d'8' ; 400kHz I2C clock @ 16MHz Fcy
+ movwf SSPADD
+ call clear_LEDy
+ ostc_debug 'O' ; Sends debug-information to screen if debugmode active
+ return
+I2C_TX:
+ movwf i2c_temp2 ; Data byte
+ bsf SSPCON2,SEN ; Start condition
+ rcall WaitMSSP
+ movlw b'10010000' ; Bit0=0: WRITE, Bit0=1: READ
+ movwf SSPBUF ; control byte
+ rcall WaitMSSP
+ rcall I2C_WaitforACK
+ movff i2c_temp2, SSPBUF ; Data Byte
+ rcall WaitMSSP
+ rcall I2C_WaitforACK
+ bsf SSPCON2,PEN ; Stop condition
+ rcall WaitMSSP
+ return
+I2C_RX:
+ bcf PIR1,SSPIF
+ bsf SSPCON2,SEN ; Start condition
+ rcall WaitMSSP
+ movlw b'10010001' ; Bit0=0: WRITE, Bit0=1: READ
+ movwf SSPBUF ; control byte
+ rcall WaitMSSP
+ rcall I2C_WaitforACK
+ bsf SSPCON2, RCEN ; Enable recieve mode
+ rcall WaitMSSP
+ movff SSPBUF,i2c_temp2 ; Data Byte
+ bsf SSPCON2,ACKEN ; Master acknowlegde
+ rcall WaitMSSP
+ bsf SSPCON2,PEN ; Stop condition
+ rcall WaitMSSP
+ return
\ No newline at end of file
diff -r 000000000000 -r 96a35aeda5f2 code_part1/OSTC_code_asm_part1/icdpictypes.inc
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/code_part1/OSTC_code_asm_part1/icdpictypes.inc Tue Jan 12 15:05:59 2010 +0100
@@ -0,0 +1,256 @@
+;IdTypePIC
+;bits 7 6 5 4 3 2 1 0
+;meaning: type16/18/ds | model_nr
+;
+;
+;If you want to work with another model that is not on the list
+;find one model that is similar to yours and has THE SAME amount
+;of flash and replace its "IFDEF __XXXXXX" and
+;"#include "ZZZZZZZZZ.inc"", but the ID must remain.
+;Each IdTypePIC has one corespondent in the PC application,
+;if you add new ones they will not be recognized.
+
+IdTypePIC SET 0
+
+ IFDEF __16F876A
+ #include "p16f876a.inc"
+IdTypePIC = 0x31
+ #define max_flash 0x2000
+ ENDIF
+ IFDEF __16F877A
+ #include "p16f877a.inc"
+IdTypePIC = 0x31
+ #define max_flash 0x2000
+ ENDIF
+
+ IFDEF __16F873A
+ #include "p16f873a.inc"
+IdTypePIC = 0x32
+ #define max_flash 0x1000
+ ENDIF
+ IFDEF __16F874A
+ #include "p16f874a.inc"
+IdTypePIC = 0x32
+ #define max_flash 0x1000
+ ENDIF
+
+ IFDEF __16F87
+ #include "p16f87.inc"
+IdTypePIC = 0x33
+ #define max_flash 0x1000
+ ENDIF
+ IFDEF __16F88
+ #include "p16f88.inc"
+IdTypePIC = 0x33
+ #define max_flash 0x1000
+ ENDIF
+
+ IFDEF __16F887
+ #include "p16f887.inc"
+IdTypePIC = 0x36
+ #define max_flash 0x2000
+ ENDIF
+
+
+;---------- 18F -------------
+
+ ; 28/40pin
+ IFDEF __18F252
+ #include "p18f252.inc"
+IdTypePIC = 0x41
+ #define max_flash 0x8000
+ ENDIF
+ IFDEF __18F452
+ #include "p18f452.inc"
+IdTypePIC = 0x41
+ #define max_flash 0x8000
+ ENDIF
+ IFDEF __18F242
+ #include "p18f242.inc"
+IdTypePIC = 0x42
+ #define max_flash 0x4000
+ ENDIF
+ IFDEF __18F442
+ #include "p18f442.inc"
+IdTypePIC = 0x42
+ #define max_flash 0x4000
+ ENDIF
+
+
+
+ IFDEF __18F2520
+ #include "p18f2520.inc"
+IdTypePIC = 0x41
+ #define max_flash 0x8000
+ ENDIF
+ IFDEF __18F4520
+ #include "p18f4520.inc"
+IdTypePIC = 0x41
+ #define max_flash 0x8000
+ ENDIF
+ IFDEF __18F2420
+ #include "p18f2420.inc"
+IdTypePIC = 0x42
+ #define max_flash 0x4000
+ ENDIF
+ IFDEF __18F4420
+ #include "p18f4420.inc"
+IdTypePIC = 0x42
+ #define max_flash 0x4000
+ ENDIF
+
+
+
+
+
+ ; 28/40pin can2.0
+ IFDEF __18F258
+ #include
+IdTypePIC = 0x43
+ #define max_flash 0x8000
+ ENDIF
+ IFDEF __18F458
+ #include
+IdTypePIC = 0x43
+ #define max_flash 0x8000
+ ENDIF
+ IFDEF __18F248
+ #include
+IdTypePIC = 0x44
+ #define max_flash 0x4000
+ ENDIF
+ IFDEF __18F448
+ #include
+IdTypePIC = 0x44
+ #define max_flash 0x4000
+ ENDIF
+
+
+ ; 18/28pin 6pwm (some:I2C/SPI)
+ IFDEF __18F1320
+ #include
+IdTypePIC = 0x45
+ #define max_flash 0x2000
+ ENDIF
+ IFDEF __18F2320
+ #include
+IdTypePIC = 0x45
+ #define max_flash 0x2000
+ ENDIF
+ IFDEF __18F1220
+ #include
+IdTypePIC = 0x46
+ #define max_flash 0x1000
+ ENDIF
+ IFDEF __18F2220
+ #include
+IdTypePIC = 0x46
+ #define max_flash 0x1000
+ ENDIF
+
+
+ ; 40pin 6pwm
+ IFDEF __18F4320
+ #include
+IdTypePIC = 0x47
+ #define max_flash 0x2000
+ ENDIF
+ IFDEF __18F4220
+ #include
+IdTypePIC = 0x48
+ #define max_flash 0x1000
+ ENDIF
+
+
+ ; 64/80pin TQFP 2usart
+ IFDEF __18F6720
+ #include
+IdTypePIC = 0x4A
+ #define max_flash 0x20000
+ ENDIF
+ IFDEF __18F8720
+ #include
+IdTypePIC = 0x4A
+ #define max_flash 0x20000
+ ENDIF
+ IFDEF __18F6620
+ #include
+IdTypePIC = 0x4B
+ #define max_flash 0x10000
+ ENDIF
+ IFDEF __18F8620
+ #include
+IdTypePIC = 0x4B
+ #define max_flash 0x10000
+ ENDIF
+ IFDEF __18F6520
+ #include
+IdTypePIC = 0x4C
+ #define max_flash 0x8000
+ ENDIF
+ IFDEF __18F8520
+ #include
+IdTypePIC = 0x4C
+ #define max_flash 0x8000
+ ENDIF
+ IFDEF __18F8680
+ #include
+IdTypePIC = 0x4D
+ #define max_flash 0x10000
+ ENDIF
+
+
+ ;PIC18F 2525/2620/4525/4620 EA-USART, nanoWatt, intOSC
+
+ IFDEF __18F2525
+ #include "p18f2525.inc"
+IdTypePIC = 0x4E
+ #define max_flash 0xC000
+ ENDIF
+ IFDEF __18F4525
+ #include "p18f4525.inc"
+IdTypePIC = 0x4E
+ #define max_flash 0xC000
+ ENDIF
+ IFDEF __18F2620
+ #include "p18f2620.inc"
+IdTypePIC = 0x4F
+ #define max_flash 0x10000
+ ENDIF
+ IFDEF __18F4620
+ #include "p18f4620.inc"
+IdTypePIC = 0x4F
+ #define max_flash 0x10000
+ ENDIF
+
+;---------------- USB ------------------------------
+
+ IFDEF __18F2550
+ #include "p18f2550.inc"
+IdTypePIC = 0x55
+ #define max_flash 0x8000
+ ENDIF
+ IFDEF __18F4550
+ #include "p18f4550.inc"
+IdTypePIC = 0x55
+ #define max_flash 0x8000
+ ENDIF
+ IFDEF __18F2455
+ #include "p18f2455.inc"
+IdTypePIC = 0x56
+ #define max_flash 0x6000
+ ENDIF
+ IFDEF __18F4455
+ #include "p18f4455.inc"
+IdTypePIC = 0x56
+ #define max_flash 0x6000
+ ENDIF
+ IFDEF __18F4685
+; #include "p18f4685.inc"
+IdTypePIC = 0x57
+ #define max_flash 0x18000
+ ENDIF
+
+ if IdTypePIC==0
+ error "Pic not yet implemeted"
+ endif
diff -r 000000000000 -r 96a35aeda5f2 code_part1/OSTC_code_asm_part1/interface.asm
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/code_part1/OSTC_code_asm_part1/interface.asm Tue Jan 12 15:05:59 2010 +0100
@@ -0,0 +1,240 @@
+
+; OSTC - diving computer code
+; Copyright (C) 2008 HeinrichsWeikamp GbR
+
+; 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 3 of the License, or
+; (at your option) any later version.
+
+; This program is distributed in the hope that it will be useful,
+; but WITHOUT ANY WARRANTY; without even the implied warranty of
+; 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, see .
+
+
+; Interface, Downloader, MD2 Hash send routine
+; written by: Matthias Heinrichs, info@heinrichsweikamp.com
+; written: 10/30/05
+; last updated: 12/27/07
+; known bugs:
+; ToDo:
+
+uart_store_tissues:
+ bcf uart_store_tissue_data ; Clear flag
+ bcf PIE1,RCIE ; No Interrupt for UART
+ call set_LEDusb
+ call simulator_save_tissue_data ; store and set flag for automatic restore
+ movlw 'k' ; send echo
+ movwf TXREG ; When done
+ call rs232_wait_tx ; wait for UART
+ call clear_LEDusb
+ bsf PIE1,RCIE ; Interrupt for RS232
+ goto surfloop_loop ; return to surface loop
+
+; reset Decodata
+reset_decodata:
+ bcf uart_reset_decodata ; clear flag
+ bcf PIE1,RCIE ; No Interrupt for UART
+ call set_LEDusb
+
+ call deco_main_clear_tissue ; Reset Decodata
+ movlb b'00000001' ; select ram bank 1
+ call deco_main_calc_desaturation_time ; calculate desaturation time
+ movlb b'00000001' ; select ram bank 1
+ call main_clear_CNS_fraction ; clear CNS
+ movlb b'00000001' ; select ram bank 1
+
+ movlw d'1'
+ movwf nofly_time+0 ; Clear nofly time
+ clrf nofly_time+1 ; Clear nofly time
+
+ movlw 'h' ; send echo
+ movwf TXREG ; When done
+ call rs232_wait_tx ; wait for UART
+
+ bsf oneminupdate ; set flag, so display will be updated at once
+ call clear_LEDusb
+ bsf PIE1,RCIE ; Interrupt for RS232
+ goto surfloop_loop ; return to surface loop
+
+; send internal EEPROM BANK 0 via the UART
+send_int_eeprom_b0:
+ bcf uart_send_int_eeprom ; clear flag
+ bcf PIE1,RCIE ; No Interrupt for UART
+ call set_LEDusb
+
+ clrf EEADRH ; Point to Bank0
+ rcall send_internal_eeprom1 ; sends complete 1st. page of internal EEPROM
+
+ call clear_LEDusb
+ bsf PIE1,RCIE ; Interrupt for RS232
+ goto surfloop_loop ; return to surface loop
+
+; send internal EEPROM BANK 1 via the UART
+send_int_eeprom_b1:
+ bcf uart_send_int_eeprom2 ; clear flag
+ bcf PIE1,RCIE ; No Interrupt for UART
+ call set_LEDusb
+
+ movlw d'1'
+ movwf EEADRH ; Point to Bank1
+ rcall send_internal_eeprom1 ; sends complete 2nd page of internal EEPROM
+ clrf EEADRH ; Point to Bank0
+
+ call clear_LEDusb
+ bsf PIE1,RCIE ; Interrupt for RS232
+ goto surfloop_loop ; return to surface loop
+
+
+; Send firmware version and 16bytes MD2 hash via the UART
+send_md2_hash:
+ bcf uart_send_hash ; clear flag
+ bcf PIE1,RCIE ; No Interrupt for UART
+ call set_LEDusb
+
+ call rs232_wait_tx ; wait for UART
+ movlw softwareversion_x ; Softwareversion
+ movwf TXREG
+ call rs232_wait_tx ; wait for UART
+ movlw softwareversion_y ; Softwareversion
+ movwf TXREG
+
+ lfsr FSR2, char_O_hash
+ movlw d'16'
+ movwf temp1
+send_md2_hash2:
+ call rs232_wait_tx ; wait for UART
+ movff POSTINC2,TXREG ; copy hash byte to TXREG
+ decfsz temp1,F
+ bra send_md2_hash2 ; loop 16 times
+
+ call clear_LEDusb
+ bsf PIE1,RCIE ; Interrupt for RS232
+ goto surfloop_loop ; return to surface loop
+
+
+; Sends first 256Byte from internal and first 32KB from external EEPROM using the UART module
+menu_interface:
+ bcf dump_external_eeprom ; clear flag
+ bcf PIE1,RCIE ; No Interrupt for UART
+ call set_LEDusb
+ call PLED_ClearScreen
+ call PLED_topline_box
+ WIN_INVERT .1 ; Init new Wordprocessor
+ DISPLAYTEXT .15 ; "Interface"
+ WIN_INVERT .0 ; Init new Wordprocessor
+
+ movlw d'5'
+ movwf uart1_temp
+menu_interface1:
+ movlw 0xAA ; Startbytes
+ movwf TXREG
+ call rs232_wait_tx ; wait for UART
+ decfsz uart1_temp
+ bra menu_interface1
+ movlw 0x55 ; finish preamble
+ movwf TXREG
+
+ DISPLAYTEXT .16 ; "Start"
+
+ call get_free_EEPROM_location ;
+ movlw d'1' ; increase
+ addwf eeprom_address+0,F
+ movlw d'0'
+ addwfc eeprom_address+1,F
+
+ DISPLAYTEXT .17 ; "Data"
+
+ rcall send_internal_eeprom1 ; sends complete 1st. page of internal EEPROM
+
+ call rs232_wait_tx ; wait for UART
+ movff batt_voltage+0,TXREG ; Battery
+
+ call rs232_wait_tx ; wait for UART
+ movff batt_voltage+1,TXREG ; Battery
+
+ call rs232_wait_tx ; wait for UART
+ movlw softwareversion_x ; Softwareversion
+ movwf TXREG
+
+ call rs232_wait_tx ; wait for UART
+ movlw softwareversion_y ; Softwareversion
+ movwf TXREG
+
+ DISPLAYTEXT .18 ; "Header"
+
+ clrf uart1_temp ; low address counter
+ clrf uart2_temp ; high address counter
+
+menu_interface3:
+ bsf SSPCON2,SEN ; Start condition
+ call WaitMSSP
+
+ movlw b'10100110' ; Bit0=0: WRITE, Bit0=1: READ
+ movwf SSPBUF ; control byte
+ call WaitMSSP
+ btfsc SSPCON2,ACKSTAT
+ bra menu_interface3 ; No Ack, try again!
+
+ movff eeprom_address+1,SSPBUF ; High Address byte
+ call WaitMSSP
+ call I2C_WaitforACK
+ movff eeprom_address+0,SSPBUF ; Low Address byte
+ call WaitMSSP
+ call I2C_WaitforACK
+ bsf SSPCON2,RSEN ; Start condition
+ call WaitMSSP
+
+ movlw b'10100111' ; Bit0=0: WRITE, Bit0=1: READ
+ movwf SSPBUF ; control byte
+ call WaitMSSP
+ call I2C_WaitforACK
+
+ DISPLAYTEXT .19 ; "Profile"
+
+menu_interface2:
+ call rs232_wait_tx ; wait for UART
+
+ bsf SSPCON2, RCEN ; Enable recieve mode
+ call WaitMSSP
+
+ movff SSPBUF, TXREG
+
+ movlw d'1'
+ addwf uart1_temp,F
+ movlw d'0'
+ addwfc uart2_temp,F
+
+ btfsc uart2_temp,7 ; 32KB done?
+ bra menu_interface4 ; Yes
+
+ bsf SSPCON2, ACKEN ; Ack
+ call WaitMSSP
+ bra menu_interface2 ; go on
+
+menu_interface4:
+ bsf SSPCON2, PEN ; Stop
+ call WaitMSSP
+
+ DISPLAYTEXT .20 ; Done.
+
+ WAITMS d'250'
+ call clear_LEDusb
+ bsf PIE1,RCIE ; Interrupt for RS232
+ goto surfloop ; back to surfacemode
+
+send_internal_eeprom1:
+ clrf uart1_temp ; Send the total of 256bytes
+ clrf EEADR ; Send bytes 0-255 from internal EEPROM
+send_internal_eeprom2:
+ call read_eeprom ; read byte
+ movff EEDATA,TXREG ; send byte
+ incf EEADR,F ; increase pointer
+ call rs232_wait_tx ; wait for UART
+ decfsz uart1_temp,F ; until limit reached
+ bra send_internal_eeprom2
+ return
\ No newline at end of file
diff -r 000000000000 -r 96a35aeda5f2 code_part1/OSTC_code_asm_part1/io.asm
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/code_part1/OSTC_code_asm_part1/io.asm Tue Jan 12 15:05:59 2010 +0100
@@ -0,0 +1,64 @@
+; OSTC - diving computer code
+; Copyright (C) 2009 HeinrichsWeikamp GbR
+; 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 3 of the License, or
+; (at your option) any later version.
+; This program is distributed in the hope that it will be useful,
+; but WITHOUT ANY WARRANTY; without even the implied warranty of
+; 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, see .
+
+
+; low-level routines for i/O
+; written by: Matthias Heinrichs, info@heinrichsweikamp.com
+; written: 090801
+; last updated: 090801
+; known bugs:
+; ToDo:
+
+set_LEDy: ; Yellow LED
+ bsf LED_red
+ return
+clear_LEDy ; Yellow LED
+ bcf LED_red
+ return
+
+set_LEDr: ; Red LED
+ bsf LED_red
+ return
+clear_LEDr ; Red LED
+ bcf LED_red
+ return
+toggle_LEDr ; Red LED
+ btg LED_red
+ return
+
+
+set_LEDg: ; Green LED
+ bsf LED_red
+ return
+clear_LEDg ; Green LED
+ bcf LED_red
+ return
+
+set_LEDusb: ; USB LED
+ bsf LED_blue
+ return
+clear_LEDusb; USB LED
+ bcf LED_blue
+ return
+
+set_LEDnofly: ; nofly LED
+ bsf LED_blue
+ return
+clear_LEDnofly; nofly LED
+ bcf LED_blue
+ return
+toggle_LEDnofly ; nofly LED
+ btg LED_blue
+ return
+
+
diff -r 000000000000 -r 96a35aeda5f2 code_part1/OSTC_code_asm_part1/isr.asm
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/code_part1/OSTC_code_asm_part1/isr.asm Tue Jan 12 15:05:59 2010 +0100
@@ -0,0 +1,394 @@
+
+; OSTC - diving computer code
+; Copyright (C) 2008 HeinrichsWeikamp GbR
+
+; 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 3 of the License, or
+; (at your option) any later version.
+
+; This program is distributed in the hope that it will be useful,
+; but WITHOUT ANY WARRANTY; without even the implied warranty of
+; 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, see .
+
+
+; written by: Matthias Heinrichs, info@heinrichsweikamp.com
+; written: 10/30/05
+; last updated: 05/16/08
+; known bugs:
+; ToDo:
+
+; the timer1 module interrupts every 62.5ms (16x/second)
+; temperature and pressure is averaged over 4 measurements
+; flag pressure_refresh is set every 500ms
+; and provides accurate pressure (+/-1mBar stable) and temperature (0.1C stable)
+
+uartint:
+ btfsc simulatormode_active ; are we in simulatormode?
+ bra simulator_int ; Yes, reading is depth in m!
+
+ movff RCREG,uart1_temp
+ movlw d'96'
+ subwf uart1_temp,F
+ dcfsnz uart1_temp,F ; "a"
+ bsf dump_external_eeprom ; set flag
+ dcfsnz uart1_temp,F ; "b"
+ bsf uart_settime ; set flag
+ dcfsnz uart1_temp,F ; "c"
+ bsf simulatormode_active ; set flag
+ dcfsnz uart1_temp,F ; "d"
+ bsf internal_eeprom_write ; set flag
+ dcfsnz uart1_temp,F ; "e"
+ bsf uart_send_hash ; set flag
+ dcfsnz uart1_temp,F ; "f"
+ bsf uart_compensate_temp ; set flag
+ dcfsnz uart1_temp,F ; "g"
+ bsf uart_send_int_eeprom ; set flag
+ dcfsnz uart1_temp,F ; "h"
+ bsf uart_reset_decodata ; set flag
+ dcfsnz uart1_temp,F ; "i"
+ bsf internal_eeprom_write2 ; set flag
+ dcfsnz uart1_temp,F ; "j"
+ bsf uart_send_int_eeprom2 ; set flag
+ dcfsnz uart1_temp,F ; "k"
+ bsf uart_store_tissue_data ; set flag
+
+
+uartint1:
+ movf RCREG,w ; unload RCREG in stand-alone simulator mode
+ bcf PIR1,RCIF ; Clear flag
+ bcf RCSTA,CREN ; Clear receiver status
+ bsf RCSTA,CREN
+ return
+
+simulator_int:
+ btfsc standalone_simulator ; ignore in standalone simulator mode
+ bra uartint1
+
+ call set_LEDusb
+ tstfsz RCREG ; =0x00?
+ bra simulator_int1 ; No
+ incf RCREG,F ; Yes, so force RCREG=1
+
+simulator_int1:
+ movf RCREG,w ; depth in m
+ mullw d'100' ; result will be mbar
+ movff PRODL,sim_pressure+0 ; stored for pressure overwrite
+ movff PRODH,sim_pressure+1
+ bra uartint1 ; exit uart int
+
+schalter_links: ;
+ bcf INTCON,INT0IF ; Clear flag
+
+ btfsc T0CON,TMR0ON ; Timer0 running?
+ bra timer0_restart ; Yes, restart
+
+ bsf switch_left ; Set flag, button press is OK
+
+ bsf T0CON,TMR0ON ; Start Timer 0
+ return
+
+
+schalter_rechts: ;
+ bcf INTCON3,INT1IF ; Clear flag
+
+ btfsc T0CON,TMR0ON ; Timer0 running?
+ bra timer0_restart ; Yes, restart
+
+ bsf switch_right ; Set flag, button press is OK
+
+ bsf T0CON,TMR0ON ; Start Timer 0
+ return
+
+timer0_restart:
+ bcf INTCON,TMR0IF ; Clear flag
+
+ clrf T0CON ; Timer0
+ clrf TMR0H
+ clrf TMR0L
+ bsf T0CON,TMR0ON ; Start Timer 0
+ return
+
+timer0int:
+ bcf INTCON,TMR0IF ; Clear flag
+ bcf T0CON,TMR0ON ; Stop Timer 0
+ clrf TMR0H
+ clrf TMR0L
+ return
+
+
+timer0int_left_reset:
+ bcf INTCON2, INTEDG0 ; Interrupt on faling edge again
+ bcf switch_left_isr ; Clear flag, button press is done
+
+ movlw T0CON_debounce ; Timer0
+ movwf T0CON
+
+ bsf T0CON,TMR0ON ; Start Timer 0
+ return
+
+timer0int_left:
+ bsf INTCON2, INTEDG0 ; Interrupt on rising edge again
+ return
+
+timer0int_right_reset:
+ bcf INTCON2, INTEDG1 ; Interrupt on faling edge again
+ bcf switch_right_isr ; Clear flag, button press is done
+
+ movlw T0CON_debounce ; Timer0
+ movwf T0CON
+
+ bsf T0CON,TMR0ON ; Start Timer 0
+ return
+
+timer0int_right:
+ bsf INTCON2, INTEDG1 ; Interrupt on rising edge again
+ return
+
+timer3int:
+ bcf PIR2,TMR3IF ; Clear flag
+ bcf T3CON,TMR0ON ; Stop Timer 3
+ bcf T2CON,2 ; stop Timer 2
+ return
+
+timer1int:
+ bcf PIR1,TMR1IF ; Clear flag
+
+timer1int_debug:
+
+ call clear_LEDr ; LEDr off (For charge indicator)
+
+ movlw 0x08 ; Timer1 int after 62.5ms (=16/second)
+ cpfslt TMR1H ; Did we miss a 1/16 second?
+ incf timer1int_counter1,F ; Yes, add extra 1/16 second
+
+ movlw 0x08 ; Timer1 int after 62.5ms (=16/second)
+ subwf TMR1H,F
+
+ incf timer1int_counter1,F
+ movlw d'15' ; One second 16
+ cpfsgt timer1int_counter1
+ bra sensor_int_pre ; only pressure sensor
+ call RTCisr ; adjust time, then query pressure sensor
+
+sensor_int_pre:
+ btfss sleepmode ; In sleepmode?
+ bra sensor_int ; No
+ return
+
+sensor_int:
+ btfsc no_sensor_int ; No sensor interrupt (because it's addressed during sleep)
+ return
+
+ incf timer1int_counter2,F ; counts to eight for state maschine
+
+ movlw d'1'
+ cpfseq timer1int_counter2 ; State 1?
+ bra sensor_int1 ; No
+
+ bcf pressure_refresh ; clear flags
+ clrf isr3_temp+0 ; pressure average registers
+ clrf isr3_temp+1
+ clrf temperature_temp+0
+ clrf temperature_temp+1
+sensor_int0:
+ call get_temperature_value ; State 1: Get temperature
+ call get_pressure_start ; and start pressure integration.
+ return ; Done.
+sensor_int1:
+ movlw d'2'
+ cpfseq timer1int_counter2 ; State 2?
+ bra sensor_int2 ; No
+
+sensor_int1_1:
+ call get_pressure_value ; State2: Get pressure (51us)
+ call get_temperature_start ; and start temperature integration (73,5us)
+ call calculate_compensation ; calculate temperature compensated pressure (233us)
+ movf amb_pressure+0,W
+ addwf isr3_temp+0 ; average pressure
+ movf amb_pressure+1,W
+ addwfc isr3_temp+1
+ movf temperature+0,W
+ addwf temperature_temp+0 ; average temperature
+ movf temperature+1,W
+ addwfc temperature_temp+1
+ return
+sensor_int2:
+ movlw d'3'
+ cpfseq timer1int_counter2 ; State 3?
+ bra sensor_int3 ; No
+ bra sensor_int0 ; Yes, but same as State 1!
+sensor_int3:
+ movlw d'4'
+ cpfseq timer1int_counter2 ; State 4?
+ bra sensor_int4 ; No
+ bra sensor_int1_1 ; Yes, but same as State 2!
+sensor_int4:
+ movlw d'5'
+ cpfseq timer1int_counter2 ; State 5?
+ bra sensor_int5 ; No
+ bra sensor_int0 ; Yes, but same as State 1!
+sensor_int5:
+ movlw d'6'
+ cpfseq timer1int_counter2 ; State 6?
+ bra sensor_int6 ; No
+ bra sensor_int1_1 ; Yes, but same as State 2!
+sensor_int6:
+ movlw d'7'
+ cpfseq timer1int_counter2 ; State 7?
+ bra sensor_int7 ; No
+ bra sensor_int0 ; Yes, but same as State 1!
+sensor_int7:
+ rcall sensor_int1_1 ; Do State 2...
+ clrf timer1int_counter2 ; ..then reset State counter...
+ movlw d'2' ; and calculate average!
+ movwf isr2_temp
+sensor_int8:
+ bcf STATUS,C
+ rrcf isr3_temp+1 ; isr3_temp / 2
+ rrcf isr3_temp+0
+ bcf STATUS,C
+ rrcf temperature_temp+1 ; temperature_temp /2
+ rrcf temperature_temp+0
+ decfsz isr2_temp,F
+ bra sensor_int8 ; once more
+
+ movff isr3_temp+1,amb_pressure+1 ; copy into actual register
+ movff isr3_temp+0,amb_pressure+0
+
+ movff temperature_temp+1,temperature+1
+ movff temperature_temp+0,temperature+0
+
+ bsf pressure_refresh ; Set flag! Temp and pressure were updated!
+
+ btfss simulatormode_active ; are we in simulator mode?
+ bra comp_air_pressure ; no
+
+comp_air_pressure0:
+ movlw LOW d'1000' ; yes, so simulate 1Bar surface pressure
+ movwf last_surfpressure+0
+ movlw HIGH d'1000'
+ movwf last_surfpressure+1
+
+comp_air_pressure:
+ bcf neg_flag
+ movf last_surfpressure+0,W ; compensate airpressure
+ subwf amb_pressure+0,W
+ movwf rel_pressure+0 ; rel_pressure stores depth!
+
+ movf last_surfpressure+1,W
+ subwfb amb_pressure+1,W
+ movwf rel_pressure+1
+ btfss STATUS,N ; result is below zero?
+ return
+ clrf rel_pressure+0 ; Yes, do not display negative depths
+ clrf rel_pressure+1 ; e.g. when surface air pressure dropped during the dive
+ return
+
+RTCisr:
+ clrf timer1int_counter1 ; counts to 16 (one second / 62.5ms)
+ bsf onesecupdate ; we have a new second!
+
+ bcf STATUS,Z ; are we in dive mode?
+ btfss divemode
+ bra RTCisr2 ; No, must be surface or sleepmode
+
+ incf samplesecs,F ; CF20 diving seconds done
+ decf samplesecs_value,W ; holds CF20 value (minus 1 into WREG)
+ cpfsgt samplesecs
+ bra RTCisr1 ; no
+
+ clrf samplesecs ; clear counter...
+ bsf store_sample ; ...and set bit for profile storage
+RTCisr1:
+; Increase re-setable average depth divetime counter
+ incf average_divesecs+0,F ; increase divetime registers
+ btfsc STATUS,Z
+ incf average_divesecs+1,F ; increase divetime registers
+
+ btfss divemode2 ; displayed divetime is running?
+ bra RTCisr2 ; No (e.g. too shallow)
+
+ incf divesecs,F ; increase divetime registers
+ movlw d'59'
+ cpfsgt divesecs
+ bra RTCisr1a
+ clrf divesecs
+ bsf realdive ; this bit is always set (again) if the dive is longer then one minute
+
+ incf divemins+0,F ; increase divemins
+ btfsc STATUS,Z
+ incf divemins+1,F ; and now do the realtime clock routine anyway
+
+RTCisr1a:
+ btfss FLAG_apnoe_mode ; Are we in Apnoe mode?
+ bra RTCisr2 ; No, skip the following
+
+ incf apnoe_secs,F ; increase descent registers
+ movlw d'59'
+ cpfsgt apnoe_secs
+ bra RTCisr2
+ clrf apnoe_secs
+
+ incf apnoe_mins,F ; increase descent mins
+ ; Now, do the RTC routine....
+RTCisr2:
+ incf secs,F ; adjusts seconds, minutes, hours, day, month and year. Checks for a leap year and works until 2099!
+ movlw d'59'
+ cpfsgt secs
+ return
+ clrf secs
+ bsf oneminupdate
+ incf mins,F
+ movlw d'59'
+ cpfsgt mins
+ return
+ clrf mins
+ incf hours,F
+ movlw d'23'
+ cpfsgt hours
+ return
+ clrf hours
+ incf day,F
+check_date:
+ movff month,isr_divB ; new month?
+ dcfsnz isr_divB,F
+ movlw .31
+ dcfsnz isr_divB,F
+ movlw .28
+ dcfsnz isr_divB,F
+ movlw .31
+ dcfsnz isr_divB,F
+ movlw .30
+ dcfsnz isr_divB,F
+ movlw .31
+ dcfsnz isr_divB,F
+ movlw .30
+ dcfsnz isr_divB,F
+ movlw .31
+ dcfsnz isr_divB,F
+ movlw .31
+ dcfsnz isr_divB,F
+ movlw .30
+ dcfsnz isr_divB,F
+ movlw .31
+ dcfsnz isr_divB,F
+ movlw .30
+ dcfsnz isr_divB,F
+ movlw .31
+ cpfsgt day,1
+ return
+ movlw .1
+ movwf day
+ incf month,F
+ movlw .12
+ cpfsgt month,1
+ return
+ movlw .1
+ movwf month
+ incf year,F
+ return
\ No newline at end of file
diff -r 000000000000 -r 96a35aeda5f2 code_part1/OSTC_code_asm_part1/math.asm
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/code_part1/OSTC_code_asm_part1/math.asm Tue Jan 12 15:05:59 2010 +0100
@@ -0,0 +1,323 @@
+; OSTC - diving computer code
+; Copyright (C) 2008 HeinrichsWeikamp GbR
+
+; 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 3 of the License, or
+; (at your option) any later version.
+
+; This program is distributed in the hope that it will be useful,
+; but WITHOUT ANY WARRANTY; without even the implied warranty of
+; 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, see .
+
+
+; Math routines
+; written by: Matthias Heinrichs, info@heinrichsweikamp.com
+; written: 10/30/05
+; last updated: 06/21/07
+; known bugs:
+; ToDo: clean up!
+
+convert_time: ; converts hi:lo in minutes to hours (hi) and minutes (lo)
+ movff lo,xA+0 ; divide by 60...
+ movff hi,xA+1 ;
+ movlw d'60' ;
+ movwf xB+0 ;
+ clrf xB+1 ;
+ rcall div16x16 ; xA/xB=xC with xA as remainder
+ movff xC+0,hi ; Hours
+ movff xA+0,lo ; =remaining minutes (0.....59)
+ return
+
+div16:
+; divA=divA/2^divB (divB: 8Bit only!)
+ bcf STATUS,C
+ rrcf divA+1
+ rrcf divA
+ decfsz divB
+ bra div16
+ return
+
+div32:
+; xC=xC(32Bit)/2^divB (divB: 8Bit only!)
+ bcf STATUS,C
+ rrcf xC+3
+ rrcf xC+2
+ rrcf xC+1
+ rrcf xC+0
+ decfsz divB
+ bra div32
+ return
+
+invert_xC:
+ movf xC+1, w ; inverses xC+0:xC+1
+ sublw 0xFF
+ movwf xC+1
+ movf xC+0, w
+ bcf STATUS,C
+ sublw 0xFF
+ movwf xC+0
+ return
+
+
+sub16:
+; sub_c = sub_a - sub_b
+ bcf neg_flag
+ movf sub_b+0, w ; Get Value to be subtracted
+ subwf sub_a+0, w ; Do the High Byte
+ movwf sub_c+0
+ movf sub_b+1, w ; Get the Value to be Subbed
+ subwfb sub_a+1, w
+ movwf sub_c+1
+ btfss STATUS,N
+ return ; result positve
+; sub_c = sub_a - sub_b
+ bsf neg_flag ; result negative
+ movff sub_c+0,sub_b+0
+ movff sub_c+1,sub_b+1
+ setf sub_a
+ setf sub_a+1
+ movf sub_b+0, w ; Get Value to be subtracted
+ subwf sub_a+0, w ; Do the High Byte
+ movwf sub_c+0
+ movf sub_b+1, w ; Get the Value to be Subbed
+ subwfb sub_a+1, w
+ movwf sub_c+1
+ return
+
+
+mult16x16:
+;xA*xB=xC
+ clrf xC+2 ; Clear the High-Order Bits
+ clrf xC+3
+ movf xA, w ; Do the "L" Multiplication first
+ mulwf xB
+ movf PRODL, w ; Save result
+ movwf xC
+ movf PRODH, w
+ movwf xC+1
+ movf xA, w ; Do the "I" Multiplication
+ mulwf xB+1
+ movf PRODL, w ; Save the Most Significant Byte First
+ addwf xC+1, f
+ movf PRODH, w
+ addwfc xC+2, f ; Add to the Last Result
+ movf xA+1, w ; Do the "O" Multiplication
+ mulwf xB
+ movf PRODL, w ; Add the Lower Byte Next
+ addwf xC+1, f
+ movf PRODH, w ; Add the High Byte First
+ addwfc xC+2, f
+ btfsc STATUS, C ; Add the Carry
+ incf xC+3, f
+ movf xA+1, w ; Do the "F" Multiplication
+ mulwf xB+1
+ movf PRODL, w
+ addwf xC+2, f
+ movf PRODH, w
+ addwfc xC+3, f
+ return
+
+
+div16x16: ;xA/xB=xC with xA as remainder
+ ;uses divB as temp variable
+ clrf xC+0
+ clrf xC+1
+ MOVF xB+0,W ; Check for zero
+ IORWF xB+1,W ;
+ BTFSC STATUS,Z ; Check for zero
+ RETLW H'FF' ; return 0xFF if illegal
+ MOVLW 1 ; Start count at 1
+ MOVWF divB ; Clear Count
+div16x16_1
+ BTFSC xB+1,7 ; High bit set ?
+ bra div16x16_2 ; Yes then continue
+ INCF divB,F ; Increment count
+
+ bcf STATUS,C
+ rlcf xB+0,F
+ rlcf xB+1,F
+ bra div16x16_1
+div16x16_2:
+ ; Shift result left
+ bcf STATUS,C
+ rlcf xC+0,F
+ rlcf xC+1,F
+
+ ; Reduce Divisor
+
+ MOVF xB,W ; Get low byte of subtrahend
+ SUBWF xA,F ; Subtract DST(low) - SRC(low)
+ MOVF xB+1,W ; Now get high byte of subtrahend
+ BTFSS STATUS,C ; If there was a borrow, rather than
+ INCF xB+1,W ; decrement high byte of dst we inc src
+ SUBWF xA+1,F ; Subtract the high byte and we're done
+
+
+ BTFSC STATUS, C ; Did it reduce?
+ bra div16x16_3 ; No, so it was less than
+
+ movf xB+0,W ; Reverse subtraction
+ addwf xA+0,F
+ movf xB+1,W
+ addwfc xA+1,F
+
+ bra div16x16_4 ; Continue the process
+div16x16_3:
+ BSF xC+0,0 ; Yes it did, this gets a 1 bit
+div16x16_4:
+ DECF divB,F ; Decrement N_COUNT
+ BTFSC STATUS,Z ; If its not zero then continue
+ return
+
+ bcf STATUS,C
+ rrcf xB+1,F
+ rrcf xB+0,F
+
+ bra div16x16_2 ; Next bit.
+
+div32x16: ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder
+ ; Setup
+ movlw .32 ; setup shift counter
+ movwf divB
+ movf xC+3,W ; move ACCb to ACCf
+ movwf xA+1
+ movf xC+2,W
+ movwf xA+0
+ movf xC+1,W ; move ACCc to ACCe
+ movwf sub_a+1
+ movf xC+0,W
+ movwf sub_a+0
+ clrf xC+3
+ clrf xC+2
+ clrf xC+1
+ clrf xC+0
+ clrf sub_b+1
+ clrf sub_b+0
+div32x16_2
+ bcf STATUS,C
+ rlcf sub_a+0,F
+ rlcf sub_a+1,F
+ rlcf xA+0,F
+ rlcf xA+1,F
+ rlcf sub_b+0,F
+ rlcf sub_b+1,F
+ movf xB+1,W
+ subwf sub_b+1,W ; check if a>d
+ btfss STATUS,Z
+ goto div32x16_3
+ movf xB+0,W
+ subwf sub_b+0,W ; if msb equal then check lsb
+div32x16_3
+ btfss STATUS,C ; carry set if d>a
+ goto div32x16_4
+ movf xB+0,W ; d-a into d
+ subwf sub_b+0,F
+ btfss STATUS,C
+ decf sub_b+1,F
+ movf xB+1,W
+ subwf sub_b+1,F
+ bsf STATUS,C ; shift a 1 into b (result)
+div32x16_4
+ rlcf xC+0,F
+ rlcf xC+1,F
+ rlcf xC+2,F
+ rlcf xC+3,F
+ decfsz divB,F ; loop until all bits checked
+ goto div32x16_2
+ return
+
+
+isr_div16:
+; divA=divA/2^divB (divB: 8Bit only!)
+ bcf STATUS,C
+ rrcf isr_divA+1
+ rrcf isr_divA
+ decfsz isr_divB
+ bra isr_div16
+ return
+
+isr_div32:
+; xC=xC(32Bit)/2^divB (divB: 8Bit only!)
+ bcf STATUS,C
+ rrcf isr_xC+3
+ rrcf isr_xC+2
+ rrcf isr_xC+1
+ rrcf isr_xC+0
+ decfsz isr_divB
+ bra isr_div32
+ return
+
+isr_invert_xC:
+ movf isr_xC+1, w ; inverses xC+0:xC+1
+ sublw 0xFF
+ movwf isr_xC+1
+ movf isr_xC+0, w
+ bcf STATUS,C
+ sublw 0xFF
+ movwf isr_xC+0
+ return
+
+
+isr_sub16:
+; sub_c = sub_a - sub_b
+ bcf neg_flag_isr
+ movf isr_sub_b+0, w ; Get Value to be subtracted
+ subwf isr_sub_a+0, w ; Do the High Byte
+ movwf isr_sub_c+0
+ movf isr_sub_b+1, w ; Get the Value to be Subbed
+ subwfb isr_sub_a+1, w
+ movwf isr_sub_c+1
+ btfss STATUS,N
+ return ; result positve
+; sub_c = sub_a - sub_b
+ bsf neg_flag_isr ; result negative
+ movff isr_sub_c+0,isr_sub_b+0
+ movff isr_sub_c+1,isr_sub_b+1
+ setf isr_sub_a
+ setf isr_sub_a+1
+ movf isr_sub_b+0, w ; Get Value to be subtracted
+ subwf isr_sub_a+0, w ; Do the High Byte
+ movwf isr_sub_c+0
+ movf isr_sub_b+1, w ; Get the Value to be Subbed
+ subwfb isr_sub_a+1, w
+ movwf isr_sub_c+1
+ return
+
+
+isr_mult16x16:
+;xA*xB=xC
+ clrf isr_xC+2 ; Clear the High-Order Bits
+ clrf isr_xC+3
+ movf isr_xA, w ; Do the "L" Multiplication first
+ mulwf isr_xB
+ movf PRODL, w ; Save result
+ movwf isr_xC
+ movf PRODH, w
+ movwf isr_xC+1
+ movf isr_xA, w ; Do the "I" Multiplication
+ mulwf isr_xB+1
+ movf PRODL, w ; Save the Most Significant Byte First
+ addwf isr_xC+1, f
+ movf PRODH, w
+ addwfc isr_xC+2, f ; Add to the Last Result
+ movf isr_xA+1, w ; Do the "O" Multiplication
+ mulwf isr_xB
+ movf PRODL, w ; Add the Lower Byte Next
+ addwf isr_xC+1, f
+ movf PRODH, w ; Add the High Byte First
+ addwfc isr_xC+2, f
+ btfsc STATUS, C ; Add the Carry
+ incf isr_xC+3, f
+ movf isr_xA+1, w ; Do the "F" Multiplication
+ mulwf isr_xB+1
+ movf PRODL, w
+ addwf isr_xC+2, f
+ movf PRODH, w
+ addwfc isr_xC+3, f
+ return
+
\ No newline at end of file
diff -r 000000000000 -r 96a35aeda5f2 code_part1/OSTC_code_asm_part1/menu.asm
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/code_part1/OSTC_code_asm_part1/menu.asm Tue Jan 12 15:05:59 2010 +0100
@@ -0,0 +1,559 @@
+
+; OSTC - diving computer code
+; Copyright (C) 2008 HeinrichsWeikamp GbR
+
+; 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 3 of the License, or
+; (at your option) any later version.
+
+; This program is distributed in the hope that it will be useful,
+; but WITHOUT ANY WARRANTY; without even the implied warranty of
+; 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, see .
+
+
+; Main Menu and Setup menu
+; written by: Matthias Heinrichs, info@heinrichsweikamp.com
+; written: 11/1/05
+; last updated: 05/15/80
+; known bugs:
+; ToDo:
+
+wait_switches:
+; bsf LEDg
+ movlw d'40'
+ btfss button_delay_done ; Start counting?
+ movlw d'200'
+ movwf switch_timeout
+
+wait_switches1:
+ WAITMS d'5'
+ btfsc SWITCH2
+ bra wait_switches2 ; Check other switch
+
+ decfsz switch_timeout,F
+ bra wait_switches1
+
+ btfsc SWITCH2
+ bra wait_switches3
+
+ bsf button_delay_done ; Start counting
+ bsf switch_left ; Set button flag
+ bcf switch_right ; only for the other button
+; bcf LEDg
+ return
+
+wait_switches2:
+ btfss SWITCH1
+ bra wait_switches1 ; Wait
+
+ ; Yes, both switches released before timeout...
+wait_switches3:
+ bcf switch_left
+ bcf switch_right
+ bcf button_delay_done
+ call clear_LEDg
+ return
+
+menu:
+ bcf deco_mode_changed ; Clear flag (Description is only showed once)
+ movlw d'1'
+ movwf menupos
+menu2:
+
+ bcf leftbind
+ call PLED_ClearScreen
+ clrf timeout_counter2
+ bcf sleepmode
+ bcf menubit2
+ bcf menubit3
+ bsf menubit
+ bsf cursor
+ call PLED_menu_mask
+ call PLED_menu_cursor
+ bcf switch_left
+ bcf switch_right
+
+menu_loop:
+ call check_switches_menu
+
+ btfsc menubit2
+ bra do_menu ; call submenu
+
+ btfss menubit
+ goto restart ; exit menu, restart
+
+ btfsc onesecupdate
+ call timeout_surfmode
+
+ btfsc onesecupdate
+ call set_dive_modes
+
+ btfsc onesecupdate
+ call test_charger ; check if charger IC is active
+
+ btfsc onesecupdate
+ call get_battery_voltage ; get battery voltage
+
+ bcf onesecupdate ; End of one second tasks
+
+ btfsc sleepmode
+ goto restart
+
+ btfsc divemode
+ goto restart ; exit menu, restart and enter divemode
+
+ bra menu_loop
+
+check_switches_menu: ; checks switches
+ btfss switch_right
+ bra check_switches_menu2
+ bsf menubit3
+ incf menupos,F
+ movlw d'6'
+ cpfsgt menupos
+ bra refresh_cursor
+ movlw d'1'
+ movwf menupos
+ bra refresh_cursor
+check_switches_menu2:
+ btfsc switch_left
+ bsf menubit2 ; Enter!
+ return
+
+
+do_menu: ; calls submenu
+ dcfsnz menupos,F
+ goto menu_logbook
+ dcfsnz menupos,F
+ goto menu_gassetup
+ dcfsnz menupos,F
+ goto menu_reset
+ dcfsnz menupos,F
+ goto setup_menu
+ dcfsnz menupos,F
+ goto more_menu
+ dcfsnz menupos,F
+ goto restart ; exit...
+
+refresh_cursor:
+ clrf timeout_counter2
+ btfsc cursor
+ call PLED_menu_cursor
+ bcf switch_right
+ return
+
+more_menu:
+ movlw d'1'
+ movwf menupos
+more_menu2:
+ bcf leftbind
+ call PLED_ClearScreen
+more_menu3:
+ clrf timeout_counter2
+ bcf sleepmode
+ bcf menubit2
+ bcf menubit3
+ bsf menubit
+ bsf cursor
+ call PLED_more_menu_mask
+ call PLED_menu_cursor
+ bcf switch_left
+ bcf switch_right
+more_menu_loop:
+ call check_switches_menu
+
+ movlw d'5' ; 5 items in "More Menu"
+ cpfseq menupos
+ bra more_menu_loop2
+ movlw d'6'
+ movwf menupos
+ call PLED_menu_cursor
+
+more_menu_loop2:
+ btfsc menubit2
+ bra do_more_menu ; call submenu
+
+ btfss menubit
+ bra menu ; exit setup menu and return to main menu
+
+ btfsc onesecupdate
+ call timeout_surfmode
+
+ btfsc onesecupdate
+ call set_dive_modes
+
+ btfsc onesecupdate
+ call test_charger ; check if charger IC is active
+
+ btfsc onesecupdate
+ call get_battery_voltage ; get battery voltage
+
+ bcf onesecupdate ; End of one second tasks
+
+ btfsc sleepmode
+ bra menu
+
+ btfsc divemode
+ goto restart ; exit menu, restart and enter divemode
+
+ bra more_menu_loop
+
+do_more_menu: ; calls submenu
+ dcfsnz menupos,F
+ goto menu_settime
+ dcfsnz menupos,F
+ goto menu_const_ppO2
+ dcfsnz menupos,F
+ goto menu_battery_state
+ dcfsnz menupos,F
+ goto menu_simulator
+ dcfsnz menupos,F
+ goto menu_simulator
+ movlw d'5'
+ movwf menupos
+ bra menu2 ; exit...
+
+setup_menu:
+ bcf deco_mode_changed ; Clear flag
+ movlw d'1'
+ movwf menupos
+setup_menu2:
+ bcf leftbind
+ call PLED_ClearScreen
+ call PLED_setup_menu_mask
+setup_menu3a:
+ clrf timeout_counter2
+ bcf sleepmode
+ bcf menubit2
+ bcf menubit3
+ bsf menubit
+ bsf cursor
+ call show_decotype
+ call show_salinity_value
+ call PLED_menu_cursor
+ bcf switch_left
+ bcf switch_right
+
+setup_menu_loop:
+ call check_switches_menu
+
+ btfsc menubit2
+ bra do_setup_menu ; call submenu
+
+ btfss menubit
+ goto restart ; exit menu, restart and enter surfmode
+ btfsc onesecupdate
+ call timeout_surfmode
+ btfsc onesecupdate
+ call set_dive_modes
+ btfsc onesecupdate
+ call test_charger ; check if charger IC is active
+ btfsc onesecupdate
+ call get_battery_voltage ; get battery voltage
+
+ bcf onesecupdate ; End of one second tasks
+
+ btfsc sleepmode
+ goto restart ; exit menu, restart and enter surfmode
+
+ btfsc divemode
+ goto restart ; exit menu, restart and enter divemode
+
+ bra setup_menu_loop
+
+
+do_setup_menu: ; calls submenu
+ dcfsnz menupos,F
+ goto menu_custom_functions
+ dcfsnz menupos,F
+ goto menu_custom_functions_page2
+ dcfsnz menupos,F
+ bra toggle_salinity
+ dcfsnz menupos,F
+ bra toggle_decotype
+ dcfsnz menupos,F
+ bra more_setup_menu
+ bra exit_setup_menu ; exit...
+
+toggle_decotype:
+ bsf deco_mode_changed ; Set flag
+ read_int_eeprom d'34' ; Read deco data
+ incf EEDATA,F
+
+toggle_decotype0:
+ movlw d'6' ; number of different modes
+ cpfseq EEDATA
+ bra toggle_decotype1
+ clrf EEDATA
+
+toggle_decotype1:
+ call write_eeprom ; save new mode
+ movlw d'4'
+ movwf menupos
+ bcf switch_right
+ bra setup_menu3a ; return to manu loop
+
+show_decotype:
+ read_int_eeprom d'34' ; Read deco data
+ tstfsz EEDATA
+ bra show_decotype2
+ DISPLAYTEXT .101 ; ZH-L16 OC =0
+ return
+show_decotype2:
+ decfsz EEDATA,F
+ bra show_decotype3
+ DISPLAYTEXT .102 ; Gauge =1
+ return
+show_decotype3:
+ decfsz EEDATA,F
+ bra show_decotype4
+ DISPLAYTEXT .104 ; ZH-L16 CC =2
+ return
+show_decotype4:
+ decfsz EEDATA,F
+ bra show_decotype5
+ DISPLAYTEXT .138 ; Apnoe =3
+ return
+show_decotype5:
+ decfsz EEDATA,F
+ bra show_decotype6
+ DISPLAYTEXT .152 ; L16-GF OC =4
+ return
+show_decotype6:
+ decfsz EEDATA,F
+ return
+ DISPLAYTEXT .236 ; L16-GF CC =5
+ return
+
+exit_setup_menu:
+ btfss deco_mode_changed ; Was the decomode changed in Setup menu?
+ goto restart ; No, restart to surfacemode
+
+ call PLED_ClearScreen
+
+deco_info_screen1:
+ call PLED_topline_box
+ WIN_INVERT .1 ; Init new Wordprocessor
+ DISPLAYTEXT .235 ;Decomode changed!
+ WIN_INVERT .0 ; Init new Wordprocessor
+
+ read_int_eeprom d'34' ; Read deco data
+
+ movlw d'7' ; length of description text
+ mulwf EEDATA ; Multiply with Decomode 0-5 (5=Spare)
+
+ movf PRODL,W
+ addlw d'193' ; Description text offset
+ movwf menupos ; Used as loop counter temp
+
+ movlw d'7'
+ movwf temp1 ; Loop 7 times
+
+menu0:
+ movf menupos,W
+ call displaytext1 ; Display text!
+ incf menupos,F
+
+ decfsz temp1,F
+ bra menu0 ; loop 7 times
+
+ movlw d'30'
+ call startup_screen3a
+ goto restart ; Restart to surfacemode
+
+more_setup_menu:
+ movlw d'1'
+ movwf menupos
+more_setup_menu2:
+ bcf leftbind
+ call PLED_ClearScreen
+ call PLED_more_setup_menu_mask
+more_setup_menu3a:
+ clrf timeout_counter2
+ bcf sleepmode
+ bcf menubit2
+ bcf menubit3
+ bsf menubit
+ bsf cursor
+ call show_debugstate
+ call show_dateformat
+ call PLED_menu_cursor
+ bcf switch_left
+ bcf switch_right
+
+more_setup_menu_loop:
+ call check_switches_menu
+
+ movlw d'3' ; x-1 menu entries
+ cpfseq menupos
+ bra more_setup_menu_loop2
+ movlw d'6'
+ movwf menupos
+ call PLED_menu_cursor
+more_setup_menu_loop2:
+
+ btfsc menubit2
+ bra do_more_setup_menu ; call submenu
+
+ btfss menubit
+ goto restart ; exit menu, restart and enter surfmode
+
+ btfsc onesecupdate
+ call timeout_surfmode
+ btfsc onesecupdate
+ call set_dive_modes
+ btfsc onesecupdate
+ call test_charger ; check if charger IC is active
+ btfsc onesecupdate
+ call get_battery_voltage ; get battery voltage
+
+ bcf onesecupdate ; End of one second tasks
+
+ btfsc sleepmode
+ goto setup_menu ; exit menu
+
+ btfsc divemode
+ goto restart ; exit menu, restart and enter divemode
+
+ bra more_setup_menu_loop
+
+do_more_setup_menu: ; calls submenu
+ dcfsnz menupos,F
+ bra toggle_datemode
+ dcfsnz menupos,F
+ bra toggle_debugmode
+ dcfsnz menupos,F
+ bra setup_menu ; spare
+ dcfsnz menupos,F
+ bra setup_menu ; spare
+ dcfsnz menupos,F
+ bra setup_menu ; spare
+ movlw d'5' ; set cursor to "More again"
+ movwf menupos
+ bra setup_menu2 ; exit...
+
+toggle_salinity:
+; Toggles between 1.00 and 1.04
+ read_int_eeprom d'26' ; Read Salinity from EEPROM
+ incf EEDATA,F ; Increase value
+
+ movlw d'99' ; 99% ?
+ cpfsgt EEDATA ; Salinity lower limit
+ bra toggle_salinity_reset ; Out of limit, reset value to 1.00
+ movlw d'105' ; 105% ?
+ cpfslt EEDATA ; Salinity higher limit
+ bra toggle_salinity_reset ; Out of limit, reset value to 1.00
+
+toggle_salinity2:
+ write_int_eeprom d'26' ; Store salinity
+ movlw d'3'
+ movwf menupos
+ bcf switch_right
+ bra setup_menu3a ; return to manu loop
+
+toggle_salinity_reset:
+ movlw d'100'
+ movwf EEDATA
+ bra toggle_salinity2 ; back
+
+show_salinity_value:
+ read_int_eeprom d'26' ; Read Salinity from EEPROM
+ movlw d'99' ; 99% ?
+ cpfsgt EEDATA ; Salinity lower limit
+ rcall toggle_salinity_reset2 ; Reset before display!
+ movlw d'105' ; 105% ?
+ cpfslt EEDATA ; Salinity higher limit
+ rcall toggle_salinity_reset2 ; Reset before display!
+ WIN_TOP .95
+ WIN_LEFT .83
+ WIN_FONT FT_SMALL
+ lfsr FSR2,letter
+ movff EEDATA,lo
+ clrf hi
+ bsf leftbind
+ output_16dp d'3'
+ bcf leftbind
+ movlw 'k'
+ movwf POSTINC2
+ movlw 'g'
+ movwf POSTINC2
+ movlw '/'
+ movwf POSTINC2
+ movlw 'l'
+ movwf POSTINC2
+ call word_processor
+ return
+
+toggle_salinity_reset2:
+ movlw d'100'
+ movwf EEDATA
+ write_int_eeprom d'26' ; Store salinity
+ return
+
+toggle_datemode:
+; Toggles setting for
+; MM/DD/YY =0, Default
+; DD/MM/YY =1
+; YY/MM/DD =2
+ read_int_eeprom d'91' ; Read date format
+ incf EEDATA,F
+ movlw d'2'
+ cpfsgt EEDATA
+ bra toggle_datemode1
+ clrf EEDATA
+toggle_datemode1:
+ write_int_eeprom d'91' ; Store date format
+ movlw d'1'
+ movwf menupos
+ bcf switch_right
+ bra more_setup_menu3a ; return to manu loop
+
+show_dateformat:
+ read_int_eeprom d'91' ; Read date format (0=MMDDYY, 1=DDMMYY, 2=YYMMDD)
+ tstfsz EEDATA
+ bra show_dateformat2
+ DISPLAYTEXTH .259 ; MM/DD/YY = 0
+ return
+show_dateformat2:
+ decfsz EEDATA,F
+ bra show_dateformat3
+ DISPLAYTEXTH .260 ; DD/MM/YY = 1
+ return
+show_dateformat3:
+ DISPLAYTEXTH .261 ; YY/MM/DD = 2
+ return
+
+toggle_debugmode:
+ read_int_eeprom d'39' ; Read status
+ incf EEDATA,F
+ movlw d'1'
+ cpfsgt EEDATA
+ bra toggle_debugmode1
+ clrf EEDATA
+toggle_debugmode1:
+ write_int_eeprom d'39' ; Store status
+ bsf debug_mode ; set flag
+ movlw d'1'
+ cpfseq EEDATA
+ bcf debug_mode ; clear flag
+ movlw d'2'
+ movwf menupos
+ bcf switch_right
+ bra more_setup_menu3a ; return to manu loop
+
+show_debugstate:
+ read_int_eeprom d'39'
+ tstfsz EEDATA
+ bra show_debugstate2
+ DISPLAYTEXT .131 ; OFF
+show_debugstate2:
+ decf EEDATA,F
+ tstfsz EEDATA
+ bra show_decotype3
+ DISPLAYTEXT .130 ; ON
+ return
diff -r 000000000000 -r 96a35aeda5f2 code_part1/OSTC_code_asm_part1/menu_battery.asm
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/code_part1/OSTC_code_asm_part1/menu_battery.asm Tue Jan 12 15:05:59 2010 +0100
@@ -0,0 +1,193 @@
+
+; OSTC - diving computer code
+; Copyright (C) 2008 HeinrichsWeikamp GbR
+
+; 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 3 of the License, or
+; (at your option) any later version.
+
+; This program is distributed in the hope that it will be useful,
+; but WITHOUT ANY WARRANTY; without even the implied warranty of
+; 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, see .
+
+
+; Submenu battery state
+; written by: Matthias Heinrichs, info@heinrichsweikamp.com
+; written: 05/15/08
+; last updated: 05/15/08
+; known bugs:
+; ToDo:
+
+menu_battery_state:
+ call PLED_ClearScreen
+ call PLED_topline_box
+ WIN_INVERT .1 ; Init new Wordprocessor
+ DISPLAYTEXT .114 ; Battery Information
+ WIN_INVERT .0 ; Init new Wordprocessor
+
+ WIN_TOP .35
+ WIN_LEFT .0
+ WIN_FONT FT_SMALL
+
+ lfsr FSR2,letter
+ OUTPUTTEXT .115 ; Cycles:
+ read_int_eeprom d'50' ; Get charge cycles
+ movff EEDATA,lo
+ read_int_eeprom d'51'
+ movff EEDATA,hi
+ bsf leftbind
+ output_16
+ movlw ' '
+ movwf POSTINC2
+ movlw '('
+ movwf POSTINC2
+ read_int_eeprom d'52' ; Get complete cycles
+ movff EEDATA,lo
+ read_int_eeprom d'53'
+ movff EEDATA,hi
+ bsf leftbind
+ output_16
+ movlw ')'
+ movwf POSTINC2
+ call word_processor
+
+ WIN_TOP .65
+ lfsr FSR2,letter
+ OUTPUTTEXT .117 ; Last Complete at:
+ read_int_eeprom d'47' ; Month
+ movff EEDATA,convert_value_temp+0
+ read_int_eeprom d'48' ; Day
+ movff EEDATA,convert_value_temp+1
+ read_int_eeprom d'49' ; Year
+ movff EEDATA,convert_value_temp+2
+ call PLED_convert_date ; coverts into "DD/MM/YY" or "MM/DD/YY" or "YY/MM/DD" in postinc2
+ call word_processor
+
+ WIN_TOP .95
+ lfsr FSR2,letter
+ OUTPUTTEXT .118 ; Lowest Battery:
+ read_int_eeprom d'40' ; Batt LOW
+ movff EEDATA,lo
+ read_int_eeprom d'41' ; Batt HIGH
+ movff EEDATA,hi
+ movlw d'1'
+ movwf ignore_digits
+ bsf leftbind
+ output_16dp d'2'
+ bcf leftbind
+ movlw 'V'
+ movwf POSTINC2
+ call word_processor
+
+ WIN_TOP .125
+ lfsr FSR2,letter
+ OUTPUTTEXT .119 ; Lowest Battery at:
+ read_int_eeprom d'42' ; Month
+ movff EEDATA,convert_value_temp+0
+ read_int_eeprom d'43' ; Day
+ movff EEDATA,convert_value_temp+1
+ read_int_eeprom d'44' ; Year
+ movff EEDATA,convert_value_temp+2
+ call PLED_convert_date ; coverts into "DD/MM/YY" or "MM/DD/YY" or "YY/MM/DD" in postinc2
+ call word_processor
+
+ WIN_TOP .155
+ lfsr FSR2,letter
+ OUTPUTTEXT .120 ; Temp min:
+ read_int_eeprom d'54' ; TEMP_min LOW
+ movff EEDATA,lo
+ read_int_eeprom d'55' ; TEMP_min HIGH
+ movff EEDATA,hi
+ movlw d'3'
+ movwf ignore_digits
+ bsf leftbind ; left orientated output
+ output_16dp d'2'
+ bcf leftbind
+ movlw '°'
+ movwf POSTINC2
+ movlw ' '
+ movwf POSTINC2
+ movlw '('
+ movwf POSTINC2
+ read_int_eeprom d'56' ; Month
+ movff EEDATA,convert_value_temp+0
+ read_int_eeprom d'57' ; Day
+ movff EEDATA,convert_value_temp+1
+ read_int_eeprom d'58' ; Year
+ movff EEDATA,convert_value_temp+2
+ call PLED_convert_date ; coverts into "DD/MM/YY" or "MM/DD/YY" or "YY/MM/DD" in postinc2
+ movlw ')'
+ movwf POSTINC2
+ movlw ' '
+ movwf POSTINC2
+ call word_processor
+
+ WIN_TOP .185
+ lfsr FSR2,letter
+ OUTPUTTEXT .121 ; Temp max:
+ read_int_eeprom d'59' ; TEMP_max LOW
+ movff EEDATA,lo
+ read_int_eeprom d'60' ; TEMP_max HIGH
+ movff EEDATA,hi
+ movlw d'3'
+ movwf ignore_digits
+ bsf leftbind ; left orientated output
+ output_16dp d'2'
+ bcf leftbind
+ movlw '°'
+ movwf POSTINC2
+ movlw ' '
+ movwf POSTINC2
+ movlw '('
+ movwf POSTINC2
+ read_int_eeprom d'61' ; Month
+ movff EEDATA,convert_value_temp+0
+ read_int_eeprom d'62' ; Day
+ movff EEDATA,convert_value_temp+1
+ read_int_eeprom d'63' ; Year
+ movff EEDATA,convert_value_temp+2
+ call PLED_convert_date ; coverts into "DD/MM/YY" or "MM/DD/YY" or "YY/MM/DD" in postinc2
+ movlw ')'
+ movwf POSTINC2
+ movlw ' '
+ movwf POSTINC2
+ call word_processor
+
+menu_battery_state5:
+ btfss SWITCH2
+ bra menu_battery_state5
+
+ bcf switch_left
+ bcf switch_right
+ bcf menubit2
+menu_battery_state_loop:
+ call check_switches_logbook
+
+ btfsc menubit2
+ bra menu_battery_state_exit ; Exit
+
+ btfsc divemode
+ goto restart ; dive started!
+
+ btfsc onesecupdate
+ call timeout_surfmode
+
+ btfsc onesecupdate
+ call set_dive_modes
+
+ bcf onesecupdate ; 1 sec. functions done
+
+ btfsc sleepmode
+ bra menu_battery_state_exit
+
+ bra menu_battery_state_loop
+
+menu_battery_state_exit: ; exit...
+ movlw d'3'
+ movwf menupos
+ goto more_menu2
diff -r 000000000000 -r 96a35aeda5f2 code_part1/OSTC_code_asm_part1/menu_custom.asm
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/code_part1/OSTC_code_asm_part1/menu_custom.asm Tue Jan 12 15:05:59 2010 +0100
@@ -0,0 +1,706 @@
+
+; OSTC - diving computer code
+; Copyright (C) 2008 HeinrichsWeikamp GbR
+
+; 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 3 of the License, or
+; (at your option) any later version.
+
+; This program is distributed in the hope that it will be useful,
+; but WITHOUT ANY WARRANTY; without even the implied warranty of
+; 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, see .
+
+
+; Menu "Custom Functions", Custom Functions checker (Displays permanent warning if critical custom functions are altered)
+; written by: Matthias Heinrichs, info@heinrichsweikamp.com
+; written: 05/10/30
+; last updated: 08/08/31
+; known bugs:
+; ToDo:
+
+;First Bank of Custom Functions:
+; The custom functions are stored in the internal EEPROM after 0x80
+; any custom function occupies 4 byte:
+; 2 byte (low:high) store the default value, reset from menu "reset"
+; if bit16=1 then the custrom function is 15bit value, if not it's a 8bit value
+; 2 byte (low:high) store the actual value
+; defaults for custom functions are in menu "reset"
+; get values with GETCUSTOM8 .x with x=0...32 for 8 Bit values (stored in WREG)
+; or with GETCUSTOM15 .x with x=0...32 for 15 Bit values (stored in lo and hi)
+
+;Second Bank of Custom Functions:
+; The custom functions are stored in the internal EEPROM after 0x180
+; any custom function occupies 4 byte:
+; 2 byte (low:high) store the default value, reset from menu "reset"
+; if bit16=1 then the custrom function is 15bit value, if not it's a 8bit value
+; 2 byte (low:high) store the actual value
+; defaults for custom functions are in menu "reset"
+; get values with GETCUSTOM8 .x with x=0...32 for 8 Bit values (stored in WREG)
+; or with GETCUSTOM15 .x with x=0...32 for 15 Bit values (stored in lo and hi)
+
+
+GETCUSTOM8 macro custom8
+ movlw custom8
+ call getcustom8_1
+ endm
+
+getcustom8_1:
+ ; # number of requested custom function in wreg
+ movwf customfunction_temp2
+
+ movlw d'31'
+ cpfsgt customfunction_temp2
+ bra getcustom8_2 ; Lower bank
+
+ movlw d'1' ; Upper Bank
+ movwf EEADRH
+ movlw d'32'
+ subwf customfunction_temp2,F
+ bra getcustom8_3
+
+getcustom8_2:
+ clrf EEADRH
+getcustom8_3:
+ movf customfunction_temp2,W
+ mullw d'4'
+ movf PRODL,W ; x4 for adress
+ addlw d'130'
+ movwf EEADR ; +130 for LOW Byte of value
+ call read_eeprom ; Lowbyte
+ movf EEDATA,W ; copied into wreg
+ clrf EEADRH
+ return ; return
+
+GETCUSTOM15 macro custom15
+ movlw custom15
+ call getcustom15_1
+ endm
+
+getcustom15_1:
+ ; # number of requested custom function in wreg
+ movwf customfunction_temp2
+
+ movlw d'31'
+ cpfsgt customfunction_temp2
+ bra getcustom15_2 ; Lower bank
+
+ movlw d'1' ; Upper Bank
+ movwf EEADRH
+ movlw d'32'
+ subwf customfunction_temp2,F
+ bra getcustom15_3
+getcustom15_2:
+ clrf EEADRH
+getcustom15_3:
+ movf customfunction_temp2,W
+ mullw d'4'
+ movf PRODL,W ; x4 for adress
+ addlw d'130'
+ movwf EEADR ; +130 for LOW Byte of value
+ call read_eeprom ; Lowbyte
+ movff EEDATA,lo
+ incf EEADR,F
+ call read_eeprom ; Highbyte
+ movff EEDATA,hi
+ clrf EEADRH
+ return ; return
+
+menu_custom_functions_page2:
+ movlw d'154' ; start of custom function descriptors
+ movwf customfunction_temp1
+ bsf customfunction_page ; Use Page I...
+ movlw d'1'
+ movwf EEADRH
+ bra menu_custom_functions0
+
+menu_custom_functions:
+ movlw d'36' ; start of custom function descriptors
+ movwf customfunction_temp1
+ bcf customfunction_page ; Use Page I...
+ clrf EEADRH
+
+menu_custom_functions0:
+ bsf leftbind
+ call PLED_ClearScreen
+ movlw d'1'
+ movwf menupos
+
+ bcf menubit4
+ bcf cursor
+ bcf sleepmode
+ clrf decodata+0 ; here: # of CustomFunction
+ clrf divemins+0 ; here: # of CustomFunction*4
+ bcf first_FA ; here: =1: -, =0: +
+ bcf second_FA ; here: =1: stepsize 1, =0: stepsize 10
+
+ call PLED_topline_box
+ WIN_INVERT .1 ; Init new Wordprocessor
+
+ btfss customfunction_page ;
+ bra menu_custom_functions10
+ DISPLAYTEXT .186 ; Custom FunctionsII
+ bra menu_custom_functions11
+
+menu_custom_functions10:
+ DISPLAYTEXT .27 ; Custom FunctionsI
+
+menu_custom_functions11:
+ WIN_INVERT .0 ; Init new Wordprocessor
+
+menu_custom_functions1:
+ clrf timeout_counter2
+ bcf menubit2
+ bcf menubit3
+ WIN_LEFT .20
+ WIN_TOP .35
+ lfsr FSR2,letter
+ movff decodata+0,lo
+
+ movlw d'0'
+ btfsc customfunction_page ; Add offset for display
+ movlw d'32'
+ addwf lo,F
+ movff lo,apnoe_mins ; apnoe_mins used as temp for binary CFs
+
+ output_99x
+ movlw ':'
+ movwf POSTINC2
+ movlw ' '
+ movwf POSTINC2
+ call word_processor
+
+; movlw d'16'
+; movwf temp1
+; WIN_LEFT .40
+; WIN_TOP .35
+; call PLED_display_clear_common_y1
+;
+ movf customfunction_temp1,W ; start of custom function descriptors
+ addwf decodata+0,W ; add # of current custom function, place result in wreg
+ call displaytext1 ; shows descriptor
+
+ movlw binary_cf1
+ subwf apnoe_mins,W ; Binary cf?
+ btfsc STATUS,Z
+ bra menu_custom_functions10c ; Yes
+
+ movlw binary_cf2
+ subwf apnoe_mins,W ; Binary cf?
+ btfsc STATUS,Z
+ bra menu_custom_functions10c ; Yes
+
+ movlw binary_cf3
+ subwf apnoe_mins,W ; Binary cf?
+ btfsc STATUS,Z
+ bra menu_custom_functions10c ; Yes
+
+ movlw binary_cf4
+ subwf apnoe_mins,W ; Binary cf?
+ btfsc STATUS,Z
+ bra menu_custom_functions10c ; Yes
+
+ movlw binary_cf5
+ subwf apnoe_mins,W ; Binary cf?
+ btfsc STATUS,Z
+ bra menu_custom_functions10c ; Yes
+
+
+ bra menu_custom_functions10a ; Not a binary CF selected
+
+menu_custom_functions10c:
+ movlw d'1'
+ movwf apnoe_mins ; Yes, set apnoe_mins to "1"
+ bra menu_custom_functions10b
+
+menu_custom_functions10a:
+ clrf apnoe_mins ; Yes, clear apnoe_mins
+menu_custom_functions10b:
+ WIN_LEFT .20
+ WIN_TOP .65
+ lfsr FSR2,letter
+ movlw '+'
+ movwf POSTINC2
+ movlw '/'
+ movwf POSTINC2
+ movlw '-'
+ movwf POSTINC2
+ movlw ':'
+ movwf POSTINC2
+ movlw ' '
+ movwf POSTINC2
+ movlw '+'
+ btfsc first_FA
+ movlw '-'
+ movwf POSTINC2
+ call word_processor
+
+ WIN_LEFT .20
+ WIN_TOP .95
+ lfsr FSR2,letter
+ movlw '1'
+ movwf POSTINC2
+ movlw '/'
+ movwf POSTINC2
+ movlw '1'
+ movwf POSTINC2
+ movlw '0'
+ movwf POSTINC2
+ movlw ':'
+ movwf POSTINC2
+ movlw ' '
+ movwf POSTINC2
+ movlw '1'
+ movwf POSTINC2
+ movlw '0'
+ btfsc second_FA
+ movwf POSTINC2
+ movlw ' '
+ movwf POSTINC2
+ call word_processor
+
+ WIN_LEFT .20
+ WIN_TOP .125
+ lfsr FSR2,letter
+ OUTPUTTEXT d'89' ;"Default:"
+
+ movf divemins+0,W
+ addlw 0x80
+ movwf EEADR
+ call read_eeprom ; Lowbyte
+ movff EEDATA,lo
+ movf divemins+0,W
+ addlw 0x81
+ movwf EEADR
+ call read_eeprom ; Highbyte
+ movff EEDATA,hi
+ bcf hi,7 ; clear Bit 7 of value
+ output_16
+ movlw '('
+ movwf POSTINC2
+
+ movlw '1'
+ btfss EEDATA,7 ; 15Bit?
+ movlw '8' ; 8Bit!
+ tstfsz apnoe_mins ; apnoe_mins=0?
+ movlw '1' ; No, 1Bit!
+ movwf POSTINC2
+
+ movlw '5'
+ btfsc EEDATA,7 ; 15Bit?
+ movwf POSTINC2
+
+ movlw 'B'
+ movwf POSTINC2
+ movlw ')'
+ movwf POSTINC2
+ movlw ' '
+ movwf POSTINC2
+ movlw ' '
+ movwf POSTINC2
+ movlw ' '
+ movwf POSTINC2
+ call word_processor
+
+ WIN_LEFT .20
+ WIN_TOP .155
+ lfsr FSR2,letter
+ OUTPUTTEXT d'97' ; "Current:"
+
+ movf divemins+0,W
+ addlw 0x82
+ movwf EEADR
+ call read_eeprom ; Lowbyte
+ movff EEDATA,lo
+ movf divemins+0,W
+ addlw 0x83
+ movwf EEADR
+ call read_eeprom ; Highbyte
+ movff EEDATA,hi
+ output_16
+ movlw ' '
+ movwf POSTINC2
+ movlw ' '
+ movwf POSTINC2
+ movlw ' '
+ movwf POSTINC2
+ call word_processor
+
+menu_custom_functions1a:
+ DISPLAYTEXT .11 ; Exit
+
+ call wait_switches ; Waits until switches are released, resets flag if button stays pressed!
+ call PLED_menu_cursor
+
+customfunctions_loop:
+ call check_switches_logbook
+
+ btfsc menubit3
+ bra customfunctions2 ; Move cursor or generate next page
+
+ btfsc menubit2
+ bra do_customfunction ; call subfunction
+
+ btfsc divemode
+ goto restart ; dive started during cf menu
+
+ btfsc onesecupdate
+ call timeout_surfmode
+
+ btfsc onesecupdate
+ call set_dive_modes
+
+ bcf onesecupdate ; end of 1sek. tasks
+
+ btfsc sleepmode
+ bra exit_customfunctions
+
+ bra customfunctions_loop
+
+customfunctions2:
+ incf menupos,F
+ movlw d'7'
+ cpfseq menupos ; =7?
+ bra customfunctions3 ; No
+ movlw d'1'
+ movwf menupos
+
+customfunctions3:
+ clrf timeout_counter2
+ call PLED_menu_cursor
+
+ call wait_switches ; Waits until switches are released, resets flag if button stays pressed!
+
+ bcf menubit3 ; clear flag
+ bra customfunctions_loop
+
+
+do_customfunction:
+ CLRF EEADRH
+ movlw d'1'
+ btfsc customfunction_page
+ movwf EEADRH ; Reset EEADRH correct (Was adjusted in check_timeout...)
+
+ dcfsnz menupos,F
+ bra next_customfunction
+ dcfsnz menupos,F
+ bra toggle_plusminus
+ dcfsnz menupos,F
+ bra toggle_oneorten
+ dcfsnz menupos,F
+ bra restore_cfn_value
+ dcfsnz menupos,F
+ bra adjust_cfn_value
+exit_customfunctions:
+ movlw d'2' ; Return to correct list entry
+ btfss customfunction_page
+ movlw d'1'
+ movwf menupos ;
+ clrf EEADRH ; Clear EEADRH !
+ goto setup_menu2 ; exit...
+
+
+next_customfunction:
+ incf decodata+0
+ btfsc decodata+0,5 ;>31?
+ clrf decodata+0 ;Yes, so reset to zero
+
+ movf decodata+0,W
+ mullw d'4'
+ movff PRODL, divemins+0 ;divemins+0 for correct addressing
+
+ movlw d'1'
+ movwf menupos
+ bra menu_custom_functions1 ; also debounces switches
+
+toggle_plusminus:
+ btg first_FA
+ movlw d'2'
+ movwf menupos
+ bra menu_custom_functions1 ; also debounces switches
+
+toggle_oneorten:
+ btg second_FA
+ movlw d'3'
+ movwf menupos
+ bra menu_custom_functions1 ; also debounces switches
+
+restore_cfn_value:
+ movf divemins+0,W ; read default value
+ addlw 0x80
+ movwf EEADR
+ call read_eeprom ; Lowbyte
+ movff EEDATA,lo
+ movf divemins+0,W
+ addlw 0x81
+ movwf EEADR
+ call read_eeprom ; Highbyte
+ movff EEDATA,hi
+ bcf hi,7 ; clear bit 7 of value
+
+ movf divemins+0,W ; store default value
+ addlw 0x82
+ movwf EEADR
+ movff lo,EEDATA
+ call write_eeprom ; Lowbyte
+ movf divemins+0,W
+ addlw 0x83
+ movwf EEADR
+ movff hi,EEDATA
+ call write_eeprom ; Highbyte
+
+ movlw d'4'
+ movwf menupos
+ bra menu_custom_functions1 ; also debounces switches
+
+adjust_cfn_value:
+ movf divemins+0,W ; get current value
+ addlw 0x82
+ movwf EEADR
+ call read_eeprom ; Lowbyte
+ movff EEDATA,lo
+ movf divemins+0,W
+ addlw 0x83
+ movwf EEADR
+ call read_eeprom ; Highbyte
+ movff EEDATA,hi
+
+ movf divemins+0,W
+ addlw 0x81
+ movwf EEADR
+ call read_eeprom ; Highbyte
+ movff EEDATA,divemins+1 ; Highbyte of default value
+
+ movlw d'1'
+ cpfseq apnoe_mins ; If apnoe_mins=1 then CF is binary
+ bra adjust_cfn_value1 ; Not Binary
+
+ tstfsz lo ; =0?
+ setf lo ; No, Set to 255
+ incf lo,F ; Increase by one
+ clrf hi ; Delete hi byte (Not required but to make sure...)
+ bra adjust_cfn_value3 ; Store result
+
+adjust_cfn_value1:
+ btfss first_FA ; Minus?
+ bra adjust_cfn_value2 ; No, Plus
+
+ movlw d'1'
+ btfsc second_FA ; -10?
+ movlw d'10'
+
+ subwf lo,F ; substract value
+ movlw d'0'
+ btfsc divemins+1,7 ; 8Bit value
+ subwfb hi,F
+
+ movlw b'01111111'
+ btfsc hi,7 ; >32768?
+ movwf hi
+
+ bra adjust_cfn_value3
+
+adjust_cfn_value2:
+ movlw d'1'
+ btfsc second_FA ; +10?
+ movlw d'10'
+
+ addwf lo,F ; add value
+ movlw d'0'
+ btfsc divemins+1,7 ; 8Bit value?
+ addwfc hi,F
+
+ btfsc hi,7 ; >32768?
+ clrf hi
+
+adjust_cfn_value3:
+ movf divemins+0,W ; Store current value
+ addlw 0x82
+ movwf EEADR
+ movff lo,EEDATA
+ call write_eeprom ; Lowbyte
+ movf divemins+0,W
+ addlw 0x83
+ movwf EEADR
+ movff hi,EEDATA
+ call write_eeprom ; Highbyte
+ movlw d'5'
+ movwf menupos
+ bra menu_custom_functions1 ; also debounces switches
+
+getcustom15_default:
+ ; # number of requested custom function in wreg
+ movwf customfunction_temp2
+
+ movlw d'31'
+ cpfsgt customfunction_temp2
+ bra getcustom15_d2 ; Lower bank
+
+ movlw d'1' ; Upper Bank
+ movwf EEADRH
+ movlw d'32'
+ subwf customfunction_temp2,F
+ bra getcustom15_d3
+getcustom15_d2:
+ clrf EEADRH
+getcustom15_d3:
+ movf customfunction_temp2,W
+ mullw d'4'
+ movf PRODL,W ; x4 for adress
+ addlw d'128'
+ movwf EEADR ; +130 for LOW Byte of value
+ call read_eeprom ; Lowbyte
+ movff EEDATA,lo
+ incf EEADR,F
+ call read_eeprom ; Highbyte
+ movff EEDATA,hi
+ clrf EEADRH
+ return ; return
+
+custom_functions_check_divemode: ;displays warning if a critical custom function is not set to default
+ dcfsnz cf_checker_counter,F ; counts custom functions to check for warning symbol
+ bra check_cf11
+ dcfsnz cf_checker_counter,F ; counts custom functions to check for warning symbol
+ bra check_cf12
+ return
+
+custom_functions_check_surfmode: ;displays warning if a critical custom function is not set to default
+ dcfsnz cf_checker_counter,F ; counts custom functions to check for warning symbol
+ bra check_cf11
+ dcfsnz cf_checker_counter,F ; counts custom functions to check for warning symbol
+ bra check_cf12
+ dcfsnz cf_checker_counter,F ; counts custom functions to check for warning symbol
+ bra check_cf17
+ dcfsnz cf_checker_counter,F ; counts custom functions to check for warning symbol
+ bra check_cf18
+ dcfsnz cf_checker_counter,F ; counts custom functions to check for warning symbol
+ bra check_cf19
+ dcfsnz cf_checker_counter,F ; counts custom functions to check for warning symbol
+ bra check_cf29
+ dcfsnz cf_checker_counter,F ; counts custom functions to check for warning symbol
+ bra check_cf32
+ dcfsnz cf_checker_counter,F ; counts custom functions to check for warning symbol
+ bra check_cf33
+ return
+
+check_cf11:
+ movlw d'11' ; saturation factor
+ rcall custom_function_check_low ; compares current with default value
+ call test_and_display_warning ; displays the warning if the custom function is not correct
+ movlw d'2' ; next in testing row
+ movwf cf_checker_counter ;
+ return
+
+check_cf12:
+ movlw d'12' ; desaturation factor
+ rcall custom_function_check_high ; compares current with default value
+ call test_and_display_warning ; displays the warning if the custom function is not correct
+ movlw d'3' ; next in testing row
+ movwf cf_checker_counter ;
+ return
+
+check_cf17:
+ movlw d'17' ; lower threshold ppO2
+ rcall custom_function_check_low ; compares current with default value
+ call test_and_display_warning ; displays the warning if the custom function is not correct
+ movlw d'4' ; next in testing row
+ movwf cf_checker_counter ;
+ return
+
+check_cf18:
+ movlw d'18' ; upper threshold ppO2
+ rcall custom_function_check_high ; compares current with default value
+ call test_and_display_warning ; displays the warning if the custom function is not correct
+ movlw d'5' ; next in testing row
+ movwf cf_checker_counter ;
+ return
+
+check_cf19:
+ movlw d'19' ; upper threshold ppO2 display
+ rcall custom_function_check_high ; compares current with default value
+ call test_and_display_warning ; displays the warning if the custom function is not correct
+ movlw d'6' ; next in testing row
+ movwf cf_checker_counter ;
+ return
+
+check_cf29:
+ movlw d'6'
+ movwf cf_checker_counter ; upper limit for CF29, here: used as a temp variable
+ movlw d'29' ; last deco stop in [m]
+ rcall custom_function_check_high_limit ; compares current with default value
+ call test_and_display_warning ; displays the warning if the custom function is not correct
+ movlw d'7' ; next in testing row
+ movwf cf_checker_counter ;
+ return
+
+check_cf32:
+ movlw d'32' ; GF LOW
+ rcall custom_function_check_high ; compares current with default value
+ call test_and_display_warning ; displays the warning if the custom function is not correct
+ movlw d'8' ; next in testing row
+ movwf cf_checker_counter ;
+ return
+
+check_cf33:
+ movlw d'33' ; GF HIGH
+ rcall custom_function_check_high ; compares current with default value
+ call test_and_display_warning ; displays the warning if the custom function is not correct
+ movlw d'1' ; next in testing row
+ movwf cf_checker_counter ;
+ return
+
+
+test_and_display_warning:
+ movwf lo ; copy result
+ tstfsz lo
+ return ; CF OK
+ goto custom_warn_surfmode
+
+custom_function_check_low: ; Checks CF (#WREG)
+ ; Returns WREG=0 if CF is lower then default
+ movwf temp1 ; save for custom value
+ call getcustom15_1 ; Get Current Value stored in hi and lo
+ movff lo,sub_a+0
+ movff hi,sub_a+1 ; save value
+
+ movf temp1,w
+ call getcustom15_default ; Get Default value stored in hi and lo
+ movff lo,sub_b+0
+ movff hi,sub_b+1 ; save value
+ call sub16 ; sub_c = sub_a - sub_b with "neg_flag" bit set if sub_b > sub_a
+ btfss neg_flag ; negative?
+ retlw .255 ; no
+ retlw .0 ; yes
+
+custom_function_check_high: ; Checks CF (#WREG)
+ ; Returns WREG=0 if CF is higher then default
+ movwf temp1 ; save for custom value
+ call getcustom15_1 ; Get Current Value stored in hi and lo
+ movff lo,sub_b+0
+ movff hi,sub_b+1 ; save value
+
+ movf temp1,w
+ call getcustom15_default ; Get Default value stored in hi and lo
+ movff lo,sub_a+0
+ movff hi,sub_a+1 ; save value
+ call sub16 ; sub_c = sub_a - sub_b with "neg_flag" bit set if sub_b > sub_a
+ btfss neg_flag ; negative?
+ retlw .255 ; no
+ retlw .0 ; yes
+
+custom_function_check_high_limit: ; Checks if CF (#WREG) is lower then limit (#cf_checker_counter)
+ movwf temp1 ; save for custom value
+ call getcustom15_1 ; Get Current Value stored in hi and lo
+ movff lo,sub_b+0
+ movff hi,sub_b+1 ; save value
+ movff cf_checker_counter, sub_a+0
+ clrf sub_a+1
+ call sub16 ; sub_c = sub_a - sub_b with "neg_flag" bit set if sub_b > sub_a
+ btfss neg_flag ; negative?
+ retlw .255 ; no
+ retlw .0 ; yes
+
diff -r 000000000000 -r 96a35aeda5f2 code_part1/OSTC_code_asm_part1/menu_gassetup.asm
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/code_part1/OSTC_code_asm_part1/menu_gassetup.asm Tue Jan 12 15:05:59 2010 +0100
@@ -0,0 +1,1111 @@
+
+; OSTC - diving computer code
+; Copyright (C) 2008 HeinrichsWeikamp GbR
+
+; 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 3 of the License, or
+; (at your option) any later version.
+
+; This program is distributed in the hope that it will be useful,
+; but WITHOUT ANY WARRANTY; without even the implied warranty of
+; 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, see .
+
+
+; Gas Setup menu
+; written by: Matthias Heinrichs, info@heinrichsweikamp.com
+; written: 10/08/07
+; last updated: 080906
+; known bugs:
+; ToDo:
+
+menu_gassetup:
+ movlw d'1'
+ movwf menupos
+
+menu_gassetup_prelist:
+ call PLED_ClearScreen
+ clrf timeout_counter2
+ bcf sleepmode
+ bcf menubit2
+ bcf menubit3
+ call PLED_topline_box
+ WIN_INVERT .1 ; Init new Wordprocessor
+ DISPLAYTEXT .106 ; Gas List
+ WIN_INVERT .0 ; Init new Wordprocessor
+ clrf decodata+0 ; Here: # of gas 0-4
+ clrf divemins+0 ; Here: # of Gas * 4
+ movlw d'5'
+ movwf waitms_temp ; here: stores row for gas list
+ movlw d'2'
+ movwf wait_temp ; here: stores eeprom address for gas list
+
+; Changed v1.44se
+menu_gassetup_list:
+ WIN_LEFT .20
+ movlw d'4'
+ addwf wait_temp,F ; Increase eeprom address for gas list
+ movlw d'30'
+ addwf waitms_temp,F ; Increase row
+ movf waitms_temp,W ; Load row into WREG
+ movff WREG,win_top
+ lfsr FSR2,letter
+ movlw 'G'
+ movwf POSTINC2
+ movff decodata+0,lo
+ incf lo,F
+ bsf leftbind
+ output_99
+ movlw ':'
+ movwf POSTINC2
+
+ call menu_gassetup_grey_inactive ; Sets Greyvalue for inactive gases
+ call word_processor
+ WIN_LEFT .40
+ movf waitms_temp,W ; Load row into WREG
+ movff WREG,win_top
+ lfsr FSR2,letter
+
+ movlw d'33'
+ movwf EEADR
+ call read_eeprom ; Get current startgas 1-5 # into EEDATA
+ decf EEDATA,W ; 0-4
+ cpfseq decodata+0 ; =current displayed gas #?
+ bra menu_gassetup_Tx ; no, do not display *
+ movlw '*' ; display *
+ movwf POSTINC2
+
+; New v1.44se
+menu_gassetup_Tx:
+ call menu_gassetup_grey_inactive ; Sets Greyvalue for inactive gases
+ call word_processor
+
+ WIN_LEFT .48
+ movf waitms_temp,W ; Load row into WREG
+ movff WREG,win_top
+ lfsr FSR2,letter
+
+ movff wait_temp, EEADR ; Gas %He - Set address in internal EEPROM
+ incf EEADR,F ; Gas %He - Set address in internal EEPROM
+ call read_eeprom ; Read He value from EEPROM
+ movff EEDATA,lo ; Move EEDATA -> lo
+ movf lo,f ; Move lo -> f
+ movlw d'0' ; Move 0 -> WREG
+ cpfsgt lo ; He > 0?
+ bra menu_gassetup_Nx ; NO check o2
+
+ ; YES Write TX 15/55
+ call gassetup_write_Tx
+ movff wait_temp, EEADR ; Gas %O2 - Set address in internal EEPROM
+ call read_eeprom ; O2 value
+ movff EEDATA,lo
+ output_8
+ movlw '/'
+ movwf POSTINC2
+ incf EEADR,F ; Gas #hi: %He - Set address in internal EEPROM
+ call read_eeprom ; He value
+ movff EEDATA,lo
+ output_8
+ bra menu_gassetup_list0
+
+; New v1.44se
+menu_gassetup_Nx:
+ movff wait_temp, EEADR ; Gas %O2 - Set address in internal EEPROM
+ call read_eeprom ; Read O2 value from EEPROM
+ movff EEDATA,lo ; Move EEDATA -> lo
+ movf lo,f ; Move lo -> f
+ movlw d'21' ; Move 21 -> WREG
+ cpfsgt lo ; o2 > 21%
+ bra menu_gassetup_Air ; NO AIR
+ movlw d'100' ; Move 100 -> WREG
+ cpfslt lo ; o2 < 100%
+ bra menu_gassetup_O2 ; NO write O2
+
+ ; YES Write NX 32
+ call gassetup_write_Nx
+ output_8
+ bra menu_gassetup_list0
+
+; New v1.44se
+menu_gassetup_O2:
+ movlw 'O'
+ movwf POSTINC2
+ movlw '2'
+ movwf POSTINC2
+ movlw ' '
+ movwf POSTINC2
+ output_8
+ bra menu_gassetup_list0
+
+; New v1.44se
+menu_gassetup_Air:
+ cpfseq lo ; o2 = 21%
+ call menu_gassetup_Err
+
+ movlw 'A'
+ movwf POSTINC2
+ movlw 'I'
+ movwf POSTINC2
+ movlw 'R'
+ movwf POSTINC2
+ movlw ' '
+ movwf POSTINC2
+ output_8
+ bra menu_gassetup_list0
+
+; New v1.44se
+menu_gassetup_Err:
+ movlw 'E'
+ movwf POSTINC2
+ movlw 'R'
+ movwf POSTINC2
+ movlw 'R'
+ movwf POSTINC2
+ movlw ' '
+ movwf POSTINC2
+ output_8
+
+; Changed v1.44se
+menu_gassetup_list0:
+ call menu_gassetup_grey_inactive ; Sets Greyvalue for inactive gases
+ call word_processor
+
+ WIN_LEFT .105
+ movf waitms_temp,W ; Load row into WREG
+ movff WREG,win_top
+ lfsr FSR2,letter
+
+ movlw ' '
+ movwf POSTINC2
+ movlw 'i'
+ movwf POSTINC2
+ movlw 'n'
+ movwf POSTINC2
+ movlw ' '
+ movwf POSTINC2
+ movf decodata+0,W ; read current value
+ addlw d'28' ; offset in memory
+ movwf EEADR
+ call read_eeprom ; Low-value
+ movff EEDATA,lo
+ output_8
+ movlw 'm'
+ movwf POSTINC2
+ call menu_gassetup_grey_inactive ; Sets Greyvalue for inactive gases
+ call word_processor
+
+ WIN_COLOR color_white
+
+ incf decodata+0,F
+ movlw d'5'
+ cpfseq decodata+0
+ goto menu_gassetup_list
+
+ DISPLAYTEXT .11 ; Exit
+ call wait_switches ; Waits until switches are released, resets flag if button stays pressed!
+ call PLED_menu_cursor
+
+gassetup_list_loop:
+ call check_switches_logbook
+
+ btfsc menubit3
+ bra gassetup_list2 ; move cursor
+
+ btfsc menubit2
+ bra do_gassetup_list; call gas-specific submenu
+
+ btfsc divemode
+ goto restart ; dive started!
+
+ btfsc onesecupdate
+ call timeout_surfmode
+
+ btfsc onesecupdate
+ call set_dive_modes
+
+ bcf onesecupdate ; 1 sec. functions done
+
+ btfsc sleepmode
+ bra exit_gassetup_list
+
+ bra gassetup_list_loop
+
+gassetup_list2:
+ incf menupos,F
+ movlw d'7'
+ cpfseq menupos ; =7?
+ bra gassetup_list3 ; No
+ movlw d'1'
+ movwf menupos
+
+gassetup_list3:
+ clrf timeout_counter2
+ call PLED_menu_cursor
+
+ call wait_switches ; Waits until switches are released, resets flag if button stays pressed!
+
+ bcf menubit3 ; clear flag
+ bra gassetup_list_loop
+
+exit_gassetup_list: ; exit...
+ movlw d'2'
+ movwf menupos
+ goto menu2
+
+do_gassetup_list:
+ dcfsnz menupos,F
+ bra gassetup_list_edit_gas1
+ dcfsnz menupos,F
+ bra gassetup_list_edit_gas2
+ dcfsnz menupos,F
+ bra gassetup_list_edit_gas3
+ dcfsnz menupos,F
+ bra gassetup_list_edit_gas4
+ dcfsnz menupos,F
+ bra gassetup_list_edit_gas5
+ bra exit_gassetup_list ; Exit List
+
+gassetup_list_edit_gas1:
+ movlw d'0'
+ movwf decodata+0
+ movlw d'0'
+ movwf divemins+0
+ bra menu_gassetup_page1
+
+gassetup_list_edit_gas2:
+ movlw d'1'
+ movwf decodata+0
+ movlw d'4'
+ movwf divemins+0
+ bra menu_gassetup_page1
+
+gassetup_list_edit_gas3:
+ movlw d'2'
+ movwf decodata+0
+ movlw d'8'
+ movwf divemins+0
+ bra menu_gassetup_page1
+
+gassetup_list_edit_gas4:
+ movlw d'3'
+ movwf decodata+0
+ movlw d'12'
+ movwf divemins+0
+ bra menu_gassetup_page1
+
+gassetup_list_edit_gas5:
+ movlw d'4'
+ movwf decodata+0
+ movlw d'16'
+ movwf divemins+0
+ bra menu_gassetup_page1
+
+menu_gassetup_page1:
+ movlw d'1'
+ movwf menupos
+ bcf gas_setup_page2 ; Page 1 of gassetup
+ bcf menubit4
+ bcf cursor
+ bcf sleepmode
+ bcf first_FA ; Here: =1: -, =0: +
+
+menu_gassetup0:
+ call PLED_ClearScreen
+ DISPLAYTEXT .30 ; More...
+ DISPLAYTEXT .11 ; Exit
+
+menu_gassetup1:
+ clrf timeout_counter2
+ bcf menubit2
+ bcf menubit3
+
+ rcall gassetup_title_bar2 ; Displays the title bar with the current Gas info
+
+ WIN_TOP .65
+ WIN_LEFT .20
+ lfsr FSR2,letter
+ movlw 'O'
+ movwf POSTINC2
+ movlw '2'
+ movwf POSTINC2
+ movlw ':'
+ movwf POSTINC2
+ movlw ' '
+ movwf POSTINC2
+
+ movf divemins+0,W
+ addlw 0x06
+ movwf EEADR
+ call read_eeprom ; O2 value
+ movff EEDATA,lo
+ output_8
+ movlw '%'
+ movwf POSTINC2
+ movlw ' '
+ movwf POSTINC2
+ movlw '('
+ movwf POSTINC2
+ movlw 'M'
+ movwf POSTINC2
+ movlw 'O'
+ movwf POSTINC2
+ movlw 'D'
+ movwf POSTINC2
+ movlw ':'
+ movwf POSTINC2
+
+; Show MOD in m
+ GETCUSTOM8 .18 ; ppO2 warnvalue in WREG
+ mullw d'10'
+ movff PRODL,xA+0
+ movff PRODH,xA+1 ; ppO2 in [0.01Bar] * 10
+
+ movf divemins+0,W
+ addlw 0x06
+ movwf EEADR
+ call read_eeprom ; O2 value
+ movff EEDATA,xB+0
+ clrf xB+1
+ call div16x16 ;xA/xB=xC with xA as remainder
+ movlw d'10'
+ subwf xC+0,F ; Subtract 10m...
+ movff xC+0,lo
+ movlw d'0'
+ subwfb xC+1,F
+ movff xC+1,hi
+ output_16
+ movlw 'm'
+ movwf POSTINC2
+ movlw ')'
+ movwf POSTINC2
+ movlw ' '
+ movwf POSTINC2
+ movlw ' '
+ movwf POSTINC2
+ call word_processor
+
+ WIN_TOP .95
+ lfsr FSR2,letter
+ movlw 'H'
+ movwf POSTINC2
+ movlw 'e'
+ movwf POSTINC2
+ movlw ':'
+ movwf POSTINC2
+ movlw ' '
+ movwf POSTINC2
+ movf divemins+0,W
+ addlw 0x07
+ movwf EEADR
+ call read_eeprom ; He value
+ movff EEDATA,lo
+ output_8
+ movlw '%'
+ movwf POSTINC2
+ movlw ' '
+ movwf POSTINC2
+ movlw ' '
+ movwf POSTINC2
+ call word_processor
+
+ WIN_TOP .125
+ lfsr FSR2,letter
+ movlw '+'
+ movwf POSTINC2
+ movlw '/'
+ movwf POSTINC2
+ movlw '-'
+ movwf POSTINC2
+ movlw ':'
+ movwf POSTINC2
+ movlw ' '
+ movwf POSTINC2
+ movlw '+'
+ btfsc first_FA
+ movlw '-'
+ movwf POSTINC2
+ call word_processor
+
+ WIN_TOP .155
+ lfsr FSR2,letter
+ OUTPUTTEXT .89 ; Default:
+ movf divemins+0,W
+ addlw 0x04
+ movwf EEADR
+ call read_eeprom ; Default O2 value
+ movff EEDATA,lo
+ output_8
+ movlw '/'
+ movwf POSTINC2
+ movf divemins+0,W
+ addlw 0x05
+ movwf EEADR
+ call read_eeprom ; Default He value
+ movff EEDATA,lo
+ output_8
+ movlw ' '
+ movwf POSTINC2
+ movlw ' '
+ movwf POSTINC2
+ call word_processor
+
+ call wait_switches ; Waits until switches are released, resets flag if button stays pressed!
+ call PLED_menu_cursor
+
+gassetup_loop:
+ call check_switches_logbook
+
+ btfsc menubit3
+ bra gassetup2 ; move cursor
+
+ btfsc menubit2
+ bra do_gassetup ; call submenu
+
+ btfsc divemode
+ goto restart ; dive started!
+
+ btfsc onesecupdate
+ call timeout_surfmode
+
+ btfsc onesecupdate
+ call set_dive_modes
+
+ bcf onesecupdate ; 1 sec. functions done
+
+ btfsc sleepmode
+ bra exit_gassetup
+
+ bra gassetup_loop
+
+gassetup2:
+ incf menupos,F
+ movlw d'7'
+ cpfseq menupos ; =7?
+ bra gassetup3 ; No
+ movlw d'1'
+ movwf menupos
+
+gassetup3:
+
+ clrf timeout_counter2
+ call PLED_menu_cursor
+
+ call wait_switches ; Waits until switches are released, resets flag if button stays pressed!
+
+ bcf menubit3 ; clear flag
+ bra gassetup_loop
+
+do_gassetup:
+ dcfsnz menupos,F
+ bra next_gas_page
+ dcfsnz menupos,F
+ bra adjust_o2
+ dcfsnz menupos,F
+ bra adjust_he
+ dcfsnz menupos,F
+ bra toggle_plus_minus_gassetup
+ dcfsnz menupos,F
+ bra restore_gas
+exit_gassetup: ; exit...
+ movff decodata+0,menupos
+ incf menupos,F
+ bra menu_gassetup_prelist
+
+toggle_plus_minus_gassetup:
+ btg first_FA
+ movlw d'4'
+ movwf menupos
+ bra menu_gassetup1 ; return
+
+next_gas:
+ movlw d'1'
+ movwf menupos
+ bra menu_gassetup0 ; incl. clear screen
+
+adjust_o2:
+ movf divemins+0,W ; read current value
+ addlw 0x06
+ movwf EEADR
+ call read_eeprom ; Low-value
+ movff EEDATA,lo
+
+ btfsc first_FA ; Minus?
+ bra adjust_o2_1 ; yes, minus!
+
+ incf lo,F ; increase O2
+ movlw d'101'
+ cpfseq lo
+ bra adjust_o2_2
+ movlw d'4' ; LOWER O2 Limit
+ movwf lo
+ bra adjust_o2_2
+
+adjust_o2_1:
+ decf lo,F ; decrease O2
+ movlw d'3'
+ cpfseq lo
+ bra adjust_o2_2
+
+ movf divemins+0,W
+ addlw 0x07
+ movwf EEADR
+ call read_eeprom ; read He value
+
+ movlw d'100'
+ movwf lo
+ movf EEDATA,W ; He value
+ subwf lo,F ; lo=100% - He%
+
+adjust_o2_2: ; test if O2+He>100...
+ movf divemins+0,W
+ addlw 0x07
+ movwf EEADR
+ call read_eeprom ; read He value
+ movf EEDATA,W ; He value
+ addwf lo,W ; add O2 value
+ movwf hi ; store in temp
+ movlw d'101'
+ cpfseq hi ; O2 and He > 100?
+ bra adjust_o2_3 ; No!
+
+ movlw d'4' ; LOWER O2 Limit
+ movwf lo
+
+adjust_o2_3:
+ movf divemins+0,W ; save current value
+ addlw 0x06
+ movwf EEADR
+ movff lo,EEDATA
+ call write_eeprom ; Low-value
+
+ movlw d'2'
+ movwf menupos
+ bra menu_gassetup1
+
+adjust_he:
+ movf divemins+0,W ; read current value
+ addlw 0x07
+ movwf EEADR
+ call read_eeprom ; Low-value
+ movff EEDATA,lo
+
+ btfsc first_FA ; Minus?
+ bra adjust_he_1 ; yes, minus!
+
+ incf lo,F
+ movlw d'92' ; He limited to (useless) 90%
+ cpfseq lo
+ bra adjust_he_2
+ clrf lo
+ bra adjust_he_2
+
+adjust_he_1:
+ decf lo,F ; decrease He
+ movlw d'255'
+ cpfseq lo
+ bra adjust_he_2
+ clrf lo
+
+adjust_he_2: ; test if O2+He>100...
+ movf divemins+0,W
+ addlw 0x06
+ movwf EEADR
+ call read_eeprom ; read He value
+ movf EEDATA,W ; He value
+ addwf lo,W ; add O2 value
+ movwf hi ; store in temp
+ movlw d'101'
+ cpfseq hi ; O2 and He > 100?
+ bra adjust_he_3 ; No!
+; clrf lo ; Yes, clear He to zero
+ decf lo,F ; reduce He again = unchanged after operation
+
+adjust_he_3:
+ movf divemins+0,W ; save current value
+ addlw 0x07
+ movwf EEADR
+ movff lo,EEDATA
+ call write_eeprom ; Low-value
+
+ movlw d'3'
+ movwf menupos
+ bra menu_gassetup1 ;
+
+restore_gas:
+ movf divemins+0,W ; read Default value
+ addlw 0x04
+ movwf EEADR
+ call read_eeprom ; Low-value
+ movff EEDATA,lo
+ movf divemins+0,W
+ addlw 0x05
+ movwf EEADR
+ call read_eeprom ; High-value
+ movff EEDATA,hi
+
+ movf divemins+0,W ; save Default value
+ addlw 0x06
+ movwf EEADR
+ movff lo,EEDATA
+ call write_eeprom ; Low-value
+ movf divemins+0,W
+ addlw 0x07
+ movwf EEADR
+ movff hi,EEDATA
+ call write_eeprom ; High-value
+
+ movlw d'5'
+ movwf menupos
+ bra menu_gassetup1 ;
+
+
+next_gas_page:
+ call PLED_ClearScreen
+ movlw d'1'
+ movwf menupos
+ DISPLAYTEXT .109 ; Back
+
+ DISPLAYTEXT .11 ; Exit
+
+next_gas_page1:
+ clrf timeout_counter2
+ bcf menubit2
+ bcf menubit3
+
+ rcall gassetup_title_bar2 ; Displays the title bar with the current Gas info
+ rcall gassetup_show_ppO2 ; Display the ppO2 of the change depth with the current gas
+
+ WIN_TOP .65
+ WIN_LEFT .20
+ lfsr FSR2,letter
+ OUTPUTTEXT .105 ; "Active Gas? "
+ read_int_eeprom d'27' ; read flag register
+
+ ; hi contains active gas flags in BIT0:4 ....
+
+ movff decodata+0,lo ; Gas 0-4
+ incf lo,F ; Gas 1-5
+
+active_gas_display:
+ rrcf EEDATA ; roll flags into carry
+ decfsz lo,F ; max. 5 times...
+ bra active_gas_display
+
+ btfss STATUS,C ; test carry
+ bra active_gas_display_no
+
+ OUTPUTTEXT .96 ; Yes
+ bra active_gas_display_end
+
+active_gas_display_no:
+ movlw ' ' ; three spaces instead of "Yes"
+ movwf POSTINC2
+ movlw ' '
+ movwf POSTINC2
+ movlw ' '
+ movwf POSTINC2
+
+active_gas_display_end:
+ call word_processor
+
+ WIN_TOP .95
+ WIN_LEFT .20
+ lfsr FSR2,letter
+ OUTPUTTEXT .88 ; First Gas?
+ movlw ' '
+ movwf POSTINC2
+
+ movlw d'33'
+ movwf EEADR
+ call read_eeprom ; Get current startgas 1-5 # into EEDATA
+ decf EEDATA,W ; 0-4
+ cpfseq decodata+0 ; =current displayed gas #?
+ bra menu_firstgas0 ; no, display three spaces
+
+ OUTPUTTEXT .96 ; Yes
+ bra menu_firstgas1
+
+menu_firstgas0:
+ movlw ' '
+ movwf POSTINC2
+ movlw ' '
+ movwf POSTINC2
+ movlw ' '
+ movwf POSTINC2
+
+menu_firstgas1:
+ call word_processor
+
+ WIN_TOP .125
+ WIN_LEFT .20
+ lfsr FSR2,letter
+ OUTPUTTEXT .107 ; Change+
+ call word_processor
+
+ WIN_TOP .155
+ WIN_LEFT .20
+ lfsr FSR2,letter
+ OUTPUTTEXT .108 ; Change-
+ call word_processor
+
+ call wait_switches ; Waits until switches are released, resets flag if button stays pressed!
+ call PLED_menu_cursor
+
+next_gas_page_loop:
+ call check_switches_logbook
+
+ btfsc menubit3
+ bra next_gas_page2 ; move cursor
+
+ btfsc menubit2
+ bra do_next_gas_page ; call submenu
+
+ btfsc divemode
+ goto restart ; dive started!
+
+ btfsc onesecupdate
+ call timeout_surfmode
+
+ btfsc onesecupdate
+ call set_dive_modes
+
+ bcf onesecupdate ; 1 sec. functions done
+
+ btfsc sleepmode
+ bra exit_gassetup
+
+ bra next_gas_page_loop
+
+next_gas_page2:
+ incf menupos,F
+
+ movlw d'7'
+ cpfseq menupos ; =7?
+ bra next_gas_page3 ; No
+ movlw d'1'
+ movwf menupos
+
+next_gas_page3:
+ clrf timeout_counter2
+ call PLED_menu_cursor
+
+ call wait_switches ; Waits until switches are released, resets flag if button stays pressed!
+
+ bcf menubit3 ; clear flag
+ bra next_gas_page_loop
+
+do_next_gas_page:
+ dcfsnz menupos,F
+ bra next_gas
+ dcfsnz menupos,F
+ bra toggle_active_gas
+ dcfsnz menupos,F
+ bra make_first_gas
+ dcfsnz menupos,F
+ bra change_gas_depth_plus
+ dcfsnz menupos,F
+ bra change_gas_depth_minus
+ bra exit_gassetup ; Exit menu
+
+make_first_gas:
+ movff decodata+0,EEDATA ; current gas (0-4) into EEDATA
+ incf EEDATA,F ; current gas (1-5) into EEDATA
+ movlw d'33'
+ movwf EEADR
+ call write_eeprom ; store in internal EEPROM
+ movlw d'3'
+ movwf menupos
+ bra next_gas_page1
+
+toggle_active_gas:
+ read_int_eeprom d'27' ; read flag register
+ movff decodata+0,lo ; selected gas 0-4
+ incf lo,F
+ dcfsnz lo,F
+ btg EEDATA,0
+ dcfsnz lo,F
+ btg EEDATA,1
+ dcfsnz lo,F
+ btg EEDATA,2
+ dcfsnz lo,F
+ btg EEDATA,3
+ dcfsnz lo,F
+ btg EEDATA,4
+ write_int_eeprom d'27' ; write flag register
+ movlw d'2'
+ movwf menupos
+ bra next_gas_page1
+
+change_gas_depth_plus:
+ movf decodata+0,W ; read current value
+ addlw d'28' ; offset in memory
+ movwf EEADR
+ call read_eeprom ; Low-value
+ movff EEDATA,lo
+
+ incf lo,F ; increase depth
+ movlw d'100' ; Change depth limit + 1
+ cpfseq lo
+ bra change_gas_depth_plus2
+ movlw d'99' ; Change depth limit
+ movwf lo
+change_gas_depth_plus2:
+ movff lo,EEDATA ; write result
+ call write_eeprom ; save result in EEPROM
+
+ movlw d'4'
+ movwf menupos
+ bra next_gas_page1
+
+
+change_gas_depth_minus:
+ movf decodata+0,W ; read current value
+ addlw d'28' ; offset in memory
+ movwf EEADR
+ call read_eeprom ; Low-value
+ movff EEDATA,lo
+
+ decf lo,F ; decrease depth
+ movlw d'255'
+ cpfseq lo
+ bra change_gas_depth_minus2
+ movlw d'0'
+ movwf lo
+
+change_gas_depth_minus2:
+ movff lo,EEDATA ; write result
+ call write_eeprom ; save result in EEPROM
+
+ movlw d'5'
+ movwf menupos
+ bra next_gas_page1
+
+; Changed v1.44se
+gassetup_title_bar2:
+ call PLED_topline_box
+ WIN_INVERT .1 ; Init new Wordprocessor
+ WIN_TOP .2
+ WIN_LEFT .0
+ lfsr FSR2,letter
+ OUTPUTTEXT .95 ; Gas#
+ movff decodata+0,lo
+ incf lo,F
+ bsf leftbind
+ output_99
+ movlw ':'
+ movwf POSTINC2
+ movlw ' '
+ movwf POSTINC2
+ call word_processor
+
+ WIN_TOP .2
+ WIN_LEFT .50
+ lfsr FSR2,letter
+
+ ;He check
+ movf divemins+0,W
+ addlw 0x07
+ movwf EEADR
+ call read_eeprom ; He value
+ movff EEDATA,lo ; Move EEData -> lo
+ movf lo,f ; Move lo -> f
+ movlw d'0' ; Move 0 -> WREG
+ cpfsgt lo ; He > 0?
+ bra gassetup_title_bar3 ; NO check o2
+
+ ; YES Write TX 15/55
+ call gassetup_write_Tx ; Write TX
+ movf divemins+0,W
+ addlw 0x06
+ movwf EEADR
+ call read_eeprom ; O2 value
+ movff EEDATA,lo
+ output_8 ; Write O2
+ movlw '/'
+ movwf POSTINC2
+ movf divemins+0,W
+ addlw 0x07
+ movwf EEADR
+ call read_eeprom ; He value
+ movff EEDATA,lo
+ output_8 ; Write He
+ bra gassetup_title_bar7
+
+; New v1.44se
+gassetup_title_bar3: ; O2 Check
+ movf divemins+0,W
+ addlw 0x06
+ movwf EEADR
+ call read_eeprom ; O2 value
+ movff EEDATA,lo
+ movf lo,f ; Move lo -> f
+ movlw d'21' ; Move 21 -> WREG
+ cpfseq lo ; o2 = 21
+ cpfsgt lo ; o2 > 21%
+ bra gassetup_title_bar5 ; NO AIR
+ movlw d'100' ; Move 100 -> WREG
+ cpfslt lo ; o2 < 100%
+ bra gassetup_title_bar4 ; NO write O2
+
+ ; YES Write NX 32
+ call gassetup_write_Nx
+ output_8
+ bra gassetup_title_bar7
+
+; New v1.44se
+gassetup_title_bar4:
+ movlw 'O'
+ movwf POSTINC2
+ movlw '2'
+ movwf POSTINC2
+ movlw ' '
+ movwf POSTINC2
+ output_8
+ bra gassetup_title_bar7
+
+; New v1.44se
+gassetup_title_bar5:
+ cpfseq lo ; o2 = 21%
+ bra gassetup_title_bar6
+
+ movlw 'A'
+ movwf POSTINC2
+ movlw 'I'
+ movwf POSTINC2
+ movlw 'R'
+ movwf POSTINC2
+ movlw ' '
+ movwf POSTINC2
+ output_8
+ bra gassetup_title_bar7
+
+; New v1.44se
+gassetup_title_bar6: ; ERROR
+ movlw 'E'
+ movwf POSTINC2
+ movlw 'R'
+ movwf POSTINC2
+ movlw 'R'
+ movwf POSTINC2
+ movlw ' '
+ movwf POSTINC2
+ output_8
+ bra gassetup_title_bar7
+
+gassetup_title_bar7:
+ movlw ' '
+ movwf POSTINC2
+ movlw 'i'
+ movwf POSTINC2
+ movlw 'n'
+ movwf POSTINC2
+ movlw ' '
+ movwf POSTINC2
+ movf decodata+0,W ; read current value
+ addlw d'28' ; offset in memory
+ movwf EEADR
+ call read_eeprom ; Low-value
+ movff EEDATA,lo
+ output_8
+ movlw 'm'
+ movwf POSTINC2
+ movlw ' '
+ movwf POSTINC2
+
+ call word_processor
+ WIN_INVERT .0 ; Init new Wordprocessor
+ return
+
+; New v1.44se
+gassetup_write_Nx:
+ movlw 'N'
+ movwf POSTINC2
+ movlw 'X'
+ movwf POSTINC2
+ movlw ' '
+ movwf POSTINC2
+ return
+
+; New v1.44se
+gassetup_write_Tx:
+ movlw 'T'
+ movwf POSTINC2
+ movlw 'X'
+ movwf POSTINC2
+ movlw ' '
+ movwf POSTINC2
+ return
+
+; New v1.44se
+menu_gassetup_grey_inactive:
+; Set Greyvalue to lower value when gas is inactive
+ read_int_eeprom d'27' ; read flag register
+ movff decodata+0,lo ; copy gas number 0-4
+ incf lo,F ; 1-5
+menu_gassetup_list1:
+ rrcf EEDATA ; roll flags into carry
+ decfsz lo,F ; max. 5 times...
+ bra menu_gassetup_list1
+ movlw color_white
+ btfss STATUS,C ; test carry
+ movlw color_grey
+ call PLED_set_color ; grey out inactive gases!
+ return
+
+gassetup_show_ppO2:
+ movf divemins+0,W
+ addlw 0x06
+ movwf EEADR
+ call read_eeprom ; O2 value
+ movff EEDATA,hi
+
+ movf decodata+0,W ; read current value
+ addlw d'28' ; offset in memory
+ movwf EEADR
+ call read_eeprom ; Change depth in m
+ movff EEDATA,lo
+ movlw d'10'
+ addwf lo,F ; Depth+10m=lo
+ movf hi,W
+ mulwf lo ; (Depth+10m)*O2
+ movff PRODL,xA+0
+ movff PRODH,xA+1
+ movlw d'10'
+ movwf xB+0
+ clrf xB+1
+ call div16x16 ;xA/xB=xC with xA as remainder
+ movff xC+0,lo ; ((Depth+10m)*O2)/10 = [0.01Bar] ppO2
+ movff xC+1,hi
+
+ WIN_LEFT .55
+ WIN_TOP .35
+ lfsr FSR2,letter
+ movlw '('
+ movwf POSTINC2
+ movlw 'p'
+ movwf POSTINC2
+ movlw 'p'
+ movwf POSTINC2
+ movlw 'O'
+ movwf POSTINC2
+ movlw '2'
+ movwf POSTINC2
+ movlw ':'
+ movwf POSTINC2
+ output_16dp d'3'
+ movlw 'B'
+ movwf POSTINC2
+ movlw 'a'
+ movwf POSTINC2
+ movlw 'r'
+ movwf POSTINC2
+ movlw ')'
+ movwf POSTINC2
+ movlw ' '
+ movwf POSTINC2
+ call word_processor
+ return
\ No newline at end of file
diff -r 000000000000 -r 96a35aeda5f2 code_part1/OSTC_code_asm_part1/menu_logbook.asm
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/code_part1/OSTC_code_asm_part1/menu_logbook.asm Tue Jan 12 15:05:59 2010 +0100
@@ -0,0 +1,1095 @@
+
+; OSTC - diving computer code
+; Copyright (C) 2008 HeinrichsWeikamp GbR
+
+; 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 3 of the License, or
+; (at your option) any later version.
+
+; This program is distributed in the hope that it will be useful,
+; but WITHOUT ANY WARRANTY; without even the implied warranty of
+; 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, see .
+
+
+; Menu "Logbook"
+; written by: Matthias Heinrichs, info@heinrichsweikamp.com
+; written: 060107
+; last updated: 081026
+; known bugs:
+; ToDo:
+
+; searches external EEPROM for dive headers and displays them in a list
+; a detailed view with all informations and profile can be selected
+; does not require a FAT, will work with other profile intervals as ten seconds, too
+
+menu_logbook:
+ bcf return_from_profileview ; clear some flags
+;call enable_rs232
+menu_logbook1:
+ bcf logbook_header_drawn
+ call PLED_ClearScreen ; Clear screen
+ bcf all_dives_shown ; clear some flags
+ bcf logbook_profile_view
+ bcf logbook_page_not_empty
+ clrf menupos3 ; Here: used rows on current logbook-page
+ clrf menupos2 ; Here: # of current displayed page
+ clrf divenumber ; # of dive in list during search
+
+
+menu_logbook1a:
+ WIN_INVERT .1
+ DISPLAYTEXT .12 ;" Wait.."
+ WIN_INVERT .0
+ clrf divemins+0 ; Here: used as temp variables
+ clrf divemins+1
+ call I2CReset ; Reset I2C Bus
+ call get_free_EEPROM_location ; search from "here" backwards through the external memory
+ clrf temp1 ; max. 32KB
+ clrf temp2
+
+ movlw d'5'
+ movwf menupos ; Here: stores current position on display (5-x)
+
+menu_logbook1b:
+ ; search external EEPROM backwards from eeprom_address
+ ; for 0xFA, 0xFA (store 1st. 0xFA position for next search)
+ ; read header data and display it
+ ; wait for user to confirm/exit
+ ; recopy data to search from here
+ WIN_INVERT .1
+ DISPLAYTEXT .12 ;" Wait.."
+ WIN_INVERT .0
+ bcf first_FA ; clear flags
+ bcf second_FA
+
+menu_logbook2:
+ movlw d'1' ; increase 16Bit value
+ addwf divemins+0,F
+ movlw d'0'
+ addwfc divemins+1,F
+
+ btfsc divemins+1,7 ; At 0x8000?
+ bra menu_logbook_reset ; yes, restart (if not empty)
+
+ decf_eeprom_address d'1' ; Macro, that subtracts 8Bit from eeprom_address:2 with banking at 0x8000
+
+ call I2CREAD ; reads one byte (Slow! Better use Blockread!)
+
+ btfsc first_FA ;
+ bra test_2nd_FA
+
+ bsf first_FA ; Found 1st. 0xFA?
+ movlw 0xFA
+ cpfseq SSPBUF
+ bcf first_FA ; No, clear flag
+ bra menu_logbook3 ; and continue search
+
+test_2nd_FA:
+ btfsc second_FA
+ bra test_FA_DONE
+
+ bsf second_FA ; found 2nd 0xFA?
+ movlw 0xFA
+ cpfseq SSPBUF
+ rcall no_second_FA ; No, clear both flags!
+ bra menu_logbook3 ; and continue search
+
+test_FA_DONE: ; Found 0xFA 0xFA!
+ movff eeprom_address+0,eeprom_header_address+0 ; store current address into temp register
+ movff eeprom_address+1,eeprom_header_address+1 ; we must continue search here later
+ incf divenumber,F ; new header found, increase divenumber
+ bra menu_logbook4 ; Done with searching, display the header!
+
+no_second_FA: ; discard both flags!
+ bcf second_FA
+ bcf first_FA
+ return
+
+
+menu_logbook3:
+ movlw d'1' ; increase global counter
+ addwf temp1,F
+ movlw d'0'
+ addwfc temp2,F
+
+ btfsc temp2,7 ; 32KB searched?
+ bra menu_logbook3b ; Yes
+ bra menu_logbook2 ; No, not now
+
+
+menu_logbook3b:
+ btfss logbook_page_not_empty ; Was there at least one dive?
+ goto menu ; Not a single header was found, leave logbook.
+ bra menu_logbook_display_loop2 ; rcall of get_free_eeprom_location not required here (faster)
+
+menu_logbook_reset:
+ movf divenumber,W
+ btfsc STATUS,Z ; Was there at least one dive?
+ bra menu_logbook3b ; No, Nothing to do
+
+ bsf all_dives_shown ; Yes
+ bra menu_logbook_display_loop2 ; rcall of get_free_eeprom_location not required here (faster)
+
+
+menu_logbook4:
+ ; Adjust eeprom_address to set pointer on first headerbyte
+ incf_eeprom_address d'3' ; Macro, that adds 8Bit to eeprom_address:2 with banking at 0x8000
+
+ btfss logbook_profile_view ; Display profile (search routine is used in profileview, too)
+ bra menu_logbook_display_loop ; No, display overwiev list
+
+ movf divesecs,W ; divenumber that is searched
+ cpfseq divenumber ; current divenumber
+ bra next_logbook ; No match, continue search
+ bra display_profile2
+
+
+menu_logbook_display_loop:
+ btfsc all_dives_shown ; All dives displayed?
+ bra menu_logbook_display_loop2 ; Yes, but display first page again.
+
+ rcall display_listdive ; display short header for list on current list position
+
+ movlw d'5'
+ cpfseq menupos ; first dive on list (top place)?
+ bra menu_logbook_display_loop1 ; no, so skip saving of address
+
+
+ movff divenumber,mintemp+0 ; store all registered required to rebuilt the current logbookpage after the detail/profile view
+ movff eeprom_header_address+0,decodata+0 ; several registers are used as temp registers here
+ movff eeprom_header_address+1,decodata+1
+ movff divemins+0,max_pressure+0
+ movff divemins+1,max_pressure+1
+ movff temp1,logbook_temp6
+ movff temp2,samplesecs
+
+ movlw d'3'
+ addwf decodata+0,F
+ movlw d'0'
+ addwfc decodata+1,F ; Re-Adjust pointer again
+ movlw d'3' ; So first row will be the same again after detail/profile view
+ subwf max_pressure+0,F
+ movlw d'0'
+ subwfb max_pressure+1,F
+
+menu_logbook_display_loop1:
+ decfsz menupos,F ; List full?
+ bra next_logbook ; no, search another dive for our current logbook page
+
+menu_logbook_display_loop2:
+ btfss logbook_page_not_empty ; Was there one dive at all?
+ bra menu_logbook ; Yes, so reload the first page
+
+ call PLED_topline_box ; Draw box
+ WIN_INVERT .1
+ DISPLAYTEXT .26 ; "Logbook"
+ WIN_INVERT .0
+
+ DISPLAYTEXT .11 ; Displays "Exit" in the last row on the current page
+
+ bcf sleepmode ; clear some flags for user input
+ bcf menubit2
+ bcf menubit3
+ bcf cursor
+ bcf switch_right
+ bcf switch_left
+ clrf timeout_counter2
+
+ movlw d'1' ; Set cursor to position 1...
+ btfsc return_from_profileview ; .. unless we are returning from a detail/profile view
+ movf mintemp+1,W ; load last cursor position again
+ movwf menupos ; and set menupos byte
+ bcf return_from_profileview ; Do this only once while the page is loaded again!
+
+ bcf logbook_page_not_empty ; Obviously the current page is NOT empty
+ call PLED_logbook_cursor
+
+menu_logbook_loop:
+ call check_switches_logbook
+
+ btfsc menubit3 ; SET/MENU?
+ bra next_logbook3 ; adjust cursor or create new page
+
+ btfsc menubit2 ; ENTER?
+ bra display_profile_or_exit ; view details/profile or exit logbook
+
+ btfsc onesecupdate
+ call timeout_surfmode ; Timeout
+
+ btfsc onesecupdate
+ call set_dive_modes ; Check, if divemode must be entered
+
+ bcf onesecupdate ; one second update
+
+ btfsc sleepmode ; Timeout?
+ goto menu ; Yes
+
+ btfsc divemode
+ goto restart ; Enter Divemode if required
+
+ bra menu_logbook_loop ; Wait for something to do
+
+display_profile_or_exit:
+ bcf menubit2 ; debounce
+ movlw d'6' ; exit?
+ cpfseq menupos
+ bra display_profile ; No, show details/profile
+ goto menu
+
+display_profile:
+ movff menupos,mintemp+1 ; store current cursor position
+ bsf return_from_profileview ; tweak search routine to exit after found
+
+ movf menupos2,W ; Number of page
+ mullw d'5'
+ movf PRODL,W
+ addwf menupos,W ; page*5+menupos=
+ movwf divesecs ; # of dive to search
+
+ call PLED_ClearScreen ; search for dive
+ bsf logbook_profile_view ; set flag for search routine
+
+ clrf divenumber ; search from scratch
+ bra menu_logbook1a ; start search
+display_profile2:
+ bcf logbook_profile_view ; clear flag for search routine
+
+ call PLED_display_wait_clear
+ WIN_TOP .0
+ WIN_LEFT .0
+ lfsr FSR2,letter
+ movlw '#'
+ movwf POSTINC2
+
+ GETCUSTOM15 .28 ; Logbook Offset -> lo, hi
+ tstfsz lo ; lo=0?
+ bra display_profile_offset1 ; No, adjust offset
+ tstfsz hi ; hi=0?
+ bra display_profile_offset1 ; No, adjust offset
+ bra display_profile_offset2 ; lo=0 and hi=0 -> skip Offset routine
+
+display_profile_offset1:
+ movlw d'1'
+ addwf lo,F
+ movlw d'0'
+ addwfc hi,F ; hi:lo = hi:lo + 1
+ movff lo,sub_a+0
+ movff hi,sub_a+1
+ movff divesecs,sub_b+0
+ clrf sub_b+1
+ call sub16 ; sub_c = sub_a - sub_b
+ movff sub_c+0,lo
+ movff sub_c+1,hi
+ bsf leftbind
+ output_16dp d'10' ; # of dive with offset
+ bra display_profile_offset3 ; Skip normal routine
+
+display_profile_offset2:
+ movff divesecs,lo
+ output_99x ; # of dive
+
+display_profile_offset3:
+ movlw ' '
+ movwf POSTINC2
+ call I2CREAD2
+ movff SSPBUF,lo ;
+
+ call I2CREAD2 ; Skip Profile version
+ movff SSPBUF,lo ; read month
+
+ movff eeprom_address+0, EventByte ; Store current EEPROM position
+ movff eeprom_address+1, ProfileFlagByte
+; Offset to SamplingRate
+ incf_eeprom_address d'32' ; Macro, that adds 8Bit to eeprom_address:2 with banking at 0x8000
+ call I2CREAD ; Read Sampling rate
+ movff SSPBUF,samplesecs_value ; Copy sampling rate
+
+ movff EventByte, eeprom_address+0 ; Re-Store current EEPROM position
+ movff ProfileFlagByte, eeprom_address+1 ; Re-Store current EEPROM position
+
+;display_profile2a:
+
+ movff lo,convert_value_temp+0 ; Month (in lo, see above)
+ call I2CREAD2 ; Day
+ movff SSPBUF,convert_value_temp+1
+ call I2CREAD2 ; Year
+ movff SSPBUF,convert_value_temp+2
+ call PLED_convert_date ; converts into "DD/MM/YY" or "MM/DD/YY" or "YY/MM/DD" in postinc2
+
+ movlw ' '
+ movwf POSTINC2
+ call I2CREAD2 ; hour
+ movff SSPBUF,lo
+ output_99x
+ movlw ':'
+ movwf POSTINC2
+ call I2CREAD2 ; Minute
+ movff SSPBUF,lo
+ output_99x
+ call word_processor ; Display 1st row of details
+
+ WIN_TOP .25
+ WIN_LEFT .05
+ lfsr FSR2,letter
+ call I2CREAD2
+ movff SSPBUF,lo
+ call I2CREAD2
+ movff SSPBUF,hi
+ movff lo,xA+0 ; calculate y-scale for profile display
+ movff hi,xA+1
+ movlw d'164' ; 164pixel height available
+ movwf xB+0
+ clrf xB+1
+ call div16x16 ; does xA/xB=xC
+ movff xC+0,sim_pressure+0 ; holds LOW byte of y-scale (mbar/pixel!)
+ movff xC+1,sim_pressure+1 ; holds HIGH byte of y-scale (mbar/pixel!)
+ incf sim_pressure+0,F ; increase one, because there may be a remainder
+ movlw d'0'
+ addwfc sim_pressure+1,F
+
+ bsf leftbind
+ output_16dp d'3' ; max. depth
+ movlw 'm'
+ movwf POSTINC2
+ movlw ' '
+ movwf POSTINC2
+ call I2CREAD2
+ movff SSPBUF,lo
+ call I2CREAD2
+ movff SSPBUF,hi
+
+ movff lo,xA+0 ; calculate x-scale for profile display
+ movff hi,xA+1 ; calculate total diveseconds first
+ movlw d'60' ; 60seconds are one minute
+ movwf xB+0
+ clrf xB+1
+ call mult16x16 ; result is in xC:2 !
+
+ bsf leftbind
+ output_16 ; divetime minutes
+ movlw d'39'
+ movwf POSTINC2
+ call I2CREAD2
+ movff SSPBUF,lo
+ movf lo,W ; add seconds to total seconds
+ addwf xC+0
+ movlw d'0'
+ addwfc xC+1 ; xC:2 now holds total dive seconds!
+ movff xC+0,xA+0 ; now calculate x-scale value
+ movff xC+1,xA+1
+ movlw d'159' ; 159pix width available
+ movwf xB+0
+ clrf xB+1
+ call div16x16 ; xA/xB=xC
+ movff xC+0,xA+0
+ movff xC+1,xA+1
+ movf samplesecs_value,W ; devide through sample interval!
+ movwf xB+0
+ clrf xB+1
+ call div16x16 ; xA/xB=xC
+ movff xC+0,profile_temp+0 ; store value (use any #xC sample, skip xC-1) into temp registers
+ movff xC+1,profile_temp+1 ; store value (use any #xC sample, skip xC-1) into temp registers
+ incf profile_temp+0,F ; increase one, because there may be a remainder
+ movlw d'0'
+ addwfc profile_temp+1,F
+
+ bsf leftbind
+ output_99x ; divetime seconds
+ movlw '"'
+ movwf POSTINC2
+ movlw ' '
+ movwf POSTINC2
+ call I2CREAD2
+ movff SSPBUF,lo
+ call I2CREAD2
+ movff SSPBUF,hi
+ movlw d'3'
+ movwf ignore_digits
+ bsf leftbind
+ output_16dp d'2' ; temperature
+ movlw '°'
+ movwf POSTINC2
+ movlw 'C'
+ movwf POSTINC2
+ call word_processor ; Display 2nd row of details
+
+ WIN_TOP .50
+ WIN_LEFT .05
+ lfsr FSR2,letter
+
+ call I2CREAD2
+ movff SSPBUF,lo
+ call I2CREAD2
+ movff SSPBUF,hi
+ bsf leftbind
+ output_16 ; Air pressure before dive
+ movlw 'm'
+ movwf POSTINC2
+ movlw 'b'
+ movwf POSTINC2
+ movlw 'a'
+ movwf POSTINC2
+ movlw 'r'
+ movwf POSTINC2
+ movlw ' '
+ movwf POSTINC2
+
+ movlw 'D'
+ movwf POSTINC2
+ movlw 'e'
+ movwf POSTINC2
+ movlw 's'
+ movwf POSTINC2
+ movlw 'a'
+ movwf POSTINC2
+ movlw 't'
+ movwf POSTINC2
+ movlw ' '
+ movwf POSTINC2
+
+ call I2CREAD2
+ movff SSPBUF,lo
+ call I2CREAD2
+ movff SSPBUF,hi
+ call convert_time ; converts hi:lo in minutes to hours (hi) and minutes (lo)
+ bsf leftbind
+ movf lo,W
+ movff hi,lo
+ movwf hi ; exchange lo and hi...
+ output_8 ; Hours
+ movlw ':'
+ movwf POSTINC2
+ movff hi,lo ; Minutes
+ output_99x
+ bcf leftbind
+ call word_processor ; display 3rd page of details
+
+ call I2CREAD2 ; Skip Gas1 current O2
+ call I2CREAD2 ; Skip Gas1 current HE
+ call I2CREAD2 ; Skip Gas2 current O2
+ call I2CREAD2 ; Skip Gas2 current HE
+ call I2CREAD2 ; Skip Gas3 current O2
+ call I2CREAD2 ; Skip Gas3 current HE
+ call I2CREAD2 ; Skip Gas4 current O2
+ call I2CREAD2 ; Skip Gas4 current HE
+ call I2CREAD2 ; Skip Gas5 current O2
+ call I2CREAD2 ; Skip Gas5 current HE
+ call I2CREAD2 ; Skip Gas6 current O2
+ call I2CREAD2 ; Skip Gas6 current HE
+ call I2CREAD2 ; Skip Start Gas
+ call I2CREAD2 ; Skip Firmware x
+ call I2CREAD2 ; Skip Firmware y
+ call I2CREAD2 ; Skip battery
+ call I2CREAD2 ; Skip battery
+ call I2CREAD2 ; Skip Sampling rate
+ call I2CREAD2 ; Read divisor
+ movff SSPBUF,divisor_temperature ; Store divisor
+ bcf divisor_temperature,4 ; Clear information length
+ bcf divisor_temperature,5
+ bcf divisor_temperature,6
+ bcf divisor_temperature,7
+ incf divisor_temperature,F ; increase divisor
+ movff divisor_temperature,logbook_temp1 ; Store as temp, too
+ call I2CREAD2 ; Read divisor
+ movff SSPBUF,divisor_deco ; Store divisor
+ bcf divisor_deco,4 ; Clear information length
+ bcf divisor_deco,5
+ bcf divisor_deco,6
+ bcf divisor_deco,7
+ movff divisor_deco,logbook_temp2 ; Store as temp, too
+ call I2CREAD2 ; Read divisor
+ movff SSPBUF,divisor_tank ; Store divisor
+ call I2CREAD2 ; Read divisor
+ movff SSPBUF,divisor_ppo2 ; Store divisor
+ call I2CREAD2 ; Read divisor
+ movff SSPBUF,divisor_deco_debug ; Store divisor
+ call I2CREAD2 ; Read divisor
+ movff SSPBUF,divisor_nuy2 ; Store divisor
+ call I2CREAD2 ; Read Salinity
+ call I2CREAD2 ; Skip Dummy byte
+
+display_profile2d:
+ ; Start Profile display
+
+ movlw color_deepblue
+ movff WREG,box_temp+0 ; Data
+ movlw .75
+ movff WREG,box_temp+1 ; row top (0-239)
+ movlw .239
+ movff WREG,box_temp+2 ; row bottom (0-239)
+ movlw .0
+ movff WREG,box_temp+3 ; column left (0-159)
+ movlw .159
+ movff WREG,box_temp+4 ; column right (0-159)
+ call PLED_box
+
+
+ call I2CREAD2 ; skip 0xFB (Header-end)
+ clrf timeout_counter2 ; here: used as counter for depth readings
+ call I2CREAD2 ; skip 0xFB (Header-end)
+ movlw d'158'
+ movwf ignore_digits ; here: used as counter for x-pixels
+ bcf second_FD ; clear flag
+ movlw d'5'
+ movwf timeout_counter3 ; here: used as colum x2 (Start at Colum 5)
+ movlw d'75' ; Zero-m row
+ movwf apnoe_mins ; here: used for fill between rows
+ incf timeout_counter3,W ; Init Column
+ call PLED_SetColumnPixel ; pixel x2
+
+profile_display_loop:
+ movff profile_temp+0,profile_temp2+0
+ movff profile_temp+1,profile_temp2+1 ; 16Bit x-scaler
+ incf profile_temp2+1,F
+
+profile_display_loop2:
+ rcall profile_view_get_depth ; reads depth, ignores temp and profile data -> hi, lo
+
+ btfsc second_FD ; end-of profile reached?
+ bra profile_display_loop_done ; Yes, skip all remaining pixels
+
+ movff sim_pressure+0,xB+0 ; devide pressure in mbar/quant for row offsett
+ movff sim_pressure+1,xB+1
+ movff lo,xA+0
+ movff hi,xA+1
+ call div16x16 ; xA/xB=xC
+ movlw d'75'
+ addwf xC+0,F ; add 75 pixel offset to result
+ call profile_display_fill ; In this column between this row (xC+0) and the last row (apnoe_mins)
+ movff xC+0,apnoe_mins ; Store last row for fill routine
+ movf xC+0,W
+ call PLED_SetRow ; 0...259
+
+ incf timeout_counter3,F
+ movf timeout_counter3,W
+ call PLED_SetColumnPixel ; pixel x2
+ WIN_COLOR color_white
+ call PLED_PxlWrite ; Write two pixels
+
+profile_display_skip_loop1: ; skips readings!
+ dcfsnz profile_temp2+0,F
+ bra profile_display_loop3 ; check 16bit....
+
+ rcall profile_view_get_depth ; reads depth, ignores temp and profile data
+ bra profile_display_skip_loop1
+
+profile_display_loop3:
+ decfsz profile_temp2+1,F ; 16 bit x-scaler test
+ bra profile_display_skip_loop1 ; skips readings!
+
+ decfsz ignore_digits,F ; counts x-pixels to zero
+ bra profile_display_loop ; Not ready yet
+; Done.
+profile_display_loop_done:
+ bcf sleepmode ; clear some flags
+ bcf menubit2
+ bcf menubit3
+ bcf switch_right
+ bcf switch_left
+ clrf timeout_counter2
+
+display_profile_loop:
+ call check_switches_logbook
+
+ btfsc menubit2 ; SET/MENU?
+ bra exit_profileview ; back to list
+
+ btfsc menubit3 ; ENTER?
+ bra profileview_menu ; Switch to the Profileview menu
+
+ btfsc onesecupdate
+ call timeout_surfmode ; timeout
+
+ btfsc onesecupdate
+ call set_dive_modes ; check, if divemode must be entered
+
+ bcf onesecupdate ; one second update
+
+ btfsc sleepmode ; Timeout?
+ bra exit_profileview ; back to list
+
+ btfsc divemode
+ goto restart ; Enter Divemode if required
+
+ bra display_profile_loop ; wait for something to do
+
+profile_display_fill: ; In this column between this row (xC+0) and the last row (apnoe_mins), keep xC+0!!
+; First, check if xC+0>apnoe_mins or xC+0xC+0?
+ bra profile_display_fill_up ; Yes!
+
+profile_display_fill_down: ; Fill downwards from apone_mins to xC+0!
+ movff apnoe_mins,xC+1 ; Copy
+profile_display_fill_down2: ; Loop
+ decf xC+1,F
+ movf xC+1,W ; Row
+ call PLED_SetRow ; 0...259
+ WIN_COLOR color_white
+ call PLED_PxlWrite_Single; Write one Pixel
+ movf xC+0,W
+ cpfseq xC+1 ; Loop until xC+1=xC+0
+ bra profile_display_fill_down2
+ return ; apnoe_mins and xC+0 are untouched
+
+profile_display_fill_up: ; Fill upwards from xC+0 to apone_mins!
+ movff xC+0,xC+1 ; Copy
+profile_display_fill_up2: ; Loop
+ decf xC+1,F
+ movf xC+1,W ; Row
+ call PLED_SetRow ; 0...259
+ WIN_COLOR color_white
+ call PLED_PxlWrite_Single; Write one Pixel
+ movf apnoe_mins,W
+ cpfseq xC+1 ; Loop until xC+1=apnoe_mins
+ bra profile_display_fill_up2
+ return ; apnoe_mins and xC+0 are untouched
+
+profile_view_get_depth:
+ call I2CREAD2 ; read first depth
+ movff SSPBUF,lo ; low value
+ call I2CREAD2 ; read first depth
+ movff SSPBUF,hi ; high value
+ call I2CREAD2 ; read Profile Flag Byte
+ movff SSPBUF,timeout_counter2 ; Read Profile Flag Byte
+ bcf event_occured ; clear flag
+ btfsc timeout_counter2,7
+ bsf event_occured ; We also have an Event byte!
+ bcf timeout_counter2,7 ; Clear Event Byte Flag (If any)
+ ; timeout_counter2 now holds the number of additional bytes to ignore (0-127)
+ movlw 0xFD ; end of profile bytes?
+ cpfseq lo
+ bra profile_view_get_depth_new1 ; no 0xFD
+ movlw 0xFD ; end of profile bytes?
+ cpfseq hi
+ bra profile_view_get_depth_new1 ; no 0xFD
+ bsf second_FD ; End found! Set Flag! Skip remaining pixels!
+ return
+
+profile_view_get_depth_new1:
+ decfsz divisor_deco,F ; Check divisor
+ bra profile_view_get_depth_new1_1 ; Divisor not zero...
+
+; tstfsz timeout_counter2 ; Any bytes to ignore
+; bra profile_view_get_depth_new2 ; Yes (1-127)
+; return ; No (0)
+
+ movff logbook_temp2,divisor_deco ; Restore divisor value!
+; check for event byte and the extra informations
+ btfss event_occured
+ bra profile_view_get_depth_new2 ; No event!
+
+ call I2CREAD2 ; read event byte
+ decf timeout_counter2,F ; Reduce number of bytes to ignore
+
+ movlw d'0' ; Extra bytes to ignore because of event
+ btfsc SSPBUF,4
+ addlw d'2' ; two bytes for manual gas set
+ btfsc SSPBUF,5
+ addlw d'1' ; one byte for gas change
+ movwf logbook_temp5 ; store extra bytes to ignore
+
+ tstfsz logbook_temp5 ; Anything to ignore?
+ bra profile_view_get_depth_new1_2 ; Yes
+ bra profile_view_get_depth_new2 ; No, continue with normal routine
+
+profile_view_get_depth_new1_2:
+ call I2CREAD2 ; ignore byte
+ decf timeout_counter2,F ; Reduce number of bytes to ignore
+ decfsz logbook_temp5,F ; reduce extra bytes ignore counter
+ bra profile_view_get_depth_new1_2 ; loop
+
+profile_view_get_depth_new2:
+ movlw d'4' ; Temp (2) and Deko (2) in the sample?
+ cpfseq timeout_counter2
+ bra profile_view_get_depth_new2_2 ; No
+ ; Yes, skip Temp!
+ call I2CREAD2 ; ignore byte
+ decf timeout_counter2,F ; Reduce number of bytes to ignore
+ call I2CREAD2 ; ignore byte
+ decf timeout_counter2,F ; Reduce number of bytes to ignore
+
+profile_view_get_depth_new2_2:
+ call I2CREAD2 ; ignore byte
+
+ decfsz timeout_counter2,F ; reduce counter
+ bra profile_view_get_depth_new2_2; Loop
+ return
+
+profile_view_get_depth_new1_1:
+ tstfsz timeout_counter2 ; Any bytes to ignore
+ bra profile_view_get_depth_new3 ; Yes (1-127)
+ return ; No (0)
+
+ ; timeout_counter2 now holds the number of additional bytes to ignore (0-127)
+profile_view_get_depth_new3:
+ call I2CREAD2 ; ignore byte
+ decfsz timeout_counter2,F ; reduce counter
+ bra profile_view_get_depth_new3 ; Loop
+ return
+
+exit_profileview:
+ bcf sleepmode
+ clrf timeout_counter2 ; restore all registers to build same page again
+ movff decodata+0,eeprom_address+0
+ movff decodata+1,eeprom_address+1
+ movff max_pressure+0,divemins+0
+ movff max_pressure+1,divemins+1
+ movff mintemp+0, divenumber
+ movff logbook_temp6,temp1
+ movff samplesecs,temp2
+ decf divenumber,F
+ bcf all_dives_shown
+
+ decf menupos2,F
+
+ clrf menupos3 ; here: used row on current page
+ movlw d'5'
+ movwf menupos ; here: active row on current page
+ incf menupos2,F ; start new page
+ call PLED_ClearScreen ; clear details/profile
+ bra menu_logbook1b ; start search
+
+next_logbook2:
+ btfsc all_dives_shown ; all shown
+ goto menu_logbook1 ; all reset
+
+ clrf menupos3
+ movlw d'5'
+ movwf menupos ;
+ incf menupos2,F ; start new screen
+ call PLED_ClearScreen
+
+next_logbook:
+ movff eeprom_header_address+0,eeprom_address+0
+ movff eeprom_header_address+1,eeprom_address+1 ; continue search here
+ goto menu_logbook1b
+
+check_switches_logbook:
+ btfsc switch_right
+ bsf menubit3
+ btfsc switch_left
+ bsf menubit2 ; Enter
+ return
+
+next_logbook3:
+ incf menupos,F
+ movlw d'7'
+ cpfseq menupos ; =7?
+ bra next_logbook3a ; No
+ bra next_logbook2 ; yes, new page please
+
+next_logbook3a:
+ incf menupos3,W ;
+ cpfseq menupos
+ bra next_logbook3b
+ movlw d'6'
+ movwf menupos ; Jump directly to exit if page is not full
+
+next_logbook3b:
+ clrf timeout_counter2
+ call PLED_logbook_cursor
+
+ bcf switch_right
+ bcf menubit3 ; clear flag
+ bra menu_logbook_loop
+
+display_listdive:
+ bsf logbook_page_not_empty ; Page not empty
+ incf menupos3,F
+
+ btfsc logbook_header_drawn ; "Logbook already displayed?
+ bra display_listdive1a
+ call PLED_topline_box ; Draw box
+ WIN_INVERT .1
+ DISPLAYTEXT .26 ; "Logbook"
+ WIN_INVERT .0
+ bsf logbook_header_drawn
+
+display_listdive1a:
+ WIN_LEFT .20
+
+ movf menupos2,W
+ mullw d'5'
+ movf PRODL,W
+ subwf divenumber,W ; current row on page
+
+ mullw d'30' ; x30
+ movf PRODL,W ; is pixel-row for entry
+ addlw d'5' ; +5 Pixel, so list entries are at rows 35,65,95,125,155,185
+ movff WREG,win_top
+
+ lfsr FSR2,letter
+ movff divenumber,lo
+ output_99x ; # of dive
+ movlw ' '
+ movwf POSTINC2
+ call I2CREAD2
+ movff SSPBUF,lo
+ movlw d'13'
+ cpfsgt lo ; Skip if lo>13
+ bra display_listdive2 ; use old format
+
+ call I2CREAD2 ; Skip Profile version
+ movff SSPBUF,lo ; in new format, read month
+
+display_listdive2:
+ movff lo,convert_value_temp+0 ; Month (in lo, see above)
+ call I2CREAD2 ; Day
+ movff SSPBUF,convert_value_temp+1
+ call I2CREAD2 ; Year
+ movff SSPBUF,convert_value_temp+2
+ call PLED_convert_date_short ; converts into "DD/MM" or "MM/DD" or "MM/DD" in postinc2
+
+
+ call I2CREAD2 ; hours (Skip)
+ call I2CREAD2 ; minutes (skip)
+ movlw ' '
+ movwf POSTINC2
+ call I2CREAD2 ; Depth
+ movff SSPBUF,lo
+ call I2CREAD2
+ movff SSPBUF,hi
+ bsf leftbind
+ bsf ignore_digit5 ; Do not display 1cm figure
+ output_16dp d'3' ; max. depth
+ movlw 'm'
+ movwf POSTINC2
+ movlw ' '
+ movwf POSTINC2
+ call I2CREAD2
+ movff SSPBUF,lo
+ call I2CREAD2
+ movff SSPBUF,hi
+ bsf leftbind
+ output_16 ; Divetime minutes
+ movlw d'39' ; "'"
+ movwf POSTINC2
+
+ call word_processor ; Display header-row in list
+ return
+
+
+profileview_menu:
+ movlw d'1'
+ movwf menupos
+profileview_menu1:
+ call PLED_clear_divemode_menu
+ call PLED_profileview_menu ; Displays Menu
+profileview_menu2:
+ call PLED_divemenu_cursor
+ bcf sleepmode ; clear some flags
+ bcf menubit2
+ bcf menubit3
+ bcf switch_right
+ bcf switch_left
+ clrf timeout_counter2
+
+profileview_menu_loop:
+ call check_switches_logbook
+
+ btfsc menubit3 ; SET/MENU?
+ bra profileview_menu_move_cursor; Move Cursor
+ btfsc menubit2 ; ENTER?
+ bra profileview_menu_do ; Do task
+
+ btfsc onesecupdate
+ call timeout_surfmode ; timeout
+ btfsc onesecupdate
+ call set_dive_modes ; check, if divemode must be entered
+ bcf onesecupdate ; one second update
+ btfsc sleepmode ; Timeout?
+ bra exit_profileview ; back to list
+ btfsc divemode
+ goto restart ; Enter Divemode if required
+
+ bra profileview_menu_loop ; wait for something to do
+
+profileview_menu_do:
+ dcfsnz menupos,F
+ bra exit_profileview ; back to list, quit profileview menu
+ dcfsnz menupos,F
+ bra profileview_menu_delete ; Delete Dive from external EEPROM
+ dcfsnz menupos,F
+ bra profileview_menu_format ; Delete all Dives from external EEPROM
+
+profileview_menu_move_cursor:
+ incf menupos,F
+ movlw d'4' ; number of menu options+1
+ cpfseq menupos ; =limit?
+ bra profileview_menu_move_cursor2 ; No!
+ movlw d'1' ; Yes, reset to position 1!
+ movwf menupos
+profileview_menu_move_cursor2:
+ bra profileview_menu2 ; Return to Profile Menu, also updates cursor
+
+profileview_menu_format:
+ call PLED_confirmbox ; Returns WREG=0 for Cancel (Or Timeout) and WREG=1 for OK!
+
+ movwf menupos ; Used as temp
+ tstfsz menupos
+ bra profileview_menu_format_loop2 ; Format now!
+
+ bra exit_profileview ; back to list, quit profileview menu
+
+profileview_menu_format_loop2: ; Do now format!
+ call PLED_ClearScreen
+ DISPLAYTEXT .12 ; "Wait.."
+ call reset_external_eeprom ; delete profile memory
+ goto menu ; Return to Menu
+
+profileview_menu_delete:
+ call PLED_confirmbox ; Returns WREG=0 for Cancel (Or Timeout) and WREG=1 for OK!
+ movwf menupos ; Used as temp
+ tstfsz menupos
+ bra profileview_menu_delete_loop2 ; Delete now!
+
+ bra exit_profileview ; back to list, quit profileview menu
+
+profileview_menu_delete_loop2: ; Do now delete
+ call PLED_ClearScreen
+ DISPLAYTEXT .12 ; "Wait.."
+
+; eeprom_address:2 is set to the second byte after the ending 0xFD 0xFD
+; eeprom_address:2 - 1 -> set to the last byte after the 0xFD 0xFD of the current dive
+
+; Set pointer to Byte after the final "0xFD 0xFD"
+ decf_eeprom_address d'1' ; Macro, that subtracts 8Bit from eeprom_address:2 with banking at 0x8000
+ movff eeprom_address+0,divemins+0
+ movff eeprom_address+1,divemins+1
+
+; eeprom_header_address:2 + 1 -> set to the first 0xFA of the 0xFA 0xFA start bytes of the header
+ movlw d'1' ;
+ addwf eeprom_header_address+0,F
+ movlw d'0'
+ addwfc eeprom_header_address+1,F ; eeprom_header_address:2 + 1
+ btfsc eeprom_header_address+1,7 ; at 7FFF?
+ clrf eeprom_header_address+0 ; Yes, clear address (+0 first!)
+ btfsc eeprom_header_address+1,7 ; at 7FFF?
+ clrf eeprom_header_address+1 ; Yes, clear address
+
+ movff divemins+0,eeprom_address+0
+ movff divemins+1,eeprom_address+1 ; Read source
+ call I2CREAD ; reads one byte (Slow! Better use Blockread!)
+ movwf profile_temp+0
+ movlw 0xFE
+ cpfseq profile_temp+0
+ bra profileview_menu_delete_notlast ; we're not deleting the last dive....
+
+; Just move the 0xFE after the dive and delete the rest with 0xFF
+ movff eeprom_header_address+0, eeprom_address+0
+ movff eeprom_header_address+1, eeprom_address+1 ; Write target
+ movlw 0xFE
+ call I2CWRITE ; Write the byte
+
+; Now, delete everything _between_ eeprom_header_address and divemins:2+2 with 0xFF
+ movlw d'1' ;
+ addwf eeprom_header_address+0,F
+ movlw d'0'
+ addwfc eeprom_header_address+1,F ; eeprom_header_address:2 + 1
+ btfsc eeprom_header_address+1,7 ; at 7FFF?
+ clrf eeprom_header_address+0 ; Yes, clear address (+0 first!)
+ btfsc eeprom_header_address+1,7 ; at 7FFF?
+ clrf eeprom_header_address+1 ; Yes, clear address
+
+ movff eeprom_header_address+0,eeprom_address+0
+ movff eeprom_header_address+1,eeprom_address+1
+
+ movlw d'1' ;
+ addwf divemins+0,F
+ movlw d'0'
+ addwfc divemins+1,F ; divemins:2 + 1
+ btfss divemins+1,7 ; at 7FFF?
+ bra profileview_menu_delete_loop2a ; Skip
+ clrf divemins+0 ; Yes, clear address
+ clrf divemins+1
+
+; movff eeprom_header_address+0,eeprom_address+0
+; movff eeprom_header_address+1,eeprom_address+1
+
+
+profileview_menu_delete_loop2a:
+ movlw 0xFF
+ call I2CWRITE ; Write the byte
+
+ incf_eeprom_address d'1' ; Macro, that adds 8Bit to eeprom_address:2 with banking at 0x8000
+
+ movff divemins+0,sub_a+0
+ movff divemins+1,sub_a+1
+ movff eeprom_address+0,sub_b+0
+ movff eeprom_address+1,sub_b+1
+ call sub16 ; sub_c = sub_a - sub_b
+ tstfsz sub_c+0 ; Done (Result=Zero?) ?
+ bra profileview_menu_delete_loop2a ; No, continue
+ tstfsz sub_c+1 ; Done (Result=Zero?) ?
+ bra profileview_menu_delete_loop2a ; No, continue
+ goto menu_logbook ; Return to list when done deleting
+
+profileview_menu_delete_notlast:
+; Move everything byte-wise from divemins:2 to eeprom_header_address:2 until 0xFD 0xFD 0xFE is found and were moved
+ call get_free_EEPROM_location ; Searches 0xFD, 0xFD, 0xFE and sets Pointer to 0xFE
+
+ incf_eeprom_address d'2' ; Macro, that adds 8Bit to eeprom_address:2 with banking at 0x8000
+ movff eeprom_address+0,profile_temp+0
+ movff eeprom_address+1,profile_temp+1
+; holds now address of 0xFE + 2 (Abort condition....)
+ decf_eeprom_address d'2' ; Macro, that subtracts 8Bit from eeprom_address:2 with banking at 0x8000
+; holds now address of 0xFE again
+ movff eeprom_address+0,divemins+0
+ movff eeprom_address+1,divemins+1 ; Copy to working read registers
+
+profileview_menu_delete_loop3:
+ movff divemins+0,eeprom_address+0
+ movff divemins+1,eeprom_address+1 ; Read source
+ call I2CREAD ; reads one byte (Slow! Better use Blockread!)
+ movff eeprom_header_address+0, eeprom_address+0
+ movff eeprom_header_address+1, eeprom_address+1 ; Write target
+ call I2CWRITE ; Write the byte
+
+ movff divemins+0,eeprom_address+0
+ movff divemins+1,eeprom_address+1 ; Set to source again
+ movlw 0xFF
+ call I2CWRITE ; Delete the source....
+
+ movlw d'1'
+ addwf divemins+0,F ; Increase source (Divemins:2)
+ movlw d'0'
+ addwfc divemins+1,F
+ btfsc divemins+1,7 ; at 0x8000?
+ clrf divemins+0 ; Yes, clear address (+0 first!)
+ btfsc divemins+1,7 ; at 0x8000?
+ clrf divemins+1 ; Yes, clear address
+
+ movlw d'1' ; Increase target (eeprom_header_address:2)
+ addwf eeprom_header_address+0,F
+ movlw d'0'
+ addwfc eeprom_header_address+1,F ; eeprom_header_address:2 + 1
+ btfsc eeprom_header_address+1,7 ; at 7FFF?
+ clrf eeprom_header_address+0 ; Yes, clear address (+0 first!)
+ btfsc eeprom_header_address+1,7 ; at 7FFF?
+ clrf eeprom_header_address+1 ; Yes, clear address
+
+ movff divemins+0,sub_a+0
+ movff divemins+1,sub_a+1
+ movff profile_temp+0,sub_b+0
+ movff profile_temp+1,sub_b+1
+ call sub16 ; sub_c = sub_a - sub_b
+ tstfsz sub_c+0 ; Done (Result=Zero?) ?
+ bra profileview_menu_delete_loop3 ; No, continue
+ tstfsz sub_c+1 ; Done (Result=Zero?) ?
+ bra profileview_menu_delete_loop3 ; No, continue
+
+ goto menu_logbook ; Return to list when done deleting
+
+
+
\ No newline at end of file
diff -r 000000000000 -r 96a35aeda5f2 code_part1/OSTC_code_asm_part1/menu_ppO2.asm
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/code_part1/OSTC_code_asm_part1/menu_ppO2.asm Tue Jan 12 15:05:59 2010 +0100
@@ -0,0 +1,285 @@
+
+; OSTC - diving computer code
+; Copyright (C) 2008 HeinrichsWeikamp GbR
+
+; 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 3 of the License, or
+; (at your option) any later version.
+
+; This program is distributed in the hope that it will be useful,
+; but WITHOUT ANY WARRANTY; without even the implied warranty of
+; 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, see .
+
+
+; Constant ppO2 Setup menu
+; written by: Matthias Heinrichs, info@heinrichsweikamp.com
+; written: 08/04/04
+; last updated: 080904
+; known bugs:
+; ToDo:
+
+menu_const_ppO2:
+ movlw d'1'
+ movwf menupos
+
+ bcf menubit4
+ bcf cursor
+ bcf sleepmode
+ clrf decodata+0 ; Here: # of SP
+ bcf first_FA ; Here: =1: -, =0: +
+ bcf second_FA ; Here: =1: 1, =0: 10 steps
+
+menu_const_ppO20:
+ call PLED_ClearScreen
+ call PLED_topline_box
+
+ WIN_INVERT .1 ; Init new Wordprocessor
+ DISPLAYTEXT .111 ; Constant ppO2 Setup
+ WIN_INVERT .0 ; Init new Wordprocessor
+
+
+menu_const_ppO21:
+ clrf timeout_counter2
+ bcf menubit2
+ bcf menubit3
+
+ WIN_LEFT .20
+ WIN_TOP .35
+ lfsr FSR2,letter
+ OUTPUTTEXT .112 ; SP#
+ movff decodata+0,lo
+ incf lo,F
+ bsf leftbind
+ output_99
+ movlw ' '
+ movwf POSTINC2
+ movlw '('
+ movwf POSTINC2
+
+ OUTPUTTEXT d'192' ; Dil.
+ movlw ' '
+ movwf POSTINC2
+
+ read_int_eeprom d'33' ; Read byte (stored in EEDATA)
+ movff EEDATA,active_gas ; Read start gas (1-5)
+
+ decf active_gas,W ; Gas 0-4
+ mullw d'4'
+ movf PRODL,W
+ addlw d'6' ; = address for O2 ratio
+ movwf EEADR
+ call read_eeprom ; Read O2 ratio
+ movff EEDATA, lo ; O2 ratio
+
+
+ bsf leftbind
+ output_99
+
+ movlw '/'
+ movwf POSTINC2
+
+ decf active_gas,W ; Gas 0-4
+ mullw d'4'
+ movf PRODL,W
+ addlw d'7' ; = address for He ratio
+ movwf EEADR
+ call read_eeprom ; Read He ratio
+ movff EEDATA,lo ; And copy into hold register
+
+ bsf leftbind
+ output_99
+ movlw ')'
+ movwf POSTINC2
+ call word_processor
+
+
+ WIN_LEFT .20
+ WIN_TOP .65
+
+ lfsr FSR2,letter
+ OUTPUTTEXT .97 ; "Current: "
+ movf decodata+0,W
+ addlw d'36' ; offset in eeprom
+ movwf EEADR
+ call read_eeprom ; ppO2 value
+ movff EEDATA,lo
+ clrf hi
+ bsf leftbind
+ output_16dp d'3'
+ bcf leftbind
+ movlw 'B'
+ movwf POSTINC2
+ movlw 'a'
+ movwf POSTINC2
+ movlw 'r'
+ movwf POSTINC2
+ movlw ' '
+ movwf POSTINC2
+ call word_processor
+
+ WIN_LEFT .20
+ WIN_TOP .95
+
+ lfsr FSR2,letter
+ OUTPUTTEXT d'190' ; ppO2 +
+ call word_processor
+
+ WIN_LEFT .20
+ WIN_TOP .125
+
+ lfsr FSR2,letter
+ OUTPUTTEXT d'191' ; ppO2 -
+ call word_processor
+
+ WIN_LEFT .20
+ WIN_TOP .155
+
+ lfsr FSR2,letter
+ OUTPUTTEXT .89 ; "Default: "
+ movlw '1'
+ movwf POSTINC2
+ movlw '.'
+ movwf POSTINC2
+ movlw '0'
+ movwf POSTINC2
+ movlw '0'
+ movwf POSTINC2
+ call word_processor
+
+ DISPLAYTEXT .11 ; Exit
+ call wait_switches ; Waits until switches are released, resets flag if button stays pressed!
+ call PLED_menu_cursor
+
+menu_const_ppO2_loop:
+ call check_switches_logbook
+
+ btfsc menubit3
+ bra menu_const_ppO22 ; move cursor
+
+ btfsc menubit2
+ bra do_menu_const_ppO2 ; call submenu
+
+ btfsc divemode
+ goto restart ; dive started!
+
+ btfsc onesecupdate
+ call timeout_surfmode
+
+ btfsc onesecupdate
+ call set_dive_modes
+
+ bcf onesecupdate ; 1 sec. functions done
+
+ btfsc sleepmode
+ bra exit_menu_const_ppO2
+
+ bra menu_const_ppO2_loop
+
+menu_const_ppO22:
+ incf menupos,F
+
+ movlw d'2'
+ cpfseq menupos ; =2?
+ bra menu_const_ppO22a ; No
+ incf menupos,F ; Skip pos. 2
+
+menu_const_ppO22a:
+ movlw d'7'
+ cpfseq menupos ; =7?
+ bra menu_const_ppO23 ; No
+ movlw d'1'
+ movwf menupos
+
+menu_const_ppO23:
+ clrf timeout_counter2
+ call PLED_menu_cursor
+
+ ; debounce switches
+ call wait_switches ; Waits until switches are released, resets flag if button stays pressed!
+ bcf menubit3 ; clear flag
+ bra menu_const_ppO2_loop
+
+do_menu_const_ppO2:
+ dcfsnz menupos,F
+ bra next_ppO2
+ dcfsnz menupos,F
+ bra change_ppo2_plus
+ dcfsnz menupos,F
+ bra change_ppo2_plus
+ dcfsnz menupos,F
+ bra change_ppo2_minus
+ dcfsnz menupos,F
+ bra change_ppo2_reset
+exit_menu_const_ppO2: ; exit...
+ movlw d'2'
+ movwf menupos
+ goto more_menu2
+
+change_ppo2_plus:
+ movf decodata+0,W ; read current value
+ addlw d'36' ; offset in memory
+ movwf EEADR
+ call read_eeprom ; Low-value
+ movff EEDATA,lo
+
+ incf lo,F ; increase depth
+ movlw d'251'
+ cpfseq lo
+ bra change_ppo2_plus2
+ movlw d'250'
+ movwf lo
+change_ppo2_plus2:
+ movff lo,EEDATA ; write result
+ call write_eeprom ; save result in EEPROM
+ movlw d'3'
+ movwf menupos
+ bra menu_const_ppO21
+
+change_ppo2_minus:
+ movf decodata+0,W ; read current value
+ addlw d'36' ; offset in memory
+ movwf EEADR
+ call read_eeprom ; Low-value
+ movff EEDATA,lo
+
+ decf lo,F ; decrease depth
+ movlw d'255'
+ cpfseq lo
+ bra change_ppo2_minus2
+ movlw d'0'
+ movwf lo
+
+change_ppo2_minus2:
+ movff lo,EEDATA ; write result
+ call write_eeprom ; save result in EEPROM
+
+ movlw d'4'
+ movwf menupos
+ bra menu_const_ppO21
+
+change_ppo2_reset: ; reset to 1.00Bar
+ movf decodata+0,W ; read current value
+ addlw d'36' ; offset in memory
+ movwf EEADR
+ movlw d'100'
+ movwf EEDATA
+ call write_eeprom ; save result in EEPROM
+ movlw d'5'
+ movwf menupos
+ bra menu_const_ppO21
+
+next_ppO2:
+ incf decodata+0,F
+ movlw d'3'
+ cpfseq decodata+0 ; =3?
+ bra next_ppO22
+ clrf decodata+0 ; yes, so reset to zero
+next_ppO22:
+ movlw d'1'
+ movwf menupos
+ bra menu_const_ppO21
\ No newline at end of file
diff -r 000000000000 -r 96a35aeda5f2 code_part1/OSTC_code_asm_part1/menu_reset.asm
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/code_part1/OSTC_code_asm_part1/menu_reset.asm Tue Jan 12 15:05:59 2010 +0100
@@ -0,0 +1,519 @@
+
+; OSTC - diving computer code
+; Copyright (C) 2008 HeinrichsWeikamp GbR
+
+; 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 3 of the License, or
+; (at your option) any later version.
+
+; This program is distributed in the hope that it will be useful,
+; but WITHOUT ANY WARRANTY; without even the implied warranty of
+; 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, see .
+
+
+; Menu "Reset all"
+; written by: Matthias Heinrichs, info@heinrichsweikamp.com
+; written: 10/30/05
+; last updated: 08/08/31
+; known bugs:
+; ToDo:
+
+; routines to reset external EEPROM (currently inactvated!)
+; routines to reset custom function, gases and decompression values
+; does not reset clock
+
+menu_reset:
+ movlw d'1'
+ movwf menupos
+
+ call PLED_ClearScreen
+ call PLED_reset_menu_mask
+
+menu_reset2:
+ clrf timeout_counter2
+ bcf sleepmode
+ bcf menubit2
+ bcf menubit3
+ bsf menubit
+ bsf cursor
+ call PLED_reset_menu_mask
+ call PLED_menu_cursor
+ bcf switch_left
+ bcf switch_right
+menu_reset_loop:
+ call check_switches_menu
+ btfsc menubit2
+ bra do_menu_reset ; call submenu
+ btfss menubit
+ bra menu ; exit setup menu and return to main menu
+ btfsc onesecupdate
+ call timeout_surfmode
+ btfsc onesecupdate
+ call set_dive_modes
+ btfsc onesecupdate
+ call test_charger ; check if charger IC is active
+ btfsc onesecupdate
+ call get_battery_voltage ; get battery voltage
+ bcf onesecupdate ; End of one second tasks
+ btfsc sleepmode
+ goto menu
+ btfsc divemode
+ goto restart ; exit menu, restart and enter divemode
+ bra menu_reset_loop
+do_menu_reset: ; calls submenu
+ dcfsnz menupos,F
+ bra do_menu_reset_exit ; Cancel, exit
+ dcfsnz menupos,F
+ bra do_menu_reset_all ; Reset all settings
+ dcfsnz menupos,F
+ bra do_menu_reset_logbook ; Reset Logbook Memory!
+ dcfsnz menupos,F
+ bra do_menu_reset_reboot ; Reboot OSTC
+ dcfsnz menupos,F
+ bra do_menu_reset_decodata ; Reset Decodata
+do_menu_reset_exit:
+ movlw d'3'
+ movwf menupos
+ bra menu2 ; exit...
+
+
+do_menu_reset_reboot:
+ call PLED_confirmbox ; Returns WREG=0 for Cancel (Or Timeout) and WREG=1 for OK!
+ movwf menupos ; Used as temp
+ tstfsz menupos
+ bra do_menu_reset_reboot2 ; Delete now!
+ bra do_menu_reset_exit ; Cancel!
+
+do_menu_reset_reboot2:
+ call PLED_DisplayOff ; Power-down OLED
+ movlw b'00000000' ; Bit6: PPL Disable
+ movwf OSCTUNE
+ movlw b'01111110' ; 8MHz
+ movwf OSCCON
+ reset
+ goto 0x00000 ; restart to 0x00000
+
+do_menu_reset_logbook:
+ call PLED_confirmbox ; Returns WREG=0 for Cancel (Or Timeout) and WREG=1 for OK!
+ movwf menupos ; Used as temp
+ tstfsz menupos
+ bra do_menu_reset_logbook2 ; Delete Logbook now!
+ bra do_menu_reset_exit ; Cancel!
+
+do_menu_reset_logbook2:
+ call PLED_ClearScreen
+ DISPLAYTEXT .25 ; "Reset..."
+ call reset_external_eeprom ; delete profile memory
+ bra do_menu_reset_exit
+
+do_menu_reset_decodata:
+ call PLED_confirmbox ; Returns WREG=0 for Cancel (Or Timeout) and WREG=1 for OK!
+ movwf menupos ; Used as temp
+ tstfsz menupos
+ bra do_menu_reset_decodata2 ; Reset Deco Data now!
+ bra do_menu_reset_exit ; Cancel!
+
+do_menu_reset_decodata2:
+; reset deco data
+ call PLED_ClearScreen
+ DISPLAYTEXT .25 ; "Reset..."
+ movff amb_pressure+0,int_I_pres_respiration+0 ; copy surface air pressure to deco routine
+ movff amb_pressure+1,int_I_pres_respiration+1
+ call deco_main_clear_tissue ;
+ movlb b'00000001' ; RAM Bank1 selected
+ goto restart ; done. quit to surfmode
+
+do_menu_reset_all:
+ call PLED_confirmbox ; Returns WREG=0 for Cancel (Or Timeout) and WREG=1 for OK!
+ movwf menupos ; Used as temp
+ tstfsz menupos
+ bra do_menu_reset_all2 ; Reset all now!
+ bra do_menu_reset_exit ; Cancel!
+
+do_menu_reset_all2:
+ call PLED_ClearScreen
+ DISPLAYTEXT .25 ; "Reset..."
+
+reset_start:
+; reset deco data
+ movff amb_pressure+0,int_I_pres_respiration+0 ; copy surface air pressure to deco routine
+ movff amb_pressure+1,int_I_pres_respiration+1
+ call deco_main_clear_tissue ;
+ movlb b'00000001' ; RAM Bank1 selected
+
+; reset gases
+ clrf EEADRH ; EEPROM BANK 0 !
+
+ movlw d'3' ; address of first gas-1
+ movwf EEADR
+ clrf hi ; He part (default for all gases: 0%)
+ movlw d'21' ; O2 part (21%)
+ rcall reset_customfunction ; saves default and current value for gas #1
+ movlw d'21' ; O2 part (21%)
+ rcall reset_customfunction ; saves default and current value for gas #2
+ movlw d'21' ; O2 part (21%)
+ rcall reset_customfunction ; saves default and current value for gas #3
+ movlw d'21' ; O2 part (21%)
+ rcall reset_customfunction ; saves default and current value for gas #4
+ movlw d'21' ; O2 part (21%)
+ rcall reset_customfunction ; saves default and current value for gas #5
+ movlw d'21' ; O2 part (21%)
+ rcall reset_customfunction ; saves default and current value for gas #6
+
+reset_all_cf:
+; resets all customfunctions to the following default values
+ movlw d'1'
+ movwf EEDATA
+ write_int_eeprom d'33' ; reset start gas
+ clrf EEDATA
+ write_int_eeprom d'34' ; reset deco model to ZH-L16
+ clrf EEDATA
+ write_int_eeprom d'35' ; Do not use O2 Sensor in CC Modes
+
+ movlw d'0'
+ clrf EEDATA
+ write_int_eeprom d'39' ; Disable Debugbode
+ clrf EEDATA
+ write_int_eeprom d'90' ; Disable Brightness offset? (Dim=1, Normal = 0)
+ clrf EEDATA
+ write_int_eeprom d'91' ; Reset Date format to MM/DD/YY
+
+ movlw d'100'
+ write_int_eeprom d'26' ; Salinity default: 1.00 kg/l
+
+ movlw b'00011111'
+ movwf EEDATA
+ write_int_eeprom d'27' ; reset active gas flags
+
+ clrf EEDATA
+ write_int_eeprom d'28' ; reset change depth gas #1
+ clrf EEDATA
+ write_int_eeprom d'29' ; reset change depth gas #2
+ clrf EEDATA
+ write_int_eeprom d'30' ; reset change depth gas #3
+ clrf EEDATA
+ write_int_eeprom d'31' ; reset change depth gas #4
+ clrf EEDATA
+ write_int_eeprom d'32' ; reset change depth gas #5
+
+ movlw d'100'
+ movwf EEDATA
+ write_int_eeprom d'36' ; reset mix1 to ppO2=1.00Bar
+ write_int_eeprom d'37' ; reset mix2 to ppO2=1.00Bar
+ write_int_eeprom d'38' ; reset mix3 to ppO2=1.00Bar
+
+ movlw d'1'
+ movwf nofly_time+0 ; Clear nofly time
+ clrf nofly_time+1 ; Clear nofly time
+
+#DEFINE dive_threshold d'100' ; 8BIT 100cm
+#DEFINE surf_threshold d'30' ; 8BIT 30cm
+#DEFINE diveloop_timeout d'240' ; 8BIT 240s
+#DEFINE surfloop_timeout d'120' ; 8BIT 120s
+#DEFINE premenu_timeout d'5' ; 8BIT 5s
+
+#DEFINE minimum_velocity d'7' ; 8BIT 7min/min
+#DEFINE pressure_offset_divemode d'1160' ; 15BIT 1160mBar
+#DEFINE max_surfpressure d'1100' ; 15BIT 1100mBar
+#DEFINE min_gradient_factor d'20' ; 8Bit 20%
+#DEFINE oxygen_threshold d'20' ; 8Bit 20%
+
+#DEFINE dive_menu_timeout d'30' ; 8BIT 30s
+#DEFINE saturation_multiplier d'110' ; 8BIT x1.1
+#DEFINE desaturation_multiplier d'90' ; 8BIT x0.9
+#DEFINE nofly_time_ratio d'60' ; 8BIT 60%
+#DEFINE gradient_factor_alarm1 d'100' ; 8Bit 100%
+
+#DEFINE gradient_factor_alarm2 d'120' ; 8Bit 120%
+#DEFINE deco_distance_for_sim d'10' ; 8Bit 1m
+#DEFINE ppo2_warning_low d'019' ; 8Bit 0.19 Bar
+#DEFINE ppo2_warning_high d'160' ; 8Bit 1.60 Bar
+#DEFINE ppo2_display_high d'150' ; 8Bit 1.50 Bar
+
+#DEFINE sampling_rate d'10' ; 8Bit 10s
+#DEFINE sampling_divisor_temp d'6' ; 8Bit /6
+#DEFINE sampling_divisor_deco d'6' ; 8Bit /6
+#DEFINE sampling_divisor_tank d'0' ; 8Bit never
+#DEFINE sampling_divisor_ppo2 d'0' ; 8Bit never
+
+#DEFINE sampling_divisor_deco2 d'12' ; 8Bit /12
+#DEFINE sampling_divisor_nyu2 d'0' ; 8Bit never
+#DEFINE cns_display_high d'20' ; 8Bit 20%
+#DEFINE logbook_offset d'0' ; 15Bit No Offset, but 15Bit value
+#DEFINE last_deco_depth d'3' ; 8Bit 3m
+#DEFINE timeout_apnoe_mode d'10' ; 8Bit 10min
+#DEFINE show_voltage_value d'0' ; 1Bit =1 Show value instead of symbol, =0 Show Symbol
+
+#DEFINE GF_low_default d'30' ; 8Bit 30%
+#DEFINE GF_high_default d'90' ; 8Bit 90%
+#DEFINE color_battery_surface d'223' ; 8Bit Color Battery sign Surfacemode
+#DEFINE SP_high_HUD_default d'140' ; 8Bit 1.40Bar
+#DEFINE SP_nom_HUD_default d'120' ; 8Bit 1.20Bar
+#DEFINE HUD_style d'0' ; 8Bit OSTC Style
+
+#DEFINE show_seconds_divemode d'0' ; 1Bit =1 Show the seconds in Divemode
+#DEFINE flip_display_default d'0' ; 1Bit =1 Flip Display
+#DEFINE use_ppo2_screen_default d'0' ; 1Bit =1 Use alternative outputs for ppO2 sensor
+#DEFINE replace_temp_with_avr_depth d'0' ; 1Bit =1 Show (resetable) average Depth instead of temperature
+
+ movlw d'127' ; address of low byte of first custom function
+ movwf EEADR
+ clrf hi ; only required once
+ movlw LOW dive_threshold ; 8Bit value
+ rcall reset_customfunction ; saves default and current value
+
+ movlw LOW surf_threshold
+ rcall reset_customfunction ; saves default and current value
+
+ movlw LOW diveloop_timeout
+ rcall reset_customfunction ; saves default and current value
+
+ movlw LOW surfloop_timeout
+ rcall reset_customfunction ; saves default and current value
+
+ movlw LOW premenu_timeout
+ rcall reset_customfunction ; saves default and current value
+
+ movlw LOW minimum_velocity
+ rcall reset_customfunction ; saves default and current value
+
+ movlw HIGH pressure_offset_divemode
+ movwf hi
+ bsf hi,7 ; 15Bit value
+ movlw LOW pressure_offset_divemode
+ rcall reset_customfunction ; saves default and current value
+
+ movlw HIGH max_surfpressure
+ movwf hi
+ bsf hi,7 ; 15Bit value
+ movlw LOW max_surfpressure
+ rcall reset_customfunction ; saves default and current value
+
+ movlw LOW min_gradient_factor
+ rcall reset_customfunction ; saves default and current value
+
+ movlw LOW oxygen_threshold
+ rcall reset_customfunction ; saves default and current value
+
+ movlw LOW dive_menu_timeout
+ rcall reset_customfunction ; saves default and current value
+
+ movlw LOW saturation_multiplier
+ rcall reset_customfunction ; saves default and current value
+
+ movlw LOW desaturation_multiplier
+ rcall reset_customfunction ; saves default and current value
+
+ movlw LOW nofly_time_ratio
+ rcall reset_customfunction ; saves default and current value
+
+ movlw LOW gradient_factor_alarm1
+ rcall reset_customfunction ; saves default and current value
+
+ movlw LOW gradient_factor_alarm2
+ rcall reset_customfunction ; saves default and current value
+
+ movlw LOW deco_distance_for_sim
+ rcall reset_customfunction ; saves default and current value
+
+ movlw LOW ppo2_warning_low
+ rcall reset_customfunction ; saves default and current value
+
+ movlw LOW ppo2_warning_high
+ rcall reset_customfunction ; saves default and current value
+
+ movlw LOW ppo2_display_high
+ rcall reset_customfunction ; saves default and current value
+
+ movlw LOW sampling_rate
+ rcall reset_customfunction ; saves default and current value
+
+ movlw LOW sampling_divisor_temp
+ rcall reset_customfunction ; saves default and current value
+
+ movlw LOW sampling_divisor_deco
+ rcall reset_customfunction ; saves default and current value
+
+ movlw LOW sampling_divisor_tank
+ rcall reset_customfunction ; saves default and current value
+
+ movlw LOW sampling_divisor_ppo2
+ rcall reset_customfunction ; saves default and current value
+
+ movlw LOW sampling_divisor_deco2
+ rcall reset_customfunction ; saves default and current value
+
+ movlw LOW sampling_divisor_nyu2
+ rcall reset_customfunction ; saves default and current value
+
+ movlw LOW cns_display_high
+ rcall reset_customfunction ; saves default and current value
+
+ clrf hi
+ bsf hi,7 ; 15Bit value
+ movlw LOW logbook_offset
+ rcall reset_customfunction ; saves default and current value
+
+ movlw LOW last_deco_depth
+ rcall reset_customfunction ; saves default and current value
+
+ movlw LOW timeout_apnoe_mode
+ rcall reset_customfunction ; saves default and current value
+
+ movlw LOW show_voltage_value
+ rcall reset_customfunction ; saves default and current value
+
+reset_all_cf_bank1:
+ movlw d'1'
+ movwf EEADRH ; EEPROM BANK 1 !!
+ movlw d'127' ; address of low byte of first custom function
+ movwf EEADR
+ clrf hi ; only required once/bank
+
+ movlw LOW GF_low_default
+ rcall reset_customfunction ; saves default and current value
+
+ movlw LOW GF_high_default
+ rcall reset_customfunction ; saves default and current value
+
+ movlw color_battery_surface
+ rcall reset_customfunction ; saves default and current value
+
+ movlw SP_high_HUD_default
+ rcall reset_customfunction ; saves default and current value
+
+ movlw SP_nom_HUD_default
+ rcall reset_customfunction ; saves default and current value
+
+ movlw HUD_style
+ rcall reset_customfunction ; saves default and current value
+
+ movlw show_seconds_divemode
+ rcall reset_customfunction ; saves default and current value
+
+ movlw flip_display_default
+ rcall reset_customfunction ; saves default and current value
+
+ movlw use_ppo2_screen_default
+ rcall reset_customfunction ; saves default and current value
+
+ movlw replace_temp_with_avr_depth
+ rcall reset_customfunction ; saves default and current value
+
+ movlw d'0'
+ rcall reset_customfunction ; saves default and current value
+ movlw d'0'
+ rcall reset_customfunction ; saves default and current value
+ movlw d'0'
+ rcall reset_customfunction ; saves default and current value
+ movlw d'0'
+ rcall reset_customfunction ; saves default and current value
+ movlw d'0'
+ rcall reset_customfunction ; saves default and current value
+ movlw d'0'
+ rcall reset_customfunction ; saves default and current value
+ movlw d'0'
+ rcall reset_customfunction ; saves default and current value
+ movlw d'0'
+ rcall reset_customfunction ; saves default and current value
+ movlw d'0'
+ rcall reset_customfunction ; saves default and current value
+ movlw d'0'
+ rcall reset_customfunction ; saves default and current value
+ movlw d'0'
+ rcall reset_customfunction ; saves default and current value
+ movlw d'0'
+ rcall reset_customfunction ; saves default and current value
+ movlw d'0'
+ rcall reset_customfunction ; saves default and current value
+ movlw d'0'
+ rcall reset_customfunction ; saves default and current value
+ movlw d'0'
+ rcall reset_customfunction ; saves default and current value
+ movlw d'0'
+ rcall reset_customfunction ; saves default and current value
+ movlw d'0'
+ rcall reset_customfunction ; saves default and current value
+ movlw d'0'
+ rcall reset_customfunction ; saves default and current value
+ movlw d'0'
+ rcall reset_customfunction ; saves default and current value
+ movlw d'0'
+ rcall reset_customfunction ; saves default and current value
+ movlw d'0'
+ rcall reset_customfunction ; saves default and current value
+ movlw d'0'
+ rcall reset_customfunction ; saves default and current value
+
+ clrf EEADRH ; EEPROM BANK 0 !
+
+
+;call reset_external_eeprom ; delete profile memory
+ goto restart ; all reset, quit to surfmode
+
+reset_customfunction:
+ movwf lo
+ incf EEADR,F
+ movff lo, EEDATA ; Lowbyte Defaul value
+ call write_eeprom
+ incf EEADR,F
+ movff hi, EEDATA ; Highbyte default value
+ call write_eeprom
+ incf EEADR,F
+ movff lo, EEDATA ; Lowbyte current value
+ call write_eeprom
+ incf EEADR,F
+ bcf hi,7 ; This bit will only be written for the default value
+ movff hi, EEDATA ; Highbyte current value
+ call write_eeprom
+ clrf hi
+ return
+
+
+reset_external_eeprom: ; deletes complete external eeprom!
+ clrf eeprom_address+0
+ clrf eeprom_address+1
+
+ movlw d'2'
+ movwf temp3
+reset_eeprom02:
+ clrf temp4
+reset_eeprom01:
+ movlw d'64'
+ movwf temp2
+ bcf eeprom_blockwrite ; Blockwrite start
+reset_eeprom1:
+ setf ext_ee_temp1 ; byte for Blockwrite....
+ movf ext_ee_temp1,W ; So, 1st. Byte of block is fine, too
+ call write_external_eeprom_block
+ decfsz temp2,F ; 64 Byte done
+ bra reset_eeprom1
+ bsf SSPCON2,PEN ; Stop condition
+ call WaitMSSP
+ WAITMS d'7'
+ decfsz temp4,F
+ bra reset_eeprom01 ; do this 256 times
+ decfsz temp3,F
+ bra reset_eeprom02 ; and this all 2 times -> 512 *64Bytes = 32KB
+
+ bcf eeprom_blockwrite ; clear blockwrite flag
+
+ clrf eeprom_address+0
+ clrf eeprom_address+1
+
+ movlw 0xFD ; With these three bytes the OSTC will find the free area in the EEPROM faster
+ call write_external_eeprom
+ movlw 0xFD
+ call write_external_eeprom
+ movlw 0xFE
+ call write_external_eeprom
+
+ clrf eeprom_address+0
+ clrf eeprom_address+1
+ return
+
diff -r 000000000000 -r 96a35aeda5f2 code_part1/OSTC_code_asm_part1/menu_settime.asm
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/code_part1/OSTC_code_asm_part1/menu_settime.asm Tue Jan 12 15:05:59 2010 +0100
@@ -0,0 +1,290 @@
+
+; OSTC - diving computer code
+; Copyright (C) 2008 HeinrichsWeikamp GbR
+
+; 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 3 of the License, or
+; (at your option) any later version.
+
+; This program is distributed in the hope that it will be useful,
+; but WITHOUT ANY WARRANTY; without even the implied warranty of
+; 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, see .
+
+
+; menu "Set Time"
+; written by: Matthias Heinrichs, info@heinrichsweikamp.com
+; written: 5/19/06
+; last updated: 080904
+; known bugs:
+; ToDo:
+
+
+menu_settime:
+ call PLED_ClearScreen
+
+ bcf set_minutes
+ bcf menubit4
+ bcf cursor
+ clrf timeout_counter2
+ bcf menubit2
+ bcf menubit3
+ bcf sleepmode
+ bcf set_year
+ bcf set_day
+ bcf set_month
+ clrf menupos2
+
+ call PLED_topline_box
+ WIN_INVERT .1 ; Init new Wordprocessor
+ DISPLAYTEXT .29 ; Set Time
+ WIN_INVERT .0 ; Init new Wordprocessor
+ DISPLAYTEXT .22 ; Time:
+ DISPLAYTEXT .23 ; Date:
+
+ call set_time_refresh
+
+ DISPLAYTEXT .24 ; Set Hours
+
+ bcf switch_left
+ bcf switch_right
+
+settime_loop:
+ btfsc switch_left
+ call add_hours_or_minutes_or_date
+
+ btfsc switch_right
+ call set_time_next_or_exit
+
+ btfsc menubit4
+ bra set_time_done
+
+ btfsc onesecupdate
+ call timeout_surfmode
+
+ btfsc onesecupdate
+ call set_dive_modes
+
+ bcf onesecupdate
+
+ btfsc sleepmode
+ bra exit_settime
+
+ btfsc divemode
+ goto restart
+
+ bra settime_loop
+
+set_time_refresh:
+ WIN_LEFT .70
+ WIN_TOP .65
+ lfsr FSR2,letter
+ movff hours,lo
+ output_99x
+ movlw ':'
+ movwf POSTINC2
+ movff mins,lo
+ output_99x
+ movlw ' '
+ movwf POSTINC2
+ movlw ' '
+ movwf POSTINC2
+ call word_processor
+
+set_date_refresh:
+ WIN_LEFT .70
+ WIN_TOP .95
+ lfsr FSR2,letter
+ movff month,convert_value_temp+0
+ movff day,convert_value_temp+1
+ movff year,convert_value_temp+2
+ call PLED_convert_date ; converts into "DD/MM/YY" or "MM/DD/YY" or "YY/MM/DD" in postinc2
+ movlw ' '
+ movwf POSTINC2
+ movlw ' '
+ movwf POSTINC2
+ call word_processor
+ return
+
+
+set_time_done: ; Check date
+ movff month,lo ; new month
+ dcfsnz lo,F
+ movlw .31
+ dcfsnz lo,F
+ movlw .28
+ dcfsnz lo,F
+ movlw .31
+ dcfsnz lo,F
+ movlw .30
+ dcfsnz lo,F
+ movlw .31
+ dcfsnz lo,F
+ movlw .30
+ dcfsnz lo,F
+ movlw .31
+ dcfsnz lo,F
+ movlw .31
+ dcfsnz lo,F
+ movlw .30
+ dcfsnz lo,F
+ movlw .31
+ dcfsnz lo,F
+ movlw .30
+ dcfsnz lo,F
+ movlw .31
+ cpfsgt day ; day ok?
+ bra set_time_done2 ; OK
+ movlw .1 ; not OK, set to 1st
+ movwf day
+
+set_time_done2:
+ WIN_LEFT .32
+ WIN_TOP .155
+ movlw d'8'
+ movwf temp1
+ call PLED_display_clear_common_y1
+
+ movlw d'5'
+ movwf wait_temp
+ clrf secs
+ bcf onesecupdate
+
+set_time_done_loop
+ btfss onesecupdate
+ bra set_time_done_loop
+ bcf onesecupdate
+
+ call set_date_refresh
+
+ WIN_LEFT .70
+ WIN_TOP .65
+ lfsr FSR2,letter
+ movff hours,lo
+ output_99x
+ movlw ':'
+ movwf POSTINC2
+ movff mins,lo
+ output_99x
+ movlw ':'
+ movwf POSTINC2
+ movff secs,lo
+ output_99x
+ movlw ' '
+ movwf POSTINC2
+ call word_processor
+
+ decfsz wait_temp,F
+ bra set_time_done_loop
+exit_settime: ;Exit
+ movlw d'1'
+ movwf menupos
+ goto more_menu2
+
+
+set_time_next_or_exit:
+ btfsc set_year
+ bsf menubit4 ; quit settime
+ incf menupos2,F
+ movff menupos2,menupos3
+
+ dcfsnz menupos3,F
+ bsf set_minutes
+ dcfsnz menupos3,F
+ bsf set_month
+ dcfsnz menupos3,F
+ bsf set_day
+ dcfsnz menupos3,F
+ bsf set_year
+
+ WIN_LEFT .32
+ WIN_TOP .155
+ lfsr FSR2,letter
+ OUTPUTTEXT .94 ; Set
+
+ movff menupos2,menupos3
+ decfsz menupos3,F
+ bra set_time_next_or_exit2
+ OUTPUTTEXT .90 ; Minutes
+ bra set_time_next_or_exit5
+set_time_next_or_exit2:
+ decfsz menupos3,F
+ bra set_time_next_or_exit3
+ OUTPUTTEXT .91 ; Month
+ bra set_time_next_or_exit5
+set_time_next_or_exit3:
+ decfsz menupos3,F
+ bra set_time_next_or_exit4
+ OUTPUTTEXT .92 ; Day
+ bra set_time_next_or_exit5
+set_time_next_or_exit4:
+ OUTPUTTEXT .93 ; Year
+
+set_time_next_or_exit5:
+ call word_processor
+ call wait_switches ; Waits until switches are released, resets flag if button stays pressed!
+ return
+
+
+add_hours_or_minutes_or_date:
+ bcf switch_right
+ clrf secs
+
+ btfsc set_year
+ bra add_year
+
+ btfsc set_day
+ bra add_day
+
+ btfsc set_month
+ bra add_month
+
+ btfsc set_minutes
+ bra add_minutes
+; Also Stunden erhöhen
+add_hours:
+ incf hours,F
+ movlw d'23'
+ cpfsgt hours
+ bra set_time_refresh_x
+ clrf hours
+ bra set_time_refresh_x
+add_minutes:
+ incf mins,F
+ movlw d'59'
+ cpfsgt mins
+ bra set_time_refresh_x
+ clrf mins
+ bra set_time_refresh_x
+add_day:
+ incf day,F
+ movlw d'31'
+ cpfsgt day
+ bra set_time_refresh_x
+ movlw d'1'
+ movwf day
+ bra set_time_refresh_x
+add_month:
+ incf month,F
+ movlw d'12'
+ cpfsgt month
+ bra set_time_refresh_x
+ movlw d'1'
+ movwf month
+ bra set_time_refresh_x
+add_year:
+ incf year,F
+ movlw d'20' ; calendar until 2020
+ cpfsgt year
+ bra set_time_refresh_x
+ movlw d'8'
+ movwf year ; Set Year to 2008
+
+set_time_refresh_x:
+ call set_time_refresh
+ call wait_switches ; Waits until switches are released, resets flag if button stays pressed!
+ return
diff -r 000000000000 -r 96a35aeda5f2 code_part1/OSTC_code_asm_part1/ms5535.asm
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/code_part1/OSTC_code_asm_part1/ms5535.asm Tue Jan 12 15:05:59 2010 +0100
@@ -0,0 +1,603 @@
+; OSTC - diving computer code
+; Copyright (C) 2008 HeinrichsWeikamp GbR
+
+; 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 3 of the License, or
+; (at your option) any later version.
+
+; This program is distributed in the hope that it will be useful,
+; but WITHOUT ANY WARRANTY; without even the implied warranty of
+; 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, see .
+
+
+; routines for Intersema MS5535A, MS5541B and MS5541C
+; written by: Matthias Heinrichs, info@heinrichsweikamp.com
+; written: 9/26/05
+; last updated: 08/08/31
+; known bugs:
+; ToDo:
+
+; with second order temperature compensation
+
+calculate_compensation:
+; calculate xdT
+ clrf isr_xA+1
+ movlw d'8'
+ movwf isr_xA+0
+ movff C5+0,isr_xB+0
+ movff C5+1,isr_xB+1
+ call isr_mult16x16 ;isr_xA*isr_xB=isr_xC
+ movlw LOW d'10000'
+ addwf isr_xC+0, f
+ movlw HIGH d'10000'
+ addwfc isr_xC+1, f ;isr_xC= 8*C5 + 10000
+ movff D2+0,isr_sub_a+0
+ movff D2+1,isr_sub_a+1
+ movff isr_xC+0,isr_sub_b+0
+ movff isr_xC+1,isr_sub_b+1
+ call isr_sub16 ; isr_sub_c = isr_sub_a - isr_sub_b
+ movff isr_sub_c+0,xdT+0
+ movff isr_sub_c+1,xdT+1
+
+; Second order temperature calculation
+ btfsc neg_flag_isr
+ bra dTzero_yes
+; dT>0
+ bcf neg_flag_xdT
+ movff xdT+0,isr_xA+0
+ movff xdT+1,isr_xA+1
+ movff xdT+0,isr_xB+0
+ movff xdT+1,isr_xB+1
+ call isr_mult16x16 ;isr_xA*isr_xB=isr_xC
+ movlw d'17' ; 2^17=(128*128)*8
+ movwf isr_divB
+ call isr_div32 ; isr_xC=isr_xC(32Bit)/2^isr_divB (isr_divB: 8Bit only!)
+ movff xdT+0,isr_sub_a+0
+ movff xdT+1,isr_sub_a+1
+ movff isr_xC+0,isr_sub_b+0
+ movff isr_xC+1,isr_sub_b+1
+ call isr_sub16 ; isr_sub_c = isr_sub_a - isr_sub_b
+ movff isr_sub_c+0,xdT2+0
+ movff isr_sub_c+1,xdT2+1
+ bra OFF_calc ; Done
+
+dTzero_yes:
+; dT<0
+ bsf neg_flag_xdT
+ movff xdT+0,isr_xA+0
+ movff xdT+1,isr_xA+1
+ movff xdT+0,isr_xB+0
+ movff xdT+1,isr_xB+1
+ call isr_mult16x16 ;isr_xA*isr_xB=isr_xC
+ movlw d'15' ; 2^15=(128*128)*2
+ movwf isr_divB
+ call isr_div32 ; isr_xC=isr_xC(32Bit)/2^isr_divB (isr_divB: 8Bit only!)
+
+ movf xdT+0,W
+ addwf isr_xC+0,F
+ movf xdT+1,W
+ addwfc isr_xC+1,F
+ movff isr_xC+0,xdT2+0
+ movff isr_xC+1,xdT2+1
+
+OFF_calc:
+; calculate OFF
+ movff C4+0,isr_sub_a
+ movff C4+1,isr_sub_a+1
+ movlw d'250'
+ movwf isr_sub_b
+ clrf isr_sub_b+1
+ call isr_sub16 ; (C4-250) - Sets neg_flag_isr!
+ movff isr_sub_c,isr_xA
+ movff isr_sub_c+1,isr_xA+1
+ movff xdT+0,isr_xB
+ movff xdT+0+1,isr_xB+1
+ call isr_mult16x16 ; (C4-250)*dT
+ movff isr_xC+0,isr_divA
+ movff isr_xC+1,isr_divA+1
+ movlw d'12'
+ movwf isr_divB
+ call isr_div16 ; [(C4-250)*dT]/2^12
+ movff isr_divA+0,isr_xC+0
+ movff isr_divA+1,isr_xC+1 ; isr_xC= {[(C4-250)*dT]/2^12}
+ btfss neg_flag_isr ; neg_flag_isr=1?
+ bra OFF_calc2 ; Yes, do C2 - isr_xC
+ ; no, so do C2 + isr_xC
+ movf C2+0,W
+ addwf isr_xC+0, f
+ movf C2+1,W
+ addwfc isr_xC+1, f ; isr_xC= C2 + {[(C4-250)*dT/2^12]}
+OFF_calc3:
+ movlw LOW d'10000'
+ addwf isr_xC+0, f
+ movlw HIGH d'10000'
+ addwfc isr_xC+1, f ; isr_xC=[(C4-250)*dT/2^12] + 10000
+ movff isr_xC+0,OFF+0
+ movff isr_xC+1,OFF+1
+ bra calculate_SENS ; Done with OFF
+
+OFF_calc2:
+ movff C2+0,isr_sub_a+0
+ movff C2+1,isr_sub_a+1
+ movff isr_xC+0,isr_sub_b+0
+ movff isr_xC+1,isr_sub_b+1
+ call isr_sub16 ; isr_sub_c = isr_sub_a - isr_sub_b
+ ; isr_xC= C2 - {[(C4-250)*dT/2^12]}
+ movff isr_sub_c+0,isr_xC+0
+ movff isr_sub_c+1,isr_xC+1 ; Done with OFF
+ bra OFF_calc3
+
+calculate_SENS:
+ movff C3+0, C3_temp+0
+ movff C3+1, C3_temp+1
+ movlw d'200'
+ addwf C3_temp+0, f
+ movlw d'0'
+ addwfc C3_temp+1, f ; C3 no longer valid!
+ movff C3_temp+0, isr_xA
+ movff C3_temp+1, isr_xA+1
+ movff xdT+0, isr_xB
+ movff xdT+1, isr_xB+1
+ call isr_mult16x16
+ movff isr_xC+0,isr_divA
+ movff isr_xC+1,isr_divA+1
+ movlw d'13'
+ movwf isr_divB
+ call isr_div16
+ movff isr_divA,SENS+0
+ movff isr_divA+1,SENS+1
+ movff C1+0,isr_divA
+ movff C1+1,isr_divA+1
+ movlw d'1'
+ movwf isr_divB
+ call isr_div16
+ movf isr_divA,W
+ addwf SENS+0, f
+ movf isr_divA+1,W
+ addwfc SENS+1, f
+ movlw d'184'
+ addwf SENS+0, f
+ movlw d'11'
+ addwfc SENS+1, f
+
+; calculate amb_pressure
+ movff D1+0,isr_sub_a
+ movff D1+1,isr_sub_a+1
+ movff OFF+0,isr_sub_b
+ movff OFF+1,isr_sub_b+1
+ call isr_sub16
+ movff isr_sub_c,isr_xA
+ movff isr_sub_c+1,isr_xA+1
+ movff SENS+0,isr_xB
+ movff SENS+1,isr_xB+1
+ call isr_mult16x16
+ movlw d'12'
+ movwf isr_divB
+ call isr_div32
+ btfsc neg_flag_isr ; invert isr_xC+0 and isr_xC+1
+ call isr_invert_xC
+ movlw LOW d'1000'
+ addwf isr_xC+0, f
+ movlw HIGH d'1000'
+ addwfc isr_xC+1, f
+ movff isr_xC+0,amb_pressure+0
+ movff isr_xC+1,amb_pressure+1
+
+ btfss simulatormode_active ; are we in simulator mode?
+ bra calc_pressure_done ; no
+
+ movff sim_pressure+0,amb_pressure+0 ; override readings with simulator values
+ movff sim_pressure+1,amb_pressure+1
+
+calc_pressure_done:
+
+; calculate temp
+ movff C6+0, C3_temp+0
+ movff C6+1, C3_temp+1
+ movlw d'100'
+ addwf C3_temp+0, f
+ movlw d'0'
+ addwfc C3_temp+1, f
+ movff C3_temp+0,isr_xA+0
+ movff C3_temp+1,isr_xA+1
+ movff xdT2+0,isr_xB+0
+ movff xdT2+1,isr_xB+1
+ call isr_mult16x16
+ movlw d'11'
+ movwf isr_divB
+ call isr_div32
+ bcf neg_temp ; Temperatur positive
+
+ btfsc neg_flag_xdT ; was xdT negative?
+ bra neg_sub_temp ; yes, 200 - dT*(....
+ ; No, 200 + dT*(....
+; movf temperature_correction,W
+; addlw d'200'
+; btfsc STATUS,C
+; incf isr_xC+1,F
+
+ movlw d'200'
+ addwf isr_xC+0, f
+ movlw d'0'
+ addwfc isr_xC+1, f
+ movff isr_xC+0,temperature+0
+ movff isr_xC+1,temperature+1
+ return ; done
+
+neg_sub_temp: ; 200 - dT*(....
+; movf temperature_correction,W
+; addlw d'200'
+; btfsc STATUS,C
+; decf isr_xC+1,F
+
+ movlw d'200'
+neg_sub_temp3:
+ movwf isr_sub_a+0
+ clrf isr_sub_a+1
+ movff isr_xC+0, isr_sub_b+0
+ movff isr_xC+1, isr_sub_b+1
+ call isr_sub16 ; isr_sub_c = isr_sub_a - isr_sub_b
+ btfsc neg_flag_isr ; below zero?
+ bsf neg_temp ; temperature negative!
+
+ movff isr_sub_c+0,temperature+0
+ movff isr_sub_c+1,temperature+1
+ return ; Fertig mit allem
+
+
+get_pressure_start:
+ rcall reset_MS5535A
+ movlw b'10100000' ;+3*high as start and 1+low as stop!
+get_pressure_start2:
+ movwf isr1_temp
+ movlw d'12'
+ movwf clock_count
+ rcall send_data_MS55535A
+ return
+
+get_pressure_value:
+ rcall get_2bytes_MS5535A
+ movff dMSB,D1+1
+ movff dLSB,D1+0
+ return
+
+get_temperature_start:
+ rcall reset_MS5535A
+ movlw b'10010000' ;+3*high as start and 1+low as stop!
+ bra get_pressure_start2 ; continue in "get_pressure"
+
+get_temperature_value:
+ rcall get_2bytes_MS5535A
+ movff dMSB,D2+1
+ movff dLSB,D2+0
+ return
+
+get_calibration_data:
+ ; read addional temperature correction from internal EEPROM 0x100
+ bsf no_sensor_int ; No sensor interupt!
+ clrf temperature_correction ; clear compensation value
+ movlw LOW 0x100
+ movwf EEADR
+ movlw HIGH 0x100
+ movwf EEADRH
+ call read_eeprom
+ clrf EEADRH ; Only 256Bytes used in normal program
+ movlw d'200' ; limit value
+ cpfsgt EEDATA ; EEDATA>200?
+ movff EEDATA, temperature_correction ; No, Store for compensation
+
+ rcall reset_MS5535A
+ movlw d'13'
+ movwf clock_count
+ movlw b'01010100' ;+3*high as start and 1+low as stop!
+ movwf isr1_temp
+ rcall send_data_MS55535A
+ rcall get_2bytes_MS5535A
+ movff dMSB,W1+1
+ movff dLSB,W1+0
+
+ movlw d'13'
+ movwf clock_count
+ movlw b'01011000' ;+3*high as start and 1+low as stop!
+ movwf isr1_temp
+ rcall send_data_MS55535A
+ rcall get_2bytes_MS5535A
+ movff dMSB,W2+1
+ movff dLSB,W2+0
+
+ movlw d'13'
+ movwf clock_count
+ movlw b'01100100' ;+3*high as start and 1+low as stop!
+ movwf isr1_temp
+ rcall send_data_MS55535A
+ rcall get_2bytes_MS5535A
+ movff dMSB,W3+1
+ movff dLSB,W3+0
+
+ movlw d'13'
+ movwf clock_count
+ movlw b'01101000' ;+3*high as start and 1+low as stop!
+ movwf isr1_temp
+ rcall send_data_MS55535A
+ rcall get_2bytes_MS5535A
+ movff dMSB,W4+1
+ movff dLSB,W4+0
+
+; calculate C1 (16Bit)
+ movff W1+1, C1+1
+ bcf STATUS,C
+ rrcf C1+1
+ bcf STATUS,C
+ rrcf C1+1
+ bcf STATUS,C
+ rrcf C1+1
+ movff W1+0, C1+0
+ bsf STATUS,C
+ btfss W1+1,0
+ bcf STATUS,C
+ rrcf C1+0
+ bsf STATUS,C
+ btfss W1+1,1
+ bcf STATUS,C
+ rrcf C1+0
+ bsf STATUS,C
+ btfss W1+1,2
+ bcf STATUS,C
+ rrcf C1+0
+
+; calculate C2 (16Bit)
+ movff W2+0, C2+0
+ bsf STATUS,C
+ btfss W2+1,0
+ bcf STATUS,C
+ rrcf C2+0
+ bsf STATUS,C
+ btfss W2+1,1
+ bcf STATUS,C
+ rrcf C2+0
+ bsf STATUS,C
+ btfss W2+1,2
+ bcf STATUS,C
+ rrcf C2+0
+ bsf STATUS,C
+ btfss W2+1,3
+ bcf STATUS,C
+ rrcf C2+0
+ bsf STATUS,C
+ btfss W2+1,4
+ bcf STATUS,C
+ rrcf C2+0
+ bsf STATUS,C
+ btfss W2+1,5
+ bcf STATUS,C
+ rrcf C2+0
+
+ movff W2+1, C2+1
+ bsf STATUS,C
+ btfss W1+0,0
+ bcf STATUS,C
+ rrcf C2+1
+ bsf STATUS,C
+ btfss W1+0,1
+ bcf STATUS,C
+ rrcf C2+1
+ bsf STATUS,C
+ btfss W1+0,2
+ bcf STATUS,C
+ rrcf C2+1
+ bcf STATUS,C
+ rrcf C2+1
+ bcf STATUS,C
+ rrcf C2+1
+ bcf STATUS,C
+ rrcf C2+1
+
+; calculate C3 (16Bit)
+ movff W3+1,C3+0
+ bsf STATUS,C
+ btfss W3+0,7
+ bcf STATUS,C
+ rlcf C3+0
+ bsf STATUS,C
+ btfss W3+0,6
+ bcf STATUS,C
+ rlcf C3+0
+ clrf C3+1
+ btfsc W3+1,7
+ bsf C3+1,1
+ btfsc W3+1,6
+ bsf C3+1,0
+
+; calculate C4 (16Bit)
+ movff W4+1,C4+0
+ bsf STATUS,C
+ btfss W4+0,7
+ bcf STATUS,C
+ rlcf C4+0
+ clrf C4+1
+ btfsc W4+1,7
+ bsf C4+1,0
+
+; calculate C5 (16Bit)
+ movff W3+0,C5+0
+ bcf C5+0,6
+ btfsc W2+0,0
+ bsf C5+0,6
+ bcf C5+0,7
+ btfsc W2+0,1
+ bsf C5+0,7
+ clrf C5+1
+ btfsc W2+0,2
+ bsf C5+1,0
+ btfsc W2+0,3
+ bsf C5+1,1
+ btfsc W2+0,4
+ bsf C5+1,2
+ btfsc W2+0,5
+ bsf C5+1,3
+
+; calculate C6 (16Bit)
+ clrf C6+1
+ movff W4+0,C6+0
+ bcf C6+0,7
+
+ bcf no_sensor_int ; enable sensor interrupts
+ return
+
+reset_MS5535A_one:
+ bsf sensor_SDO
+ nop
+ bsf sensor_CLK
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ bcf sensor_CLK
+ return
+
+reset_MS5535A_zero:
+ bcf sensor_SDO
+ nop
+ bsf sensor_CLK
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ bcf sensor_CLK
+ return
+
+reset_MS5535A:
+ rcall reset_MS5535A_one ;0
+ rcall reset_MS5535A_zero
+ rcall reset_MS5535A_one
+ rcall reset_MS5535A_zero
+ rcall reset_MS5535A_one
+ rcall reset_MS5535A_zero
+ rcall reset_MS5535A_one
+ rcall reset_MS5535A_zero
+ rcall reset_MS5535A_one
+ rcall reset_MS5535A_zero
+ rcall reset_MS5535A_one
+ rcall reset_MS5535A_zero
+ rcall reset_MS5535A_one
+ rcall reset_MS5535A_zero
+ rcall reset_MS5535A_one
+ rcall reset_MS5535A_zero ;15
+ rcall reset_MS5535A_zero
+ rcall reset_MS5535A_zero
+ rcall reset_MS5535A_zero
+ rcall reset_MS5535A_zero
+ rcall reset_MS5535A_zero ;20
+ return
+
+get_2bytes_MS5535A:
+ movlw d'8'
+ movwf clock_count
+ rcall recieve_loop
+ movff isr1_temp,dMSB
+
+ movlw d'8'
+ movwf clock_count
+ rcall recieve_loop
+ movff isr1_temp,dLSB
+ bsf sensor_CLK
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ bcf sensor_CLK
+ return
+
+recieve_loop:
+ bsf sensor_CLK
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ bcf sensor_CLK
+ btfss sensor_SDI ;MSB first
+ bcf STATUS,C
+ btfsc sensor_SDI ;MSB first
+ bsf STATUS,C
+ rlcf isr1_temp,F
+ decfsz clock_count,F
+ bra recieve_loop
+ return
+
+
+send_data_MS55535A:
+ ; send three startbits first
+ bcf sensor_CLK
+ bsf sensor_SDO
+ movlw d'3'
+ subwf clock_count,F ; total bit counter
+ bsf sensor_CLK
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ bcf sensor_CLK
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ bsf sensor_CLK
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ bcf sensor_CLK
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ bsf sensor_CLK
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ bcf sensor_CLK
+ ; now send 8 bytes from isr_temp1 and fill-up with zeros
+datenbits:
+ btfss isr1_temp,7 ;MSB first
+ bcf sensor_SDO
+ btfsc isr1_temp,7 ;MSB first
+ bsf sensor_SDO
+ bcf STATUS,C
+ rlcf isr1_temp
+
+ bsf sensor_CLK
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ bcf sensor_CLK
+
+ decfsz clock_count,F
+ bra datenbits
+ return
diff -r 000000000000 -r 96a35aeda5f2 code_part1/OSTC_code_asm_part1/oled_samsung.asm
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/code_part1/OSTC_code_asm_part1/oled_samsung.asm Tue Jan 12 15:05:59 2010 +0100
@@ -0,0 +1,768 @@
+; OSTC - diving computer code
+; Copyright (C) 2009 HeinrichsWeikamp GbR
+
+; 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 3 of the License, or
+; (at your option) any later version.
+
+; This program is distributed in the hope that it will be useful,
+; but WITHOUT ANY WARRANTY; without even the implied warranty of
+; 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, see .
+
+
+; hardware routines for S6E6D6 Samsung OLED Driver IC
+; written by: Matthias Heinrichs, info@heinrichsweikamp.com
+; written: 090801
+; last updated: 090830
+; known bugs:
+; ToDo: Optimise PLED_box calls
+
+WIN_FONT macro win_font_input
+ movlw win_font_input
+ movff WREG,win_font
+ endm
+
+WIN_TOP macro win_top_input
+ movlw win_top_input
+ movff WREG,win_top
+ endm
+
+WIN_LEFT macro win_left_input
+ movlw win_left_input
+ movff WREG,win_leftx2
+ endm
+
+WIN_INVERT macro win_invert_input
+ movlw win_invert_input
+ movff WREG,win_invert
+ endm
+
+WIN_COLOR macro win_color_input
+ movlw win_color_input
+ call PLED_set_color
+ endm
+
+
+word_processor: ; word_processor:
+ clrf POSTINC2 ; Required!
+ movff win_color2,win_color2_temp
+ movff win_color1,win_color1_temp
+ call main_wordprocessor ; C-Code
+ movlb b'00000001' ; Back to Rambank1
+ movff win_color2_temp,win_color2
+ movff win_color1_temp,win_color1
+ return
+
+; -----------------------------
+; PLED_SetColumnPixel:
+; -----------------------------
+PLED_SetColumnPixel:
+ movwf LastSetColumn ; d'0' ... d'159'
+ movff LastSetColumn,win_leftx2
+ movlw 0x21 ; Start Address Vertical (.0 - .319)
+ rcall PLED_CmdWrite
+ bcf STATUS,C
+ rlcf LastSetColumn,W ; x2 -> WREG
+ movlw d'0'
+ btfsc STATUS,C ; Result >255?
+ movlw d'1' ; Yes: Upper=1!
+ rcall PLED_DatWrite ; Upper
+ bcf STATUS,C
+ rlcf LastSetColumn,W ; x2 -> WREG
+ rcall PLED_DatWrite ; Lower
+ return
+
+; -----------------------------
+; PLED_SetRow:
+; -----------------------------
+PLED_SetRow:
+ movwf LastSetRow ; d'0' ... d'239'
+ movff LastSetRow,win_top
+ movlw 0x20 ; Horizontal Address START:END
+ rcall PLED_CmdWrite
+ movlw 0x00
+ rcall PLED_DatWrite
+ movf LastSetRow,W
+ rcall PLED_DatWrite
+ return
+
+; -----------------------------
+; PLED Write Two Pixel
+; -----------------------------
+PLED_PxlWrite:
+ movlw 0x22 ; Start Writing Data to GRAM
+ rcall PLED_CmdWrite
+ bsf oled_rs ; Data!
+ movff win_color1,PORTD
+ bcf oled_rw
+ bsf oled_rw ; Upper
+ movff win_color2,PORTD
+ bcf oled_rw
+ bsf oled_rw ; Lower
+
+; Reset Column+1
+ movlw 0x21 ; Start Address Vertical (.0 - .319)
+ rcall PLED_CmdWrite
+ bcf STATUS,C
+ rlcf LastSetColumn,W ; x2
+ movlw d'0'
+ btfsc STATUS,C ; Result >256?
+ movlw d'1' ; Yes!
+ rcall PLED_DatWrite ; Upper
+ bcf STATUS,C
+ rlcf LastSetColumn,F
+ incf LastSetColumn,W ; x2
+ rcall PLED_DatWrite ; Lower
+
+; Reset Row
+ movlw 0x20 ; Horizontal Address START:END
+ rcall PLED_CmdWrite
+ movlw 0x00
+ rcall PLED_DatWrite
+ movf LastSetRow,W
+ rcall PLED_DatWrite
+
+; Write 2nd Pixel on same row but one column to the right
+ movlw 0x22 ; Start Writing Data to GRAM
+ rcall PLED_CmdWrite
+ bsf oled_rs ; Data!
+ movff win_color1,PORTD
+ bcf oled_rw
+ bsf oled_rw ; Upper
+ movff win_color2,PORTD
+ bcf oled_rw
+ bsf oled_rw ; Lower
+ return
+
+; -----------------------------
+; PLED Write One Pixel
+; -----------------------------
+PLED_PxlWrite_Single:
+ movlw 0x22 ; Start Writing Data to GRAM
+ rcall PLED_CmdWrite
+ bsf oled_rs ; Data!
+ movff win_color1, PORTD
+ bcf oled_rw
+ bsf oled_rw ; Upper
+ movff win_color2, PORTD
+ bcf oled_rw
+ bsf oled_rw ; Lower
+ return
+
+; -----------------------------
+; PLED Display Off
+; -----------------------------
+PLED_DisplayOff:
+ clrf PORTD
+ bcf oled_hv
+ bcf oled_vdd
+ bcf oled_cs
+ bcf oled_e_nwr
+ bcf oled_rw
+ bcf oled_nreset
+ return
+
+; -----------------------------
+; PLED FRAME (win_color1 and win_color2)
+; -----------------------------
+PLED_frame:
+ movf box_temp+0,W
+ call PLED_set_color
+ ; draw right line from row top (box_temp+1) to row bottom (box_temp+2)
+ movff box_temp+1,draw_box_temp1 ; Store start row
+PLED_frame2:
+ movf draw_box_temp1,W ; d'0' ... d'239'
+ rcall PLED_SetRow ; Set Row
+ movf box_temp+3,W ; d'0' ... d'159'
+ call PLED_SetColumnPixel ; Set left column
+ rcall PLED_PxlWrite_Single ; Write Pixel
+ incf draw_box_temp1,F
+ movf draw_box_temp1,W ; Copy to W
+ cpfseq box_temp+2 ; Done?
+ bra PLED_frame2 ; Not yet...
+
+ movf draw_box_temp1,W ; d'0' ... d'239'
+ rcall PLED_SetRow ; Set Row
+ movf box_temp+3,W ; d'0' ... d'159'
+ call PLED_SetColumnPixel ; Set left column
+ rcall PLED_PxlWrite_Single ; Write Pixel
+
+ ; draw left line from row top (box_temp+1) to row bottom (box_temp+2)
+ movff box_temp+1,draw_box_temp1 ; Store start row
+PLED_frame3:
+ movf draw_box_temp1,W ; d'0' ... d'239'
+ rcall PLED_SetRow ; Set Row
+ movf box_temp+4,W ; d'0' ... d'159'
+ call PLED_SetColumnPixel ; Set left column
+ rcall PLED_PxlWrite_Single ; Write Pixel
+ incf draw_box_temp1,F
+ movf draw_box_temp1,W ; Copy to W
+ cpfseq box_temp+2 ; Done?
+ bra PLED_frame3 ; Not yet...
+
+ movf draw_box_temp1,W ; d'0' ... d'239'
+ rcall PLED_SetRow ; Set Row
+ movf box_temp+4,W ; d'0' ... d'159'
+ call PLED_SetColumnPixel ; Set left column
+ rcall PLED_PxlWrite_Single ; Write Pixel
+
+ ; draw top line from box_temp+3 (0-159) to box_temp+4 (0-159)
+ movff box_temp+3,draw_box_temp1 ; Store start column
+PLED_frame4:
+ movf draw_box_temp1,W ; d'0' ... d'159'
+ rcall PLED_SetColumnPixel ; Set Column
+ movf box_temp+1,W ; d'0' ... d'239'
+ rcall PLED_SetRow ; Set Row
+ rcall PLED_PxlWrite ; Write 2 Pixels
+ incf draw_box_temp1,F
+ movf draw_box_temp1,W
+ cpfseq box_temp+4
+ bra PLED_frame4
+
+ ; draw bottom line from box_temp+3 (0-159) to box_temp+4 (0-159)
+ movff box_temp+3,draw_box_temp1 ; Store start column
+PLED_frame5:
+ movf draw_box_temp1,W ; d'0' ... d'159'
+ rcall PLED_SetColumnPixel ; Set Column
+ movf box_temp+2,W ; d'0' ... d'239'
+ rcall PLED_SetRow ; Set Row
+ rcall PLED_PxlWrite ; Write 2 Pixels
+ incf draw_box_temp1,F
+ movf draw_box_temp1,W
+ cpfseq box_temp+4
+ bra PLED_frame5
+
+ movlw color_white
+ call PLED_set_color
+
+ return
+
+; -----------------------------
+; PLED Box (win_color1 and win_color2)
+; -----------------------------
+PLED_box:
+ movf box_temp+0,W
+ call PLED_set_color
+; /Define Window
+ movlw 0x35 ; VerticalStartAddress HIGH:LOW
+ rcall PLED_CmdWrite
+ movff box_temp+3,draw_box_temp1
+ bcf STATUS,C
+ rlcf draw_box_temp1,W ; x2
+ movlw d'0'
+ btfsc STATUS,C ; Result >255?
+ movlw d'1' ; Yes: Upper=1!
+ rcall PLED_DatWrite ; Upper
+ bcf STATUS,C
+ rlcf draw_box_temp1,W ; x2 -> WREG
+ rcall PLED_DatWrite ; Lower
+
+ movlw 0x36 ; VerticalEndAddress HIGH:LOW
+ rcall PLED_CmdWrite
+ movff box_temp+4,draw_box_temp1
+ bcf STATUS,C
+ rlcf draw_box_temp1,W ; x2
+ movlw d'0'
+ btfsc STATUS,C ; Result >255?
+ movlw d'1' ; Yes: Upper=1!
+ rcall PLED_DatWrite ; Upper
+ bcf STATUS,C
+ rlcf draw_box_temp1,W ; x2 -> WREG
+ rcall PLED_DatWrite ; Lower
+
+ movlw 0x37 ; HorizontalAddress START:END
+ rcall PLED_CmdWrite
+ movff box_temp+1,draw_box_temp1
+ movf draw_box_temp1,W
+ rcall PLED_DatWrite
+ movff box_temp+2,draw_box_temp1
+ movf draw_box_temp1,W
+ rcall PLED_DatWrite
+
+ movlw 0x20 ; Start Address Horizontal (.0 - .239)
+ rcall PLED_CmdWrite
+ movlw 0x00
+ rcall PLED_DatWrite
+ movff box_temp+1,draw_box_temp1
+ movf draw_box_temp1,W
+ rcall PLED_DatWrite
+
+ movlw 0x21 ; Start Address Vertical (.0 - .319)
+ rcall PLED_CmdWrite
+ movff box_temp+3,draw_box_temp1
+ bcf STATUS,C
+ rlcf draw_box_temp1,W ; x2
+ movlw d'0'
+ btfsc STATUS,C ; Result >255?
+ movlw d'1' ; Yes: Upper=1!
+ rcall PLED_DatWrite ; Upper
+ bcf STATUS,C
+ rlcf draw_box_temp1,W ; x2 -> WREG
+ rcall PLED_DatWrite ; Lower
+; /Define Window
+
+; Fill Window
+ movlw 0x22 ; Start Writing Data to GRAM
+ rcall PLED_CmdWrite
+
+ movff box_temp+1,draw_box_temp1
+ movff box_temp+2,draw_box_temp2
+ movf draw_box_temp1,W
+ subwf draw_box_temp2,F ; X length
+ incf draw_box_temp2,F
+
+ movff box_temp+3,draw_box_temp1
+ movff box_temp+4,draw_box_temp3
+ movf draw_box_temp1,W
+ subwf draw_box_temp3,F ; Y length/2
+
+ incf draw_box_temp3,F ; Last pixel...
+
+ bsf oled_rs ; Data!
+
+PLED_box2:
+ movff draw_box_temp3,draw_box_temp1
+PLED_box3:
+ movff win_color1,PORTD
+ bcf oled_rw
+ bsf oled_rw ; Upper
+ movff win_color2,PORTD
+ bcf oled_rw
+ bsf oled_rw ; Lower
+
+ movff win_color1,PORTD
+ bcf oled_rw
+ bsf oled_rw ; Upper
+ movff win_color2,PORTD
+ bcf oled_rw
+ bsf oled_rw ; Lower
+
+ decfsz draw_box_temp1,F
+ bra PLED_box3
+ decfsz draw_box_temp2,F
+ bra PLED_box2
+
+ movlw 0x00 ; NOP, to stop Address Update Counter
+ rcall PLED_CmdWrite
+
+ movlw color_white
+ call PLED_set_color
+ return
+
+
+; -----------------------------
+; PLED_ClearScreen:
+; -----------------------------
+PLED_ClearScreen:
+ movlw 0x35 ; VerticalStartAddress HIGH:LOW
+ rcall PLED_CmdWrite
+ movlw 0x00
+ rcall PLED_DatWrite
+ movlw 0x00
+ rcall PLED_DatWrite
+
+ movlw 0x36 ; VerticalEndAddress HIGH:LOW
+ rcall PLED_CmdWrite
+ movlw 0x01
+ rcall PLED_DatWrite
+ movlw 0x3F
+ rcall PLED_DatWrite
+
+ movlw 0x37 ; HorizontalAddress START:END
+ rcall PLED_CmdWrite
+ movlw 0x00
+ rcall PLED_DatWrite
+ movlw 0xEF
+ rcall PLED_DatWrite
+
+ movlw 0x20 ; Start Address Horizontal (.0 - .239)
+ rcall PLED_CmdWrite
+ movlw 0x00
+ rcall PLED_DatWrite
+ movlw 0x00
+ rcall PLED_DatWrite
+
+ movlw 0x21 ; Start Address Vertical (.0 - .319)
+ rcall PLED_CmdWrite
+ movlw 0x00
+ rcall PLED_DatWrite
+ movlw 0x00
+ rcall PLED_DatWrite
+
+ movlw 0x22 ; Start Writing Data to GRAM
+ rcall PLED_CmdWrite
+
+ bsf oled_rs ; Data!
+
+ clrf PORTD ; See Page 101 of OLED Driver IC Datasheet
+
+ movlw d'10'
+ movwf draw_box_temp3
+PLED_ClearScreen2:
+ movlw d'30'
+ movwf draw_box_temp2
+PLED_ClearScreen3:
+ clrf draw_box_temp1 ; 30*10*256=76800 Pixels -> Clear complete 240*320
+PLED_ClearScreen4:
+
+ bcf oled_rw
+ bsf oled_rw ; Upper
+ bcf oled_rw
+ bsf oled_rw ; Lower
+
+ decfsz draw_box_temp1,F
+ bra PLED_ClearScreen4
+ decfsz draw_box_temp2,F
+ bra PLED_ClearScreen3
+ decfsz draw_box_temp3,F
+ bra PLED_ClearScreen2
+
+ movlw 0x00 ; NOP, to stop Address Update Counter
+ rcall PLED_CmdWrite
+
+ return
+
+
+; -----------------------------
+; PLED Write Cmd via W
+; -----------------------------
+PLED_CmdWrite:
+ bcf oled_rs ; Command!
+ movwf PORTD ; Move Data to PORTD
+ bcf oled_rw
+ bsf oled_rw
+ return
+
+; -----------------------------
+; PLED Write Display Data via W
+; -----------------------------
+PLED_DataWrite:
+
+; -----------------------------
+; PLED Data Cmd via W
+; -----------------------------
+PLED_DatWrite:
+ bsf oled_rs ; Data!
+ movwf PORTD ; Move Data to PORTD
+ bcf oled_rw
+ bsf oled_rw
+ return
+
+; -----------------------------
+; PLED boot
+; -----------------------------
+PLED_boot:
+ bcf oled_hv
+ WAITMS d'32'
+ bsf oled_vdd
+ nop
+ bcf oled_cs
+ nop
+ bsf oled_nreset
+ WAITMS d'10' ; Quick wake-up
+; WAITMS d'250'
+ bsf oled_e_nwr
+ nop
+ bcf oled_nreset
+ WAIT10US d'2'
+ bsf oled_nreset
+ WAITMS d'10'
+
+ movlw 0x24 ; 80-System 8-Bit Mode
+ rcall PLED_CmdWrite
+
+ movlw 0x02 ; RGB Interface Control (S6E63D6 Datasheet page 42)
+ rcall PLED_CmdWrite
+ movlw 0x00 ; X X X X X X X RM
+ rcall PLED_DatWrite
+ movlw 0x00 ; DM X RIM1 RIM0 VSPL HSPL EPL DPL
+ rcall PLED_DatWrite ; System Interface: RIM is ignored, Internal Clock
+
+ movlw 0x03 ; Entry Mode (S6E63D6 Datasheet page 46)
+ rcall PLED_CmdWrite
+ movlw 0x00 ; =b'00000000' CLS MDT1 MDT0 BGR X X X SS 65k Color
+ rcall PLED_DatWrite
+ movlw b'00110000' ; =b'00110000' X X I/D1 I/D0 X X X AM
+ rcall PLED_DatWrite
+
+ movlw 0x18
+ rcall PLED_CmdWrite
+ movlw 0x00
+ rcall PLED_DatWrite
+ movlw 0x28
+ rcall PLED_DatWrite
+
+ movlw 0xF8
+ rcall PLED_CmdWrite
+ movlw 0x00
+ rcall PLED_DatWrite
+ movlw 0x0F
+ rcall PLED_DatWrite
+
+ movlw 0xF9
+ rcall PLED_CmdWrite
+ movlw 0x00
+ rcall PLED_DatWrite
+ movlw 0x0F
+ rcall PLED_DatWrite
+
+ movlw 0x10
+ rcall PLED_CmdWrite
+ movlw 0x00
+ rcall PLED_DatWrite
+ movlw 0x00
+ rcall PLED_DatWrite
+
+; Now Gamma settings...
+ rcall PLED_brightness_full
+; End Gamma Settings
+
+ rcall PLED_ClearScreen
+
+ bsf oled_hv
+ WAITMS d'32'
+
+ movlw 0x05
+ rcall PLED_CmdWrite
+ movlw 0x00
+ rcall PLED_DatWrite
+ movlw 0x01
+ rcall PLED_DatWrite ; Display ON
+ return
+
+
+PLED_brightness_full:
+ movlw 0x70
+ rcall PLED_CmdWrite
+ movlw 0x1F
+ rcall PLED_DatWrite
+ movlw 0x00
+ rcall PLED_DatWrite
+ movlw 0x71
+ rcall PLED_CmdWrite
+ movlw 0x23
+ rcall PLED_DatWrite
+ movlw 0x80
+ rcall PLED_DatWrite
+ movlw 0x72
+ rcall PLED_CmdWrite
+ movlw 0x2A
+ rcall PLED_DatWrite
+ movlw 0x80
+ rcall PLED_DatWrite
+
+ movlw 0x73
+ rcall PLED_CmdWrite
+ movlw 0x15
+ rcall PLED_DatWrite
+ movlw 0x11
+ rcall PLED_DatWrite
+ movlw 0x74
+ rcall PLED_CmdWrite
+ movlw 0x1C
+ rcall PLED_DatWrite
+ movlw 0x11
+ rcall PLED_DatWrite
+
+ movlw 0x75
+ rcall PLED_CmdWrite
+ movlw 0x1B
+ rcall PLED_DatWrite
+ movlw 0x15
+ rcall PLED_DatWrite
+ movlw 0x76
+ rcall PLED_CmdWrite
+ movlw 0x1A
+ rcall PLED_DatWrite
+ movlw 0x15
+ rcall PLED_DatWrite
+
+ movlw 0x77
+ rcall PLED_CmdWrite
+ movlw 0x1C
+ rcall PLED_DatWrite
+ movlw 0x18
+ rcall PLED_DatWrite
+ movlw 0x78
+ rcall PLED_CmdWrite
+ movlw 0x21
+ rcall PLED_DatWrite
+ movlw 0x15
+ rcall PLED_DatWrite
+
+ return
+
+PLED_brightness_low:
+ movlw 0x70
+ rcall PLED_CmdWrite
+ movlw 0x14
+ rcall PLED_DatWrite
+ movlw 0x00
+ rcall PLED_DatWrite
+ movlw 0x71
+ rcall PLED_CmdWrite
+ movlw 0x17
+ rcall PLED_DatWrite
+ movlw 0x00
+ rcall PLED_DatWrite
+ movlw 0x72
+ rcall PLED_CmdWrite
+ movlw 0x15
+ rcall PLED_DatWrite
+ movlw 0x80
+ rcall PLED_DatWrite
+
+ movlw 0x73
+ rcall PLED_CmdWrite
+ movlw 0x15
+ rcall PLED_DatWrite
+ movlw 0x11
+ rcall PLED_DatWrite
+ movlw 0x74
+ rcall PLED_CmdWrite
+ movlw 0x14
+ rcall PLED_DatWrite
+ movlw 0x0B
+ rcall PLED_DatWrite
+
+ movlw 0x75
+ rcall PLED_CmdWrite
+ movlw 0x1B
+ rcall PLED_DatWrite
+ movlw 0x15
+ rcall PLED_DatWrite
+ movlw 0x76
+ rcall PLED_CmdWrite
+ movlw 0x13
+ rcall PLED_DatWrite
+ movlw 0x0E
+ rcall PLED_DatWrite
+
+ movlw 0x77
+ rcall PLED_CmdWrite
+ movlw 0x1C
+ rcall PLED_DatWrite
+ movlw 0x18
+ rcall PLED_DatWrite
+ movlw 0x78
+ rcall PLED_CmdWrite
+ movlw 0x15
+ rcall PLED_DatWrite
+ movlw 0x0E
+ rcall PLED_DatWrite
+
+ return
+
+PLED_set_color:;Converts 8Bit RGB b'RRRGGGBB' into 16Bit RGB b'RRRRRGGGGGGBBBBB'
+ movwf oled1_temp ; Get 8Bit RGB b'RRRGGGBB'
+ movff oled1_temp, oled2_temp ; Copy
+
+ ; Mask Bit 7,6,5,4,3,2
+ movlw b'00000011'
+ andwf oled2_temp,F
+
+ movlw b'00000000'
+ dcfsnz oled2_temp,F
+ movlw b'01010000'
+ dcfsnz oled2_temp,F
+ movlw b'10100000'
+ dcfsnz oled2_temp,F
+ movlw b'11111000'
+ movwf oled3_temp ; Blue done.
+
+ movff oled1_temp, oled2_temp ; Copy
+ ; Mask Bit 7,6,5,1,0
+ movlw b'00011100'
+ andwf oled2_temp,F
+ rrncf oled2_temp,F
+ rrncf oled2_temp,F
+
+ movlw b'00000000'
+ dcfsnz oled2_temp,F
+ movlw b'00000100'
+ dcfsnz oled2_temp,F
+ movlw b'00001000'
+ dcfsnz oled2_temp,F
+ movlw b'00001100'
+ dcfsnz oled2_temp,F
+ movlw b'00010000'
+ dcfsnz oled2_temp,F
+ movlw b'00010100'
+ dcfsnz oled2_temp,F
+ movlw b'00100000'
+ dcfsnz oled2_temp,F
+ movlw b'00111111'
+ movwf oled4_temp
+
+ rrcf oled4_temp,F
+ rrcf oled3_temp,F
+
+ rrcf oled4_temp,F
+ rrcf oled3_temp,F
+
+ rrcf oled4_temp,F
+ rrcf oled3_temp,F ; oled3_temp (b'GGGBBBBB') done.
+
+ movff oled1_temp, oled2_temp ; Copy
+ clrf oled1_temp
+
+ rrcf oled4_temp,F
+ rrcf oled1_temp,F
+
+ rrcf oled4_temp,F
+ rrcf oled1_temp,F
+
+ rrcf oled4_temp,F
+ rrcf oled1_temp,F ; Green done.
+
+ ; Mask Bit 4,3,2,1,0
+ movlw b'11100000'
+ andwf oled2_temp,F
+
+ rrncf oled2_temp,F
+ rrncf oled2_temp,F
+ rrncf oled2_temp,F
+ rrncf oled2_temp,F
+ rrncf oled2_temp,F
+
+ movlw b'00000000'
+ dcfsnz oled2_temp,F
+ movlw b'00000100'
+ dcfsnz oled2_temp,F
+ movlw b'00001000'
+ dcfsnz oled2_temp,F
+ movlw b'00001100'
+ dcfsnz oled2_temp,F
+ movlw b'00010000'
+ dcfsnz oled2_temp,F
+ movlw b'00010100'
+ dcfsnz oled2_temp,F
+ movlw b'00100000'
+ dcfsnz oled2_temp,F
+ movlw b'00111111'
+ movwf oled4_temp
+
+ rrcf oled4_temp,F
+ rrcf oled1_temp,F
+
+ rrcf oled4_temp,F
+ rrcf oled1_temp,F
+
+ rrcf oled4_temp,F
+ rrcf oled1_temp,F
+
+ rrcf oled4_temp,F
+ rrcf oled1_temp,F
+
+ rrcf oled4_temp,F
+ rrcf oled1_temp,F ; Red done.
+
+ movff oled1_temp,win_color1
+ movff oled3_temp,win_color2 ; Set Bank0 Color registers...
+ return
+
diff -r 000000000000 -r 96a35aeda5f2 code_part1/OSTC_code_asm_part1/ostc_part2_compiled_start_0C000.MCH
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/code_part1/OSTC_code_asm_part1/ostc_part2_compiled_start_0C000.MCH Tue Jan 12 15:05:59 2010 +0100
@@ -0,0 +1,22134 @@
+0109
+6B30
+6B31
+6B32
+6B33
+5134
+0B04
+E004
+0E08
+6F34
+6B35
+D003
+0E04
+6F34
+6B35
+6B36
+6B37
+6938
+C434
+F9B5
+C435
+F9B6
+C436
+F9B7
+C437
+F9B8
+C438
+F9B9
+C439
+F9BA
+C43A
+F9BB
+C43B
+F9BC
+C51F
+F983
+C51E
+F984
+C40C
+F985
+C40D
+F986
+C40E
+F987
+C40F
+F988
+C297
+F989
+C298
+F98A
+C299
+F98B
+C29A
+F98C
+C29B
+F98D
+C29C
+F98E
+C29D
+F98F
+C29E
+F990
+C5EF
+F991
+C5F0
+F992
+C5F1
+F993
+C5F2
+F994
+C5F3
+F995
+C5F4
+F996
+C5F5
+F997
+C5F6
+F998
+C5F7
+F999
+C5F8
+F99A
+C5F9
+F99B
+C5FA
+F99C
+C95F
+F99D
+C960
+F99E
+C961
+F99F
+C962
+F9A0
+C963
+F9A1
+C964
+F9A2
+C965
+F9A3
+C966
+F9A4
+C96F
+F9A5
+C970
+F9A6
+C971
+F9A7
+C972
+F9A8
+C977
+F9A9
+C978
+F9AA
+C979
+F9AB
+C97A
+F9AC
+C97B
+F9AD
+C97C
+F9AE
+C97D
+F9AF
+C97E
+F9B0
+C97F
+F9B1
+C980
+F9B2
+C981
+F9B3
+C982
+F9B4
+0105
+511F
+E002
+0109
+8130
+6A2C
+6A2D
+6A2E
+6A2F
+C5EF
+F027
+C5F0
+F028
+C5F1
+F029
+C5F2
+F02A
+ECC2
+F06E
+0A01
+E002
+0109
+8330
+0E10
+0109
+6FBE
+6BBF
+0E20
+AFBF
+D002
+90D8
+D003
+5DBE
+0E00
+59BF
+E22D
+C9BE
+FFE9
+C9BF
+FFEA
+90D8
+36E9
+36EA
+90D8
+36E9
+36EA
+0E80
+26E9
+0E04
+22EA
+CFEE
+F000
+CFEE
+F001
+CFEE
+F002
+CFEF
+F003
+6A2C
+6A2D
+6A2E
+6A2F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+ECC2
+F06E
+0A01
+E002
+0109
+8530
+0109
+2BBE
+0E00
+23BF
+D7CA
+6A2C
+6A2D
+6A2E
+6A2F
+C5F3
+F027
+C5F4
+F028
+C5F5
+F029
+C5F6
+F02A
+ECC2
+F06E
+0A01
+E002
+0109
+8730
+0EA4
+6E2C
+0E70
+6E2D
+0E7D
+6E2E
+0E3F
+6E2F
+C977
+F027
+C978
+F028
+C979
+F029
+C97A
+F02A
+ECD2
+F06E
+0A01
+E102
+0109
+8930
+0E66
+6E2C
+6E2D
+0EA6
+6E2E
+0E3F
+6E2F
+C977
+F027
+C978
+F028
+C979
+F029
+C97A
+F02A
+ECC9
+F06E
+0A01
+E102
+0109
+8B30
+0E5C
+6E2C
+0E8F
+6E2D
+0E42
+6E2E
+0E3E
+6E2F
+C297
+F027
+C298
+F028
+C299
+F029
+C29A
+F02A
+ECD2
+F06E
+0A01
+E102
+0109
+8D30
+0EAE
+6E2C
+0E47
+6E2D
+0E81
+6E2E
+0E3F
+6E2F
+C297
+F027
+C298
+F028
+C299
+F029
+C29A
+F02A
+ECC9
+F06E
+0A01
+E102
+0109
+8F30
+0E9A
+6E2C
+0E99
+6E2D
+0E19
+6E2E
+0E3F
+6E2F
+C29B
+F027
+C29C
+F028
+C29D
+F029
+C29E
+F02A
+ECD2
+F06E
+0A01
+E102
+0109
+8131
+0EAE
+6E2C
+0E47
+6E2D
+0E81
+6E2E
+0E3F
+6E2F
+C29B
+F027
+C29C
+F028
+C29D
+F029
+C29E
+F02A
+ECC9
+F06E
+0A01
+E102
+0109
+8331
+C438
+F02C
+C439
+F02D
+C43A
+F02E
+C43B
+F02F
+C434
+F027
+C435
+F028
+C436
+F029
+C437
+F02A
+ECF8
+F06C
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+0E33
+6E2C
+6E2D
+0E73
+6E2E
+0E3F
+6E2F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+ECC9
+F06E
+0A01
+E102
+0109
+8531
+C438
+F02C
+C439
+F02D
+C43A
+F02E
+C43B
+F02F
+C434
+F027
+C435
+F028
+C436
+F029
+C437
+F02A
+ECF8
+F06C
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+0ECD
+6E2C
+0ECC
+6E2D
+0E4C
+6E2E
+0E3D
+6E2F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+ECD2
+F06E
+0A01
+E102
+0109
+8731
+6A2C
+6A2D
+0E80
+6E2E
+0E3E
+6E2F
+C97F
+F027
+C980
+F028
+C981
+F029
+C982
+F02A
+ECC9
+F06E
+0A01
+E102
+0109
+8931
+0105
+511E
+0808
+E202
+0109
+8B31
+6A2C
+6A2D
+6A2E
+6A2F
+C9A5
+F027
+C9A6
+F028
+C9A7
+F029
+C9A8
+F02A
+ECC2
+F06E
+0A01
+E02F
+C963
+F02C
+C964
+F02D
+C965
+F02E
+C966
+F02F
+C95F
+F027
+C960
+F028
+C961
+F029
+C962
+F02A
+ECF8
+F06C
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+0E33
+6E2C
+6E2D
+0E73
+6E2E
+0E3F
+6E2F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+ECC9
+F06E
+0A01
+E102
+0109
+8D31
+6A2C
+6A2D
+6A2E
+6A2F
+C9A5
+F027
+C9A6
+F028
+C9A7
+F029
+C9A8
+F02A
+ECC2
+F06E
+0A01
+E030
+C963
+F02C
+C964
+F02D
+C965
+F02E
+C966
+F02F
+C95F
+F027
+C960
+F028
+C961
+F029
+C962
+F02A
+ECF8
+F06C
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+0ECD
+6E2C
+0ECC
+6E2D
+0E4C
+6E2E
+0E3D
+6E2F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+ECD2
+F06E
+0A01
+E102
+0109
+8F31
+6A2C
+6A2D
+0E40
+6E2E
+6E2F
+C408
+F027
+C409
+F028
+C40A
+F029
+C40B
+F02A
+ECC9
+F06E
+0A01
+E102
+0109
+8132
+C408
+F02C
+C409
+F02D
+C40A
+F02E
+C40B
+F02F
+C40C
+F027
+C40D
+F028
+C40E
+F029
+C40F
+F02A
+ECF7
+F06C
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+0ECD
+6E2C
+0ECC
+6E2D
+0E4C
+6E2E
+0E3E
+6E2F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+ECC9
+F06E
+0A01
+E102
+0109
+8332
+6A2C
+6A2D
+0E40
+6E2E
+0E3F
+6E2F
+C40C
+F027
+C40D
+F028
+C40E
+F029
+C40F
+F02A
+ECD2
+F06E
+0A01
+E102
+0109
+8532
+0E7B
+6E2C
+0E14
+6E2D
+0E8E
+6E2E
+0E3F
+6E2F
+C40C
+F027
+C40D
+F028
+C40E
+F029
+C40F
+F02A
+ECC9
+F06E
+0A01
+E102
+0109
+8732
+0E33
+6E2C
+6E2D
+6E2E
+0E3F
+6E2F
+C97B
+F027
+C97C
+F028
+C97D
+F029
+C97E
+F02A
+ECD2
+F06E
+0A01
+E102
+0109
+8932
+0EAE
+6E2C
+0E47
+6E2D
+0E81
+6E2E
+0E3F
+6E2F
+C97B
+F027
+C97C
+F028
+C97D
+F029
+C97E
+F02A
+ECC9
+F06E
+0A01
+E102
+0109
+8B32
+C29B
+F02C
+C29C
+F02D
+C29D
+F02E
+C29E
+F02F
+C297
+F027
+C298
+F028
+C299
+F029
+C29A
+F02A
+ECC9
+F06E
+0A01
+E102
+0109
+8D32
+0012
+0109
+9534
+9536
+0012
+0EFF
+0109
+5D38
+E120
+0105
+0EB8
+80D8
+5500
+0E0B
+5501
+E219
+C522
+F938
+C938
+F000
+6A01
+BE00
+6801
+0EFF
+1800
+E101
+5001
+E10D
+C938
+F000
+6A01
+BE00
+6801
+0EFE
+1800
+E101
+5001
+E002
+0E00
+D001
+0E01
+0012
+CFD9
+FFE6
+CFE1
+FFD9
+0109
+6BC0
+6BC1
+C434
+F02C
+C435
+F02D
+C436
+F02E
+C437
+F02F
+C9B5
+F027
+C9B6
+F028
+C9B7
+F029
+C9B8
+F02A
+ECC2
+F06E
+0A01
+E114
+C438
+F02C
+C439
+F02D
+C43A
+F02E
+C43B
+F02F
+C9B9
+F027
+C9BA
+F028
+C9BB
+F029
+C9BC
+F02A
+ECC2
+F06E
+0A01
+E002
+0109
+81C0
+C5EF
+F02C
+C5F0
+F02D
+C5F1
+F02E
+C5F2
+F02F
+C991
+F027
+C992
+F028
+C993
+F029
+C994
+F02A
+ECC2
+F06E
+0A01
+E002
+0109
+83C0
+C977
+F02C
+C978
+F02D
+C979
+F02E
+C97A
+F02F
+C9A9
+F027
+C9AA
+F028
+C9AB
+F029
+C9AC
+F02A
+ECC2
+F06E
+0A01
+E114
+C97B
+F02C
+C97C
+F02D
+C97D
+F02E
+C97E
+F02F
+C9AD
+F027
+C9AE
+F028
+C9AF
+F029
+C9B0
+F02A
+ECC2
+F06E
+0A01
+E002
+0109
+89C0
+0105
+511F
+0109
+5D83
+E001
+8BC0
+C40C
+F02C
+C40D
+F02D
+C40E
+F02E
+C40F
+F02F
+C985
+F027
+C986
+F028
+C987
+F029
+C988
+F02A
+ECC2
+F06E
+0A01
+E002
+0109
+8DC0
+D03A
+0E10
+0109
+6FBE
+6BBF
+0E20
+AFBF
+D002
+90D8
+D003
+5DBE
+0E00
+59BF
+E22D
+C9BE
+FFE9
+C9BF
+FFEA
+90D8
+36E9
+36EA
+90D8
+36E9
+36EA
+0E80
+26E9
+0E04
+22EA
+CFEE
+F000
+CFEE
+F001
+CFEE
+F002
+CFEF
+F003
+6A2C
+6A2D
+6A2E
+6A2F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+ECC2
+F06E
+0A01
+E002
+0109
+8FC0
+0109
+2BBE
+0E00
+23BF
+D7CA
+C5F7
+F02C
+C5F8
+F02D
+C5F9
+F02E
+C5FA
+F02F
+C999
+F027
+C99A
+F028
+C99B
+F029
+C99C
+F02A
+ECC2
+F06E
+0A01
+E002
+0109
+81C1
+C96F
+F02C
+C970
+F02D
+C971
+F02E
+C972
+F02F
+C9A5
+F027
+C9A6
+F028
+C9A7
+F029
+C9A8
+F02A
+ECC2
+F06E
+0A01
+E128
+C95F
+F02C
+C960
+F02D
+C961
+F02E
+C962
+F02F
+C99D
+F027
+C99E
+F028
+C99F
+F029
+C9A0
+F02A
+ECC2
+F06E
+0A01
+E114
+C963
+F02C
+C964
+F02D
+C965
+F02E
+C966
+F02F
+C9A1
+F027
+C9A2
+F028
+C9A3
+F029
+C9A4
+F02A
+ECC2
+F06E
+0A01
+E002
+0109
+83C1
+C97F
+F02C
+C980
+F02D
+C981
+F02E
+C982
+F02F
+C9B1
+F027
+C9B2
+F028
+C9B3
+F029
+C9B4
+F02A
+ECC2
+F06E
+0A01
+E002
+0109
+85C1
+0105
+511E
+0109
+5D84
+E001
+87C1
+C297
+F02C
+C298
+F02D
+C299
+F02E
+C29A
+F02F
+C989
+F027
+C98A
+F028
+C98B
+F029
+C98C
+F02A
+ECC2
+F06E
+0A01
+E114
+C29B
+F02C
+C29C
+F02D
+C29D
+F02E
+C29E
+F02F
+C98D
+F027
+C98E
+F028
+C98F
+F029
+C990
+F02A
+ECC2
+F06E
+0A01
+E002
+0109
+89C1
+6A2C
+6A2D
+0E50
+6E2E
+0E41
+6E2F
+C408
+F027
+C409
+F028
+C40A
+F029
+C40B
+F02A
+ECC9
+F06E
+0A01
+E102
+0109
+8DC1
+C408
+F02C
+C409
+F02D
+C40A
+F02E
+C40B
+F02F
+C40C
+F027
+C40D
+F028
+C40E
+F029
+C40F
+F02A
+ECF7
+F06C
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+0ECD
+6E2C
+0ECC
+6E2D
+0E4C
+6E2E
+0E3E
+6E2F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+ECC9
+F06E
+0A01
+E102
+0109
+8FC1
+0EFE
+50DB
+E006
+0109
+51C0
+1336
+51C1
+1337
+D005
+0109
+51C0
+1334
+51C1
+1335
+52E5
+CFE7
+FFD9
+0012
+6AE6
+DE46
+52E5
+0012
+0E01
+6EE6
+DE41
+52E5
+0012
+0102
+6B70
+0105
+051F
+E001
+D3D7
+0102
+5192
+E001
+D14C
+0EF0
+6E2C
+0E85
+6E2D
+0E99
+6E2E
+0E3E
+6E2F
+C2BB
+F027
+C2BC
+F028
+C2BD
+F029
+C2BE
+F02A
+EC8E
+F06D
+C027
+F414
+C028
+F415
+C029
+F416
+C02A
+F417
+0EA4
+6E2C
+0E70
+6E2D
+0E7D
+6E2E
+0E3F
+6E2F
+C414
+F027
+C415
+F028
+C416
+F029
+C417
+F02A
+ECF8
+F06C
+EC93
+F06E
+C028
+F404
+C029
+F405
+0104
+0E1F
+80D8
+5504
+0E00
+5505
+E203
+0E1F
+6F04
+6B05
+0E00
+5D04
+0E00
+5905
+E202
+6B04
+6B05
+C404
+F2C6
+0E03
+0102
+03C6
+CFF3
+F2C5
+C2C5
+F029
+ECD1
+F06C
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+0E96
+6E2C
+0EB2
+6E2D
+0ECC
+6E2E
+0E3D
+6E2F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+ECE1
+F06D
+C027
+F414
+C028
+F415
+C029
+F416
+C02A
+F417
+C97F
+F02C
+C980
+F02D
+C981
+F02E
+C982
+F02F
+C414
+F027
+C415
+F028
+C416
+F029
+C417
+F02A
+ECF8
+F06C
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+C40C
+F02C
+C40D
+F02D
+C40E
+F02E
+C40F
+F02F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+ECF8
+F06C
+C027
+F2E8
+C028
+F2E9
+C029
+F2EA
+C02A
+F2EB
+0102
+51C6
+E105
+6BA7
+6BA8
+6BA9
+6BAA
+D026
+C2C6
+F029
+ECD1
+F06C
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+C000
+F02C
+C001
+F02D
+C002
+F02E
+C003
+F02F
+C29F
+F027
+C2A0
+F028
+C2A1
+F029
+C2A2
+F02A
+EC8E
+F06D
+C027
+F2A7
+C028
+F2A8
+C029
+F2A9
+C02A
+F2AA
+6A2C
+6A2D
+6A2E
+6A2F
+C2A7
+F027
+C2A8
+F028
+C2A9
+F029
+C2AA
+F02A
+ECD2
+F06E
+0A01
+E105
+0102
+6BA7
+6BA8
+6BA9
+6BAA
+C29F
+F02C
+C2A0
+F02D
+C2A1
+F02E
+C2A2
+F02F
+C2A7
+F027
+C2A8
+F028
+C2A9
+F029
+C2AA
+F02A
+ECC9
+F06E
+0A01
+E108
+C29F
+F2A7
+C2A0
+F2A8
+C2A1
+F2A9
+C2A2
+F2AA
+6A2C
+0E40
+6E2D
+0E1C
+6E2E
+0E46
+6E2F
+C2A7
+F027
+C2A8
+F028
+C2A9
+F029
+C2AA
+F02A
+ECE1
+F06D
+EC93
+F06E
+C028
+F242
+C029
+F243
+6A2C
+6A2D
+0E7A
+6E2E
+0E44
+6E2F
+C2E8
+F027
+C2E9
+F028
+C2EA
+F029
+C2EB
+F02A
+ECE1
+F06D
+EC93
+F06E
+C028
+F248
+C029
+F249
+6A2C
+6A2D
+0E7A
+6E2E
+0E44
+6E2F
+C2AF
+F027
+C2B0
+F028
+C2B1
+F029
+C2B2
+F02A
+ECE1
+F06D
+EC93
+F06E
+C028
+F24A
+C029
+F24B
+C2C6
+F24E
+0102
+0E01
+6F92
+6BC7
+51C7
+E153
+C2C6
+F2C7
+C2C7
+F029
+ECD1
+F06C
+C027
+F004
+C028
+F005
+C029
+F006
+C02A
+F007
+C2A7
+F02C
+C2A8
+F02D
+C2A9
+F02E
+C2AA
+F02F
+C004
+F027
+C005
+F028
+C006
+F029
+C007
+F02A
+ECE1
+F06D
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+C000
+F02C
+C001
+F02D
+C002
+F02E
+C003
+F02F
+C29B
+F027
+C29C
+F028
+C29D
+F029
+C29E
+F02A
+ECF7
+F06C
+C027
+F2A3
+C028
+F2A4
+C029
+F2A5
+C02A
+F2A6
+0102
+51C7
+6AEA
+0F70
+6EE9
+0E02
+22EA
+50EF
+0104
+6F04
+6B05
+C404
+F308
+0103
+0E21
+6F09
+D004
+0E01
+0104
+6F04
+6B05
+0104
+0E01
+1904
+E101
+5105
+E001
+D191
+0102
+05C7
+0104
+6F04
+6B05
+0E01
+1904
+E101
+5105
+E001
+D07F
+C2C3
+F028
+C2C4
+F029
+C404
+F02D
+C405
+F02E
+EC4E
+F06E
+C026
+F004
+C027
+F005
+C004
+F028
+C005
+F029
+ECE2
+F06C
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+0E96
+6E2C
+0EB2
+6E2D
+0ECC
+6E2E
+0E3D
+6E2F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+ECE1
+F06D
+C027
+F414
+C028
+F415
+C029
+F416
+C02A
+F417
+6A2C
+6A2D
+0E40
+6E2E
+6E2F
+C2A7
+F027
+C2A8
+F028
+C2A9
+F029
+C2AA
+F02A
+EC8E
+F06D
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+C2C3
+F008
+C2C4
+F009
+0E06
+80D8
+5608
+0E00
+5609
+C008
+F028
+C009
+F029
+ECE2
+F06C
+C027
+F004
+C028
+F005
+C029
+F006
+C02A
+F007
+C004
+F02C
+C005
+F02D
+C006
+F02E
+C007
+F02F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+ECE1
+F06D
+C027
+F2AB
+C028
+F2AC
+C029
+F2AD
+C02A
+F2AE
+D05F
+5104
+1105
+E11F
+6B14
+6B15
+6B16
+6B17
+C2A3
+F02C
+C2A4
+F02D
+C2A5
+F02E
+C2A6
+F02F
+C29B
+F027
+C29C
+F028
+C29D
+F029
+C29E
+F02A
+ECF7
+F06C
+C027
+F2AB
+C028
+F2AC
+C029
+F2AD
+C02A
+F2AE
+D03D
+0E03
+6E28
+6A29
+C404
+F02D
+C405
+F02E
+EC4E
+F06E
+C026
+F004
+C027
+F005
+C004
+F028
+C005
+F029
+ECE2
+F06C
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+0E96
+6E2C
+0EB2
+6E2D
+0ECC
+6E2E
+0E3D
+6E2F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+ECE1
+F06D
+C027
+F414
+C028
+F415
+C029
+F416
+C02A
+F417
+C2A7
+F2AB
+C2A8
+F2AC
+C2A9
+F2AD
+C2AA
+F2AE
+C40C
+F02C
+C40D
+F02D
+C40E
+F02E
+C40F
+F02F
+C414
+F027
+C415
+F028
+C416
+F029
+C417
+F02A
+ECF8
+F06C
+C027
+F414
+C028
+F415
+C029
+F416
+C02A
+F417
+C2AB
+F02C
+C2AC
+F02D
+C2AD
+F02E
+C2AE
+F02F
+C2A3
+F027
+C2A4
+F028
+C2A5
+F029
+C2A6
+F02A
+ECF8
+F06C
+C027
+F004
+C028
+F005
+C029
+F006
+C02A
+F007
+C2B3
+F02C
+C2B4
+F02D
+C2B5
+F02E
+C2B6
+F02F
+C004
+F027
+C005
+F028
+C006
+F029
+C007
+F02A
+ECE1
+F06D
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+C2AF
+F02C
+C2B0
+F02D
+C2B1
+F02E
+C2B2
+F02F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+ECF8
+F06C
+C027
+F410
+C028
+F411
+C029
+F412
+C02A
+F413
+C414
+F02C
+C415
+F02D
+C416
+F02E
+C417
+F02F
+C410
+F027
+C411
+F028
+C412
+F029
+C413
+F02A
+ECC9
+F06E
+0A01
+E104
+0104
+6B04
+6B05
+D027
+C404
+F2C7
+C2AB
+F02C
+C2AC
+F02D
+C2AD
+F02E
+C2AE
+F02F
+C2A3
+F027
+C2A4
+F028
+C2A5
+F029
+C2A6
+F02A
+ECF8
+F06C
+C027
+F2A3
+C028
+F2A4
+C029
+F2A5
+C02A
+F2A6
+0102
+51C7
+6AEA
+0F70
+6EE9
+0E02
+22EA
+50EF
+0104
+6F04
+6B05
+D668
+0102
+51C7
+0800
+E301
+D086
+0EF0
+6E00
+0E85
+6E01
+0E99
+6E02
+0E3E
+6E03
+C2C7
+F029
+ECD1
+F06C
+C027
+F004
+C028
+F005
+C029
+F006
+C02A
+F007
+C004
+F02C
+C005
+F02D
+C006
+F02E
+C007
+F02F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+ECE1
+F06D
+C027
+F414
+C028
+F415
+C029
+F416
+C02A
+F417
+C97F
+F02C
+C980
+F02D
+C981
+F02E
+C982
+F02F
+C414
+F027
+C415
+F028
+C416
+F029
+C417
+F02A
+ECF8
+F06C
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+C40C
+F02C
+C40D
+F02D
+C40E
+F02E
+C40F
+F02F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+ECF8
+F06C
+C027
+F420
+C028
+F421
+C029
+F422
+C02A
+F423
+0102
+05C7
+E105
+C2C3
+F2BF
+C2C4
+F2C0
+D005
+0E03
+03C7
+50F3
+6FBF
+6BC0
+0E21
+0103
+5D09
+E112
+C2C7
+F309
+0102
+51C7
+6AEA
+0F70
+6EE9
+0E02
+22EA
+CFEF
+F30A
+0103
+290C
+6F0C
+0E64
+5D0C
+E101
+6B0C
+D00A
+C40C
+F420
+C40D
+F421
+C40E
+F422
+C40F
+F423
+6BBF
+6BC0
+D0E8
+C40C
+F02C
+C40D
+F02D
+C40E
+F02E
+C40F
+F02F
+C474
+F027
+C475
+F028
+C476
+F029
+C477
+F02A
+ECF7
+F06C
+C027
+F410
+C028
+F411
+C029
+F412
+C02A
+F413
+6A2C
+6A2D
+6A2E
+6A2F
+C410
+F027
+C411
+F028
+C412
+F029
+C413
+F02A
+ECD2
+F06E
+0A01
+E101
+D0B2
+0EF0
+6E2C
+0E85
+6E2D
+0E99
+6E2E
+0E3E
+6E2F
+C410
+F027
+C411
+F028
+C412
+F029
+C413
+F02A
+EC8E
+F06D
+C027
+F410
+C028
+F411
+C029
+F412
+C02A
+F413
+0EA4
+6E2C
+0E70
+6E2D
+0E7D
+6E2E
+0E3F
+6E2F
+C410
+F027
+C411
+F028
+C412
+F029
+C413
+F02A
+ECF8
+F06C
+EC93
+F06E
+C028
+F2BF
+C029
+F2C0
+0E03
+6E28
+6A29
+C2BF
+F02D
+C2C0
+F02E
+EC4E
+F06E
+C026
+F2BF
+C027
+F2C0
+0102
+51BF
+11C0
+E109
+C40C
+F420
+C40D
+F421
+C40E
+F422
+C40F
+F423
+D065
+51C3
+5DBF
+51C4
+59C0
+E204
+C2C3
+F2BF
+C2C4
+F2C0
+C2BF
+F028
+C2C0
+F029
+ECE2
+F06C
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+0E96
+6E2C
+0EB2
+6E2D
+0ECC
+6E2E
+0E3D
+6E2F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+ECE1
+F06D
+C027
+F410
+C028
+F411
+C029
+F412
+C02A
+F413
+C97F
+F02C
+C980
+F02D
+C981
+F02E
+C982
+F02F
+C410
+F027
+C411
+F028
+C412
+F029
+C413
+F02A
+ECF8
+F06C
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+C40C
+F02C
+C40D
+F02D
+C40E
+F02E
+C40F
+F02F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+ECF8
+F06C
+C027
+F420
+C028
+F421
+C029
+F422
+C02A
+F423
+D00B
+C40C
+F420
+C40D
+F421
+C40E
+F422
+C40F
+F423
+0102
+6BBF
+6BC0
+0012
+0105
+051F
+E11D
+0E20
+0104
+6F04
+6B05
+6B00
+5104
+5D00
+0E00
+5505
+E213
+5100
+6AEA
+0FC8
+6EE9
+0E02
+22EA
+50EF
+6EE6
+5100
+6AEA
+0F50
+6EE9
+0E02
+22EA
+52E5
+50E7
+6EEF
+2B00
+D7E8
+0012
+0105
+051F
+E10E
+0104
+6B00
+0E20
+5D00
+E209
+5100
+6AEA
+0FC8
+6EE9
+0E02
+22EA
+6AEF
+2B00
+D7F4
+0012
+0105
+051F
+E123
+0102
+51C7
+6AEA
+0FC8
+6EE9
+0E02
+22EA
+50EF
+6E00
+6A01
+90D8
+5001
+E604
+0EFF
+5C00
+0E00
+5801
+E211
+51C7
+6AEA
+0FC8
+6EE9
+0E02
+22EA
+28EF
+6EE6
+51C7
+6AEA
+0FC8
+6EE9
+0E02
+22EA
+52E5
+50E7
+6EEF
+0012
+0105
+051F
+E101
+D045
+6A2C
+6A2D
+6A2E
+6A2F
+C42C
+F027
+C42D
+F028
+C42E
+F029
+C42F
+F02A
+ECD2
+F06E
+0A01
+E11B
+C97B
+F02C
+C97C
+F02D
+C97D
+F02E
+C97E
+F02F
+C42C
+F027
+C42D
+F028
+C42E
+F029
+C42F
+F02A
+ECE1
+F06D
+C027
+F42C
+C028
+F42D
+C029
+F42E
+C02A
+F42F
+D01A
+C977
+F02C
+C978
+F02D
+C979
+F02E
+C97A
+F02F
+C42C
+F027
+C42D
+F028
+C42E
+F029
+C42F
+F02A
+ECE1
+F06D
+C027
+F42C
+C028
+F42D
+C029
+F42E
+C02A
+F42F
+0012
+0100
+0E13
+6F8A
+0E1C
+6F8B
+6B97
+0EF5
+6F98
+6B99
+6B9A
+0E30
+6F9B
+0E39
+6F9C
+EF86
+F06A
+0100
+0E0C
+6F8A
+0E10
+6F8B
+6B97
+0EE1
+6F98
+6B99
+6B9A
+0E2E
+6F9B
+0E3E
+6F9C
+EF86
+F06A
+0100
+6B90
+C090
+FFDE
+8284
+0100
+6B70
+0100
+5187
+E103
+0100
+0E01
+6F87
+0100
+5186
+E103
+0100
+0E01
+6F86
+0100
+518B
+0100
+80D8
+5588
+E202
+C08B
+F088
+0100
+5187
+0100
+2588
+0841
+E206
+0E41
+0100
+80D8
+5587
+0100
+6F88
+C086
+F092
+0100
+6B91
+0100
+5191
+2B91
+6AEA
+0F60
+6EE9
+0E00
+22EA
+CFEF
+F093
+D85B
+0100
+6B90
+0100
+0E01
+6F94
+0100
+5193
+E052
+0100
+0594
+E101
+D8F1
+D8FF
+0E01
+0100
+1994
+0100
+6F94
+0100
+0594
+E108
+D8CE
+0E40
+0100
+5D92
+E202
+0100
+2B92
+D9A5
+0100
+2B90
+0E04
+0100
+5D90
+E202
+0E00
+D001
+0E01
+6E03
+0E3C
+0100
+5D93
+E002
+0E00
+D001
+0E01
+6E02
+0E3A
+0100
+5D93
+E002
+0E00
+D001
+0E01
+6E01
+0E2E
+0100
+5D93
+E002
+0E00
+D001
+0E01
+1001
+1002
+1403
+6E00
+0100
+518A
+0100
+5D90
+E202
+0E00
+D001
+0E01
+1000
+E00D
+0100
+5191
+2B91
+6AEA
+0F60
+6EE9
+0E00
+22EA
+CFEF
+F093
+D804
+0100
+6B90
+D7AB
+0012
+0100
+519C
+80D8
+5593
+E302
+0E00
+D001
+0E01
+6E00
+519B
+5D93
+E302
+0E00
+D001
+0E01
+1000
+E006
+6B8C
+6B8D
+6B8E
+6B8F
+6B95
+D071
+519B
+5D93
+6F8C
+6B8D
+6B8E
+6B8F
+298B
+0BFE
+42E8
+6E00
+6A01
+6A02
+6A03
+C08C
+F026
+C08D
+F027
+C08E
+F028
+C08F
+F029
+C000
+F02B
+C001
+F02C
+C002
+F02D
+C003
+F02E
+EC48
+F070
+C022
+F08C
+C023
+F08D
+C024
+F08E
+C025
+F08F
+C08A
+F000
+6A01
+6A02
+6A03
+C08C
+F026
+C08D
+F027
+C08E
+F028
+C08F
+F029
+C000
+F02B
+C001
+F02C
+C002
+F02D
+C003
+F02E
+EC48
+F070
+C022
+F08C
+C023
+F08D
+C024
+F08E
+C025
+F08F
+0100
+5197
+278C
+5198
+238D
+5199
+238E
+519A
+238F
+0E3C
+5D93
+E002
+0E00
+D001
+0E01
+6E01
+0E3A
+5D93
+E002
+0E00
+D001
+0E01
+6E00
+0E2E
+5D93
+E002
+0E00
+D001
+0E01
+1000
+1001
+E00B
+518B
+24E8
+6E00
+0100
+5000
+0100
+278C
+0E00
+238D
+238E
+238F
+0012
+0100
+0E75
+6F96
+D8F0
+0100
+0587
+6F96
+D8EC
+0100
+0E3F
+6F96
+D8E8
+0100
+0E15
+6F96
+D8E4
+0100
+0592
+6F96
+D8E0
+0100
+0592
+6F96
+EF94
+F06C
+0100
+6B95
+5188
+5D95
+E209
+5195
+6AEA
+0F00
+6EE9
+0E08
+22EA
+6AEF
+2B95
+D7F4
+0012
+0100
+518C
+118D
+118E
+118F
+E101
+D0AE
+0100
+518C
+0100
+6F95
+C095
+FFF6
+C08D
+F000
+C08E
+F001
+C08F
+F002
+0100
+6A03
+5000
+0100
+6F95
+C095
+FFF7
+C08E
+F000
+C08F
+F001
+0100
+6A02
+6A03
+5000
+0100
+6F95
+C095
+FFF8
+0100
+6B95
+0100
+5188
+0100
+5D95
+E301
+D07A
+0009
+CFF5
+F096
+0100
+5189
+E01C
+0100
+3989
+0BF0
+6E00
+0EF0
+0100
+1596
+5C00
+E207
+0100
+3989
+0BF0
+0100
+5D96
+0100
+6F96
+0E0F
+0100
+1596
+0100
+5D89
+E206
+0100
+5189
+0100
+5D96
+0100
+6F96
+0100
+0594
+E11E
+0EF0
+0100
+1596
+6EE6
+0100
+5195
+6AEA
+0F00
+6EE9
+0E08
+22EA
+52E5
+50E7
+6EEF
+0100
+3996
+0BF0
+0BF0
+6EE6
+0100
+2995
+6AEA
+0F00
+6EE9
+0E08
+22EA
+52E5
+50E7
+6EEF
+D033
+0100
+3996
+0B0F
+0B0F
+6E00
+0100
+5195
+6AEA
+0F00
+6EE9
+0E08
+22EA
+50EF
+0BF0
+1000
+6EE6
+0100
+5195
+6AEA
+0F00
+6EE9
+0E08
+22EA
+52E5
+50E7
+6EEF
+0E0F
+0100
+1596
+6E00
+0100
+2995
+6AEA
+0F00
+6EE9
+0E08
+22EA
+50EF
+0BF0
+1000
+6EE6
+0100
+2995
+6AEA
+0F00
+6EE9
+0E08
+22EA
+52E5
+50E7
+6EEF
+0E02
+0100
+2795
+D780
+0100
+298B
+0BFE
+42E8
+6E00
+0100
+5000
+0100
+278C
+0E00
+238D
+238E
+238F
+0012
+8284
+0100
+6B95
+0100
+5188
+0100
+5D95
+E20D
+0100
+5195
+6AEA
+0F00
+6EE9
+0E08
+22EA
+CFEF
+F096
+D807
+0100
+2B95
+D7EE
+0012
+9284
+D801
+0012
+0101
+9084
+0100
+9083
+BF96
+8283
+9083
+AF96
+9283
+8083
+BD96
+8283
+9083
+AD96
+9283
+8083
+BB96
+8283
+9083
+AB96
+9283
+8083
+B996
+8283
+9083
+A996
+9283
+8083
+B796
+8283
+9083
+A796
+9283
+8083
+B596
+8283
+9083
+A596
+9283
+8083
+B396
+8283
+9083
+A396
+9283
+8083
+B196
+8283
+9083
+A196
+9283
+8083
+8084
+0101
+0100
+0100
+6B96
+0012
+9E21
+D005
+9E21
+AE29
+D002
+6C29
+8E21
+C029
+F023
+6A22
+6A33
+6A32
+0E86
+6E24
+6A25
+EF4C
+F06F
+9E21
+D008
+9E21
+AE29
+D005
+6C28
+1E29
+6AE8
+2229
+8E21
+C029
+F023
+C028
+F022
+6A33
+6A32
+0E8E
+6E24
+6A25
+EF4C
+F06F
+7E2F
+6A21
+EC88
+F06F
+ECA0
+F06F
+B621
+EF30
+F06F
+A221
+D00A
+AA21
+D003
+BE21
+EF30
+F06F
+A421
+EF3C
+F06F
+EF39
+F06F
+AA21
+D005
+AC21
+EF3C
+F06F
+EF39
+F06F
+A021
+D00A
+A821
+D008
+BE21
+D004
+A421
+D002
+EF45
+F06F
+EF49
+F06F
+6A32
+6A25
+502F
+5C2A
+6E31
+E310
+C027
+F033
+C028
+F022
+C029
+F023
+C02A
+F030
+C02C
+F027
+C02D
+F028
+C02E
+F029
+3A21
+D009
+C02C
+F033
+C02D
+F022
+C02E
+F023
+C02F
+F030
+6C31
+9E21
+BC21
+8E21
+C030
+F024
+B021
+EF78
+F06F
+0E1A
+6031
+EF78
+F06F
+6A24
+6A2A
+A421
+D008
+6C27
+1E28
+1E29
+1E2A
+6AE8
+2228
+2229
+222A
+AC21
+D008
+6C33
+1E22
+1E23
+1E24
+6AE8
+2222
+2223
+2224
+6A26
+5231
+E007
+342A
+3229
+3228
+3227
+3226
+2E31
+D7F9
+5027
+2633
+5028
+2222
+5029
+2223
+502A
+2224
+C026
+F032
+9E21
+AE24
+D00B
+6C32
+1E33
+1E22
+1E23
+1E24
+6AE8
+2233
+2222
+2223
+2224
+8E21
+A024
+D006
+80D8
+3223
+3222
+3233
+3232
+2A30
+C030
+F024
+EF4C
+F06F
+6A21
+EC88
+F06F
+ECA0
+F06F
+B621
+EF30
+F06F
+A221
+D005
+BA21
+EF30
+F06F
+EF37
+F06F
+BA21
+EF43
+F06F
+A021
+D005
+B821
+EF30
+F06F
+EF43
+F06F
+B821
+EF37
+F06F
+6A25
+0E7F
+242A
+6E24
+6AE8
+2225
+502F
+5E24
+6AE8
+5A25
+0E1A
+6E30
+6A2A
+6A32
+6A33
+6A22
+6A23
+502C
+5E27
+502D
+5A28
+502E
+5A29
+0E00
+5A2A
+E709
+502C
+2627
+502D
+2228
+502E
+2229
+0E00
+222A
+D001
+8A32
+90D8
+3627
+3628
+3629
+362A
+90D8
+3632
+3633
+3622
+3623
+2E30
+D7E1
+5029
+1028
+1027
+A4D8
+8A32
+EF4C
+F06F
+6A21
+EC88
+F06F
+ECA0
+F06F
+B621
+EF30
+F06F
+A221
+D005
+B821
+EF30
+F06F
+EF37
+F06F
+AA21
+D005
+B021
+EF30
+F06F
+EF37
+F06F
+B021
+D002
+A821
+D002
+EF43
+F06F
+6A25
+502F
+242A
+6E24
+6AE8
+2225
+0E7E
+5E24
+6AE8
+5A25
+6A32
+6A33
+6A22
+6A23
+502E
+0229
+CFF4
+F023
+CFF3
+F022
+502D
+0229
+50F3
+2633
+50F4
+2222
+0E00
+2223
+502E
+0228
+50F3
+2633
+50F4
+2222
+0E00
+2223
+502C
+0229
+50F3
+2632
+50F4
+2233
+0E00
+2222
+2223
+502D
+0228
+50F3
+2632
+50F4
+2233
+0E00
+2222
+2223
+502E
+0227
+50F3
+2632
+50F4
+2233
+0E00
+2222
+2223
+502C
+0228
+50F4
+2632
+0E00
+2233
+2222
+2223
+502D
+0227
+50F4
+2632
+0E00
+2233
+2222
+2223
+EF4C
+F06F
+C028
+F032
+5028
+022D
+CFF4
+F027
+CFF3
+F026
+5029
+022E
+CFF4
+F029
+CFF3
+F028
+022D
+50F3
+2627
+50F4
+2228
+6AE8
+2229
+5032
+022E
+50F3
+2627
+50F4
+2228
+6AE8
+2229
+0C00
+6A21
+EC88
+F06F
+B621
+EF76
+F06E
+A221
+D00A
+B421
+D003
+0E7F
+6E29
+D019
+0E80
+6E29
+D016
+6A29
+D014
+B021
+D7FC
+0E87
+602A
+D7F1
+0E7E
+642A
+D7F6
+0E86
+5C2A
+E004
+90D8
+3229
+2A2A
+D7F9
+A421
+D003
+6C29
+AE29
+D7EA
+0012
+6A21
+EC88
+F06F
+B621
+EF9D
+F06E
+A221
+D00E
+B421
+D005
+0E7F
+6E29
+0EFF
+6E28
+D01F
+0E80
+6E29
+6A28
+D01B
+6A29
+6A28
+D018
+B021
+D7FB
+0E8F
+602A
+D7ED
+0E7E
+642A
+D7F5
+0E8E
+5C2A
+E005
+90D8
+3229
+3228
+2A2A
+D7F8
+A421
+D006
+6C28
+1E29
+6AE8
+2229
+AE29
+D7E5
+0012
+ECDB
+F06E
+B621
+0C00
+B021
+0C01
+0C00
+ECDB
+F06E
+B621
+0C00
+B021
+0C00
+B421
+0C00
+0C01
+ECDB
+F06E
+B621
+0C00
+B021
+0C00
+A421
+0C00
+0C01
+6A21
+EC88
+F06F
+ECA0
+F06F
+B621
+0012
+AE21
+D008
+A021
+D004
+A821
+D002
+8021
+0012
+9021
+0012
+502F
+5C2A
+E10B
+502E
+5C29
+E108
+502D
+5C28
+E105
+502C
+5C27
+E102
+8021
+0012
+A0D8
+D002
+8E21
+D010
+502A
+C02F
+F02A
+6E2F
+5029
+C02E
+F029
+6E2E
+5028
+C02D
+F028
+6E2D
+5027
+C02C
+F027
+6E2C
+502F
+5C2A
+E010
+0FFF
+E009
+9021
+B421
+D003
+AE21
+8421
+0012
+AE21
+9421
+0012
+2A2F
+90D8
+322E
+322D
+322C
+502C
+5E27
+502D
+5A28
+502E
+5A29
+BE29
+D7EA
+90D8
+3627
+3628
+3629
+2E2A
+D7F8
+D7C8
+0E7F
+6E2A
+0EFF
+6E29
+6E28
+6E27
+0012
+0E7F
+BE21
+0EFF
+6E2A
+D002
+0E7F
+6E2A
+0E80
+6E29
+6A28
+6A27
+D7F3
+AE21
+D004
+0E80
+6E2A
+6A29
+D7F7
+6A2A
+6A29
+D7F4
+5023
+1022
+1033
+1032
+E0F8
+BE25
+D7F0
+BE23
+D00C
+5024
+1025
+E0EB
+90D8
+3632
+3633
+3622
+3623
+0624
+A0D8
+0625
+D7F2
+5025
+E1D4
+2824
+E0D2
+AE32
+D011
+0E7F
+1432
+E102
+A033
+D00C
+2A33
+6AE8
+2222
+2223
+E307
+80D8
+3223
+3222
+3233
+2A24
+2824
+E0BF
+5024
+E0C9
+C033
+F027
+C022
+F028
+3423
+6E29
+3024
+6E2A
+3229
+9E2A
+BE21
+8E2A
+EF36
+F06F
+3629
+362A
+E302
+8421
+7E21
+E106
+8021
+6A2A
+6A29
+6A28
+6A27
+0012
+282A
+E003
+80D8
+3229
+0012
+90D8
+3229
+E102
+8221
+0012
+8621
+0012
+362E
+362F
+E302
+8C21
+7E21
+E106
+8821
+6A2F
+6A2E
+6A2D
+6A2C
+0012
+282F
+E003
+80D8
+322E
+0012
+90D8
+322E
+E1EA
+8A21
+0012
+CFD9
+FFE6
+CFDA
+FFE6
+CFE1
+FFD9
+CFE2
+FFDA
+0E0C
+24E1
+E302
+68E1
+52E6
+6EE1
+50D9
+0FFA
+6EE9
+0EFF
+20DA
+6EEA
+0E01
+CFEE
+FFDB
+0E02
+CFEE
+FFDB
+0E03
+CFEE
+FFDB
+0E04
+CFEE
+FFDB
+D863
+50D9
+0F01
+6EE9
+0E00
+20DA
+6EEA
+CFEE
+FFE6
+CFEE
+FFE6
+CFEE
+FFE6
+CFEF
+FFE6
+EC72
+F080
+6E00
+0E06
+5CE1
+E202
+6AE1
+52E5
+6EE1
+5000
+6EDF
+0E85
+14DF
+E004
+D84D
+6AEE
+6AED
+D023
+0E09
+CFDB
+F000
+0E0A
+CFDB
+F001
+0E82
+2600
+0EFF
+2201
+D83F
+C000
+FFEE
+C001
+FFED
+0E7E
+6EF3
+0E09
+CFF3
+FFDB
+0E0A
+6ADB
+50D9
+0F01
+6EE6
+0E00
+20DA
+6EE6
+D826
+EC2D
+F076
+52E5
+52E5
+52E5
+52E5
+0E01
+CFDB
+F000
+0E02
+CFDB
+F001
+0E03
+CFDB
+F002
+0E04
+CFDB
+F003
+C000
+F026
+C001
+F027
+C002
+F028
+C003
+F029
+0E0C
+5CE1
+E202
+6AE1
+52E5
+6EE1
+52E5
+CFE5
+FFDA
+CFE7
+FFD9
+0012
+50D9
+0F05
+6EE6
+0E00
+20DA
+6EE6
+0012
+0EF8
+CFDB
+FFE9
+0EF9
+CFDB
+FFEA
+0012
+5026
+022B
+CFF3
+F022
+CFF4
+F023
+022C
+50F3
+2623
+0E00
+20F4
+6E24
+5026
+022D
+50F3
+2624
+0E00
+20F4
+6E25
+5026
+022E
+50F3
+2625
+5027
+022B
+50F3
+2623
+50F4
+2224
+0E00
+2225
+5027
+022C
+50F3
+2624
+50F4
+2225
+5027
+022D
+50F3
+2625
+5028
+022B
+50F3
+2624
+50F4
+2225
+5028
+022C
+50F3
+2625
+5029
+022B
+50F3
+2625
+0012
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+8009
+0000
+0000
+0000
+F06F
+0000
+0000
+0000
+E03F
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+2000
+0000
+0000
+0000
+F03A
+0000
+0000
+4B00
+A0FF
+0000
+0000
+FF5C
+0091
+0000
+6D00
+71FE
+0000
+0100
+FD7E
+0060
+0000
+8F01
+50FD
+0000
+0000
+FB9F
+0040
+0000
+0000
+30FA
+0000
+0000
+0000
+0020
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0100
+BC69
+72CA
+0000
+9F00
+DCFE
+FFDF
+00B2
+F81D
+0020
+FD05
+30FF
+30AF
+0000
+909F
+D02E
+00F8
+2C00
+00F5
+F006
+00F8
+ED04
+0030
+F005
+30AF
+B18F
+0000
+E00C
+FD1D
+00F8
+1600
+40DF
+9F00
+DCFF
+FFDE
+00C3
+0100
+BC69
+73CA
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+9002
+0000
+0000
+3001
+B00A
+0000
+0000
+F004
+602F
+0000
+0000
+F004
+97AF
+7777
+7777
+F079
+FFFF
+FFFF
+FFFF
+F0FF
+2212
+2222
+2222
+F026
+0000
+0000
+0000
+F004
+0000
+0000
+0000
+D003
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+4001
+D007
+0000
+0000
+F07F
+804F
+0000
+1C00
+F0FE
+00CC
+0000
+EF02
+F057
+00F7
+0000
+E22E
+F007
+00F8
+0100
+20DE
+F007
+10CE
+2D00
+00E2
+F007
+D64F
+FE58
+0030
+F007
+FF06
+B1FF
+0000
+F007
+1400
+0052
+0000
+8005
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0002
+2009
+0000
+0000
+507F
+406F
+0000
+0000
+D02E
+00DB
+5900
+0000
+F007
+00F8
+8E00
+0000
+F004
+00EA
+CF00
+0010
+F006
+309F
+FF07
+0090
+E01E
+FC1E
+87DF
+79FB
+50EF
+9D01
+00C6
+FF7E
+00D5
+0000
+0000
+2100
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+B02B
+0000
+0000
+0600
+E0FF
+0000
+0000
+CF02
+E069
+0000
+0000
+B17F
+E009
+0000
+2C00
+00E6
+E009
+0000
+FB07
+0010
+E009
+0000
+FCCF
+CCCC
+FDCE
+D0DD
+EEDE
+EEEE
+FEEF
+E0EE
+0000
+0000
+E009
+0000
+0000
+0000
+C008
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0012
+AB78
+EDCD
+0000
+20CE
+EDFF
+FACC
+0000
+B05F
+00F9
+F006
+0000
+F008
+00F9
+B00A
+0000
+F004
+00F9
+C00A
+0000
+F004
+00F9
+F308
+0000
+F00B
+00F9
+FE01
+1362
+90BF
+00F9
+4E00
+FFFF
+00FB
+0011
+0100
+A96A
+0040
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+5603
+3065
+0000
+4B00
+FFFF
+FFFF
+00A2
+FE08
+8F96
+6A95
+30FF
+906F
+F801
+0000
+D03E
+00EC
+F008
+0000
+F006
+00F6
+E00A
+0000
+F004
+00F7
+F307
+0000
+F009
+10CD
+EF01
+1372
+90AF
+204D
+2D00
+FFFF
+00F9
+0000
+0000
+8647
+0010
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0011
+0000
+0000
+0000
+00FA
+0000
+0000
+0000
+00FA
+0000
+0000
+9004
+00FA
+0000
+3900
+F0EF
+00FA
+0100
+FF7D
+40E9
+00FA
+BF05
+94FF
+0000
+18FA
+FBEF
+0050
+0000
+FFFE
+10D7
+0000
+0000
+B4FF
+0000
+0000
+0000
+0052
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+7802
+0050
+AD03
+00B4
+FF7F
+00FC
+FC3F
+66FF
+43FA
+A0AF
+10CD
+FE1C
+0070
+F00B
+00F5
+FE01
+0000
+F005
+00F5
+BF00
+0010
+F004
+00EC
+FF07
+00B0
+F00A
+D96F
+78CF
+32FB
+909F
+EF07
+00E6
+FF9F
+00FB
+0100
+0000
+8803
+0050
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0300
+2055
+0000
+0000
+DF04
+FBFF
+0010
+600B
+D74F
+9F45
+00D0
+E01C
+00DD
+0500
+00F5
+F005
+00F7
+0000
+00F8
+F004
+00F8
+0000
+00F7
+F008
+20BE
+0600
+00F2
+A05F
+F92E
+7F54
+7C94
+00FC
+AF02
+FFFF
+FEFF
+0070
+0100
+7746
+3075
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+A106
+0000
+8009
+0000
+F91F
+0000
+F06F
+0000
+F50D
+0000
+E03F
+0000
+1000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0030
+0000
+0000
+AEBA
+00F0
+0000
+0000
+E9FF
+0030
+0000
+0000
+0053
+0000
+0000
+0000
+0000
+0010
+0000
+0000
+8C97
+00F0
+0000
+0000
+FBFF
+0050
+0000
+0000
+1075
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+6A75
+00E0
+0000
+0000
+FDFF
+0070
+0000
+0000
+30A8
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+1000
+0000
+0000
+0000
+FF2C
+00A0
+0000
+0000
+78DD
+00FA
+0000
+0000
+00F2
+005F
+0000
+0000
+00F0
+104F
+0000
+0000
+23EA
+00DC
+0000
+0000
+FF4F
+00E2
+0000
+0000
+5401
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+1111
+1111
+1011
+0000
+FFFF
+FFFF
+F0FF
+0000
+A79F
+7777
+7077
+0000
+00D6
+0000
+0000
+0200
+00F3
+0000
+0000
+0100
+CBFF
+BBBB
+B0BB
+0000
+FE4F
+EEEE
+E0EE
+0000
+20AB
+0000
+0000
+0100
+00F1
+0000
+0000
+0200
+55FA
+5555
+5055
+0000
+FFAF
+FFFF
+F0FF
+0000
+4402
+4444
+4044
+CFD9
+FFE6
+CFDA
+FFE6
+CFE1
+FFD9
+CFE2
+FFDA
+0E26
+24E1
+E302
+68E1
+52E6
+6EE1
+50D9
+0F05
+D9E1
+EC72
+F080
+6E00
+0E06
+5CE1
+E202
+6AE1
+52E5
+6EE1
+5000
+6EDF
+0E80
+5CDF
+E005
+0E0B
+50DB
+E012
+04DF
+E010
+0E21
+0104
+6F7C
+6B7D
+0E01
+68DB
+0E02
+68DB
+0E03
+68DB
+0E7F
+6EF3
+0E04
+CFF3
+FFDB
+D18F
+0E04
+5CDF
+E10E
+DA3E
+0E01
+CFEE
+FFDB
+0E02
+CFEE
+FFDB
+0E03
+CFEE
+FFDB
+0E04
+CFEE
+FFDB
+D17E
+04DF
+E110
+0E21
+0104
+6F7C
+6B7D
+0E01
+6ADB
+0E02
+6ADB
+0E80
+6EF3
+0E03
+CFF3
+FFDB
+0E04
+68DB
+D16C
+50D9
+0F0C
+D998
+ECB6
+F06F
+6E00
+0E06
+5CE1
+E202
+6AE1
+52E5
+6EE1
+5000
+0EFA
+C026
+FFDB
+0EFB
+C027
+FFDB
+0EFC
+C028
+FFDB
+0EFD
+C029
+FFDB
+D9A6
+0EF3
+6E2C
+0E04
+6E2D
+0E35
+6E2E
+0E3F
+D987
+ECC9
+F06E
+0A01
+E109
+D9B3
+D984
+ECF7
+F06C
+D967
+D9ED
+D984
+D9AC
+D016
+0E0C
+06DB
+0E0D
+E201
+06DB
+D98B
+6A2C
+6A2D
+6A2E
+0E3F
+D96F
+D976
+0E16
+CFDB
+F004
+0E17
+CFDB
+F005
+0E18
+CFDB
+F006
+0E19
+D966
+ECE1
+F06D
+D949
+D9CF
+ECF8
+F06C
+0E1A
+C027
+FFDB
+0E1B
+C028
+FFDB
+0E1C
+C029
+FFDB
+0E1D
+C02A
+FFDB
+0E16
+CFDB
+F027
+0E17
+CFDB
+F028
+0E18
+CFDB
+F029
+0E19
+CFDB
+F02A
+0E1A
+CFDB
+F02C
+0E1B
+CFDB
+F02D
+0E1C
+CFDB
+F02E
+0E1D
+CFDB
+F02F
+EC8E
+F06D
+D91F
+0E12
+C027
+FFDB
+0E13
+C028
+FFDB
+0E14
+C029
+FFDB
+0E15
+C02A
+FFDB
+D94D
+0E12
+CFDB
+F02C
+0E13
+CFDB
+F02D
+0E14
+CFDB
+F02E
+0E15
+D962
+0E0E
+C027
+FFDB
+0E0F
+C028
+FFDB
+0E10
+C029
+FFDB
+0E11
+C02A
+FFDB
+0E3D
+6EF3
+0E1E
+CFF3
+FFDB
+0E7E
+6EF3
+0E1F
+CFF3
+FFDB
+0E0D
+6EF3
+0E20
+CFF3
+FFDB
+0EBF
+6EF3
+0E21
+CFF3
+FFDB
+0E0E
+CFDB
+F000
+0E0F
+CFDB
+F001
+0E10
+CFDB
+F002
+0E11
+CFDB
+F003
+0E3A
+6E2C
+0E3F
+6E2D
+0ED4
+6E2E
+0EC0
+D8EA
+ECF8
+F06C
+0E22
+C027
+FFDB
+0E23
+C028
+FFDB
+0E24
+C029
+FFDB
+0E25
+C02A
+FFDB
+0E0E
+CFDB
+F027
+0E0F
+CFDB
+F028
+0E10
+CFDB
+F029
+0E11
+CFDB
+F02A
+0E1E
+CFDB
+F02C
+0E1F
+CFDB
+F02D
+0E20
+CFDB
+F02E
+0E21
+D909
+0E22
+CFDB
+F02C
+0E23
+CFDB
+F02D
+0E24
+CFDB
+F02E
+0E25
+CFDB
+F02F
+EC8E
+F06D
+D907
+0E12
+CFDB
+F000
+0E13
+CFDB
+F001
+0E14
+CFDB
+F002
+0E15
+CFDB
+F003
+D8CD
+0E01
+CFDB
+F02C
+0E02
+CFDB
+F02D
+0E03
+CFDB
+F02E
+0E04
+D8E2
+C027
+F004
+C028
+F005
+C029
+F006
+C02A
+F007
+D878
+6A04
+0E80
+6E05
+0E31
+6E06
+0E3F
+6E07
+D8C9
+C027
+F008
+C028
+F009
+C029
+F00A
+C02A
+F00B
+D8CC
+D8E1
+ECE1
+F06D
+D869
+0E83
+6E14
+0E80
+6E15
+0E5E
+6E16
+0EB9
+6E17
+D8B3
+C027
+F018
+C028
+F019
+C029
+F01A
+C02A
+F01B
+D8B6
+C014
+F027
+C015
+F028
+C016
+F029
+C017
+F02A
+ECE1
+F06D
+C027
+F010
+C028
+F011
+C029
+F012
+C02A
+F013
+0E01
+CFDB
+F01C
+0E02
+CFDB
+F01D
+0E03
+CFDB
+F01E
+0E04
+CFDB
+F01F
+C01C
+F02C
+C01D
+F02D
+C01E
+F02E
+C01F
+F02F
+ECF8
+F06C
+C027
+F00C
+C028
+F00D
+C029
+F00E
+C02A
+F00F
+D820
+0E01
+CFDB
+F000
+0E02
+CFDB
+F001
+0E03
+CFDB
+F002
+0E04
+CFDB
+F003
+C000
+F026
+C001
+F027
+C002
+F028
+C003
+F029
+0E26
+5CE1
+E202
+6AE1
+52E5
+6EE1
+52E5
+CFE5
+FFDA
+CFE7
+FFD9
+0012
+D864
+D882
+ECF8
+F06C
+EF01
+F076
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+0012
+6EE6
+0E00
+20DA
+6EE6
+D87F
+CFEE
+FFE6
+CFEE
+FFE6
+CFEE
+FFE6
+CFEF
+FFE6
+0012
+6E2F
+EF17
+F076
+CFDB
+F007
+D86A
+EF0E
+F076
+ECF7
+F06C
+0E16
+C027
+FFDB
+0E17
+C028
+FFDB
+0E18
+C029
+FFDB
+0E19
+C02A
+FFDB
+0012
+0EFA
+CFDB
+F000
+0EFB
+CFDB
+F001
+0EFC
+CFDB
+F002
+0EFD
+CFDB
+F003
+0012
+0E12
+CFDB
+F027
+0E13
+CFDB
+F028
+0E14
+CFDB
+F029
+0E15
+CFDB
+F02A
+0012
+0EFA
+CFDB
+F004
+0EFB
+CFDB
+F005
+0EFC
+CFDB
+F006
+0EFD
+0012
+0E0C
+CFDB
+F028
+0E0D
+CFDB
+F029
+EFE4
+F06C
+CFDB
+F02F
+EFE1
+F06D
+C027
+F02C
+C028
+F02D
+C029
+F02E
+C02A
+F02F
+0012
+0E01
+C027
+FFDB
+0E02
+C028
+FFDB
+0E03
+C029
+FFDB
+0E04
+C02A
+FFDB
+0012
+C004
+F027
+C005
+F028
+C006
+F029
+C007
+F02A
+0012
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+0012
+6A2C
+6A2D
+6A2E
+0E3F
+6E2F
+0012
+50D9
+0FFA
+6EE9
+0EFF
+20DA
+6EEA
+0012
+CFD9
+FFE6
+CFDA
+FFE6
+CFE1
+FFD9
+CFE2
+FFDA
+D85B
+3401
+E211
+5000
+08FE
+0E00
+5401
+E20C
+D876
+E005
+D86C
+0E80
+6EEE
+68EE
+D047
+D867
+0E80
+6EEE
+0E7F
+D00E
+D847
+90D8
+5001
+E604
+0E01
+5C00
+0E00
+5801
+E20B
+D861
+E005
+D857
+6AEE
+0E80
+6EEE
+D032
+D852
+6AEE
+6AEE
+D02E
+D847
+CFEE
+F000
+CFEE
+F001
+CFEE
+F002
+CFEF
+F003
+D832
+C000
+FFEE
+C001
+FFEE
+C002
+FFEE
+C003
+FFEE
+D821
+5000
+0B01
+E005
+D825
+0E02
+D83A
+8EEF
+D004
+D820
+0E02
+D835
+9EEF
+D814
+90D8
+3201
+3200
+D818
+0E03
+D82D
+C000
+FFEF
+D81A
+E004
+D811
+0E03
+D826
+8EEF
+52E5
+CFE5
+FFDA
+CFE7
+FFD9
+0012
+D813
+0E04
+D81C
+CFEE
+F000
+CFEF
+F001
+0012
+0EFA
+CFDB
+FFE9
+0EFB
+CFDB
+FFEA
+0012
+D804
+0E06
+D80D
+50EF
+0012
+0EFC
+CFDB
+FFE9
+0EFD
+CFDB
+FFEA
+0012
+DFEC
+6AEE
+6AEE
+0012
+26E9
+0E00
+22EA
+0012
+0E22
+0104
+6F7C
+6B7D
+EFA0
+F076
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0300
+CD7A
+DCEE
+40A8
+0000
+0000
+0000
+DF18
+FFFF
+FFFF
+FEFF
+0092
+0000
+0700
+FFEF
+DCFF
+CEBB
+FFFF
+91FF
+0000
+BF00
+C7FF
+4365
+3322
+BF57
+FDFF
+0020
+FF0B
+00C4
+0000
+0000
+2400
+FF6E
+00D1
+FA7F
+0000
+0000
+0000
+0000
+BF01
+00FA
+C0EF
+0000
+0000
+0000
+0000
+0D00
+20FF
+60FF
+0000
+0000
+0000
+0000
+0500
+60FF
+40FF
+0000
+0000
+0000
+0000
+0300
+70FF
+80FF
+0000
+0000
+0000
+0000
+0600
+50FF
+F3CF
+0000
+0000
+0000
+0000
+1D00
+10FF
+FE4F
+0030
+0000
+0000
+0000
+CF01
+00F8
+FF07
+10D7
+0000
+0000
+0100
+FF7E
+00B0
+5E00
+FBFF
+5498
+3433
+BF58
+FAFF
+0000
+0100
+FF9F
+FFFF
+FFFF
+FFFF
+50FD
+0000
+0000
+7B01
+FFFF
+FFFF
+E9FF
+0040
+0000
+0000
+0000
+4602
+6577
+0041
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0100
+0000
+0000
+0000
+0000
+0000
+0000
+1F00
+00A0
+0000
+0000
+0000
+0100
+0044
+9F00
+0090
+0000
+0000
+0000
+0400
+00FF
+FF02
+0050
+0000
+0000
+0000
+0400
+00FF
+FF0A
+0010
+0000
+0000
+0000
+0400
+00FF
+FC3F
+0000
+0000
+0000
+0000
+0400
+00FF
+FCBF
+7777
+7777
+7777
+7777
+7977
+00FF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+00FF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+00FF
+3333
+3333
+3333
+3333
+3333
+3633
+00FF
+0000
+0000
+0000
+0000
+0000
+0400
+00FF
+0000
+0000
+0000
+0000
+0000
+0400
+00FF
+0000
+0000
+0000
+0000
+0000
+0400
+00FF
+0000
+0000
+0000
+0000
+0000
+0300
+00CC
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0800
+0030
+0000
+0000
+0000
+2A00
+00FF
+BF00
+00D1
+0000
+0000
+0000
+FF08
+00FF
+FF0A
+00B3
+0000
+0000
+0300
+FFDF
+00FF
+FA4F
+0000
+0000
+0000
+6F00
+DBFF
+00FF
+E0CF
+0000
+0000
+0000
+FF08
+08F8
+00FF
+80FF
+0000
+0000
+0000
+FE9F
+0840
+00FF
+40FF
+0000
+0000
+0900
+D2FF
+0800
+00FF
+40FF
+0000
+0000
+9F00
+10FD
+0800
+00FF
+80FF
+0000
+0000
+FF08
+00D1
+0800
+00FF
+E0FF
+0000
+0000
+FE8F
+0020
+0800
+00FF
+FA9F
+0000
+1A00
+E2FF
+0000
+0800
+00FF
+FF2E
+21D6
+EF38
+20FD
+0000
+0800
+00FF
+FF04
+FFFF
+FFFF
+00C1
+0000
+0800
+00FF
+3D00
+FFFF
+E7FF
+0000
+0000
+0800
+00FF
+0000
+BB59
+0095
+0000
+0000
+0B00
+00FF
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+2000
+0000
+0000
+0000
+0000
+5E00
+0030
+F804
+0000
+0000
+0000
+0000
+FF08
+00D0
+FE1E
+0020
+0000
+0000
+0000
+DF04
+00F8
+F57F
+0000
+0000
+0000
+0000
+2F00
+00FE
+C0DF
+0000
+0700
+0095
+0000
+0900
+30FF
+70FF
+0000
+0C00
+00F7
+0000
+0400
+60FF
+50FF
+0000
+0E00
+00F8
+0000
+0300
+70FF
+60FF
+0000
+2F00
+00FA
+0000
+0400
+60FF
+B0FF
+0000
+7F00
+00FE
+0000
+0900
+30FF
+F4BF
+0000
+EF02
+70FF
+0000
+2F00
+00FE
+FE4F
+0060
+FD5E
+F5BF
+0000
+EF03
+00F7
+FF09
+DFFF
+F3FF
+FF2F
+56B6
+FFBF
+00C0
+8F00
+FFFF
+40FE
+FF04
+FFFF
+FCFF
+0010
+0200
+DB8C
+0071
+2B00
+FFFF
+80FE
+0000
+0000
+0000
+0000
+0000
+6615
+0030
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0400
+C0EF
+0000
+0000
+0000
+0000
+0000
+AF01
+C0FF
+0000
+0000
+0000
+0000
+0000
+FF5E
+C0FF
+0000
+0000
+0000
+0000
+1B00
+D4FF
+C0CF
+0000
+0000
+0000
+0000
+EF06
+00F8
+C0CF
+0000
+0000
+0000
+0200
+FCBF
+0030
+C0CF
+0000
+0000
+0000
+7F00
+70FF
+0000
+C0CF
+0000
+0000
+0000
+FF2C
+00B2
+0000
+C0CF
+0000
+0000
+0700
+E6FF
+0000
+0000
+C0CF
+0000
+0000
+CF03
+10FA
+0000
+0000
+C0CF
+0000
+0000
+FF8F
+AAEA
+AAAA
+AAAA
+EAEF
+AAAA
+00AA
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+00FF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+00FF
+4444
+4444
+4444
+4444
+D4DF
+4444
+0044
+0000
+0000
+0000
+0000
+C0CF
+0000
+0000
+0000
+0000
+0000
+0000
+C0CF
+0000
+0000
+0000
+0000
+0000
+0000
+7079
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+2000
+0000
+0000
+1200
+5634
+0072
+0000
+F803
+0000
+CDAB
+FFEF
+FFFF
+00F8
+0000
+FF1E
+0080
+FFFF
+FFFF
+FFFF
+00F9
+0000
+FF28
+00F3
+DAFF
+87A9
+FF67
+00B0
+0000
+7F00
+00FB
+70FF
+0000
+FF06
+0010
+0000
+0C00
+10FF
+70FF
+0000
+FA0B
+0000
+0000
+0500
+50FF
+70FF
+0000
+F70D
+0000
+0000
+0200
+70FF
+70FF
+0000
+F70E
+0000
+0000
+0200
+70FF
+70FF
+0000
+FA0E
+0000
+0000
+0400
+60FF
+70FF
+0000
+FE0B
+0010
+0000
+0A00
+30FF
+70FF
+0000
+FF06
+00B0
+0000
+6F00
+00FD
+70FF
+0000
+DF00
+40FD
+0000
+FF29
+00F5
+70FF
+0000
+3F00
+FEFF
+BDBA
+FFFF
+0090
+70FF
+0000
+0300
+FFDF
+FFFF
+F8FF
+0000
+2055
+0000
+0000
+DF07
+FFFF
+30EA
+0000
+0000
+0000
+0000
+0100
+4234
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+1200
+3333
+0021
+0000
+0000
+0000
+4900
+FFCE
+FFFF
+EBFF
+0071
+0000
+0000
+FF7E
+FFFF
+FFFF
+FFFF
+90FF
+0000
+3D00
+FFFF
+BAFC
+FBFF
+EFAB
+FDFF
+0020
+FF04
+83FE
+1C00
+20FD
+0200
+FF8E
+00D1
+FF1E
+0090
+BF00
+00E1
+0000
+CF01
+00F9
+F7AF
+0000
+FF05
+0050
+0000
+1D00
+10FF
+B0FF
+0000
+FE0A
+0000
+0000
+0600
+50FF
+50FF
+0000
+FB0D
+0000
+0000
+0200
+70FF
+20FF
+0000
+FC0D
+0000
+0000
+0300
+60FF
+30FF
+0000
+FF0A
+0020
+0000
+0800
+30FF
+70FF
+0000
+FF05
+00C1
+0000
+4F00
+00FD
+E1EF
+0000
+CF00
+50FD
+0000
+FF28
+00F4
+FD7F
+0000
+2D00
+FFFF
+CDDB
+FFFF
+0070
+D20C
+0000
+0100
+FFBF
+FFFF
+E5FF
+0000
+1001
+0000
+0000
+9D03
+FEFF
+00B6
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+70CC
+0000
+0000
+0000
+0000
+0000
+0000
+90FF
+0000
+0000
+0000
+0000
+0000
+0000
+90FF
+0000
+0000
+0000
+0000
+0000
+0004
+90FF
+0000
+0000
+0000
+0000
+4900
+00EF
+90FF
+0000
+0000
+0000
+0400
+FF9E
+00FF
+90FF
+0000
+0000
+0000
+DF38
+FFFF
+00FE
+90FF
+0000
+0000
+7D01
+FFFF
+D9FF
+0040
+90FF
+0000
+0500
+FFBF
+FDFF
+0083
+0000
+90FF
+0000
+EF39
+FFFF
+30E8
+0000
+0000
+90FF
+6C00
+FFFF
+94FE
+0000
+0000
+0000
+92FF
+FF8E
+FBFF
+0050
+0000
+0000
+0000
+EFFF
+FFFF
+10D7
+0000
+0000
+0000
+0000
+FFFF
+A4FF
+0000
+0000
+0000
+0000
+0000
+FDFF
+0071
+0000
+0000
+0000
+0000
+0000
+40BA
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+6703
+0062
+0000
+0000
+4224
+0000
+0400
+FFDF
+B2FF
+0000
+3C00
+FFFF
+00C4
+8F00
+FFFF
+FEFF
+0030
+FF05
+FFFF
+70FF
+FF08
+77FB
+FFAF
+00E1
+FF3F
+8DA7
+F6FF
+FC4F
+0020
+DF02
+00F9
+E3BF
+0000
+FE8F
+B0DF
+0000
+2E00
+00FF
+60FF
+0000
+FF08
+10FE
+0000
+0800
+40FF
+10FF
+0000
+CF00
+00F7
+0000
+0400
+60FF
+00FF
+0000
+3F00
+00F9
+0000
+0300
+60FF
+20FF
+0000
+5F00
+10FF
+0000
+0500
+50FF
+80FF
+0000
+EF03
+A0FF
+0000
+0A00
+20FF
+F6DF
+0000
+FC5E
+F8CF
+0000
+4F00
+00FD
+FF4F
+9DC8
+F3FF
+FF3F
+00A2
+FF06
+00F5
+FF07
+FFFF
+40FE
+FF06
+DCFF
+FFEF
+00A0
+4C00
+FFFF
+0091
+5E00
+FFFF
+FAFF
+0000
+0000
+3024
+0000
+0100
+FF8E
+40FB
+0000
+0000
+0000
+0000
+0000
+1100
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0200
+0021
+0000
+0000
+0000
+0000
+0100
+FF7D
+EAFF
+0030
+0000
+0400
+0040
+6E00
+FFFF
+FFFF
+00FA
+0000
+6F00
+00E2
+FF08
+B9FF
+EF9B
+C0FF
+0000
+BF00
+00FA
+FF4F
+0070
+0500
+F8EF
+0000
+0C00
+10FF
+F3DF
+0000
+0000
+FF1E
+0010
+0600
+50FF
+80FF
+0000
+0000
+FF06
+0050
+0400
+60FF
+40FF
+0000
+0000
+FF01
+0070
+0400
+60FF
+30FF
+0000
+0000
+FF01
+0070
+0700
+40FF
+70FF
+0000
+0000
+FF04
+0040
+0D00
+00FE
+E2EF
+0000
+0000
+FD0B
+0000
+9F00
+00F8
+FD7F
+0030
+0000
+F47F
+0000
+FF1A
+00D1
+FF0B
+52FB
+0800
+60FF
+6A13
+FEFF
+0020
+AF00
+FFFF
+FFFF
+EFFF
+FFFF
+C2FF
+0000
+0400
+FFBF
+FFFF
+FFFF
+FFFF
+00C5
+0000
+0000
+6902
+EFCD
+EDFF
+62B9
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+ECD7
+F085
+0105
+6920
+6921
+0012
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+ECEA
+F084
+EF57
+F0A4
+FFFF
+FFFF
+FFFF
+FFFF
+EFC6
+F0AF
+EF6E
+F0B5
+EFBF
+F0B5
+0000
+FFFF
+EC80
+F083
+0105
+6B1E
+0012
+FFFF
+FFFF
+FFFF
+EFCE
+F0AF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+EF57
+F0A4
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+ECC8
+F0A8
+0105
+0E03
+6F23
+EF57
+F0A4
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+0012
+EE00
+F000
+0E0D
+6AEE
+62EA
+D7FD
+0012
+EF66
+F06A
+EF76
+F06A
+FFFF
+FFFF
+FFFF
+FFFF
+EF13
+F0A3
+EF1A
+F0B6
+EF46
+F0B6
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+EF2F
+F0AE
+CFD9
+FFE6
+CFDA
+FFE6
+CFE1
+FFD9
+CFE2
+FFDA
+52E6
+6800
+6801
+0E7F
+6E02
+6A03
+50D9
+0FFA
+6EE9
+0EFF
+20DA
+6EEA
+50EE
+1600
+50EE
+1601
+50EE
+1602
+50EE
+1603
+D86A
+C000
+FFEE
+C001
+FFEE
+C002
+FFEE
+C003
+FFEE
+0EFD
+50DB
+0B80
+E002
+0E01
+D001
+0E00
+6EE6
+D859
+0E06
+26E9
+0E00
+22EA
+52E5
+50E7
+6EEF
+0EFC
+CFDB
+F000
+0EFD
+CFDB
+F001
+90D8
+3600
+3601
+0EFC
+C000
+FFDB
+0EFD
+C001
+FFDB
+50DB
+6EE6
+D840
+0E04
+26E9
+0E00
+22EA
+52E5
+50E7
+6EEE
+6AED
+0EFD
+50DB
+6E00
+6A01
+0EFF
+1800
+E118
+5001
+E116
+D82E
+CFEE
+F000
+CFEE
+F001
+CFEE
+F002
+CFEF
+F003
+5000
+1001
+1002
+1003
+E006
+0E21
+0104
+6F7C
+6B7D
+0E80
+D00B
+0E04
+D009
+0EFD
+50DB
+E108
+D815
+6AEE
+6AEE
+6AEE
+6AEE
+0E01
+6EDF
+D006
+0E02
+6EDF
+D80B
+52EE
+52EE
+8EEE
+50DF
+52E5
+52E5
+CFE5
+FFDA
+CFE7
+FFD9
+0012
+0EF8
+CFDB
+FFE9
+0EF9
+CFDB
+FFEA
+0012
+07BB
+BC3B
+D0FF
+3C3B
+F80C
+F23A
+4997
+A33A
+E93A
+603A
+0418
+1E3A
+9009
+DF39
+014C
+9D39
+E53E
+5E39
+3AED
+2539
+338D
+0139
+C6BA
+CA38
+82DC
+9E38
+844D
+7838
+9F9D
+4238
+34AC
+1838
+A3C9
+783C
+45BD
+F93B
+CC02
+A03B
+3E44
+583B
+6223
+143B
+31FA
+D03A
+A46D
+933A
+DDFB
+4F3A
+03F8
+123A
+8D71
+DB39
+AB55
+AB39
+7712
+8639
+EA1E
+5239
+2C54
+2439
+37B2
+0039
+DADB
+C938
+6744
+A13F
+0000
+803F
+ED9E
+5C3F
+5396
+413F
+52B8
+1E3F
+CE19
+013F
+C1CA
+E13E
+CDCC
+CC3E
+0000
+C03E
+3333
+B33E
+39B4
+A83E
+91ED
+9C3E
+E926
+913E
+CBA1
+853E
+B6F3
+7D3E
+E948
+6E3E
+F706
+DF3F
+2506
+B13F
+2E90
+983F
+C7DC
+853F
+3108
+6C3F
+4A0C
+523F
+0C02
+3B3F
+8273
+263F
+EC51
+183F
+B6F3
+0D3F
+5986
+083F
+A1D6
+043F
+34A2
+043F
+6F81
+043F
+3867
+043F
+E10B
+033F
+AE47
+013F
+27C2
+263F
+19E2
+383F
+EC51
+483F
+8E06
+503F
+10E9
+573F
+728A
+5E3F
+9318
+643F
+55C1
+683F
+4D15
+6C3F
+0091
+6E3F
+80B7
+703F
+789C
+723F
+8F53
+743F
+ABCF
+753F
+E71D
+773F
+1058
+D93E
+8A1F
+133F
+5917
+273F
+A7E8
+383F
+6519
+423F
+FFB2
+4B3F
+41F1
+533F
+F1F4
+5A3F
+E02D
+603F
+B3EA
+633F
+BD52
+663F
+D044
+683F
+F085
+693F
+11C7
+6A3F
+88F4
+6B3F
+363C
+6D3F
+3BAA
+B8C0
+3BAA
+38C1
+FE44
+90C1
+D484
+D5C1
+A2CF
+1BC2
+5805
+5DC2
+3BAD
+9CC2
+CF2C
+DEC2
+F640
+1DC3
+2BA2
+52C3
+59E4
+86C3
+ED66
+ACC3
+D002
+DCC3
+ABA9
+0CC4
+939D
+33C4
+2007
+65C4
+0B6C
+0BC0
+0B6C
+8BC0
+98E7
+D9C0
+DC59
+21C1
+BDAD
+6BC1
+2E1F
+A7C1
+BFF2
+ECC1
+C7FC
+27C2
+93C1
+6DC2
+A33E
+9FC2
+DEF7
+CBC2
+4455
+02C3
+0C54
+26C3
+9EAE
+54C3
+55C9
+87C3
+2225
+ADC3
+0EEC
+223E
+C9F9
+A93D
+A8F2
+5C3D
+8AA0
+163D
+23A1
+CF3C
+89EC
+923C
+9AD0
+4F3C
+52D3
+123C
+26B7
+CF3B
+3A33
+9B3B
+7B78
+723B
+C0CA
+3D3B
+D7C4
+143B
+58BF
+E83A
+A54E
+B63A
+0AFF
+8E3A
+BE78
+BC3E
+9001
+523E
+71DB
+0B3E
+3757
+C13D
+186C
+863D
+2274
+3F3D
+BAFB
+073D
+1AC2
+C03C
+44AB
+883C
+107C
+4C3C
+0EDE
+1F3C
+9174
+FA3B
+BB6A
+C43B
+6CB5
+993B
+57E0
+703B
+8FFA
+3C3B
+0000
+8040
+0000
+0041
+0000
+4841
+0000
+9441
+0000
+D841
+3333
+1942
+3333
+5942
+0000
+9A42
+0000
+DA42
+0000
+1243
+0000
+3B43
+0000
+6F43
+0080
+9843
+0000
+C343
+0000
+F943
+00C0
+1E44
+AE47
+C13F
+AE47
+4140
+3D0A
+9740
+14AE
+DF40
+295C
+2341
+14AE
+6741
+713D
+A441
+48E1
+E841
+CDCC
+2442
+8FC2
+5C42
+4861
+8D42
+14AE
+B442
+7B94
+E642
+856B
+1343
+713D
+3C43
+AE07
+7043
+BEBE
+523F
+855D
+143F
+EEEE
+D93E
+4CFE
+9F3E
+99D9
+673E
+2785
+293E
+AD6E
+F53D
+044E
+B03D
+8D5C
+7C3D
+CDEA
+3D3D
+B00B
+153D
+232C
+EA3C
+9612
+B83C
+6E4F
+903C
+8276
+623C
+9FDE
+313C
+E066
+7D3F
+C635
+663F
+7C0D
+453F
+EA07
+213F
+0953
+FC3E
+B5C4
+C23E
+1CB5
+923E
+A5F8
+583E
+BC90
+1E3E
+9EB7
+F13D
+C348
+BF3D
+4942
+973D
+D400
+6F3D
+6921
+3C3D
+F514
+143D
+982E
+E93C
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+292E
+43C9
+A2D8
+7C01
+3D36
+54A1
+ECF0
+0613
+62A7
+05F3
+C0C7
+738C
+9893
+2BD9
+BC4C
+82CA
+1E9B
+573C
+FDD4
+E016
+6742
+6F18
+8A17
+E512
+BE4E
+C4D6
+DA9E
+DE49
+A0FB
+F58E
+BB2F
+EE7A
+A968
+7991
+15B2
+073F
+94C2
+1089
+0B22
+5F21
+807F
+5D9A
+5A90
+3227
+353E
+CCE7
+BFF7
+9703
+FF19
+30B3
+48A5
+B5D1
+D75E
+922A
+AC56
+AAC6
+4FB8
+38D2
+96A4
+7DB6
+76FC
+6BE2
+9C74
+04F1
+459D
+7059
+6471
+8720
+865B
+CF65
+E62D
+A802
+1B60
+25AD
+AEB0
+B9F6
+1C46
+6169
+3440
+7E0F
+5547
+A323
+DD51
+AF3A
+C35C
+F9CE
+BAC5
+EA26
+2C53
+0D6E
+8528
+8409
+D3DF
+CDF4
+4181
+4D52
+6ADC
+37C8
+6CC1
+ABFA
+24E1
+7B08
+0CBD
+B14A
+7888
+958B
+E363
+E86D
+E9CB
+D5FE
+3B00
+1D39
+F2EF
+B70E
+6658
+D0E4
+A677
+72F8
+EB75
+4B0A
+3144
+50B4
+8FED
+1F1A
+DB99
+8D33
+9F11
+8314
+0109
+6BBD
+0109
+6B30
+6B31
+0109
+6B32
+6B33
+0109
+6B34
+6B35
+0109
+6B36
+6B37
+0109
+6938
+EE13
+F000
+0E01
+6EF8
+0104
+0E8C
+6F34
+0E4A
+6F35
+0E4A
+6F36
+0E3F
+6F37
+C500
+F028
+C501
+F029
+ECE2
+F06C
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+6A2C
+6A2D
+0E7A
+6E2E
+0E44
+6E2F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+EC8E
+F06D
+C027
+F408
+C028
+F409
+C029
+F40A
+C02A
+F40B
+0104
+6B00
+0E10
+0104
+5D00
+E301
+D0FA
+0EDC
+6E2C
+0E68
+6E2D
+0E80
+6E2E
+0E3D
+6E2F
+C408
+F027
+C409
+F028
+C40A
+F029
+C40B
+F02A
+ECF7
+F06C
+C027
+F004
+C028
+F005
+C029
+F006
+C02A
+F007
+C004
+F02C
+C005
+F02D
+C006
+F02E
+C007
+F02F
+C434
+F027
+C435
+F028
+C436
+F029
+C437
+F02A
+ECE1
+F06D
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+0104
+5100
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E80
+26E9
+0E04
+22EA
+C000
+FFEE
+C001
+FFEE
+C002
+FFEE
+C003
+FFEE
+0E02
+6EF7
+0104
+5100
+2500
+2500
+2500
+0F80
+6EF6
+0009
+CFF5
+F441
+0009
+CFF5
+F440
+0009
+CFF5
+F443
+0008
+CFF5
+F442
+0F80
+6EF6
+2AF7
+0009
+CFF5
+F449
+0009
+CFF5
+F448
+0009
+CFF5
+F44B
+0008
+CFF5
+F44A
+0104
+5100
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E80
+26E9
+0E04
+22EA
+CFEE
+F008
+CFEE
+F009
+CFEE
+F00A
+CFEF
+F00B
+C440
+F02C
+C441
+F02D
+C442
+F02E
+C443
+F02F
+C008
+F027
+C009
+F028
+C00A
+F029
+C00B
+F02A
+ECF7
+F06C
+C027
+F004
+C028
+F005
+C029
+F006
+C02A
+F007
+C448
+F02C
+C449
+F02D
+C44A
+F02E
+C44B
+F02F
+C004
+F027
+C005
+F028
+C006
+F029
+C007
+F02A
+ECE1
+F06D
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+0104
+5100
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E67
+26E9
+0E05
+22EA
+C000
+FFEE
+C001
+FFEE
+C002
+FFEE
+C003
+FFEE
+0104
+5100
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E67
+26E9
+0E05
+22EA
+CFEE
+F000
+CFEE
+F001
+CFEE
+F002
+CFEF
+F003
+6A2C
+6A2D
+6A2E
+6A2F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+ECD2
+F06E
+0A01
+E10F
+0104
+5100
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E67
+26E9
+0E05
+22EA
+6AEE
+6AEE
+6AEE
+6AEE
+0104
+2B00
+D701
+0104
+0E10
+6F00
+0E20
+0104
+5D00
+E212
+0104
+5100
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E80
+26E9
+0E04
+22EA
+6AEE
+6AEE
+6AEE
+6AEE
+0104
+2B00
+D7EA
+EC13
+F0A0
+0105
+6B23
+0105
+6B22
+0105
+6B31
+0105
+6B32
+0105
+6B66
+0012
+EE13
+F000
+0104
+0E8C
+6F34
+0E4A
+6F35
+0E4A
+6F36
+0E3F
+6F37
+C500
+F028
+C501
+F029
+ECE2
+F06C
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+6A2C
+6A2D
+0E7A
+6E2E
+0E44
+6E2F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+EC8E
+F06D
+C027
+F408
+C028
+F409
+C029
+F40A
+C02A
+F40B
+C502
+F028
+C503
+F029
+ECE2
+F06C
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+6A2C
+6A2D
+0E7A
+6E2E
+0E44
+6E2F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+EC8E
+F06D
+C027
+F40C
+C028
+F40D
+C029
+F40E
+C02A
+F40F
+0EDC
+6E2C
+0E68
+6E2D
+0E80
+6E2E
+0E3D
+6E2F
+C408
+F027
+C409
+F028
+C40A
+F029
+C40B
+F02A
+ECF7
+F06C
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+C000
+F02C
+C001
+F02D
+C002
+F02E
+C003
+F02F
+C434
+F027
+C435
+F028
+C436
+F029
+C437
+F02A
+ECE1
+F06D
+C027
+F424
+C028
+F425
+C029
+F426
+C02A
+F427
+0104
+6B28
+6B29
+6B2A
+6B2B
+C40C
+F430
+C40D
+F431
+C40E
+F432
+C40F
+F433
+C513
+F029
+ECD1
+F06C
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+6A2C
+6A2D
+0EC8
+6E2E
+0E42
+6E2F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+EC8E
+F06D
+C027
+F97B
+C028
+F97C
+C029
+F97D
+C02A
+F97E
+C512
+F029
+ECD1
+F06C
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+6A2C
+6A2D
+0EC8
+6E2E
+0E42
+6E2F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+EC8E
+F06D
+C027
+F977
+C028
+F978
+C029
+F979
+C02A
+F97A
+ECBC
+F08F
+EC13
+F0A0
+0105
+6B23
+0105
+6B22
+0105
+6B31
+ECC0
+F0A0
+0012
+D84F
+0109
+51BD
+E105
+0E01
+6FBD
+EC00
+F060
+D002
+ECF3
+F064
+DB4D
+ECC0
+F0A0
+0105
+5123
+0A03
+E027
+0A02
+E01D
+0A01
+E012
+EC93
+F096
+EC13
+F0A0
+ECE3
+F069
+0103
+0E01
+6F06
+EC07
+F08D
+0105
+5123
+080F
+E224
+0E02
+6F23
+D023
+EC93
+F096
+EC4D
+F094
+EC16
+F063
+0105
+6923
+D01B
+0E03
+5D23
+E101
+D017
+6B23
+EC2D
+F08B
+D013
+EC13
+F0A0
+ECE3
+F069
+ECC2
+F069
+0102
+6BC7
+6B92
+EC93
+F096
+ECFC
+F064
+0105
+6B23
+D003
+EC2D
+F08B
+D000
+ECE5
+F095
+EFF7
+F064
+C500
+F028
+C501
+F029
+ECE2
+F06C
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+6A2C
+6A2D
+0E7A
+6E2E
+0E44
+6E2F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+EC8E
+F06D
+C027
+F408
+C028
+F409
+C029
+F40A
+C02A
+F40B
+C502
+F028
+C503
+F029
+ECE2
+F06C
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+6A2C
+6A2D
+0E7A
+6E2E
+0E44
+6E2F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+EC8E
+F06D
+C027
+F40C
+C028
+F40D
+C029
+F40E
+C02A
+F40F
+C510
+F029
+ECD1
+F06C
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+6A2C
+6A2D
+0EC8
+6E2E
+0E42
+6E2F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+EC8E
+F06D
+C027
+F434
+C028
+F435
+C029
+F436
+C02A
+F437
+C511
+F029
+ECD1
+F06C
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+6A2C
+6A2D
+0EC8
+6E2E
+0E42
+6E2F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+EC8E
+F06D
+C027
+F438
+C028
+F439
+C029
+F43A
+C02A
+F43B
+C51C
+F029
+ECD1
+F06C
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+6A2C
+6A2D
+0EC8
+6E2E
+0E42
+6E2F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+EC8E
+F06D
+C027
+F95F
+C028
+F960
+C029
+F961
+C02A
+F962
+C51D
+F029
+ECD1
+F06C
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+6A2C
+6A2D
+0EC8
+6E2E
+0E42
+6E2F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+EC8E
+F06D
+C027
+F963
+C028
+F964
+C029
+F965
+C02A
+F966
+C517
+F029
+ECD1
+F06C
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+6A2C
+6A2D
+0EC8
+6E2E
+0E42
+6E2F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+EC8E
+F06D
+C027
+F97F
+C028
+F980
+C029
+F981
+C02A
+F982
+0105
+511B
+E05B
+C51B
+F029
+ECD1
+F06C
+C027
+F004
+C028
+F005
+C029
+F006
+C02A
+F007
+0E85
+6E2C
+0EEB
+6E2D
+0E1F
+6E2E
+0E41
+6E2F
+C004
+F027
+C005
+F028
+C006
+F029
+C007
+F02A
+EC8E
+F06D
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+C40C
+F02C
+C40D
+F02D
+C40E
+F02E
+C40F
+F02F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+ECF8
+F06C
+C027
+F96F
+C028
+F970
+C029
+F971
+C02A
+F972
+C97F
+F02C
+C980
+F02D
+C981
+F02E
+C982
+F02F
+C96F
+F027
+C970
+F028
+C971
+F029
+C972
+F02A
+ECF8
+F06C
+C027
+F96F
+C028
+F970
+C029
+F971
+C02A
+F972
+D005
+0109
+6B6F
+6B70
+6B71
+6B72
+C518
+F029
+ECD1
+F06C
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+6A2C
+6A2D
+0EC8
+6E2E
+0E42
+6E2F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+EC8E
+F06D
+C027
+F5EF
+C028
+F5F0
+C029
+F5F1
+C02A
+F5F2
+C519
+F029
+ECD1
+F06C
+C027
+F004
+C028
+F005
+C029
+F006
+C02A
+F007
+0E66
+6E2C
+0EE6
+6E2D
+0EC7
+6E2E
+0E42
+6E2F
+C004
+F027
+C005
+F028
+C006
+F029
+C007
+F02A
+EC8E
+F06D
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+C40C
+F02C
+C40D
+F02D
+C40E
+F02E
+C40F
+F02F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+ECF8
+F06C
+C027
+F5F3
+C028
+F5F4
+C029
+F5F5
+C02A
+F5F6
+C97F
+F02C
+C980
+F02D
+C981
+F02E
+C982
+F02F
+C5F3
+F027
+C5F4
+F028
+C5F5
+F029
+C5F6
+F02A
+ECF8
+F06C
+C027
+F5F3
+C028
+F5F4
+C029
+F5F5
+C02A
+F5F6
+C51A
+F029
+ECD1
+F06C
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+6A2C
+6A2D
+0EC8
+6E2E
+0E42
+6E2F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+EC8E
+F06D
+C027
+F5F7
+C028
+F5F8
+C029
+F5F9
+C02A
+F5FA
+C513
+F029
+ECD1
+F06C
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+6A2C
+6A2D
+0EC8
+6E2E
+0E42
+6E2F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+EC8E
+F06D
+C027
+F97B
+C028
+F97C
+C029
+F97D
+C02A
+F97E
+C512
+F029
+ECD1
+F06C
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+6A2C
+6A2D
+0EC8
+6E2E
+0E42
+6E2F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+EC8E
+F06D
+C027
+F977
+C028
+F978
+C029
+F979
+C02A
+F97A
+C515
+F029
+ECD1
+F06C
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+6A2C
+6A2D
+0EC8
+6E2E
+0E42
+6E2F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+EC8E
+F06D
+C027
+F297
+C028
+F298
+C029
+F299
+C02A
+F29A
+C514
+F029
+ECD1
+F06C
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+6A2C
+6A2D
+0EC8
+6E2E
+0E42
+6E2F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+EC8E
+F06D
+C027
+F29B
+C028
+F29C
+C029
+F29D
+C02A
+F29E
+C297
+F02C
+C298
+F02D
+C299
+F02E
+C29A
+F02F
+C29B
+F027
+C29C
+F028
+C29D
+F029
+C29E
+F02A
+ECF7
+F06C
+C027
+F29F
+C028
+F2A0
+C029
+F2A1
+C02A
+F2A2
+C40C
+F02C
+C40D
+F02D
+C40E
+F02E
+C40F
+F02F
+C408
+F027
+C409
+F028
+C40A
+F029
+C40B
+F02A
+ECF7
+F06C
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+0EF0
+6E2C
+0E85
+6E2D
+0E99
+6E2E
+0E3E
+6E2F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+EC8E
+F06D
+C027
+F414
+C028
+F415
+C029
+F416
+C02A
+F417
+C414
+F027
+C415
+F028
+C416
+F029
+C417
+F02A
+EC93
+F06E
+C028
+F404
+C029
+F405
+0104
+0E00
+5D04
+0E00
+5905
+E202
+6B04
+6B05
+0EFF
+80D8
+5504
+0E00
+5505
+E202
+6904
+6B05
+C404
+F24F
+0105
+511E
+0102
+6FC3
+6BC4
+0012
+0E01
+0102
+2590
+6F90
+0E00
+2191
+6F91
+0105
+5118
+E109
+C408
+F5E7
+C409
+F5E8
+C40A
+F5E9
+C40B
+F5EA
+D04E
+C5EF
+F02C
+C5F0
+F02D
+C5F1
+F02E
+C5F2
+F02F
+C408
+F027
+C409
+F028
+C40A
+F029
+C40B
+F02A
+ECF7
+F06C
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+C438
+F02C
+C439
+F02D
+C43A
+F02E
+C43B
+F02F
+C434
+F027
+C435
+F028
+C436
+F029
+C437
+F02A
+ECF8
+F06C
+C027
+F004
+C028
+F005
+C029
+F006
+C02A
+F007
+C004
+F02C
+C005
+F02D
+C006
+F02E
+C007
+F02F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+EC8E
+F06D
+C027
+F5E7
+C028
+F5E8
+C029
+F5E9
+C02A
+F5EA
+C408
+F02C
+C409
+F02D
+C40A
+F02E
+C40B
+F02F
+C5E7
+F027
+C5E8
+F028
+C5E9
+F029
+C5EA
+F02A
+ECC9
+F06E
+0A01
+E108
+C408
+F5E7
+C409
+F5E8
+C40A
+F5E9
+C40B
+F5EA
+0EDC
+6E2C
+0E68
+6E2D
+0E80
+6E2E
+0E3D
+6E2F
+C5E7
+F027
+C5E8
+F028
+C5E9
+F029
+C5EA
+F02A
+ECC9
+F06E
+0A01
+E001
+D097
+0EDC
+6E2C
+0E68
+6E2D
+0E80
+6E2E
+0E3D
+6E2F
+C5E7
+F027
+C5E8
+F028
+C5E9
+F029
+C5EA
+F02A
+ECF7
+F06C
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+C000
+F02C
+C001
+F02D
+C002
+F02E
+C003
+F02F
+C434
+F027
+C435
+F028
+C436
+F029
+C437
+F02A
+ECE1
+F06D
+C027
+F424
+C028
+F425
+C029
+F426
+C02A
+F427
+0EDC
+6E2C
+0E68
+6E2D
+0E80
+6E2E
+0E3D
+6E2F
+C5E7
+F027
+C5E8
+F028
+C5E9
+F029
+C5EA
+F02A
+ECF7
+F06C
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+C000
+F02C
+C001
+F02D
+C002
+F02E
+C003
+F02F
+C438
+F027
+C439
+F028
+C43A
+F029
+C43B
+F02A
+ECE1
+F06D
+C027
+F428
+C028
+F429
+C029
+F42A
+C02A
+F42B
+C408
+F02C
+C409
+F02D
+C40A
+F02E
+C40B
+F02F
+C5E7
+F027
+C5E8
+F028
+C5E9
+F029
+C5EA
+F02A
+EC8E
+F06D
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+6A2C
+6A2D
+0EC8
+6E2E
+0E42
+6E2F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+ECE1
+F06D
+EC6C
+F06E
+C029
+F564
+D00B
+0104
+6B24
+6B25
+6B26
+6B27
+6B28
+6B29
+6B2A
+6B2B
+0105
+6B64
+C40C
+F430
+C40D
+F431
+C40E
+F432
+C40F
+F433
+ECBC
+F08F
+0105
+5163
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E67
+26E9
+0E05
+22EA
+CFEE
+F000
+CFEE
+F001
+CFEE
+F002
+CFEF
+F003
+6A2C
+6A2D
+0E7A
+6E2E
+0E44
+6E2F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+ECE1
+F06D
+EC93
+F06E
+C028
+F244
+C029
+F245
+0105
+5163
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E80
+26E9
+0E04
+22EA
+CFEE
+F004
+CFEE
+F005
+CFEE
+F006
+CFEF
+F007
+0E10
+2563
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E80
+26E9
+0E04
+22EA
+CFEE
+F008
+CFEE
+F009
+CFEE
+F00A
+CFEF
+F00B
+C008
+F02C
+C009
+F02D
+C00A
+F02E
+C00B
+F02F
+C004
+F027
+C005
+F028
+C006
+F029
+C007
+F02A
+ECF8
+F06C
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+6A2C
+6A2D
+0E7A
+6E2E
+0E44
+6E2F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+ECE1
+F06D
+EC93
+F06E
+C028
+F246
+C029
+F247
+0105
+051F
+E11B
+C29B
+F02C
+C29C
+F02D
+C29D
+F02E
+C29E
+F02F
+C410
+F027
+C411
+F028
+C412
+F029
+C413
+F02A
+ECE1
+F06D
+C027
+F410
+C028
+F411
+C029
+F412
+C02A
+F413
+D008
+C430
+F410
+C431
+F411
+C432
+F412
+C433
+F413
+C410
+F02C
+C411
+F02D
+C412
+F02E
+C413
+F02F
+C470
+F027
+C471
+F028
+C472
+F029
+C473
+F02A
+ECC9
+F06E
+0A01
+E105
+0105
+5123
+E102
+6B22
+6923
+0012
+0104
+6B06
+6B07
+ECFC
+F064
+0102
+0E00
+80D8
+55BF
+0E00
+55C0
+E301
+D1B8
+0105
+5118
+E13E
+C420
+F5EB
+C421
+F5EC
+C422
+F5ED
+C423
+F5EE
+C96F
+F02C
+C970
+F02D
+C971
+F02E
+C972
+F02F
+C420
+F027
+C421
+F028
+C422
+F029
+C423
+F02A
+ECC9
+F06E
+0A01
+E111
+C434
+F967
+C435
+F968
+C436
+F969
+C437
+F96A
+C438
+F96B
+C439
+F96C
+C43A
+F96D
+C43B
+F96E
+D010
+C95F
+F967
+C960
+F968
+C961
+F969
+C962
+F96A
+C963
+F96B
+C964
+F96C
+C965
+F96D
+C966
+F96E
+D0C1
+C434
+F967
+C435
+F968
+C436
+F969
+C437
+F96A
+C438
+F96B
+C439
+F96C
+C43A
+F96D
+C43B
+F96E
+C5F3
+F02C
+C5F4
+F02D
+C5F5
+F02E
+C5F6
+F02F
+C420
+F027
+C421
+F028
+C422
+F029
+C423
+F02A
+ECC9
+F06E
+0A01
+E14F
+C5EF
+F02C
+C5F0
+F02D
+C5F1
+F02E
+C5F2
+F02F
+C420
+F027
+C421
+F028
+C422
+F029
+C423
+F02A
+ECF7
+F06C
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+C438
+F02C
+C439
+F02D
+C43A
+F02E
+C43B
+F02F
+C434
+F027
+C435
+F028
+C436
+F029
+C437
+F02A
+ECF8
+F06C
+C027
+F004
+C028
+F005
+C029
+F006
+C02A
+F007
+C004
+F02C
+C005
+F02D
+C006
+F02E
+C007
+F02F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+EC8E
+F06D
+C027
+F5EB
+C028
+F5EC
+C029
+F5ED
+C02A
+F5EE
+D04E
+C5F7
+F02C
+C5F8
+F02D
+C5F9
+F02E
+C5FA
+F02F
+C420
+F027
+C421
+F028
+C422
+F029
+C423
+F02A
+ECF7
+F06C
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+C438
+F02C
+C439
+F02D
+C43A
+F02E
+C43B
+F02F
+C434
+F027
+C435
+F028
+C436
+F029
+C437
+F02A
+ECF8
+F06C
+C027
+F004
+C028
+F005
+C029
+F006
+C02A
+F007
+C004
+F02C
+C005
+F02D
+C006
+F02E
+C007
+F02F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+EC8E
+F06D
+C027
+F5EB
+C028
+F5EC
+C029
+F5ED
+C02A
+F5EE
+C420
+F02C
+C421
+F02D
+C422
+F02E
+C423
+F02F
+C5EB
+F027
+C5EC
+F028
+C5ED
+F029
+C5EE
+F02A
+ECC9
+F06E
+0A01
+E108
+C420
+F5EB
+C421
+F5EC
+C422
+F5ED
+C423
+F5EE
+0EDC
+6E2C
+0E68
+6E2D
+0E80
+6E2E
+0E3D
+6E2F
+C5EB
+F027
+C5EC
+F028
+C5ED
+F029
+C5EE
+F02A
+ECC9
+F06E
+0A01
+E169
+0EDC
+6E2C
+0E68
+6E2D
+0E80
+6E2E
+0E3D
+6E2F
+C5EB
+F027
+C5EC
+F028
+C5ED
+F029
+C5EE
+F02A
+ECF7
+F06C
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+C000
+F02C
+C001
+F02D
+C002
+F02E
+C003
+F02F
+C967
+F027
+C968
+F028
+C969
+F029
+C96A
+F02A
+ECE1
+F06D
+C027
+F424
+C028
+F425
+C029
+F426
+C02A
+F427
+0EDC
+6E2C
+0E68
+6E2D
+0E80
+6E2E
+0E3D
+6E2F
+C5EB
+F027
+C5EC
+F028
+C5ED
+F029
+C5EE
+F02A
+ECF7
+F06C
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+C000
+F02C
+C001
+F02D
+C002
+F02E
+C003
+F02F
+C96B
+F027
+C96C
+F028
+C96D
+F029
+C96E
+F02A
+ECE1
+F06D
+C027
+F428
+C028
+F429
+C029
+F42A
+C02A
+F42B
+D009
+0104
+6B24
+6B25
+6B26
+6B27
+6B28
+6B29
+6B2A
+6B2B
+ECD0
+F097
+ECF5
+F069
+0102
+0E01
+6FC1
+EC22
+F0A0
+0105
+2923
+6F23
+0E10
+5D23
+E204
+0E01
+0104
+6F06
+6B07
+D002
+0105
+6B23
+0104
+0E01
+1906
+E101
+5107
+E101
+D632
+0105
+5123
+080F
+E203
+0E01
+6F23
+D004
+ECC2
+F069
+0105
+6B23
+0012
+EC93
+F096
+0105
+6B23
+C408
+F420
+C409
+F421
+C40A
+F422
+C40B
+F423
+0102
+0E01
+6F92
+0104
+6B06
+6B07
+6A2C
+6A2D
+0E80
+6E2E
+0E3F
+6E2F
+C420
+F027
+C421
+F028
+C422
+F029
+C423
+F02A
+ECF7
+F06C
+C027
+F420
+C028
+F421
+C029
+F422
+C02A
+F423
+0105
+051F
+E109
+C2B7
+F293
+C2B8
+F294
+C2B9
+F295
+C2BA
+F296
+D008
+C474
+F293
+C475
+F294
+C476
+F295
+C477
+F296
+C293
+F02C
+C294
+F02D
+C295
+F02E
+C296
+F02F
+C420
+F027
+C421
+F028
+C422
+F029
+C423
+F02A
+ECC9
+F06E
+0A01
+E001
+D25A
+C40C
+F02C
+C40D
+F02D
+C40E
+F02E
+C40F
+F02F
+C420
+F027
+C421
+F028
+C422
+F029
+C423
+F02A
+ECC9
+F06E
+0A01
+E001
+D245
+0102
+6B92
+0103
+6B06
+0105
+5118
+E164
+6A2C
+6A2D
+6A2E
+0E3F
+6E2F
+C420
+F027
+C421
+F028
+C422
+F029
+C423
+F02A
+ECF8
+F06C
+C027
+F5EB
+C028
+F5EC
+C029
+F5ED
+C02A
+F5EE
+6A2C
+6A2D
+6A2E
+0E3F
+6E2F
+C420
+F027
+C421
+F028
+C422
+F029
+C423
+F02A
+ECF8
+F06C
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+C96F
+F02C
+C970
+F02D
+C971
+F02E
+C972
+F02F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+ECC9
+F06E
+0A01
+E111
+C434
+F967
+C435
+F968
+C436
+F969
+C437
+F96A
+C438
+F96B
+C439
+F96C
+C43A
+F96D
+C43B
+F96E
+D010
+C95F
+F967
+C960
+F968
+C961
+F969
+C962
+F96A
+C963
+F96B
+C964
+F96C
+C965
+F96D
+C966
+F96E
+D148
+C434
+F967
+C435
+F968
+C436
+F969
+C437
+F96A
+C438
+F96B
+C439
+F96C
+C43A
+F96D
+C43B
+F96E
+6A2C
+6A2D
+6A2E
+0E3F
+6E2F
+C420
+F027
+C421
+F028
+C422
+F029
+C423
+F02A
+ECF8
+F06C
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+C5F3
+F02C
+C5F4
+F02D
+C5F5
+F02E
+C5F6
+F02F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+ECC9
+F06E
+0A01
+E166
+6A2C
+6A2D
+6A2E
+0E3F
+6E2F
+C420
+F027
+C421
+F028
+C422
+F029
+C423
+F02A
+ECF8
+F06C
+C027
+F004
+C028
+F005
+C029
+F006
+C02A
+F007
+C5EF
+F02C
+C5F0
+F02D
+C5F1
+F02E
+C5F2
+F02F
+C004
+F027
+C005
+F028
+C006
+F029
+C007
+F02A
+ECF7
+F06C
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+C438
+F02C
+C439
+F02D
+C43A
+F02E
+C43B
+F02F
+C434
+F027
+C435
+F028
+C436
+F029
+C437
+F02A
+ECF8
+F06C
+C027
+F008
+C028
+F009
+C029
+F00A
+C02A
+F00B
+C008
+F02C
+C009
+F02D
+C00A
+F02E
+C00B
+F02F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+EC8E
+F06D
+C027
+F5EB
+C028
+F5EC
+C029
+F5ED
+C02A
+F5EE
+D065
+6A2C
+6A2D
+6A2E
+0E3F
+6E2F
+C420
+F027
+C421
+F028
+C422
+F029
+C423
+F02A
+ECF8
+F06C
+C027
+F004
+C028
+F005
+C029
+F006
+C02A
+F007
+C5F7
+F02C
+C5F8
+F02D
+C5F9
+F02E
+C5FA
+F02F
+C004
+F027
+C005
+F028
+C006
+F029
+C007
+F02A
+ECF7
+F06C
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+C438
+F02C
+C439
+F02D
+C43A
+F02E
+C43B
+F02F
+C434
+F027
+C435
+F028
+C436
+F029
+C437
+F02A
+ECF8
+F06C
+C027
+F008
+C028
+F009
+C029
+F00A
+C02A
+F00B
+C008
+F02C
+C009
+F02D
+C00A
+F02E
+C00B
+F02F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+EC8E
+F06D
+C027
+F5EB
+C028
+F5EC
+C029
+F5ED
+C02A
+F5EE
+6A2C
+6A2D
+6A2E
+0E3F
+6E2F
+C420
+F027
+C421
+F028
+C422
+F029
+C423
+F02A
+ECF8
+F06C
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+C000
+F02C
+C001
+F02D
+C002
+F02E
+C003
+F02F
+C5EB
+F027
+C5EC
+F028
+C5ED
+F029
+C5EE
+F02A
+ECC9
+F06E
+0A01
+E117
+6A2C
+6A2D
+6A2E
+0E3F
+6E2F
+C420
+F027
+C421
+F028
+C422
+F029
+C423
+F02A
+ECF8
+F06C
+C027
+F5EB
+C028
+F5EC
+C029
+F5ED
+C02A
+F5EE
+0EDC
+6E2C
+0E68
+6E2D
+0E80
+6E2E
+0E3D
+6E2F
+C5EB
+F027
+C5EC
+F028
+C5ED
+F029
+C5EE
+F02A
+ECC9
+F06E
+0A01
+E169
+0EDC
+6E2C
+0E68
+6E2D
+0E80
+6E2E
+0E3D
+6E2F
+C5EB
+F027
+C5EC
+F028
+C5ED
+F029
+C5EE
+F02A
+ECF7
+F06C
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+C000
+F02C
+C001
+F02D
+C002
+F02E
+C003
+F02F
+C967
+F027
+C968
+F028
+C969
+F029
+C96A
+F02A
+ECE1
+F06D
+C027
+F424
+C028
+F425
+C029
+F426
+C02A
+F427
+0EDC
+6E2C
+0E68
+6E2D
+0E80
+6E2E
+0E3D
+6E2F
+C5EB
+F027
+C5EC
+F028
+C5ED
+F029
+C5EE
+F02A
+ECF7
+F06C
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+C000
+F02C
+C001
+F02D
+C002
+F02E
+C003
+F02F
+C96B
+F027
+C96C
+F028
+C96D
+F029
+C96E
+F02A
+ECE1
+F06D
+C027
+F428
+C028
+F429
+C029
+F42A
+C02A
+F42B
+D009
+0104
+6B24
+6B25
+6B26
+6B27
+6B28
+6B29
+6B2A
+6B2B
+ECD0
+F097
+0105
+2923
+6F23
+0E10
+5D23
+E204
+0E01
+0104
+6F06
+6B07
+0104
+0E01
+1906
+E101
+5107
+E101
+D55B
+0012
+EE13
+F000
+0E01
+6EF8
+0105
+6963
+0104
+6B70
+6B71
+6B72
+6B73
+0104
+6B00
+0E10
+0104
+5D00
+E302
+EF4C
+F094
+0E02
+6EF7
+0104
+5100
+2500
+2500
+2500
+6EF6
+0009
+CFF5
+F459
+0009
+CFF5
+F458
+0009
+CFF5
+F45B
+0008
+CFF5
+F45A
+0F40
+6EF6
+0009
+CFF5
+F45D
+0009
+CFF5
+F45C
+0009
+CFF5
+F45F
+0008
+CFF5
+F45E
+0F40
+6EF6
+0009
+CFF5
+F441
+0009
+CFF5
+F440
+0009
+CFF5
+F443
+0008
+CFF5
+F442
+0F40
+6EF6
+0009
+CFF5
+F445
+0009
+CFF5
+F444
+0009
+CFF5
+F447
+0008
+CFF5
+F446
+0F40
+6EF6
+2AF7
+0009
+CFF5
+F449
+0009
+CFF5
+F448
+0009
+CFF5
+F44B
+0008
+CFF5
+F44A
+0F40
+6EF6
+0009
+CFF5
+F44D
+0009
+CFF5
+F44C
+0009
+CFF5
+F44F
+0008
+CFF5
+F44E
+0ED4
+6E2C
+0E40
+6E2D
+0E18
+6E2E
+0E38
+6E2F
+C458
+F027
+C459
+F028
+C45A
+F029
+C45B
+F02A
+ECD2
+F06E
+0A01
+E101
+D0DE
+0E45
+6E2C
+0E12
+6E2D
+0EBD
+6E2E
+0E3B
+6E2F
+C458
+F027
+C459
+F028
+C45A
+F029
+C45B
+F02A
+ECC9
+F06E
+0A01
+E101
+D0C9
+0E4B
+6E2C
+0E89
+6E2D
+0EC9
+6E2E
+0E38
+6E2F
+C45C
+F027
+C45D
+F028
+C45E
+F029
+C45F
+F02A
+ECD2
+F06E
+0A01
+E101
+D0B4
+0E9A
+6E2C
+0E99
+6E2D
+0E19
+6E2E
+0E3E
+6E2F
+C45C
+F027
+C45D
+F028
+C45E
+F029
+C45F
+F02A
+ECC9
+F06E
+0A01
+E101
+D09F
+0E44
+6E2C
+0E8B
+6E2D
+0E6C
+6E2E
+0E3E
+6E2F
+C440
+F027
+C441
+F028
+C442
+F029
+C443
+F02A
+ECD2
+F06E
+0A01
+E101
+D08A
+0E5C
+6E2C
+0E8F
+6E2D
+0EA2
+6E2E
+0E3F
+6E2F
+C440
+F027
+C441
+F028
+C442
+F029
+C443
+F02A
+ECC9
+F06E
+0A01
+E076
+0E25
+6E2C
+0E06
+6E2D
+0E01
+6E2E
+0E3F
+6E2F
+C448
+F027
+C449
+F028
+C44A
+F029
+C44B
+F02A
+ECD2
+F06E
+0A01
+E062
+0EC7
+6E2C
+0E4B
+6E2D
+0E77
+6E2E
+0E3F
+6E2F
+C448
+F027
+C449
+F028
+C44A
+F029
+C44B
+F02A
+ECC9
+F06E
+0A01
+E04E
+0E5C
+6E2C
+0E8F
+6E2D
+0E02
+6E2E
+0E3F
+6E2F
+C444
+F027
+C445
+F028
+C446
+F029
+C447
+F02A
+ECD2
+F06E
+0A01
+E03A
+6A2C
+6A2D
+0EE0
+6E2E
+0E3F
+6E2F
+C444
+F027
+C445
+F028
+C446
+F029
+C447
+F02A
+ECC9
+F06E
+0A01
+E028
+0E75
+6E2C
+0E93
+6E2D
+0ED8
+6E2E
+0E3E
+6E2F
+C44C
+F027
+C44D
+F028
+C44E
+F029
+C44F
+F02A
+ECD2
+F06E
+0A01
+E014
+0EDF
+6E2C
+0E4F
+6E2D
+0E6D
+6E2E
+0E3F
+6E2F
+C44C
+F027
+C44D
+F028
+C44E
+F029
+C44F
+F02A
+ECC9
+F06E
+0A01
+E102
+0109
+8B35
+0104
+5100
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E80
+26E9
+0E04
+22EA
+CFEE
+F004
+CFEE
+F005
+CFEE
+F006
+CFEF
+F007
+C004
+F02C
+C005
+F02D
+C006
+F02E
+C007
+F02F
+C424
+F027
+C425
+F028
+C426
+F029
+C427
+F02A
+ECF7
+F06C
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+C458
+F02C
+C459
+F02D
+C45A
+F02E
+C45B
+F02F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+ECE1
+F06D
+C027
+F42C
+C028
+F42D
+C029
+F42E
+C02A
+F42F
+EC1C
+F06A
+0104
+5100
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E80
+26E9
+0E04
+22EA
+CFEE
+F004
+CFEE
+F005
+CFEE
+F006
+CFEF
+F007
+C42C
+F02C
+C42D
+F02D
+C42E
+F02E
+C42F
+F02F
+C004
+F027
+C005
+F028
+C006
+F029
+C007
+F02A
+ECF8
+F06C
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+0104
+5100
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E80
+26E9
+0E04
+22EA
+C000
+FFEE
+C001
+FFEE
+C002
+FFEE
+C003
+FFEE
+0E10
+0104
+2500
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E80
+26E9
+0E04
+22EA
+CFEE
+F004
+CFEE
+F005
+CFEE
+F006
+CFEF
+F007
+C004
+F02C
+C005
+F02D
+C006
+F02E
+C007
+F02F
+C428
+F027
+C429
+F028
+C42A
+F029
+C42B
+F02A
+ECF7
+F06C
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+C45C
+F02C
+C45D
+F02D
+C45E
+F02E
+C45F
+F02F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+ECE1
+F06D
+C027
+F42C
+C028
+F42D
+C029
+F42E
+C02A
+F42F
+EC1C
+F06A
+0E10
+0104
+2500
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E80
+26E9
+0E04
+22EA
+CFEE
+F004
+CFEE
+F005
+CFEE
+F006
+CFEF
+F007
+C42C
+F02C
+C42D
+F02D
+C42E
+F02E
+C42F
+F02F
+C004
+F027
+C005
+F028
+C006
+F029
+C007
+F02A
+ECF8
+F06C
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+0E10
+0104
+2500
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E80
+26E9
+0E04
+22EA
+C000
+FFEE
+C001
+FFEE
+C002
+FFEE
+C003
+FFEE
+0104
+5100
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E80
+26E9
+0E04
+22EA
+CFEE
+F000
+CFEE
+F001
+CFEE
+F002
+CFEF
+F003
+0E10
+0104
+2500
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E80
+26E9
+0E04
+22EA
+CFEE
+F004
+CFEE
+F005
+CFEE
+F006
+CFEF
+F007
+C004
+F02C
+C005
+F02D
+C006
+F02E
+C007
+F02F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+ECF8
+F06C
+C027
+F42C
+C028
+F42D
+C029
+F42E
+C02A
+F42F
+0104
+5100
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E80
+26E9
+0E04
+22EA
+CFEE
+F008
+CFEE
+F009
+CFEE
+F00A
+CFEF
+F00B
+C008
+F02C
+C009
+F02D
+C00A
+F02E
+C00B
+F02F
+C440
+F027
+C441
+F028
+C442
+F029
+C443
+F02A
+ECE1
+F06D
+C027
+F004
+C028
+F005
+C029
+F006
+C02A
+F007
+0E10
+0104
+2500
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E80
+26E9
+0E04
+22EA
+CFEE
+F010
+CFEE
+F011
+CFEE
+F012
+CFEF
+F013
+C010
+F02C
+C011
+F02D
+C012
+F02E
+C013
+F02F
+C444
+F027
+C445
+F028
+C446
+F029
+C447
+F02A
+ECE1
+F06D
+C027
+F00C
+C028
+F00D
+C029
+F00E
+C02A
+F00F
+C00C
+F02C
+C00D
+F02D
+C00E
+F02E
+C00F
+F02F
+C004
+F027
+C005
+F028
+C006
+F029
+C007
+F02A
+ECF8
+F06C
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+C42C
+F02C
+C42D
+F02D
+C42E
+F02E
+C42F
+F02F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+EC8E
+F06D
+C027
+F440
+C028
+F441
+C029
+F442
+C02A
+F443
+0104
+5100
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E80
+26E9
+0E04
+22EA
+CFEE
+F008
+CFEE
+F009
+CFEE
+F00A
+CFEF
+F00B
+C008
+F02C
+C009
+F02D
+C00A
+F02E
+C00B
+F02F
+C448
+F027
+C449
+F028
+C44A
+F029
+C44B
+F02A
+ECE1
+F06D
+C027
+F004
+C028
+F005
+C029
+F006
+C02A
+F007
+0E10
+0104
+2500
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E80
+26E9
+0E04
+22EA
+CFEE
+F010
+CFEE
+F011
+CFEE
+F012
+CFEF
+F013
+C010
+F02C
+C011
+F02D
+C012
+F02E
+C013
+F02F
+C44C
+F027
+C44D
+F028
+C44E
+F029
+C44F
+F02A
+ECE1
+F06D
+C027
+F00C
+C028
+F00D
+C029
+F00E
+C02A
+F00F
+C00C
+F02C
+C00D
+F02D
+C00E
+F02E
+C00F
+F02F
+C004
+F027
+C005
+F028
+C006
+F029
+C007
+F02A
+ECF8
+F06C
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+C42C
+F02C
+C42D
+F02D
+C42E
+F02E
+C42F
+F02F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+EC8E
+F06D
+C027
+F448
+C028
+F449
+C029
+F44A
+C02A
+F44B
+C440
+F02C
+C441
+F02D
+C442
+F02E
+C443
+F02F
+C42C
+F027
+C42D
+F028
+C42E
+F029
+C42F
+F02A
+ECF7
+F06C
+C027
+F004
+C028
+F005
+C029
+F006
+C02A
+F007
+C448
+F02C
+C449
+F02D
+C44A
+F02E
+C44B
+F02F
+C004
+F027
+C005
+F028
+C006
+F029
+C007
+F02A
+ECE1
+F06D
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+0104
+5100
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E67
+26E9
+0E05
+22EA
+C000
+FFEE
+C001
+FFEE
+C002
+FFEE
+C003
+FFEE
+0104
+5100
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E67
+26E9
+0E05
+22EA
+CFEE
+F000
+CFEE
+F001
+CFEE
+F002
+CFEF
+F003
+6A2C
+6A2D
+6A2E
+6A2F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+ECD2
+F06E
+0A01
+E10F
+0104
+5100
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E67
+26E9
+0E05
+22EA
+6AEE
+6AEE
+6AEE
+6AEE
+0104
+5100
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E67
+26E9
+0E05
+22EA
+CFEE
+F000
+CFEE
+F001
+CFEE
+F002
+CFEF
+F003
+C470
+F02C
+C471
+F02D
+C472
+F02E
+C473
+F02F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+ECC9
+F06E
+0A01
+E115
+0104
+5100
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E67
+26E9
+0E05
+22EA
+CFEE
+F470
+CFEE
+F471
+CFEE
+F472
+CFEF
+F473
+C400
+F563
+0104
+2B00
+EFC9
+F08F
+0012
+0105
+6B22
+0E01
+0104
+6F04
+6B05
+D8ED
+ECF1
+F09B
+0E0A
+0105
+2522
+6F22
+0E01
+0104
+2504
+6F04
+0E00
+2105
+6F05
+0105
+051F
+E135
+C2B3
+F02C
+C2B4
+F02D
+C2B5
+F02E
+C2B6
+F02F
+C29B
+F027
+C29C
+F028
+C29D
+F029
+C29E
+F02A
+ECE1
+F06D
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+C2AF
+F02C
+C2B0
+F02D
+C2B1
+F02E
+C2B2
+F02F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+ECF8
+F06C
+C027
+F410
+C028
+F411
+C029
+F412
+C02A
+F413
+D008
+C474
+F410
+C475
+F411
+C476
+F412
+C477
+F413
+C430
+F02C
+C431
+F02D
+C432
+F02E
+C433
+F02F
+C410
+F027
+C411
+F028
+C412
+F029
+C413
+F02A
+ECC9
+F06E
+0A01
+E103
+0104
+6904
+6B05
+0104
+0E11
+5D04
+0E00
+5905
+E395
+0EFF
+1904
+E101
+5105
+E105
+D8CF
+0E0A
+0105
+5D22
+6F22
+0E01
+0104
+6F04
+6B05
+0E3C
+0105
+5D22
+E270
+DAFF
+0105
+2922
+6F22
+0E01
+0104
+2504
+6F04
+0E00
+2105
+6F05
+0105
+051F
+E135
+C2B3
+F02C
+C2B4
+F02D
+C2B5
+F02E
+C2B6
+F02F
+C29B
+F027
+C29C
+F028
+C29D
+F029
+C29E
+F02A
+ECE1
+F06D
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+C2AF
+F02C
+C2B0
+F02D
+C2B1
+F02E
+C2B2
+F02F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+ECF8
+F06C
+C027
+F410
+C028
+F411
+C029
+F412
+C02A
+F413
+D008
+C474
+F410
+C475
+F411
+C476
+F412
+C477
+F413
+C430
+F02C
+C431
+F02D
+C432
+F02E
+C433
+F02F
+C410
+F027
+C411
+F028
+C412
+F029
+C413
+F02A
+ECC9
+F06E
+0A01
+E103
+0104
+6904
+6B05
+0104
+0E0A
+5D04
+0E00
+5905
+E398
+0EFF
+1904
+E101
+5105
+E103
+0105
+0522
+6F22
+0012
+0104
+6B01
+0E10
+5D01
+E24C
+5101
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E00
+26E9
+0E06
+22EA
+CFEE
+F000
+CFEE
+F001
+CFEE
+F002
+CFEF
+F003
+5101
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E80
+26E9
+0E06
+22EA
+C000
+FFEE
+C001
+FFEE
+C002
+FFEE
+C003
+FFEE
+0E10
+2501
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E00
+26E9
+0E06
+22EA
+CFEE
+F000
+CFEE
+F001
+CFEE
+F002
+CFEF
+F003
+0E10
+2501
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E80
+26E9
+0E06
+22EA
+C000
+FFEE
+C001
+FFEE
+C002
+FFEE
+C003
+FFEE
+2B01
+D7B1
+0012
+0104
+6B01
+0E10
+5D01
+E24C
+5101
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E80
+26E9
+0E06
+22EA
+CFEE
+F000
+CFEE
+F001
+CFEE
+F002
+CFEF
+F003
+5101
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E00
+26E9
+0E06
+22EA
+C000
+FFEE
+C001
+FFEE
+C002
+FFEE
+C003
+FFEE
+0E10
+2501
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E80
+26E9
+0E06
+22EA
+CFEE
+F000
+CFEE
+F001
+CFEE
+F002
+CFEF
+F003
+0E10
+2501
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E00
+26E9
+0E06
+22EA
+C000
+FFEE
+C001
+FFEE
+C002
+FFEE
+C003
+FFEE
+2B01
+D7B1
+0012
+C40C
+F02C
+C40D
+F02D
+C40E
+F02E
+C40F
+F02F
+C408
+F027
+C409
+F028
+C40A
+F029
+C40B
+F02A
+ECC9
+F06E
+0A01
+E001
+D096
+0105
+5123
+0A01
+E049
+0A03
+E045
+C40C
+F02C
+C40D
+F02D
+C40E
+F02E
+C40F
+F02F
+C408
+F027
+C409
+F028
+C40A
+F029
+C40B
+F02A
+ECF7
+F06C
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+0E9A
+6E2C
+0E99
+6E2D
+0E19
+6E2E
+0E3F
+6E2F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+ECF8
+F06C
+C027
+F410
+C028
+F411
+C029
+F412
+C02A
+F413
+6A2C
+6A2D
+6A2E
+6A2F
+C410
+F027
+C411
+F028
+C412
+F029
+C413
+F02A
+ECD2
+F06E
+0A01
+E109
+D003
+6931
+D048
+D047
+0104
+6B10
+6B11
+6B12
+6B13
+6A2C
+6A2D
+0E7F
+6E2E
+0E43
+6E2F
+C410
+F027
+C411
+F028
+C412
+F029
+C413
+F02A
+ECC9
+F06E
+0A01
+E107
+0104
+6B10
+6B11
+0E7F
+6F12
+0E43
+6F13
+C410
+F027
+C411
+F028
+C412
+F029
+C413
+F02A
+EC6C
+F06E
+C029
+F531
+0104
+6B00
+0E07
+5D00
+E218
+5100
+6AEA
+0F24
+6EE9
+0E05
+22EA
+50EF
+0105
+2531
+0104
+6F01
+0105
+5131
+0104
+5D01
+E203
+0105
+6931
+D002
+C401
+F531
+0104
+2B00
+D7E5
+D002
+0105
+6B31
+0012
+C470
+F474
+C471
+F475
+C472
+F476
+C473
+F477
+0105
+5163
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E80
+26E9
+0E04
+22EA
+CFEE
+F000
+CFEE
+F001
+CFEE
+F002
+CFEF
+F003
+0E10
+2563
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E80
+26E9
+0E04
+22EA
+CFEE
+F004
+CFEE
+F005
+CFEE
+F006
+CFEF
+F007
+C004
+F02C
+C005
+F02D
+C006
+F02E
+C007
+F02F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+ECF8
+F06C
+C027
+F2AF
+C028
+F2B0
+C029
+F2B1
+C02A
+F2B2
+C2AF
+F02C
+C2B0
+F02D
+C2B1
+F02E
+C2B2
+F02F
+C474
+F027
+C475
+F028
+C476
+F029
+C477
+F02A
+ECF7
+F06C
+C027
+F2B3
+C028
+F2B4
+C029
+F2B5
+C02A
+F2B6
+C2B3
+F02C
+C2B4
+F02D
+C2B5
+F02E
+C2B6
+F02F
+C297
+F027
+C298
+F028
+C299
+F029
+C29A
+F02A
+ECE1
+F06D
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+C2AF
+F02C
+C2B0
+F02D
+C2B1
+F02E
+C2B2
+F02F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+ECF8
+F06C
+C027
+F2B7
+C028
+F2B8
+C029
+F2B9
+C02A
+F2BA
+C40C
+F02C
+C40D
+F02D
+C40E
+F02E
+C40F
+F02F
+C2B7
+F027
+C2B8
+F028
+C2B9
+F029
+C2BA
+F02A
+ECF7
+F06C
+C027
+F2BB
+C028
+F2BC
+C029
+F2BD
+C02A
+F2BE
+6A2C
+6A2D
+6A2E
+6A2F
+C2BB
+F027
+C2BC
+F028
+C2BD
+F029
+C2BE
+F02A
+ECD2
+F06E
+0A01
+E105
+0102
+6BBB
+6BBC
+6BBD
+6BBE
+C563
+F2C2
+0104
+6B01
+0E10
+5D01
+E270
+5101
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E80
+26E9
+0E04
+22EA
+CFEE
+F000
+CFEE
+F001
+CFEE
+F002
+CFEF
+F003
+5101
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E00
+26E9
+0E06
+22EA
+C000
+FFEE
+C001
+FFEE
+C002
+FFEE
+C003
+FFEE
+0E10
+2501
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E80
+26E9
+0E04
+22EA
+CFEE
+F000
+CFEE
+F001
+CFEE
+F002
+CFEF
+F003
+0E10
+2501
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E00
+26E9
+0E06
+22EA
+C000
+FFEE
+C001
+FFEE
+C002
+FFEE
+C003
+FFEE
+5101
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E67
+26E9
+0E05
+22EA
+CFEE
+F000
+CFEE
+F001
+CFEE
+F002
+CFEF
+F003
+5101
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0EA7
+26E9
+0E05
+22EA
+C000
+FFEE
+C001
+FFEE
+C002
+FFEE
+C003
+FFEE
+2B01
+D78D
+0012
+0104
+6B74
+6B75
+6B76
+6B77
+0102
+69C2
+EE13
+F000
+0E01
+6EF8
+0104
+6B00
+0E10
+0104
+5D00
+E301
+D391
+0E02
+6EF7
+0104
+5100
+2500
+2500
+2500
+0F80
+6EF6
+0009
+CFF5
+F441
+0009
+CFF5
+F440
+0009
+CFF5
+F443
+0008
+CFF5
+F442
+0F40
+6EF6
+0009
+CFF5
+F445
+0009
+CFF5
+F444
+0009
+CFF5
+F447
+0008
+CFF5
+F446
+0F40
+6EF6
+2AF7
+0009
+CFF5
+F449
+0009
+CFF5
+F448
+0009
+CFF5
+F44B
+0008
+CFF5
+F44A
+0F40
+6EF6
+0009
+CFF5
+F44D
+0009
+CFF5
+F44C
+0009
+CFF5
+F44F
+0008
+CFF5
+F44E
+0FC0
+6EF6
+2AF7
+0009
+CFF5
+F461
+0009
+CFF5
+F460
+0009
+CFF5
+F463
+0008
+CFF5
+F462
+0F40
+6EF6
+0009
+CFF5
+F465
+0009
+CFF5
+F464
+0009
+CFF5
+F467
+0008
+CFF5
+F466
+0104
+5100
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E00
+26E9
+0E06
+22EA
+CFEE
+F004
+CFEE
+F005
+CFEE
+F006
+CFEF
+F007
+C004
+F02C
+C005
+F02D
+C006
+F02E
+C007
+F02F
+C424
+F027
+C425
+F028
+C426
+F029
+C427
+F02A
+ECF7
+F06C
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+C460
+F02C
+C461
+F02D
+C462
+F02E
+C463
+F02F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+ECE1
+F06D
+C027
+F42C
+C028
+F42D
+C029
+F42E
+C02A
+F42F
+EC1C
+F06A
+0104
+5100
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E00
+26E9
+0E06
+22EA
+CFEE
+F004
+CFEE
+F005
+CFEE
+F006
+CFEF
+F007
+C42C
+F02C
+C42D
+F02D
+C42E
+F02E
+C42F
+F02F
+C004
+F027
+C005
+F028
+C006
+F029
+C007
+F02A
+ECF8
+F06C
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+0104
+5100
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E00
+26E9
+0E06
+22EA
+C000
+FFEE
+C001
+FFEE
+C002
+FFEE
+C003
+FFEE
+0E10
+0104
+2500
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E00
+26E9
+0E06
+22EA
+CFEE
+F004
+CFEE
+F005
+CFEE
+F006
+CFEF
+F007
+C004
+F02C
+C005
+F02D
+C006
+F02E
+C007
+F02F
+C428
+F027
+C429
+F028
+C42A
+F029
+C42B
+F02A
+ECF7
+F06C
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+C464
+F02C
+C465
+F02D
+C466
+F02E
+C467
+F02F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+ECE1
+F06D
+C027
+F42C
+C028
+F42D
+C029
+F42E
+C02A
+F42F
+EC1C
+F06A
+0E10
+0104
+2500
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E00
+26E9
+0E06
+22EA
+CFEE
+F004
+CFEE
+F005
+CFEE
+F006
+CFEF
+F007
+C42C
+F02C
+C42D
+F02D
+C42E
+F02E
+C42F
+F02F
+C004
+F027
+C005
+F028
+C006
+F029
+C007
+F02A
+ECF8
+F06C
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+0E10
+0104
+2500
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E00
+26E9
+0E06
+22EA
+C000
+FFEE
+C001
+FFEE
+C002
+FFEE
+C003
+FFEE
+0104
+5100
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E00
+26E9
+0E06
+22EA
+CFEE
+F000
+CFEE
+F001
+CFEE
+F002
+CFEF
+F003
+0E10
+0104
+2500
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E00
+26E9
+0E06
+22EA
+CFEE
+F004
+CFEE
+F005
+CFEE
+F006
+CFEF
+F007
+C004
+F02C
+C005
+F02D
+C006
+F02E
+C007
+F02F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+ECF8
+F06C
+C027
+F42C
+C028
+F42D
+C029
+F42E
+C02A
+F42F
+0104
+5100
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E00
+26E9
+0E06
+22EA
+CFEE
+F008
+CFEE
+F009
+CFEE
+F00A
+CFEF
+F00B
+C008
+F02C
+C009
+F02D
+C00A
+F02E
+C00B
+F02F
+C440
+F027
+C441
+F028
+C442
+F029
+C443
+F02A
+ECE1
+F06D
+C027
+F004
+C028
+F005
+C029
+F006
+C02A
+F007
+0E10
+0104
+2500
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E00
+26E9
+0E06
+22EA
+CFEE
+F010
+CFEE
+F011
+CFEE
+F012
+CFEF
+F013
+C010
+F02C
+C011
+F02D
+C012
+F02E
+C013
+F02F
+C444
+F027
+C445
+F028
+C446
+F029
+C447
+F02A
+ECE1
+F06D
+C027
+F00C
+C028
+F00D
+C029
+F00E
+C02A
+F00F
+C00C
+F02C
+C00D
+F02D
+C00E
+F02E
+C00F
+F02F
+C004
+F027
+C005
+F028
+C006
+F029
+C007
+F02A
+ECF8
+F06C
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+C42C
+F02C
+C42D
+F02D
+C42E
+F02E
+C42F
+F02F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+EC8E
+F06D
+C027
+F440
+C028
+F441
+C029
+F442
+C02A
+F443
+0104
+5100
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E00
+26E9
+0E06
+22EA
+CFEE
+F008
+CFEE
+F009
+CFEE
+F00A
+CFEF
+F00B
+C008
+F02C
+C009
+F02D
+C00A
+F02E
+C00B
+F02F
+C448
+F027
+C449
+F028
+C44A
+F029
+C44B
+F02A
+ECE1
+F06D
+C027
+F004
+C028
+F005
+C029
+F006
+C02A
+F007
+0E10
+0104
+2500
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E00
+26E9
+0E06
+22EA
+CFEE
+F010
+CFEE
+F011
+CFEE
+F012
+CFEF
+F013
+C010
+F02C
+C011
+F02D
+C012
+F02E
+C013
+F02F
+C44C
+F027
+C44D
+F028
+C44E
+F029
+C44F
+F02A
+ECE1
+F06D
+C027
+F00C
+C028
+F00D
+C029
+F00E
+C02A
+F00F
+C00C
+F02C
+C00D
+F02D
+C00E
+F02E
+C00F
+F02F
+C004
+F027
+C005
+F028
+C006
+F029
+C007
+F02A
+ECF8
+F06C
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+C42C
+F02C
+C42D
+F02D
+C42E
+F02E
+C42F
+F02F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+EC8E
+F06D
+C027
+F448
+C028
+F449
+C029
+F44A
+C02A
+F44B
+C440
+F02C
+C441
+F02D
+C442
+F02E
+C443
+F02F
+C42C
+F027
+C42D
+F028
+C42E
+F029
+C42F
+F02A
+ECF7
+F06C
+C027
+F004
+C028
+F005
+C029
+F006
+C02A
+F007
+C448
+F02C
+C449
+F02D
+C44A
+F02E
+C44B
+F02F
+C004
+F027
+C005
+F028
+C006
+F029
+C007
+F02A
+ECE1
+F06D
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+0104
+5100
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0EA7
+26E9
+0E05
+22EA
+C000
+FFEE
+C001
+FFEE
+C002
+FFEE
+C003
+FFEE
+0104
+5100
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0EA7
+26E9
+0E05
+22EA
+CFEE
+F000
+CFEE
+F001
+CFEE
+F002
+CFEF
+F003
+6A2C
+6A2D
+6A2E
+6A2F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+ECD2
+F06E
+0A01
+E10F
+0104
+5100
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0EA7
+26E9
+0E05
+22EA
+6AEE
+6AEE
+6AEE
+6AEE
+0104
+5100
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0EA7
+26E9
+0E05
+22EA
+CFEE
+F000
+CFEE
+F001
+CFEE
+F002
+CFEF
+F003
+C474
+F02C
+C475
+F02D
+C476
+F02E
+C477
+F02F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+ECC9
+F06E
+0A01
+E11D
+C42C
+F2AF
+C42D
+F2B0
+C42E
+F2B1
+C42F
+F2B2
+0104
+5100
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0EA7
+26E9
+0E05
+22EA
+CFEE
+F474
+CFEE
+F475
+CFEE
+F476
+CFEF
+F477
+C400
+F2C2
+0104
+2B00
+D46A
+C2AF
+F02C
+C2B0
+F02D
+C2B1
+F02E
+C2B2
+F02F
+C474
+F027
+C475
+F028
+C476
+F029
+C477
+F02A
+ECF7
+F06C
+C027
+F2B3
+C028
+F2B4
+C029
+F2B5
+C02A
+F2B6
+C2B3
+F02C
+C2B4
+F02D
+C2B5
+F02E
+C2B6
+F02F
+C297
+F027
+C298
+F028
+C299
+F029
+C29A
+F02A
+ECE1
+F06D
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+C2AF
+F02C
+C2B0
+F02D
+C2B1
+F02E
+C2B2
+F02F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+ECF8
+F06C
+C027
+F2B7
+C028
+F2B8
+C029
+F2B9
+C02A
+F2BA
+C40C
+F02C
+C40D
+F02D
+C40E
+F02E
+C40F
+F02F
+C2B7
+F027
+C2B8
+F028
+C2B9
+F029
+C2BA
+F02A
+ECF7
+F06C
+C027
+F2BB
+C028
+F2BC
+C029
+F2BD
+C02A
+F2BE
+6A2C
+6A2D
+6A2E
+6A2F
+C2BB
+F027
+C2BC
+F028
+C2BD
+F029
+C2BE
+F02A
+ECD2
+F06E
+0A01
+E105
+0102
+6BBB
+6BBC
+6BBD
+6BBE
+0012
+0104
+6B74
+6B75
+6B76
+6B77
+0102
+69C2
+EE13
+F000
+0E01
+6EF8
+0104
+6B00
+0E10
+0104
+5D00
+E301
+D392
+0E02
+6EF7
+0104
+5100
+2500
+2500
+2500
+0F80
+6EF6
+0009
+CFF5
+F441
+0009
+CFF5
+F440
+0009
+CFF5
+F443
+0008
+CFF5
+F442
+0F40
+6EF6
+0009
+CFF5
+F445
+0009
+CFF5
+F444
+0009
+CFF5
+F447
+0008
+CFF5
+F446
+0F40
+6EF6
+2AF7
+0009
+CFF5
+F449
+0009
+CFF5
+F448
+0009
+CFF5
+F44B
+0008
+CFF5
+F44A
+0F40
+6EF6
+0009
+CFF5
+F44D
+0009
+CFF5
+F44C
+0009
+CFF5
+F44F
+0008
+CFF5
+F44E
+0FC0
+6EF6
+2AF7
+2AF7
+0009
+CFF5
+F461
+0009
+CFF5
+F460
+0009
+CFF5
+F463
+0008
+CFF5
+F462
+0F40
+6EF6
+0009
+CFF5
+F465
+0009
+CFF5
+F464
+0009
+CFF5
+F467
+0008
+CFF5
+F466
+0104
+5100
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E00
+26E9
+0E06
+22EA
+CFEE
+F004
+CFEE
+F005
+CFEE
+F006
+CFEF
+F007
+C004
+F02C
+C005
+F02D
+C006
+F02E
+C007
+F02F
+C424
+F027
+C425
+F028
+C426
+F029
+C427
+F02A
+ECF7
+F06C
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+C460
+F02C
+C461
+F02D
+C462
+F02E
+C463
+F02F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+ECE1
+F06D
+C027
+F42C
+C028
+F42D
+C029
+F42E
+C02A
+F42F
+EC1C
+F06A
+0104
+5100
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E00
+26E9
+0E06
+22EA
+CFEE
+F004
+CFEE
+F005
+CFEE
+F006
+CFEF
+F007
+C42C
+F02C
+C42D
+F02D
+C42E
+F02E
+C42F
+F02F
+C004
+F027
+C005
+F028
+C006
+F029
+C007
+F02A
+ECF8
+F06C
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+0104
+5100
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E00
+26E9
+0E06
+22EA
+C000
+FFEE
+C001
+FFEE
+C002
+FFEE
+C003
+FFEE
+0E10
+0104
+2500
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E00
+26E9
+0E06
+22EA
+CFEE
+F004
+CFEE
+F005
+CFEE
+F006
+CFEF
+F007
+C004
+F02C
+C005
+F02D
+C006
+F02E
+C007
+F02F
+C428
+F027
+C429
+F028
+C42A
+F029
+C42B
+F02A
+ECF7
+F06C
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+C464
+F02C
+C465
+F02D
+C466
+F02E
+C467
+F02F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+ECE1
+F06D
+C027
+F42C
+C028
+F42D
+C029
+F42E
+C02A
+F42F
+EC1C
+F06A
+0E10
+0104
+2500
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E00
+26E9
+0E06
+22EA
+CFEE
+F004
+CFEE
+F005
+CFEE
+F006
+CFEF
+F007
+C42C
+F02C
+C42D
+F02D
+C42E
+F02E
+C42F
+F02F
+C004
+F027
+C005
+F028
+C006
+F029
+C007
+F02A
+ECF8
+F06C
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+0E10
+0104
+2500
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E00
+26E9
+0E06
+22EA
+C000
+FFEE
+C001
+FFEE
+C002
+FFEE
+C003
+FFEE
+0104
+5100
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E00
+26E9
+0E06
+22EA
+CFEE
+F000
+CFEE
+F001
+CFEE
+F002
+CFEF
+F003
+0E10
+0104
+2500
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E00
+26E9
+0E06
+22EA
+CFEE
+F004
+CFEE
+F005
+CFEE
+F006
+CFEF
+F007
+C004
+F02C
+C005
+F02D
+C006
+F02E
+C007
+F02F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+ECF8
+F06C
+C027
+F42C
+C028
+F42D
+C029
+F42E
+C02A
+F42F
+0104
+5100
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E00
+26E9
+0E06
+22EA
+CFEE
+F008
+CFEE
+F009
+CFEE
+F00A
+CFEF
+F00B
+C008
+F02C
+C009
+F02D
+C00A
+F02E
+C00B
+F02F
+C440
+F027
+C441
+F028
+C442
+F029
+C443
+F02A
+ECE1
+F06D
+C027
+F004
+C028
+F005
+C029
+F006
+C02A
+F007
+0E10
+0104
+2500
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E00
+26E9
+0E06
+22EA
+CFEE
+F010
+CFEE
+F011
+CFEE
+F012
+CFEF
+F013
+C010
+F02C
+C011
+F02D
+C012
+F02E
+C013
+F02F
+C444
+F027
+C445
+F028
+C446
+F029
+C447
+F02A
+ECE1
+F06D
+C027
+F00C
+C028
+F00D
+C029
+F00E
+C02A
+F00F
+C00C
+F02C
+C00D
+F02D
+C00E
+F02E
+C00F
+F02F
+C004
+F027
+C005
+F028
+C006
+F029
+C007
+F02A
+ECF8
+F06C
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+C42C
+F02C
+C42D
+F02D
+C42E
+F02E
+C42F
+F02F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+EC8E
+F06D
+C027
+F440
+C028
+F441
+C029
+F442
+C02A
+F443
+0104
+5100
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E00
+26E9
+0E06
+22EA
+CFEE
+F008
+CFEE
+F009
+CFEE
+F00A
+CFEF
+F00B
+C008
+F02C
+C009
+F02D
+C00A
+F02E
+C00B
+F02F
+C448
+F027
+C449
+F028
+C44A
+F029
+C44B
+F02A
+ECE1
+F06D
+C027
+F004
+C028
+F005
+C029
+F006
+C02A
+F007
+0E10
+0104
+2500
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E00
+26E9
+0E06
+22EA
+CFEE
+F010
+CFEE
+F011
+CFEE
+F012
+CFEF
+F013
+C010
+F02C
+C011
+F02D
+C012
+F02E
+C013
+F02F
+C44C
+F027
+C44D
+F028
+C44E
+F029
+C44F
+F02A
+ECE1
+F06D
+C027
+F00C
+C028
+F00D
+C029
+F00E
+C02A
+F00F
+C00C
+F02C
+C00D
+F02D
+C00E
+F02E
+C00F
+F02F
+C004
+F027
+C005
+F028
+C006
+F029
+C007
+F02A
+ECF8
+F06C
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+C42C
+F02C
+C42D
+F02D
+C42E
+F02E
+C42F
+F02F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+EC8E
+F06D
+C027
+F448
+C028
+F449
+C029
+F44A
+C02A
+F44B
+C440
+F02C
+C441
+F02D
+C442
+F02E
+C443
+F02F
+C42C
+F027
+C42D
+F028
+C42E
+F029
+C42F
+F02A
+ECF7
+F06C
+C027
+F004
+C028
+F005
+C029
+F006
+C02A
+F007
+C448
+F02C
+C449
+F02D
+C44A
+F02E
+C44B
+F02F
+C004
+F027
+C005
+F028
+C006
+F029
+C007
+F02A
+ECE1
+F06D
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+0104
+5100
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0EA7
+26E9
+0E05
+22EA
+C000
+FFEE
+C001
+FFEE
+C002
+FFEE
+C003
+FFEE
+0104
+5100
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0EA7
+26E9
+0E05
+22EA
+CFEE
+F000
+CFEE
+F001
+CFEE
+F002
+CFEF
+F003
+6A2C
+6A2D
+6A2E
+6A2F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+ECD2
+F06E
+0A01
+E10F
+0104
+5100
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0EA7
+26E9
+0E05
+22EA
+6AEE
+6AEE
+6AEE
+6AEE
+0104
+5100
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0EA7
+26E9
+0E05
+22EA
+CFEE
+F000
+CFEE
+F001
+CFEE
+F002
+CFEF
+F003
+C474
+F02C
+C475
+F02D
+C476
+F02E
+C477
+F02F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+ECC9
+F06E
+0A01
+E11D
+C42C
+F2AF
+C42D
+F2B0
+C42E
+F2B1
+C42F
+F2B2
+0104
+5100
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0EA7
+26E9
+0E05
+22EA
+CFEE
+F474
+CFEE
+F475
+CFEE
+F476
+CFEF
+F477
+C400
+F2C2
+0104
+2B00
+D469
+C2AF
+F02C
+C2B0
+F02D
+C2B1
+F02E
+C2B2
+F02F
+C474
+F027
+C475
+F028
+C476
+F029
+C477
+F02A
+ECF7
+F06C
+C027
+F2B3
+C028
+F2B4
+C029
+F2B5
+C02A
+F2B6
+C2B3
+F02C
+C2B4
+F02D
+C2B5
+F02E
+C2B6
+F02F
+C297
+F027
+C298
+F028
+C299
+F029
+C29A
+F02A
+ECE1
+F06D
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+C2AF
+F02C
+C2B0
+F02D
+C2B1
+F02E
+C2B2
+F02F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+ECF8
+F06C
+C027
+F2B7
+C028
+F2B8
+C029
+F2B9
+C02A
+F2BA
+C40C
+F02C
+C40D
+F02D
+C40E
+F02E
+C40F
+F02F
+C2B7
+F027
+C2B8
+F028
+C2B9
+F029
+C2BA
+F02A
+ECF7
+F06C
+C027
+F2BB
+C028
+F2BC
+C029
+F2BD
+C02A
+F2BE
+6A2C
+6A2D
+6A2E
+6A2F
+C2BB
+F027
+C2BC
+F028
+C2BD
+F029
+C2BE
+F02A
+ECD2
+F06E
+0A01
+E105
+0102
+6BBB
+6BBC
+6BBD
+6BBE
+0012
+0105
+6B2B
+6B2C
+6B2D
+6B2E
+6B2F
+6B30
+6B24
+6B25
+6B26
+6B27
+6B28
+6B29
+6B2A
+0012
+0104
+6B01
+5101
+6AEA
+0F2B
+6EE9
+0E05
+22EA
+50EF
+6E00
+6A01
+0102
+51BF
+1800
+E102
+51C0
+1801
+E128
+0104
+5101
+6AEA
+0F24
+6EE9
+0E05
+22EA
+50EF
+0102
+25C1
+0104
+6F04
+6B05
+0E00
+5D04
+0E00
+5905
+E202
+6B04
+6B05
+0EF0
+80D8
+5504
+0E00
+5505
+E203
+0EF0
+6F04
+6B05
+5101
+6AEA
+0F24
+6EE9
+0E05
+22EA
+C404
+FFEF
+0E0A
+6F01
+D049
+0104
+5101
+6AEA
+0F2B
+6EE9
+0E05
+22EA
+50EF
+E13F
+0102
+0EFF
+80D8
+55BF
+0E00
+55C0
+E209
+0104
+5101
+6AEA
+0F2B
+6EE9
+0E05
+22EA
+68EF
+D009
+0104
+5101
+6AEA
+0F2B
+6EE9
+0E05
+22EA
+C2BF
+FFEF
+5101
+6AEA
+0F24
+6EE9
+0E05
+22EA
+50EF
+0102
+25C1
+0104
+6F04
+6B05
+0EF0
+80D8
+5504
+0E00
+5505
+E209
+5101
+6AEA
+0F24
+6EE9
+0E05
+22EA
+0EF0
+6EEF
+D008
+5101
+6AEA
+0F24
+6EE9
+0E05
+22EA
+C404
+FFEF
+0E0A
+6F01
+D001
+2B01
+0E06
+5D01
+E201
+D77B
+0E06
+5D01
+E113
+0105
+512A
+0102
+25C1
+0104
+6F04
+6B05
+0EDC
+80D8
+5504
+0E00
+5505
+E204
+0105
+0EDC
+6F2A
+D002
+C404
+F52A
+0012
+0105
+5163
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E80
+26E9
+0E04
+22EA
+CFEE
+F000
+CFEE
+F001
+CFEE
+F002
+CFEF
+F003
+0E10
+2563
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E80
+26E9
+0E04
+22EA
+CFEE
+F004
+CFEE
+F005
+CFEE
+F006
+CFEF
+F007
+C004
+F02C
+C005
+F02D
+C006
+F02E
+C007
+F02F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+ECF8
+F06C
+C027
+F42C
+C028
+F42D
+C029
+F42E
+C02A
+F42F
+C408
+F02C
+C409
+F02D
+C40A
+F02E
+C40B
+F02F
+C42C
+F027
+C42D
+F028
+C42E
+F029
+C42F
+F02A
+ECF7
+F06C
+C027
+F410
+C028
+F411
+C029
+F412
+C02A
+F413
+0105
+5163
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E67
+26E9
+0E05
+22EA
+CFEE
+F000
+CFEE
+F001
+CFEE
+F002
+CFEF
+F003
+C000
+F02C
+C001
+F02D
+C002
+F02E
+C003
+F02F
+C42C
+F027
+C42D
+F028
+C42E
+F029
+C42F
+F02A
+ECF7
+F06C
+C027
+F414
+C028
+F415
+C029
+F416
+C02A
+F417
+C414
+F02C
+C415
+F02D
+C416
+F02E
+C417
+F02F
+C410
+F027
+C411
+F028
+C412
+F029
+C413
+F02A
+EC8E
+F06D
+C027
+F414
+C028
+F415
+C029
+F416
+C02A
+F417
+6A2C
+6A2D
+0EC8
+6E2E
+0E42
+6E2F
+C414
+F027
+C415
+F028
+C416
+F029
+C417
+F02A
+ECE1
+F06D
+C027
+F414
+C028
+F415
+C029
+F416
+C02A
+F417
+6A2C
+6A2D
+6A2E
+6A2F
+C414
+F027
+C415
+F028
+C416
+F029
+C417
+F02A
+ECD2
+F06E
+0A01
+E105
+0104
+6B14
+6B15
+6B16
+6B17
+6A2C
+6A2D
+0E7F
+6E2E
+0E43
+6E2F
+C414
+F027
+C415
+F028
+C416
+F029
+C417
+F02A
+ECC9
+F06E
+0A01
+E107
+0104
+6B14
+6B15
+0E7F
+6F16
+0E43
+6F17
+6A2C
+6A2D
+6A2E
+6A2F
+C410
+F027
+C411
+F028
+C412
+F029
+C413
+F02A
+ECD2
+F06E
+0A01
+E103
+0105
+6B32
+D00C
+C414
+F027
+C415
+F028
+C416
+F029
+C417
+F02A
+EC6C
+F06E
+C029
+F532
+C414
+F418
+C415
+F419
+C416
+F41A
+C417
+F41B
+0105
+051F
+E001
+D13E
+C2C5
+F029
+ECD1
+F06C
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+0E96
+6E2C
+0EB2
+6E2D
+0ECC
+6E2E
+0E3D
+6E2F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+ECE1
+F06D
+C027
+F410
+C028
+F411
+C029
+F412
+C02A
+F413
+C40C
+F02C
+C40D
+F02D
+C40E
+F02E
+C40F
+F02F
+C408
+F027
+C409
+F028
+C40A
+F029
+C40B
+F02A
+ECF7
+F06C
+C027
+F414
+C028
+F415
+C029
+F416
+C02A
+F417
+6A2C
+6A2D
+6A2E
+6A2F
+C414
+F027
+C415
+F028
+C416
+F029
+C417
+F02A
+ECC9
+F06E
+0A01
+E009
+C29B
+F410
+C29C
+F411
+C29D
+F412
+C29E
+F413
+D085
+C410
+F02C
+C411
+F02D
+C412
+F02E
+C413
+F02F
+C414
+F027
+C415
+F028
+C416
+F029
+C417
+F02A
+ECD2
+F06E
+0A01
+E009
+C297
+F410
+C298
+F411
+C299
+F412
+C29A
+F413
+D068
+C414
+F02C
+C415
+F02D
+C416
+F02E
+C417
+F02F
+C410
+F027
+C411
+F028
+C412
+F029
+C413
+F02A
+ECF7
+F06C
+C027
+F008
+C028
+F009
+C029
+F00A
+C02A
+F00B
+C410
+F02C
+C411
+F02D
+C412
+F02E
+C413
+F02F
+C008
+F027
+C009
+F028
+C00A
+F029
+C00B
+F02A
+EC8E
+F06D
+C027
+F004
+C028
+F005
+C029
+F006
+C02A
+F007
+C29F
+F02C
+C2A0
+F02D
+C2A1
+F02E
+C2A2
+F02F
+C004
+F027
+C005
+F028
+C006
+F029
+C007
+F02A
+ECE1
+F06D
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+C000
+F02C
+C001
+F02D
+C002
+F02E
+C003
+F02F
+C297
+F027
+C298
+F028
+C299
+F029
+C29A
+F02A
+ECF8
+F06C
+C027
+F410
+C028
+F411
+C029
+F412
+C02A
+F413
+0102
+51C5
+E108
+C29B
+F410
+C29C
+F411
+C29D
+F412
+C29E
+F413
+C410
+F02C
+C411
+F02D
+C412
+F02E
+C413
+F02F
+C418
+F027
+C419
+F028
+C41A
+F029
+C41B
+F02A
+EC8E
+F06D
+C027
+F414
+C028
+F415
+C029
+F416
+C02A
+F417
+6A2C
+6A2D
+6A2E
+6A2F
+C414
+F027
+C415
+F028
+C416
+F029
+C417
+F02A
+ECD2
+F06E
+0A01
+E105
+0104
+6B14
+6B15
+6B16
+6B17
+6A2C
+6A2D
+0E7F
+6E2E
+0E43
+6E2F
+C414
+F027
+C415
+F028
+C416
+F029
+C417
+F02A
+ECC9
+F06E
+0A01
+E107
+0104
+6B14
+6B15
+0E7F
+6F16
+0E43
+6F17
+C414
+F027
+C415
+F028
+C416
+F029
+C417
+F02A
+EC6C
+F06E
+C029
+F566
+D002
+C532
+F566
+0012
+C500
+F028
+C501
+F029
+ECE2
+F06C
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+6A2C
+6A2D
+0E7A
+6E2E
+0E44
+6E2F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+EC8E
+F06D
+C027
+F408
+C028
+F409
+C029
+F40A
+C02A
+F40B
+0104
+6B00
+0E10
+5D00
+E301
+D117
+5100
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E80
+26E9
+0E04
+22EA
+CFEE
+F000
+CFEE
+F001
+CFEE
+F002
+CFEF
+F003
+0E10
+2500
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E80
+26E9
+0E04
+22EA
+CFEE
+F004
+CFEE
+F005
+CFEE
+F006
+CFEF
+F007
+C004
+F02C
+C005
+F02D
+C006
+F02E
+C007
+F02F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+ECF8
+F06C
+C027
+F42C
+C028
+F42D
+C029
+F42E
+C02A
+F42F
+C408
+F02C
+C409
+F02D
+C40A
+F02E
+C40B
+F02F
+C42C
+F027
+C42D
+F028
+C42E
+F029
+C42F
+F02A
+ECF7
+F06C
+C027
+F410
+C028
+F411
+C029
+F412
+C02A
+F413
+0104
+5100
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E67
+26E9
+0E05
+22EA
+CFEE
+F000
+CFEE
+F001
+CFEE
+F002
+CFEF
+F003
+C000
+F02C
+C001
+F02D
+C002
+F02E
+C003
+F02F
+C42C
+F027
+C42D
+F028
+C42E
+F029
+C42F
+F02A
+ECF7
+F06C
+C027
+F414
+C028
+F415
+C029
+F416
+C02A
+F417
+C414
+F02C
+C415
+F02D
+C416
+F02E
+C417
+F02F
+C410
+F027
+C411
+F028
+C412
+F029
+C413
+F02A
+EC8E
+F06D
+C027
+F414
+C028
+F415
+C029
+F416
+C02A
+F417
+6A2C
+6A2D
+0E48
+6E2E
+0E43
+6E2F
+C414
+F027
+C415
+F028
+C416
+F029
+C417
+F02A
+ECE1
+F06D
+C027
+F414
+C028
+F415
+C029
+F416
+C02A
+F417
+6A2C
+6A2D
+6A2E
+6A2F
+C414
+F027
+C415
+F028
+C416
+F029
+C417
+F02A
+ECD2
+F06E
+0A01
+E105
+0104
+6B14
+6B15
+6B16
+6B17
+6A2C
+6A2D
+0E7F
+6E2E
+0E43
+6E2F
+C414
+F027
+C415
+F028
+C416
+F029
+C417
+F02A
+ECC9
+F06E
+0A01
+E107
+0104
+6B14
+6B15
+0E7F
+6F16
+0E43
+6F17
+6A2C
+6A2D
+6A2E
+6A2F
+C410
+F027
+C411
+F028
+C412
+F029
+C413
+F02A
+ECD2
+F06E
+0A01
+E109
+0104
+5100
+6AEA
+0F53
+6EE9
+0E05
+22EA
+6AEF
+D016
+C414
+F027
+C415
+F028
+C416
+F029
+C417
+F02A
+EC6C
+F06E
+5029
+6EE6
+0104
+5100
+6AEA
+0F53
+6EE9
+0E05
+22EA
+52E5
+50E7
+6EEF
+2B00
+D6E5
+0012
+EE13
+F000
+0E01
+6EF8
+0104
+0E8C
+6F34
+0E4A
+6F35
+0E4A
+6F36
+0E3F
+6F37
+C502
+F028
+C503
+F029
+ECE2
+F06C
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+6A2C
+6A2D
+0E7A
+6E2E
+0E44
+6E2F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+EC8E
+F06D
+C027
+F40C
+C028
+F40D
+C029
+F40E
+C02A
+F40F
+0EDC
+6E2C
+0E68
+6E2D
+0E80
+6E2E
+0E3D
+6E2F
+C40C
+F027
+C40D
+F028
+C40E
+F029
+C40F
+F02A
+ECF7
+F06C
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+C000
+F02C
+C001
+F02D
+C002
+F02E
+C003
+F02F
+C434
+F027
+C435
+F028
+C436
+F029
+C437
+F02A
+ECE1
+F06D
+C027
+F424
+C028
+F425
+C029
+F426
+C02A
+F427
+0105
+6B20
+6B21
+C513
+F029
+ECD1
+F06C
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+6A2C
+6A2D
+0E0E
+6E2E
+0E43
+6E2F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+EC8E
+F06D
+C027
+F97B
+C028
+F97C
+C029
+F97D
+C02A
+F97E
+0104
+6B00
+0E10
+0104
+5D00
+E301
+D3DB
+0E04
+6EF7
+0104
+5100
+2500
+2500
+2500
+0F80
+6EF6
+0009
+CFF5
+F469
+0009
+CFF5
+F468
+0009
+CFF5
+F46B
+0008
+CFF5
+F46A
+0F40
+6EF6
+0009
+CFF5
+F46D
+0009
+CFF5
+F46C
+0009
+CFF5
+F46F
+0008
+CFF5
+F46E
+0E66
+6E00
+0E66
+6E01
+0E86
+6E02
+0E3F
+6E03
+C424
+F02C
+C425
+F02D
+C426
+F02E
+C427
+F02F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+ECE1
+F06D
+C027
+F410
+C028
+F411
+C029
+F412
+C02A
+F413
+0104
+5100
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E80
+26E9
+0E04
+22EA
+CFEE
+F000
+CFEE
+F001
+CFEE
+F002
+CFEF
+F003
+C000
+F02C
+C001
+F02D
+C002
+F02E
+C003
+F02F
+C410
+F027
+C411
+F028
+C412
+F029
+C413
+F02A
+ECF7
+F06C
+C027
+F410
+C028
+F411
+C029
+F412
+C02A
+F413
+0104
+5100
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E80
+26E9
+0E04
+22EA
+CFEE
+F000
+CFEE
+F001
+CFEE
+F002
+CFEF
+F003
+C000
+F02C
+C001
+F02D
+C002
+F02E
+C003
+F02F
+C424
+F027
+C425
+F028
+C426
+F029
+C427
+F02A
+ECF7
+F06C
+C027
+F414
+C028
+F415
+C029
+F416
+C02A
+F417
+6A2C
+6A2D
+6A2E
+6A2F
+C414
+F027
+C415
+F028
+C416
+F029
+C417
+F02A
+ECD2
+F06E
+0A01
+E00B
+0104
+6B10
+6B11
+6B12
+6B13
+0104
+6B14
+6B15
+6B16
+6B17
+D01A
+C414
+F02C
+C415
+F02D
+C416
+F02E
+C417
+F02F
+C410
+F027
+C411
+F028
+C412
+F029
+C413
+F02A
+EC8E
+F06D
+C027
+F410
+C028
+F411
+C029
+F412
+C02A
+F413
+6A2C
+6A2D
+6A2E
+6A2F
+C410
+F027
+C411
+F028
+C412
+F029
+C413
+F02A
+ECC9
+F06E
+0A01
+E001
+D084
+6A04
+6A05
+0E80
+6E06
+0E3F
+6E07
+C410
+F02C
+C411
+F02D
+C412
+F02E
+C413
+F02F
+C004
+F027
+C005
+F028
+C006
+F029
+C007
+F02A
+ECF7
+F06C
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+C000
+FFE6
+C001
+FFE6
+C002
+FFE6
+C003
+FFE6
+ECB0
+F073
+52E5
+52E5
+52E5
+52E5
+C026
+F410
+C027
+F411
+C028
+F412
+C029
+F413
+6A2C
+0E6F
+6E2D
+0E31
+6E2E
+0EBF
+6E2F
+C410
+F027
+C411
+F028
+C412
+F029
+C413
+F02A
+EC8E
+F06D
+C027
+F410
+C028
+F411
+C029
+F412
+C02A
+F413
+C410
+F02C
+C411
+F02D
+C412
+F02E
+C413
+F02F
+C468
+F027
+C469
+F028
+C46A
+F029
+C46B
+F02A
+ECE1
+F06D
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+C97B
+F02C
+C97C
+F02D
+C97D
+F02E
+C97E
+F02F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+EC8E
+F06D
+C027
+F414
+C028
+F415
+C029
+F416
+C02A
+F417
+D00A
+0104
+6B10
+6B11
+6B12
+6B13
+0104
+6B14
+6B15
+6B16
+6B17
+0ECD
+6E00
+0ECC
+6E01
+0ECC
+6E02
+0E3D
+6E03
+0E10
+0104
+2500
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E80
+26E9
+0E04
+22EA
+CFEE
+F004
+CFEE
+F005
+CFEE
+F006
+CFEF
+F007
+C004
+F02C
+C005
+F02D
+C006
+F02E
+C007
+F02F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+ECF7
+F06C
+C027
+F418
+C028
+F419
+C029
+F41A
+C02A
+F41B
+6A2C
+6A2D
+6A2E
+6A2F
+C418
+F027
+C419
+F028
+C41A
+F029
+C41B
+F02A
+ECD2
+F06E
+0A01
+E00B
+0104
+6B18
+6B19
+6B1A
+6B1B
+0104
+6B1C
+6B1D
+6B1E
+6B1F
+D04E
+6A04
+6A05
+0E80
+6E06
+0EBF
+6E07
+C418
+F02C
+C419
+F02D
+C41A
+F02E
+C41B
+F02F
+C004
+F027
+C005
+F028
+C006
+F029
+C007
+F02A
+ECE1
+F06D
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+0E10
+0104
+2500
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E80
+26E9
+0E04
+22EA
+CFEE
+F008
+CFEE
+F009
+CFEE
+F00A
+CFEF
+F00B
+C008
+F02C
+C009
+F02D
+C00A
+F02E
+C00B
+F02F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+EC8E
+F06D
+C027
+F418
+C028
+F419
+C029
+F41A
+C02A
+F41B
+6A2C
+6A2D
+6A2E
+6A2F
+C418
+F027
+C419
+F028
+C41A
+F029
+C41B
+F02A
+ECC9
+F06E
+0A01
+E001
+D084
+6A04
+6A05
+0E80
+6E06
+0E3F
+6E07
+C418
+F02C
+C419
+F02D
+C41A
+F02E
+C41B
+F02F
+C004
+F027
+C005
+F028
+C006
+F029
+C007
+F02A
+ECF7
+F06C
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+C000
+FFE6
+C001
+FFE6
+C002
+FFE6
+C003
+FFE6
+ECB0
+F073
+52E5
+52E5
+52E5
+52E5
+C026
+F418
+C027
+F419
+C028
+F41A
+C029
+F41B
+6A2C
+0E6F
+6E2D
+0E31
+6E2E
+0EBF
+6E2F
+C418
+F027
+C419
+F028
+C41A
+F029
+C41B
+F02A
+EC8E
+F06D
+C027
+F418
+C028
+F419
+C029
+F41A
+C02A
+F41B
+C418
+F02C
+C419
+F02D
+C41A
+F02E
+C41B
+F02F
+C46C
+F027
+C46D
+F028
+C46E
+F029
+C46F
+F02A
+ECE1
+F06D
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+C97B
+F02C
+C97C
+F02D
+C97D
+F02E
+C97E
+F02F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+EC8E
+F06D
+C027
+F41C
+C028
+F41D
+C029
+F41E
+C02A
+F41F
+D00A
+0104
+6B18
+6B19
+6B1A
+6B1B
+0104
+6B1C
+6B1D
+6B1E
+6B1F
+C414
+F02C
+C415
+F02D
+C416
+F02E
+C417
+F02F
+C41C
+F027
+C41D
+F028
+C41E
+F029
+C41F
+F02A
+ECC9
+F06E
+0A01
+E10F
+C41C
+F027
+C41D
+F028
+C41E
+F029
+C41F
+F02A
+EC93
+F06E
+C028
+F404
+C029
+F405
+D00E
+C414
+F027
+C415
+F028
+C416
+F029
+C417
+F02A
+EC93
+F06E
+C028
+F404
+C029
+F405
+0104
+5104
+0105
+5D20
+0104
+5105
+0105
+5921
+E204
+C404
+F520
+C405
+F521
+6A2C
+6A2D
+0EA0
+6E2E
+0E41
+6E2F
+C410
+F027
+C411
+F028
+C412
+F029
+C413
+F02A
+ECE1
+F06D
+C027
+F414
+C028
+F415
+C029
+F416
+C02A
+F417
+6A2C
+6A2D
+0EA0
+6E2E
+0E42
+6E2F
+C414
+F027
+C415
+F028
+C416
+F029
+C417
+F02A
+ECF8
+F06C
+C027
+F414
+C028
+F415
+C029
+F416
+C02A
+F417
+6A2C
+6A2D
+6A2E
+6A2F
+C414
+F027
+C415
+F028
+C416
+F029
+C417
+F02A
+ECD2
+F06E
+0A01
+E105
+0104
+6B14
+6B15
+6B16
+6B17
+6A2C
+6A2D
+0E7F
+6E2E
+0E43
+6E2F
+C414
+F027
+C415
+F028
+C416
+F029
+C417
+F02A
+ECC9
+F06E
+0A01
+E107
+0104
+6B14
+6B15
+0E7F
+6F16
+0E43
+6F17
+C414
+F027
+C415
+F028
+C416
+F029
+C417
+F02A
+EC6C
+F06E
+5029
+6EE6
+0104
+5100
+6AEA
+0F33
+6EE9
+0E05
+22EA
+52E5
+50E7
+6EEF
+6A2C
+6A2D
+0EA0
+6E2E
+0E41
+6E2F
+C418
+F027
+C419
+F028
+C41A
+F029
+C41B
+F02A
+ECE1
+F06D
+C027
+F41C
+C028
+F41D
+C029
+F41E
+C02A
+F41F
+6A2C
+6A2D
+0EA0
+6E2E
+0E42
+6E2F
+C41C
+F027
+C41D
+F028
+C41E
+F029
+C41F
+F02A
+ECF8
+F06C
+C027
+F41C
+C028
+F41D
+C029
+F41E
+C02A
+F41F
+6A2C
+6A2D
+6A2E
+6A2F
+C41C
+F027
+C41D
+F028
+C41E
+F029
+C41F
+F02A
+ECD2
+F06E
+0A01
+E105
+0104
+6B1C
+6B1D
+6B1E
+6B1F
+6A2C
+6A2D
+0E7F
+6E2E
+0E43
+6E2F
+C41C
+F027
+C41D
+F028
+C41E
+F029
+C41F
+F02A
+ECC9
+F06E
+0A01
+E107
+0104
+6B1C
+6B1D
+0E7F
+6F1E
+0E43
+6F1F
+C41C
+F027
+C41D
+F028
+C41E
+F029
+C41F
+F02A
+EC6C
+F06E
+5029
+6EE6
+0E10
+0104
+2500
+6AEA
+0F33
+6EE9
+0E05
+22EA
+52E5
+50E7
+6EEF
+0104
+2B00
+D420
+0012
+0109
+51BD
+E004
+0109
+6BBD
+EC12
+F063
+EE13
+F000
+0104
+0E8C
+6F34
+0E4A
+6F35
+0E4A
+6F36
+0E3F
+6F37
+C500
+F028
+C501
+F029
+ECE2
+F06C
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+6A2C
+6A2D
+0E7A
+6E2E
+0E44
+6E2F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+EC8E
+F06D
+C027
+F408
+C028
+F409
+C029
+F40A
+C02A
+F40B
+C502
+F028
+C503
+F029
+ECE2
+F06C
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+6A2C
+6A2D
+0E7A
+6E2E
+0E44
+6E2F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+EC8E
+F06D
+C027
+F40C
+C028
+F40D
+C029
+F40E
+C02A
+F40F
+0EDC
+6E2C
+0E68
+6E2D
+0E80
+6E2E
+0E3D
+6E2F
+C408
+F027
+C409
+F028
+C40A
+F029
+C40B
+F02A
+ECF7
+F06C
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+C000
+F02C
+C001
+F02D
+C002
+F02E
+C003
+F02F
+C434
+F027
+C435
+F028
+C436
+F029
+C437
+F02A
+ECE1
+F06D
+C027
+F424
+C028
+F425
+C029
+F426
+C02A
+F427
+0104
+6B28
+6B29
+6B2A
+6B2B
+C40C
+F430
+C40D
+F431
+C40E
+F432
+C40F
+F433
+C513
+F029
+ECD1
+F06C
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+6A2C
+6A2D
+0E0E
+6E2E
+0E43
+6E2F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+EC8E
+F06D
+C027
+F97B
+C028
+F97C
+C029
+F97D
+C02A
+F97E
+C512
+F029
+ECD1
+F06C
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+6A2C
+6A2D
+0EC8
+6E2E
+0E42
+6E2F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+EC8E
+F06D
+C027
+F977
+C028
+F978
+C029
+F979
+C02A
+F97A
+D80B
+EC13
+F0A0
+0105
+6B23
+0105
+6B22
+0105
+6B31
+ECC0
+F0A0
+0012
+EE13
+F000
+0E01
+6EF8
+0105
+6963
+0104
+6B70
+6B71
+6B72
+6B73
+0104
+6B00
+0E10
+0104
+5D00
+E302
+EF2E
+F0AE
+0E02
+6EF7
+0104
+5100
+2500
+2500
+2500
+0F80
+6EF6
+0009
+CFF5
+F441
+0009
+CFF5
+F440
+0009
+CFF5
+F443
+0008
+CFF5
+F442
+0F40
+6EF6
+0009
+CFF5
+F445
+0009
+CFF5
+F444
+0009
+CFF5
+F447
+0008
+CFF5
+F446
+0F40
+6EF6
+2AF7
+0009
+CFF5
+F449
+0009
+CFF5
+F448
+0009
+CFF5
+F44B
+0008
+CFF5
+F44A
+0F40
+6EF6
+0009
+CFF5
+F44D
+0009
+CFF5
+F44C
+0009
+CFF5
+F44F
+0008
+CFF5
+F44E
+0FC0
+6EF6
+2AF7
+0009
+CFF5
+F461
+0009
+CFF5
+F460
+0009
+CFF5
+F463
+0008
+CFF5
+F462
+0F40
+6EF6
+0009
+CFF5
+F465
+0009
+CFF5
+F464
+0009
+CFF5
+F467
+0008
+CFF5
+F466
+0104
+5100
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E80
+26E9
+0E04
+22EA
+CFEE
+F004
+CFEE
+F005
+CFEE
+F006
+CFEF
+F007
+C004
+F02C
+C005
+F02D
+C006
+F02E
+C007
+F02F
+C424
+F027
+C425
+F028
+C426
+F029
+C427
+F02A
+ECF7
+F06C
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+C460
+F02C
+C461
+F02D
+C462
+F02E
+C463
+F02F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+ECE1
+F06D
+C027
+F42C
+C028
+F42D
+C029
+F42E
+C02A
+F42F
+EC1C
+F06A
+0104
+5100
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E80
+26E9
+0E04
+22EA
+CFEE
+F004
+CFEE
+F005
+CFEE
+F006
+CFEF
+F007
+C42C
+F02C
+C42D
+F02D
+C42E
+F02E
+C42F
+F02F
+C004
+F027
+C005
+F028
+C006
+F029
+C007
+F02A
+ECF8
+F06C
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+0104
+5100
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E80
+26E9
+0E04
+22EA
+C000
+FFEE
+C001
+FFEE
+C002
+FFEE
+C003
+FFEE
+0E10
+0104
+2500
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E80
+26E9
+0E04
+22EA
+CFEE
+F004
+CFEE
+F005
+CFEE
+F006
+CFEF
+F007
+C004
+F02C
+C005
+F02D
+C006
+F02E
+C007
+F02F
+C428
+F027
+C429
+F028
+C42A
+F029
+C42B
+F02A
+ECF7
+F06C
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+C464
+F02C
+C465
+F02D
+C466
+F02E
+C467
+F02F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+ECE1
+F06D
+C027
+F42C
+C028
+F42D
+C029
+F42E
+C02A
+F42F
+EC1C
+F06A
+0E10
+0104
+2500
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E80
+26E9
+0E04
+22EA
+CFEE
+F004
+CFEE
+F005
+CFEE
+F006
+CFEF
+F007
+C42C
+F02C
+C42D
+F02D
+C42E
+F02E
+C42F
+F02F
+C004
+F027
+C005
+F028
+C006
+F029
+C007
+F02A
+ECF8
+F06C
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+0E10
+0104
+2500
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E80
+26E9
+0E04
+22EA
+C000
+FFEE
+C001
+FFEE
+C002
+FFEE
+C003
+FFEE
+0104
+5100
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E80
+26E9
+0E04
+22EA
+CFEE
+F000
+CFEE
+F001
+CFEE
+F002
+CFEF
+F003
+0E10
+0104
+2500
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E80
+26E9
+0E04
+22EA
+CFEE
+F004
+CFEE
+F005
+CFEE
+F006
+CFEF
+F007
+C004
+F02C
+C005
+F02D
+C006
+F02E
+C007
+F02F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+ECF8
+F06C
+C027
+F42C
+C028
+F42D
+C029
+F42E
+C02A
+F42F
+0104
+5100
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E80
+26E9
+0E04
+22EA
+CFEE
+F008
+CFEE
+F009
+CFEE
+F00A
+CFEF
+F00B
+C008
+F02C
+C009
+F02D
+C00A
+F02E
+C00B
+F02F
+C440
+F027
+C441
+F028
+C442
+F029
+C443
+F02A
+ECE1
+F06D
+C027
+F004
+C028
+F005
+C029
+F006
+C02A
+F007
+0E10
+0104
+2500
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E80
+26E9
+0E04
+22EA
+CFEE
+F010
+CFEE
+F011
+CFEE
+F012
+CFEF
+F013
+C010
+F02C
+C011
+F02D
+C012
+F02E
+C013
+F02F
+C444
+F027
+C445
+F028
+C446
+F029
+C447
+F02A
+ECE1
+F06D
+C027
+F00C
+C028
+F00D
+C029
+F00E
+C02A
+F00F
+C00C
+F02C
+C00D
+F02D
+C00E
+F02E
+C00F
+F02F
+C004
+F027
+C005
+F028
+C006
+F029
+C007
+F02A
+ECF8
+F06C
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+C42C
+F02C
+C42D
+F02D
+C42E
+F02E
+C42F
+F02F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+EC8E
+F06D
+C027
+F440
+C028
+F441
+C029
+F442
+C02A
+F443
+0104
+5100
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E80
+26E9
+0E04
+22EA
+CFEE
+F008
+CFEE
+F009
+CFEE
+F00A
+CFEF
+F00B
+C008
+F02C
+C009
+F02D
+C00A
+F02E
+C00B
+F02F
+C448
+F027
+C449
+F028
+C44A
+F029
+C44B
+F02A
+ECE1
+F06D
+C027
+F004
+C028
+F005
+C029
+F006
+C02A
+F007
+0E10
+0104
+2500
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E80
+26E9
+0E04
+22EA
+CFEE
+F010
+CFEE
+F011
+CFEE
+F012
+CFEF
+F013
+C010
+F02C
+C011
+F02D
+C012
+F02E
+C013
+F02F
+C44C
+F027
+C44D
+F028
+C44E
+F029
+C44F
+F02A
+ECE1
+F06D
+C027
+F00C
+C028
+F00D
+C029
+F00E
+C02A
+F00F
+C00C
+F02C
+C00D
+F02D
+C00E
+F02E
+C00F
+F02F
+C004
+F027
+C005
+F028
+C006
+F029
+C007
+F02A
+ECF8
+F06C
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+C42C
+F02C
+C42D
+F02D
+C42E
+F02E
+C42F
+F02F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+EC8E
+F06D
+C027
+F448
+C028
+F449
+C029
+F44A
+C02A
+F44B
+C440
+F02C
+C441
+F02D
+C442
+F02E
+C443
+F02F
+C42C
+F027
+C42D
+F028
+C42E
+F029
+C42F
+F02A
+ECF7
+F06C
+C027
+F004
+C028
+F005
+C029
+F006
+C02A
+F007
+C448
+F02C
+C449
+F02D
+C44A
+F02E
+C44B
+F02F
+C004
+F027
+C005
+F028
+C006
+F029
+C007
+F02A
+ECE1
+F06D
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+0104
+5100
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E67
+26E9
+0E05
+22EA
+C000
+FFEE
+C001
+FFEE
+C002
+FFEE
+C003
+FFEE
+0104
+5100
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E67
+26E9
+0E05
+22EA
+CFEE
+F000
+CFEE
+F001
+CFEE
+F002
+CFEF
+F003
+6A2C
+6A2D
+6A2E
+6A2F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+ECD2
+F06E
+0A01
+E10F
+0104
+5100
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E67
+26E9
+0E05
+22EA
+6AEE
+6AEE
+6AEE
+6AEE
+0104
+5100
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E67
+26E9
+0E05
+22EA
+CFEE
+F000
+CFEE
+F001
+CFEE
+F002
+CFEF
+F003
+C470
+F02C
+C471
+F02D
+C472
+F02E
+C473
+F02F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+ECC9
+F06E
+0A01
+E115
+0104
+5100
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E67
+26E9
+0E05
+22EA
+CFEE
+F470
+CFEE
+F471
+CFEE
+F472
+CFEF
+F473
+C400
+F563
+C408
+F02C
+C409
+F02D
+C40A
+F02E
+C40B
+F02F
+C42C
+F027
+C42D
+F028
+C42E
+F029
+C42F
+F02A
+ECF7
+F06C
+C027
+F410
+C028
+F411
+C029
+F412
+C02A
+F413
+0104
+5100
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E67
+26E9
+0E05
+22EA
+CFEE
+F000
+CFEE
+F001
+CFEE
+F002
+CFEF
+F003
+C000
+F02C
+C001
+F02D
+C002
+F02E
+C003
+F02F
+C42C
+F027
+C42D
+F028
+C42E
+F029
+C42F
+F02A
+ECF7
+F06C
+C027
+F414
+C028
+F415
+C029
+F416
+C02A
+F417
+C414
+F02C
+C415
+F02D
+C416
+F02E
+C417
+F02F
+C410
+F027
+C411
+F028
+C412
+F029
+C413
+F02A
+EC8E
+F06D
+C027
+F414
+C028
+F415
+C029
+F416
+C02A
+F417
+6A2C
+6A2D
+0E48
+6E2E
+0E43
+6E2F
+C414
+F027
+C415
+F028
+C416
+F029
+C417
+F02A
+ECE1
+F06D
+C027
+F414
+C028
+F415
+C029
+F416
+C02A
+F417
+6A2C
+6A2D
+6A2E
+6A2F
+C414
+F027
+C415
+F028
+C416
+F029
+C417
+F02A
+ECD2
+F06E
+0A01
+E105
+0104
+6B14
+6B15
+6B16
+6B17
+6A2C
+6A2D
+0E7F
+6E2E
+0E43
+6E2F
+C414
+F027
+C415
+F028
+C416
+F029
+C417
+F02A
+ECC9
+F06E
+0A01
+E107
+0104
+6B14
+6B15
+0E7F
+6F16
+0E43
+6F17
+6A2C
+6A2D
+6A2E
+6A2F
+C410
+F027
+C411
+F028
+C412
+F029
+C413
+F02A
+ECD2
+F06E
+0A01
+E109
+0104
+5100
+6AEA
+0F53
+6EE9
+0E05
+22EA
+6AEF
+D016
+C414
+F027
+C415
+F028
+C416
+F029
+C417
+F02A
+EC6C
+F06E
+5029
+6EE6
+0104
+5100
+6AEA
+0F53
+6EE9
+0E05
+22EA
+52E5
+50E7
+6EEF
+0104
+2B00
+EFC8
+F0A9
+0012
+0109
+6B5A
+0E10
+0109
+6EE7
+195A
+AEE8
+D002
+34E7
+D002
+50E7
+5D5A
+E217
+C95A
+FFE9
+6AEA
+BEE9
+68EA
+0E00
+26E9
+0E09
+22EA
+6AEF
+C95A
+FFE9
+6AEA
+BEE9
+68EA
+0E4A
+26E9
+0E09
+22EA
+6AEF
+0109
+2B5A
+D7DE
+0E01
+6EF8
+0E06
+6EF7
+0E00
+6EF6
+0109
+6B5A
+0E7F
+0109
+6EE7
+195A
+AEE8
+D002
+34E7
+D002
+50E7
+5D5A
+E211
+0009
+CFF5
+F95C
+C95A
+FFE9
+6AEA
+BEE9
+68EA
+0E00
+26E9
+0E08
+22EA
+C95C
+FFEF
+0109
+2B5A
+D7E4
+0009
+CFF5
+F95C
+C95C
+F87F
+0109
+6B5A
+0E7F
+0109
+6EE7
+195A
+AEE8
+D002
+34E7
+D002
+50E7
+5D5A
+E215
+0009
+CFF5
+F95C
+C95A
+FFE9
+6AEA
+BEE9
+68EA
+0E80
+26E9
+0E00
+22EA
+0E00
+26E9
+0E08
+22EA
+C95C
+FFEF
+0109
+2B5A
+D7E0
+0008
+CFF5
+F95C
+C95C
+F8FF
+0E00
+6EF8
+0E00
+6EF7
+0E00
+6EF6
+0109
+6B5D
+6B5E
+0109
+0EF3
+5D5D
+0E17
+595E
+E301
+D112
+0109
+6B39
+0109
+6B5A
+0E10
+0109
+6EE7
+195A
+AEE8
+D002
+34E7
+D002
+50E7
+5D5A
+E261
+0109
+0E09
+195D
+E101
+515E
+E10C
+C95A
+FFE9
+6AEA
+BEE9
+68EA
+0E4A
+26E9
+0E09
+22EA
+CFEF
+F95C
+D003
+0009
+CFF5
+F95C
+C95A
+FFE9
+6AEA
+BEE9
+68EA
+0E3A
+26E9
+0E09
+22EA
+C95C
+FFEF
+C95A
+FFE9
+6AEA
+BEE9
+68EA
+0E3A
+26E9
+0E09
+22EA
+50EF
+6EE6
+0E10
+0109
+255A
+6EE9
+6AEA
+BEE9
+68EA
+0E00
+26E9
+0E09
+22EA
+52E5
+50E7
+6EEF
+C95A
+FFE9
+6AEA
+BEE9
+68EA
+0E00
+26E9
+0E09
+22EA
+CFEF
+F000
+C95A
+FFE9
+6AEA
+BEE9
+68EA
+0E3A
+26E9
+0E09
+22EA
+50EF
+1800
+6EE6
+0E20
+0109
+255A
+6EE9
+6AEA
+BEE9
+68EA
+0E00
+26E9
+0E09
+22EA
+52E5
+50E7
+6EEF
+0109
+2B5A
+D794
+0109
+6B5A
+0E12
+0109
+6EE7
+195A
+AEE8
+D002
+34E7
+D002
+50E7
+5D5A
+E245
+0109
+6B5B
+0E30
+0109
+6EE7
+195B
+AEE8
+D002
+34E7
+D002
+50E7
+5D5B
+E231
+C939
+FFE9
+6AEA
+BEE9
+68EA
+0E00
+26E9
+0E08
+22EA
+CFEF
+F000
+C95B
+FFE9
+6AEA
+BEE9
+68EA
+0E00
+26E9
+0E09
+22EA
+50EF
+1800
+6EE6
+C95B
+FFE9
+6AEA
+BEE9
+68EA
+0E00
+26E9
+0E09
+22EA
+52E5
+50E7
+6EEF
+C95B
+FFE9
+6AEA
+BEE9
+68EA
+0E00
+26E9
+0E09
+22EA
+CFEF
+F939
+0109
+2B5B
+D7C4
+0109
+2939
+0109
+6F39
+0109
+2B5A
+D7B0
+C959
+F939
+0109
+6B5A
+0E10
+0109
+6EE7
+195A
+AEE8
+D002
+34E7
+D002
+50E7
+5D5A
+E23C
+C95A
+FFE9
+6AEA
+BEE9
+68EA
+0E3A
+26E9
+0E09
+22EA
+50EF
+0109
+1939
+6EE9
+6AEA
+BEE9
+68EA
+0E00
+26E9
+0E08
+22EA
+CFEF
+F000
+C95A
+FFE9
+6AEA
+BEE9
+68EA
+0E4A
+26E9
+0E09
+22EA
+50EF
+1800
+6EE6
+C95A
+FFE9
+6AEA
+BEE9
+68EA
+0E4A
+26E9
+0E09
+22EA
+52E5
+50E7
+6EEF
+C95A
+FFE9
+6AEA
+BEE9
+68EA
+0E4A
+26E9
+0E09
+22EA
+CFEF
+F939
+0109
+2B5A
+D7B9
+0109
+2B5D
+0E00
+235E
+D6E7
+0012
+0109
+6B73
+6B74
+6B75
+6B76
+0105
+6B65
+0012
+C507
+F029
+ECD1
+F06C
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+6A2C
+6A2D
+0EC8
+6E2E
+0E42
+6E2F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+EC8E
+F06D
+C027
+F478
+C028
+F479
+C029
+F47A
+C02A
+F47B
+0E32
+0105
+5D07
+E202
+EF11
+F0B5
+0E3C
+5D07
+E276
+6A04
+6A05
+0E80
+6E06
+0E3F
+6E07
+6A10
+0EF0
+6E11
+0E52
+6E12
+0EC7
+6E13
+C478
+F02C
+C479
+F02D
+C47A
+F02E
+C47B
+F02F
+C010
+F027
+C011
+F028
+C012
+F029
+C013
+F02A
+ECE1
+F06D
+C027
+F00C
+C028
+F00D
+C029
+F00E
+C02A
+F00F
+6A2C
+0EF0
+6E2D
+0E52
+6E2E
+0E47
+6E2F
+C00C
+F027
+C00D
+F028
+C00E
+F029
+C00F
+F02A
+ECF8
+F06C
+C027
+F008
+C028
+F009
+C029
+F00A
+C02A
+F00B
+C008
+F02C
+C009
+F02D
+C00A
+F02E
+C00B
+F02F
+C004
+F027
+C005
+F028
+C006
+F029
+C007
+F02A
+EC8E
+F06D
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+C973
+F02C
+C974
+F02D
+C975
+F02E
+C976
+F02F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+ECF8
+F06C
+C027
+F973
+C028
+F974
+C029
+F975
+C02A
+F976
+EF11
+F0B5
+0E46
+5D07
+E276
+6A04
+6A05
+0E80
+6E06
+0E3F
+6E07
+6A10
+0EC8
+6E11
+0E2F
+6E12
+0EC7
+6E13
+C478
+F02C
+C479
+F02D
+C47A
+F02E
+C47B
+F02F
+C010
+F027
+C011
+F028
+C012
+F029
+C013
+F02A
+ECE1
+F06D
+C027
+F00C
+C028
+F00D
+C029
+F00E
+C02A
+F00F
+6A2C
+0ED8
+6E2D
+0E3D
+6E2E
+0E47
+6E2F
+C00C
+F027
+C00D
+F028
+C00E
+F029
+C00F
+F02A
+ECF8
+F06C
+C027
+F008
+C028
+F009
+C029
+F00A
+C02A
+F00B
+C008
+F02C
+C009
+F02D
+C00A
+F02E
+C00B
+F02F
+C004
+F027
+C005
+F028
+C006
+F029
+C007
+F02A
+EC8E
+F06D
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+C973
+F02C
+C974
+F02D
+C975
+F02E
+C976
+F02F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+ECF8
+F06C
+C027
+F973
+C028
+F974
+C029
+F975
+C02A
+F976
+EF11
+F0B5
+0E50
+5D07
+E275
+6A04
+6A05
+0E80
+6E06
+0E3F
+6E07
+6A10
+0EA0
+6E11
+0E0C
+6E12
+0EC7
+6E13
+C478
+F02C
+C479
+F02D
+C47A
+F02E
+C47B
+F02F
+C010
+F027
+C011
+F028
+C012
+F029
+C013
+F02A
+ECE1
+F06D
+C027
+F00C
+C028
+F00D
+C029
+F00E
+C02A
+F00F
+6A2C
+0E3C
+6E2D
+0E25
+6E2E
+0E47
+6E2F
+C00C
+F027
+C00D
+F028
+C00E
+F029
+C00F
+F02A
+ECF8
+F06C
+C027
+F008
+C028
+F009
+C029
+F00A
+C02A
+F00B
+C008
+F02C
+C009
+F02D
+C00A
+F02E
+C00B
+F02F
+C004
+F027
+C005
+F028
+C006
+F029
+C007
+F02A
+EC8E
+F06D
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+C973
+F02C
+C974
+F02D
+C975
+F02E
+C976
+F02F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+ECF8
+F06C
+C027
+F973
+C028
+F974
+C029
+F975
+C02A
+F976
+D3AF
+0E5A
+5D07
+E275
+6A04
+6A05
+0E80
+6E06
+0E3F
+6E07
+6A10
+0EF0
+6E11
+0ED2
+6E12
+0EC6
+6E13
+C478
+F02C
+C479
+F02D
+C47A
+F02E
+C47B
+F02F
+C010
+F027
+C011
+F028
+C012
+F029
+C013
+F02A
+ECE1
+F06D
+C027
+F00C
+C028
+F00D
+C029
+F00E
+C02A
+F00F
+6A2C
+0E1C
+6E2D
+0E09
+6E2E
+0E47
+6E2F
+C00C
+F027
+C00D
+F028
+C00E
+F029
+C00F
+F02A
+ECF8
+F06C
+C027
+F008
+C028
+F009
+C029
+F00A
+C02A
+F00B
+C008
+F02C
+C009
+F02D
+C00A
+F02E
+C00B
+F02F
+C004
+F027
+C005
+F028
+C006
+F029
+C007
+F02A
+EC8E
+F06D
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+C973
+F02C
+C974
+F02D
+C975
+F02E
+C976
+F02F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+ECF8
+F06C
+C027
+F973
+C028
+F974
+C029
+F975
+C02A
+F976
+D337
+0E6E
+5D07
+E275
+6A04
+6A05
+0E80
+6E06
+0E3F
+6E07
+6A10
+0EA0
+6E11
+0E8C
+6E12
+0EC6
+6E13
+C478
+F02C
+C479
+F02D
+C47A
+F02E
+C47B
+F02F
+C010
+F027
+C011
+F028
+C012
+F029
+C013
+F02A
+ECE1
+F06D
+C027
+F00C
+C028
+F00D
+C029
+F00E
+C02A
+F00F
+6A2C
+0EF0
+6E2D
+0ED2
+6E2E
+0E46
+6E2F
+C00C
+F027
+C00D
+F028
+C00E
+F029
+C00F
+F02A
+ECF8
+F06C
+C027
+F008
+C028
+F009
+C029
+F00A
+C02A
+F00B
+C008
+F02C
+C009
+F02D
+C00A
+F02E
+C00B
+F02F
+C004
+F027
+C005
+F028
+C006
+F029
+C007
+F02A
+EC8E
+F06D
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+C973
+F02C
+C974
+F02D
+C975
+F02E
+C976
+F02F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+ECF8
+F06C
+C027
+F973
+C028
+F974
+C029
+F975
+C02A
+F976
+D2BF
+5107
+6E00
+6A01
+90D8
+5001
+E604
+0E96
+5C00
+0E00
+5801
+E275
+6A04
+6A05
+0E80
+6E06
+0E3F
+6E07
+6A10
+0EA0
+6E11
+0E0C
+6E12
+0EC6
+6E13
+C478
+F02C
+C479
+F02D
+C47A
+F02E
+C47B
+F02F
+C010
+F027
+C011
+F028
+C012
+F029
+C013
+F02A
+ECE1
+F06D
+C027
+F00C
+C028
+F00D
+C029
+F00E
+C02A
+F00F
+6A2C
+0E98
+6E2D
+0E85
+6E2E
+0E46
+6E2F
+C00C
+F027
+C00D
+F028
+C00E
+F029
+C00F
+F02A
+ECF8
+F06C
+C027
+F008
+C028
+F009
+C029
+F00A
+C02A
+F00B
+C008
+F02C
+C009
+F02D
+C00A
+F02E
+C00B
+F02F
+C004
+F027
+C005
+F028
+C006
+F029
+C007
+F02A
+EC8E
+F06D
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+C973
+F02C
+C974
+F02D
+C975
+F02E
+C976
+F02F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+ECF8
+F06C
+C027
+F973
+C028
+F974
+C029
+F975
+C02A
+F976
+D23F
+5107
+6E00
+6A01
+90D8
+5001
+E604
+0EA0
+5C00
+0E00
+5801
+E275
+6A04
+6A05
+0E80
+6E06
+0E3F
+6E07
+6A10
+0EC8
+6E11
+0EAF
+6E12
+0EC6
+6E13
+C478
+F02C
+C479
+F02D
+C47A
+F02E
+C47B
+F02F
+C010
+F027
+C011
+F028
+C012
+F029
+C013
+F02A
+ECE1
+F06D
+C027
+F00C
+C028
+F00D
+C029
+F00E
+C02A
+F00F
+6A2C
+0EE6
+6E2D
+0E11
+6E2E
+0E47
+6E2F
+C00C
+F027
+C00D
+F028
+C00E
+F029
+C00F
+F02A
+ECF8
+F06C
+C027
+F008
+C028
+F009
+C029
+F00A
+C02A
+F00B
+C008
+F02C
+C009
+F02D
+C00A
+F02E
+C00B
+F02F
+C004
+F027
+C005
+F028
+C006
+F029
+C007
+F02A
+EC8E
+F06D
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+C973
+F02C
+C974
+F02D
+C975
+F02E
+C976
+F02F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+ECF8
+F06C
+C027
+F973
+C028
+F974
+C029
+F975
+C02A
+F976
+D1BF
+5107
+6E00
+6A01
+90D8
+5001
+E604
+0EA5
+5C00
+0E00
+5801
+E223
+0E31
+6E00
+0EEB
+6E01
+0E45
+6E02
+0E3A
+6E03
+C973
+F02C
+C974
+F02D
+C975
+F02E
+C976
+F02F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+ECF8
+F06C
+C027
+F973
+C028
+F974
+C029
+F975
+C02A
+F976
+D191
+5107
+6E00
+6A01
+90D8
+5001
+E604
+0EAA
+5C00
+0E00
+5801
+E223
+0E85
+6E00
+0EB1
+6E01
+0E85
+6E02
+0E3A
+6E03
+C973
+F02C
+C974
+F02D
+C975
+F02E
+C976
+F02F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+ECF8
+F06C
+C027
+F973
+C028
+F974
+C029
+F975
+C02A
+F976
+D163
+5107
+6E00
+6A01
+90D8
+5001
+E604
+0EAF
+5C00
+0E00
+5801
+E223
+0E07
+6E00
+0E42
+6E01
+0EB2
+6E02
+0E3A
+6E03
+C973
+F02C
+C974
+F02D
+C975
+F02E
+C976
+F02F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+ECF8
+F06C
+C027
+F973
+C028
+F974
+C029
+F975
+C02A
+F976
+D135
+5107
+6E00
+6A01
+90D8
+5001
+E604
+0EB4
+5C00
+0E00
+5801
+E223
+0EFA
+6E00
+0EED
+6E01
+0EEB
+6E02
+0E3A
+6E03
+C973
+F02C
+C974
+F02D
+C975
+F02E
+C976
+F02F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+ECF8
+F06C
+C027
+F973
+C028
+F974
+C029
+F975
+C02A
+F976
+D107
+5107
+6E00
+6A01
+90D8
+5001
+E604
+0EB9
+5C00
+0E00
+5801
+E222
+6A00
+0E52
+6E01
+0E1B
+6E02
+0E3B
+6E03
+C973
+F02C
+C974
+F02D
+C975
+F02E
+C976
+F02F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+ECF8
+F06C
+C027
+F973
+C028
+F974
+C029
+F975
+C02A
+F976
+D0DA
+5107
+6E00
+6A01
+90D8
+5001
+E604
+0EBE
+5C00
+0E00
+5801
+E223
+0E5F
+6E00
+0E29
+6E01
+0E4B
+6E02
+0E3B
+6E03
+C973
+F02C
+C974
+F02D
+C975
+F02E
+C976
+F02F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+ECF8
+F06C
+C027
+F973
+C028
+F974
+C029
+F975
+C02A
+F976
+D0AC
+5107
+6E00
+6A01
+90D8
+5001
+E604
+0EC3
+5C00
+0E00
+5801
+E223
+0E51
+6E00
+0E66
+6E01
+0E83
+6E02
+0E3B
+6E03
+C973
+F02C
+C974
+F02D
+C975
+F02E
+C976
+F02F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+ECF8
+F06C
+C027
+F973
+C028
+F974
+C029
+F975
+C02A
+F976
+D07E
+5107
+6E00
+6A01
+90D8
+5001
+E604
+0EC8
+5C00
+0E00
+5801
+E223
+0E1A
+6E00
+0E69
+6E01
+0EA9
+6E02
+0E3B
+6E03
+C973
+F02C
+C974
+F02D
+C975
+F02E
+C976
+F02F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+ECF8
+F06C
+C027
+F973
+C028
+F974
+C029
+F975
+C02A
+F976
+D050
+5107
+6E00
+6A01
+90D8
+5001
+E604
+0EE6
+5C00
+0E00
+5801
+E223
+0E7A
+6E00
+0E36
+6E01
+0EAB
+6E02
+0E3C
+6E03
+C973
+F02C
+C974
+F02D
+C975
+F02E
+C976
+F02F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+ECF8
+F06C
+C027
+F973
+C028
+F974
+C029
+F975
+C02A
+F976
+D022
+0E5D
+6E00
+0E6D
+6E01
+0E45
+6E02
+0E3D
+6E03
+C973
+F02C
+C974
+F02D
+C975
+F02E
+C976
+F02F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+ECF8
+F06C
+C027
+F973
+C028
+F974
+C029
+F975
+C02A
+F976
+6A2C
+6A2D
+0E20
+6E2E
+0E40
+6E2F
+C973
+F027
+C974
+F028
+C975
+F029
+C976
+F02A
+ECC9
+F06E
+0A01
+E107
+0109
+6B73
+6B74
+0E20
+6F75
+0E40
+6F76
+6A2C
+6A2D
+6A2E
+6A2F
+C973
+F027
+C974
+F028
+C975
+F029
+C976
+F02A
+ECD2
+F06E
+0A01
+E105
+0109
+6B73
+6B74
+6B75
+6B76
+0E0A
+6E2C
+0ED7
+6E2D
+0EA3
+6E2E
+0E3B
+6E2F
+C973
+F027
+C974
+F028
+C975
+F029
+C976
+F02A
+ECF8
+F06C
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+6A2C
+6A2D
+0EC8
+6E2E
+0E42
+6E2F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+ECE1
+F06D
+EC6C
+F06E
+C029
+F565
+0012
+0EF5
+6E00
+0E11
+6E01
+0E64
+6E02
+0E3F
+6E03
+C973
+F02C
+C974
+F02D
+C975
+F02E
+C976
+F02F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+ECE1
+F06D
+C027
+F973
+C028
+F974
+C029
+F975
+C02A
+F976
+0E0A
+6E2C
+0ED7
+6E2D
+0EA3
+6E2E
+0E3B
+6E2F
+C973
+F027
+C974
+F028
+C975
+F029
+C976
+F02A
+ECF8
+F06C
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+6A2C
+6A2D
+0EC8
+6E2E
+0E42
+6E2F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+ECE1
+F06D
+EC6C
+F06E
+C029
+F565
+0012
+C504
+F028
+C505
+F029
+ECE2
+F06C
+C027
+F410
+C028
+F411
+C029
+F412
+C02A
+F413
+C506
+F029
+ECD1
+F06C
+C027
+F000
+C028
+F001
+C029
+F002
+C02A
+F003
+6A2C
+6A2D
+0EC8
+6E2E
+0E42
+6E2F
+C000
+F027
+C001
+F028
+C002
+F029
+C003
+F02A
+EC8E
+F06D
+C027
+F414
+C028
+F415
+C029
+F416
+C02A
+F417
+C414
+F02C
+C415
+F02D
+C416
+F02E
+C417
+F02F
+C410
+F027
+C411
+F028
+C412
+F029
+C413
+F02A
+ECE1
+F06D
+C027
+F418
+C028
+F419
+C029
+F41A
+C02A
+F41B
+C418
+F027
+C419
+F028
+C41A
+F029
+C41B
+F02A
+EC93
+F06E
+C028
+F504
+C029
+F505
+0012
+0104
+6B00
+0E20
+5D00
+E226
+5100
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E80
+26E9
+0E04
+22EA
+CFEE
+F000
+CFEE
+F001
+CFEE
+F002
+CFEF
+F003
+5100
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E80
+26E9
+0E03
+22EA
+C000
+FFEE
+C001
+FFEE
+C002
+FFEE
+C003
+FFEE
+2B00
+D7D7
+0012
+0104
+6B00
+0E20
+5D00
+E226
+5100
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E80
+26E9
+0E03
+22EA
+CFEE
+F000
+CFEE
+F001
+CFEE
+F002
+CFEF
+F003
+5100
+0D04
+CFF3
+FFE9
+CFF4
+FFEA
+0E80
+26E9
+0E04
+22EA
+C000
+FFEE
+C001
+FFEE
+C002
+FFEE
+C003
+FFEE
+2B00
+D7D7
+0012
+FFFF
+FFFF
+FFFF
+FFFF
diff -r 000000000000 -r 96a35aeda5f2 code_part1/OSTC_code_asm_part1/ostc_part3_wordprocessor_NEW_CURSOR_9A00_to_B960_jump_in_B410.MCH
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/code_part1/OSTC_code_asm_part1/ostc_part3_wordprocessor_NEW_CURSOR_9A00_to_B960_jump_in_B410.MCH Tue Jan 12 15:05:59 2010 +0100
@@ -0,0 +1,4017 @@
+9BAF
+AFAF
+AFAF
+AFD1
+05B2
+07B0
+08B0
+09AF
+09AF
+09AF
+09AF
+08B1
+07B2
+049B
+9F9F
+9F9F
+9FAE
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+8FFF
+FF82
+04AC
+14A1
+1A9B
+2096
+2492
+288F
+0E8A
+108C
+0B94
+0C8A
+0996
+0F87
+0896
+1285
+0797
+0783
+0785
+0697
+0785
+0783
+0696
+0887
+0782
+0596
+078A
+0681
+0596
+078C
+0581
+0594
+088E
+0580
+0494
+0790
+0580
+0493
+0791
+0580
+0491
+0892
+0580
+0490
+0794
+0580
+058E
+0795
+0580
+058C
+0896
+0580
+068A
+0896
+0582
+0688
+0797
+0682
+0785
+0897
+0684
+0783
+0897
+0785
+0880
+0798
+0787
+0F97
+0889
+0D95
+0A8B
+108C
+0E8E
+2891
+2694
+2299
+1CA0
+15AA
+0797
+FFFF
+FFD7
+01B7
+03B4
+04B4
+03B4
+04B4
+04B3
+04B3
+05B3
+05B2
+06B2
+05B2
+06B2
+3681
+3781
+3781
+3781
+3781
+37FF
+FFFF
+FFFF
+FFAC
+FFFF
+FF90
+0389
+00A8
+0587
+03A5
+0786
+05A3
+0885
+07A0
+0A84
+089F
+0B84
+069F
+0D83
+069F
+0E82
+069F
+0881
+0482
+059E
+0883
+0482
+049E
+0884
+0481
+059D
+0885
+0481
+059C
+0787
+0481
+049C
+0788
+0481
+049B
+0789
+0481
+049A
+078A
+0481
+0499
+078B
+0481
+0498
+078C
+0481
+0596
+078D
+0481
+0595
+078E
+0481
+0594
+078F
+0481
+0692
+0790
+0482
+0690
+0791
+0482
+078E
+0792
+0483
+078B
+0893
+0483
+0986
+0A94
+0484
+1995
+0485
+1796
+0486
+1498
+0487
+1299
+0489
+0E9B
+048C
+089D
+05B3
+05BA
+FFFF
+FF8E
+00B7
+028A
+01A8
+0488
+03A5
+0786
+05A3
+0886
+05A5
+0784
+05A7
+0684
+05A8
+0682
+05AA
+0582
+05AA
+0581
+0591
+0495
+0580
+0591
+0495
+0580
+0591
+0495
+0580
+0492
+0495
+0580
+0492
+0495
+0580
+0492
+0495
+0580
+0492
+0594
+0580
+0590
+0694
+0580
+0590
+0694
+0580
+058F
+0892
+0582
+058E
+0892
+0582
+068C
+0A90
+0682
+078A
+0C8E
+0684
+0787
+0681
+068C
+0785
+1581
+0789
+0887
+1383
+1889
+1185
+168B
+0F87
+148D
+0C8A
+1291
+078E
+0EAC
+0AFF
+B8FF
+FF8B
+05B2
+06B0
+08AF
+09AD
+0BAC
+0CAA
+0EA9
+0781
+05A7
+0882
+05A6
+0784
+05A4
+0786
+05A3
+0787
+05A1
+0789
+059F
+088A
+059E
+078C
+059C
+088D
+059B
+078F
+0599
+0890
+0598
+0792
+0596
+0794
+0595
+0795
+0593
+0797
+0592
+3581
+3781
+3781
+3781
+3781
+3781
+37A4
+05B3
+05B3
+05B3
+05B3
+05B3
+05B3
+058F
+FFFF
+FF8C
+01A2
+0092
+0392
+1090
+0585
+1C8F
+0784
+1D8E
+0883
+1D8E
+0883
+1C91
+0782
+1B93
+0682
+058E
+0595
+0681
+058E
+0497
+0581
+058E
+0497
+0581
+058D
+0598
+0580
+058D
+0499
+0580
+058D
+0499
+0580
+058D
+0499
+0580
+058D
+0499
+0580
+058D
+0499
+0580
+058D
+0499
+0580
+058D
+0499
+0580
+058D
+0499
+0580
+058D
+0597
+0581
+058D
+0597
+0581
+058E
+0595
+0681
+058E
+0693
+0682
+058E
+0791
+0782
+058F
+088D
+0883
+0590
+0A87
+0B83
+0591
+1C84
+0592
+1A85
+0593
+1886
+0594
+15A5
+11AA
+0CC5
+FFFF
+F111
+A21B
+9A21
+9426
+9029
+8E2B
+8C0D
+8505
+850E
+880B
+8805
+8B09
+8808
+8906
+8E08
+8607
+8B05
+9107
+8407
+8B05
+9306
+8306
+8C05
+9506
+8205
+8D05
+9605
+8106
+8D04
+9706
+8005
+8D05
+9805
+8005
+8D05
+9805
+8004
+8E04
+990B
+8E04
+990B
+8E05
+980B
+8E05
+980B
+8E05
+9805
+8004
+8E06
+9605
+8104
+8F05
+9605
+8105
+8E06
+9405
+8205
+8F07
+9007
+8305
+8E09
+8C08
+8407
+8D0B
+860A
+8507
+8E1B
+8705
+9019
+8903
+9217
+8B00
+9613
+A70F
+AD07
+C8FF
+FFFF
+9605
+B305
+B305
+B305
+B305
+B305
+AF01
+8105
+AC04
+8105
+A907
+8105
+A60A
+8105
+A40C
+8105
+A10F
+8105
+9E12
+8105
+9B13
+8305
+9813
+8605
+9612
+8905
+9312
+8C05
+9012
+8F05
+8E11
+9205
+8B11
+9505
+8910
+9805
+8610
+9B05
+840F
+9E05
+8110
+A015
+A312
+A610
+A80D
+AB0B
+AD09
+AF06
+B204
+FFA7
+FFFF
+CA03
+B10B
+AB0F
+9007
+8F11
+8D0C
+8A14
+8A0F
+8816
+8811
+8618
+8614
+8407
+8708
+8515
+8306
+8B07
+8406
+8608
+8106
+8D06
+8306
+8907
+8004
+9006
+8205
+8B0C
+9105
+8105
+8D0A
+9205
+8104
+8F08
+9405
+8004
+9006
+9505
+8004
+9006
+950B
+9105
+950B
+9105
+950B
+9205
+940B
+9106
+9405
+8004
+9107
+9305
+8005
+8F08
+9304
+8105
+8E0A
+9105
+8106
+8C0C
+8F06
+8206
+8906
+8106
+8E05
+8308
+8508
+8107
+8C06
+8415
+8308
+8807
+8613
+850A
+820A
+8711
+8716
+890F
+8914
+8B0C
+8C12
+8F06
+9010
+AA0C
+AF06
+C5FF
+FFE9
+09AC
+0F98
+008D
+1395
+028A
+1792
+0488
+1990
+0686
+1B8E
+0785
+0988
+0A8F
+0683
+088D
+0790
+0582
+0790
+078F
+0582
+0693
+0590
+0580
+0694
+068F
+0580
+0596
+058F
+0580
+0597
+048F
+0580
+0498
+048F
+0580
+0498
+058E
+0B98
+058E
+0B98
+048F
+0580
+0498
+048E
+0581
+0597
+048E
+0581
+0596
+058D
+0681
+0695
+048E
+0583
+0594
+058D
+0683
+0693
+048D
+0685
+0790
+058B
+0786
+098D
+058A
+0888
+0B88
+0687
+0C89
+2D8C
+2B8F
+2793
+2496
+1F9D
+17A9
+07D3
+FF00
+FFFF
+FFFF
+0000
+0022
+0035
+00D2
+0100
+01A8
+0243
+02AC
+0354
+03ED
+0454
+04FF
+059A
+EE00
+F000
+0E0D
+6AEE
+62EA
+D7FD
+0012
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+0000
+000F
+0016
+006B
+0083
+00DC
+012D
+0166
+01C1
+0216
+024C
+02AB
+0302
+031B
+032A
+0344
+036F
+0375
+9F9F
+BA03
+9A04
+9A05
+9904
+9B03
+9F9F
+C09F
+9FBF
+7F9F
+9FBF
+CD03
+960E
+8E12
+8A16
+8704
+8B07
+8503
+8C03
+8004
+8303
+8B04
+8204
+8202
+8B04
+8403
+8102
+8B03
+8702
+8102
+8A03
+8802
+8102
+8804
+8903
+8002
+8703
+8B02
+8103
+8503
+8C02
+8203
+8204
+8C03
+8303
+8004
+8C03
+8506
+8C04
+8716
+8913
+8E0E
+9503
+CDFF
+8400
+9E01
+9C02
+9B02
+9C02
+9B03
+9B02
+9B1D
+811D
+811D
+FFFF
+C0FC
+0185
+0094
+0384
+0291
+0583
+0390
+0682
+0390
+0782
+0290
+0381
+0281
+028F
+0482
+0281
+028E
+0483
+0281
+028D
+0484
+0281
+028D
+0385
+0281
+028C
+0386
+0281
+038A
+0387
+0282
+0288
+0488
+0282
+0386
+0489
+0283
+0D8A
+0284
+0A8C
+0285
+088D
+0287
+0390
+02E0
+FF9A
+0185
+0292
+0483
+0393
+0482
+0295
+0382
+0296
+0281
+0289
+028A
+0281
+0289
+028A
+0281
+0289
+028A
+0281
+0289
+028A
+0281
+0288
+038A
+0282
+0287
+0489
+0282
+0385
+0687
+0383
+0A81
+0384
+0484
+0A81
+0C87
+0684
+0A8A
+0288
+07FF
+84D3
+029A
+0499
+0597
+0796
+0381
+0294
+0482
+0293
+0384
+0291
+0485
+0290
+0387
+028E
+0488
+028D
+038A
+028B
+048B
+028A
+1C81
+1D81
+1D81
+1D94
+029C
+029C
+029C
+02C8
+FA00
+8D06
+8802
+830F
+8704
+820F
+8803
+8209
+8102
+8A03
+8102
+8702
+8C02
+8102
+8702
+8C02
+8102
+8701
+8D02
+8102
+8701
+8E02
+8002
+8701
+8D03
+8002
+8702
+8C02
+8102
+8702
+8C02
+8102
+8703
+8A03
+8102
+8803
+8804
+8102
+8805
+8405
+8202
+890E
+8302
+8A0C
+9408
+E5EC
+0891
+118B
+1588
+1785
+0584
+0286
+0584
+0385
+0289
+0383
+0386
+028A
+0381
+0386
+028C
+0281
+0287
+028C
+0281
+0287
+028D
+0280
+0287
+028C
+0281
+0287
+028C
+0281
+0287
+038B
+0281
+0288
+0389
+0283
+0287
+0584
+0583
+0387
+0E85
+008A
+0C95
+06E6
+FF80
+029C
+029C
+029C
+0297
+0281
+0294
+0581
+0291
+0881
+028F
+0982
+028C
+0985
+0289
+0988
+0287
+088B
+0284
+098D
+0282
+0890
+0B93
+0995
+0698
+049A
+01FC
+F405
+8A03
+8808
+8707
+850A
+8509
+8304
+8105
+830B
+8103
+8504
+8202
+8506
+8803
+8102
+8705
+8902
+8102
+8803
+8A02
+8102
+8803
+8A02
+8102
+8902
+8A02
+8102
+8803
+8A02
+8102
+8804
+8902
+8103
+8606
+8802
+8203
+8303
+8103
+8602
+830B
+8105
+8204
+8408
+840B
+8705
+8609
+9705
+E5E7
+0498
+098B
+0086
+0C89
+0284
+0E88
+0382
+0388
+0388
+0282
+028A
+0387
+0281
+028C
+0287
+0281
+028C
+0287
+0380
+028C
+0287
+0281
+028C
+0287
+0281
+028C
+0287
+0281
+038A
+0287
+0382
+0389
+0286
+0383
+0487
+0285
+0485
+0781
+0381
+0887
+168A
+128F
+0CE9
+9F9F
+AB03
+8A03
+8B04
+8904
+8B04
+8905
+8A04
+8904
+8C02
+8B03
+9F9F
+C09F
+9FC8
+0194
+0A94
+0A94
+0896
+059F
+9FB9
+FFA9
+009B
+0394
+0A94
+0995
+0698
+03FF
+8302
+940A
+940A
+9407
+9704
+FFBA
+C815
+8915
+8915
+8B02
+9B01
+9C01
+9D01
+9D02
+9C04
+9A15
+8A14
+8B13
+8A02
+9B02
+9C01
+9D01
+9D02
+9C15
+8915
+8A14
+8D11
+A0FF
+FFFF
+FFFF
+FF00
+0000
+000E
+001B
+0048
+007D
+00B4
+00E7
+00F0
+010D
+012A
+014B
+0164
+0170
+0185
+018E
+01A3
+01D6
+01E2
+0215
+0246
+0267
+029C
+02CB
+02EA
+0321
+0352
+0360
+0371
+039C
+03CD
+03F8
+041B
+045C
+047D
+04B8
+04E5
+050E
+0541
+0564
+0597
+05AC
+05CD
+05EA
+060F
+0624
+063D
+0656
+067F
+06A4
+06D5
+0700
+0739
+0752
+076B
+0784
+079D
+07C6
+07DF
+0818
+0837
+084C
+086B
+087C
+0895
+08A1
+08D4
+08F9
+0920
+0945
+097A
+099B
+09E4
+09F9
+0A14
+0A33
+0A54
+0A71
+0A8A
+0A9F
+0AC8
+0AED
+0B12
+0B27
+0B5A
+0B77
+0B8C
+0BA5
+0BBE
+0BE3
+0C04
+0C39
+0C5C
+0C63
+0C86
+0C9F
+0CAD
+0CD6
+0D05
+0D2A
+0D61
+0D6C
+0DAB
+0DB8
+0E05
+0E3C
+0E5D
+0E70
+0E73
+0EBA
+0ECB
+0EE4
+0F15
+0F3C
+0F61
+0F6B
+0F86
+0F8A
+0FDB
+0FE2
+F803
+8A01
+850C
+8202
+850A
+8302
+FF94
+CD00
+9105
+9103
+C701
+9105
+9103
+DA9D
+0183
+018F
+0183
+018F
+0183
+0688
+0D87
+0781
+018F
+0183
+018F
+0183
+018F
+0182
+0786
+0D89
+0583
+018F
+0183
+018F
+0183
+00A2
+B402
+8601
+8A04
+8601
+8801
+8102
+8501
+8800
+8301
+8600
+8702
+8202
+8501
+8512
+8501
+8402
+8401
+8700
+8501
+8301
+8801
+8402
+8201
+8901
+8405
+9203
+9F9A
+0392
+0588
+0185
+0183
+0185
+0286
+0183
+0084
+0289
+0582
+038B
+0382
+0292
+0282
+028C
+0283
+0489
+0284
+0182
+0186
+0385
+0183
+0086
+0187
+0182
+0191
+049D
+A403
+9106
+8804
+8102
+8202
+8608
+8501
+8600
+8402
+8501
+8600
+8403
+8401
+8601
+8205
+8301
+8606
+8202
+8001
+8803
+8503
+9402
+9206
+9001
+8200
+9DFF
+9401
+9006
+9102
+FF8B
+E707
+8C0C
+8903
+8703
+8602
+8B02
+8401
+8E02
+8201
+9101
+8101
+9102
+8000
+9300
+B0B0
+0093
+0081
+0191
+0181
+028F
+0282
+028D
+0284
+028B
+0286
+0387
+0389
+0B8D
+07E7
+9F00
+9601
+9501
+8202
+9000
+8102
+9104
+8D07
+8F07
+9404
+9200
+8102
+9001
+8301
+8F01
+9500
+A6A0
+0195
+0195
+0195
+0195
+0191
+0A8B
+0B90
+0195
+0195
+0195
+0195
+01A4
+FF88
+0182
+018F
+0690
+0494
+00FC
+B801
+9501
+9501
+9501
+9501
+9501
+9501
+9501
+9501
+9501
+BCFF
+8701
+9502
+9402
+FF94
+C101
+9303
+9004
+9004
+9004
+9003
+9103
+9103
+9103
+9301
+C4A0
+0290
+0A8B
+0285
+0389
+0186
+0587
+0186
+0183
+0186
+0086
+0184
+0186
+0084
+0285
+0186
+0182
+0286
+0186
+0280
+0187
+0188
+0484
+038B
+0A90
+02A3
+CA01
+9501
+9401
+9510
+8610
+FF94
+B300
+8B01
+8701
+8903
+8601
+8904
+8601
+8802
+8001
+8600
+8801
+8201
+8600
+8701
+8301
+8601
+8501
+8401
+8602
+8301
+8501
+8706
+8601
+8804
+8701
+B4BF
+0188
+008B
+0187
+018C
+0186
+0085
+0185
+0186
+0085
+0185
+0186
+0085
+0185
+0186
+0183
+0285
+0186
+0281
+0180
+0183
+0188
+0482
+0592
+03B7
+A400
+9402
+9204
+9102
+8001
+8F02
+8201
+8E02
+8301
+8C02
+8501
+8B10
+8610
+9002
+9401
+9600
+A1B7
+0185
+0088
+0883
+0287
+0282
+0185
+0187
+0084
+0087
+0186
+0084
+0087
+0186
+0084
+0087
+0186
+0084
+0186
+0186
+0084
+0185
+0187
+0085
+0887
+0086
+06B6
+B508
+8C0C
+8902
+8201
+8302
+8701
+8301
+8601
+8601
+8301
+8601
+8600
+8400
+8701
+8600
+8401
+8601
+8601
+8302
+8401
+8701
+8408
+8F05
+B7B1
+0096
+0096
+008D
+0186
+008A
+0486
+0087
+0588
+0085
+048B
+0082
+058D
+0690
+0393
+01C3
+BB04
+8904
+8206
+8702
+8002
+8001
+8301
+8701
+8302
+8501
+8600
+8501
+8501
+8600
+8501
+8501
+8601
+8302
+8501
+8602
+8101
+8001
+8301
+8805
+8106
+8902
+8404
+B6B3
+0586
+0088
+0784
+0187
+0284
+0184
+0186
+0186
+0084
+0186
+0087
+0183
+0186
+0087
+0084
+0186
+0185
+0183
+0187
+0284
+0182
+0288
+0D8B
+09B8
+FE01
+8601
+8C02
+8502
+8B02
+8502
+FF94
+FF01
+8601
+8201
+8602
+8506
+8702
+8504
+9400
+FCA0
+0195
+0293
+0393
+0081
+0191
+0181
+0190
+0183
+018F
+0184
+018D
+0185
+018D
+0186
+018B
+0187
+018B
+0188
+0189
+0189
+019E
+9E00
+8400
+9000
+8400
+9000
+8400
+9000
+8400
+9000
+8400
+9000
+8400
+9000
+8400
+9000
+8400
+9000
+8400
+9000
+8400
+9000
+8400
+9000
+8400
+A19A
+0189
+018A
+0188
+018A
+0187
+018C
+0186
+018C
+0185
+018E
+0184
+018E
+0183
+0190
+0181
+0192
+0081
+0192
+0394
+0294
+01A4
+B101
+9501
+9401
+9501
+9401
+8801
+8202
+8401
+8604
+8102
+8501
+8402
+8401
+8602
+8202
+8F06
+9104
+BF9D
+078D
+0481
+048A
+0287
+0288
+018B
+0187
+0184
+0383
+0087
+0084
+0582
+0186
+0083
+0182
+0182
+0186
+0083
+0084
+0082
+0186
+0182
+0084
+0082
+0186
+0281
+0083
+0182
+0187
+0A82
+008A
+08A1
+A702
+9104
+8F04
+8F06
+8D04
+8201
+8B03
+8501
+8C04
+8301
+8F04
+8001
+9105
+9404
+9504
+9402
+9C99
+1086
+1086
+0085
+0185
+0186
+0085
+0086
+0186
+0085
+0086
+0186
+0085
+0086
+0186
+0085
+0185
+0186
+0183
+0285
+0186
+0183
+0284
+0287
+0580
+0281
+0289
+0382
+0593
+029F
+9E06
+8E0A
+8A03
+8503
+8901
+8902
+8701
+8B02
+8600
+8D01
+8600
+8D01
+8600
+8D01
+8601
+8C01
+8601
+8B01
+8802
+8802
+8900
+8A00
+9E99
+1086
+1086
+008D
+0186
+008D
+0186
+008D
+0186
+008D
+0186
+018C
+0186
+018C
+0186
+028A
+0188
+0386
+028B
+0A8E
+05A2
+B110
+8610
+8600
+8501
+8501
+8600
+8501
+8501
+8600
+8501
+8501
+8600
+8501
+8501
+8600
+8501
+8501
+8600
+8501
+8501
+8600
+8501
+8501
+8600
+8D01
+B4B1
+1086
+1086
+0085
+018E
+0085
+008F
+0085
+008F
+0085
+008F
+0085
+008F
+0085
+008F
+0085
+008F
+00C4
+9E06
+8D0B
+8A02
+8702
+8802
+8A01
+8701
+8C01
+8600
+8D01
+8600
+8D01
+8600
+8700
+8401
+8601
+8600
+8401
+8601
+8600
+8400
+8802
+8406
+8900
+8505
+9EB1
+1086
+108D
+0195
+0195
+0195
+0195
+0195
+018E
+1086
+10B4
+B100
+8E00
+8600
+8D01
+8600
+8D01
+8600
+8D01
+8610
+8610
+8600
+8D01
+8600
+8D01
+8600
+8D01
+CCBF
+0196
+0195
+0186
+008D
+0186
+008D
+0186
+008C
+0187
+0F87
+0D89
+0096
+0096
+00AC
+9910
+8610
+8D02
+9302
+9304
+9102
+8002
+8F02
+8202
+8D01
+8503
+8A01
+8802
+8801
+8A03
+8600
+8D01
+9600
+9CB1
+1086
+1095
+0195
+0195
+0195
+0195
+0195
+0195
+0195
+01B4
+9910
+8610
+8703
+9503
+9503
+9503
+9302
+9202
+9203
+9103
+9210
+8610
+9C99
+1086
+1086
+0395
+0295
+0395
+0395
+0395
+0395
+0295
+0387
+1086
+109C
+9D08
+8C0C
+8902
+8703
+8701
+8B01
+8701
+8C01
+8600
+8D01
+8600
+8D01
+8601
+8C01
+8601
+8B01
+8802
+8802
+890C
+8C08
+A0B1
+1086
+1086
+0086
+008E
+0086
+008E
+0086
+008E
+0086
+008E
+0184
+018E
+0184
+018E
+0282
+028F
+0692
+02A7
+9D08
+8C0C
+8902
+8802
+8701
+8B02
+8601
+8C01
+8600
+8E02
+8400
+8E04
+8201
+8C01
+8101
+8201
+8C01
+8101
+8302
+8802
+8201
+840C
+8301
+8608
+A0B1
+1086
+1086
+0086
+008E
+0086
+008E
+0086
+008E
+0086
+018D
+0184
+048B
+0184
+0180
+0389
+0783
+0388
+0586
+028A
+008A
+009C
+B303
+8602
+8805
+8601
+8701
+8202
+8601
+8601
+8301
+8601
+8600
+8501
+8501
+8600
+8501
+8501
+8600
+8501
+8501
+8601
+8501
+8302
+8602
+8402
+8102
+8801
+8505
+9301
+A099
+0096
+0096
+0096
+0096
+0096
+1086
+1086
+0096
+0096
+0096
+0096
+00AC
+990C
+8A0E
+9502
+9501
+9601
+9501
+9501
+9501
+9401
+9402
+870E
+880C
+A099
+0195
+0494
+0594
+0594
+0594
+0592
+048F
+048F
+048F
+048F
+0492
+01AB
+9905
+920A
+9209
+9004
+8E05
+8E04
+9005
+9406
+9406
+9206
+8909
+8A06
+A6A9
+0086
+018B
+0286
+0388
+0388
+0384
+038B
+0381
+038F
+0591
+058F
+0381
+038C
+0285
+0388
+0387
+0387
+018B
+0296
+009C
+9900
+9602
+9503
+9503
+9503
+940A
+8D09
+8B04
+9004
+9003
+9202
+9400
+ACA9
+0086
+008C
+0286
+008A
+0486
+0089
+0280
+0186
+0087
+0381
+0186
+0085
+0383
+0186
+0084
+0285
+0186
+0082
+0386
+0186
+0080
+0388
+0186
+038A
+0186
+028B
+0195
+019C
+DF15
+8101
+9101
+8101
+9101
+8101
+9101
+8101
+9101
+8101
+9101
+8101
+9101
+8200
+9100
+B2B0
+0195
+0395
+0395
+0395
+0395
+0494
+0495
+0395
+0395
+01B3
+B000
+9100
+8201
+9101
+8101
+9101
+8101
+9101
+8101
+9101
+8101
+9101
+8101
+9101
+8115
+E1CE
+0194
+0292
+0292
+0294
+0296
+0295
+0395
+01D6
+AB00
+9600
+9600
+9600
+9600
+9600
+9600
+9600
+9600
+9600
+9600
+9600
+9AE0
+0195
+0395
+0295
+0295
+00FF
+89A6
+0193
+048C
+0183
+0180
+028B
+0083
+0182
+018A
+0183
+0084
+008A
+0183
+0084
+008A
+0183
+0084
+008A
+0183
+0083
+008C
+0182
+0082
+018C
+0B8C
+0AB4
+AF12
+8411
+8C01
+8601
+8C00
+8801
+8A01
+8801
+8A01
+8801
+8A01
+8801
+8B01
+8602
+8B03
+8302
+8D08
+9004
+A0B8
+068F
+088D
+0284
+028C
+0186
+028A
+0188
+018A
+0188
+018A
+0188
+018A
+0188
+018B
+0186
+018C
+0285
+018D
+00A6
+A104
+9008
+8D02
+8402
+8C01
+8602
+8A01
+8801
+8A01
+8801
+8A01
+8801
+8B00
+8800
+8C01
+8601
+8611
+8412
+B4A2
+0292
+078E
+0480
+038C
+0181
+0182
+018B
+0182
+0183
+018A
+0182
+0183
+018A
+0182
+0183
+018A
+0182
+0183
+018B
+0181
+0183
+018B
+0582
+018D
+0483
+00B5
+B601
+9501
+9501
+9010
+8503
+8101
+8F01
+8301
+8F00
+8401
+8E01
+8401
+8E01
+8400
+9001
+9502
+ABAA
+0289
+0481
+0180
+0487
+0B81
+0186
+0183
+0181
+0183
+0086
+0085
+0082
+0083
+0185
+0085
+0082
+0083
+0185
+0085
+0082
+0083
+0185
+0183
+0182
+0083
+0186
+0583
+0083
+0086
+0584
+0181
+0186
+0089
+0487
+008B
+019A
+AF12
+8412
+8C01
+9401
+9500
+9501
+9501
+9502
+950B
+8C0A
+B4CD
+0188
+018A
+0188
+018A
+0188
+0185
+0182
+0C85
+0182
+0C95
+0195
+0195
+01CC
+C401
+9601
+8501
+8D01
+8501
+8D01
+8501
+8D01
+8501
+8C01
+8101
+8210
+8102
+810F
+8201
+DCAF
+1284
+128F
+0294
+0194
+0392
+0180
+0290
+0182
+028E
+0184
+028C
+0186
+038A
+0089
+0196
+009C
+B000
+8E01
+8401
+8E01
+8401
+8E01
+8401
+8E01
+8412
+8412
+9501
+9501
+9501
+9600
+B49D
+0C8A
+0C8B
+0095
+0195
+0195
+0C8B
+0B8B
+0194
+0195
+0195
+0C8B
+0B9C
+B50C
+8A0C
+8C01
+9401
+9500
+9501
+9501
+9502
+950B
+8C0A
+B4A1
+0491
+078E
+0282
+038C
+0186
+018B
+0188
+018A
+0188
+018A
+0188
+018A
+0188
+018B
+0186
+018C
+0383
+028D
+0890
+04A0
+B511
+8510
+8701
+8601
+8C00
+8800
+8B01
+8801
+8A01
+8801
+8A01
+8801
+8B01
+8602
+8B02
+8402
+8D08
+9004
+A0A1
+0490
+088D
+0283
+038C
+0087
+028A
+0188
+018A
+0188
+018A
+0188
+018B
+0088
+008C
+0186
+018C
+0F86
+11AF
+CD0C
+8A0C
+8C01
+9401
+9500
+9501
+9501
+9501
+9601
+9500
+A7B8
+0085
+018C
+0483
+018C
+0484
+018A
+0182
+0183
+018A
+0182
+0183
+018A
+0182
+0183
+018A
+0183
+0182
+018B
+0083
+0182
+018B
+0182
+058D
+0083
+03B6
+B501
+9501
+9501
+920E
+880F
+8A01
+8801
+8A01
+8801
+8A01
+8801
+8A01
+8801
+9401
+B5B5
+0A8C
+0B95
+0295
+0196
+0096
+0095
+0095
+018B
+0C8A
+0CB4
+9D00
+9603
+9404
+9504
+9404
+9404
+9303
+9103
+9103
+9004
+9003
+9300
+A89D
+0593
+0893
+0593
+038F
+048F
+0492
+0395
+0594
+0593
+038C
+098B
+06A2
+B501
+8801
+8A02
+8602
+8C02
+8203
+8E02
+8002
+9104
+9204
+9102
+8002
+8E02
+8303
+8B02
+8602
+8A00
+8901
+B4AC
+0186
+028C
+0185
+0589
+0188
+0487
+018A
+0484
+018E
+0791
+048F
+0490
+048F
+0490
+0393
+01A7
+A900
+8A01
+8702
+8A01
+8603
+8A01
+8504
+8A01
+8402
+8001
+8A01
+8202
+8201
+8A01
+8102
+8301
+8A01
+8002
+8401
+8A04
+8501
+8A02
+8701
+8A01
+8801
+9501
+9CA2
+0096
+0195
+0193
+0581
+0286
+0781
+0883
+068A
+0281
+0191
+0181
+0192
+0081
+0192
+0081
+0192
+00C8
+FF90
+1581
+15FF
+90C8
+0192
+0081
+0192
+0081
+0192
+0081
+0191
+0182
+0685
+0181
+0383
+0781
+088A
+0581
+018F
+0195
+01BA
+9F00
+9501
+9501
+9401
+9501
+9601
+9502
+9501
+9501
+9501
+9401
+9501
+A6F8
+0189
+0485
+0381
+0C85
+0283
+0AFF
+94A1
+0291
+078E
+0382
+038C
+0186
+018B
+0188
+018A
+0086
+0786
+0E86
+0884
+0187
+0081
+0188
+018A
+0187
+028B
+0186
+01B6
+A900
+8C01
+8601
+8904
+8502
+870E
+8702
+8206
+8001
+8701
+8301
+8600
+8700
+8401
+8601
+8600
+8D01
+8601
+8D00
+8601
+8D00
+9501
+9501
+9CB4
+0086
+008E
+088F
+0182
+018F
+0184
+008F
+0184
+018E
+0184
+018E
+0184
+0090
+0182
+018F
+088E
+0086
+00B9
+B101
+8700
+8100
+8903
+8401
+8100
+8B03
+8201
+8100
+8D02
+8101
+8100
+8F0A
+8C0A
+8A03
+8001
+8100
+8B03
+8201
+8100
+8903
+8401
+8100
+8901
+8601
+8100
+8900
+ACFF
+9009
+8208
+8109
+8208
+FF90
+B802
+8500
+8604
+8004
+8302
+8407
+8101
+8401
+8401
+8201
+8301
+8401
+8201
+8301
+8301
+8401
+8201
+8401
+8201
+8401
+8300
+8401
+8301
+8201
+8401
+8402
+8007
+8501
+8304
+8004
+8E01
+BBC8
+0194
+0295
+01C5
+0194
+0295
+01DC
+8902
+9107
+8E01
+8502
+8B01
+8202
+8200
+8B00
+8105
+8200
+8901
+8100
+8301
+8100
+8900
+8101
+8401
+8000
+8900
+8101
+8401
+8000
+8901
+8001
+8400
+8100
+8A00
+8101
+8201
+8100
+8A01
+8100
+8501
+8B01
+8601
+8D02
+8202
+9004
+89BC
+018F
+0381
+018A
+0181
+0481
+018A
+0082
+0181
+0180
+018A
+0082
+0082
+0180
+018A
+0082
+0082
+0180
+018A
+0181
+0081
+0181
+018A
+0881
+018B
+0781
+0195
+01B8
+BA01
+9403
+9202
+8001
+9002
+8201
+8F01
+8401
+9101
+9403
+9202
+8001
+9002
+8201
+8F01
+8401
+B6D0
+0195
+0190
+0C8B
+0A8D
+088F
+0691
+0493
+0295
+00BC
+FFFF
+CF89
+0291
+078E
+0185
+028B
+0188
+008B
+0080
+0781
+0089
+0180
+0781
+0089
+0081
+0082
+0084
+0089
+0081
+0082
+0084
+0089
+0180
+0180
+0382
+008A
+0081
+0281
+0181
+008A
+0188
+018B
+0186
+018D
+0282
+0290
+0489
+C900
+9600
+9600
+9600
+9600
+9600
+9600
+9600
+DCCB
+0193
+0591
+0181
+0190
+0183
+018F
+0183
+018F
+0183
+0091
+0592
+03D8
+9F00
+8700
+8D00
+8701
+8C00
+8701
+8C00
+8701
+8C00
+8701
+870B
+8101
+870B
+8101
+8C00
+8701
+8C00
+8701
+8C00
+8701
+8C00
+8701
+8C00
+8700
+9DCA
+0086
+008D
+0184
+028C
+0184
+038C
+0184
+0080
+018C
+0183
+0180
+018C
+0182
+0181
+018D
+0482
+018E
+0283
+01D3
+D100
+8E01
+8401
+8D01
+8601
+8C01
+8200
+8201
+8C01
+8200
+8201
+8C01
+8101
+8201
+8D05
+8001
+8F01
+8103
+D4FF
+9101
+9303
+9301
+9500
+F69D
+1185
+0B95
+0196
+0195
+0195
+0195
+0094
+028B
+0B95
+0295
+0195
+0195
+0085
+FFFF
+CE80
+9501
+9402
+9203
+9104
+8600
+8904
+8603
+8705
+8602
+8506
+8604
+8207
+8704
+8009
+860F
+8707
+8007
+8706
+8006
+8807
+8005
+8708
+8103
+8807
+8001
+8101
+8806
+8005
+8905
+8007
+8804
+800A
+8603
+800C
+8502
+800C
+8601
+800B
+880C
+8B08
+8B8F
+FFFF
+FFFF
+EC90
+F05B
+0012
+0000
+9084
+C083
+FF83
+9480
+8480
+0012
+C085
+F000
+6A01
+C000
+F086
+C084
+F087
+8084
+C086
+FF83
+9480
+8480
+C087
+FF83
+9480
+8480
+0012
+C08E
+FF83
+9480
+8480
+9480
+8480
+0012
+C07A
+FF83
+9480
+8480
+C07B
+FF83
+9480
+8480
+0012
+0100
+0E35
+6F83
+DFD5
+0100
+517D
+0100
+6F84
+6B85
+0100
+90D8
+3784
+3785
+DFD1
+0100
+0E36
+6F83
+DFC7
+0100
+0E3F
+6F84
+0E01
+6F85
+DFC7
+0100
+0E37
+6F83
+DFBD
+0100
+517C
+0100
+6F84
+6B85
+0E02
+0100
+5D7E
+E107
+0E3A
+0100
+2784
+0E00
+0100
+2385
+D010
+0100
+057E
+E107
+0E20
+0100
+2784
+0E00
+0100
+2385
+D006
+0E18
+0100
+2784
+0E00
+0100
+2385
+0100
+0784
+0E00
+5B85
+0100
+0EEF
+80D8
+5584
+0E00
+5585
+E204
+0EEF
+0100
+6F84
+6B85
+C07C
+F000
+C000
+F001
+6A00
+5000
+0100
+1384
+5001
+0100
+1385
+DF88
+0100
+0E20
+6F83
+DF7E
+0100
+517C
+0100
+6F84
+6B85
+DF7E
+0100
+0E21
+6F83
+DF74
+0100
+517D
+0100
+6F84
+6B85
+0100
+90D8
+3784
+3785
+DF70
+0012
+0E20
+0100
+5D82
+E103
+0100
+0EB6
+6F82
+0100
+5182
+087E
+E203
+0E22
+0100
+5F82
+0E21
+0100
+5D82
+E304
+0100
+5182
+08A3
+E203
+0100
+0E82
+6F82
+0E21
+0100
+5D82
+6EF6
+6AF7
+90D8
+36F6
+36F7
+0E9A
+26F6
+0EA3
+22F7
+0009
+CFF5
+F088
+000A
+CFF5
+F089
+0100
+2982
+0FDF
+6EF6
+6AF7
+90D8
+36F6
+36F7
+0E9A
+26F6
+0EA3
+22F7
+0009
+CFF5
+F08A
+000A
+CFF5
+F08B
+0012
+0E27
+0100
+5D82
+E103
+0100
+0E3B
+6F82
+0E22
+0100
+5D82
+E103
+0100
+0E3C
+6F82
+0E6D
+0100
+5D82
+E103
+0100
+0E3D
+6F82
+0E20
+0100
+5D82
+E103
+0100
+0E3E
+6F82
+0E2E
+0100
+5D82
+E304
+0100
+5182
+083E
+E203
+0100
+0E3E
+6F82
+0E2E
+0100
+5D82
+6EF6
+6AF7
+90D8
+36F6
+36F7
+0E00
+26F6
+0EA0
+22F7
+0009
+CFF5
+F088
+000A
+CFF5
+F089
+0100
+2982
+0FD2
+6EF6
+6AF7
+90D8
+36F6
+36F7
+0E00
+26F6
+0EA0
+22F7
+0009
+CFF5
+F08A
+000A
+CFF5
+F08B
+0012
+0E20
+0100
+5D82
+E103
+0100
+0E2F
+6F82
+0E2E
+0100
+5D82
+E304
+0100
+5182
+0839
+E203
+0100
+0E2F
+6F82
+0E2E
+0100
+5D82
+6EF6
+6AF7
+90D8
+36F6
+36F7
+0EA0
+26F6
+0E9F
+22F7
+0009
+CFF5
+F088
+000A
+CFF5
+F089
+0100
+2982
+0FD2
+6EF6
+6AF7
+90D8
+36F6
+36F7
+0EA0
+26F6
+0E9F
+22F7
+0009
+CFF5
+F08A
+000A
+CFF5
+F08B
+0012
+0100
+517C
+6E00
+6A01
+3401
+E204
+5000
+08E6
+0E00
+5401
+E203
+0100
+0EE6
+6F7C
+0100
+517D
+6E00
+6A01
+3401
+E204
+5000
+089B
+0E00
+5401
+E203
+0100
+0E9B
+6F7D
+DEB2
+0100
+0E22
+6F83
+DE87
+8084
+0100
+6B81
+0100
+5181
+6AEA
+0F60
+6EE9
+0E00
+22EA
+CFEF
+F082
+0100
+5182
+E106
+0100
+0E3A
+6F82
+0100
+0E19
+6F81
+6AF8
+0100
+5182
+E101
+D0DC
+0E1A
+0100
+5D81
+E301
+D0D7
+0E02
+0100
+5D7E
+E102
+DF84
+D006
+0100
+057E
+E102
+DF33
+D001
+DEF3
+0100
+6B8E
+C088
+F08C
+C089
+F08D
+0100
+518A
+0100
+5D8C
+0100
+518B
+0100
+598D
+E301
+D0AF
+0E02
+0100
+5D7E
+E11D
+C08C
+FFF6
+C08D
+FFF7
+0E01
+0B0F
+E005
+90D8
+32F7
+32F6
+06E8
+E1FB
+0E01
+90D8
+36F6
+36F7
+06E8
+E1FB
+0E00
+26F6
+0E9A
+22F7
+0009
+CFF5
+F084
+000A
+CFF5
+F085
+D03C
+0100
+057E
+E11D
+C08C
+FFF6
+C08D
+FFF7
+0E01
+0B0F
+E005
+90D8
+32F7
+32F6
+06E8
+E1FB
+0E01
+90D8
+36F6
+36F7
+06E8
+E1FB
+0E24
+26F6
+0EA0
+22F7
+0009
+CFF5
+F084
+000A
+CFF5
+F085
+D01C
+C08C
+FFF6
+C08D
+FFF7
+0E01
+0B0F
+E005
+90D8
+32F7
+32F6
+06E8
+E1FB
+0E01
+90D8
+36F6
+36F7
+06E8
+E1FB
+0E88
+26F6
+0EA4
+22F7
+0009
+CFF5
+F084
+000A
+CFF5
+F085
+0100
+518C
+0B01
+E005
+0100
+5184
+0100
+6F80
+D005
+C085
+F000
+6A01
+C000
+F080
+0100
+5180
+6E00
+6A01
+5000
+0B80
+E01D
+0E7F
+0100
+5F80
+0100
+517F
+E009
+0100
+5180
+0800
+E204
+0100
+0780
+DDEB
+D7F8
+D00D
+C08E
+FF83
+0100
+5180
+0800
+E207
+0100
+0780
+9480
+8480
+9480
+8480
+D7F5
+D01B
+0100
+2B80
+0100
+517F
+E00E
+C08E
+FF83
+0100
+5180
+0800
+E207
+0100
+0780
+9480
+8480
+9480
+8480
+D7F5
+D008
+0100
+5180
+0800
+E204
+0100
+0780
+DDC1
+D7F8
+0100
+2B8C
+0E00
+238D
+D747
+0100
+2B81
+0100
+5181
+6AEA
+0F60
+6EE9
+0E00
+22EA
+CFEF
+F082
+D720
+0100
+6B83
+DD8E
+0012
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
+FFFF
diff -r 000000000000 -r 96a35aeda5f2 code_part1/OSTC_code_asm_part1/pled_outputs.asm
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/code_part1/OSTC_code_asm_part1/pled_outputs.asm Tue Jan 12 15:05:59 2010 +0100
@@ -0,0 +1,3287 @@
+
+; OSTC - diving computer code
+; Copyright (C) 2008 HeinrichsWeikamp GbR
+
+; 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 3 of the License, or
+; (at your option) any later version.
+
+; This program is distributed in the hope that it will be useful,
+; but WITHOUT ANY WARRANTY; without even the implied warranty of
+; 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, see .
+
+
+; routines for display outputs
+; written by: Matthias Heinrichs, info@heinrichsweikamp.com
+; written: 15/01/05
+; last updated: 06/06/08
+; known bugs:
+; ToDo: More comments
+
+ostc_debug macro debug_temp
+ movlw debug_temp
+ call ostc_debug1
+ endm
+
+ostc_debug1:
+ movwf debug_temp
+
+ movff debug_char+4,debug_char+5 ; Save for background debugger
+ movff debug_char+3,debug_char+4
+ movff debug_char+2,debug_char+3
+ movff debug_char+1,debug_char+2
+ movff debug_char+0,debug_char+1
+ movff debug_temp,debug_char+0
+
+ btfss debug_mode ; Are we in debugmode?
+ return ; No, return!
+
+ WIN_TOP .200
+ WIN_LEFT .100
+ WIN_FONT FT_SMALL
+ WIN_INVERT .0 ; Init new Wordprocessor
+ WIN_COLOR color_white
+ lfsr FSR2,letter
+ movf debug_char+0,W
+ movwf POSTINC2
+ movf debug_char+1,W
+ movwf POSTINC2
+ movf debug_char+2,W
+ movwf POSTINC2
+ movf debug_char+3,W
+ movwf POSTINC2
+ movf debug_char+4,W
+ movwf POSTINC2
+ movf debug_char+5,W
+ movwf POSTINC2
+ movlw ' '
+ movwf POSTINC2
+ call word_processor
+ return
+
+
+PLED_resetdebugger:
+ call set_LEDr
+ call clear_LEDnofly
+ call PLED_boot ; PLED boot
+ call PLED_ClearScreen ; clean up OLED
+
+ WIN_COLOR color_white
+
+ DISPLAYTEXT .133
+ DISPLAYTEXT .134
+ DISPLAYTEXT .135
+ DISPLAYTEXT .136 ; Display Debug intro
+
+ WIN_TOP .100
+ WIN_LEFT .10
+ WIN_FONT FT_SMALL
+ WIN_INVERT .0 ; Init new Wordprocessor
+ WIN_COLOR color_white
+ lfsr FSR2,letter
+ movf debug_char+0,W
+ movwf POSTINC2
+ movf debug_char+1,W
+ movwf POSTINC2
+ movf debug_char+2,W
+ movwf POSTINC2
+ movf debug_char+3,W
+ movwf POSTINC2
+ movf debug_char+4,W
+ movwf POSTINC2
+ movf debug_char+5,W
+ movwf POSTINC2
+ movlw '.'
+ movwf POSTINC2
+ movlw ' '
+ movwf POSTINC2
+ movff flag1,lo
+ output_8
+ movlw ' '
+ movwf POSTINC2
+ movff flag2,lo
+ output_8
+ call word_processor
+
+ WIN_TOP .125
+ WIN_LEFT .10
+ WIN_FONT FT_SMALL
+ WIN_INVERT .0 ; Init new Wordprocessor
+ WIN_COLOR color_white
+
+ lfsr FSR2,letter
+ movff flag3,lo
+ output_8
+ movlw ' '
+ movwf POSTINC2
+ movff flag4,lo
+ output_8
+ movlw ' '
+ movwf POSTINC2
+ movff flag5,lo
+ output_8
+ movlw ' '
+ movwf POSTINC2
+ movff flag6,lo
+ output_8
+ movlw ' '
+ movwf POSTINC2
+ movff flag7,lo
+ output_8
+ call word_processor
+
+ WIN_TOP .150
+ WIN_LEFT .10
+ WIN_FONT FT_SMALL
+ WIN_INVERT .0 ; Init new Wordprocessor
+ WIN_COLOR color_white
+
+ lfsr FSR2,letter
+ movff flag8,lo
+ output_8
+ movlw ' '
+ movwf POSTINC2
+ movff flag9,lo
+ output_8
+ movlw ' '
+ movwf POSTINC2
+ movff flag10,lo
+ output_8
+ movlw ' '
+ movwf POSTINC2
+ movff flag11,lo
+ output_8
+ movlw ' '
+ movwf POSTINC2
+ movff flag12,lo
+ output_8
+ call word_processor
+
+PLED_resetdebugger_loop:
+ btfss switch_left
+ bra PLED_resetdebugger_loop ; Loop
+ call clear_LEDy
+ return
+
+PLED_divemode_mask: ; Displays mask in Dive-Mode
+ WIN_COLOR color_red
+ DISPLAYTEXTH .267 ; Max Depth
+ DISPLAYTEXT .86 ; Divetime
+ DISPLAYTEXT .87 ; Depth
+ WIN_COLOR color_white
+ return
+
+PLED_clear_decoarea:
+ movlw .0
+ movff WREG,box_temp+0 ; Data
+ movlw .60
+ movff WREG,box_temp+1 ; row top (0-239)
+ movlw .239
+ movff WREG,box_temp+2 ; row bottom (0-239)
+ movlw .090
+ movff WREG,box_temp+3 ; column left (0-159)
+ movlw .159
+ movff WREG,box_temp+4 ; column right (0-159)
+ call PLED_box
+ call PLED_temp_divemode ; redraw temperature
+ call PLED_active_gas_divemode ; redraw active Gas
+ return
+
+PLED_display_ndl_mask:
+ ; Clear Dekostop and Dekosum
+ rcall PLED_clear_decoarea
+
+ WIN_COLOR color_red
+ DISPLAYTEXT d'84' ; NoStop
+ WIN_COLOR color_white
+
+PLED_display_ndl_mask2:
+ ; Clears Gradient Factor
+ movlw d'8'
+ movwf temp1
+ WIN_TOP .145
+ WIN_LEFT .0
+ call PLED_display_clear_common_y1
+ return
+
+PLED_display_ndl:
+ btfsc multi_gf_display ; Is the Multi-GF Table displayed?
+ return ; Yes, No update and return!
+
+ ostc_debug 'z' ; Sends debug-information to screen if debugmode active
+
+ WIN_TOP .185
+ WIN_LEFT .119
+ WIN_FONT FT_MEDIUM
+ WIN_INVERT .0 ; Init new Wordprocessor
+ WIN_COLOR color_white
+ lfsr FSR2,letter
+ movff char_O_nullzeit,lo ; NDL in minutes
+ output_8
+ movlw 0x27 ; "'"
+ movwf POSTINC2
+ call word_processor
+ WIN_FONT FT_SMALL
+ return
+
+PLED_display_deko_mask:
+ rcall PLED_clear_decoarea
+; total deco time word
+ WIN_COLOR color_red
+ DISPLAYTEXT d'85' ; DECOSUM
+ WIN_COLOR color_white
+ return
+
+PLED_display_deko:
+ btfsc multi_gf_display ; Is the Multi-GF Table displayed?
+ return ; Yes, No update and return!
+
+ btfsc menubit ; Divemode menu active?
+ bra PLED_display_deko1 ; Yes, do not display dekostop
+
+ ostc_debug 'y' ; Sends debug-information to screen if debugmode active
+; deco stop word
+ WIN_COLOR color_red
+ DISPLAYTEXT d'82' ; DEKOSTOP
+ WIN_COLOR color_white
+
+ WIN_TOP .118
+ WIN_LEFT .94
+ WIN_FONT FT_MEDIUM
+ WIN_INVERT .0 ; Init new Wordprocessor
+ WIN_COLOR color_white
+ lfsr FSR2,letter
+ movff char_O_array_decodepth+0,lo ; Ceiling in m
+ output_99
+ movlw 'm' ; "m"
+ movwf POSTINC2
+ movff char_O_array_decotime,lo ; length of first stop in m
+ output_99
+ movlw 0x27 ; "'"
+ movwf POSTINC2
+ call word_processor
+ WIN_FONT FT_SMALL
+
+PLED_display_deko1:
+ btfsc multi_gf_display ; Is the Multi-GF Table displayed?
+ return ; Yes, No update and return!
+
+ ostc_debug 'x' ; Sends debug-information to screen if debugmode active
+
+ WIN_TOP .185
+ WIN_LEFT .119
+ WIN_FONT FT_MEDIUM
+ WIN_INVERT .0 ; Init new Wordprocessor
+ WIN_COLOR color_white
+ lfsr FSR2,letter
+ movff char_O_ascenttime,lo ; complete ascend time
+ movlw d'199' ; limit display of total ascend time to 99mins....
+ cpfslt lo ; skip if 199 (WREG) > lo
+ movwf lo
+ bcf leftbind
+ output_8
+ movlw 0x27 ; "'"
+ movwf POSTINC2
+ call word_processor
+
+ movff char_O_gradient_factor,lo ; gradient factor
+ GETCUSTOM8 d'8' ; threshold for display
+ cpfslt lo ; show value?
+ bra PLED_display_deko2 ; Yes
+ ; No
+ bra PLED_display_ndl_mask2 ; Clear gradient factor
+
+PLED_display_deko2:
+ ostc_debug 'w' ; Sends debug-information to screen if debugmode active
+;GF
+ WIN_TOP .145
+ WIN_LEFT .0
+ WIN_FONT FT_SMALL
+ WIN_COLOR color_white
+ lfsr FSR2,letter
+ movlw 'G'
+ movwf POSTINC2
+ movlw 'F'
+ movwf POSTINC2
+ movlw ':'
+ movwf POSTINC2
+ movff char_O_gradient_factor,lo ; gradient factor
+ output_8
+ movlw '%'
+ movwf POSTINC2
+ movlw ' '
+ movwf POSTINC2
+ call word_processor
+ return
+
+PLED_simulator_data:
+ WIN_TOP .65
+ WIN_LEFT .105
+ WIN_FONT FT_SMALL
+ WIN_COLOR color_white
+ lfsr FSR2,letter
+ movff logbook_temp1,lo
+ bsf leftbind
+ output_8
+ bcf leftbind
+ movlw 'm'
+ movwf POSTINC2
+ movlw 'i'
+ movwf POSTINC2
+ movlw 'n'
+ movwf POSTINC2
+ movlw ' '
+ movwf POSTINC2
+ call word_processor
+
+ WIN_TOP .95
+ WIN_LEFT .100
+ WIN_FONT FT_SMALL
+ WIN_COLOR color_white
+ lfsr FSR2,letter
+ movff logbook_temp2,lo
+ bsf leftbind
+ output_8
+ bcf leftbind
+ movlw 'm'
+ movwf POSTINC2
+ movlw ' '
+ movwf POSTINC2
+ call word_processor
+ return
+
+PLED_display_velocity:
+ btfsc multi_gf_display ; Is the Multi-GF Table displayed?
+ return ; Yes, No update and return!
+
+ ostc_debug 'v' ; Sends debug-information to screen if debugmode active
+ WIN_TOP .90
+ WIN_LEFT .0
+ WIN_FONT FT_SMALL
+ WIN_COLOR color_white
+ lfsr FSR2,letter
+ movlw '-'
+ btfsc neg_flag
+ movlw '+'
+ movwf POSTINC2
+ movff divA+0,lo
+ output_99
+ OUTPUTTEXT d'83' ; m/min
+ call word_processor
+ bsf pled_velocity_display
+ return
+
+PLED_display_velocity_clear:
+ movlw d'8'
+ movwf temp1
+ WIN_TOP .90
+ WIN_LEFT .0
+ bcf pled_velocity_display
+ bra PLED_display_clear_common_y1
+
+PLED_display_wait_clear
+ movlw d'6'
+ movwf temp1
+ WIN_TOP .2
+ WIN_LEFT .115
+ bra PLED_display_clear_common_y1
+
+PLED_display_clear_common_y2: ; Clears with y-scale=2
+ WIN_FONT FT_MEDIUM
+ bra PLED_display_clear_common1
+
+PLED_display_clear_common_y1: ; Clears with y-scale=1
+ WIN_FONT FT_SMALL
+PLED_display_clear_common1:
+ lfsr FSR2,letter
+PLED_display_clear_common2:
+ movlw ' '
+ movwf POSTINC2
+ decfsz temp1,F
+ bra PLED_display_clear_common2
+ call word_processor
+ WIN_FONT FT_SMALL
+ return
+
+PLED_clock:
+ ostc_debug 'c'
+
+ ;If > 0 display surface_interval:2 and clock changing every 5 seconds
+ ;use timeout_counter for this
+ WIN_TOP .50
+ WIN_LEFT .0
+ WIN_FONT FT_SMALL
+ WIN_INVERT .0 ; Init new Wordprocessor
+ WIN_COLOR color_white
+ lfsr FSR2,letter
+
+ movff surface_interval+0,lo
+ tstfsz lo
+ bra PLED_clock0 ; Not Zero, switch between Interval and clock
+ movff surface_interval+1,lo
+ tstfsz lo
+ bra PLED_clock0 ; Not Zero, switch between Interval and clock
+ bra PLED_clock3 ; surface_interval=0, always display clock!
+
+PLED_clock0:
+ btfss show_interval ; Show Interval?
+ bra PLED_clock2 ; No, display clock and reset counter
+
+PLED_clock1:
+ decfsz timeout_counter,F ; =0?
+ bra PLED_clock1a ; No...
+ bra PLED_clock3 ; Yes, display clock and reset counter
+
+PLED_clock1a:
+ bsf show_interval
+ movlw d'6'
+ cpfslt timeout_counter ; f < w? -> timeout_counter>5?
+ rcall PLED_clock_reload_timer ; No, reload counter
+
+ movff surface_interval+0,lo
+ movff surface_interval+1,hi
+ call convert_time ; lo=mins, hi=hours
+
+ movf hi,W
+ movff lo,hi
+ movwf lo ; exchange lo and hi
+
+ movlw 'I'
+ movwf POSTINC2
+ movlw 'n'
+ movwf POSTINC2
+ movlw 't'
+ movwf POSTINC2
+ movlw ':'
+ movwf POSTINC2
+ output_99x
+ movlw ':'
+ movwf POSTINC2
+ movff hi,lo
+ output_99x
+ movlw ' '
+ movwf POSTINC2
+ call word_processor
+ return
+
+PLED_clock_reload_timer:
+ bcf show_interval
+ movlw d'5'
+ movwf timeout_counter
+ return
+
+PLED_interval_reload_timer:
+ bsf show_interval
+ movlw d'5'
+ movwf timeout_counter
+ return
+
+PLED_clock2:
+ decfsz timeout_counter,F ; =0?
+ bra PLED_clock3 ; No...
+ bra PLED_clock1a ; Yes, display interval and reset counter
+
+PLED_clock3:
+ bcf show_interval
+ movlw d'6'
+ cpfslt timeout_counter ; f < w? -> timeout_counter>5?
+ rcall PLED_interval_reload_timer; No, reload counter
+
+ movff hours,lo
+ output_99x
+ movlw ':'
+ movwf POSTINC2
+ movff mins,lo
+ output_99x
+ movlw ':'
+ movwf POSTINC2
+ movff secs,lo
+ output_99x
+ movlw ' '
+ movwf POSTINC2
+ call word_processor
+ return
+
+PLED_logbook_cursor:
+
+PLED_menu_cursor:
+ WIN_TOP .35
+ WIN_LEFT .0
+ WIN_FONT FT_SMALL
+ WIN_INVERT .0 ; Init new Wordprocessor
+ WIN_COLOR color_white
+ lfsr FSR2,letter
+ movlw 0xB8
+ movwf POSTINC2
+ call word_processor
+
+ WIN_TOP .65
+ WIN_LEFT .0
+ WIN_FONT FT_SMALL
+ WIN_INVERT .0 ; Init new Wordprocessor
+ WIN_COLOR color_white
+ lfsr FSR2,letter
+ movlw 0xB8
+ movwf POSTINC2
+ call word_processor
+
+ WIN_TOP .95
+ WIN_LEFT .0
+ WIN_FONT FT_SMALL
+ WIN_INVERT .0 ; Init new Wordprocessor
+ WIN_COLOR color_white
+ lfsr FSR2,letter
+ movlw 0xB8
+ movwf POSTINC2
+ call word_processor
+
+ WIN_TOP .125
+ WIN_LEFT .0
+ WIN_FONT FT_SMALL
+ WIN_INVERT .0 ; Init new Wordprocessor
+ WIN_COLOR color_white
+ lfsr FSR2,letter
+ movlw 0xB8
+ movwf POSTINC2
+ call word_processor
+
+ WIN_TOP .155
+ WIN_LEFT .0
+ WIN_FONT FT_SMALL
+ WIN_INVERT .0 ; Init new Wordprocessor
+ WIN_COLOR color_white
+ lfsr FSR2,letter
+ movlw 0xB8
+ movwf POSTINC2
+ call word_processor
+
+ WIN_TOP .185
+ WIN_LEFT .0
+ WIN_FONT FT_SMALL
+ WIN_INVERT .0 ; Init new Wordprocessor
+ WIN_COLOR color_white
+ lfsr FSR2,letter
+ movlw 0xB8
+ movwf POSTINC2
+ call word_processor
+
+ movff menupos,temp1
+ dcfsnz temp1,F
+ movlw d'35'
+ dcfsnz temp1,F
+ movlw d'65'
+ dcfsnz temp1,F
+ movlw d'95'
+ dcfsnz temp1,F
+ movlw d'125'
+ dcfsnz temp1,F
+ movlw d'155'
+ dcfsnz temp1,F
+ movlw d'185'
+
+ movff WREG,win_top
+ WIN_LEFT .0
+ WIN_FONT FT_SMALL
+ WIN_INVERT .0 ; Init new Wordprocessor
+ WIN_COLOR color_white
+ lfsr FSR2,letter
+ movlw 0xB7
+ movwf POSTINC2
+ call word_processor
+ return
+
+PLED_menu_mask:
+ call PLED_topline_box
+ WIN_INVERT .1 ; Init new Wordprocessor
+ DISPLAYTEXT .5 ; Menu:
+ WIN_INVERT .0 ; Init new Wordprocessor
+ DISPLAYTEXT .6 ; Logbook
+ DISPLAYTEXT .7 ; Gas Setup
+ DISPLAYTEXT .9 ; Reset all
+ DISPLAYTEXT .10 ; Setup...
+ DISPLAYTEXT .142 ; More...
+ DISPLAYTEXT .11 ; Exit
+ return
+
+PLED_setup_menu_mask:
+ call PLED_topline_box
+ WIN_INVERT .1 ; Init new Wordprocessor
+ DISPLAYTEXT .98 ; Setup Menu:
+ WIN_INVERT .0 ; Init new Wordprocessor
+ DISPLAYTEXT .99 ; Custom FunctionsI
+ DISPLAYTEXT .153 ; Custom FunctionsII
+ DISPLAYTEXTH .276 ; Salinity:
+ DISPLAYTEXT .100 ; Decotype:
+ DISPLAYTEXT .142 ; More...
+ DISPLAYTEXT .11 ; Exit
+ return
+
+PLED_more_setup_menu_mask:
+ call PLED_topline_box
+ WIN_INVERT .1 ; Init new Wordprocessor
+ DISPLAYTEXTH .258 ; Setup Menu 2:
+ WIN_INVERT .0 ; Init new Wordprocessor
+ DISPLAYTEXTH .257 ; Date format:
+ DISPLAYTEXT .129 ; Debug:
+
+
+ DISPLAYTEXT .11 ; Exit
+ return
+
+PLED_more_menu_mask:
+ call PLED_topline_box
+ WIN_INVERT .1 ; Init new Wordprocessor
+ DISPLAYTEXT .144 ; Menu 2:
+ WIN_INVERT .0 ; Init new Wordprocessor
+ DISPLAYTEXT .8 ; Set Time
+ DISPLAYTEXT .110 ; Const. ppO2 Setup
+ DISPLAYTEXT .113 ; Battery Info
+ DISPLAYTEXT .247 ; Simulator
+
+ DISPLAYTEXT .11 ; Exit
+ return
+
+PLED_reset_menu_mask:
+ call PLED_topline_box
+ WIN_INVERT .1 ; Init new Wordprocessor
+ DISPLAYTEXT .28 ; Reset Menu
+ WIN_INVERT .0 ; Init new Wordprocessor
+ DISPLAYTEXT .21 ; Cancel Reset
+ DISPLAYTEXT .245 ; Reset CF,Gases & Deco
+ DISPLAYTEXTH .284 ; Reset Logbook
+ DISPLAYTEXTH .285 ; Reboot OSTC
+ DISPLAYTEXTH .286 ; Reset Decodata
+ DISPLAYTEXT .11 ; Exit
+ return
+
+PLED_simulator_mask:
+ call PLED_topline_box
+ WIN_INVERT .1 ; Init new Wordprocessor
+ DISPLAYTEXT .248 ; OSTC Simulator
+ WIN_INVERT .0 ; Init new Wordprocessor
+ DISPLAYTEXT .249 ; Start Dive
+ DISPLAYTEXTH .277 ; Bottom Time:
+ DISPLAYTEXTH .278 ; Max. Depth:
+ DISPLAYTEXTH .279 ; Calculate Deco
+ DISPLAYTEXTH .280 ; Show Decoplan
+ DISPLAYTEXT .11 ; Exit
+ return
+
+
+
+
+PLED_temp_surfmode:
+ ostc_debug 'e'
+ movff temperature+0,last_temperature+0
+ movff temperature+1,last_temperature+1
+ WIN_TOP .100
+ WIN_LEFT .0
+ WIN_FONT FT_SMALL
+ WIN_INVERT .0 ; Init new Wordprocessor
+ WIN_COLOR color_white
+ lfsr FSR2,letter
+ movlw '-'
+ btfsc neg_temp ; Show "-"?
+ movwf POSTINC2 ; Yes
+ movff temperature+0,lo
+ movff temperature+1,hi
+ movlw d'3'
+ movwf ignore_digits
+ bsf leftbind ; left orientated output
+ output_16dp d'2'
+ bcf leftbind
+ movlw '°'
+ movwf POSTINC2
+ movlw 'C'
+ movwf POSTINC2
+ movlw ' '
+ movwf POSTINC2
+ call word_processor
+ return
+
+PLED_temp_divemode:
+ btfsc multi_gf_display ; Is the Multi-GF Table displayed?
+ return ; Yes, No update and return!
+
+ ostc_debug 'u' ; Sends debug-information to screen if debugmode active
+
+; temperature
+ movff temperature+0,last_temperature+0
+ movff temperature+1,last_temperature+1
+
+ WIN_TOP .216
+ WIN_LEFT .65
+ WIN_FONT FT_SMALL
+ WIN_INVERT .0 ; Init new Wordprocessor
+ WIN_COLOR color_white
+ lfsr FSR2,letter
+ movlw '-'
+ btfsc neg_temp ; Show "-"?
+ movwf POSTINC2 ; Yes
+ movff temperature+0,lo
+ movff temperature+1,hi
+ movlw d'3'
+ movwf ignore_digits
+ bsf leftbind ; left orientated output
+ output_16dp d'2'
+ bcf leftbind
+ movlw '°'
+ movwf POSTINC2
+ movlw ' '
+ movwf POSTINC2
+ call word_processor
+ return
+
+PLED_show_ppO2: ; Show ppO2
+ ostc_debug 't' ; Sends debug-information to screen if debugmode active
+ WIN_TOP .120
+ WIN_LEFT .0
+ WIN_FONT FT_SMALL
+ WIN_COLOR color_white
+ lfsr FSR2,letter
+ movlw 'p'
+ movwf POSTINC2
+ movlw 'p'
+ movwf POSTINC2
+ movlw 'O'
+ movwf POSTINC2
+ movlw '2'
+ movwf POSTINC2
+ movlw ':'
+ movwf POSTINC2
+ movff xC+0,lo
+ movff xC+1,hi
+ bsf ignore_digit4
+ output_16dp d'1'
+ bcf ignore_digit4
+ movlw ' '
+ movwf POSTINC2
+ call word_processor
+ return
+
+PLED_show_ppO2_clear: ; Clear ppO2
+ movlw d'10'
+ movwf temp1
+ WIN_TOP .120
+ WIN_LEFT .0
+ call PLED_display_clear_common_y1
+ return
+
+PLED_active_gas_clear: ; clears active gas!
+ WIN_TOP .192
+ WIN_LEFT .65
+ movlw d'5'
+ movwf temp1
+ bra PLED_display_clear_common_y1; also returns!
+
+PLED_active_gas_divemode: ; Displays current gas (e.g. 40/20) if a) He>0 or b) O2>Custom9
+ btfsc FLAG_apnoe_mode ; Ignore in Apnoe mode
+ return
+
+ btfsc multi_gf_display ; Is the Multi-GF Table displayed?
+ return ; Yes, No update and return!
+
+ ostc_debug 's' ; Sends debug-information to screen if debugmode active
+; gas
+ WIN_TOP .192
+ WIN_LEFT .65
+ WIN_FONT FT_SMALL
+ WIN_INVERT .0 ; Init new Wordprocessor
+ WIN_COLOR color_white
+
+ movlw d'100' ; 100% in the tank
+ movff char_I_N2_ratio,lo ; minus N2
+ bsf STATUS,C ; set borrow bit
+ subfwb lo,W
+ movff char_I_He_ratio,lo ; minus He
+ bsf STATUS,C ; set borrow bit
+ subfwb lo,F ; =% O2
+ GETCUSTOM8 d'9' ; get oxygen treshold
+ movff char_I_He_ratio,hi ; He ratio
+ cpfsgt lo
+ bra PLED_active_gas_divemode2 ; Check He
+ bra PLED_active_gas_divemode3 ; Skip He check, display gas
+
+PLED_active_gas_divemode2:
+ tstfsz hi ; He = 0 %
+ bra PLED_active_gas_divemode3 ; display gas
+ ; O2 below treshold, He=0 -> Skip display!
+ movlw d'5'
+ movwf temp1
+ bra PLED_display_clear_common_y1 ; also returns!
+
+PLED_active_gas_divemode3:
+ movlw d'21'
+ cpfseq lo ; Air? (O2=21%)
+ bra PLED_active_gas_divemode4 ; No!
+ tstfsz hi ; Air? (He=0%)
+ bra PLED_active_gas_divemode4 ; No!
+
+ ; Yes, display "Air" instead of 21/0
+ lfsr FSR2,letter
+ OUTPUTTEXTH d'264' ;"Air "
+ call word_processor
+ return
+
+PLED_active_gas_divemode4:
+ lfsr FSR2,letter
+ bsf leftbind ; left orientated output
+ output_8 ; O2 ratio is still in "lo"
+ movlw '/'
+ movwf POSTINC2
+ movff char_I_He_ratio,lo ; copy He ratio into lo
+ output_8
+ movlw ' '
+ movwf POSTINC2
+ bcf leftbind
+ call word_processor
+ return
+
+PLED_display_decotype_surface:
+ WIN_LEFT .85
+ WIN_FONT FT_SMALL
+ WIN_INVERT .0 ; Init new Wordprocessor
+ clrf EEADRH
+ read_int_eeprom d'34' ; Read deco data
+ tstfsz EEDATA
+ bra show_decotype_surface2
+
+;ZH-L16
+ WIN_TOP .125
+ WIN_COLOR color_white
+ lfsr FSR2,letter
+ movlw 'O'
+ movwf POSTINC2
+ call word_processor
+ WIN_LEFT .85
+ WIN_FONT FT_SMALL
+ WIN_INVERT .0 ; Init new Wordprocessor
+ WIN_TOP .150
+ WIN_COLOR color_white
+ lfsr FSR2,letter
+ movlw 'C'
+ movwf POSTINC2
+ call word_processor
+ return
+show_decotype_surface2:
+ decf EEDATA,F
+ tstfsz EEDATA
+ bra show_decotype_surface3
+; Gauge
+ return
+
+show_decotype_surface3:
+ decf EEDATA,F
+ tstfsz EEDATA
+ bra show_decotype_surface4
+ ; const. ppO2
+ WIN_TOP .125
+ WIN_COLOR color_white
+ lfsr FSR2,letter
+ movlw 'C'
+ movwf POSTINC2
+ WIN_LEFT .85
+ WIN_FONT FT_SMALL
+ WIN_INVERT .0 ; Init new Wordprocessor
+ call word_processor
+ WIN_TOP .150
+ WIN_COLOR color_white
+ lfsr FSR2,letter
+ movlw 'C'
+ movwf POSTINC2
+ WIN_LEFT .85
+ WIN_FONT FT_SMALL
+ WIN_INVERT .0 ; Init new Wordprocessor
+ call word_processor
+ return
+show_decotype_surface4:
+ decf EEDATA,F
+ tstfsz EEDATA
+ bra show_decotype_surface5
+; Apnoe
+ return
+show_decotype_surface5:
+ decf EEDATA,F
+ tstfsz EEDATA
+ bra show_decotype_surface6
+ ; Multi-GF OC
+ WIN_TOP .125
+ lfsr FSR2,letter
+ movlw 'G'
+ movwf POSTINC2
+ WIN_LEFT .85
+ WIN_FONT FT_SMALL
+ WIN_INVERT .0 ; Init new Wordprocessor
+ WIN_COLOR color_white
+ call word_processor
+ WIN_TOP .150
+ lfsr FSR2,letter
+ movlw 'F'
+ movwf POSTINC2
+ WIN_LEFT .85
+ WIN_FONT FT_SMALL
+ WIN_INVERT .0 ; Init new Wordprocessor
+ WIN_COLOR color_white
+ call word_processor
+ return
+
+show_decotype_surface6:
+ ; Multi-GF CC
+ WIN_TOP .125
+ lfsr FSR2,letter
+ movlw 'G'
+ movwf POSTINC2
+ WIN_LEFT .85
+ WIN_FONT FT_SMALL
+ WIN_INVERT .0 ; Init new Wordprocessor
+ WIN_COLOR color_white
+ call word_processor
+ WIN_TOP .150
+ lfsr FSR2,letter
+ movlw 'F'
+ movwf POSTINC2
+ WIN_LEFT .85
+ WIN_FONT FT_SMALL
+ WIN_INVERT .0 ; Init new Wordprocessor
+ WIN_COLOR color_white
+ call word_processor
+ return
+
+
+PLED_active_gas_surfmode: ; Displays start gas/SP 1
+ ostc_debug 'q' ; Sends debug-information to screen if debugmode active
+
+ btfsc FLAG_apnoe_mode ; In Apnoe mode?
+ return ; Yes, return
+
+ btfsc gauge_mode ; In Gauge mode?
+ return ; Yes, return
+
+ btfss FLAG_const_ppO2_mode ; are we in const. ppO2 mode?
+ bra PLED_active_gas_surfmode2 ; No, display gases
+
+; In CC Mode
+ WIN_TOP .135
+ WIN_LEFT .90
+ WIN_FONT FT_SMALL
+ WIN_INVERT .0 ; Init new Wordprocessor
+ WIN_COLOR color_white
+ lfsr FSR2,letter
+ read_int_eeprom d'36'
+ movff EEDATA,lo ; copy to lo
+ clrf hi
+ output_16dp d'3' ; outputs into Postinc2!
+ movlw 'B'
+ movwf POSTINC2
+ movlw 'a'
+ movwf POSTINC2
+ movlw 'r'
+ movwf POSTINC2
+ bcf leftbind
+ call word_processor
+ bra PLED_active_gas_surfmode_exit
+
+PLED_active_gas_surfmode2:
+ WIN_TOP .130
+ WIN_LEFT .100
+ WIN_FONT FT_MEDIUM
+ WIN_INVERT .0 ; Init new Wordprocessor
+ WIN_COLOR color_white
+
+ read_int_eeprom d'33' ; Read byte (stored in EEDATA)
+ movff EEDATA,active_gas ; Read start gas (1-5)
+
+ decf active_gas,W ; Gas 0-4
+ mullw d'4'
+ movf PRODL,W
+ addlw d'7' ; = address for He ratio
+ movwf EEADR
+ call read_eeprom ; Read He ratio
+ movff EEDATA,char_I_He_ratio ; And copy into hold register
+
+ decf active_gas,W ; Gas 0-4
+ mullw d'4'
+ movf PRODL,W
+ addlw d'6' ; = address for O2 ratio
+ movwf EEADR
+ call read_eeprom ; Read O2 ratio
+ movff EEDATA, char_I_O2_ratio ; O2 ratio
+ movff char_I_He_ratio, wait_temp ; copy into bank1 register
+ bsf STATUS,C ; Borrow bit
+ movlw d'100' ; 100%
+ subfwb wait_temp,W ; minus He
+ bsf STATUS,C ; Borrow bit
+ subfwb EEDATA,F ; minus O2
+ movff EEDATA, char_I_N2_ratio ; = N2!
+
+ movlw d'100' ; 100% in the tank
+ movff char_I_N2_ratio,lo ; minus N2
+ bsf STATUS,C ; set borrow bit
+ subfwb lo,W
+ movff char_I_He_ratio,lo ; minus He
+ bsf STATUS,C ; set borrow bit
+ subfwb lo,F ; =% O2
+
+ movff char_I_He_ratio,hi ; Copy into Bank1 register
+
+ movlw d'21'
+ cpfseq lo ; Air? (O2=21%)
+ bra PLED_active_gas_surfmode4 ; No!
+ tstfsz hi ; Air? (He=0%)
+ bra PLED_active_gas_surfmode4 ; No!
+
+ ; Yes, display "Air" instead of 21/0
+ DISPLAYTEXTH d'265' ;"Air ", y-scale=2
+ bra PLED_active_gas_surfmode_exit
+
+PLED_active_gas_surfmode4:
+ lfsr FSR2,letter
+ bsf leftbind ; left orientated output
+ output_8 ; O2 ratio is still in "lo"
+ movlw '/'
+ movwf POSTINC2
+ movff char_I_He_ratio,lo ; copy He ratio into lo
+ output_8
+ bcf leftbind
+ call word_processor
+ bra PLED_active_gas_surfmode_exit
+
+PLED_active_gas_surfmode_exit:
+ movlw .0
+ movff WREG,box_temp+0 ; Data
+ movlw .122
+ movff WREG,box_temp+1 ; row top (0-239)
+ movlw .175
+ movff WREG,box_temp+2 ; row bottom (0-239)
+ movlw .82
+ movff WREG,box_temp+3 ; column left (0-159)
+ movlw .159
+ movff WREG,box_temp+4 ; column right (0-159)
+ call PLED_frame
+ return
+
+PLED_confirmbox:
+ movlw .0
+ movff WREG,box_temp+0 ; Data
+ movlw .68
+ movff WREG,box_temp+1 ; row top (0-239)
+ movlw .146
+ movff WREG,box_temp+2 ; row bottom (0-239)
+ movlw .34
+ movff WREG,box_temp+3 ; column left (0-159)
+ movlw .101
+ movff WREG,box_temp+4 ; column right (0-159)
+ call PLED_box
+
+ movlw .255
+ movff WREG,box_temp+0 ; Data
+ movlw .70
+ movff WREG,box_temp+1 ; row top (0-239)
+ movlw .144
+ movff WREG,box_temp+2 ; row bottom (0-239)
+ movlw .35
+ movff WREG,box_temp+3 ; column left (0-159)
+ movlw .100
+ movff WREG,box_temp+4 ; column right (0-159)
+ call PLED_frame
+ DISPLAYTEXT .143 ; Confirm:
+ DISPLAYTEXT .145 ; Cancel
+ DISPLAYTEXT .146 ; OK!
+
+ movlw d'1'
+ movwf menupos
+
+PLED_confirmbox2:
+ movlw .0
+ movff WREG,box_temp+0 ; Data
+ movlw .96
+ movff WREG,box_temp+1 ; row top (0-239)
+ movlw .143
+ movff WREG,box_temp+2 ; row bottom (0-239)
+ movlw .39
+ movff WREG,box_temp+3 ; column left (0-159)
+ movlw .51
+ movff WREG,box_temp+4 ; column right (0-159)
+ call PLED_box
+
+ movff menupos,temp1
+ movlw d'96'
+ dcfsnz temp1,F
+ movlw d'96'
+ dcfsnz temp1,F
+ movlw d'120'
+ movff WREG,win_top
+ WIN_LEFT .39
+ WIN_FONT FT_SMALL
+ WIN_INVERT .0 ; Init new Wordprocessor
+ WIN_COLOR color_white
+ lfsr FSR2,letter
+ movlw 0xB7 ; Arrow for menu
+ movwf POSTINC2
+ call word_processor
+
+ bcf sleepmode ; clear some flags
+ bcf menubit2
+ bcf menubit3
+ bcf switch_right
+ bcf switch_left
+ clrf timeout_counter2
+ WAITMS d'100'
+
+PLED_confirmbox_loop:
+ call check_switches_logbook
+
+ btfsc menubit3 ; SET/MENU?
+ bra PLED_confirmbox_move_cursor; Move Cursor
+ btfsc menubit2 ; ENTER?
+ bra PLED_confirmbox_menu_do ; Do task
+
+ btfsc onesecupdate
+ call timeout_surfmode ; timeout
+
+ btfsc onesecupdate
+ call set_dive_modes ; check, if divemode must be entered
+ bcf onesecupdate ; one second update
+
+ btfsc sleepmode ; Timeout?
+ bra PLED_confirmbox_cancel ; back with cancel
+ btfsc divemode
+ bra PLED_confirmbox_cancel ; back with cancel
+
+ bra PLED_confirmbox_loop ; wait for something to do
+
+PLED_confirmbox_cancel:
+ retlw .0
+PLED_confirmbox_ok:
+ retlw .1
+
+PLED_confirmbox_menu_do:
+ dcfsnz menupos,F
+ bra PLED_confirmbox_cancel
+ dcfsnz menupos,F
+ bra PLED_confirmbox_ok
+ bra PLED_confirmbox_cancel
+
+PLED_confirmbox_move_cursor:
+ incf menupos,F
+ movlw d'3' ; number of menu options+1
+ cpfseq menupos ; =limit?
+ bra PLED_confirmbox_move_cursor2 ; No!
+ movlw d'1' ; Yes, reset to position 1!
+ movwf menupos
+PLED_confirmbox_move_cursor2:
+ bra PLED_confirmbox2 ; Return to Profile Menu, also updates cursor
+
+
+PLED_depth:
+ ostc_debug 'r' ; Sends debug-information to screen if debugmode active
+ movff rel_pressure+1,hi
+ movff rel_pressure+0,lo
+ call adjust_depth_with_salinity ; computes salinity setting into lo:hi [mBar]
+
+ movlw .039
+ cpfslt hi
+ bra depth_greater_99_84mtr
+
+ btfsc depth_greater_100m ; Was depth>100m during last call
+ call PLED_clear_depth ; Yes, clear depth area
+ bcf depth_greater_100m ; Do this once only...
+
+ lfsr FSR2,letter
+
+ movlw HIGH d'1000'
+ movwf sub_a+1
+ movlw LOW d'1000'
+ movwf sub_a+0
+ movff hi,sub_b+1
+ movff lo,sub_b+0
+ incf sub_b+0,F
+ movlw d'0'
+ addwfc sub_b+1,F ; Add 1mBar offset
+ call sub16 ; sub_c = sub_a - sub_b
+ btfss neg_flag ; Depth lower then 10m?
+ rcall depth_less_10mtr ; Yes, add extra space
+
+ WIN_TOP .24
+ WIN_LEFT .0
+ WIN_FONT FT_LARGE
+ WIN_INVERT .0 ; Init new Wordprocessor
+ WIN_COLOR color_white
+
+ movlw HIGH d'99'
+ movwf sub_a+1
+ movlw LOW d'99'
+ movwf sub_a+0
+ movff hi,sub_b+1
+ movff lo,sub_b+0
+ call sub16 ; sub_c = sub_a - sub_b
+ btfss neg_flag ; Depth lower then 1m?
+ bra pled_depth2 ; Yes, display manual Zero
+
+ bsf leftbind
+ bsf ignore_digit4
+ output_16 ; Full meters in Big font
+ bcf leftbind
+ bra pled_depth3
+
+pled_depth2:
+ movlw '0'
+ movwf POSTINC2
+pled_depth3:
+ call word_processor
+ bcf ignore_digit4
+
+ WIN_FONT FT_MEDIUM
+ WIN_TOP .50
+ WIN_LEFT .40
+ WIN_COLOR color_white
+
+ movff rel_pressure+1,hi
+ movff rel_pressure+0,lo
+ call adjust_depth_with_salinity ; computes salinity setting into lo:hi [mBar]
+ lfsr FSR2,letter
+ movlw '.'
+ movwf POSTINC2
+
+ movlw HIGH d'9'
+ movwf sub_a+1
+ movlw LOW d'9'
+ movwf sub_a+0
+ movff hi,sub_b+1
+ movff lo,sub_b+0
+ call sub16 ; sub_c = sub_a - sub_b
+ btfss neg_flag ; Depth lower then 0.1m?
+ bra pled_depth4 ; Yes, display manual Zero
+
+ movlw d'4'
+ movwf ignore_digits
+ bsf ignore_digit5
+ output_16dp d'0'
+ bra pled_depth5
+
+pled_depth4:
+ movlw '0'
+ movwf POSTINC2
+
+pled_depth5:
+ call word_processor ; decimeters in medium font
+ bcf ignore_digit5
+ WIN_FONT FT_SMALL
+ return
+
+depth_greater_99_84mtr: ; Display only in full meters
+ btfss depth_greater_100m ; Is depth>100m already?
+ call PLED_clear_depth ; No, clear depth area and set flag
+ ; Depth is already in hi:lo
+ ; Show depth in Full meters
+ ; That means ignore figure 4 and 5
+ lfsr FSR2,letter
+ WIN_TOP .24
+ WIN_LEFT .0
+ WIN_FONT FT_LARGE
+ WIN_INVERT .0 ; Init new Wordprocessor
+ WIN_COLOR color_white
+ bsf ignore_digit4
+ bsf leftbind
+ output_16
+ bcf leftbind
+ call word_processor
+ bcf ignore_digit4
+ WIN_FONT FT_SMALL
+ return
+
+depth_less_10mtr:
+ movlw ' '
+ movwf POSTINC2
+ return
+
+PLED_clear_depth ; No, clear depth area and set flag
+ movlw .0
+ movff WREG,box_temp+0 ; Data
+ movlw .24
+ movff WREG,box_temp+1 ; row top (0-239)
+ movlw .90
+ movff WREG,box_temp+2 ; row bottom (0-239)
+ movlw .0
+ movff WREG,box_temp+3 ; column left (0-159)
+ movlw .90
+ movff WREG,box_temp+4 ; column right (0-159)
+ call PLED_box
+ bsf depth_greater_100m ; Set Flag
+ return
+
+
+PLED_desaturation_time:
+ ostc_debug 'h'
+ WIN_TOP .150
+ WIN_LEFT .0
+ WIN_FONT FT_SMALL
+ WIN_INVERT .0 ; Init new Wordprocessor
+ WIN_COLOR color_white
+ lfsr FSR2,letter
+ OUTPUTTEXT d'14' ; Desat
+ movlw ' '
+ movwf POSTINC2
+ movff int_O_desaturation_time+0,lo ; divide by 60...
+ movff int_O_desaturation_time+1,hi
+ call convert_time ; converts hi:lo in minutes to hours (hi) and minutes (lo)
+ bsf leftbind
+ movf lo,W
+ movff hi,lo
+ movwf hi ; exchange lo and hi...
+ output_8 ; Hours
+ movlw ':'
+ movwf POSTINC2
+ movff hi,lo ; Minutes
+ output_99x
+ bcf leftbind
+ call word_processor
+ return
+
+PLED_nofly_time:
+ ostc_debug 'g'
+ WIN_TOP .125
+ WIN_LEFT .0
+ WIN_FONT FT_SMALL
+ WIN_INVERT .0 ; Init new Wordprocessor
+ WIN_COLOR color_white
+ lfsr FSR2,letter
+ OUTPUTTEXT d'35' ; NoFly
+ movlw ' '
+ movwf POSTINC2
+ movff nofly_time+0,lo ; divide by 60...
+ movff nofly_time+1,hi
+ call convert_time ; converts hi:lo in minutes to hours (hi) and minutes (lo)
+ bsf leftbind
+ movf lo,W
+ movff hi,lo
+ movwf hi ; exchange lo and hi...
+ output_8 ; Hours
+ movlw ':'
+ movwf POSTINC2
+ movff hi,lo ; Minutes
+ decf lo,F
+ btfsc lo,7 ; keep Nofly time
+ clrf lo
+ output_99x
+ bcf leftbind
+ call word_processor
+ return
+
+
+update_surf_press:
+ btfsc premenu ; Do not update when "Menu?" is displayed!
+ return
+
+ ostc_debug 'b' ; Sends debug-information to screen if debugmode active
+ WIN_TOP .25
+ WIN_LEFT .0
+ WIN_FONT FT_SMALL
+ WIN_INVERT .0 ; Init new Wordprocessor
+ WIN_COLOR color_white
+ lfsr FSR2,letter
+ movff amb_pressure+0,lo
+ movff amb_pressure+1,hi
+ bsf leftbind
+ output_16
+ bcf leftbind
+ movlw 'm'
+ movwf POSTINC2
+ movlw 'b'
+ movwf POSTINC2
+ movlw 'a'
+ movwf POSTINC2
+ movlw 'r'
+ movwf POSTINC2
+ movlw ' '
+ movwf POSTINC2
+ call word_processor
+ return
+
+update_batt_voltage_divemode:
+
+update_batt_voltage:
+ ostc_debug 'f'
+
+ GETCUSTOM8 d'31' ; =1 if battery voltage should be visible
+ movwf lo
+ movlw d'1'
+ cpfseq lo ; =1?
+ bra update_batt_voltage2 ; No, show symbol
+
+ WIN_TOP .175
+ WIN_LEFT .0
+ WIN_FONT FT_SMALL
+ WIN_INVERT .0 ; Init new Wordprocessor
+ WIN_COLOR color_white
+ lfsr FSR2,letter
+ movff batt_voltage+0,lo
+ movff batt_voltage+1,hi
+ movlw d'1'
+ movwf ignore_digits
+ bsf ignore_digit5 ; do not display mV
+ bsf leftbind
+ output_16dp d'2' ; e.g. 3.45V
+ bcf leftbind
+ movlw 'V'
+ movwf POSTINC2
+ movlw ' '
+ movwf POSTINC2
+ call word_processor
+ return
+
+update_batt_voltage2:
+ movlw .255
+ movff WREG,box_temp+0 ; Data
+ movlw .174
+ movff WREG,box_temp+1 ; row top (0-239)
+ movlw .194
+ movff WREG,box_temp+2 ; row bottom (0-239)
+ movlw .0
+ movff WREG,box_temp+3 ; column left (0-159)
+ movlw .31
+ movff WREG,box_temp+4 ; column right (0-159)
+ call PLED_frame
+
+; 3600-Vbatt
+ movlw LOW d'3600'
+ movwf sub_a+0
+ movlw HIGH d'3600'
+ movwf sub_a+1
+ movff batt_voltage+0,sub_b+0
+ movff batt_voltage+1,sub_b+1
+ call sub16 ; sub_c = sub_a - sub_b
+; Battery full (>3600mV?
+ btfsc neg_flag
+ bra update_batt_voltage2_full
+
+; Vbatt-3000
+ movlw LOW d'3000'
+ movwf sub_b+0
+ movlw HIGH d'3000'
+ movwf sub_b+1
+ movff batt_voltage+0,sub_a+0
+ movff batt_voltage+1,sub_a+1
+ call sub16 ; sub_c = sub_a - sub_b
+; Battery lower then 3000mV?
+ btfsc neg_flag
+ bra update_batt_voltage2_empty
+
+; Battery is between 3000 and 3600mV
+; sub_c:2 is between 0 and 600
+ movff sub_c+0,xA+0
+ movff sub_c+1,xA+1
+ movlw d'20'
+ movwf xB+0
+ clrf xB+1
+ call div16x16 ;xA/xB=xC with xA as remainder
+; xC is between 0 and 30
+ movff xC+0,wait_temp ;save value
+
+ movlw d'2'
+ cpfsgt wait_temp
+ movwf wait_temp ; Minimum = 2
+
+
+update_batt_voltage2a:
+ movlw .255
+ movff WREG,box_temp+0 ; Data
+ movlw .181
+ movff WREG,box_temp+1 ; row top (0-239)
+ movlw .187
+ movff WREG,box_temp+2 ; row bottom (0-239)
+ movlw .31
+ movff WREG,box_temp+3 ; column left (0-159)
+ movlw .33
+ movff WREG,box_temp+4 ; column right (0-159)
+ call PLED_frame ; Empty cap
+
+update_batt_voltage3:
+ GETCUSTOM8 d'34' ; Color battery
+ movff WREG,box_temp+0 ; Color Data
+ movlw .175
+ movff WREG,box_temp+1 ; row top (0-239)
+ movlw .193
+ movff WREG,box_temp+2 ; row bottom (0-239)
+ movlw .1
+ movff WREG,box_temp+3 ; column left (0-159)
+ movff wait_temp,box_temp+4 ; column right (0-159)
+ call PLED_box
+
+ WIN_COLOR color_white ; Reset Color
+ return
+
+update_batt_voltage2_empty:
+ movlw d'1'
+ movwf wait_temp
+ bra update_batt_voltage2a
+
+update_batt_voltage2_full:
+ movlw d'30'
+ movwf wait_temp
+
+ movlw .255
+ movff WREG,box_temp+0 ; Data
+ movlw .181
+ movff WREG,box_temp+1 ; row top (0-239)
+ movlw .187
+ movff WREG,box_temp+2 ; row bottom (0-239)
+ movlw .31
+ movff WREG,box_temp+3 ; column left (0-159)
+ movlw .33
+ movff WREG,box_temp+4 ; column right (0-159)
+ call PLED_box ; Full Cap
+ bra update_batt_voltage3
+
+PLED_convert_date: ; converts into "DD/MM/YY" or "MM/DD/YY" or "YY/MM/DD" in postinc2
+ read_int_eeprom d'91' ; Read date format (0=MMDDYY, 1=DDMMYY, 2=YYMMDD)
+ tstfsz EEDATA
+ bra PLED_convert_date1
+
+; Use MMDDYY
+ movff convert_value_temp+0,lo ;month
+ bsf leftbind
+ output_99x
+ bcf leftbind
+ movlw '/'
+ movwf POSTINC2
+ movff convert_value_temp+1,lo ;day
+ bra PLED_convert_date1_common ;year
+
+PLED_convert_date1:
+ read_int_eeprom d'91' ; Read date format (0=MMDDYY, 1=DDMMYY, 2=YYMMDD)
+ decfsz EEDATA,F
+ bra PLED_convert_date2
+
+; Use DDMMYY
+ movff convert_value_temp+1,lo ;day
+ bsf leftbind
+ output_99x
+ bcf leftbind
+ movlw '/'
+ movwf POSTINC2
+ movff convert_value_temp+0,lo ;month
+
+PLED_convert_date1_common:
+ bsf leftbind
+ output_99x
+ bcf leftbind
+ movlw '/'
+ movwf POSTINC2
+ movff convert_value_temp+2,lo ;year
+ bsf leftbind
+ output_99x
+ return
+
+PLED_convert_date2:
+; Use YYMMDD
+ movff convert_value_temp+2,lo ;year
+ bsf leftbind
+ output_99x
+ bcf leftbind
+ movlw '/'
+ movwf POSTINC2
+ movff convert_value_temp+0,lo ;month
+ bsf leftbind
+ output_99x
+ bcf leftbind
+ movlw '/'
+ movwf POSTINC2
+ movff convert_value_temp+1,lo ;day
+ bsf leftbind
+ output_99x
+ return
+
+PLED_convert_date_short: ; converts into "DD/MM" or "MM/DD" or "MM/DD" in postinc2
+ read_int_eeprom d'91' ; Read date format (0=MMDDYY, 1=DDMMYY, 2=YYMMDD)
+ tstfsz EEDATA
+ bra PLED_convert_date_short1
+
+; Use MMDDYY
+PLED_convert_date_short_common:
+ movff convert_value_temp+0,lo ;month
+ bsf leftbind
+ output_99x
+ bcf leftbind
+ movlw '/'
+ movwf POSTINC2
+ movff convert_value_temp+1,lo ;day
+ bsf leftbind
+ output_99x
+ bcf leftbind
+ return
+
+PLED_convert_date_short1:
+ read_int_eeprom d'91' ; Read date format (0=MMDDYY, 1=DDMMYY, 2=YYMMDD)
+ decfsz EEDATA,F
+ bra PLED_convert_date_short_common ; Use YYMMDD
+
+; Use DDMMYY
+ movff convert_value_temp+1,lo ;day
+ bsf leftbind
+ output_99x
+ bcf leftbind
+ movlw '/'
+ movwf POSTINC2
+ movff convert_value_temp+0,lo ;month
+ bsf leftbind
+ output_99x
+ bcf leftbind
+ return
+
+update_date:
+ ostc_debug 'd'
+ WIN_TOP .75
+ WIN_LEFT .0
+ WIN_FONT FT_SMALL
+ WIN_INVERT .0 ; Init new Wordprocessor
+ WIN_COLOR color_white
+ lfsr FSR2,letter
+
+ movff month,convert_value_temp+0
+ movff day,convert_value_temp+1
+ movff year,convert_value_temp+2
+ call PLED_convert_date ; converts into "DD/MM/YY" or "MM/DD/YY" or "YY/MM/DD" in postinc2
+ call word_processor
+ return
+
+PLED_menu_clear:
+ movlw .0
+ movff WREG,box_temp+0 ; Data
+ movlw .0
+ movff WREG,box_temp+1 ; row top (0-239)
+ movlw .26
+ movff WREG,box_temp+2 ; row bottom (0-239)
+ movlw .65
+ movff WREG,box_temp+3 ; column left (0-159)
+ movlw .100
+ movff WREG,box_temp+4 ; column right (0-159)
+ call PLED_box
+ return
+
+PLED_max_pressure:
+ btfsc multi_gf_display ; Is the Multi-GF Table displayed?
+ return ; Yes, No update and return!
+
+ ostc_debug 'p' ; Sends debug-information to screen if debugmode active
+
+ WIN_TOP .184
+ WIN_LEFT .0
+ WIN_FONT FT_MEDIUM
+ WIN_INVERT .0 ; Init new Wordprocessor
+ WIN_COLOR color_white
+ lfsr FSR2,letter
+ movff max_pressure+0,lo
+ movff max_pressure+1,hi
+ call adjust_depth_with_salinity ; computes salinity setting into lo:hi [mBar]
+ bsf leftbind
+ bsf ignore_digit5 ; do not display 1cm depth
+ output_16dp d'3'
+ bcf leftbind
+ bcf show_last3
+ call word_processor
+ WIN_FONT FT_SMALL
+ return
+
+PLED_divemins:
+ btfsc menubit ; Divemode menu active?
+ return ; Yes, do not update divetime
+
+ ostc_debug 'A' ; Sends debug-information to screen if debugmode active
+
+ btfsc gauge_mode ; different display in gauge mode
+ bra PLED_divemins_gauge
+
+ btfsc FLAG_apnoe_mode ; different display in apnoe mode
+ bra PLED_divemins_apnoe
+
+ GETCUSTOM8 d'38' ; Show seconds (=1?)
+ movwf lo
+ movlw d'1'
+ cpfseq lo ; =1?
+ bra PLED_divemins2 ; No, minutes only
+ bra PLED_divemins_gauge ; Yes, use Gauge routine
+
+PLED_divemins2:
+ movff divemins+0,lo
+ movff divemins+1,hi
+ bcf leftbind
+ lfsr FSR2,letter
+ output_16_3 ; displays only last three figures from a 16Bit value (0-999)
+ WIN_TOP .20
+ WIN_LEFT .120
+ WIN_FONT FT_MEDIUM
+ WIN_COLOR color_white
+ call word_processor
+ WIN_FONT FT_SMALL
+ return
+
+PLED_display_apnoe_surface:
+ btfsc menubit ; Divemode menu active?
+ return ; Yes, do not display surface mode timeout
+
+ WIN_COLOR color_red
+ DISPLAYTEXT d'140' ; "SURFACE"
+ WIN_COLOR color_white
+
+ WIN_TOP .85
+ WIN_LEFT .90
+ WIN_FONT FT_MEDIUM
+ WIN_COLOR color_white
+
+ movff apnoe_surface_mins,lo
+ bcf leftbind
+ lfsr FSR2,letter
+ output_8
+ movlw ':'
+ movwf POSTINC2
+ movff apnoe_surface_secs,lo
+ output_99x
+ call word_processor
+ WIN_FONT FT_SMALL
+ return
+
+PLED_apnoe_clear_surface:
+ ; Clear Surface timer....
+ movlw .0
+ movff WREG,box_temp+0 ; Data
+ movlw .60
+ movff WREG,box_temp+1 ; row top (0-239)
+ movlw .119
+ movff WREG,box_temp+2 ; row bottom (0-239)
+ movlw .90
+ movff WREG,box_temp+3 ; column left (0-159)
+ movlw .159
+ movff WREG,box_temp+4 ; column right (0-159)
+ call PLED_box
+ return
+
+
+PLED_display_apnoe_descent:
+ WIN_COLOR color_red
+ DISPLAYTEXT d'139' ; "Descent"
+ WIN_COLOR color_white
+
+ WIN_TOP .145
+ WIN_LEFT .90
+ WIN_FONT FT_MEDIUM
+ WIN_COLOR color_white
+
+ movff apnoe_mins,lo
+ lfsr FSR2,letter
+ output_8
+ movlw ':'
+ movwf POSTINC2
+ movff apnoe_secs,lo
+ output_99x
+ call word_processor
+ WIN_FONT FT_SMALL
+ return
+
+PLED_divemins_apnoe:
+
+PLED_divemins_gauge:
+ movff divemins+0,lo
+ movff divemins+1,hi
+ bcf leftbind
+ bsf show_last3
+ lfsr FSR2,letter
+ output_16_3 ;Displays only 0...999
+ movlw ':'
+ movwf POSTINC2
+ movff divesecs,lo
+ output_99x
+ WIN_TOP .20
+ WIN_LEFT .90
+ WIN_FONT FT_MEDIUM
+ WIN_COLOR color_white
+ call word_processor
+ bcf show_last3
+ WIN_FONT FT_SMALL
+ return
+
+PLED_stopwatch_remove:
+ movlw .0
+ movff WREG,box_temp+0 ; Data
+ movlw .54
+ movff WREG,box_temp+1 ; row top (0-239)
+ movlw .102
+ movff WREG,box_temp+2 ; row bottom (0-239)
+ movlw .062
+ movff WREG,box_temp+3 ; column left (0-159)
+ movlw .159
+ movff WREG,box_temp+4 ; column right (0-159)
+ call PLED_box
+ return
+
+
+PLED_stopwatch_show:
+ btfsc menubit ; Divemode menu active?
+ return ; Yes, No update and return!
+
+ ostc_debug 'V' ; Sends debug-information to screen if debugmode active
+ ; Stopwatch
+
+ WIN_COLOR color_red
+ DISPLAYTEXTH d'283' ; Counter
+ WIN_COLOR color_white
+
+ WIN_TOP .80
+ WIN_LEFT .110
+ WIN_FONT FT_SMALL
+ WIN_COLOR color_white
+
+
+
+ lfsr FSR2,letter
+ movff average_divesecs+0,lo ; Stopwatch
+ movff average_divesecs+1,hi ; Stopwatch
+ movlw d'2'
+ subwf lo,F
+ movlw d'0'
+ subwfb hi,F ; Subtract 2 seconds
+
+ call convert_time ; converts hi:lo in seconds to mins (hi) and secs (lo)
+
+ movff lo,wait_temp
+ movff hi,lo
+ clrf hi
+
+ movlw d'0'
+ bcf leftbind
+ bsf show_last3
+ output_16_3 ;Displays only 0...999
+ movlw ':'
+ movwf POSTINC2
+ movff wait_temp,lo
+ output_99x
+ bcf leftbind
+ call word_processor
+
+ ostc_debug 'U' ; Sends debug-information to screen if debugmode active
+
+ WIN_TOP .80
+ WIN_LEFT .62
+ WIN_FONT FT_SMALL
+ WIN_COLOR color_white
+
+ lfsr FSR2,letter
+ movff avr_rel_pressure+0,lo
+ movff avr_rel_pressure+1,hi
+ call adjust_depth_with_salinity ; computes salinity setting into lo:hi [mBar]
+ bsf leftbind
+ bsf ignore_digit5 ; do not display 1cm depth
+ output_16dp d'3'
+ bcf leftbind
+ movlw 'm'
+ movwf POSTINC2
+ movlw ' '
+ movwf POSTINC2
+ call word_processor
+ return
+
+
+PLED_serial: ; Writes OSTC #Serial and Firmware version in surfacemode
+ ostc_debug 'a' ; Sends debug-information to screen if debugmode active
+ WIN_TOP .0
+ WIN_LEFT .0
+ WIN_FONT FT_SMALL
+ WIN_INVERT .0 ; Init new Wordprocessor
+ WIN_COLOR color_white
+
+ lfsr FSR2,letter
+ OUTPUTTEXTH d'262' ; "OSTC "
+ clrf EEADRH
+ clrf EEADR ; Get Serial number LOW
+ call read_eeprom ; read byte
+ movff EEDATA,lo
+ incf EEADR,F ; Get Serial number HIGH
+ call read_eeprom ; read byte
+ movff EEDATA,hi
+
+ bsf leftbind
+ output_16
+ movlw ' '
+ movwf POSTINC2
+ movlw 'V'
+ movwf POSTINC2
+ movlw softwareversion_x
+ movwf lo
+ bsf leftbind
+ output_8
+ movlw '.'
+ movwf POSTINC2
+ movlw softwareversion_y
+ movwf lo
+ bsf leftbind
+ output_99x
+ bcf leftbind
+ call word_processor
+ return
+
+PLED_divemode_menu_mask_first: ; Write Divemode menu1 mask
+ ostc_debug 'o' ; Sends debug-information to screen if debugmode active
+ call PLED_menu_clear ; clear "Menu?"
+ DISPLAYTEXT .31 ;"Show Deco"
+
+ btfsc FLAG_const_ppO2_mode ; are we in ppO2 mode?
+ bra PLED_divemode_menu_mask_first2
+; in OC Mode
+ DISPLAYTEXT .32 ;"Gaslist"
+ DISPLAYTEXT .122 ; "Set Gas"
+ bra PLED_divemode_menu_mask_first3
+
+PLED_divemode_menu_mask_first2:
+; in CC Mode
+ DISPLAYTEXT .238 ; "SetPoint"
+ DISPLAYTEXT .137 ; "Bailout"
+
+PLED_divemode_menu_mask_first3:
+; In all modes
+ DISPLAYTEXT .33 ;"More"
+ DISPLAYTEXT .34 ;"Exit"
+ return
+
+PLED_divemode_menu_mask_second: ; Write Divemode menu1 mask
+ ostc_debug 'o' ; Sends debug-information to screen if debugmode active
+ DISPLAYTEXT .240 ;"Graphs"
+ DISPLAYTEXT .241 ;"Display"
+ DISPLAYTEXTH .281 ;"L. Tissue"
+ DISPLAYTEXT .147 ;"Stopwat."
+ DISPLAYTEXT .244 ;"Exit"
+ return
+
+PLED_divemode_set_xgas: ; Displayes the "Set Gas" menu
+ WIN_LEFT .100
+ WIN_TOP .0
+ WIN_FONT FT_SMALL
+ WIN_COLOR color_white
+ lfsr FSR2,letter
+ movlw 'S'
+ movwf POSTINC2
+ movlw 'e'
+ movwf POSTINC2
+ movlw 'l'
+ movwf POSTINC2
+ read_int_eeprom d'24' ; Get Gas6 %O2
+ movff EEDATA,lo
+ bcf leftbind
+ output_99 ; outputs into Postinc2!
+ movlw '/'
+ movwf POSTINC2
+ read_int_eeprom d'25' ; Get Gas6 %He
+ movff EEDATA,lo
+ output_99 ; outputs into Postinc2!
+ call word_processor
+ DISPLAYTEXT .123 ; O2 +
+ DISPLAYTEXT .124 ; O2 -
+ DISPLAYTEXT .125 ; He +
+ DISPLAYTEXT .126 ; He -
+ return
+
+PLED_divemode_simulator_mask:
+ DISPLAYTEXT .254 ; EXIT
+ DISPLAYTEXT .250 ; + 1m
+ DISPLAYTEXT .251 ; - 1m
+ DISPLAYTEXT .252 ; +10m
+ DISPLAYTEXT .253 ; -10m
+ return
+
+PLED_decoplan_bargraph:
+ movlw .255
+ movff WREG,box_temp+0 ; Data
+ movff win_top,box_temp+1 ; row top (0-239)
+ movff win_top,box_temp+2 ;
+ movlw d'20'
+ addwf box_temp+2,F ; row bottom (0-239)
+ movlw .122
+ movff WREG,box_temp+3 ; column left (0-159)
+ addwf lo,F ; Add time offset
+ decf lo,F ; minus one
+ movlw d'138' ; Limit length (16min)
+ cpfslt lo
+ movwf lo
+ movff lo,box_temp+4 ; column right (0-159)
+ call PLED_box
+
+ movlw .0
+ movff WREG,box_temp+0 ; Data
+ movff win_top,box_temp+1 ; row top (0-239)
+ movff win_top,box_temp+2 ;
+ movlw d'20'
+ addwf box_temp+2,F ; row bottom (0-239)
+ movff lo,box_temp+3 ;
+ incf box_temp+3,F ; column left (0-159)
+ movlw .139
+ movff WREG,box_temp+4 ; column right (0-159)
+ call PLED_box
+ return
+
+PLED_decoplan_delete: ; Delete unused rows
+ movlw .0
+ movff WREG,box_temp+0 ; data 00, x0, 0y, xy clear, links, rechts, beide
+
+ movff hi,box_temp+1 ; row top (0-63)
+ movlw .125
+ movff WREG,box_temp+2 ; row bottom (0-63)
+ movlw .100
+ movff WREG,box_temp+3 ; column left (0-159)
+ movlw .159
+ movff WREG,box_temp+4 ; column right (0-159)
+ call PLED_box
+ return
+
+PLED_decoplan: ; display the Decoplan
+ ostc_debug 'n' ; Sends debug-information to screen if debugmode active
+
+ movff char_O_array_decodepth+0,lo ; Get Depth
+ tstfsz lo
+ bra PLED_decoplan1
+ ; No Deco, show "no Deco"
+ call PLED_clear_divemode_menu ; Clear Deco area
+ DISPLAYTEXT d'239' ;"No Deco"
+ return
+
+PLED_decoplan1:
+ bsf leftbind
+ WIN_LEFT .100
+ movlw .000
+ movff WREG,win_top
+ movwf hi ; copy for PLED_decoplan_bargraph
+ call PLED_SetRow ; Set Row
+ lfsr FSR2,letter
+ movff char_O_array_decodepth+0,lo ; Get Depth
+ movf lo,w
+ btfsc STATUS,Z ; =0
+ goto PLED_decoplan_delete ; Yes, quit display
+ output_8 ; outputs into Postinc2!
+ movlw 'm'
+ movwf POSTINC2
+ call word_processor
+ WIN_LEFT .140
+ movlw .000
+ movff WREG,win_top
+ lfsr FSR2,letter
+ movff char_O_array_decotime+0,lo ; Get length for this stop
+ output_99x ; outputs into Postinc2!
+ movlw d'39' ;"'"
+ movwf POSTINC2
+ call word_processor
+ call PLED_decoplan_bargraph ; draws a box representing the decotime (stored in lo...) for this depth
+
+ WIN_LEFT .100
+ movlw .025
+ movff WREG,win_top
+ movwf hi ; copy for PLED_decoplan_bargraph
+ call PLED_SetRow ; Set Row
+ lfsr FSR2,letter
+ movff char_O_array_decodepth+1,lo ; Get Depth
+ movf lo,w
+ btfsc STATUS,Z ; =0
+ goto PLED_decoplan_delete ; Yes, quit display
+ output_8 ; outputs into Postinc2!
+ movlw 'm'
+ movwf POSTINC2
+ call word_processor
+ WIN_LEFT .140
+ movlw .025
+ movff WREG,win_top
+ lfsr FSR2,letter
+ movff char_O_array_decotime+1,lo ; Get length for this stop
+ output_99x ; outputs into Postinc2!
+ movlw d'39' ;"'"
+ movwf POSTINC2
+ call word_processor
+ call PLED_decoplan_bargraph ; draws a box representing the decotime (stored in lo...) for this depth
+
+ WIN_LEFT .100
+ movlw .050
+ movff WREG,win_top
+ movwf hi ; copy for PLED_decoplan_bargraph
+ call PLED_SetRow ; Set Row
+ lfsr FSR2,letter
+ movff char_O_array_decodepth+2,lo ; Get Depth
+ movf lo,w
+ btfsc STATUS,Z ; =0
+ goto PLED_decoplan_delete ; Yes, quit display
+ output_8 ; outputs into Postinc2!
+ movlw 'm'
+ movwf POSTINC2
+ call word_processor
+ WIN_LEFT .140
+ movlw .050
+ movff WREG,win_top
+ lfsr FSR2,letter
+ movff char_O_array_decotime+2,lo ; Get length for this stop
+ output_99x ; outputs into Postinc2!
+ movlw d'39' ;"'"
+ movwf POSTINC2
+ call word_processor
+ call PLED_decoplan_bargraph ; draws a box representing the decotime (stored in lo...) for this depth
+
+ WIN_LEFT .100
+ movlw .075
+ movff WREG,win_top
+ movwf hi ; copy for PLED_decoplan_bargraph
+ call PLED_SetRow ; Set Row
+ lfsr FSR2,letter
+ movff char_O_array_decodepth+3,lo ; Get Depth
+ movf lo,w
+ btfsc STATUS,Z ; =0
+ goto PLED_decoplan_delete ; Yes, quit display
+ output_8 ; outputs into Postinc2!
+ movlw 'm'
+ movwf POSTINC2
+ call word_processor
+ WIN_LEFT .140
+ movlw .075
+ movff WREG,win_top
+ lfsr FSR2,letter
+ movff char_O_array_decotime+3,lo ; Get length for this stop
+ output_99x ; outputs into Postinc2!
+ movlw d'39' ;"'"
+ movwf POSTINC2
+ call word_processor
+ call PLED_decoplan_bargraph ; draws a box representing the decotime (stored in lo...) for this depth
+
+ WIN_LEFT .100
+ movlw .100
+ movff WREG,win_top
+ movwf hi ; copy for PLED_decoplan_bargraph
+ call PLED_SetRow ; Set Row
+ lfsr FSR2,letter
+ movff char_O_array_decodepth+4,lo ; Get Depth
+ movf lo,w
+ btfsc STATUS,Z ; =0
+ goto PLED_decoplan_delete ; Yes, quit display
+ output_8 ; outputs into Postinc2!
+ movlw 'm'
+ movwf POSTINC2
+ call word_processor
+ WIN_LEFT .140
+ movlw .100
+ movff WREG,win_top
+ lfsr FSR2,letter
+ movff char_O_array_decotime+4,lo ; Get length for this stop
+ output_99x ; outputs into Postinc2!
+ movlw d'39' ;"'"
+ movwf POSTINC2
+ call word_processor
+ call PLED_decoplan_bargraph ; draws a box representing the decotime (stored in lo...) for this depth
+ return
+
+PLED_gas_list:
+ ostc_debug 'm' ; Sends debug-information to screen if debugmode active
+
+ WIN_LEFT .100
+ WIN_FONT FT_SMALL
+ bsf leftbind
+
+ movlw d'2'
+ movwf wait_temp ; here: stores eeprom address for gas list
+ movlw d'231'
+ movwf waitms_temp ; here: stores row for gas list
+ clrf hi ; here: Gas counter
+
+PLED_gas_list_loop:
+ incf hi,F ; Increase Gas
+ movlw d'4'
+ addwf wait_temp,F ; Increase eeprom address for gas list
+ movlw d'25'
+ addwf waitms_temp,F ; Increase row
+ WIN_LEFT .100
+ movff waitms_temp,win_top ; Set Row
+
+ lfsr FSR2,letter
+ movlw 'G'
+ movwf POSTINC2
+ movff hi,lo ; copy gas number
+ output_8 ; display gas number
+ movlw ':'
+ movwf POSTINC2
+ movff wait_temp, EEADR; Gas #hi: %O2 - Set address in internal EEPROM
+ call read_eeprom ; get byte (stored in EEDATA)
+ movff EEDATA,lo ; copy to lo
+ output_8 ; outputs into Postinc2!
+ movlw '/'
+ movwf POSTINC2
+ incf EEADR,F ; Gas #hi: %He - Set address in internal EEPROM
+ call read_eeprom ; get byte (stored in EEDATA)
+ movff EEDATA,lo ; copy to lo
+ output_8 ; outputs into Postinc2!
+
+
+ read_int_eeprom d'27' ; read flag register
+ movff hi,lo ; copy gas number
+PLED_gas_list_loop1:
+ rrcf EEDATA ; roll flags into carry
+ decfsz lo,F ; max. 5 times...
+ bra PLED_gas_list_loop1
+
+ movlw .015
+ btfss STATUS,C ; test carry
+ movlw .010
+ movwf grayvalue ; grey out inactive gases!
+
+ call word_processor
+ movlw .015
+ movwf grayvalue ; reset grey value for compatibility
+
+ movlw d'5' ; list all five gases
+ cpfseq hi ; All gases shown?
+ bra PLED_gas_list_loop ; No
+
+ return ; No, return (OC mode)
+
+PLED_splist_start:
+ WIN_LEFT .100
+ WIN_FONT FT_SMALL
+ bsf leftbind
+
+ ; list three SP in Gaslist
+ movlw d'35' ; 36 = current SP position in EEPROM
+ movwf wait_temp ; here: stores eeprom address for gas list
+ movlw d'231'
+ movwf waitms_temp ; here: stores row for gas list
+ clrf temp5 ; here: SP counter
+
+PLED_splist_loop:
+ incf wait_temp,F ; EEPROM address
+ incf temp5,F ; Increase SP
+
+ movlw d'25'
+ addwf waitms_temp,F ; Increase row
+ movff waitms_temp,win_top ; Set Row
+ WIN_LEFT .100
+
+ lfsr FSR2,letter
+ movlw 'S'
+ movwf POSTINC2
+ movlw 'P'
+ movwf POSTINC2
+ movff temp5,lo ; copy gas number
+ output_8 ; display gas number
+ movlw ':'
+ movwf POSTINC2
+ movff wait_temp, EEADR; SP #hi position
+ call read_eeprom ; get byte (stored in EEDATA)
+ movff EEDATA,lo ; copy to lo
+ clrf hi
+ output_16dp d'3' ; outputs into Postinc2!
+ call word_processor
+
+ movlw d'3' ; list all three SP
+ cpfseq temp5 ; All gases shown?
+ bra PLED_splist_loop ; No
+
+ bcf leftbind
+ return ; no, return
+
+PLED_clear_divemode_menu:
+ movlw .0
+ movff WREG,box_temp+0 ; Data
+ movlw .0
+ movff WREG,box_temp+1 ; row top (0-239)
+ movlw .125
+ movff WREG,box_temp+2 ; row bottom (0-239)
+ movlw .082
+ movff WREG,box_temp+3 ; column left (0-159)
+ movlw .159
+ movff WREG,box_temp+4 ; column right (0-159)
+ call PLED_box
+ return
+
+PLED_divemenu_cursor:
+ ostc_debug 'l' ; Sends debug-information to screen if debugmode active
+ WIN_TOP .0
+ WIN_LEFT .85
+ WIN_FONT FT_SMALL
+ WIN_INVERT .0 ; Init new Wordprocessor
+ WIN_COLOR color_white
+ lfsr FSR2,letter
+ movlw 0xB8
+ movwf POSTINC2
+ call word_processor
+ WIN_TOP .25
+ WIN_LEFT .85
+ WIN_FONT FT_SMALL
+ WIN_INVERT .0 ; Init new Wordprocessor
+ WIN_COLOR color_white
+ lfsr FSR2,letter
+ movlw 0xB8
+ movwf POSTINC2
+ call word_processor
+ WIN_TOP .50
+ WIN_LEFT .85
+ WIN_FONT FT_SMALL
+ WIN_INVERT .0 ; Init new Wordprocessor
+ WIN_COLOR color_white
+ lfsr FSR2,letter
+ movlw 0xB8
+ movwf POSTINC2
+ call word_processor
+ WIN_TOP .75
+ WIN_LEFT .85
+ WIN_FONT FT_SMALL
+ WIN_INVERT .0 ; Init new Wordprocessor
+ WIN_COLOR color_white
+ lfsr FSR2,letter
+ movlw 0xB8
+ movwf POSTINC2
+ call word_processor
+ WIN_TOP .100
+ WIN_LEFT .85
+ WIN_FONT FT_SMALL
+ WIN_INVERT .0 ; Init new Wordprocessor
+ WIN_COLOR color_white
+ lfsr FSR2,letter
+ movlw 0xB8
+ movwf POSTINC2
+ call word_processor
+
+ movff menupos,temp1
+ movlw d'0'
+ dcfsnz temp1,F
+ movlw d'0'
+ dcfsnz temp1,F
+ movlw d'25'
+ dcfsnz temp1,F
+ movlw d'50'
+ dcfsnz temp1,F
+ movlw d'75'
+ dcfsnz temp1,F
+ movlw d'100'
+ movff WREG,win_top
+ WIN_LEFT .85
+ WIN_FONT FT_SMALL
+ WIN_INVERT .0 ; Init new Wordprocessor
+ WIN_COLOR color_white
+ lfsr FSR2,letter
+ movlw 0xB7 ; Arrow for menu
+ movwf POSTINC2
+ call word_processor
+ return
+
+PLED_profileview_menu:
+ DISPLAYTEXT .127 ;"Exit"
+ DISPLAYTEXT .128 ;"Delete"
+ DISPLAYTEXT .132 ;"Format"
+ return
+
+custom_warn_surfmode:
+ movlw .0
+ movff WREG,box_temp+0 ; Data
+ movlw .56
+ movff WREG,box_temp+1 ; row top (0-239)
+ movlw .88
+ movff WREG,box_temp+2 ; row bottom (0-239)
+ movlw .69
+ movff WREG,box_temp+3 ; column left (0-159)
+ movlw .115
+ movff WREG,box_temp+4 ; column right (0-159)
+ call PLED_box
+
+ movlw .255
+ movff WREG,box_temp+0 ; Data
+ movlw .58
+ movff WREG,box_temp+1 ; row top (0-239)
+ movlw .86
+ movff WREG,box_temp+2 ; row bottom (0-239)
+ movlw .70
+ movff WREG,box_temp+3 ; column left (0-159)
+ movlw .114
+ movff WREG,box_temp+4 ; column right (0-159)
+ call PLED_frame
+ ; warning text
+
+ WIN_TOP .60
+ WIN_LEFT .71
+ WIN_FONT FT_SMALL
+ WIN_INVERT .1 ; Init new Wordprocessor
+ WIN_COLOR color_red
+ lfsr FSR2,letter
+ movlw 'C'
+ movwf POSTINC2
+ movlw 'F'
+ movwf POSTINC2
+ movff temp1,lo
+ output_8
+ movlw '!'
+ movwf POSTINC2
+ call word_processor
+
+ WIN_INVERT .0 ; Init new Wordprocessor
+ WIN_COLOR color_white
+ return
+
+PLED_saturation_graph_divemode:
+ ostc_debug 'h' ; Sends debug-information to screen if debugmode active
+PLED_tissue_saturation_graph:
+ ostc_debug 'i' ; Sends debug-information to screen if debugmode active
+; with dd_font2display
+
+ movlw .255
+ movff WREG,box_temp+0 ; Data
+ movlw .25
+ movff WREG,box_temp+1 ; row top (0-239)
+ movlw .120
+ movff WREG,box_temp+2 ; row bottom (0-239)
+ movlw .82
+ movff WREG,box_temp+3 ; column left (0-159)
+ movlw .159
+ movff WREG,box_temp+4 ; column right (0-159)
+ call PLED_frame
+
+ lfsr FSR2, char_O_tissue_saturation+.000 ; N2
+ movlw d'16'
+ movwf wait_temp ; 16 tissues
+ clrf waitms_temp ; Row offset
+PLED_tissue_saturation_graph3:
+ movlw .255
+ movff WREG,box_temp+0 ; Data
+ movlw .28
+ addwf waitms_temp,W
+ movff WREG,box_temp+1 ; row top (0-239)
+ movlw .28
+ addwf waitms_temp,W
+ movff WREG,box_temp+2 ; row bottom (0-239)
+
+ incf waitms_temp,F
+ incf waitms_temp,F
+
+ movlw .100
+ movff WREG,box_temp+3 ; column left (0-159)
+
+ movff POSTINC2,box_temp+4
+ bcf STATUS,C
+ rrcf box_temp+4,F
+ bcf STATUS,C
+ rrcf box_temp+4,F
+ movlw .100
+ addwf box_temp+4,F ; column right (0-159)
+
+ movlw d'157' ; limit display
+ cpfslt box_temp+4 ; skip if 157 (WREG) < box_temp+4
+ movwf box_temp+4
+
+ call PLED_box
+
+ decfsz wait_temp,F
+ bra PLED_tissue_saturation_graph3
+
+ lfsr FSR2, char_O_tissue_saturation+.016 ; He
+ movlw d'16'
+ movwf wait_temp ; 16 tissues
+ clrf waitms_temp ; Row offset
+PLED_tissue_saturation_graph2:
+ movlw .255
+ movff WREG,box_temp+0 ; Data
+ movlw .86
+ addwf waitms_temp,W
+ movff WREG,box_temp+1 ; row top (0-239)
+ movlw .86
+ addwf waitms_temp,W
+ movff WREG,box_temp+2 ; row bottom (0-239)
+
+ incf waitms_temp,F
+ incf waitms_temp,F
+
+ movlw .100
+ movff WREG,box_temp+3 ; column left (0-159)
+
+ movff POSTINC2,box_temp+4
+ bcf STATUS,C
+ rrcf box_temp+4,F
+ bcf STATUS,C
+ rrcf box_temp+4,F
+ movlw .100
+ addwf box_temp+4,F ; column right (0-159)
+
+ movlw d'157' ; limit display
+ cpfslt box_temp+4 ; skip if 157 (WREG) < box_temp+4
+ movwf box_temp+4
+
+ call PLED_box
+
+ decfsz wait_temp,F
+ bra PLED_tissue_saturation_graph2
+
+ WIN_LEFT .84
+ WIN_TOP .32
+ WIN_COLOR color_white
+ lfsr FSR2,letter
+ movlw 'N'
+ movwf POSTINC2
+ movlw '2'
+ movwf POSTINC2
+ call word_processor
+
+ WIN_LEFT .84
+ WIN_TOP .90
+ WIN_COLOR color_white
+ lfsr FSR2,letter
+ movlw 'H'
+ movwf POSTINC2
+ movlw 'e'
+ movwf POSTINC2
+ call word_processor
+ return
+
+
+PLED_startupscreen1:
+ call PLED_topline_box
+ WIN_INVERT .1 ; Init new Wordprocessor
+ DISPLAYTEXT d'3' ; "HeinrichsWeikamp"
+ WIN_INVERT .0 ; Init new Wordprocessor
+ DISPLAYTEXT .68 ; Licence 1/2
+ DISPLAYTEXT .69
+ DISPLAYTEXT .70
+ DISPLAYTEXT .71
+ DISPLAYTEXT .72
+ DISPLAYTEXT .73
+ DISPLAYTEXT .74
+ return
+
+PLED_startupscreen2:
+ call PLED_topline_box
+ WIN_INVERT .1 ; Init new Wordprocessor
+ DISPLAYTEXT d'3' ; "HeinrichsWeikamp"
+ WIN_INVERT .0 ; Init new Wordprocessor
+ DISPLAYTEXT .75 ; Licence 2/2
+ DISPLAYTEXT .76
+ DISPLAYTEXT .77
+ DISPLAYTEXT .78
+ DISPLAYTEXT .79
+ DISPLAYTEXT .80
+ DISPLAYTEXT .81
+ return
+
+PLED_new_cf_warning:
+ call PLED_topline_box
+ WIN_INVERT .1 ; Init new Wordprocessor
+ DISPLAYTEXTH .271 ; New CF added!
+ WIN_INVERT .0 ; Init new Wordprocessor
+ DISPLAYTEXTH .272 ; New CustomFunctions
+ DISPLAYTEXTH .273 ; were added! Check
+ DISPLAYTEXTH .274 ; CF I and CF II Menu
+ DISPLAYTEXTH .275 ; for Details!
+ return
+
+PLED_const_ppO2_value:
+ btfsc multi_gf_display ; Is the Multi-GF Table displayed?
+ return ; Yes, No update and return!
+ btfsc menubit ; Divemode menu active?
+ return ; Yes, No update and return!
+ btfsc premenu ; Showing "Menu?"?
+ return ; Yes, do not display ppO2/"Bail"
+
+ ostc_debug 'j' ; Sends debug-information to screen if debugmode active
+
+ WIN_TOP .168
+ WIN_LEFT .65
+ WIN_FONT FT_SMALL
+ WIN_INVERT .0 ; Init new Wordprocessor
+ WIN_COLOR color_white
+ lfsr FSR2,letter
+ movff char_I_const_ppO2,lo
+
+ tstfsz lo ; In Bailout mode (char_I_const_ppO2=0)?
+ bra PLED_const_ppO2_value2 ; No, display Setpoint
+
+; Yes, Display "Bail"
+ OUTPUTTEXTH d'263' ;"Bail"
+ call word_processor
+ return
+
+PLED_const_ppO2_value2: ; Display SetPoint
+;Show fixed SP value
+ clrf hi
+ bsf leftbind
+ output_16dp d'3'
+ bcf leftbind
+ call word_processor
+ return
+
+PLED_show_leading_tissue:
+ call deco_main_calc_desaturation_time ; calculate desaturation time
+ movlb b'00000001' ; select ram bank 1
+
+ DISPLAYTEXTH .282 ; L. Tissue:
+ lfsr FSR2,letter
+ movlw '#'
+ movwf POSTINC2
+ movff char_O_gtissue_no,lo
+ movff char_O_gtissue_no,wait_temp ; used as temp
+ bsf leftbind
+ output_8
+ movlw ' '
+ movwf POSTINC2
+ movlw '('
+ movwf POSTINC2
+
+ movlw d'16'
+ cpfslt wait_temp
+ bra PLED_show_leading_tissue_he
+ movlw 'N'
+ movwf POSTINC2
+ movlw '2'
+ movwf POSTINC2
+ bra PLED_show_leading_tissue2
+PLED_show_leading_tissue_he:
+ movlw 'H'
+ movwf POSTINC2
+ movlw 'e'
+ movwf POSTINC2
+PLED_show_leading_tissue2:
+ movlw ')'
+ movwf POSTINC2
+ movlw ' '
+ movwf POSTINC2
+ WIN_LEFT .100
+ WIN_TOP .25
+ WIN_FONT FT_SMALL
+ WIN_COLOR color_white
+ call word_processor
+
+ lfsr FSR2,letter
+ lfsr FSR1,char_O_tissue_saturation+0
+ incf wait_temp,F ; make 1-16 of 0-15
+PLED_show_leading_tissue3: ; point to leading tissue...
+ movff POSTINC1,lo ; copy/overwrite to lo register
+ decfsz wait_temp,F ; count until zero
+ bra PLED_show_leading_tissue3 ;loop
+ output_8
+ movlw '%'
+ movwf POSTINC2
+ movlw ' '
+ movwf POSTINC2
+ WIN_LEFT .100
+ WIN_TOP .50
+ WIN_FONT FT_SMALL
+ WIN_COLOR color_white
+ call word_processor
+ bcf leftbind
+ return
+
+PLED_topline_box_clear: ; Writes an empty box
+ movlw .0
+ bra PLED_topline_box2
+PLED_topline_box: ; Writes a filled box
+ movlw .255
+PLED_topline_box2:
+ movff WREG,box_temp+0 ; Data
+ movlw .000
+ movff WREG,box_temp+1 ; row top (0-239)
+ movlw .026
+ movff WREG,box_temp+2 ; row bottom (0-239)
+ movlw .000
+ movff WREG,box_temp+3 ; column left (0-159)
+ movlw .159
+ movff WREG,box_temp+4 ; column right (0-159)
+ call PLED_box
+ return
+
+PLED_display_cns:
+ btfsc multi_gf_display ; Is the Multi-GF Table displayed?
+ return ; Yes, No update and return!
+
+ btfsc gauge_mode ; Do not display in gauge mode
+ return
+
+ btfsc FLAG_apnoe_mode ; Do not display in apnoe mode
+ return
+
+ btfsc pled_velocity_display ; Is velocity displayed?`
+ return ; Yes, do not overwrite until pled_velocity_clear was called
+
+ ostc_debug 'k' ; Sends debug-information to screen if debugmode active
+
+ WIN_TOP .090
+ WIN_LEFT .0
+ WIN_FONT FT_SMALL
+ WIN_COLOR color_white
+
+ lfsr FSR2,letter
+ movlw 'C'
+ movwf POSTINC2
+ movlw 'N'
+ movwf POSTINC2
+ movlw 'S'
+ movwf POSTINC2
+ movlw ':'
+ movwf POSTINC2
+ movff char_O_CNS_fraction,lo
+ bsf leftbind
+ output_8
+ bcf leftbind
+ movlw '%'
+ movwf POSTINC2
+ call word_processor
+ return
+
+PLED_custom_text:
+ read_int_eeprom d'64'
+ movlw d'1'
+ cpfseq EEDATA ; Custom text active?
+ bra PLED_clear_custom_text ; No, Delete row
+ WIN_TOP .200
+ WIN_LEFT .0
+ WIN_FONT FT_SMALL
+ WIN_INVERT .0 ; Init new Wordprocessor
+ WIN_COLOR color_red
+
+ lfsr FSR2,letter
+ movlw d'64'
+ movwf lo
+ movlw d'24'
+ movwf hi ; counter
+
+PLED_custom_text1:
+ incf lo,F
+ call PLED_get_custom_letter ; Get one letter for the custom text
+ movlw '}' ; End marker found?
+ cpfseq EEDATA
+ bra PLED_custom_text2 ; No
+ bra PLED_custom_text3
+PLED_custom_text2:
+ movff EEDATA,POSTINC2 ; Copy into Postinc
+
+ decfsz hi,F ; Max. numbers?
+ bra PLED_custom_text1 ; No, get next letters
+
+PLED_custom_text3:
+ call word_processor
+ WIN_COLOR color_white
+ return
+
+PLED_get_custom_letter:
+ movff lo,EEADR ; Address for next custom text letter
+ call read_eeprom ; Read letter
+ return
+
+PLED_clear_custom_text:
+ movlw d'24'
+ movwf temp1
+ WIN_TOP .200
+ WIN_LEFT .0
+ call PLED_display_clear_common_y1
+ return
+
+
+;PLED_const_ppO2_DEBUG:
+; movlw .007
+; call PLED_SetColumn
+; movlw .032
+; call PLED_SetRow
+; lfsr FSR2,letter
+; movff char_O_diluent,lo
+; output_8
+; movlw .001
+; movwf scaleY
+; call word_processor
+; movlw .007
+; call PLED_SetColumn
+; movlw .024
+; call PLED_SetRow
+; lfsr FSR2,letter
+; movff last_diluent,lo
+; output_8
+; movlw .001
+; movwf scaleY
+; call word_processor
+; movlw .007
+; call PLED_SetColumn
+; movlw .016
+; call PLED_SetRow
+; lfsr FSR2,letter
+; movff char_O_deco_status,lo
+; output_8
+; movlw .001
+; movwf scaleY
+; call word_processor
+; return
+;
+
+;PLED_gaschange_DEBUG:
+; movlw .008
+; call PLED_SetColumn
+; movlw .016
+; call PLED_SetRow
+; lfsr FSR2,letter
+; movff char_I_deco_He_ratio,lo
+; output_8
+; call word_processor
+;
+; movlw .024
+; call PLED_SetRow
+; lfsr FSR2,letter
+; movff char_I_deco_N2_ratio,lo
+; output_8
+; call word_processor
+;
+; movlw .032
+; call PLED_SetRow
+; lfsr FSR2,letter
+; movff char_I_deco_gas_change,lo
+; output_8
+; call word_processor
+;
+; movlw .040
+; call PLED_SetRow
+; lfsr FSR2,letter
+; movff hi,lo
+; output_8
+; call word_processor
+; return
+
+
+PLED_MultiGF_deco_mask:
+; movlw 0x30
+; movwf wait_temp
+; movff wait_temp,box_temp+1 ; row
+; movlw 0xAA
+; movwf wait_temp
+; movff wait_temp,box_temp+0 ; color
+; goto DD_hline ; returns
+return
+
+PLED_MultiGF_deco_all:
+return
+; movff char_O_actual_pointer,wait_temp
+; movff char_O_GF_low_pointer,waitms_temp
+; movf waitms_temp,F
+; bz PLED_MultiGF_no_deco
+; movf waitms_temp,W
+; cpfsgt wait_temp
+; bra PLED_MultiGF_actual_in_deco
+; call PLED_MultiGF_clear_behind_depth
+; movff char_O_GF_low_pointer,wait_temp
+; incf wait_temp,F
+; bra PLED_MultiGF_complete_list_only ; input wait_temp
+;PLED_MultiGF_actual_in_deco:
+; call PLED_MultiGF_gradient
+; call PLED_MultiGF_time_at_deco
+; call PLED_MultiGF_deco_depth_actual
+; movff char_O_actual_pointer,wait_temp
+;PLED_MultiGF_complete_list_only:
+; call PLED_MultiGF_table ; input wait_temp
+; return
+
+;PLED_MultiGF_table:
+; movlw .043
+; movwf temp5
+; movlw .48 + .8
+; movwf temp6
+; movff char_O_GF_low_pointer,wait_temp
+;PLED_MultiGF_loop:
+; decfsz wait_temp,F
+; bra PLED_MulitGF_nextentry
+;
+;; bra PLED_MultiGF_calc_tissue_counter
+;;PLED_MGF_lp_calc_tis_counter:
+;
+;PLED_MGF_lp_clear_rem_space:
+; lfsr FSR2,letter
+; movlw ' '
+; movwf POSTINC2
+; movlw ' '
+; movwf POSTINC2
+; movlw ' '
+; movwf POSTINC2
+; movlw ' '
+; movwf POSTINC2
+; movlw ' '
+; movwf POSTINC2
+; movlw ' '
+; movwf POSTINC2
+; movlw .8
+; subwf temp6,F
+; bnz PLED_MultiGF_column_ok_space
+; movlw .21
+; subwf temp5,F
+; bc PLED_MultiGF_new_row_space
+; return
+;PLED_MultiGF_new_row_space:
+; movlw .48
+; movwf temp6
+;PLED_MultiGF_column_ok_space:
+; movf temp5,W
+; call PLED_SetColumn
+; movlw .8
+; subwf temp6,W
+; call PLED_SetRow
+; call word_processor
+; bra PLED_MGF_lp_clear_rem_space
+;
+;PLED_MulitGF_nextentry:
+; lfsr FSR2,letter
+; movff wait_temp,lo ; pointer to meter
+; movf lo,W
+; rlncf lo,F
+; addwf lo,F
+; decfsz wait_temp,W
+; bra PLED_MGF_skip_last_deco2
+; movff char_I_depth_last_deco,lo
+;PLED_MGF_skip_last_deco2:
+; output_99
+; movlw 0x02
+; movwf POSTINC2
+; movlw ':'
+; movwf POSTINC2
+; movlw 0x02
+; movwf POSTINC2
+; lfsr FSR0,0x250
+; movf wait_temp,W
+; movff PLUSW0,lo
+; movlw d'10' ; gray code
+; tstfsz lo
+; movlw b'00001111' ; gray code
+; movwf grayvalue
+; bsf leftbind
+; output_99
+; bcf leftbind
+; movlw ' '
+; movwf POSTINC2
+; movlw .8
+; subwf temp6,F
+; bnz PLED_MultiGF_column_ok
+; movlw .21
+; subwf temp5,F
+; bc PLED_MultiGF_new_row
+; return
+;PLED_MultiGF_new_row:
+; movlw .48
+; movwf temp6
+;PLED_MultiGF_column_ok:
+; movf temp5,W
+; call PLED_SetColumn
+; movlw .8
+; subwf temp6,W
+; call PLED_SetRow
+; call word_processor
+; movlw b'00001111' ; gray code
+; movwf grayvalue
+; bra PLED_MultiGF_loop
+;
+;PLED_MultiGF_no_deco:
+; DISPLAYTEXT d'242' ;"no deco"
+; return
+;
+;PLED_MultiGF_depth:
+; lfsr FSR2,letter
+; movff rel_pressure+0,lo
+; movff rel_pressure+1,hi
+; call adjust_depth_with_salinity ; computes salinity setting into lo:hi [mBar]
+; bsf leftbind
+; bsf ignore_digit5 ; do not display 1cm depth
+; output_16dp d'3'
+; bcf leftbind
+; movlw .004
+; movwf wait_temp
+; movff wait_temp,0x086 ; left
+; movlw .049
+; movwf wait_temp
+; movff wait_temp,0x087 ; top
+; movlw .015
+; movwf wait_temp
+; movff wait_temp,0x088 ; heightmax
+; movff dd_oled_brightness_offset,wait_temp
+; movff wait_temp,0x089 ; oled_brightness_offset_const
+; call main_DD2_write_incon24
+; movlb b'00000001' ; Back to Bank1
+; return
+;
+;PLED_MultiGF_deco_depth_actual:
+; lfsr FSR2,letter
+; movff char_O_actual_pointer,lo ; pointer to meter
+; movf lo,W
+; rlncf lo,F
+; addwf lo,F
+; movff char_O_actual_pointer,wait_temp ; test last_deco
+; decfsz wait_temp,F
+; bra PLED_MGF_skip_last_deco_depth
+; movff char_I_depth_last_deco,lo
+;PLED_MGF_skip_last_deco_depth:
+; output_99
+; movlw 'm'
+; movwf POSTINC2
+; movlw ' '
+; movwf POSTINC2
+; movlw .23
+; call PLED_SetColumn
+; movlw .57
+; call PLED_SetRow
+; goto word_processor
+;
+;PLED_MultiGF_gradient:
+; lfsr FSR2,letter
+; movff char_O_gradient_factor,lo
+; bsf leftbind
+; output_99
+; bcf leftbind
+; movlw '%'
+; movwf POSTINC2
+; movlw ' '
+; movwf POSTINC2
+; movlw .23
+; call PLED_SetColumn
+; movlw .49
+; call PLED_SetRow
+; goto word_processor
+;
+;PLED_MultiGF_time_at_deco:
+; movlw .045
+; movwf wait_temp
+; movff wait_temp,0x086 ; left
+; movlw .050
+; movwf wait_temp
+; movff wait_temp,0x087 ; top
+; movlw .015
+; movwf wait_temp
+; movff wait_temp,0x088 ; heightmax
+; movff dd_oled_brightness_offset,wait_temp
+; movff wait_temp,0x089 ; oled_brightness_offset_const
+; lfsr FSR2,letter
+; lfsr FSR0,0x250
+; movff char_O_actual_pointer,lo
+; movf lo,W
+; movff PLUSW0,lo
+; bsf leftbind
+; output_99
+; movlw '<' ; Textmapping to "'"!
+; movwf POSTINC2
+; call main_DD2_write_incon24
+; movlb b'00000001' ; Back to Bank1
+; return
+;
+;PLED_MultiGF_clear_behind_depth:
+; movlw 0x01
+; movwf wait_temp
+; movff wait_temp,width ; font select left side before decpoint
+; movff wait_temp,box_temp+5 ; font select right side decpoint and after
+; movlw .063
+; movwf wait_temp
+; movff wait_temp,box_temp+1 ; bottom row
+; movlw .020
+; movwf wait_temp
+; movff wait_temp,box_temp+2 ; start column
+; movlw .063
+; movwf wait_temp
+; movff wait_temp,box_temp+3 ; end column
+; movlw .051
+; movwf wait_temp
+; movff wait_temp,box_temp+4 ; start column dec point
+; lfsr FSR2,letter
+;; call DD_Main
+; return
+;; movlw 0x31
+; movwf wait_temp
+; movff wait_temp,box_temp+1 ; row
+; movlw 0x00
+; movwf wait_temp
+; movff wait_temp,box_temp+0 ; color
+; call DD_hline
+; return
+;
+
+;PLED_MulitGF_nextentry_tissues:
+; lfsr FSR2,letter
+; lfsr FSR0,0x200
+; rlncf wait_temp,W
+; movff PLUSW0,lo
+; addlw .001
+; movff PLUSW0,hi
+; output_16
+; movlw ' '
+; movwf POSTINC2
+; movlw .8
+; subwf temp6,F
+; bnz PLED_MultiGF_column_ok_tissues
+; movlw b'00001111' ; gray code
+; movwf grayvalue
+; movlw .21
+; subwf temp5,F
+; bc PLED_MultiGF_new_row_tissues
+; return
+;PLED_MultiGF_new_row_tissues:
+; movlw .48
+; movwf temp6
+;PLED_MultiGF_column_ok_tissues:
+; movf temp5,W
+; call PLED_SetColumn
+; movlw .8
+; subwf temp6,W
+; call PLED_SetRow
+; call word_processor
+; bra PLED_MultiGF_loop_tissues
+;
+
+;PLED_MultiGF_uart_out:
+; call rs232_wait_tx
+;; header ff ff
+; movlw 0xff
+; movwf wait_temp
+; movff wait_temp,TXREG
+; call rs232_wait_tx
+; movff wait_temp,TXREG
+; call rs232_wait_tx
+;; 2sec counter
+; movff 0x290,TXREG
+; call rs232_wait_tx
+; movff 0x291,TXREG
+; call rs232_wait_tx
+;; movff ,TXREG
+;; pres_respiration
+; movff amb_pressure,TXREG
+; call rs232_wait_tx
+; movff amb_pressure+1,TXREG
+; call rs232_wait_tx
+;; pres_surface
+; movff last_surfpressure,TXREG
+; call rs232_wait_tx
+; movff last_surfpressure+1,TXREG
+; call rs232_wait_tx
+;; tissue pres
+; lfsr FSR0,0x200
+; movlw .64
+; movwf wait_temp
+;pled_multigraf_tissue_uart_loop:
+; movff POSTINC0,TXREG
+; call rs232_wait_tx
+; decfsz wait_temp
+; bra pled_multigraf_tissue_uart_loop
+;; movff ,TXREG
+;; call rs232_wait_tx
+; return
+
+;PLED_MulitGF_nextentry_debug:
+; lfsr FSR2,letter
+; movff wait_temp,lo
+; output_99
+; movlw 0x02
+; movwf POSTINC2
+; movlw ':'
+; movwf POSTINC2
+; movlw 0x02
+; movwf POSTINC2
+; lfsr FSR0,0x300
+; movf wait_temp,W
+; movff PLUSW0,lo
+; output_99
+; movlw ' '
+; movwf POSTINC2
+; movlw .8
+; subwf temp6,F
+; bnz PLED_MultiGF_column_ok_debug
+; movlw b'00001111' ; gray code
+; movwf grayvalue
+; movlw .21
+; subwf temp5,F
+; bc PLED_MultiGF_new_row_debug
+; return
+;PLED_MultiGF_new_row_debug:
+; movlw .48
+; movwf temp6
+;PLED_MultiGF_column_ok_debug:
+; movf temp5,W
+; call PLED_SetColumn
+; movlw .8
+; subwf temp6,W
+; call PLED_SetRow
+; call word_processor
+; bra PLED_MultiGF_loop_debug
+
+;PLED_MultiGF_calc_tissue_counter:
+; movlw d'8' ; gray code
+; movwf grayvalue
+; movff 0x290,lo
+; movff 0x291,hi
+; movlw '('
+; movwf POSTINC2
+; output_16
+; movlw ')'
+; movwf POSTINC2
+; movlw .8
+; subwf temp6,F
+; bnz PLED_MGF_ok_col_calc_tis_cter
+; movlw b'00001111' ; gray code
+; movwf grayvalue
+; movlw .21
+; subwf temp5,F
+; bc PLED_MGF_n_row_calc_tis_cter
+; return
+;PLED_MGF_n_row_calc_tis_cter:
+; movlw .48
+; movwf temp6
+;PLED_MGF_ok_col_calc_tis_cter:
+; movf temp5,W
+; call PLED_SetColumn
+; movlw .8
+; subwf temp6,W
+; call PLED_SetRow
+; call word_processor
+; bra PLED_MGF_lp_calc_tis_counter
+;
+
+;PLED_debug_deko:
+; movlw .009
+; call PLED_SetColumn
+; movlw .008
+; call PLED_SetRow
+; lfsr FSR2,letter
+; movff char_O_deco_status,lo
+; output_8
+; call word_processor
+;
+; movlw .009
+; call PLED_SetColumn
+; movlw .016
+; call PLED_SetRow
+; lfsr FSR2,letter
+; movff char_O_array_decodepth+0,lo
+; output_8
+; call word_processor
+; return
+;
+
+
+
+adjust_depth_with_salinity: ; computes salinity setting into lo:hi [mBar]
+
+ btfsc simulatormode_active ; Do apply salinity in Simulatormode
+ return
+
+ read_int_eeprom d'26' ; Read Salinity from EEPROM
+ movff EEDATA, wait_temp ; salinity
+
+ movlw d'105' ; 105% ?
+ cpfslt wait_temp ; Salinity higher limit
+ return ; Out of limit, do not adjust lo:hi
+
+ movlw d'99' ; 99% ?
+ cpfsgt wait_temp ; Salinity lower limit
+ return ; Out of limit, do not adjust lo:hi
+
+ movff lo,xA+0
+ movff hi,xA+1
+
+ movlw d'100'
+ movwf xB+0
+ clrf xB+1
+
+ call mult16x16 ;xA*xB=xC (lo:hi * 100)
+
+ movff wait_temp,xB+0 ; Salinity
+ clrf xB+1
+
+ call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder
+
+ movff xC+0,lo
+ movff xC+1,hi ; restore lo and hi with updated value
+
+ return
\ No newline at end of file
diff -r 000000000000 -r 96a35aeda5f2 code_part1/OSTC_code_asm_part1/simulator.asm
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/code_part1/OSTC_code_asm_part1/simulator.asm Tue Jan 12 15:05:59 2010 +0100
@@ -0,0 +1,310 @@
+
+; OSTC - diving computer code
+; Copyright (C) 2008 HeinrichsWeikamp GbR
+
+; 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 3 of the License, or
+; (at your option) any later version.
+
+; This program is distributed in the hope that it will be useful,
+; but WITHOUT ANY WARRANTY; without even the implied warranty of
+; 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, see .
+
+
+; menu "Simulator"
+; written by: Matthias Heinrichs, info@heinrichsweikamp.com
+; written: 081210
+; last updated: 081210
+; known bugs:
+; ToDo:
+
+menu_simulator:
+ movlw d'1'
+ movwf logbook_temp1 ; Bottom time
+ movlw d'15'
+ movwf logbook_temp2 ; Max. Depth
+ movlw d'1'
+ movwf menupos
+
+menu_simulator1:
+ clrf timeout_counter2
+ bsf menubit
+ bsf cursor
+ call PLED_ClearScreen
+ call PLED_simulator_mask
+
+menu_simulator2:
+ bcf switch_left
+ bcf switch_right
+ bcf menubit2
+ bcf menubit3
+ call PLED_simulator_data
+ call PLED_menu_cursor
+
+menu_simulator_loop:
+ call check_switches_menu
+menu_simulator_loop2:
+ btfss onesecupdate
+ bra menu_simulator_loop3
+
+ call timeout_surfmode
+ call set_dive_modes
+ call test_charger ; check if charger IC is active
+ call get_battery_voltage ; get battery voltage
+
+ bcf onesecupdate ; End of one second tasks
+
+menu_simulator_loop3:
+ btfsc menubit2
+ goto menu_simulator_do ; call submenu
+
+ btfss menubit
+ goto menu ; exit setup menu and return to main menu
+
+ btfsc sleepmode
+ goto more_menu
+
+ btfsc divemode
+ goto restart ; exit menu, restart and enter divemode
+
+ bra menu_simulator_loop
+
+menu_simulator_do: ; calls submenu
+ dcfsnz menupos,F
+ bra simulator_startdive
+ dcfsnz menupos,F
+ bra simulator_inc_bottomtime
+ dcfsnz menupos,F
+ bra simulator_inc_maxdepth
+ dcfsnz menupos,F
+ bra simulator_calc_deco
+ dcfsnz menupos,F
+ bra simulator_show_decoplan
+ movlw d'4'
+ movwf menupos
+ goto more_menu2 ; exit...
+
+simulator_inc_bottomtime:
+ movlw d'2'
+ addwf logbook_temp1,F ; Here: Bottomtime in m
+ movlw d'199'
+ cpfslt logbook_temp1
+ movwf logbook_temp1
+ movlw d'2'
+ movwf menupos
+ bra menu_simulator2
+
+simulator_inc_maxdepth:
+ movlw d'3'
+ addwf logbook_temp2,F ; Here: Maxdepth in m
+ movlw d'99'
+ cpfslt logbook_temp2
+ movwf logbook_temp2
+ movlw d'3'
+ movwf menupos
+ bra menu_simulator2
+
+simulator_startdive:
+ ; Descent to -3m depth
+ ; Set standalone_simulator flag (Displays Simulator menu during simulation by pressing ENTER button)
+ ; Clear standalone_simulator after (any) dive
+ bsf simulatormode_active ; normal simulator mode
+ bsf standalone_simulator ; Standalone Simulator active
+
+ movff logbook_temp2,xA+0
+ clrf xA+1
+ movlw d'100'
+ movwf xB+0
+ clrf xB+1
+ call mult16x16 ;xA*xB=xC ; Depth in m*100
+
+ movlw LOW d'1000'
+ addwf xC+0,F
+ movlw HIGH d'1000'
+ addwfc xC+1,F ; Add 1000mBar
+
+ movff xC+0,sim_pressure+0
+ movff xC+1,sim_pressure+1
+
+ movff sim_pressure+0,amb_pressure+0 ; override readings with simulator values
+ movff sim_pressure+1,amb_pressure+1
+
+ bcf menubit2
+ bcf menubit3
+ bcf menubit
+ bcf switch_left
+ bcf switch_right
+
+ call simulator_save_tissue_data ; Stores 32 floats "pre_tissue" into bank3
+
+ bsf divemode ; Set divemode flag
+ ostc_debug 'P' ; Sends debug-information to screen if debugmode active
+ goto diveloop ; Start Divemode
+
+simulator_save_tissue_data:
+ bsf restore_deco_data ; Set restore flag
+ ostc_debug 'S' ; Sends debug-information to screen if debugmode active
+ call main_push_tissues_to_vault
+ movlb 0x01 ; Back to RAM Bank1
+ ostc_debug 'T' ; Sends debug-information to screen if debugmode active
+ return
+
+simulator_restore_tissue_data:
+ bcf restore_deco_data ; clear restore flag
+ ostc_debug 'S' ; Sends debug-information to screen if debugmode active
+ call main_pull_tissues_from_vault
+ movlb 0x01 ; Back to RAM Bank1
+ ostc_debug 'T' ; Sends debug-information to screen if debugmode active
+
+ ostc_debug 'G' ; Sends debug-information to screen if debugmode active
+ call deco_main_calc_desaturation_time ; calculate desaturation time
+ movlb b'00000001' ; select ram bank 1
+ call calculate_noflytime ; Calc NoFly time
+ ostc_debug 'H' ; Sends debug-information to screen if debugmode active
+ return
+
+simulator_show_decoplan:
+ call PLED_ClearScreen
+ call divemenu_see_decoplan
+
+ bcf switch_left
+ bcf switch_right
+
+simulator_show_decoplan2:
+ btfss onesecupdate
+ bra simulator_show_decoplan3
+
+ call timeout_surfmode
+ call set_dive_modes
+ call test_charger ; check if charger IC is active
+ call get_battery_voltage ; get battery voltage
+
+ bcf onesecupdate ; End of one second tasks
+
+simulator_show_decoplan3:
+ btfsc switch_left
+ bra simulator_show_decoplan4 ; Quit display
+
+ btfsc switch_right
+ bra simulator_show_decoplan4 ; Quit display
+
+ btfsc sleepmode
+ goto more_menu
+
+ btfsc divemode
+ goto restart ; exit menu, restart and enter divemode
+
+ bra simulator_show_decoplan2
+
+simulator_show_decoplan4:
+ movlw d'5'
+ movwf menupos
+ bra menu_simulator1
+
+
+simulator_calc_deco:
+ call diveloop_boot ; configure gases, etc.
+
+ bsf simulatormode_active ; normal simulator mode
+ bsf standalone_simulator ; Standalone Simulator active
+
+
+ movff logbook_temp2,xA+0
+ clrf xA+1
+ movlw d'100'
+ movwf xB+0
+ clrf xB+1
+ call mult16x16 ;xA*xB=xC ; Depth in m*100
+
+ movlw LOW d'1000'
+ addwf xC+0,F
+ movlw HIGH d'1000'
+ addwfc xC+1,F ; Add 1000mBar
+
+ movff xC+0,sim_pressure+0
+ movff xC+1,sim_pressure+1
+
+ movff sim_pressure+0,amb_pressure+0 ; override readings with simulator values
+ movff sim_pressure+1,amb_pressure+1
+
+ call simulator_save_tissue_data ; Stores 32 floats "pre_tissue" into bank3
+
+ WIN_INVERT .1
+ DISPLAYTEXT .12 ;" Wait.."
+ WIN_INVERT .0
+
+simulator_calc_deco_loop1:
+ movlw d'30'
+ movwf logbook_temp3 ; 30x/Minute
+ call PLED_simulator_data
+
+; movlw .011
+; call PLED_SetColumn
+; movlw .009
+; call PLED_SetRow
+; lfsr FSR2,letter
+; movff char_O_array_decodepth+0,lo ; Get Depth
+; bsf leftbind
+; output_8
+; bcf leftbind
+; movlw ' '
+; movwf POSTINC2
+;call word_processor
+
+
+simulator_calc_deco_loop2:
+ call toggle_LEDr
+
+ call divemode_check_decogases ; Checks for decogases and sets the gases
+ call divemode_prepare_flags_for_deco
+
+ call deco_main_calc_hauptroutine ; calc_tissue
+ movlb b'00000001' ; rambank 1 selected
+ ostc_debug 'C' ; Sends debug-information to screen if debugmode active
+
+ decfsz logbook_temp3,F
+ bra simulator_calc_deco_loop2
+ decfsz logbook_temp1,F
+ bra simulator_calc_deco_loop1
+
+ movff char_O_deco_status,deco_status ;
+ tstfsz deco_status ; deco_status=0 if decompression calculation done
+ bra simulator_calc_deco2 ; Not finished
+
+simulator_calc_deco3:
+ call set_LEDr
+
+ call simulator_restore_tissue_data ; Restore 32 floats "pre_tissue" from bank3
+
+ bcf simulatormode_active ; normal simulator mode
+ bcf standalone_simulator ; Standalone Simulator active
+
+ WAITMS d'250'
+ WAITMS d'250'
+ WAITMS d'250' ; Wait for Pressure Sensor to get real pressure again...
+
+ call clear_LEDr
+
+ movlw d'1'
+ movwf logbook_temp1 ; Bottom time>0!
+
+ movlw d'5' ; Pre-Set Cursor to "Show Decoplan"
+ movwf menupos
+ bra menu_simulator1 ; Done.
+
+simulator_calc_deco2:
+ call divemode_check_decogases ; Checks for decogases and sets the gases
+ call divemode_prepare_flags_for_deco
+
+ call deco_main_calc_hauptroutine ; calc_tissue
+ movlb b'00000001' ; rambank 1 selected
+
+ movff char_O_deco_status,deco_status ;
+ tstfsz deco_status ; deco_status=0 if decompression calculation done
+ bra simulator_calc_deco2 ; Not finished
+ bra simulator_calc_deco3 ; finished!
\ No newline at end of file
diff -r 000000000000 -r 96a35aeda5f2 code_part1/OSTC_code_asm_part1/sleepmode.asm
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/code_part1/OSTC_code_asm_part1/sleepmode.asm Tue Jan 12 15:05:59 2010 +0100
@@ -0,0 +1,233 @@
+; OSTC - diving computer code
+; Copyright (C) 2008 HeinrichsWeikamp GbR
+; 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 3 of the License, or
+; (at your option) any later version.
+; This program is distributed in the hope that it will be useful,
+; but WITHOUT ANY WARRANTY; without even the implied warranty of
+; 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, see .
+; Routines for sleepmode
+; written by: Matthias Heinrichs, info@heinrichsweikamp.com
+; written: 050520
+; last updated: 090507
+; known bugs:
+; ToDo:
+sleeploop: ; enter sleepmode!
+; first check if the 16 hash char are=0
+ lfsr FSR2, char_O_hash
+ movlw d'16'
+ movwf temp1
+sleeploop1:
+ tstfsz POSTINC2 ; Test hash values
+ bra sleeploop2 ; At least one char is not zero -> Do not build hash
+ decfsz temp1,F
+ bra sleeploop1
+ ; build hash (about 90sek @ 16MHz)
+ call PLED_ClearScreen ; clear
+ DISPLAYTEXT .1 ; "Building MD2 hash"
+ DISPLAYTEXT .2 ; "Please wait..."
+ call deco_main_hash ; calculate MD2 hash
+ movlb b'00000001' ; Back to Bank1
+sleeploop2:
+ call PLED_DisplayOff ; display off
+ call disable_rs232 ; disable UART module
+ clrf divemins+0
+ clrf divemins+1
+ bcf TRISB,6
+ bcf TRISB,7
+ bcf PORTB,6
+ bcf PORTB,7 ; Disable UART
+sleeploop_loop:
+ btfsc oneminupdate ; one minute in sleep?
+ rcall onemin_sleep ; do oneminute tasks, e.g. calculate desaturation
+
+ btfsc onesecupdate ; one second in sleep?
+ rcall onesec_sleep ; check switches, check pressure sensor, etc.
+
+ btfss sleepmode ; wake up? (This bit will be set in other routines)
+ goto restart ; yes
+ nop
+ sleep ; Sleep until Timer1 will wake up the device
+ nop
+ bra sleeploop_loop ; do loop until someting happens
+
+
+onemin_sleep:
+ call get_battery_voltage ; get battery voltage
+ btfsc enter_error_sleep ; Enter Fatal Error Routine?
+ goto fatal_error_sleep ; Yes (In Sleepmode_vxx.asm!)
+
+ call calc_surface_interval ; Increases Surface-Interval time
+ call nofly_timeout60 ; check for no fly time
+ ; adjust airpressure compensation any 15 minutes
+ incf divemins+1,F ; counts to 14...
+ movlw d'14'
+ cpfsgt divemins+1
+ bra onemin_sleep2 ; 15 minutes not done!
+
+ rcall pressuretest_sleep_fast ; Gets pressure without averaging (faster!)
+
+ call check_temp_extrema ; Check for temperature extremas
+
+ call main_calc_CNS_decrease_15min ; compute CNS decay in sleep only
+ movlb b'00000001'
+ movff last_surfpressure_15min+0,last_surfpressure_30min+0 ; save older airpressure
+ movff last_surfpressure_15min+1,last_surfpressure_30min+1 ; save older airpressure
+ movff amb_pressure+0,last_surfpressure_15min+0 ; save new airpressure
+ movff amb_pressure+1,last_surfpressure_15min+1 ; save new airpressure
+
+ clrf divemins+1 ; reset counter
+ GETCUSTOM15 d'7' ; loads max_sufpressure into lo, hi
+ movff lo,sub_a+0 ; max. "allowed" airpressure in mBar
+ movff hi,sub_a+1
+ movff last_surfpressure_15min+0,sub_b+0
+ movff last_surfpressure_15min+1,sub_b+1
+ call sub16 ; sub_c = sub_a - sub_b
+ btfsc neg_flag
+ bra onemin_sleep1
+ bra onemin_sleep2 ; current airpressure is lower then "allowed" airpressure, ok!
+onemin_sleep1: ; not ok! Overwrite with max. "allowed" airpressure
+ GETCUSTOM15 d'7' ; loads max_sufpressure into lo, hi
+ movff lo,last_surfpressure_15min+0 ; max. "allowed" airpressure in mBar
+ movff hi,last_surfpressure_15min+1 ; max. "allowed" airpressure in mBar
+
+onemin_sleep2:
+;calc_deko_sleepmode:
+ movff amb_pressure+0,int_I_pres_respiration+0 ; LOW copy pressure to deco routine
+ movff amb_pressure+1,int_I_pres_respiration+1 ; HIGH
+ GETCUSTOM8 d'11' ; Saturation multiplier %
+ movwf wait_temp
+ movff wait_temp,char_I_saturation_multiplier
+ GETCUSTOM8 d'12' ; Desaturation multiplier %
+ movwf wait_temp
+ movff wait_temp,char_I_desaturation_multiplier
+ call deco_main_calc_wo_deco_step_1_m ; "calc_tissue_sleep"
+ movlb b'00000001' ; RAM Bank1 selected
+
+ bcf oneminupdate ; all done
+ return
+
+onesec_sleep:
+ call test_charger ; charger on?
+
+ btfss nofly_active
+ bra onesec_sleep_nonofly
+
+ call set_LEDnofly ; Set nofly LED
+
+ nop
+ sleep
+ nop
+
+onesec_sleep_nonofly:
+ call clear_LEDnofly ; Clear nofly LED
+ incf divemins+0,F ; counts to #test_pressure_in_sleep (5)
+ movlw d'5'
+ cpfsgt divemins+0 ; here: temp variable
+ bra onesec_sleep1 ; #test_pressure_in_sleep not done yet
+ rcall pressuretest_sleep_fast ; Gets pressure without averaging (faster!)
+
+ ; compare current ambient pressure with threshold
+ GETCUSTOM15 d'6' ; loads pressure threshold into lo,hi
+ movff lo,sub_a+0 ; power on if ambient pressure is greater threshold
+ movff hi,sub_a+1
+ movff amb_pressure+0,sub_b+0
+ movff amb_pressure+1,sub_b+1
+ call sub16 ; sub_c = sub_a - sub_b
+ bsf sleepmode
+ btfsc neg_flag ; Wake up from Sleep?
+ bcf sleepmode ; amb_pressure>pressure_offset_divemode: wake up!
+ clrf divemins+0
+onesec_sleep1:
+ bcf onesecupdate ; all done.
+ btfsc switch_left
+ bra onesec_sleep1a
+ btfsc switch_right
+ bra onesec_sleep1a
+; No button pressed
+ bcf INTCON,INT0IF ; Clear flag
+ bcf INTCON3,INT1IF ; Clear flag
+ bcf switch_right_isr
+ bcf switch_left_isr
+ bcf switch_right
+ bcf switch_left
+ bcf T0CON,TMR0ON ; Stop Timer 0
+ return
+onesec_sleep1a: ; At least one button pressed....
+ bcf INTCON,INT0IF ; Clear flag
+ bcf INTCON3,INT1IF ; Clear flag
+ bcf switch_right_isr
+ bcf switch_left_isr
+ bcf switch_right
+ bcf switch_left
+ bcf T0CON,TMR0ON ; Stop Timer 0
+ bcf sleepmode ; wake up!
+ bsf show_startup_screen ;
+ return
+
+pressuretest_sleep_fast: ; Get pressure without averaging (Faster to save some power in sleep mode)
+ call get_temperature_start ; and start temperature integration (73,5us)
+ sleep
+ nop
+ sleep
+ nop
+ sleep ; Wait at least 35ms (every 16.5ms Timer1 wakeup)
+ call get_temperature_value ; State 1: Get temperature
+ call get_pressure_start ; Start pressure integration.
+ sleep
+ nop
+ sleep
+ nop
+ sleep ; Wait at least 35ms (every 16.5ms Timer1 wakeup)
+ call get_pressure_value ; State2: Get pressure (51us)
+ call calculate_compensation ; calculate temperature compensated pressure (233us)
+ return
+
+fatal_error_sleep:
+ clrf INTCON
+ clrf INTCON2
+ clrf INTCON3
+ bcf ADCON0,0 ; AD converter off
+ call disable_rs232 ; disable UART module
+ movlw b'00010000'
+ movwf TRISA
+ clrf PORTA ; And pulled to GND
+ clrf TRISB ; All output
+ clrf PORTB ; And pulled to GND
+ movlw b'00011101' ; UART
+ movwf TRISC
+ clrf PORTC ; And pulled to GND
+ clrf TRISD ; All output
+ clrf PORTD ; And pulled to GND
+ clrf TRISE ; All output
+ clrf PORTE ; And pulled to GND
+ clrf T0CON ; Timer OFF
+ clrf T1CON ; Timer OFF
+ clrf T2CON ; Timer OFF
+ clrf OSCTUNE
+ movlw b'00000010' ; 31kHz
+ movwf OSCCON
+ bsf WDTCON,0 ; Watchdog timer on...
+fatal_error_sleep_loop: ; Device will never quit this loop!
+ movff fatal_error_code,temp4
+ movlw d'15'
+ movwf temp1
+fatal_error_sleep_loop1:
+ sleep
+ nop
+ decfsz temp1,F
+ bra fatal_error_sleep_loop1
+fatal_error_sleep_loop2:
+ call set_LEDy
+ clrwdt
+ WAIT10US d'5'
+ call clear_LEDy
+ sleep
+ nop
+ decfsz temp4,F
+ bra fatal_error_sleep_loop2
+ bra fatal_error_sleep_loop
\ No newline at end of file
diff -r 000000000000 -r 96a35aeda5f2 code_part1/OSTC_code_asm_part1/spbrgselect.inc
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/code_part1/OSTC_code_asm_part1/spbrgselect.inc Tue Jan 12 15:05:59 2010 +0100
@@ -0,0 +1,33 @@
+RoundResult SET 0 ; Rounding function. RoundResult = Round(aa/bb)
+Round macro aa,bb
+ LOCAL rr = aa/bb
+ LOCAL d1 = aa - rr*bb
+ LOCAL d2 = (rr+1)*bb - aa
+RoundResult = rr
+ if d1 >= d2
+RoundResult++
+ endif
+ endm
+
+AbsResult SET 0
+Abs macro nr
+ if nr>=0
+AbsResult = nr
+ else
+AbsResult = -nr
+ endif
+ endm
+
+ Round xtal,(16*baud)
+spbrg_value EQU RoundResult-1
+
+ Round xtal,(16*(spbrg_value+1))
+baud_real EQU RoundResult
+ Abs(baud_real-baud)
+errpercent EQU AbsResult*100/baud
+ if errpercent > 4
+ ERROR big error in baudrate: #v(errpercent)%
+ endif
+ if errpercent >= 2
+ messg baudrate not exact: #v(errpercent)%
+ endif
\ No newline at end of file
diff -r 000000000000 -r 96a35aeda5f2 code_part1/OSTC_code_asm_part1/start.asm
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/code_part1/OSTC_code_asm_part1/start.asm Tue Jan 12 15:05:59 2010 +0100
@@ -0,0 +1,390 @@
+; OSTC - diving computer code
+; Copyright (C) 2008 HeinrichsWeikamp GbR
+
+; 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 3 of the License, or
+; (at your option) any later version.
+
+; This program is distributed in the hope that it will be useful,
+; but WITHOUT ANY WARRANTY; without even the implied warranty of
+; 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, see .
+
+
+; Start and init
+; written by: Matthias Heinrichs, info@heinrichsweikamp.com
+; written: 10/13/04
+; last updated: 06/24/08
+; known bugs:
+; ToDo:
+
+start:
+ movlb b'00000001' ; ram bank 1 selected
+ call init
+ btfsc divemode ; Reset from Divemode?
+ call PLED_resetdebugger ; Yes! Something went wrong, show reset informations
+
+ clrf STKPTR ; Clear Stackpointer
+ lfsr FSR0, 109h ; Clear rambank 1-9, do not delete RTC registers
+clear_rambank:
+ clrf POSTINC0
+ movlw 0x0A
+ cpfseq FSR0H ; Bank 9 done?
+ bra clear_rambank ; clear...
+
+; Defaults for RTC
+ call disable_rs232 ; disable UART module
+ call RTCinit ; reset RTC
+
+; Air pressure compensation after reset
+ call get_calibration_data ; Get calibration data from pressure sensor
+
+ bcf pressure_refresh
+wait_start_pressure:
+ btfss pressure_refresh ; Air pressure compensation
+ bra wait_start_pressure
+
+ clrf rel_pressure+0
+ clrf rel_pressure+1
+ clrf surface_interval+0
+ clrf surface_interval+1
+
+ bsf sleepmode ; Routine only works in sleepmode...
+ call pressuretest_sleep_fast ; Gets pressure without averaging (faster!)
+ bcf sleepmode ; Normal mode again
+
+ movff amb_pressure+0,last_surfpressure+0
+ movff amb_pressure+1,last_surfpressure+1
+ movff amb_pressure+0,last_surfpressure_15min+0
+ movff amb_pressure+1,last_surfpressure_15min+1
+ movff amb_pressure+0,last_surfpressure_30min+0
+ movff amb_pressure+1,last_surfpressure_30min+1 ; Rests all airpressure registers
+
+; reset deco data
+ incf nofly_time+0,F ; =1
+ clrf wait_temp ; Use as buffer
+ movff wait_temp,char_I_He_ratio ; No He at the Surface
+ movlw d'79' ; 79% N2
+ movwf wait_temp ; Use as buffer
+ movff wait_temp,char_I_N2_ratio ; No He at the Surface
+ movff amb_pressure+0,int_I_pres_respiration+0 ; copy surface air pressure to deco routine
+ movff amb_pressure+1,int_I_pres_respiration+1
+
+ call deco_main_clear_tissue ;
+ movlb b'00000001' ; select ram bank 1
+ call deco_main_calc_desaturation_time; calculate desaturation time
+ movlb b'00000001' ; select ram bank 1
+ call main_clear_CNS_fraction ; clear CNS
+ movlb b'00000001' ; select ram bank 1
+ call calc_deko_surfmode ; calculate desaturation every minute
+ movlb b'00000001' ; select ram bank 1
+ call deco_main_calc_wo_deco_step_1_m ; calculate deco in surface mode
+ movlb b'00000001' ; select ram bank 1
+
+; check firmware and reset Custom Functions after an update
+ movlw LOW 0x101
+ movwf EEADR
+ movlw HIGH 0x101
+ movwf EEADRH
+ call read_eeprom ; read current version x
+ movff EEDATA,temp1
+ incf EEADR,F ; set to 0x102
+ call read_eeprom ; read current version y
+ movff EEDATA,temp2
+ clrf EEADRH ; Reset EEADRH
+
+ movlw softwareversion_x
+ cpfseq temp1 ; compare version x
+ bra check_firmware_new ; is not equal -> reset CF and store new version in EEPROM
+
+ movlw softwareversion_y
+ cpfseq temp2 ; compare version y
+ bra check_firmware_new ; is not equal -> reset CF and store new version in EEPROM
+ bra restart ; x and y are equal -> do not reset cf
+
+check_firmware_new:
+ movlw LOW 0x101 ; store current version in EEPROM
+ movwf EEADR
+ movlw HIGH 0x101
+ movwf EEADRH
+ movlw softwareversion_x
+ movwf EEDATA
+ call write_eeprom ; write version x
+ incf EEADR,F ; set to 0x102
+ movlw softwareversion_y
+ movwf EEDATA
+ call write_eeprom ; write version y
+ clrf EEADRH ; Reset EEADRH
+; goto reset_all_cf ; resets all custom functions bank0 and bank1 and jumps to "restart"
+; goto reset_all_cf_bank1 ; resets all custom functions bank1 and jumps to "restart"
+
+restart:
+ call clear_LEDr
+ call clear_LEDnofly ; all LEDs off
+ call PLED_boot ; PLED boot (Incl. Clear Screen!)
+ WIN_TOP .0
+ WIN_LEFT .0
+ WIN_FONT FT_SMALL
+ WIN_INVERT .0 ; Init new Wordprocessor
+ movlw 0xFF
+ movwf oled1_temp
+ movff oled1_temp,win_color1
+ movlw 0xFF
+ movwf oled1_temp
+ movff oled1_temp,win_color2
+ call I2CReset ; Just in Case any I2C device blocks the Bus
+ movff last_surfpressure_30min+0,last_surfpressure+0 ; Use 30min old airpressure
+ movff last_surfpressure_30min+1,last_surfpressure+1 ; Use 30min old airpressure
+
+; Check if new CF were added in the last firmware version
+ clrf EEADRH
+ read_int_eeprom d'92' ; Read number of CF used in this firmware
+ movlw max_custom_number ; Defined in definitions.asm
+ cpfseq EEDATA ; Compare with last version
+ bra restart_01 ; New CF, show warning and store new number
+ bra restart_1 ; No new CF, continue with boot
+restart_01:
+; Save new number of current CF count
+ rcall display_new_cf_installed; Show warning
+ movlw max_custom_number ; Defined in definitions.asm
+ movwf EEDATA
+ write_int_eeprom d'92' ; Store number of CF used in this firmware
+
+restart_1:
+ GETCUSTOM15 .31
+ movlw LOW .666
+ cpfseq lo
+ bra restart_2 ; Not equal!
+ movlw HIGH .666
+ cpfseq hi
+ bra restart_2 ; Not equal!
+ bra restart_3 ; Skip screen....
+
+restart_2:
+ btfsc show_startup_screen ; Show start screen?
+ call startup_screen1 ;1/2
+ btfsc show_startup_screen ; Show start screen?
+ call startup_screen2 ;2/2
+
+restart_3:
+ clrf flag1 ; clear all flags
+ clrf flag2
+ clrf flag3
+ clrf flag4
+ clrf flag5
+ clrf flag6
+ clrf flag7
+ clrf flag8
+ clrf flag9
+ clrf flag10
+ clrf flag11
+ clrf flag12
+ clrf flag13
+ clrf flag14
+ clrf flag15
+
+; Set Debug mode?
+ read_int_eeprom d'39'
+ bsf debug_mode
+ movlw d'1'
+ cpfseq EEDATA
+ bcf debug_mode ; clear flag if <> 1
+
+ goto surfloop ; Jump to Surfaceloop!
+
+
+display_new_cf_installed:
+ call PLED_new_cf_warning ; Display new CF warning screen
+ movlw d'20' ; timeout for warning screen
+ bra startup_screen3a ; Will RETURN after timeout or button press
+
+restart_set_modes_and_flags: ; "Call"ed from divemode, as well!
+ bcf gauge_mode
+ bcf FLAG_const_ppO2_mode
+ bcf FLAG_apnoe_mode
+ clrf EEADRH
+ read_int_eeprom d'34' ; Read deco data
+ movlw d'1' ; Gauge mode
+ cpfseq EEDATA
+ bra restart_3_test_ppO2_mode; check for ppO2 mode
+ bsf gauge_mode ; Set flag for gauge mode
+ movlw d'0'
+ movwf wait_temp
+ movff wait_temp,char_I_deco_model ; Clear Flagbyte
+ return ; start in Surfacemode
+restart_3_test_ppO2_mode:
+ movlw d'2' ; const ppO2 mode
+ cpfseq EEDATA
+ bra restart_3_test_apnoe_mode; check for apnoe mode
+ bsf FLAG_const_ppO2_mode ; Set flag for ppO2 mode
+ movlw d'0'
+ movwf wait_temp
+ movff wait_temp,char_I_deco_model ; Clear Flagbyte
+ return ; start in Surfacemode
+restart_3_test_apnoe_mode:
+ movlw d'3' ; Apnoe mode
+ cpfseq EEDATA
+ bra restart_4_test_gf_mode ; check for GF OC mode
+ bsf FLAG_apnoe_mode ; Set flag for Apnoe Mode
+ movlw d'0'
+ movwf wait_temp
+ movff wait_temp,char_I_deco_model ; Clear Flagbyte
+ return ; start in Surfacemode
+restart_4_test_gf_mode:
+ movlw d'4' ; GF OC mode
+ cpfseq EEDATA
+ bra restart_5_test_gfO2_mode; check for GF CC mode
+ movlw d'1'
+ movwf wait_temp
+ movff wait_temp,char_I_deco_model ; Set Flagbyte for GF method
+ return ; start in Surfacemode
+restart_5_test_gfO2_mode:
+ movlw d'5' ; GF CC mode
+ cpfseq EEDATA
+ return ; Start in Surfacemode
+ bsf FLAG_const_ppO2_mode ; Set flag for ppO2 mode
+ movlw d'1'
+ movwf wait_temp
+ movff wait_temp,char_I_deco_model ; Set Flagbyte for GF method
+ return ; start in Surfacemode
+
+startup_screen1:
+ call PLED_ClearScreen
+ call PLED_startupscreen1 ; show startup sreen
+startup_screen1_2:
+ movlw d'10' ; timeout for startup screen
+ movwf temp1
+ WAITMS d'200'
+ bcf switch_left
+ bcf switch_right
+screen1_loop:
+ btfsc onesecupdate ; do every second tasks?
+ call set_dive_modes ; tests if depth>threshold
+ btfsc onesecupdate ; do every second tasks?
+ decf temp1,F
+ bcf onesecupdate ; every second tasks done
+
+ tstfsz temp1 ; timout occured?
+ bra screen1_loop2 ; no
+ return
+
+screen1_loop2:
+ btfsc divemode ; Divemode active?
+ return
+ btfsc switch_left ; Ack?
+ return
+ btfsc switch_right ; Ack?
+ return
+ bra screen1_loop ; loop screen
+
+startup_screen2:
+ call PLED_ClearScreen ; Page 1
+ call PLED_startupscreen2 ; show startup sreen
+ bra startup_screen1_2
+
+startup_screen3a:; WARNING: Also used for decodescriptions and CF Warning screen!
+ movwf temp1
+ WAITMS d'200'
+ bcf switch_left
+ bcf switch_right
+screen3_loop:
+ btfsc onesecupdate ; do every second tasks?
+ call set_dive_modes ; tests if depth>threshold
+
+ btfsc onesecupdate ; do every second tasks?
+ decf temp1,F
+ bcf onesecupdate ; every second tasks done
+
+ tstfsz temp1 ; timout occured?
+ bra screen3_loop2 ; no
+ return
+screen3_loop2:
+ btfsc switch_left ; Ack?
+ return
+ btfsc switch_right ; Ack?
+ return
+ bra screen3_loop ; loop screen
+
+init:
+ movlw b'01101100' ; 4MHz (x4 PLL)
+ movwf OSCCON
+
+ movlw b'00010001' ; I/O Ports
+ movwf TRISA
+ clrf PORTA
+ movlw b'00000011'
+ movwf TRISB
+ clrf PORTB
+ movlw b'11011101' ; UART
+ movwf TRISC
+ clrf PORTC
+ movlw b'00000000'
+ movwf TRISE
+ clrf PORTE
+ movlw b'00000000'
+ movwf TRISD
+ clrf PORTD
+
+ movlw b'01000000' ; Bit6: PPL enable
+ movwf OSCTUNE
+
+ movlw b'00011111' ; Timer0
+ movwf T0CON
+
+ movlw b'00000111' ; Timer1
+ movwf T1CON
+
+ movlw b'11010000' ; Interrups
+ movwf INTCON
+ movlw b'00000101'
+ movwf INTCON2
+ movlw b'00001000'
+ movwf INTCON3
+ movlw b'00100001'
+ movwf PIE1
+ movlw b'00000000'
+ movwf PIE2
+ clrf RCON
+
+ movlw b'00000000' ; A/D Converter
+ movwf ADCON0
+ movlw b'00001110'
+ movwf ADCON1
+ movlw b'10001010' ; Right justified
+ movwf ADCON2
+
+ clrf SSPCON1 ; Set IēC Mode
+ movlw b'00000000'
+ movwf SSPSTAT
+ movlw b'00101000'
+ movwf SSPCON1
+ movlw b'00000000'
+ movwf SSPCON2
+ movlw d'8' ; 400kHz I2C clock @ 16MHz Fcy
+ movwf SSPADD
+
+ clrf CCP1CON ; PWM Module off
+ clrf ECCP1CON ; PWM Module off
+
+ movlw b'00000111' ; Comperator Module off
+ movwf CMCON
+
+ movlw b'00100000'
+ movwf CANCON ; ECAN Module OFF
+
+ movlw b'00100100' ; UART
+ movwf TXSTA
+ movlw b'10010000'
+ movwf RCSTA
+ movlw b'00001000'
+ movwf BAUDCON
+ clrf SPBRGH
+ movlw d'34'
+ movwf SPBRG
+ clrf RCREG
+ clrf PIR1
+ return
diff -r 000000000000 -r 96a35aeda5f2 code_part1/OSTC_code_asm_part1/surfmode.asm
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/code_part1/OSTC_code_asm_part1/surfmode.asm Tue Jan 12 15:05:59 2010 +0100
@@ -0,0 +1,452 @@
+
+; OSTC - diving computer code
+; Copyright (C) 2008 HeinrichsWeikamp GbR
+
+; 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 3 of the License, or
+; (at your option) any later version.
+
+; This program is distributed in the hope that it will be useful,
+; but WITHOUT ANY WARRANTY; without even the implied warranty of
+; 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, see .
+
+
+; routines for Surface mode
+; written by: Matthias Heinrichs, info@heinrichsweikamp.com
+; written: 10/01/05
+; last updated: 080905
+; known bugs:
+; ToDo:
+
+surfloop:
+; Boot tasks for all modes
+ call restart_set_modes_and_flags ; Sets decomode flags
+ clrf lo
+ movff lo,char_I_const_ppO2 ; reset to standard mode, OSTC assumes Air breathing at the surface!
+
+ call PLED_brightness_full ;max. brightness
+
+ call I2CReset
+ call enable_rs232
+ call PLED_boot
+ call PLED_serial ; Show OSTC serial and firmware version
+ call PLED_clock ; display time
+ call update_date ; display date
+ movff last_surfpressure_30min+0,int_I_pres_respiration+0 ; copy surface air pressure to deco routine
+ movff last_surfpressure_30min+1,int_I_pres_respiration+1 ; 30min old values
+ movff last_surfpressure_30min+0,int_I_pres_surface+0 ; copy surface air pressure to deco routine
+ movff last_surfpressure_30min+1,int_I_pres_surface+1 ; 30min old values
+
+ btfsc gauge_mode ; Ignore in gauge mode
+ bra surfloop1
+ btfsc FLAG_apnoe_mode ; Ignore in Apnoe mode
+ bra surfloop1
+
+; Startup tasks for decompression modes
+ call PLED_desaturation_time ; display desaturation time
+ call PLED_nofly_time ; display nofly time
+ call PLED_tissue_saturation_graph ; display saturation graph
+ call PLED_active_gas_surfmode ; Show start gas
+ call PLED_display_decotype_surface ; Show deco mode (ZH-L16, const. ppO2 or Multi-GF)
+
+surfloop1:
+ btfss gauge_mode ; Display only in gauge mode
+ bra surfloop2
+ DISPLAYTEXT d'103' ; Gauge mode
+surfloop2:
+ btfss FLAG_apnoe_mode ; Display only in Apnoe mode
+ bra surfloop3
+ DISPLAYTEXT d'116' ; Apnoe mode
+
+surfloop3:
+; Startup tasks for all modes
+ clrf timeout_counter2
+ clrf timeout_counter3
+ bcf premenu ; clear premenu flag
+ bcf menubit ; clear menu flag
+ bcf pressure_refresh
+ clrf last_pressure+0
+ clrf last_pressure+1
+ clrf last_temperature+0
+ clrf last_temperature+1
+
+ movlw d'5'
+ movwf timeout_counter ; reload counter
+
+ call clear_LEDusb
+ call clear_LEDy
+ bcf simulatormode_active ; Quit simulator mode (if active)
+ bcf standalone_simulator ; Quit simulator mode (if active)
+ WIN_TOP .0
+ WIN_LEFT .0
+ WIN_FONT FT_SMALL
+ WIN_INVERT .0 ; Init new Wordprocessor
+ WIN_COLOR color_white
+ bcf switch_left
+ bcf switch_right
+ call PLED_custom_text ; Displays custom text
+ movlw d'1' ; next cf to check
+ movwf cf_checker_counter ;
+ ostc_debug 'G' ; Sends debug-information to screen if debugmode active
+ GETCUSTOM8 d'12' ; Desaturation multiplier %
+ movwf wait_temp
+ movff wait_temp,char_I_desaturation_multiplier
+ GETCUSTOM8 d'11' ; Saturation multiplier %
+ movwf wait_temp
+ movff wait_temp,char_I_saturation_multiplier
+ call deco_main_calc_desaturation_time; calculate desaturation time
+ movlb b'00000001' ; select ram bank 1
+ ostc_debug 'H' ; Sends debug-information to screen if debugmode active
+
+ call wait_switches ; Waits until switches are released, resets flag if button stays pressed!
+
+surfloop_loop:
+ btfss onesecupdate ; do every second tasks?
+ bra surfloop_loop2 ; no, loop
+
+ btfss FLAG_const_ppO2_mode ; are we in const. ppO2 mode?
+ bra surfloop_loop1 ; No
+; One Second tasks for ppO2 modes
+
+ bra surfloop_loop1 ; Do not search for sensor in CC mode
+
+
+surfloop_loop1:
+; One Second tasks for all modes
+ call PLED_clock ; update clock
+ call test_charger ; check if charger IC is active
+ call timeout_surfmode ; check timeout
+ call get_battery_voltage ; get battery voltage
+ call update_batt_voltage ; display battery voltage
+ call timeout_premenu ; timeout premenu
+ call set_leds_surfmode ; Sets Warning and No-Fly LEDs
+ call custom_functions_check_surfmode ; Checks CF functions and displays warning symbol if something critical is wrong
+ call PLED_active_gas_surfmode ; Show start gas / SetPoint
+ call PLED_display_decotype_surface ; Show deco mode
+ btfsc enter_error_sleep ; Enter Fatal Error Routine?
+ goto fatal_error_sleep ; Yes (In Sleepmode_vxx.asm!)
+ bcf onesecupdate ; every second tasks done
+
+surfloop_loop2:
+; Tasks approx. every 50ms for all modes
+ call test_switches_surfmode ; check switches
+
+; Sensor tasks for all modes
+ btfsc pressure_refresh ; new pressure available?
+ call update_surf_press ; display surface pressure
+ btfsc pressure_refresh ; new temperature available?
+ call PLED_temp_surfmode ; Displays temperature
+ btfsc pressure_refresh ; new pressure available?
+ call set_dive_modes ; tests if depth>threshold
+ bcf pressure_refresh ; until new pressure is available
+
+; One minute tasks for all modes
+ btfsc oneminupdate ; do every minute tasks
+ call update_surfloop60 ; yes, e.g. update time and date
+
+; Mode tasks
+ btfsc menubit ; Menu?
+ goto menu ; Menu!
+ btfsc divemode ; Divemode active?
+ goto diveloop ; Yes, switch into Divemode!
+ btfsc sleepmode ; Sleepmode active?
+ goto sleeploop ; Yes, switch into sleepmode!
+; Check for the different UART flags
+ btfsc dump_external_eeprom ; Start interface (dumps EEPROM BANK 0 + additional data)?
+ goto menu_interface ; Yes!
+ btfsc uart_settime ; Sync clock with PC?
+ goto sync_clock ; Yes!
+ btfsc internal_eeprom_write ; Access internal EEPROM BANK 0 via UART module
+ goto internal_eeprom_access_b0 ; Yes!
+ btfsc internal_eeprom_write2 ; Access internal EEPROM BANK 1 via UART module
+ goto internal_eeprom_access_b1 ; Yes!
+ btfsc uart_send_hash ; Send MD2 hash values
+ goto send_md2_hash ; Yes!
+ btfsc uart_compensate_temp ; Enter temp. compensation routine?
+ goto compensate_temperature ; Yes!
+ btfsc uart_send_int_eeprom ; Send internal EEPROM BANK 0
+ goto send_int_eeprom_b0 ; Yes!
+ btfsc uart_reset_decodata ; Reset Deco Data?
+ goto reset_decodata ; Yes!
+ btfsc uart_send_int_eeprom2 ; Send internal EEPROM BANK 1
+ goto send_int_eeprom_b1 ; Yes!
+ btfsc uart_store_tissue_data ; Store tissue data?`
+ goto uart_store_tissues ; Yes!
+
+ bra surfloop_loop ; loop surfacemode
+
+
+update_surfloop60:
+; One minute tasks for all modes
+ call update_date ; and date in divemode
+ call calc_deko_surfmode ; calculate desaturation every minute
+ call check_temp_extrema ; check for new temperature extremas
+ call PLED_custom_text ; Displays custom text
+ call calc_surface_interval ; Increases Surface-Interval time
+
+ btfsc gauge_mode ; Ignore in gauge mode
+ bra update_surfloop60_2
+ btfsc FLAG_apnoe_mode ; Ignore in Apnoe mode
+ bra update_surfloop60_2
+
+; One Minute tasks for deco modes
+ call PLED_nofly_time ; display nofly time
+ call PLED_desaturation_time ; display desaturation time
+ btfss premenu ; Not when "Menu?" is displayed!
+ call PLED_tissue_saturation_graph; display saturation graph
+
+update_surfloop60_2:
+ call nofly_timeout60 ; checks if nofly time is > 0
+ bcf oneminupdate
+ return
+
+nofly_timeout60:
+ bsf nofly_active ; Set flag
+ movlw d'1'
+ subwf nofly_time+0,F
+ movlw d'0'
+ subwfb nofly_time+1,F ; reduce by one
+ tstfsz nofly_time+0 ; =0?
+ return
+ tstfsz nofly_time+1 ; =0?
+ return
+ bcf nofly_active ; Clear flag
+ call clear_LEDnofly
+ incf nofly_time+0,F ; =1
+ return
+
+calc_surface_interval:
+ movff int_O_desaturation_time+0,lo ; divide by 60...
+ movff int_O_desaturation_time+1,hi
+ tstfsz lo ;=0?
+ bra calc_surface_interval2 ; No
+ tstfsz hi ;=0?
+ bra calc_surface_interval2 ; No
+ clrf surface_interval+0
+ clrf surface_interval+1 ; Clear surface interval timer
+ return
+
+calc_surface_interval2: ; Increase surface interval timer
+ movlw d'1'
+ addwf surface_interval+0,F
+ movlw d'0'
+ addwfc surface_interval+1,F
+ return
+
+set_leds_surfmode:
+ btfsc nofly_active
+ call toggle_LEDnofly
+ return
+
+calc_deko_surfmode:
+ call set_LEDg
+ ostc_debug 'I' ; Sends debug-information to screen if debugmode active
+
+ movff last_surfpressure+0,int_I_pres_surface+0 ; copy surface air pressure to deco routine
+ movff last_surfpressure+1,int_I_pres_surface+1
+ clrf wait_temp ; Use as buffer
+ movff wait_temp,char_I_He_ratio ; No He at the Surface
+ movlw d'79' ; 79% N2
+ movwf wait_temp ; Use as buffer
+ movff wait_temp,char_I_N2_ratio ; No He at the Surface
+
+ movff amb_pressure+0,int_I_pres_respiration+0 ; copy surface air pressure to deco routine
+ movff amb_pressure+1,int_I_pres_respiration+1
+ GETCUSTOM8 d'11' ; Saturation multiplier %
+ movwf wait_temp
+ movff wait_temp,char_I_saturation_multiplier
+ GETCUSTOM8 d'12' ; Desaturation multiplier %
+ movwf wait_temp
+ movff wait_temp,char_I_desaturation_multiplier
+
+ call deco_main_calc_wo_deco_step_1_m ; calculate deco in surface mode
+ movlb b'00000001' ; select ram bank 1
+ ostc_debug 'J' ; Sends debug-information to screen if debugmode active
+ call clear_LEDg
+ return
+
+
+test_charger:
+ bcf TRISC,1 ; CHRG_OUT output
+ bsf CHRG_OUT
+
+ bcf cc_active ; Constant Current mode active?
+ btfss CHRG_IN ; If CHRG_IN=0 -> CC active
+ bsf cc_active ; Constant Current mode Active!
+
+ bcf CHRG_OUT
+ bsf TRISC,1 ; CHRG_OUT high impedance
+
+ WAIT10US d'10'
+
+ bcf cv_active ; Constant Voltage mode Active?
+ btfss CHRG_IN ; If CHRG_IN=0 -> CV active
+ bsf cv_active ; Constant Voltage mode active!
+
+ bcf TRISC,1 ; CHRG_OUT output
+ bcf CHRG_OUT
+
+ btfsc cc_active
+ bra show_cc_active
+ btfsc cv_active
+ bra show_cv_active
+
+ bsf TRISC,1 ; CHRG_OUT high impedance
+
+ ; Charger inactive or ready
+ btfss charge_done ; charge done?
+ bra test_charger2 ; No, add incomplete cycle!
+
+ ; Yes, store all data for complete cycle
+ bcf charge_started ; Clear flag
+ bcf charge_done ; Clear flag
+ ; Store incomplete/total cycles
+ read_int_eeprom d'50' ; Read byte (stored in EEDATA)
+ movff EEDATA,temp1 ; Low byte
+ read_int_eeprom d'51' ; Read byte (stored in EEDATA)
+ movff EEDATA,temp2 ; high byte
+ bcf STATUS,C
+ movlw d'1'
+ addwf temp1
+ movlw d'0'
+ addwfc temp2
+ movff temp1,EEDATA
+ write_int_eeprom d'50' ; write byte stored in EEDATA
+ movff temp2,EEDATA
+ write_int_eeprom d'51' ; write byte stored in EEDATA
+
+ ; Store complete cycles
+ read_int_eeprom d'52' ; Read byte (stored in EEDATA)
+ movff EEDATA,temp1 ; Low byte
+ read_int_eeprom d'53' ; Read byte (stored in EEDATA)
+ movff EEDATA,temp2 ; high byte
+ bcf STATUS,C
+ movlw d'1'
+ addwf temp1
+ movlw d'0'
+ addwfc temp2
+ movff temp1,EEDATA
+ write_int_eeprom d'52' ; write byte stored in EEDATA
+ movff temp2,EEDATA
+ write_int_eeprom d'53' ; write byte stored in EEDATA
+ ; Store date of complete cycle
+ movff month,EEDATA
+ write_int_eeprom d'47'
+ movff day,EEDATA
+ write_int_eeprom d'48'
+ movff year,EEDATA
+ write_int_eeprom d'49'
+
+ return
+
+test_charger2:
+ btfss charge_started ; Did the charger ever start?
+ return ; No, quit!
+
+ bcf charge_started ; Clear flag
+ ; Store incomplete/total cycles
+ read_int_eeprom d'50' ; Read byte (stored in EEDATA)
+ movff EEDATA,temp1 ; Low byte
+ read_int_eeprom d'51' ; Read byte (stored in EEDATA)
+ movff EEDATA,temp2 ; high byte
+ bcf STATUS,C
+ movlw d'1'
+ addwf temp1
+ movlw d'0'
+ addwfc temp2
+ movff temp1,EEDATA
+ write_int_eeprom d'50' ; write byte stored in EEDATA
+ movff temp2,EEDATA
+ write_int_eeprom d'51' ; write byte stored in EEDATA
+ return
+
+show_cv_active: ; CV mode
+ call set_LEDr
+ WAITMS d'100'
+ call clear_LEDr
+ WAITMS d'100'
+ call set_LEDr
+ bsf charge_done ; Charge cycle finished
+ return
+
+show_cc_active: ; CC mode
+ call set_LEDr
+ bsf charge_started ; Charger started in CC mode
+ bcf charge_done ; Charge cycle not finished
+ return
+
+
+timeout_premenu:
+ btfss premenu ; is "Menu?" displayed?
+ return ; No
+ incf timeout_counter3,F ; Yes...
+ GETCUSTOM8 d'4' ; loads premenu_timeout into WREG
+ cpfsgt timeout_counter3 ; ... longer then premenu_timeout
+ return ; No!
+ bcf premenu ; Yes, so clear "Menu?" and clear pre_menu bit
+
+ call PLED_topline_box_clear ; Clears Bar at the top
+
+ btfsc gauge_mode
+ bra timeout_premenu2 ; Skip in Gauge mode
+ btfsc FLAG_apnoe_mode
+ bra timeout_premenu2 ; Skip in Apnoe mode
+ call PLED_tissue_saturation_graph ; rewrite graph
+timeout_premenu2:
+ call update_surf_press ; rewrite serial number
+ call PLED_serial ; rewrite serial number
+ clrf timeout_counter3 ; Also clear timeout
+ bcf switch_left ; and debounce switches
+ bcf switch_right
+ return
+
+test_switches_surfmode: ; checks switches in surfacemode
+ btfsc switch_left
+ bra test_switches_surfmode2
+ btfsc switch_right
+ bra test_switches_surfmode3
+
+ ; No button press, reset timer0
+ bcf T0CON,TMR0ON ; Stop Timer 0
+ bcf INTCON,TMR0IF ; Clear flag
+ clrf TMR0H
+ clrf TMR0L
+ bcf INTCON,INT0IF ; Clear flag
+ bcf INTCON3,INT1IF ; Clear flag
+ return
+
+test_switches_surfmode3:
+ bcf switch_right
+ call PLED_topline_box ; Write a filled bar at the top
+ WIN_INVERT .1 ; Init new Wordprocessor
+ DISPLAYTEXT .4 ;Menu?
+ WIN_INVERT .0 ; Init new Wordprocessor
+ bsf premenu
+ clrf timeout_counter2
+ return
+
+test_switches_surfmode2:
+ bcf switch_left
+ btfss premenu
+ return
+ bsf menubit ; Enter Menu!
+ return
+
+
+
+timeout_surfmode:
+ incf timeout_counter2,F ; increase timeout counter
+ GETCUSTOM8 d'3' ; loads surfloop_timeout into WREG
+ addlw d'5' ; adds five seconds in case timout=zero!
+ btfsc STATUS,C ; > 255?
+ movlw d'255' ; Set to 255...
+ decf WREG,F ; Limit to 254
+ cpfsgt timeout_counter2 ; Compare with timeout_counter2
+ return ; return, no timeout
+ bsf sleepmode ; Set Flag
+ return ; Return
diff -r 000000000000 -r 96a35aeda5f2 code_part1/OSTC_code_asm_part1/sync_clock.asm
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/code_part1/OSTC_code_asm_part1/sync_clock.asm Tue Jan 12 15:05:59 2010 +0100
@@ -0,0 +1,124 @@
+
+; OSTC - diving computer code
+; Copyright (C) 2008 HeinrichsWeikamp GbR
+
+; 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 3 of the License, or
+; (at your option) any later version.
+
+; This program is distributed in the hope that it will be useful,
+; but WITHOUT ANY WARRANTY; without even the implied warranty of
+; 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, see .
+
+
+; Syncs RTC with PC
+; written by: Matthias Heinrichs, info@heinrichsweikamp.com
+; written: 13/10/07
+; last updated: 08/08/31
+; known bugs:
+; ToDo:
+
+; routine echoes the "b" command as ready signal
+; PC has to send 6 bytes
+; Byte1: hours
+; Byte2: minutes
+; Byte3: seconds
+; Byte4: month
+; Byte5: day
+; Byte6: year
+; All bytes will be checked for plausibility and the clock will be set
+; after a timeout of about 20ms, the routine ends
+
+sync_clock:
+ bcf uart_settime ; clear flag
+ bcf PIE1,RCIE ; no interrupt for UART
+ call set_LEDusb ; LEDusb ON
+ bcf PIR1,RCIF ; clear flag
+
+ movlw "b" ; send echo
+ movwf TXREG
+ call rs232_wait_tx ; wait for UART
+
+ call rs232_get_byte ; hours
+ movff RCREG, hours
+
+ movlw d'24'
+ cpfslt hours
+ clrf hours
+
+ call rs232_get_byte ; minutes
+ movff RCREG, mins
+
+ movlw d'60'
+ cpfslt mins
+ clrf mins
+
+ call rs232_get_byte ; seconds
+ movff RCREG, secs
+
+ movlw d'60'
+ cpfslt secs
+ clrf secs
+
+ call rs232_get_byte ; month
+ movff RCREG, month
+
+ movlw d'12'
+ cpfsgt month
+ bra sync_clock0
+ movwf month
+
+sync_clock0:
+ call rs232_get_byte ; day
+ movff RCREG, day
+
+ movff month,lo ; new month
+ dcfsnz lo,F
+ movlw .31
+ dcfsnz lo,F
+ movlw .28
+ dcfsnz lo,F
+ movlw .31
+ dcfsnz lo,F
+ movlw .30
+ dcfsnz lo,F
+ movlw .31
+ dcfsnz lo,F
+ movlw .30
+ dcfsnz lo,F
+ movlw .31
+ dcfsnz lo,F
+ movlw .31
+ dcfsnz lo,F
+ movlw .30
+ dcfsnz lo,F
+ movlw .31
+ dcfsnz lo,F
+ movlw .30
+ dcfsnz lo,F
+ movlw .31
+ cpfsgt day ; day ok?
+ bra sync_clock1 ; OK
+ movlw .1 ; not OK, set to 1st
+ movwf day
+
+sync_clock1:
+ call rs232_get_byte ; year
+ movff RCREG, year
+
+ movlw d'100'
+ cpfslt year
+ clrf year
+
+ call clear_LEDusb ; LEDusb OFF
+ bcf PIR1,RCIF ; clear flag
+ bsf oneminupdate ; set flag, so new time and date will be updated in surfacemode at once
+ bsf PIE1,RCIE ; enable interrupt for UART
+ goto surfloop_loop ; return to surface loop
+
+
diff -r 000000000000 -r 96a35aeda5f2 code_part1/OSTC_code_asm_part1/temp_extrema.asm
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/code_part1/OSTC_code_asm_part1/temp_extrema.asm Tue Jan 12 15:05:59 2010 +0100
@@ -0,0 +1,69 @@
+
+; OSTC - diving computer code
+; Copyright (C) 2008 HeinrichsWeikamp GbR
+
+; 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 3 of the License, or
+; (at your option) any later version.
+
+; This program is distributed in the hope that it will be useful,
+; but WITHOUT ANY WARRANTY; without even the implied warranty of
+; 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, see .
+
+
+; takes care of the temperature extrema routine
+; written by: Matthias Heinrichs, info@heinrichsweikamp.com
+; written: 05/15/08
+; last updated: 05/15/08
+; known bugs:
+; ToDo:
+
+check_temp_extrema: ; called once every minute from Sleeploop, Surfloop and Diveloop
+ read_int_eeprom d'54' ; get lowest temperature so far
+ movff EEDATA,sub_b+0
+ read_int_eeprom d'55'
+ movff EEDATA,sub_b+1
+ movff temperature+0,sub_a+0
+ movff temperature+1,sub_a+1
+ call sub16 ; sub_c = sub_a - sub_b
+ btfss neg_flag ; new lowest temperature ?
+ bra check_temp_extrema_high
+ ; Yes, store new value together with the date
+ movff temperature+0,EEDATA
+ write_int_eeprom d'54'
+ movff temperature+1,EEDATA
+ write_int_eeprom d'55'
+ movff month,EEDATA
+ write_int_eeprom d'56'
+ movff day,EEDATA
+ write_int_eeprom d'57'
+ movff year,EEDATA
+ write_int_eeprom d'58'
+ ; Now check high extrema
+check_temp_extrema_high:
+ read_int_eeprom d'59' ; get highest temperature so far
+ movff EEDATA,sub_b+0
+ read_int_eeprom d'60'
+ movff EEDATA,sub_b+1
+ movff temperature+0,sub_a+0
+ movff temperature+1,sub_a+1
+ call sub16 ; sub_c = sub_a - sub_b
+ btfsc neg_flag ; new highest temperature ?
+ return ; no, quit!
+ ; Yes, store new value together with the date
+ movff temperature+0,EEDATA
+ write_int_eeprom d'59'
+ movff temperature+1,EEDATA
+ write_int_eeprom d'60'
+ movff month,EEDATA
+ write_int_eeprom d'61'
+ movff day,EEDATA
+ write_int_eeprom d'62'
+ movff year,EEDATA
+ write_int_eeprom d'63'
+ return
\ No newline at end of file
diff -r 000000000000 -r 96a35aeda5f2 code_part1/OSTC_code_asm_part1/tempcomp.asm
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/code_part1/OSTC_code_asm_part1/tempcomp.asm Tue Jan 12 15:05:59 2010 +0100
@@ -0,0 +1,81 @@
+
+; OSTC - diving computer code
+; Copyright (C) 2008 HeinrichsWeikamp GbR
+
+; 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 3 of the License, or
+; (at your option) any later version.
+
+; This program is distributed in the hope that it will be useful,
+; but WITHOUT ANY WARRANTY; without even the implied warranty of
+; 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, see .
+
+
+; routine for extra temperature compensation
+; written by: Matthias Heinrichs, info@heinrichsweikamp.com
+; written: 01/12/08
+; last updated: 08/08/31
+; known bugs:
+; ToDo:
+
+; routine echoes the "f" command as ready signal
+; PC has to send 2 bytes containing the actual temperature in 0.1C
+; Byte1: low
+; Byte2: high
+
+
+compensate_temperature:
+ bcf uart_compensate_temp ; clear flag
+ bcf PIE1,RCIE ; no interrupt for UART
+ call set_LEDusb ; LEDusb ON
+ bcf PIR1,RCIF ; clear flag
+
+ movlw "f" ; send echo
+ movwf TXREG
+ call rs232_wait_tx ; wait for UART
+
+ call rs232_get_byte ; low byte
+ movff RCREG, lo
+
+ call rs232_get_byte ; high byte
+ movff RCREG, hi
+
+ clrf temperature_correction ; wait for uncompensated temperature value!
+ WAITMS d'250' ; wait for new temperature
+ WAITMS d'250'
+ WAITMS d'250'
+ WAITMS d'250'
+
+ movff lo,sub_a+0 ; calculate difference
+ movff hi,sub_a+1
+ movff temperature+0, sub_b+0
+ movff temperature+1, sub_b+1
+ call sub16 ; sub_c = sub_a - sub_b
+
+ movf sub_c+0,W
+ btfsc neg_flag ; compensate negative?
+ movlw d'0' ; use zero compensation!
+ movwf sub_c+0
+
+ movff sub_c+0,TXREG ; Send answer
+
+ movff sub_c+0,EEDATA ; store low byte only!
+ movff sub_c+0,temperature_correction ; no reboot required then...
+ movlw 0x01
+ movwf EEADRH
+ movlw 0x00
+ movwf EEADR
+ call write_eeprom ; stores in internal eeprom
+
+ movlw 0x00
+ movwf EEADRH ; reset high address byte
+
+ call clear_LEDusb ; LEDusb OFF
+ bcf PIR1,RCIF ; clear flag
+ bsf PIE1,RCIE ; enable interrupt for UART
+ goto surfloop_loop ; return to surface loop
diff -r 000000000000 -r 96a35aeda5f2 code_part1/OSTC_code_asm_part1/text_table.asm
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/code_part1/OSTC_code_asm_part1/text_table.asm Tue Jan 12 15:05:59 2010 +0100
@@ -0,0 +1,720 @@
+
+; OSTC - diving computer code
+; Copyright (C) 2008 HeinrichsWeikamp GbR
+
+; 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 3 of the License, or
+; (at your option) any later version.
+
+; This program is distributed in the hope that it will be useful,
+; but WITHOUT ANY WARRANTY; without even the implied warranty of
+; 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, see .
+
+
+; hold texts and parameters for the texts
+; written by: Matthias Heinrichs, info@heinrichsweikamp.com
+; written: 10/13/07
+; last updated: 05/24/08
+; known bugs:
+; ToDo:
+
+; Textlengths
+; The length table helps to find the texts much faster
+
+ ORG 0x0100
+ DB .0,.18,.16,.24,.6,.6 ; nu, t1, t2, t3, t4, t5
+ DB .8,.10,.10,.12,.6,.6 ; t6, t7, t8, t9, t10, t11
+ DB .8,.10,.6,.10,.6,.6 ; t12, t13, t14, t15, t16, t17
+ DB .8,.8,.6,.14,.6,.6 ; t18, t19, t20, t21, t22, t23
+ DB .10,.10,.8,.20,.12,.10 ; t24, t25, t26, t27, t28, t29
+ DB .6,.10,.8,.6,.6,.6 ; t30, t31, t32, t33, t34, t35
+; 32 Custom funtion descriptors with length 16
+ DB .16,.16,.16,.16
+ DB .16,.16,.16,.16
+ DB .16,.16,.16,.16
+ DB .16,.16,.16,.16
+ DB .16,.16,.16,.16
+ DB .16,.16,.16,.16
+ DB .16,.16,.16,.16
+ DB .16,.16,.16,.16
+; Licence
+ DB .16,.20,.22,.20 ; t68, t69, t70, t71
+ DB .22,.18,.12,.20 ; t72, t73, t74, t75
+ DB .14,.20,.20,.20 ; t76, t77, t78, t79
+ DB .14,.24 ; t80, t81
+; end of licence
+
+ DB .10,.6,.8,.8,.10,.6 ; t82, t83, t84, t85, t86, t87
+ DB .12,.10,.8,.8,.8,.8 ; t88, t89, t90, t91, t92, t93
+ DB .6,.6,.4,.10,.12,.18 ; t94, t95, t96, t97, t98, t99
+ DB .10,.10,.10,.6,.10,.14 ;t100,t101,t102,t103,t104,t105
+ DB .20,.8,.8,.6,.18,.20 ;t106,t107,t108,t109,t110,t111
+ DB .4,.14,.20,.8,.6,.16 ;t112,t113,t114,t115,t116,117
+ DB .14,.12,.6,.6,.8,.6 ;t118,t119,t120,t121,t122,123
+ DB .6,.6,.6,.6,.8,.8 ;t124,t125,t126,t127,t128,129
+ DB .4,.4,.10,.22,.22,.22 ;t130,t131,t132,t133,134,135
+ DB .20,.8,.10,.8,.8,.6 ;t136;t137;t138;t139;t140;t141
+ DB .6,.10,.8,.8,.4,.10 ;t142;t143;t144;t145;t146;t147
+ DB .14,.20,.10,.12,.10,.20 ;t148;t149;t150;t151;t152;t153
+; 32 Custom funtion descriptors with length 16
+ DB .16,.16,.16,.16
+ DB .16,.16,.16,.16
+ DB .16,.16,.16,.16
+ DB .16,.16,.16,.16
+ DB .16,.16,.16,.16
+ DB .16,.16,.16,.16
+ DB .16,.16,.16,.16
+ DB .16,.16,.16,.16
+; 32 Custom funtion descriptors with length 16
+ DB .20,.16,.18,.14,.8,.8 ;t186;t187;t188;t189;t190;t191
+ DB .6,.20,.20,.20,.20,.20 ;t192;t193;t194;t195;t196;t197
+ DB .20,.20,.20,.20,.20,.20 ;t198......t203
+ DB .20,.20,.20,.20,.20,.20 ;t204......t209
+ DB .20,.20,.20,.20,.20,.20 ;t210......t215
+ DB .20,.20,.20,.20,.20,.20 ;t216......t221
+ DB .20,.20,.20,.20,.20,.20 ;t222......t227
+ DB .20,.20,.20,.20,.20,.20 ;t228......t233
+ DB .20,.20,.10,.10,.10,.8 ;t234;t235;t236;t237;t238;t239
+ DB .8,.8,.8,.14,.6,.20 ;t240;t241;t242;t243;t244;t245
+ DB .16,.10,.16,.12,.6,.6 ;t246;t247;t248;t249;t250;t251
+ DB .6,.6,.6,.8 ;t252;t253;t254;t255
+
+; Text Bank2 (Texts 256-511):
+ DB .2,.14,.14,.8,.8,.8 ;t256;t257;t258;t259;t260;t261
+ DB .6,.6,.6,.6,.10,.10 ;t262;t263;t264;t265;t266;t267
+ DB .4,.8,.4,.14,.20,.18 ;t268;t269;t270;t271;t272;t273
+ DB .20,.14,.10,.14,.12,.16 ;t274;t275;t276;t277;t278;t279
+ DB .14,.10,.10,.10,.14,.12 ;t280;t281;t282;t283;t284;t285
+ DB .16 ;t286
+
+; Textpositions, Y-scale and color
+; Example: DB .4,.2,.1,.255 ; COLUMN=4,ROW=2,Y-Scale=1, color=255
+
+; Textpositions pointer -4 !!
+#DEFINE textpos_pointer_high 0x02
+#DEFINE textpos_pointer_low 0xFC
+
+ ORG 0x0300
+ DB .0,.0,.1,.15 ;1
+ DB .0,.25,.1,.15 ;2
+ DB .0,.2,.1,.15 ;3
+ DB .65,.2,.1,.15 ;4
+ DB .65,.2,.1,.15 ;5
+ DB .20,.35,.1,.15 ;6
+ DB .20,.65,.1,.15 ;7
+ DB .20,.35,.1,.15 ;8
+ DB .20,.95,.1,.15 ;9
+ DB .20,.125,.1,.15 ;10
+ DB .20,.185,.1,.15 ;11
+ DB .115,.2,.1,.15 ;12
+ DB .0,.24,.1,.15 ;13
+ DB .0,.0,.1,.15 ;14
+ DB .50,.2,.1,.15 ;15
+ DB .10,.30,.1,.15 ;16
+ DB .10,.55,.1,.15 ;17
+ DB .10,.80,.1,.15 ;18
+ DB .10,.105,.1,.15 ;19
+ DB .10,.130,.1,.15 ;20
+ DB .20,.35,.1,.15 ;21
+ DB .32,.65,.1,.15 ;22
+ DB .32,.95,.1,.15 ;23
+ DB .32,.155,.1,.15 ;24
+ DB .6,.0,.1,.15 ;25
+ DB .55,.2,.1,.15 ;26
+ DB .14,.2,.1,.15 ;27
+ DB .40,.2,.1,.15 ;28
+ DB .50,.2,.1,.15 ;29
+ DB .20,.35,.1,.15 ;30
+ DB .100,.0,.1,.15 ;31
+ DB .100,.25,.1,.15 ;32
+ DB .100,.75,.1,.15 ;33
+ DB .100,.100,.1,.15 ;34
+ DB .0,.0,.1,.15 ;35
+
+; 32 Custom funtion descriptors wi.12th Column=5, row=8, Y-scale=1, greyvalue=15
+ DB .40,.35,.1,.15
+ DB .40,.35,.1,.15
+ DB .40,.35,.1,.15
+ DB .40,.35,.1,.15
+ DB .40,.35,.1,.15
+ DB .40,.35,.1,.15
+ DB .40,.35,.1,.15
+ DB .40,.35,.1,.15
+ DB .40,.35,.1,.15
+ DB .40,.35,.1,.15
+ DB .40,.35,.1,.15
+ DB .40,.35,.1,.15
+ DB .40,.35,.1,.15
+ DB .40,.35,.1,.15
+ DB .40,.35,.1,.15
+ DB .40,.35,.1,.15
+ DB .40,.35,.1,.15
+ DB .40,.35,.1,.15
+ DB .40,.35,.1,.15
+ DB .40,.35,.1,.15
+ DB .40,.35,.1,.15
+ DB .40,.35,.1,.15
+ DB .40,.35,.1,.15
+ DB .40,.35,.1,.15
+ DB .40,.35,.1,.15
+ DB .40,.35,.1,.15
+ DB .40,.35,.1,.15
+ DB .40,.35,.1,.15
+ DB .40,.35,.1,.15
+ DB .40,.35,.1,.15
+ DB .40,.35,.1,.15
+ DB .40,.35,.1,.15
+;licence:
+ DB .0,.35,.1,.15 ;68
+ DB .0,.65,.1,.15 ;69
+ DB .0,.95,.1,.15 ;70
+ DB .0,.125,.1,.15 ;71
+ DB .0,.155,.1,.15 ;72
+ DB .0,.185,.1,.15 ;73
+ DB .0,.215,.1,.15 ;74
+ DB .0,.35,.1,.15 ;75
+ DB .0,.65,.1,.15 ;76
+ DB .0,.95,.1,.15 ;77
+ DB .0,.125,.1,.15 ;78
+ DB .0,.155,.1,.15 ;79
+ DB .0,.185,.1,.15 ;80
+ DB .0,.215,.1,.15 ;81
+; end of licence
+
+ DB .102,.150,.1,.15 ;82 Decostop
+ DB .0,.0,.1,.15 ;83
+ DB .108,.216,.1,.15 ;84 No Stop
+ DB .108,.216,.1,.15 ;85 Decosum
+ DB .100,.0,.1,.15 ;86 Divetime
+ DB .0,.0,.1,.15 ;87 Depth
+ DB .0,.0,.1,.15 ;88
+ DB .0,.0,.1,.15 ;89
+ DB .0,.0,.1,.15 ;90
+ DB .0,.0,.1,.15 ;91
+ DB .0,.0,.1,.15 ;92
+ DB .0,.0,.1,.15 ;93
+ DB .0,.0,.1,.15 ;94
+ DB .0,.0,.1,.15 ;95
+ DB .0,.0,.1,.15 ;96
+ DB .0,.0,.1,.15 ;97
+ DB .40,.2,.1,.15 ;98
+ DB .20,.35,.1,.15 ;99
+ DB .20,.125,.1,.15 ;100
+ DB .85,.125,.1,.15 ;101
+ DB .85,.125,.1,.15 ;102
+ DB .85,.125,.2,.15 ;103
+ DB .85,.125,.1,.15 ;104
+ DB .0,.0,.1,.15 ;105
+ DB .10,.2,.1,.15 ;106
+ DB .0,.0,.1,.15 ;107
+ DB .0,.0,.1,.15 ;108
+ DB .20,.35,.1,.15 ;109
+ DB .20,.65,.1,.15 ;110
+ DB .14,.2,.1,.15 ;111
+ DB .0,.0,.1,.15 ;112
+ DB .20,.95,.1,.15 ;113
+ DB .10,.2,.1,.15 ;114
+ DB .0,.9,.1,.15 ;115
+ DB .85,.125,.2,.15 ;116
+ DB .0,.18,.1,.15 ;117
+ DB .0,.27,.1,.15 ;118
+ DB .0,.36,.1,.15 ;119
+ DB .0,.45,.1,.15 ;120
+ DB .0,.54,.1,.15 ;121
+ DB .100,.50,.1,.15 ;122
+ DB .100,.25,.1,.15 ;123
+ DB .100,.50,.1,.15 ;124
+ DB .100,.75,.1,.15 ;125
+ DB .100,.100,.1,.15 ;126
+ DB .100,.0,.1,.15 ;127
+ DB .100,.25,.1,.15 ;128
+ DB .20,.65,.1,.15 ;129
+ DB .65,.65,.1,.15 ;130
+ DB .65,.65,.1,.15 ;131
+ DB .100,.50,.1,.15 ;132
+ DB .10,.0,.1,.15 ;133 Debug intro
+ DB .10,.25,.1,.15 ;134
+ DB .10,.50,.1,.15 ;135
+ DB .10,.75,.1,.15 ;136 /Debug Intro
+ DB .100,.50,.1,.15 ;137 Bailout
+ DB .85,.125,.1,.15 ;138
+ DB .105,.120,.1,.15 ;139 Descent
+ DB .105,.60,.1,.15 ;140 Surface
+ DB .65,.2,.1,.15 ;141
+ DB .20,.155,.1,.15 ;142
+ DB .42,.72,.1,.15 ;143 Confirm:
+ DB .60,.2,.1,.15 ;144
+ DB .52,.96,.1,.15 ;145 Cancel
+ DB .52,.120,.1,.15 ;146 OK!
+ DB .100,.75,.1,.15 ;147 Stopwatch
+ DB .0,.0,.1,.15 ;148
+ DB .0,.8,.1,.15 ;149
+ DB .2,.39,.1,.15 ;150
+ DB .2,.48,.1,.15 ;151
+ DB .85,.125,.1,.15 ;152
+ DB .20,.65,.1,.15 ;153
+; 32 Custom funtion descriptors with Column=5, row=8, Y-scale=1, greyvalue=15
+ DB .40,.35,.1,.15
+ DB .40,.35,.1,.15
+ DB .40,.35,.1,.15
+ DB .40,.35,.1,.15
+ DB .40,.35,.1,.15
+ DB .40,.35,.1,.15
+ DB .40,.35,.1,.15
+ DB .40,.35,.1,.15
+ DB .40,.35,.1,.15
+ DB .40,.35,.1,.15
+ DB .40,.35,.1,.15
+ DB .40,.35,.1,.15
+ DB .40,.35,.1,.15
+ DB .40,.35,.1,.15
+ DB .40,.35,.1,.15
+ DB .40,.35,.1,.15
+ DB .40,.35,.1,.15
+ DB .40,.35,.1,.15
+ DB .40,.35,.1,.15
+ DB .40,.35,.1,.15
+ DB .40,.35,.1,.15
+ DB .40,.35,.1,.15
+ DB .40,.35,.1,.15
+ DB .40,.35,.1,.15
+ DB .40,.35,.1,.15
+ DB .40,.35,.1,.15
+ DB .40,.35,.1,.15
+ DB .40,.35,.1,.15
+ DB .40,.35,.1,.15
+ DB .40,.35,.1,.15
+ DB .40,.35,.1,.15
+ DB .40,.35,.1,.15 ;185
+; 32 Custom funtion descriptors with Column=5, row=8, Y-scale=1, greyvalue=15
+ DB .13,.2,.1,.15 ;186
+ DB .0,.0,.0,.0 ;187
+ DB .2,.1,.1,.15 ;188
+ DB .2,.48,.1,.15 ;189
+ DB .0,.0,.1,.15 ;190
+ DB .0,.0,.1,.15 ;191
+ DB .0,.0,.1,.15 ;192
+; Mode descriptions (6x)
+ DB .0,.35,.1,.15
+ DB .0,.65,.1,.15
+ DB .0,.95,.1,.15
+ DB .0,.125,.1,.15
+ DB .0,.155,.1,.15
+ DB .0,.185,.1,.15
+ DB .0,.215,.1,.15
+
+ DB .0,.35,.1,.15
+ DB .0,.65,.1,.15
+ DB .0,.95,.1,.15
+ DB .0,.125,.1,.15
+ DB .0,.155,.1,.15
+ DB .0,.185,.1,.15
+ DB .0,.215,.1,.15
+
+ DB .0,.35,.1,.15
+ DB .0,.65,.1,.15
+ DB .0,.95,.1,.15
+ DB .0,.125,.1,.15
+ DB .0,.155,.1,.15
+ DB .0,.185,.1,.15
+ DB .0,.215,.1,.15
+
+ DB .0,.35,.1,.15
+ DB .0,.65,.1,.15
+ DB .0,.95,.1,.15
+ DB .0,.125,.1,.15
+ DB .0,.155,.1,.15
+ DB .0,.185,.1,.15
+ DB .0,.215,.1,.15
+
+ DB .0,.35,.1,.15
+ DB .0,.65,.1,.15
+ DB .0,.95,.1,.15
+ DB .0,.125,.1,.15
+ DB .0,.155,.1,.15
+ DB .0,.185,.1,.15
+ DB .0,.215,.1,.15
+
+ DB .0,.35,.1,.15
+ DB .0,.65,.1,.15
+ DB .0,.95,.1,.15
+ DB .0,.125,.1,.15
+ DB .0,.155,.1,.15
+ DB .0,.185,.1,.15
+ DB .0,.215,.1,.15 ;234
+
+ DB .10,.2,.1,.15 ;235
+ DB .85,.125,.1,.15 ;236
+ DB .2,.12,.1,.15 ;237
+ DB .100,.25,.1,.15 ;238 SetPoint
+ DB .100,.0,.1,.15 ;239 No Deco (non-GF)
+ DB .100,.0,.1,.15 ;240
+ DB .100,.25,.1,.15 ;241 Display
+ DB .100,.0,.1,.15 ;242 No Deco (GF)
+ DB .2,.12,.1,.15 ;243
+ DB .100,.100,.1,.15 ;244 Exit
+ DB .20,.65,.1,.15 ;245
+ DB .2,.30,.1,.15 ;246
+ DB .20,.125,.1,.15 ;247 Simulator
+ DB .30,.2,.1,.15 ;248
+ DB .20,.35,.1,.15 ;249
+ DB .100,.25,.1,.15 ;250 Divemode_Simulator_Menu
+ DB .100,.50,.1,.15 ;251
+ DB .100,.75,.1,.15 ;252
+ DB .100,.100,.1,.15 ;253
+ DB .100,.0,.1,.15 ;254 Divemode_Simulator_Menu
+ DB .100,.50,.1,.15 ;255 free
+
+; Text Bank2 (Texts 256-511):
+ DB .0,.0,.0,.15 ;256
+ DB .20,.35,.1,.15 ;257
+ DB .40,.2,.1,.15 ;258
+ DB .105,.35,.1,.15 ;259
+ DB .105,.35,.1,.15 ;260
+ DB .105,.35,.1,.15 ;261
+ DB .1,.1,.1,.15 ;262
+ DB .65,.168,.1,.15 ;263 Bail
+ DB .7,.48,.1,.11 ;264
+ DB .120,.135,.1,.15 ;265
+ DB .2,.39,.1,.15 ;266
+ DB .0,.216,.1,.15 ;267
+ DB .10,.8,.1,.15 ;268
+ DB .10,.16,.1,.15 ;269
+ DB .0,.0,.1,.15 ;270
+
+ DB .24,.2,.1,.15 ;271
+ DB .0,.35,.1,.15 ;272
+ DB .0,.65,.1,.15 ;273
+ DB .0,.125,.1,.15 ;274
+ DB .0,.155,.1,.15 ;275
+ DB .20,.95,.1,.15 ;276
+
+ DB .20,.65,.1,.15 ;277
+ DB .20,.95,.1,.15 ;278
+ DB .20,.125,.1,.15 ;279
+ DB .20,.155,.1,.15 ;280
+
+ DB .100,.50,.1,.15 ;281
+ DB .100,.0,.1,.15 ;282
+ DB .90,.54,.1,.15 ;283 Stopwatch
+ DB .20,.95,.1,.15 ;284
+ DB .20,.125,.1,.15 ;285
+
+ DB .20,.155,.1,.15 ;286
+
+; stores texts, texts must have even length and must end with "}"
+#DEFINE text_pointer_high 0x07
+#DEFINE text_pointer_low 0xB0
+
+ ORG 0x007B0
+
+ DA "Building MD2 Hash}" ;1
+ DA "Please Wait...}}" ;2
+ DA "HeinrichsWeikamp OSTC2}}";3
+ DA "Menu?}" ;4 l=6
+ DA "Menu:}" ;5
+ DA "Logbook}" ;6
+ DA "Gas Setup}" ;7
+ DA "Set Time}}" ;8
+ DA "Reset Menu}}" ;9 l=12
+ DA "Setup}" ;10 l=6
+ DA "Exit}}" ;11
+ DA "Wait..}}" ;12
+ DA "MD2 Hash:}" ;13
+ DA "Desat}" ;14 l=6
+ DA "Interface}" ;15
+ DA "Start}" ;16
+ DA "Data}}" ;17
+ DA "Header}}" ;18
+ DA "Profile}" ;19
+ DA "Done.}" ;20
+ DA "Cancel Reset}}" ;21 l=14
+ DA "Time:}" ;22
+ DA "Date:}" ;23
+ DA "Set Hours}" ;24
+ DA "Reset...}}" ;25
+ DA "Logbook}" ;26
+ DA "Custom Functions I}}" ;27 l=20
+ DA "Reset Menu}}" ;28 l=12
+ DA "Set Time:}" ;29
+ DA "More}}" ;30 l=6
+ DA "Decoplan}}" ;31
+ DA "Gaslist}" ;32 l=8
+ DA "More}}" ;33 l=6
+ DA "Exit}}" ;34
+ DA "NoFly}" ;35 l=6
+; 32 custom function descriptors with length=16!
+ DA "Start Dive [cm]}" ;36 l=16
+ DA "End Dive [cm]}" ;37
+ DA "End Delay [s]}" ;38
+ DA "Power Off [s]}" ;39
+ DA "Pre-menu [s]}" ;40
+ DA "velocity[m/min]}" ;41
+ DA "Wake-up [mBar]}" ;42
+ DA "max.Surf.[mBar]}" ;43
+ DA "GF display [%]}" ;44
+ DA "min. O2 Dis.[%]}" ;45
+ DA "Dive menus [s]}" ;46
+ DA "Saturate x [%]}" ;47
+ DA "Desaturate x[%]}" ;48
+ DA "NoFly Ratio [%]}" ;49
+ DA "GF alarm 1 [%]}" ;50
+ DA "GF alarm 2 [%]}" ;51
+ DA "Deco Offset[dm]}" ;52
+ DA "ppO2 low [cBar]}" ;53
+ DA "ppO2 high[cBar]}" ;54
+ DA "show ppO2[cBar]}" ;55
+ DA "sampling rate }" ;56
+ DA "Divisor Temp }" ;57
+ DA "Divisor Decodat}" ;58
+ DA "Divisor NotUse0}" ;59
+ DA "Divisor ppO2 }" ;60
+ DA "Divisor Debug }" ;61
+ DA "Divisor NotUse2}" ;62
+ DA "show CNS [%]}" ;63
+ DA "Logbook offset }" ;64
+ DA "Last Deco at[m]}" ;65
+ DA "End Apnoe [min]}" ;66
+ DA "Show Vbatt [=1]}" ;67
+;licence
+ DA "This program is}" ;68 l=16
+ DA "distributed in the}}" ;69 l=20
+ DA "hope that it will be}}";70 l=22
+ DA "useful, but WITHOUT}" ;71 l=20
+ DA "ANY WARRANTY; without}";72 l=22
+ DA "even the implied}}" ;73 l=18
+ DA "warranty of}" ;74 l=12
+ DA "MERCHANTABILITY or}}" ;75 l=20
+ DA "FITNESS FOR A}" ;76 l=14
+ DA "PARTICULAR PURPOSE.}" ;77 l=20
+ DA "See the GNU General}" ;78 l=20
+ DA "Public License for}}" ;79 l=20
+ DA "more details:}" ;80 l=14
+ DA "www.heinrichsweikamp.de}";81 l=24
+; end of licence
+ DA "Decostop}}" ;82 l=10
+ DA "m/min}" ;83 l=6
+ DA "No Stop}" ;84 l=8
+ DA "Decosum}" ;85 l=8
+ DA "Divetime}}" ;86 l=10
+ DA "Depth}" ;87 l=6
+ DA "First Gas?}}" ;88 l=12
+ DA "Default:}}" ;89 l=10
+ DA "Minutes}" ;90 l=8
+ DA "Month }" ;91 l=8
+ DA "Day }" ;92 l=8
+ DA "Year }" ;93 l=8
+ DA "Set }}" ;94 l=6
+ DA "Gas# }" ;95 l=6
+ DA "Yes}" ;96 l=4
+ DA "Current:}}" ;97 l=10
+ DA "Setup Menu:}" ;98 l=12
+ DA "Custom FunctionsI}" ;99 l=18
+ DA "Decotype:}" ;100 l=10
+ DA "ZH-L16 OC}" ;101 l=10
+ DA "Gauge }" ;102 l=10
+ DA "Gauge}" ;103 l=6
+ DA "ZH-L16 CC}" ;104 l=10
+ DA "Active Gas? }}" ;105 l=14
+ DA "Gas Setup - Gaslist}" ;106 l=20
+ DA "Depth +}" ;107 l=8
+ DA "Depth -}" ;108 l=8
+ DA "Back}}" ;109 l=6
+ DA "Const. ppO2 Setup}" ;110 l=18
+ DA "Constant ppO2 Setup}" ;111 l=20
+ DA "SP#}" ;112 l=4
+ DA "Battery Info}}" ;113 l=14
+ DA "Battery Information}" ;114 l=20
+ DA "Cycles:}" ;115 l=8
+ DA "Apnoe}" ;116 l=6
+ DA "Last Complete:}}" ;117 l=16
+ DA "Lowest Vbatt:}" ;118 l=14
+ DA "Lowest at:}}" ;119 l=12
+ DA "Tmin:}" ;120 l=6
+ DA "Tmax:}" ;121 l=6
+ DA "Set Gas}" ;122 l=8
+ DA "O2 +}}" ;123 l=6
+ DA "O2 -}}" ;124 l=6
+ DA "He +}}" ;125 l=6
+ DA "He -}}" ;126 l=6
+ DA "Exit}}" ;127 l=6
+ DA "Delete}}" ;128 l=8
+ DA "Debug:}}" ;129 l=8
+ DA "ON }" ;130 l=4
+ DA "OFF}" ;131 l=4
+ DA "Del. all}}" ;132 l=10
+ DA "Unexpected reset from}";133 l=22
+ DA "Divemode! Please help}";134 l=22
+ DA "and report the Debug }";135 l=22
+ DA "Information below!}}" ;136 l=20
+ DA "Bailout}" ;137 l=8
+ DA "Apnoe }" ;138 l=10
+ DA "Descent}" ;139 l=8
+ DA "Surface}" ;140 l=8
+ DA "Quit?}" ;141 l=6
+ DA "More}}" ;142 l=6
+ DA "Confirm:}}" ;143 l=10
+ DA "Menu 2:}" ;144 l=8
+ DA "Cancel}}" ;145 l=8
+ DA "OK!}" ;146 l=4
+ DA "Stopwat.}}" ;147 l=10
+ DA "NOT USED!!!!!}" ;148 l=14
+ DA "NOT USED!!!!!!!!!!!}" ;149 l=20
+ DA "Not used!}" ;150 l=10
+ DA "Not used!!!}" ;151 l=12
+ DA "L16-GF OC}" ;152 l=10
+ DA "Custom FunctionsII}}" ;153 l=20
+
+
+; 32 custom function descriptors with length=16!
+ DA "GF Low [%]}" ;154
+ DA "GF High [%]}" ;155
+ DA "Color #Battery }" ;156
+ DA "not used }" ;157
+ DA "not used }" ;158
+ DA "not used }" ;159
+ DA "Show secs. [=1]}" ;160
+ DA "not used }" ;161
+ DA "not used }" ;162
+ DA "Avr. Depth [=1]}" ;163
+ DA "not used }" ;164
+ DA "not used }" ;165
+ DA "not used }" ;166
+ DA "not used }" ;167
+ DA "not used }" ;168
+ DA "not used }" ;169
+ DA "not used }" ;170
+ DA "not used }" ;171
+ DA "not used }" ;172
+ DA "not used }" ;173
+ DA "not used }" ;174
+ DA "not used }" ;175
+ DA "not used }" ;176
+ DA "not used }" ;177
+ DA "not used }" ;178
+ DA "not used }" ;179
+ DA "not used }" ;180
+ DA "not used }" ;181
+ DA "not used }" ;182
+ DA "not used }" ;183
+ DA "not used }" ;184
+ DA "not used }" ;185
+; 32 custom function descriptors with length=16!
+
+
+ DA "Custom Functions II}" ;186 l=20
+ DA "Not Used!!!!!!!}" ;187 l=16
+ DA "Not Used!!!!!!!!!}" ;188 l=18
+ DA "NOT USED!!!!!}" ;189 l=14
+ DA "ppO2 +}}" ;190 l=8
+ DA "ppO2 -}}" ;191 l=8
+ DA "Dil.}}" ;192 l=6
+; ZH-L16 mode description
+ DA "Decotype: ZH-L16 OC}" ;193 l=20
+ DA "For Open Circuit }" ;194 l=20
+ DA "Divers. Supports 5 }" ;195 l=20
+ DA "Trimix Gases. }" ;196 l=20
+ DA "Configure your gas }" ;197 l=20
+ DA "in Gassetup menu. }" ;198 l=20
+ DA "Check CF11 & CF12 !}" ;199 l=20
+; Gaugemode description
+ DA "Decotype: Gauge }" ;200 l=20
+ DA "Divetime will be in}" ;201 l=20
+ DA "Minutes:Seconds. }" ;202 l=20
+ DA "OSTC2 will not }" ;203 l=20
+ DA "compute Deco, NoFly}" ;204 l=20
+ DA "time and Desat.- }" ;205 l=20
+ DA "time at all! }" ;206 l=20
+; Const.ppO2 description
+ DA "Decotype:ZH-L16 CC }" ;207 l=20
+ DA "For (Semi-)Closed }" ;208 l=20
+ DA "Circuit rebreathers}" ;209 l=20
+ DA "Configure the 3 }" ;210 l=20
+ DA "SetPoints in ppO2- }" ;211 l=20
+ DA "Setup menu. 5 bail-}" ;212 l=20
+ DA "out are available. }" ;213 l=20
+; Apnoemode description
+ DA "Decotype: Apnoe }" ;214 l=20
+ DA "OSTC2 will display }" ;215 l=20
+ DA "each descent separ-}" ;216 l=20
+ DA "ately in Min:Sec. }" ;217 l=20
+ DA "Will temporally set}" ;218 l=20
+ DA "samplerate to 1 sec}" ;219 l=20
+ DA "No Deco calculation}" ;220 l=20
+; Multi GF OC mode description
+ DA "Decotype: L16-GF OC}" ;221 l=20
+ DA "Decompression cal- }" ;222 l=20
+ DA "culations with the }" ;223 l=20
+ DA "GF-Method (GF_lo/GF}" ;224 l=20
+ DA "_hi). Check CF32 & }" ;225 l=20
+ DA "CF33! Open Circuit }" ;226 l=20
+ DA "with Deep Stops. }" ;227 l=20
+; Multi GF CC mode description
+ DA "Decotype: L16-GF CC}" ;228 l=20
+ DA "Decompression cal- }" ;229 l=20
+ DA "culations with the }" ;230 l=20
+ DA "GF-Method (GF_lo/GF}" ;231 l=20
+ DA "_hi). Check CF32 & }" ;232 l=20
+ DA "CF33!Closed Circuit}" ;233 l=20
+ DA "with Deep Stops. }" ;234 l=20
+
+ DA "Decomode changed! }" ;235 l=20
+ DA "L16-GF CC}" ;236 l=10
+ DA "Not found}" ;237 l=10
+ DA "SetPoint}}" ;238 l=10
+ DA "No Deco}" ;239 l=8
+ DA "Graphs}}" ;240 l=8
+ DA "Display}" ;241 l=8
+ DA "No deco}" ;242 l=8
+ DA "Search module}" ;243 l=14
+ DA "Exit}}" ;244 l=6
+ DA "Reset CF,Gas & Deco}" ;245 l=20
+ DA "Disable module}}" ;246 l=16
+ DA "Simulator}" ;247 l=10
+ DA "OSTC Simulator}}" ;248 l=16
+ DA "Start Dive}}" ;249 l=12
+ DA "+ 1m}}" ;250 l=6
+ DA "- 1m}}" ;251 l=6
+ DA "+10m}}" ;252 l=6
+ DA "-10m}}" ;253 l=6
+ DA "Exit}}" ;254 l=6
+ DA "not use}" ;255 l=8
+
+; Text Bank2 (Texts 256-511):
+ DA "x}" ;256 l=2
+ DA "Date format:}}" ;257 l=14
+ DA "Setup Menu 2:}" ;258 l=14
+ DA "MMDDYY}}" ;259 l=8
+ DA "DDMMYY}}" ;260 l=8
+ DA "YYMMDD}}" ;261 l=8
+ DA "OSTC }" ;262 l=6
+ DA "Bail}}" ;263 l=6
+ DA "Air }" ;264 l=6
+ DA "Air }" ;265 l=6
+ DA "Calibrate}" ;266 l=10
+ DA "Max Depth}" ;267 l=10
+ DA "not}" ;268 l=4
+ DA "found!}}" ;269 l=8
+ DA "mV:}" ;270 l=4
+; New CFs Warning
+ DA "New CF added!}" ;271 l=14
+ DA "New CustomFunctions}" ;272 l=20
+ DA "were added! Check}" ;273 l=18
+ DA "CF I and CF II Menu}" ;274 l=20
+ DA "for Details!}}" ;275 l=14
+ DA "Salinity:}" ;276 l=10
+ DA "Bottom Time:}}" ;277 l=14
+ DA "Max. Depth:}" ;278 l=12
+ DA "Calculate Deco}}" ;279 l=16
+ DA "Show Decoplan}" ;280 l=14
+ DA "Lead Tis}}" ;281 l=10
+ DA "Lead Tis}}" ;282 l=10
+ DA "Stopwatch}" ;283 l=10
+ DA "Reset Logbook}" ;284 l=14
+ DA "Reboot OSTC}" ;285 l=12
+ DA "Reset Decodata}}" ;286 l=16
\ No newline at end of file
diff -r 000000000000 -r 96a35aeda5f2 code_part1/OSTC_code_asm_part1/valconv.asm
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/code_part1/OSTC_code_asm_part1/valconv.asm Tue Jan 12 15:05:59 2010 +0100
@@ -0,0 +1,262 @@
+; OSTC - diving computer code
+; Copyright (C) 2008 HeinrichsWeikamp GbR
+
+; 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 3 of the License, or
+; (at your option) any later version.
+
+; This program is distributed in the hope that it will be useful,
+; but WITHOUT ANY WARRANTY; without even the implied warranty of
+; 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, see .
+
+
+; converts hex values to dez values
+; written by: Matthias Heinrichs, info@heinrichsweikamp.com
+; written: 13/10/07
+; last updated: 5/11/07
+; known bugs:
+; ToDo: clean up!!!
+
+
+output_16_3 macro ; displays only last three figures from a 16Bit value (0-999)
+ clrf ignore_digits
+ incf ignore_digits,F
+ clrf temp4
+ bsf show_last3
+ movf temp4,W ; Temp4 stores position for decimal point
+ call output16
+ endm
+
+output_16dp macro temp4 ; 16Bit with decimal point
+ movlw temp4 ; Temp4 stores position for decimal point
+ call output16
+ endm
+
+output_16 macro ; 16Bit Normal
+ clrf ignore_digits
+ incf ignore_digits,F
+ clrf temp4
+ movf temp4,W ; Temp4 stores position for decimal point
+ call output16
+ endm
+
+output_8 macro ; 8 Bit Normal
+ clrf ignore_digits
+ incf ignore_digits,F
+ clrf temp4
+ call output8
+ endm
+
+output_99 macro ; displays only last two figures from a 8Bit value (0-99)
+ clrf ignore_digits
+ incf ignore_digits,F
+ clrf temp4
+ call output99
+ endm
+
+output_99x macro ; displays only last two figures from a 8Bit value with leading zero (00-99)
+ clrf ignore_digits
+ incf ignore_digits,F
+ clrf temp4
+ call output99x
+ endm
+
+output99:
+ movlw d'99'
+ cpfslt lo
+ movwf lo ; Limit to 99
+ movff lo, lo_temp
+ clrf hi_temp
+ bcf pre_zero_flag ; do not display leading zeros
+
+LCD_val99_2:
+ movlw b'00001010' ; 10
+ movwf temp2
+ clrf temp3
+ rcall DEC2ASCII
+
+ movlw b'00000001' ; 1
+ movwf temp2
+ clrf temp3
+ bsf pre_zero_flag ; last figure, display zero (0)
+ rcall DEC2ASCII
+ RETURN
+
+output99x:
+ movff lo, lo_temp
+ clrf hi_temp
+ bsf pre_zero_flag ; display leading zeros
+ bra LCD_val99_2
+
+output8
+ movff lo, lo_temp
+ clrf hi_temp
+ bcf pre_zero_flag ; do not display leading zeros
+
+ movlw b'01100100' ; 100
+ movwf temp2
+ clrf temp3
+ rcall DEC2ASCII
+ bra LCD_val99_2
+
+output16
+ bcf all_zeros_flag ; do not display any zero from here unless there was at least one figure /zero
+
+ movwf temp4
+
+ bsf leading_zeros
+ incf temp4,1
+ decfsz temp4,F
+ bcf leading_zeros
+
+ bsf DP_done2
+ incf temp4,1
+ decfsz temp4,F
+ bcf DP_done2 ; decimal point not yet set
+
+ movff lo, lo_temp
+ movff hi, hi_temp
+ bcf pre_zero_flag ; do not display leading zeros
+
+ movlw b'00010000' ; 10000s
+ movwf temp2
+ movlw b'00100111'
+ movwf temp3
+ btfss show_last3 ; display only last three figures?
+ rcall DEC2ASCII
+
+ movlw b'11101000' ; 1000s
+ movwf temp2
+ movlw b'00000011'
+ movwf temp3
+ btfsc DP_done2 ; Is there a decimal point at all?
+ bra output16_2 ; no, use normal display mode
+
+ btfsc all_zeros_flag ; display any zero from here
+ bra output16_1 ; there was a figure /zero already
+
+ bsf pre_zero_flag ; display figure if zero?
+ decfsz temp4,W
+ bcf pre_zero_flag ; No
+
+output16_1:
+ btfsc DP_done ; Decimal point set already?
+ bsf pre_zero_flag ; Yes, so display the rest
+output16_2:
+ btfss show_last3 ; display only last three figures?
+ rcall DEC2ASCII
+ bcf show_last3 ; No, so display the rest
+
+ movlw b'01100100' ; 100s
+ movwf temp2
+ clrf temp3
+
+ btfsc ignore_digit3 ; Ignore 3rd-5th digit?
+ bra output16_5 ; Yes, skip the rest
+
+ btfsc DP_done2 ; Is there a decimal point at all?
+ bra output16_3 ; no, use normal display mode
+
+ btfsc all_zeros_flag ; display any zero from here
+ bra output16_2_1 ; there was a figure /zero already
+
+ bsf pre_zero_flag ; display figure if zero?
+ decfsz temp4,W
+ bcf pre_zero_flag ; No
+
+output16_2_1:
+ btfsc DP_done ; Decimal point set already?
+ bsf pre_zero_flag ; Yes, so display the rest
+ btfsc DP_done2 ; Is there a decimal point at all?
+ bsf pre_zero_flag ; No, so display the rest
+output16_3:
+ rcall DEC2ASCII
+
+ movlw b'00001010' ; 10s
+ movwf temp2
+ clrf temp3
+ btfsc DP_done2
+ bra output16_4
+
+ btfsc all_zeros_flag ; display any zero from here
+ bra output16_3_1 ; there was a figure /zero already
+
+ bsf pre_zero_flag
+ decfsz temp4,W
+ bcf pre_zero_flag
+
+output16_3_1:
+ btfsc DP_done
+ bsf pre_zero_flag
+ btfsc DP_done2
+ bsf pre_zero_flag
+output16_4:
+ btfsc ignore_digit4 ; Ignore 4-5th digit?
+ bra output16_5 ; Yes, skip the rest
+ rcall DEC2ASCII
+
+ movlw b'00000001' ; 1s
+ movwf temp2
+ clrf temp3
+ bsf pre_zero_flag
+ btfss ignore_digit5 ; Ignore 5th digit?
+ rcall DEC2ASCII ; No!
+ bcf ignore_digit5 ; yes, and clear flag
+output16_5:
+ bcf ignore_digit3 ; Clear flag
+ clrf ignore_digits
+ incf ignore_digits,F
+ bcf DP_done
+ RETURN
+
+DEC2ASCII clrf temp1 ; converts into ASCII code
+DEC2ASCII_2 movf temp3,W
+ subwf hi_temp,0
+ btfss STATUS,C
+ bra DEC2ASCII_4
+ bnz DEC2ASCII_3
+
+ movf temp2,W
+ subwf lo_temp,0
+ btfss STATUS,C
+ bra DEC2ASCII_4
+
+DEC2ASCII_3 movf temp3,W
+ subwf hi_temp,1
+ movf temp2,W
+ subwf lo_temp,1
+ btfss STATUS,C
+ decf hi_temp,1
+ incf temp1,1
+ bsf pre_zero_flag
+ bra DEC2ASCII_2
+
+DEC2ASCII_4
+ decfsz ignore_digits,F
+ return
+ incf ignore_digits,F
+ movlw '0' ; Offset for Ascii-value
+ addwf temp1,0
+ btfsc pre_zero_flag ; is this a leading zero?
+ bra DEC2ASCII_4_1 ; no
+ btfsc leftbind
+ bra DEC2ASCII_6
+ movlw ' ' ; instead of leading zeros a space!
+ bra DEC2ASCII_5
+
+DEC2ASCII_4_1:
+ bsf all_zeros_flag ; display any zero from here
+DEC2ASCII_5
+ movwf POSTINC2
+DEC2ASCII_6
+ decfsz temp4,F ; Set decimal point?
+ RETURN ; No
+ movlw "." ; Yes
+ movwf POSTINC2
+ bsf DP_done
+ RETURN
\ No newline at end of file
diff -r 000000000000 -r 96a35aeda5f2 code_part1/OSTC_code_asm_part1/wait.asm
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/code_part1/OSTC_code_asm_part1/wait.asm Tue Jan 12 15:05:59 2010 +0100
@@ -0,0 +1,122 @@
+; OSTC - diving computer code
+; Copyright (C) 2008 HeinrichsWeikamp GbR
+; 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 3 of the License, or
+; (at your option) any later version.
+; This program is distributed in the hope that it will be useful,
+; but WITHOUT ANY WARRANTY; without even the implied warranty of
+; 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, see .
+; Wait routines
+; written by: chsw, info@heinrichsweikamp.com
+; written: 01/31/04
+; last updated: 11/05/07
+; known bugs:
+; ToDo:
+
+; ==========================================================
+; WAIT 10 MICROSECONDS - 16 MHZ
+; ==========================================================
+WAIT10US macro wait_temp
+ movlw wait_temp
+ call WAIT10USX
+ endm
+
+WAIT10USX movwf wait_temp
+ goto JumpIn10us
+WAIT10USX2 nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+JumpIn10us:
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ decfsz wait_temp,1
+ goto WAIT10USX2
+ return
+; ==========================================================
+; WAIT 1 MILLISECOND - 16 MHZ
+; ==========================================================
+WAITMS macro waitms_temp
+ movlw waitms_temp
+ call WAITMSX
+ endm
+WAITMSX movwf waitms_temp
+ goto JumpInMSX
+WAITMSX2 nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+JumpInMSX:
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ WAIT10US d'99'
+ decfsz waitms_temp,1
+ goto WAITMSX2
+ return
\ No newline at end of file
diff -r 000000000000 -r 96a35aeda5f2 code_part1/OSTC_code_c_part2/18f4685_ostc.lkr
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/code_part1/OSTC_code_c_part2/18f4685_ostc.lkr Tue Jan 12 15:05:59 2010 +0100
@@ -0,0 +1,58 @@
+
+// OSTC - diving computer code
+// Copyright (C) 2008 HeinrichsWeikamp GbR
+
+// 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 3 of the License, or
+// (at your option) any later version.
+
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// 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, see .
+
+
+// File: 18f4685.lkr
+// Sample linker script for the PIC18F4685 processor
+// modified by chsw for ostc, Nov. 2007
+
+LIBPATH .
+
+//FILES c018i.o
+FILES clib.lib
+FILES p18f4685.lib
+
+//CODEPAGE NAME=vectors START=0x0 END=0x29 PROTECTED
+//CODEPAGE NAME=page START=0x2A END=0x17FFF
+CODEPAGE NAME=page START=0x0 END=0x17FFF
+CODEPAGE NAME=idlocs START=0x200000 END=0x200007 PROTECTED
+CODEPAGE NAME=config START=0x300000 END=0x30000D PROTECTED
+CODEPAGE NAME=devid START=0x3FFFFE END=0x3FFFFF PROTECTED
+CODEPAGE NAME=eedata START=0xF00000 END=0xF003FF PROTECTED
+
+ACCESSBANK NAME=accessram START=0x0 END=0x5F
+DATABANK NAME=gpr0 START=0x60 END=0xFF
+DATABANK NAME=gpr1 START=0x100 END=0x1FF
+DATABANK NAME=gpr2 START=0x200 END=0x2FF
+DATABANK NAME=gpr3 START=0x300 END=0x3FF
+DATABANK NAME=gpr4 START=0x400 END=0x4FF
+DATABANK NAME=gpr5 START=0x500 END=0x5FF
+DATABANK NAME=gpr6 START=0x600 END=0x6FF
+DATABANK NAME=gpr7 START=0x700 END=0x7FF
+DATABANK NAME=gpr8 START=0x800 END=0x8FF
+DATABANK NAME=gpr9 START=0x900 END=0x9FF
+DATABANK NAME=gpr10 START=0xA00 END=0xAFF
+DATABANK NAME=gpr11 START=0xB00 END=0xBFF
+DATABANK NAME=gpr12 START=0xC00 END=0xCFF
+DATABANK NAME=sfr13 START=0xD00 END=0xDFF PROTECTED
+DATABANK NAME=sfr14 START=0xE00 END=0xEFF PROTECTED
+DATABANK NAME=sfr15 START=0xF00 END=0xF5F PROTECTED
+ACCESSBANK NAME=accesssfr START=0xF60 END=0xFFF PROTECTED
+
+SECTION NAME=CONFIG ROM=config
+
+STACK SIZE=0x100 RAM=gpr12
diff -r 000000000000 -r 96a35aeda5f2 code_part1/OSTC_code_c_part2/changes_log.txt
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/code_part1/OSTC_code_c_part2/changes_log.txt Tue Jan 12 15:05:59 2010 +0100
@@ -0,0 +1,20 @@
+changes for v.101_C last deco:
+
+text_table_v111.asm : line 249
+ DA "Last Deco [m]}" ;65 (entspricht CF29)
+
+menu_reset_v111.asm :
+line 153
+#DEFINE last_deco_depth d'3' ; 8Bit 3m
+line 253f
+ movlw LOW last_deco_depth
+
+divemode_v111.asm
+line 421ff
+ GETCUSTOM8 d'29' ; Depth Last Deco in meter for simulation
+ movwf wait_temp
+ movff wait_temp,char_I_depth_last_deco
+
+definitions_v111.asm
+line 302
+ char_I_depth_last_deco; ; 0x51E new in v.101
diff -r 000000000000 -r 96a35aeda5f2 code_part1/OSTC_code_c_part2/old/changes_log.txt
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/code_part1/OSTC_code_c_part2/old/changes_log.txt Tue Jan 12 15:05:59 2010 +0100
@@ -0,0 +1,20 @@
+changes for v.101_C last deco:
+
+text_table_v111.asm : line 249
+ DA "Last Deco [m]}" ;65 (entspricht CF29)
+
+menu_reset_v111.asm :
+line 153
+#DEFINE last_deco_depth d'3' ; 8Bit 3m
+line 253f
+ movlw LOW last_deco_depth
+
+divemode_v111.asm
+line 421ff
+ GETCUSTOM8 d'29' ; Depth Last Deco in meter for simulation
+ movwf wait_temp
+ movff wait_temp,char_I_depth_last_deco
+
+definitions_v111.asm
+line 302
+ char_I_depth_last_deco; ; 0x51E new in v.101
diff -r 000000000000 -r 96a35aeda5f2 code_part1/OSTC_code_c_part2/old/p2_deco_main - bigscreen.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/code_part1/OSTC_code_c_part2/old/p2_deco_main - bigscreen.c Tue Jan 12 15:05:59 2010 +0100
@@ -0,0 +1,3230 @@
+/*
+ * p2_deco_main.c
+ *
+ * Created on: 31.08.2009
+ * Author: christian.w @ heinrichsweikamp.com
+ *
+ */
+
+//#include
+
+// OSTC - diving computer code
+// Copyright (C) 2009 HeinrichsWeikamp GbR
+
+// 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 3 of the License, or
+// (at your option) any later version.
+
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// 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, see .
+
+
+// *****************************
+// ** I N T R O D U C T I O N **
+// *****************************
+//
+// OSTC
+//
+// code:
+// p2_deco_main_c_v101.c
+// part2 of the OSTC code
+// code with constant O2 partial pressure routines
+// under construction !!
+//
+// summary:
+// decompression routines
+// for the OSTC experimental project
+// written by Christian Weikamp
+// last revision __________
+// comments added _________
+//
+// additional files:
+// p2_tables_v100.romdata (other files)
+// 18f4685_ostc_v100.lkr (linker script)
+//
+// history:
+// 01/03/08 v100: first release candidate
+// 03/13/08 v101: start of programming ppO2 code
+// 03/13/25 v101a: backup of interrim version with ppO2 calculation
+// 03/13/25 v101: open circuit gas change during deco
+// 03/13/25 v101: CNS_fraction calculation
+// 03/13/26 v101: optimization of tissue calc routines
+// 07/xx/08 v102a: debug of bottom time routine
+// 09/xx/08 v102d: Gradient Factor Model implemenation
+// 10/10/08 v104: renamed to build v103 for v118 stable
+// 10/14/08 v104: integration of temp_depth_last_deco for Gradient Model
+// 03/31/090 v107: integration of FONT Incon24
+
+//
+// literature:
+// B"uhlmann, Albert: Tauchmedizin; 4. Auflage;
+// Schr"oder, Kai & Reith, Steffen; 2000; S"attigungsvorg"ange beim Tauchen, das Modell ZH-L16, Funktionsweise von Tauchcomputern; http://www.achim-und-kai.de/kai/tausim/saett_faq
+// Morrison, Stuart; 2000; DIY DECOMPRESSION; http://www.lizardland.co.uk/DIYDeco.html
+// Balthasar, Steffen; Dekompressionstheorie I: Neo Haldane Modelle; http://www.txfreak.de/dekompressionstheorie_1.pdf
+// Baker, Erik C.; Clearing Up The Confusion About "Deep Stops"
+// Baker, Erik C.; Understanding M-values; http://www.txfreak.de/understanding_m-values.pdf
+
+
+// *********************
+// ** I N C L U D E S **
+// *********************
+ #include
+ #include
+
+// ********************************
+// ** C O N F I G U R A T I O N **
+// ** for simulation without asm **
+// ********************************
+ #pragma config OSC = IRCIO67
+ #pragma config FCMEN = OFF
+ #pragma config IESO = OFF
+ #pragma config PWRT = ON
+ #pragma config BOREN = OFF
+ #pragma config WDT = OFF
+ #pragma config WDTPS = 128
+ #pragma config MCLRE = ON
+ #pragma config LPT1OSC = OFF
+ #pragma config PBADEN = OFF
+ #pragma config DEBUG = OFF
+ #pragma config XINST = OFF
+ #pragma config LVP = OFF
+ #pragma config STVREN = OFF
+
+// ****************************
+// ** D E F I N E S **
+// ** missing in p18f4685.h **
+// ****************************
+#define INT0IF 1
+#define INT1IF 0
+#define TMR1IF 0
+
+
+# define DBG_c_gas 0b0000000000000001
+# define DBG_c_ppO2 0b0000000000000010
+# define DBG_RUN 0b0000000000000100
+# define DBG_RESTART 0b0000000000001000
+
+# define DBG_CdeSAT 0b0000000000010000
+# define DBG_C_MODE 0b0000000000100000
+# define DBG_C_SURF 0b0000000001000000
+# define DBG_HEwoHE 0b0000000010000000
+
+# define DBG_C_DPPO2 0b0000000100000000
+# define DBG_C_DGAS 0b0000001000000000
+# define DBG_C_DIST 0b0000010000000000
+# define DBG_C_LAST 0b0000100000000000
+
+# define DBG_C_GF 0b0001000000000000
+# define DBG_ZH16ERR 0b0010000000000000
+# define DBG_PHIGH 0b0100000000000000
+# define DBG_PLOW 0b1000000000000000
+
+
+# define DBS_mode 0b0000000000000001
+# define DBS_ppO2 0b0000000000000010
+# define DBS_HE_sat 0b0000000000000100
+# define DBS_ppO2chg 0b0000000000001000
+
+# define DBS_SAT2l 0b0000000000010000
+# define DBS_SAT2h 0b0000000000100000
+# define DBS_GFLOW2l 0b0000000001000000
+# define DBS_GFLOW2h 0b0000000010000000
+
+# define DBS_GFHGH2l 0b0000000100000000
+# define DBS_GFHGH2h 0b0000001000000000
+# define DBS_GASO22l 0b0000010000000000
+# define DBS_GASO22h 0b0000100000000000
+
+# define DBS_DIST2h 0b0001000000000000
+# define DBS_LAST2h 0b0010000000000000
+# define DBS_DECOO2l 0b0100000000000000
+# define DBS_DECOO2h 0b1000000000000000
+
+
+# define DBS2_PRES2h 0b0000000000000001
+# define DBS2_PRES2l 0b0000000000000010
+# define DBS2_SURF2l 0b0000000000000100
+# define DBS2_SURF2h 0b0000000000001000
+
+# define DBS2_DESAT2l 0b0000000000010000
+# define DBS2_DESAT2h 0b0000000000100000
+# define DBS2_GFDneg 0b0000000001000000
+# define DBS2_ 0b000000000000000
+
+# define DBS2_ 0b000000000000000
+# define DBS2_ 0b000000000000000
+# define DBS2_ 0b000000000000000
+# define DBS2_ 0b000000000000000
+
+// NDL_at_20mtr
+
+
+
+// ***********************
+// ** V A R I A B L E S **
+// ***********************
+// prefixes etc:
+// _O_ = output for use in the assembler code
+// _I_ = input from the assembler code for the c code
+// char_ and int_ = used to identify output and input size
+// var = variable (from b"uhlmann)
+// pres = pressure
+// gtissue = guiding tissue, the one limiting the ascent
+// e2secs = exp of the b"uhlmann formula precalculated for a 2 second step
+// e1min = same for 1 minute step
+// sim = used in simulating the ascent to the surface
+// nullzeit = remaining ground/bottom time for "no deco"
+// hauptroutine = main
+
+#define WP_SIZECHAR_SMALL 336
+#define WP_SIZECHAR_MEDIUM 768
+#define WP_FONT_SMALL_HEIGHT 24
+#define WP_FONT_MEDIUM_HEIGHT 32
+
+#define oled_rw PORTA,2,0
+#define oled_rs PORTE,0,0
+
+#define U8 unsigned char
+#define U16 unsigned int
+
+#pragma udata bank0a=0x060
+/*
+ CBLOCK 0x060 ;Bank 0
+ letter:.026 ;letter buffer
+ win_color1
+ win_color2
+ win_top
+ win_leftx2
+ win_font
+ win_invert
+ win_temp
+*/
+
+volatile unsigned char wp_stringstore[26];
+volatile U8 wp_color1;
+volatile U8 wp_color2;
+volatile U8 wp_top;
+volatile U8 wp_leftx2;
+volatile U8 wp_font;
+volatile U8 wp_invert;
+volatile U8 wp_temp_U8;
+
+#pragma udata bank0b=0x081
+volatile unsigned char keep_free_bank0_1[5];
+
+#pragma udata bank0c=0x086
+U8 wp_txtptr;
+unsigned char wp_char;
+U8 wp_command;
+U16 wp_data_16bit;
+U8 wp_data_8bit_one;
+U8 wp_data_8bit_two;
+U16 wp_start;
+U16 wp_end;
+U16 wp_i;
+U8 wp_black;
+
+#pragma udata bank0d=0x0E0
+volatile unsigned char keep_free_bank0_2[32];
+
+/*
+volatile unsigned char dd2_left; // 1 - 64
+volatile unsigned char dd2_top; // 1 - 64
+volatile unsigned char dd2_heightmax; // 1 - 37
+volatile unsigned char dd2_oled_brightness_offset; // 0 - 15 (15 is pitch black always)
+volatile unsigned char dd2_fontwidth; // 8, 12, 21 for Incon16, Incon24, Incon42
+volatile unsigned char dd2_fontheight; // 14, 21, 37 for "
+volatile unsigned long dd2_pointer; // for font lut
+volatile unsigned char dd2_i;
+volatile unsigned char dd2_j;
+volatile unsigned char dd2_k;
+volatile unsigned char dd2_char;
+volatile unsigned char dd2_lowbyte;
+volatile unsigned char dd2_temp;
+volatile unsigned char dd2_data;
+volatile unsigned long dd2_base; // for font lut
+volatile unsigned char dd2_start; // for font lut
+volatile unsigned char dd2_end; // for font lut
+*/
+
+ #pragma udata bank1=0x100
+ const unsigned char keep_free_bank1[256]; // used by the assembler code
+
+ #pragma udata bank2a=0x200
+// output:
+ static unsigned int int_O_tissue_for_debug[32];
+ static unsigned int int_O_GF_spare____; // 0x240
+ static unsigned int int_O_GF_step; // 0x242
+ static unsigned int int_O_gtissue_limit; // 0x244
+ static unsigned int int_O_gtissue_press; // 0x246
+ static unsigned int int_O_limit_GF_low; // 0x248
+ static unsigned int int_O_gtissue_press_at_GF_low; // 0x24A
+// ...
+ #pragma udata bank2b=0x24E
+ static unsigned char char_O_GF_low_pointer; // 0x24E
+ static unsigned char char_O_actual_pointer; // 0x24F
+ #pragma udata bank2c=0x250
+ static unsigned char char_O_deco_table[32]; // 0x250
+ #pragma udata bank2d=0x270
+ static unsigned char char_I_table_deco_done[32];
+ #pragma udata bank2e=0x290
+ static unsigned int int_O_calc_tissue_call_counter; // 0x290
+// internal:
+ unsigned char lock_GF_depth_list;
+ static float temp_limit;
+ static float GF_low;
+ static float GF_high;
+ static float GF_delta;
+ static float GF_temp;
+ static float GF_step;
+ static float GF_step2;
+ static float temp_pres_gtissue;
+ static float temp_pres_gtissue_diff;
+ static float temp_pres_gtissue_limit_GF_low;
+ static float temp_pres_gtissue_limit_GF_low_below_surface;
+ static unsigned int temp_depth_limit;
+ static unsigned char temp_decotime;
+ static unsigned char temp_gtissue_no;
+ static unsigned int temp_depth_last_deco; // new in v.101
+
+ static unsigned char temp_depth_GF_low_meter;
+ static unsigned char temp_depth_GF_low_number;
+ static unsigned char internal_deco_pointer;
+ static unsigned char internal_deco_table[32];
+ static float temp_pres_deco_GF_low;
+
+static unsigned int debug_temp;
+
+
+#pragma udata bank3a=0x300
+static char output[32];
+// used by the math routines
+#pragma udata bank3b=0x380
+volatile float pres_tissue_vault[32];
+ #pragma udata bank4a=0x400
+// internal:
+ unsigned char ci ; // don't move - used in _asm routines - if moved then modify movlb commands
+ unsigned char x;
+ unsigned int main_i;
+ unsigned int int_temp;
+ unsigned int int_temp_decostatus;
+ static float pres_respiration;
+ static float pres_surface;
+ static float temp1;
+ static float temp2;
+ static float temp3;
+ static float temp4;
+ static float temp_deco;
+ static float temp_atem;
+ static float temp2_atem;
+ static float temp_tissue;
+ static float temp_surface;
+ static float N2_ratio;
+ static float He_ratio;
+ static float temp_ratio;
+ static float var_a;
+ static float var2_a;
+ static float var_b;
+ static float var2_b;
+ static float var_t05nc;
+ static float var2_t05nc;
+ static float var_e2secs;
+ static float var2_e2secs;
+ static float var_e1min;
+ static float var2_e1min;
+ static float var_halftimes;
+ static float var2_halftimes;
+ static float pres_gtissue_limit;
+ static float temp_pres_gtissue_limit;
+ static float actual_ppO2; // new in v.102
+ #pragma udata bank4b=0x480
+ static float pres_tissue[32];
+
+ #pragma udata bank5=0x500
+// don't move positions in this bank, the registers are addressed directly from assembler code
+// input:
+ static unsigned int int_I_pres_respiration; // 0x500
+ static unsigned int int_I_pres_surface; // 0x502
+ static unsigned int int_I_temp; // 0x504 new in v101
+ static unsigned char char_I_temp; // 0x506 new in v101
+ static unsigned char char_I_actual_ppO2; // 0x507
+ static unsigned int int_I_spare_3;
+ static unsigned int int_I_spare_4;
+ static unsigned int int_I_spare_5;
+ static unsigned int int_I_spare_6;
+ static unsigned char char_I_N2_ratio; // 0x510
+ static unsigned char char_I_He_ratio; // 0x511
+ static unsigned char char_I_saturation_multiplier; // for conservatism/safety values 1.0 (no conservatism) to 1.5 (50% faster saturation
+ static unsigned char char_I_desaturation_multiplier; // for conservatism/safety values 0.66 (50% slower desaturation) to 1.0 (no conservatism)// consveratism used in calc_tissue(), calc_tissue_step_1_min() and sim_tissue_1min()
+ static unsigned char char_I_GF_High_percentage; // 0x514 new in v.102
+ static unsigned char char_I_GF_Low_percentage; // 0x515 new in v.102
+ static unsigned char char_I_spare; // 0x516
+ static unsigned char char_I_deco_distance; // 0x517
+ static unsigned char char_I_const_ppO2; // 0x518 new in v.101
+ static unsigned char char_I_deco_ppO2_change; // 0x519 new in v.101
+ static unsigned char char_I_deco_ppO2; // 0x51A new in v.101
+ static unsigned char char_I_deco_gas_change; // 0x51B new in v.101
+ static unsigned char char_I_deco_N2_ratio; // 0x51C new in v.101
+ static unsigned char char_I_deco_He_ratio; // 0x51D new in v.101
+ static unsigned char char_I_depth_last_deco; // 0x51E new in v.101 unit: [m]
+ static unsigned char char_I_deco_model; // 0x51F new in v.102 ( 1 = MultiGraF, sonst Std. mit (de-)saturation_multiplier)
+// output:
+ static unsigned int int_O_desaturation_time; // 0x520
+ static unsigned char char_O_nullzeit; // 0x522
+ static unsigned char char_O_deco_status; // 0x523
+ static unsigned char char_O_array_decotime[7]; // 0x524
+ static unsigned char char_O_array_decodepth[6]; // 0x52B
+ static unsigned char char_O_ascenttime; // 0x531
+ static unsigned char char_O_gradient_factor; // 0x532
+ static unsigned char char_O_tissue_saturation[32]; // 0x533
+ static unsigned char char_O_array_gradient_weighted[16]; // 0x553
+ static unsigned char char_O_gtissue_no; // 0x563
+ static unsigned char char_O_diluent; // 0x564 new in v.101
+ static unsigned char char_O_CNS_fraction; // 0x565 new in v.101
+ static unsigned char char_O_relative_gradient_GF; // 0x566 new in v.102
+
+// internal:
+ static float pres_tissue_limit[16];
+ static float sim_pres_tissue_limit[16];
+ static float pres_diluent; // new in v.101
+ static float deco_diluent; // new in v.101
+ static float const_ppO2; // new in v.101
+ static float deco_ppO2_change; // new in v.101
+ static float deco_ppO2; // new in v.101
+
+
+
+ #pragma udata bank6=0x600
+// internal:
+ static float sim_pres_tissue[32];
+ static float sim_pres_tissue_backup[32];
+
+ #pragma udata bank7=0x700
+ const unsigned char keep_free_bank7[256]; // used by the assembler code (DD font2display)
+
+ #pragma udata bank8=0x800
+ static char md_pi_subst[256];
+
+ #pragma udata bank9a=0x900
+// output:
+ static char md_state[48]; // DONT MOVE !! // has to be at the beginning of bank 9 for the asm code!!!
+ #pragma udata bank9b=0x930
+// output:
+ static unsigned int int_O_DBS_bitfield; // 0x930 new in v.108
+ static unsigned int int_O_DBS2_bitfield; // 0x932 new in v.108
+ static unsigned int int_O_DBG_pre_bitfield; // 0x934 new in v.108
+ static unsigned int int_O_DBG_post_bitfield; // 0x936 new in v.108
+ static char char_O_NDL_at_20mtr; // 0x938 new in v.108 // 0xFF == undefined, max. 254
+// internal:
+ static char md_t;
+ static char md_buffer[16];
+ static char md_cksum[16];
+ static char md_i;
+ static char md_j;
+ static char md_temp;
+ static unsigned int md_pointer;
+ static float deco_N2_ratio; // new in v.101
+ static float deco_He_ratio; // new in v.101
+ static float calc_N2_ratio; // new in v.101
+ static float calc_He_ratio; // new in v.101
+ static float deco_gas_change; // new in v.101
+ static float CNS_fraction; // new in v.101
+ static float float_saturation_multiplier; // new in v.101
+ static float float_desaturation_multiplier; // new in v.101
+ static float float_deco_distance; // new in v.101
+// internal, dbg:
+ static unsigned char DBG_char_I_deco_model; // new in v.108
+ static unsigned char DBG_char_I_depth_last_deco; // new in v.108
+ static float DBG_pres_surface; // new in v.108
+ static float DBG_GF_low; // new in v.108
+ static float DBG_GF_high; // new in v.108
+ static float DBG_const_ppO2; // new in v.108
+ static float DBG_deco_ppO2_change; // new in v.108
+ static float DBG_deco_ppO2; // new in v.108
+ static float DBG_deco_N2_ratio; // new in v.108
+ static float DBG_deco_He_ratio; // new in v.108
+ static float DBG_deco_gas_change; // new in v.108
+ static float DBG_float_saturation_multiplier; // new in v.108
+ static float DBG_float_desaturation_multiplier; // new in v.108
+ static float DBG_float_deco_distance; // new in v.108
+ static float DBG_deco_N2_ratio; // new in v.108
+ static float DBG_deco_He_ratio; // new in v.108
+ static float DBG_N2_ratio; // new in v.108
+ static float DBG_He_ratio; // new in v.108
+ static char flag_in_divemode; // new in v.108
+ static int int_dbg_i; // new in v.108
+ unsigned int temp_DBS;
+
+// *************************
+// ** P R O T O T Y P E S **
+// *************************
+void main_calc_hauptroutine(void);
+void main_calc_without_deco(void);
+void main_clear_tissue(void);
+void main_calc_percentage(void);
+void main_calc_wo_deco_step_1_min(void);
+void main_debug(void);
+void main_gradient_array(void);
+void main_hash(void);
+
+void calc_hauptroutine(void);
+void calc_tissue(void);
+void calc_nullzeit(void);
+void backup_sim_pres_tissue(void);
+void restore_sim_pres_tissue(void);
+
+void calc_without_deco(void);
+void clear_tissue(void);
+void calc_ascenttime(void);
+void update_startvalues(void);
+void clear_decoarray(void);
+void update_decoarray(void);
+void sim_tissue_1min(void);
+void sim_tissue_10min(void);
+void calc_gradient_factor(void);
+void calc_gradient_array_only(void);
+void calc_desaturation_time(void);
+void calc_wo_deco_step_1_min(void);
+void calc_tissue_step_1_min(void);
+void hash(void);
+void clear_CNS_fraction(void);
+void calc_CNS_fraction(void);
+void calc_CNS_decrease_15min(void);
+void calc_percentage(void);
+void main(void);
+void calc_hauptroutine_data_input(void);
+void calc_hauptroutine_update_tissues(void);
+void calc_hauptroutine_calc_deco(void);
+void calc_hauptroutine_calc_ascend_to_deco(void);
+void calc_nextdecodepth_GF(void);
+void copy_deco_table_GF(void);
+void clear_internal_deco_table_GF(void);
+void update_internal_deco_table_GF(void);
+void DD2_write(void);
+void DD2_write_incon42(void);
+void DD2_get_pointer_to_char(void);
+void DD2_set_column(void);
+void DD2_load_background(void);
+void DD2_build_one_line_of_char(void);
+void DD2_print_column(void);
+void DD2_CmdWrite(void);
+void DD2_DataWrite(void);
+void push_tissues_to_vault(void);
+void pull_tissues_from_vault(void);
+void main_push_tissues_to_vault(void);
+void main_pull_tissues_from_vault(void);
+void wordprocessor(void);
+
+// *******************************
+// ** start **
+// ** necessary for compilation **
+// *******************************
+#pragma romdata der_code = 0x0000
+#pragma code der_start = 0x0000
+void der_start(void)
+{
+_asm
+ goto main
+_endasm
+}
+
+// ***********************************
+// ** main code for simulation / **
+// ** tests without assembler code **
+// ** is NOT a part of the OSTC **
+// ***********************************
+#pragma code main = 0x9000
+void main(void)
+{
+#if 1
+// new main to test DR-5
+
+wp_top = 10;
+wp_leftx2 = 10;
+wp_color1 = 255;
+wp_color2 = 255;
+wp_font = 0;
+wp_invert = 0;
+wp_stringstore[0] = '°';
+wp_stringstore[1] = '1';
+wp_stringstore[2] = 'a';
+wp_stringstore[3] = ':';
+wp_stringstore[4] = 0;
+wordprocessor();
+
+GF_low = 1.0;
+GF_high = 1.0;
+
+GF_temp = GF_low * GF_high;
+
+clear_CNS_fraction();
+//char_I_const_ppO2 = 100;
+//for (main_i=0;main_i<255;main_i++)
+//{
+//calc_CNS_fraction();
+//} //for
+
+
+
+
+int_I_pres_respiration = 1000;//980;
+int_I_pres_surface = 1000;//980;
+char_I_N2_ratio = 39; //38;
+char_I_He_ratio = 40; //50;
+char_I_deco_distance = 0; // 10 = 1 meter
+char_I_depth_last_deco = 3; // values below 3 (meter) are ignored
+
+char_I_const_ppO2 = 0;
+char_I_deco_ppO2_change = 0; // [dm] 10 = 1 meter
+char_I_deco_ppO2 = 0;
+
+char_I_deco_gas_change = 0; // [m] 1 = 1 meter
+char_I_deco_N2_ratio = 0;
+char_I_deco_He_ratio = 0;
+
+//char_I_actual_ppO2; // 0x507
+char_I_GF_High_percentage = 100; // 0x514 new in v.102
+char_I_GF_Low_percentage = 100; // 0x515 new in v.102
+
+char_I_saturation_multiplier = 110;
+char_I_desaturation_multiplier = 90;
+
+char_I_deco_model = 0;
+
+main_clear_tissue();
+
+int_I_pres_respiration = 1000 + int_I_pres_surface;
+main_calc_wo_deco_step_1_min();
+int_I_pres_respiration = 3000 + int_I_pres_surface;
+main_calc_wo_deco_step_1_min();
+int_I_pres_respiration = 5000 + int_I_pres_surface;
+main_calc_wo_deco_step_1_min();
+
+/*
+int_I_pres_respiration = 6000 + int_I_pres_surface;
+for (main_i=0;main_i<27;main_i++)
+ main_calc_wo_deco_step_1_min();
+*/
+
+char_O_deco_status = 255;
+while (char_O_deco_status)
+ main_calc_hauptroutine();
+_asm
+nop
+_endasm
+
+for (main_i=0;main_i<50;main_i++)
+{
+main_calc_hauptroutine();
+}
+int_I_pres_respiration = 10000;
+for (main_i=0;main_i<1500;main_i++)
+{
+main_calc_hauptroutine();
+}
+
+_asm
+nop
+_endasm
+
+
+int_I_pres_respiration = 3000;
+for (main_i=0;main_i<150;main_i++)
+{
+ calc_hauptroutine_data_input();
+ calc_hauptroutine_update_tissues();
+} //for
+
+ update_startvalues();
+ clear_decoarray();
+ clear_internal_deco_table_GF();
+ calc_hauptroutine_calc_ascend_to_deco();
+ if (char_O_deco_status > 15) // can't go up to first deco, too deep to calculate in the given time slot
+ {
+ char_O_deco_status = 2;
+// char_O_lock_depth_list = 255;
+ }
+ else
+ {
+// char_O_lock_depth_list = lock_GF_depth_list;
+ calc_hauptroutine_calc_deco();
+ }
+// build_debug_output();
+
+_asm
+nop
+_endasm
+while (char_O_deco_status == 1)
+{
+ char_O_deco_status = 0;
+// char_O_lock_depth_list = 255;
+ calc_hauptroutine_calc_deco();
+// build_debug_output();
+_asm
+nop
+_endasm
+};
+debug_temp = 60; // [mtr Aufstieg in 10 mtr/min (30steps'2sec/min]
+int_I_pres_respiration = 9980;
+for (main_i=0;main_i 15) // can't go up to first deco, too deep to calculate in the given time slot
+ {
+ char_O_deco_status = 2;
+// char_O_lock_depth_list = 255;
+ }
+ else
+ {
+// char_O_lock_depth_list = lock_GF_depth_list;
+ calc_hauptroutine_calc_deco();
+ }
+// build_debug_output();
+
+_asm
+nop
+_endasm
+while (char_O_deco_status == 1)
+{
+ char_O_deco_status = 0;
+// char_O_lock_depth_list = 255;
+ calc_hauptroutine_calc_deco();
+// build_debug_output();
+_asm
+nop
+_endasm
+};
+_asm
+nop
+_endasm
+debug_temp = 60; // [mtr Aufstieg in 10 mtr/min (30steps'2sec/min]
+int_I_pres_respiration = 9980;
+debug_temp = debug_temp * 3;
+for (main_i=0;main_i 1.3)
+ int_O_DBS_bitfield |= DBS_SAT2h;
+ if(GF_low < 0.19)
+ int_O_DBS_bitfield |= DBS_GFLOW2l;
+ if(GF_low > 1.01)
+ int_O_DBS_bitfield |= DBS_GFLOW2h;
+ if(GF_high < 0.6)
+ int_O_DBS_bitfield |= DBS_GFHGH2l;
+ if(GF_high > 1.01)
+ int_O_DBS_bitfield |= DBS_GFHGH2h;
+ if((N2_ratio + He_ratio) > 0.95)
+ int_O_DBS_bitfield |= DBS_GASO22l;
+ if((N2_ratio + He_ratio) < 0.05)
+ int_O_DBS_bitfield |= DBS_GASO22h;
+ if(float_deco_distance > 0.25)
+ int_O_DBS_bitfield |= DBS_DIST2h;
+ if(char_I_depth_last_deco > 8)
+ int_O_DBS_bitfield |= DBS_LAST2h;
+ if(DBG_deco_gas_change && ((deco_N2_ratio + deco_He_ratio) > 0.95))
+ int_O_DBS_bitfield |= DBS_DECOO2l;
+ if(DBG_deco_gas_change && ((deco_N2_ratio + deco_He_ratio) < 0.05))
+ int_O_DBS_bitfield |= DBS_DECOO2h;
+ if(pres_respiration > 3.0)
+ int_O_DBS2_bitfield |= DBS2_PRES2h;
+ if(pres_surface - pres_respiration > 0.2)
+ int_O_DBS2_bitfield |= DBS2_PRES2l;
+ if(pres_surface < 0.75)
+ int_O_DBS2_bitfield |= DBS2_SURF2l;
+ if(pres_surface > 1.11)
+ int_O_DBS2_bitfield |= DBS2_SURF2h;
+ if(float_desaturation_multiplier < 0.70)
+ int_O_DBS2_bitfield |= DBS2_DESAT2l;
+ if(float_desaturation_multiplier > 1.01)
+ int_O_DBS2_bitfield |= DBS2_DESAT2h;
+ if(GF_low > GF_high)
+ int_O_DBS2_bitfield |= DBS2_GFDneg;
+}
+
+// -------------------------------
+// DBG - set DBG to end_of_dive //
+// -------------------------------
+void set_dbg_end_of_dive(void)
+{
+ int_O_DBG_pre_bitfield &= (~DBG_RUN);
+ int_O_DBG_post_bitfield &= (~DBG_RUN);
+}
+
+// -------------------------------
+// DBG - NDL at first 20 m. hit //
+// -------------------------------
+void check_ndl(void)
+{
+ if((char_O_NDL_at_20mtr == -1) && (int_I_pres_respiration > 3000))
+ {
+ char_O_NDL_at_20mtr = char_O_nullzeit;
+ if(char_O_NDL_at_20mtr == 255)
+ char_O_NDL_at_20mtr == 254;
+ }
+}
+
+// -------------------------------
+// DBG - multi main during dive //
+// -------------------------------
+void check_dbg(char is_post_check)
+{
+ temp_DBS = 0;
+ if( (DBG_N2_ratio != N2_ratio) || (DBG_He_ratio != He_ratio) )
+ temp_DBS |= DBG_c_gas;
+ if(DBG_const_ppO2 != const_ppO2)
+ temp_DBS |= DBG_c_ppO2;
+ if((DBG_float_saturation_multiplier != float_saturation_multiplier) || (DBG_float_desaturation_multiplier != float_desaturation_multiplier))
+ temp_DBS |= DBG_CdeSAT;
+ if(DBG_char_I_deco_model != char_I_deco_model)
+ temp_DBS |= DBG_C_MODE;
+ if(DBG_pres_surface != pres_surface)
+ temp_DBS |= DBG_C_SURF;
+ if((!DBS_HE_sat) && (!He_ratio))
+ for(int_dbg_i = 16; int_dbg_i < 32; int_dbg_i++)
+ if(pres_tissue[int_dbg_i])
+ temp_DBS |= DBG_HEwoHE;
+ if(DBG_deco_ppO2 != deco_ppO2)
+ temp_DBS |= DBG_C_DPPO2;
+ if((DBG_deco_gas_change != deco_gas_change) || (DBG_deco_N2_ratio != deco_N2_ratio) || (DBG_deco_He_ratio != deco_He_ratio))
+ temp_DBS |= DBG_C_DGAS;
+ if(DBG_float_deco_distance != float_deco_distance)
+ temp_DBS |= DBG_C_DIST;
+ if(DBG_char_I_depth_last_deco != char_I_depth_last_deco)
+ temp_DBS |= DBG_C_LAST;
+ if((DBG_GF_low != GF_low) || (DBG_GF_high != GF_high))
+ temp_DBS |= DBG_C_GF;
+ if(pres_respiration > 13.0)
+ temp_DBS |= DBG_PHIGH;
+ if(pres_surface - pres_respiration > 0.2)
+ temp_DBS |= DBG_PLOW;
+/*
+ if()
+ temp_DBS |= ;
+ if()
+ temp_DBS |= ;
+ */
+ if(is_post_check)
+ int_O_DBG_post_bitfield |= temp_DBS;
+ else
+ int_O_DBG_pre_bitfield |= temp_DBS;
+}
+
+// -------------------------------
+// DBG - prior to calc. of dive //
+// -------------------------------
+void check_pre_dbg(void)
+{
+ check_dbg(0);
+}
+
+// -------------------------------
+// DBG - after decocalc of dive //
+// -------------------------------
+void check_post_dbg(void)
+{
+ check_dbg(1);
+}
+
+
+
+// -------------------------
+// calc_next_decodepth_GF //
+// -------------------------
+// new in v.102
+void calc_nextdecodepth_GF(void)
+{
+// INPUT, changing during dive:
+// temp_pres_gtissue_limit_GF_low
+// temp_pres_gtissue_limit_GF_low_below_surface
+// temp_pres_gtissue
+// temp_pres_gtissue_diff
+// lock_GF_depth_list
+
+// INPUT, fixed during dive:
+// pres_surface
+// GF_delta
+// GF_high
+// GF_low
+// temp_depth_last_deco
+// float_deco_distance
+
+// OUTPUT
+// GF_step
+// temp_deco
+// temp_depth_limt
+// lock_GF_depth_list
+
+// USES
+// temp1
+// temp2
+// int_temp
+
+ char_I_table_deco_done[0] = 0; // safety if changed somewhere else. Needed for exit
+ if (char_I_deco_model == 1)
+ {
+ if (lock_GF_depth_list == 0)
+ {
+ temp2 = temp_pres_gtissue_limit_GF_low_below_surface / 0.29985; // = ... / 99.95 / 0.003;
+ int_temp = (int) (temp2 + 0.99);
+ if (int_temp > 31)
+ int_temp = 31; // deepest deco at 93 meter (31 deco stops)
+ if (int_temp < 0)
+ int_temp = 0;
+ temp_depth_GF_low_number = int_temp;
+ temp_depth_GF_low_meter = 3 * temp_depth_GF_low_number;
+ temp2 = (float)temp_depth_GF_low_meter * 0.09995;
+ temp_pres_deco_GF_low = temp2 + float_deco_distance + pres_surface;
+ if (temp_depth_GF_low_number == 0)
+ GF_step = 0;
+ else
+ GF_step = GF_delta / (float)temp_depth_GF_low_number;
+ if (GF_step < 0)
+ GF_step = 0;
+ if (GF_step > GF_delta)
+ GF_step = GF_delta;
+ int_O_GF_step = (int)(GF_step * 10000);
+ int_O_limit_GF_low = (int)(temp_pres_deco_GF_low * 1000);
+ int_O_gtissue_press_at_GF_low = (int)(temp_pres_gtissue * 1000);
+ char_O_GF_low_pointer = temp_depth_GF_low_number;
+ lock_GF_depth_list = 1;
+ internal_deco_pointer = 0;
+ }
+ if (internal_deco_pointer == 0) // new run
+ {
+ internal_deco_pointer = temp_depth_GF_low_number;
+ GF_temp = GF_high - ((float)internal_deco_pointer * GF_step);
+ int_temp = char_I_table_deco_done[internal_deco_pointer];
+ output[8] = int_temp;
+ output[9] = 33;
+ }
+ else
+ {
+ int_temp = 1;
+ }
+ while (int_temp == 1)
+ {
+ int_temp = internal_deco_pointer - 1;
+ if (int_temp == 1) // new in v104
+ {
+ temp2 = (float)(temp_depth_last_deco * int_temp) * 0.09995;
+ GF_step2 = GF_step/3.0 * ((float)(6 - temp_depth_last_deco));
+ }
+ else
+ if (int_temp == 0)
+ {
+ temp2 = 0.0;
+ GF_step2 = GF_high - GF_temp;
+ }
+ else
+ {
+ temp2 = (float)(3 *int_temp) * 0.09995;
+ GF_step2 = GF_step;
+ }
+ temp2 = temp2 + pres_surface; // next deco stop to be tested
+ temp1 = ((GF_temp + GF_step2)* temp_pres_gtissue_diff) + temp_pres_gtissue; // upper limit (lowest pressure allowed) // changes GF_step2 in v104
+ if (temp1 > temp2) // check if ascent to next deco stop is ok
+ {
+ int_temp = 0; // no
+ }
+ else
+ {
+ internal_deco_pointer = int_temp;
+ GF_temp = GF_temp + GF_step2; // changed in v104
+ int_temp = char_I_table_deco_done[internal_deco_pointer]; // yes and check for ascent to even next stop if deco_done is set
+ }
+ } // while
+ if (internal_deco_pointer > 0)
+ {
+ temp2 = (float)(0.29985 * internal_deco_pointer);
+ temp_deco = temp2 + float_deco_distance + pres_surface;
+ if (internal_deco_pointer == 1) // new in v104
+ temp_depth_limit = temp_depth_last_deco;
+ else
+ temp_depth_limit = 3 * internal_deco_pointer;
+ if (output[9] == 33)
+ {
+ output[9] = internal_deco_pointer;
+ output[10] = char_I_table_deco_done[internal_deco_pointer];
+ output[12] = output[12] + 1;
+ if (output[12] == 100)
+ output[12] = 0;
+ }
+ }
+ else // if (char_I_deco_model == 1)
+ {
+ temp_deco = pres_surface;
+ temp_depth_limit = 0;
+ }
+ }
+ else
+ {
+ // calc_nextdecodepth - original
+ // optimized in v.101
+ // depth_last_deco included in v.101
+
+ temp1 = temp_pres_gtissue_limit - pres_surface;
+ if (temp1 >= 0)
+ {
+ temp1 = temp1 / 0.29985; // = temp1 / 99.95 / 0.003;
+ temp_depth_limit = (int) (temp1 + 0.99);
+ temp_depth_limit = 3 * temp_depth_limit; // depth for deco [m]
+ if (temp_depth_limit == 0)
+ temp_deco = pres_surface;
+ else
+ {
+ if (temp_depth_limit < temp_depth_last_deco)
+ temp_depth_limit = temp_depth_last_deco;
+ temp1 = (float)temp_depth_limit * 0.09995;
+ temp_deco = temp1 + float_deco_distance + pres_surface; // depth for deco [bar]
+ } // if (temp_depth_limit == 0)
+ } // if (temp1 >= 0)
+ else
+ {
+ temp_deco = pres_surface;
+ temp_depth_limit = 0;
+ } // if (temp1 >= 0)
+ } // calc_nextdecodepth original
+} // calc_nextdecodepth_GF
+
+
+#if 0
+void build_debug_output(void)
+{
+output[0] = 0; // not used in asm PLED output
+output[1] = (int) (GF_low * 100);
+output[2] = (int) (GF_high * 100);
+output[3] = (int) (GF_step * 100);
+output[4] = (int) temp_depth_GF_low_number;
+output[5] = (int) temp_depth_GF_low_meter;
+//output[6]
+output[7] = (int) internal_deco_pointer;
+//output[8] = char_I_table_deco_done[temp_depth_GF_low_number]
+//output[9] = internal_deco_pointer @ new run
+//output[10] = char_I_table_deco_done[internal_deco_pointer] @ new run
+output [11] = (int) (temp_pres_deco_GF_low * 10);
+} // build_debug_output
+#endif
+
+// ---------------------
+// copy_deco_table_GF //
+// ---------------------
+// new in v.102
+void copy_deco_table_GF(void)
+{
+ if (char_I_deco_model == 1)
+ {
+ int_temp = 32;
+ for (ci=0;ci // new table for deco_main_v.101 (var_a modified)
+
+#pragma romdata tables2 = 0x10600
+rom const rom unsigned int md_pi[] =
+{
+ 0x292E, 0x43C9, 0xA2D8, 0x7C01, 0x3D36, 0x54A1, 0xECF0, 0x0613
+ , 0x62A7, 0x05F3, 0xC0C7, 0x738C, 0x9893, 0x2BD9, 0xBC4C, 0x82CA
+ , 0x1E9B, 0x573C, 0xFDD4, 0xE016, 0x6742, 0x6F18, 0x8A17, 0xE512
+ , 0xBE4E, 0xC4D6, 0xDA9E, 0xDE49, 0xA0FB, 0xF58E, 0xBB2F, 0xEE7A
+ , 0xA968, 0x7991, 0x15B2, 0x073F, 0x94C2, 0x1089, 0x0B22, 0x5F21
+ , 0x807F, 0x5D9A, 0x5A90, 0x3227, 0x353E, 0xCCE7, 0xBFF7, 0x9703
+ , 0xFF19, 0x30B3, 0x48A5, 0xB5D1, 0xD75E, 0x922A, 0xAC56, 0xAAC6
+ , 0x4FB8, 0x38D2, 0x96A4, 0x7DB6, 0x76FC, 0x6BE2, 0x9C74, 0x04F1
+ , 0x459D, 0x7059, 0x6471, 0x8720, 0x865B, 0xCF65, 0xE62D, 0xA802
+ , 0x1B60, 0x25AD, 0xAEB0, 0xB9F6, 0x1C46, 0x6169, 0x3440, 0x7E0F
+ , 0x5547, 0xA323, 0xDD51, 0xAF3A, 0xC35C, 0xF9CE, 0xBAC5, 0xEA26
+ , 0x2C53, 0x0D6E, 0x8528, 0x8409, 0xD3DF, 0xCDF4, 0x4181, 0x4D52
+ , 0x6ADC, 0x37C8, 0x6CC1, 0xABFA, 0x24E1, 0x7B08, 0x0CBD, 0xB14A
+ , 0x7888, 0x958B, 0xE363, 0xE86D, 0xE9CB, 0xD5FE, 0x3B00, 0x1D39
+ , 0xF2EF, 0xB70E, 0x6658, 0xD0E4, 0xA677, 0x72F8, 0xEB75, 0x4B0A
+ , 0x3144, 0x50B4, 0x8FED, 0x1F1A, 0xDB99, 0x8D33, 0x9F11, 0x8314
+};
+
+// *********************
+// *********************
+// ** THE SUBROUTINES **
+// *********************
+// *********************
+
+#pragma code subroutines = 0x10700 // can be adapted to fit the romdata tables ahead
+
+
+// ---------------
+// CLEAR tissue //
+// ---------------
+// optimized in v.101 (var_a)
+
+void clear_tissue(void) // preload tissues with standard pressure for the given ambient pressure
+{
+
+ flag_in_divemode = 0;
+ int_O_DBS_bitfield = 0;
+ int_O_DBS2_bitfield = 0;
+ int_O_DBG_pre_bitfield = 0;
+ int_O_DBG_post_bitfield = 0;
+ char_O_NDL_at_20mtr = 255;
+
+_asm
+lfsr 1, 0x300 // C math routines shall use this variable bank
+movlw 0x01
+movwf TBLPTRU,0
+_endasm
+
+// N2_ratio = (float)char_I_N2_ratio; // the 0.0002 of 0.7902 are missing with standard air
+ N2_ratio = 0.7902; // N2_ratio / 100.0;
+ pres_respiration = (float)int_I_pres_respiration / 1000.0;
+for (ci=0;ci<16;ci++) // cycle through the 16 b"uhlmann tissues
+{
+ pres_tissue[ci] = N2_ratio * (pres_respiration - 0.0627) ;
+_asm
+movlw 0x02
+movwf TBLPTRH,0
+movlb 4 // fuer ci
+movf ci,0,1
+addwf ci,0,1
+addwf ci,0,1
+addwf ci,0,1
+addlw 0x80
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var_a+1
+TBLRDPOSTINC
+movff TABLAT,var_a
+TBLRDPOSTINC
+movff TABLAT,var_a+3
+TBLRD
+movff TABLAT,var_a+2
+addlw 0x80
+movwf TBLPTRL,0
+incf TBLPTRH,1,0
+TBLRDPOSTINC
+movff TABLAT,var_b+1
+TBLRDPOSTINC
+movff TABLAT,var_b
+TBLRDPOSTINC
+movff TABLAT,var_b+3
+TBLRD
+movff TABLAT,var_b+2
+_endasm
+
+pres_tissue_limit[ci] = (pres_tissue[ci] - var_a) * var_b ;
+// now update the guiding tissue
+if (pres_tissue_limit[ci] < 0)
+pres_tissue_limit[ci] = 0;
+} // for 0 to 16
+
+for (ci=16;ci<32;ci++) // cycle through the 16 b"uhlmann tissues for Helium
+{
+ pres_tissue[ci] = 0.0;
+} // for
+
+ clear_decoarray();
+ char_O_deco_status = 0;
+ char_O_nullzeit = 0;
+ char_O_ascenttime = 0;
+ char_O_gradient_factor = 0;
+ char_O_relative_gradient_GF = 0;
+} // clear_tissue(void)
+
+
+// --------------------
+// calc_without_deco //
+// fixed N2_ratio ! //
+// --------------------
+// optimized in v.101 (float_..saturation_multiplier)
+
+void calc_without_deco(void)
+{
+_asm
+ lfsr 1, 0x300
+_endasm
+ N2_ratio = 0.7902; // FIXED RATIO !! sum as stated in b"uhlmann
+ pres_respiration = (float)int_I_pres_respiration / 1000.0; // assembler code uses different digit system
+ pres_surface = (float)int_I_pres_surface / 1000.0;
+ temp_atem = N2_ratio * (pres_respiration - 0.0627); // 0.0627 is the extra pressure in the body
+ temp2_atem = 0.0;
+ temp_surface = pres_surface; // the b"uhlmann formula using temp_surface does apply to the pressure without any inert ratio
+ float_desaturation_multiplier = char_I_desaturation_multiplier / 100.0;
+ float_saturation_multiplier = char_I_saturation_multiplier / 100.0;
+
+ calc_tissue(); // update the pressure in the 16 tissues in accordance with the new ambient pressure
+
+ clear_decoarray();
+ char_O_deco_status = 0;
+ char_O_nullzeit = 0;
+ char_O_ascenttime = 0;
+ calc_gradient_factor();
+
+} // calc_without_deco
+
+
+// --------------------
+// calc_hauptroutine //
+// --------------------
+// this is the major code in dive mode
+// calculates:
+// the tissues,
+// the bottom time
+// and simulates the ascend with all deco stops
+
+void calc_hauptroutine(void)
+{
+ calc_hauptroutine_data_input();
+
+ if(!flag_in_divemode)
+ {
+ flag_in_divemode = 1;
+ create_dbs_set_dbg_and_ndl20mtr();
+ }
+ else
+ check_pre_dbg();
+
+ calc_hauptroutine_update_tissues();
+ calc_gradient_factor();
+
+
+ switch (char_O_deco_status) // toggle between calculation for nullzeit (bottom time), deco stops and more deco stops (continue)
+ {
+ case 0:
+ update_startvalues();
+ calc_nullzeit();
+ check_ndl();
+ char_O_deco_status = 255; // calc deco next time
+ break;
+ case 1:
+ if (char_O_deco_status == 3)
+ break;
+ char_O_deco_status = 0;
+// char_O_lock_depth_list = 255;
+ calc_hauptroutine_calc_deco();
+// build_debug_output();
+ break;
+ case 3: // new dive
+ clear_decoarray();
+ clear_internal_deco_table_GF();
+ copy_deco_table_GF();
+ internal_deco_pointer = 0;
+ lock_GF_depth_list = 0;
+ update_startvalues();
+ calc_nextdecodepth_GF();
+ char_O_deco_status = 0;
+ break;
+ default:
+ update_startvalues();
+ clear_decoarray();
+ clear_internal_deco_table_GF();
+ output[6] = 1;
+ calc_hauptroutine_calc_ascend_to_deco();
+ if (char_O_deco_status > 15) // can't go up to first deco, too deep to calculate in the given time slot
+ {
+ char_O_deco_status = 2;
+// char_O_lock_depth_list = 255;
+ }
+ else
+ {
+// char_O_lock_depth_list = lock_GF_depth_list;
+ calc_hauptroutine_calc_deco();
+ }
+// build_debug_output();
+ break;
+ }
+ calc_ascenttime();
+ check_post_dbg();
+}
+
+void calc_hauptroutine_data_input(void)
+{
+ pres_respiration = (float)int_I_pres_respiration / 1000.0;
+ pres_surface = (float)int_I_pres_surface / 1000.0;
+
+ N2_ratio = (float)char_I_N2_ratio / 100.0;; // the 0.0002 of 0.7902 are missing with standard air
+ He_ratio = (float)char_I_He_ratio / 100.0;;
+ deco_N2_ratio = (float)char_I_deco_N2_ratio / 100.0;
+ deco_He_ratio = (float)char_I_deco_He_ratio / 100.0;
+ float_deco_distance = (float)char_I_deco_distance / 100.0;
+ if(char_I_deco_gas_change)
+ {
+ deco_gas_change = (float)char_I_deco_gas_change / 9.995 + pres_surface;
+ deco_gas_change = deco_gas_change + float_deco_distance;
+ }
+ else
+ deco_gas_change = 0;
+ const_ppO2 = (float)char_I_const_ppO2 / 100.0;
+ deco_ppO2_change = (float)char_I_deco_ppO2_change / 99.95 + pres_surface;
+ deco_ppO2_change = deco_ppO2_change + float_deco_distance;
+ deco_ppO2 = (float)char_I_deco_ppO2 / 100.0;
+ float_desaturation_multiplier = char_I_desaturation_multiplier / 100.0;
+ float_saturation_multiplier = char_I_saturation_multiplier / 100.0;
+ GF_low = (float)char_I_GF_Low_percentage / 100.0;
+ GF_high = (float)char_I_GF_High_percentage / 100.0;
+ GF_delta = GF_high - GF_low;
+
+ temp2 = (pres_respiration - pres_surface) / 0.29985;
+ int_temp = (int)(temp2);
+ if (int_temp < 0)
+ int_temp = 0;
+ if (int_temp > 255)
+ int_temp = 255;
+ char_O_actual_pointer = int_temp;
+
+ temp_depth_last_deco = (int)char_I_depth_last_deco;
+}
+
+void calc_hauptroutine_update_tissues(void)
+{
+ int_O_calc_tissue_call_counter = int_O_calc_tissue_call_counter + 1;
+ if (char_I_const_ppO2 == 0) // new in v.101
+ pres_diluent = pres_respiration; // new in v.101
+ else // new in v.101
+ pres_diluent = ((pres_respiration - const_ppO2)/(N2_ratio + He_ratio)); // new in v.101
+ if (pres_diluent > pres_respiration) // new in v.101
+ pres_diluent = pres_respiration; // new in v.101
+ if (pres_diluent > 0.0627) // new in v.101
+ {
+ temp_atem = N2_ratio * (pres_diluent - 0.0627); // changed in v.101
+ temp2_atem = He_ratio * (pres_diluent - 0.0627); // changed in v.101
+ char_O_diluent = (char)(pres_diluent/pres_respiration*100.0);
+ }
+ else // new in v.101
+ {
+ temp_atem = 0.0; // new in v.101
+ temp2_atem = 0.0; // new in v.101
+ char_O_diluent = 0;
+ }
+ temp_surface = pres_surface;
+ calc_tissue();
+ int_O_gtissue_limit = (int)(pres_tissue_limit[char_O_gtissue_no] * 1000);
+ int_O_gtissue_press = (int)((pres_tissue[char_O_gtissue_no] + pres_tissue[char_O_gtissue_no+16]) * 1000);
+ if (char_I_deco_model == 1)
+ {
+ temp1 = temp1 * GF_high;
+ }
+ else
+ {
+ temp1 = temp_surface;
+ }
+ if (pres_gtissue_limit > temp1 && char_O_deco_status == 0) // if guiding tissue can not be exposed to surface pressure immediately
+ {
+ char_O_nullzeit = 0; // deco necessary
+ char_O_deco_status = 255; // calculate deco skip nullzeit calculation
+ }
+} // calc_hauptroutine_update_tissues
+void calc_hauptroutine_calc_deco(void)
+{
+ do
+ {
+ int_temp_decostatus = 0;
+ calc_nextdecodepth_GF();
+ if (temp_depth_limit > 0)
+ {
+ if (char_I_const_ppO2 == 0) // new in v.101
+ {
+ deco_diluent = temp_deco; // new in v.101
+ if (temp_deco > deco_gas_change)
+ {
+ calc_N2_ratio = N2_ratio;
+ calc_He_ratio = He_ratio;
+ }
+ else
+ {
+ calc_N2_ratio = deco_N2_ratio;
+ calc_He_ratio = deco_He_ratio;
+ }
+ }
+ else // new in v.101
+ {
+ calc_N2_ratio = N2_ratio;
+ calc_He_ratio = He_ratio;
+ if (temp_deco > deco_ppO2_change)
+ {
+ deco_diluent = ((temp_deco - const_ppO2)/(N2_ratio + He_ratio)); // new in v.101
+ }
+ else
+ {
+ deco_diluent = ((temp_deco - deco_ppO2)/(N2_ratio + He_ratio)); // new in v.101
+ }
+ }
+ if (deco_diluent > temp_deco) // new in v.101
+ deco_diluent = temp_deco; // new in v.101
+ if (deco_diluent > 0.0627) // new in v.101
+ {
+ temp_atem = calc_N2_ratio * (deco_diluent - 0.0627); // changed in v.101
+ temp2_atem = calc_He_ratio * (deco_diluent - 0.0627); // changed in v.101
+ }
+ else // new in v.101
+ {
+ temp_atem = 0.0; // new in v.101
+ temp2_atem = 0.0; // new in v.101
+ }
+ sim_tissue_1min();
+ update_internal_deco_table_GF();
+ temp_decotime = 1;
+ update_decoarray();
+ char_O_deco_status = char_O_deco_status + 1;
+ if (char_O_deco_status < 16)
+ int_temp_decostatus = 1;
+ }
+ else // if (temp_depth_limit > 0)
+ {
+ char_O_deco_status = 0;
+ }
+ } while (int_temp_decostatus == 1);
+ if (char_O_deco_status > 15)
+ {
+ char_O_deco_status = 1;
+ }
+ else
+ {
+ copy_deco_table_GF();
+ char_O_deco_status = 0;
+ }
+}
+
+void calc_hauptroutine_calc_ascend_to_deco(void)
+{
+ update_startvalues();
+ char_O_deco_status = 0;
+ temp_deco = pres_respiration;
+ lock_GF_depth_list = 1; // new in v.102
+ do // go up to first deco
+ {
+ int_temp_decostatus = 0;
+ temp_deco = temp_deco - 1.0;
+ if ( char_I_deco_model == 1) // new in v.102 , 4 = deep stops
+ temp_limit = temp_pres_gtissue_limit_GF_low;
+ else
+ temp_limit = temp_pres_gtissue_limit;
+ if ((temp_deco > temp_limit) && (temp_deco > pres_surface)) // changes in v.102
+ {
+ lock_GF_depth_list = 0; // new in v.102, distance to first stop > 10 mtr.
+ output[6] = 0;
+ if (char_I_const_ppO2 == 0) // new in v.101 // calculate at half of the ascent
+ {
+ deco_diluent = temp_deco + 0.5; // new in v.101
+ if (temp_deco + 0.5 > deco_gas_change)
+ {
+ calc_N2_ratio = N2_ratio;
+ calc_He_ratio = He_ratio;
+ }
+ else
+ {
+ calc_N2_ratio = deco_N2_ratio;
+ calc_He_ratio = deco_He_ratio;
+ }
+ }
+ else // new in v.101
+ {
+ calc_N2_ratio = N2_ratio;
+ calc_He_ratio = He_ratio;
+ if (temp_deco + 0.5 > deco_ppO2_change)
+ deco_diluent = ((temp_deco + 0.5 - const_ppO2)/(N2_ratio + He_ratio)); // new in v.101 // calculate at half of the ascent
+ else
+ deco_diluent = ((temp_deco + 0.5 - deco_ppO2)/(N2_ratio + He_ratio)); // new in v.101 // calculate at half of the ascent
+ if (deco_diluent > (temp_deco +0.5)) // new in v.101
+ deco_diluent = temp_deco + 0.5; // new in v.101 // calculate at half of the ascent
+ }
+ if (deco_diluent > 0.0627) // new in v.101
+ {
+ temp_atem = calc_N2_ratio * (deco_diluent - 0.0627); // changed in v.101
+ temp2_atem = calc_He_ratio * (deco_diluent - 0.0627); // changed in v.101
+ }
+ else // new in v.101
+ {
+ temp_atem = 0.0; // new in v.101
+ temp2_atem = 0.0; // new in v.101
+ }
+ sim_tissue_1min();
+ char_O_deco_status = char_O_deco_status + 1;
+ if (char_O_deco_status < 16) // 16 is the limit of calculations for one time slot
+ int_temp_decostatus = 1;
+ }
+ } while (int_temp_decostatus == 1);
+} // calc_hauptroutine_calc_ascend_to_deco
+
+// --------------
+// calc_tissue //
+// --------------
+// optimized in v.101
+
+void calc_tissue(void)
+{
+_asm
+lfsr 1, 0x300
+movlw 0x01
+movwf TBLPTRU,0
+_endasm
+
+ char_O_gtissue_no = 255;
+ pres_gtissue_limit = 0.0;
+
+for (ci=0;ci<16;ci++)
+{
+_asm
+movlw 0x02
+movwf TBLPTRH,0
+movlb 4 // fuer ci
+movf ci,0,1
+addwf ci,0,1
+addwf ci,0,1
+addwf ci,0,1
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var_e2secs+1 // the order is confussing
+TBLRDPOSTINC
+movff TABLAT,var_e2secs // low byte first, high afterwards
+TBLRDPOSTINC
+movff TABLAT,var_e2secs+3
+TBLRD
+movff TABLAT,var_e2secs+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var2_e2secs+1
+TBLRDPOSTINC
+movff TABLAT,var2_e2secs
+TBLRDPOSTINC
+movff TABLAT,var2_e2secs+3
+TBLRD
+movff TABLAT,var2_e2secs+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var_a+1
+TBLRDPOSTINC
+movff TABLAT,var_a
+TBLRDPOSTINC
+movff TABLAT,var_a+3
+TBLRD
+movff TABLAT,var_a+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var2_a+1
+TBLRDPOSTINC
+movff TABLAT,var2_a
+TBLRDPOSTINC
+movff TABLAT,var2_a+3
+TBLRD
+movff TABLAT,var2_a+2
+addlw 0x40
+movwf TBLPTRL,0
+incf TBLPTRH,1,0
+TBLRDPOSTINC
+movff TABLAT,var_b+1
+TBLRDPOSTINC
+movff TABLAT,var_b
+TBLRDPOSTINC
+movff TABLAT,var_b+3
+TBLRD
+movff TABLAT,var_b+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var2_b+1
+TBLRDPOSTINC
+movff TABLAT,var2_b
+TBLRDPOSTINC
+movff TABLAT,var2_b+3
+TBLRD
+movff TABLAT,var2_b+2
+_endasm
+ // the start values are the previous end values // write new values in temp
+
+ if( (var_e2secs < 0.0000363)
+ || (var_e2secs > 0.00577)
+ || (var2_e2secs < 0.0000961)
+ || (var2_e2secs > 0.150)
+ || (var_a < 0.231)
+ || (var_a > 1.27)
+ || (var_b < 0.504)
+ || (var_b > 0.966)
+ || (var2_a < 0.510)
+ || (var2_a > 1.75)
+ || (var2_b < 0.423)
+ || (var2_b > 0.927)
+ )
+ int_O_DBG_pre_bitfield |= DBG_ZH16ERR;
+
+// N2
+ temp_tissue = (temp_atem - pres_tissue[ci]) * var_e2secs;
+ temp_tissue_safety();
+ pres_tissue[ci] = pres_tissue[ci] + temp_tissue;
+
+// He
+ temp_tissue = (temp2_atem - pres_tissue[ci+16]) * var2_e2secs;
+ temp_tissue_safety();
+ pres_tissue[ci+16] = pres_tissue[ci+16] + temp_tissue;
+
+ temp_tissue = pres_tissue[ci] + pres_tissue[ci+16];
+
+ var_a = (var_a * pres_tissue[ci] + var2_a * pres_tissue[ci+16]) / temp_tissue;
+ var_b = (var_b * pres_tissue[ci] + var2_b * pres_tissue[ci+16]) / temp_tissue;
+ pres_tissue_limit[ci] = (temp_tissue - var_a) * var_b;
+ if (pres_tissue_limit[ci] < 0)
+ pres_tissue_limit[ci] = 0;
+ if (pres_tissue_limit[ci] > pres_gtissue_limit)
+ {
+ pres_gtissue_limit = pres_tissue_limit[ci];
+ char_O_gtissue_no = ci;
+ }//if
+} // for
+}//calc_tissue(void)
+
+// ----------------
+// calc_nullzeit //
+// ----------------
+// calculates the remaining bottom time
+
+// unchanged in v.101
+
+void calc_nullzeit(void)
+{
+ char_O_nullzeit = 0;
+ int_temp = 1;
+ do
+ {
+ backup_sim_pres_tissue();
+ sim_tissue_10min();
+ char_O_nullzeit = char_O_nullzeit + 10;
+ int_temp = int_temp + 1;
+ if (char_I_deco_model == 1)
+ temp1 = GF_high * temp_pres_gtissue_diff + temp_pres_gtissue;
+ else
+ temp1 = temp_pres_gtissue_limit;
+ if (temp1 > temp_surface) // changed in v.102 , if guiding tissue can not be exposed to surface pressure immediately
+ int_temp = 255;
+ } while (int_temp < 17);
+ if (int_temp == 255)
+ {
+ restore_sim_pres_tissue();
+ char_O_nullzeit = char_O_nullzeit - 10;
+ } //if int_temp == 255]
+ int_temp = 1;
+ if (char_O_nullzeit < 60)
+ {
+ do
+ {
+ sim_tissue_1min();
+ char_O_nullzeit = char_O_nullzeit + 1;
+ int_temp = int_temp + 1; // new in v.102a
+ if (char_I_deco_model == 1)
+ temp1 = GF_high * temp_pres_gtissue_diff + temp_pres_gtissue;
+ else
+ temp1 = temp_pres_gtissue_limit;
+ if (temp1 > temp_surface) // changed in v.102 , if guiding tissue can not be exposed to surface pressure immediately
+ int_temp = 255;
+ } while (int_temp < 10);
+ if (int_temp == 255)
+ char_O_nullzeit = char_O_nullzeit - 1;
+ } // if char_O_nullzeit < 60
+} //calc_nullzeit
+
+// -------------------------
+// backup_sim_pres_tissue //
+// -------------------------
+void backup_sim_pres_tissue(void)
+{
+ for (x = 0;x<16;x++)
+ {
+ sim_pres_tissue_backup[x] = sim_pres_tissue[x];
+ sim_pres_tissue_backup[x+16] = sim_pres_tissue[x+16];
+ }
+} // backup_sim
+
+// --------------------------
+// restore_sim_pres_tissue //
+// --------------------------
+void restore_sim_pres_tissue(void)
+{
+ for (x = 0;x<16;x++)
+ {
+ sim_pres_tissue[x] = sim_pres_tissue_backup[x];
+ sim_pres_tissue[x+16] = sim_pres_tissue_backup[x+16];
+ }
+} // restore_sim
+
+// ------------------
+// calc_ascenttime //
+// ------------------
+
+void calc_ascenttime(void)
+{
+if (pres_respiration > pres_surface)
+ {
+ switch (char_O_deco_status)
+ {
+ case 2:
+ char_O_ascenttime = 255;
+ break;
+ case 1:
+ break;
+ default:
+ temp1 = pres_respiration - pres_surface + 0.6; // + 0.6 hence 1 minute ascent time from a depth of 4 meter on
+ if (temp1 < 0)
+ temp1 = 0;
+ if (temp1 > 255)
+ temp1 = 255;
+ char_O_ascenttime = (char)temp1;
+
+ for(ci=0;ci<7;ci++)
+ {
+ x = char_O_ascenttime + char_O_array_decotime[ci];
+ if (x < char_O_ascenttime)
+ char_O_ascenttime = 255;
+ else
+ char_O_ascenttime = x;
+ }
+ }
+ }
+else
+ char_O_ascenttime = 0;
+} // calc_ascenttime()
+
+
+// ---------------------
+// update_startvalues //
+// ---------------------
+// updated in v.102
+
+void update_startvalues(void)
+{
+ temp_pres_gtissue_limit = pres_gtissue_limit;
+ temp_pres_gtissue = pres_tissue[char_O_gtissue_no] + pres_tissue[char_O_gtissue_no+16];
+ temp_pres_gtissue_diff = temp_pres_gtissue_limit - temp_pres_gtissue; // negative number
+ temp_pres_gtissue_limit_GF_low = GF_low * temp_pres_gtissue_diff + temp_pres_gtissue;
+ temp_pres_gtissue_limit_GF_low_below_surface = temp_pres_gtissue_limit_GF_low - pres_surface;
+ if (temp_pres_gtissue_limit_GF_low_below_surface < 0)
+ temp_pres_gtissue_limit_GF_low_below_surface = 0;
+
+ temp_gtissue_no = char_O_gtissue_no;
+ for (x = 0;x<16;x++)
+ {
+ sim_pres_tissue[x] = pres_tissue[x];
+ sim_pres_tissue[x+16] = pres_tissue[x+16];
+ sim_pres_tissue_limit[x] = pres_tissue_limit[x];
+ }
+} // update_startvalues
+
+
+// ------------------
+// sim_tissue_1min //
+// ------------------
+// optimized in v.101
+
+void sim_tissue_1min(void)
+{
+temp_pres_gtissue_limit = 0.0;
+temp_gtissue_no = 255;
+
+_asm
+lfsr 1, 0x300
+movlw 0x01
+movwf TBLPTRU,0
+_endasm
+
+
+for (ci=0;ci<16;ci++)
+{
+_asm
+movlw 0x02
+movwf TBLPTRH,0
+movlb 4 // fuer ci
+movf ci,0,1
+addwf ci,0,1
+addwf ci,0,1
+addwf ci,0,1
+addlw 0x80
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var_a+1
+TBLRDPOSTINC
+movff TABLAT,var_a
+TBLRDPOSTINC
+movff TABLAT,var_a+3
+TBLRD
+movff TABLAT,var_a+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var2_a+1
+TBLRDPOSTINC
+movff TABLAT,var2_a
+TBLRDPOSTINC
+movff TABLAT,var2_a+3
+TBLRD
+movff TABLAT,var2_a+2
+addlw 0x40
+movwf TBLPTRL,0
+incf TBLPTRH,1,0
+TBLRDPOSTINC
+movff TABLAT,var_b+1
+TBLRDPOSTINC
+movff TABLAT,var_b
+TBLRDPOSTINC
+movff TABLAT,var_b+3
+TBLRD
+movff TABLAT,var_b+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var2_b+1
+TBLRDPOSTINC
+movff TABLAT,var2_b
+TBLRDPOSTINC
+movff TABLAT,var2_b+3
+TBLRD
+movff TABLAT,var2_b+2
+addlw 0xC0
+movwf TBLPTRL,0
+incf TBLPTRH,1,0
+TBLRDPOSTINC
+movff TABLAT,var_e1min+1
+TBLRDPOSTINC
+movff TABLAT,var_e1min
+TBLRDPOSTINC
+movff TABLAT,var_e1min+3
+TBLRD
+movff TABLAT,var_e1min+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var2_e1min+1
+TBLRDPOSTINC
+movff TABLAT,var2_e1min
+TBLRDPOSTINC
+movff TABLAT,var2_e1min+3
+TBLRD
+movff TABLAT,var2_e1min+2
+_endasm
+// N2
+ temp_tissue = (temp_atem - sim_pres_tissue[ci]) * var_e1min;
+ temp_tissue_safety();
+ sim_pres_tissue[ci] = sim_pres_tissue[ci] + temp_tissue;
+// He
+ temp_tissue = (temp2_atem - sim_pres_tissue[ci+16]) * var2_e1min;
+ temp_tissue_safety();
+ sim_pres_tissue[ci+16] = sim_pres_tissue[ci+16] + temp_tissue;
+// pressure limit
+ temp_tissue = sim_pres_tissue[ci] + sim_pres_tissue[ci+16];
+ var_a = (var_a * sim_pres_tissue[ci] + var2_a * sim_pres_tissue[ci+16]) / temp_tissue;
+ var_b = (var_b * sim_pres_tissue[ci] + var2_b * sim_pres_tissue[ci+16]) / temp_tissue;
+ sim_pres_tissue_limit[ci] = (temp_tissue - var_a) * var_b;
+
+ if (sim_pres_tissue_limit[ci] < 0)
+ sim_pres_tissue_limit[ci] = 0;
+ if (sim_pres_tissue_limit[ci] > temp_pres_gtissue_limit)
+ {
+ temp_pres_gtissue = temp_tissue;
+ temp_pres_gtissue_limit = sim_pres_tissue_limit[ci];
+ temp_gtissue_no = ci;
+ }
+} // for
+ temp_pres_gtissue_diff = temp_pres_gtissue_limit - temp_pres_gtissue;
+ temp_pres_gtissue_limit_GF_low = GF_low * temp_pres_gtissue_diff + temp_pres_gtissue;
+ temp_pres_gtissue_limit_GF_low_below_surface = temp_pres_gtissue_limit_GF_low - pres_surface;
+ if (temp_pres_gtissue_limit_GF_low_below_surface < 0)
+ temp_pres_gtissue_limit_GF_low_below_surface = 0;
+} //sim_tissue_1min()
+
+//--------------------
+// sim_tissue_10min //
+//--------------------
+
+// Attention!! uses var_e1min und var2_e1min to load 10min data !!!
+// is identical to sim_tissue_1min routine except for the different load of those variables
+
+// optimized in v.101
+
+void sim_tissue_10min(void)
+{
+temp_pres_gtissue_limit = 0.0;
+temp_gtissue_no = 255;
+
+_asm
+lfsr 1, 0x300
+movlw 0x01
+movwf TBLPTRU,0
+_endasm
+
+for (ci=0;ci<16;ci++)
+{
+_asm
+movlw 0x02
+movwf TBLPTRH,0
+movlb 4 // fuer ci
+movf ci,0,1
+addwf ci,0,1
+addwf ci,0,1
+addwf ci,0,1
+addlw 0x80
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var_a+1
+TBLRDPOSTINC
+movff TABLAT,var_a
+TBLRDPOSTINC
+movff TABLAT,var_a+3
+TBLRD
+movff TABLAT,var_a+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var2_a+1
+TBLRDPOSTINC
+movff TABLAT,var2_a
+TBLRDPOSTINC
+movff TABLAT,var2_a+3
+TBLRD
+movff TABLAT,var2_a+2
+addlw 0x40
+movwf TBLPTRL,0
+incf TBLPTRH,1,0
+TBLRDPOSTINC
+movff TABLAT,var_b+1
+TBLRDPOSTINC
+movff TABLAT,var_b
+TBLRDPOSTINC
+movff TABLAT,var_b+3
+TBLRD
+movff TABLAT,var_b+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var2_b+1
+TBLRDPOSTINC
+movff TABLAT,var2_b
+TBLRDPOSTINC
+movff TABLAT,var2_b+3
+TBLRD
+movff TABLAT,var2_b+2
+addlw 0xC0 // different to 1 min
+movwf TBLPTRL,0
+incf TBLPTRH,1,0
+incf TBLPTRH,1,0 // different to 1 min
+TBLRDPOSTINC
+movff TABLAT,var_e1min+1
+TBLRDPOSTINC
+movff TABLAT,var_e1min
+TBLRDPOSTINC
+movff TABLAT,var_e1min+3
+TBLRD
+movff TABLAT,var_e1min+2
+addlw 0x40
+movwf TBLPTRL,0
+//incf TBLPTRH,1,0 // different to 1 min
+TBLRDPOSTINC
+movff TABLAT,var2_e1min+1
+TBLRDPOSTINC
+movff TABLAT,var2_e1min
+TBLRDPOSTINC
+movff TABLAT,var2_e1min+3
+TBLRD
+movff TABLAT,var2_e1min+2
+_endasm
+// N2
+ temp_tissue = (temp_atem - sim_pres_tissue[ci]) * var_e1min;
+ temp_tissue_safety();
+ sim_pres_tissue[ci] = sim_pres_tissue[ci] + temp_tissue;
+// He
+ temp_tissue = (temp2_atem - sim_pres_tissue[ci+16]) * var2_e1min;
+ temp_tissue_safety();
+ sim_pres_tissue[ci+16] = sim_pres_tissue[ci+16] + temp_tissue;
+// pressure limit
+temp_tissue = sim_pres_tissue[ci] + sim_pres_tissue[ci+16];
+ var_a = (var_a * sim_pres_tissue[ci] + var2_a * sim_pres_tissue[ci+16]) / temp_tissue;
+ var_b = (var_b * sim_pres_tissue[ci] + var2_b * sim_pres_tissue[ci+16]) / temp_tissue;
+
+sim_pres_tissue_limit[ci] = (temp_tissue - var_a) * var_b;
+ if (sim_pres_tissue_limit[ci] < 0)
+ sim_pres_tissue_limit[ci] = 0;
+ if (sim_pres_tissue_limit[ci] > temp_pres_gtissue_limit)
+ {
+ temp_pres_gtissue = temp_tissue;
+ temp_pres_gtissue_limit = sim_pres_tissue_limit[ci];
+ temp_gtissue_no = ci;
+ }
+} // for
+ temp_pres_gtissue_diff = temp_pres_gtissue_limit - temp_pres_gtissue; // negative number
+ temp_pres_gtissue_limit_GF_low = GF_low * temp_pres_gtissue_diff + temp_pres_gtissue;
+ temp_pres_gtissue_limit_GF_low_below_surface = temp_pres_gtissue_limit_GF_low - pres_surface;
+ if (temp_pres_gtissue_limit_GF_low_below_surface < 0)
+ temp_pres_gtissue_limit_GF_low_below_surface = 0;
+} //sim_tissue_10min()
+
+
+// ------------------
+// clear_decoarray //
+// ------------------
+// unchanged in v.101
+
+void clear_decoarray(void)
+{
+char_O_array_decodepth[0] = 0;
+char_O_array_decodepth[1] = 0;
+char_O_array_decodepth[2] = 0;
+char_O_array_decodepth[3] = 0;
+char_O_array_decodepth[4] = 0;
+char_O_array_decodepth[5] = 0;
+char_O_array_decotime[0] = 0;
+char_O_array_decotime[1] = 0;
+char_O_array_decotime[2] = 0;
+char_O_array_decotime[3] = 0;
+char_O_array_decotime[4] = 0;
+char_O_array_decotime[5] = 0;
+char_O_array_decotime[6] = 0;
+} // clear_decoarray
+
+
+// -------------------
+// update_decoarray //
+// -------------------
+// unchanged in v.101
+
+void update_decoarray()
+{
+ x = 0;
+ do
+ {
+ if (char_O_array_decodepth[x] == temp_depth_limit)
+ {
+ int_temp = char_O_array_decotime[x] + temp_decotime;
+ if (int_temp < 0)
+ int_temp = 0;
+ if (int_temp > 240)
+ int_temp = 240;
+ char_O_array_decotime[x] = int_temp;
+ x = 10; // exit
+ } // if
+ else
+ {
+ if (char_O_array_decodepth[x] == 0)
+ {
+ if (temp_depth_limit > 255)
+ char_O_array_decodepth[x] = 255;
+ else
+ char_O_array_decodepth[x] = (char)temp_depth_limit;
+ int_temp = char_O_array_decotime[x] + temp_decotime;
+ if (int_temp > 240)
+ char_O_array_decotime[x] = 240;
+ else
+ char_O_array_decotime[x] = (char)int_temp;
+ x = 10; // exit
+ } // if
+ else
+ x++;
+ } // else
+ } while (x<6);
+ if (x == 6)
+ {
+ int_temp = char_O_array_decotime[6] + temp_decotime;
+ if (int_temp > 220)
+ char_O_array_decotime[6] = 220;
+ else
+ char_O_array_decotime[6] = (char)int_temp;
+ } // if x == 6
+} // update_decoarray
+
+
+// -----------------------
+// calc_gradient_factor //
+// -----------------------
+// optimized in v.101 (var_a)
+// new code in v.102
+
+void calc_gradient_factor(void)
+{
+ // tissue > respiration (entsaettigungsvorgang)
+ // gradient ist wieviel prozent an limit mit basis tissue
+ // dh. 0% = respiration == tissue
+ // dh. 100% = respiration == limit
+ temp_tissue = pres_tissue[char_O_gtissue_no] + pres_tissue[char_O_gtissue_no+16];
+ temp1 = temp_tissue - pres_respiration;
+ temp2 = temp_tissue - pres_tissue_limit[char_O_gtissue_no]; // changed in v.102
+ temp2 = temp1/temp2;
+ temp2 = temp2 * 100; // displayed in percent
+ if (temp2 < 0)
+ temp2 = 0;
+ if (temp2 > 255)
+ temp2 = 255;
+ if (temp1 < 0)
+ char_O_gradient_factor = 0;
+ else
+ char_O_gradient_factor = (char)temp2;
+
+ temp3 = temp2;
+
+ if (char_I_deco_model == 1) // calculate relative gradient factor
+ {
+ temp1 = (float)temp_depth_GF_low_meter * 0.09995;
+ temp2 = pres_respiration - pres_surface;
+ if (temp2 <= 0)
+ temp1 = GF_high;
+ else
+ if (temp2 >= temp1)
+ temp1 = GF_low;
+ else
+ temp1 = GF_low + (temp1 - temp2)/temp1*GF_delta;
+ if (temp_depth_GF_low_meter == 0)
+ temp1 = GF_high;
+ temp2 = temp3 / temp1; // temp3 is already in percent
+ if (temp2 < 0)
+ temp2 = 0;
+ if (temp2 > 255)
+ temp2 = 255;
+ char_O_relative_gradient_GF = (char)temp2;
+ } // calc relative gradient factor
+ else
+ {
+ char_O_relative_gradient_GF = char_O_gradient_factor;
+ }
+} // calc_gradient
+
+// ---------------------------
+// calc_gradient_array_only //
+// ---------------------------
+// optimized in v.101 (var_a)
+// new code in v.102
+
+void calc_gradient_array_only()
+{
+ pres_respiration = (float)int_I_pres_respiration / 1000.0; // assembler code uses different digit system
+for (ci=0;ci<16;ci++)
+{
+ temp_tissue = pres_tissue[ci] + pres_tissue[ci+16];
+ temp1 = temp_tissue - pres_respiration;
+ temp2 = temp_tissue - pres_tissue_limit[ci];
+ temp2 = temp1/temp2;
+ temp2 = temp2 * 200; // because of output in (Double-)percentage
+ if (temp2 < 0)
+ temp2 = 0;
+ if (temp2 > 255)
+ temp2 = 255;
+ if (temp1 < 0)
+ char_O_array_gradient_weighted[ci] = 0;
+ else
+ char_O_array_gradient_weighted[ci] = (char)temp2;
+} // for
+} // calc_gradient_array_only
+
+
+// -------------------------
+// calc_desaturation_time //
+// -------------------------
+// FIXED N2_ratio
+// unchanged in v.101
+
+void calc_desaturation_time(void)
+{
+_asm
+lfsr 1, 0x300
+movlw 0x01
+movwf TBLPTRU,0
+_endasm
+ N2_ratio = 0.7902; // FIXED sum as stated in b"uhlmann
+ pres_surface = (float)int_I_pres_surface / 1000.0;
+ temp_atem = N2_ratio * (pres_surface - 0.0627);
+ int_O_desaturation_time = 0;
+ float_desaturation_multiplier = char_I_desaturation_multiplier / 142.0; // new in v.101 (70,42%/100.=142)
+
+for (ci=0;ci<16;ci++)
+{
+_asm
+movlw 0x04
+movwf TBLPTRH,0
+movlb 4 // fuer ci
+movf ci,0,1
+addwf ci,0,1
+addwf ci,0,1
+addwf ci,0,1
+addlw 0x80
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var_halftimes+1
+TBLRDPOSTINC
+movff TABLAT,var_halftimes
+TBLRDPOSTINC
+movff TABLAT,var_halftimes+3
+TBLRD
+movff TABLAT,var_halftimes+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var2_halftimes+1
+TBLRDPOSTINC
+movff TABLAT,var2_halftimes
+TBLRDPOSTINC
+movff TABLAT,var2_halftimes+3
+TBLRD
+movff TABLAT,var2_halftimes+2
+_endasm
+
+// saturation_time (for flight) and N2_saturation in multiples of halftime
+// version v.100: 1.1 = 10 percent distance to totally clean (totally clean is not possible, would take infinite time )
+// new in version v.101: 1.07 = 7 percent distance to totally clean (totally clean is not possible, would take infinite time )
+// changes in v.101: 1.05 = 5 percent dist to totally clean is new desaturation point for display and noFly calculations
+// N2
+ temp1 = 1.05 * temp_atem;
+ temp1 = temp1 - pres_tissue[ci];
+ temp2 = temp_atem - pres_tissue[ci];
+ if (temp2 >= 0.0)
+ {
+ temp1 = 0;
+ temp2 = 0;
+ }
+ else
+ temp1 = temp1 / temp2;
+ if (temp1 > 0.0)
+ {
+ temp1 = log(1.0 - temp1);
+ temp1 = temp1 / -0.6931; // temp1 is the multiples of half times necessary.
+ // 0.6931 is ln(2), because the math function log() calculates with a base of e not 2 as requested.
+ // minus because log is negative
+ temp2 = var_halftimes * temp1 / float_desaturation_multiplier; // time necessary (in minutes ) for complete desaturation (see comment about 10 percent) , new in v.101: float_desaturation_multiplier
+ }
+ else
+ {
+ temp1 = 0;
+ temp2 = 0;
+ }
+
+// He
+ temp3 = 0.1 - pres_tissue[ci+16];
+if (temp3 >= 0.0)
+ {
+ temp3 = 0;
+ temp4 = 0;
+ }
+ else
+ temp3 = -1.0 * temp3 / pres_tissue[ci+16];
+ if (temp3 > 0.0)
+ {
+ temp3 = log(1.0 - temp3);
+ temp3 = temp3 / -0.6931; // temp1 is the multiples of half times necessary.
+ // 0.6931 is ln(2), because the math function log() calculates with a base of e not 2 as requested.
+ // minus because log is negative
+ temp4 = var2_halftimes * temp3 / float_desaturation_multiplier; // time necessary (in minutes ) for "complete" desaturation, new in v.101 float_desaturation_multiplier
+ }
+ else
+ {
+ temp3 = 0;
+ temp4 = 0;
+ }
+
+// saturation_time (for flight)
+ if (temp4 > temp2)
+ int_temp = (int)temp4;
+ else
+ int_temp = (int)temp2;
+ if(int_temp > int_O_desaturation_time)
+ int_O_desaturation_time = int_temp;
+
+// N2 saturation in multiples of halftime for display purposes
+ temp2 = temp1 * 20.0; // 0 = 1/8, 120 = 0, 249 = 8
+ temp2 = temp2 + 80.0; // set center
+ if (temp2 < 0.0)
+ temp2 = 0.0;
+ if (temp2 > 255.0)
+ temp2 = 255.0;
+ char_O_tissue_saturation[ci] = (char)temp2;
+// He saturation in multiples of halftime for display purposes
+ temp4 = temp3 * 20.0; // 0 = 1/8, 120 = 0, 249 = 8
+ temp4 = temp4 + 80.0; // set center
+ if (temp4 < 0.0)
+ temp4 = 0.0;
+ if (temp4 > 255.0)
+ temp4 = 255.0;
+ char_O_tissue_saturation[ci+16] = (char)temp4;
+} // for
+} // calc_desaturation_time
+
+
+// --------------------------
+// calc_wo_deco_step_1_min //
+// --------------------------
+// FIXED N2 Ratio
+// optimized in v.101 (...saturation_multiplier)
+// desaturation slowed down to 70,42%
+
+void calc_wo_deco_step_1_min(void)
+{
+ if(flag_in_divemode)
+ {
+ flag_in_divemode = 0;
+ set_dbg_end_of_dive();
+ }
+_asm
+ lfsr 1, 0x300
+_endasm
+ N2_ratio = 0.7902; // FIXED, sum lt. buehlmann
+ pres_respiration = (float)int_I_pres_respiration / 1000.0; // assembler code uses different digit system
+ pres_surface = (float)int_I_pres_surface / 1000.0;
+ temp_atem = N2_ratio * (pres_respiration - 0.0627); // 0.0627 is the extra pressure in the body
+ temp2_atem = 0.0;
+ temp_surface = pres_surface; // the b"uhlmann formula using temp_surface does not use the N2_ratio
+ float_desaturation_multiplier = char_I_desaturation_multiplier / 142.0; // new in v.101 (70,42%/100.=142)
+ float_saturation_multiplier = char_I_saturation_multiplier / 100.0;
+
+ calc_tissue_step_1_min(); // update the pressure in the 16 tissues in accordance with the new ambient pressure
+ clear_decoarray();
+ char_O_deco_status = 0;
+ char_O_nullzeit = 0;
+ char_O_ascenttime = 0;
+ calc_gradient_factor();
+
+} // calc_wo_deco_step_1_min(void)
+
+
+// -------------------------
+// calc_tissue_step_1_min //
+// -------------------------
+// optimized in v.101
+
+void calc_tissue_step_1_min(void)
+{
+_asm
+lfsr 1, 0x300
+movlw 0x01
+movwf TBLPTRU,0
+_endasm
+
+ char_O_gtissue_no = 255;
+ pres_gtissue_limit = 0.0;
+
+for (ci=0;ci<16;ci++)
+{
+_asm
+movlw 0x02
+movwf TBLPTRH,0
+movlb 4 // fuer ci
+movf ci,0,1
+addwf ci,0,1
+addwf ci,0,1
+addwf ci,0,1
+addlw 0x80
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var_a+1
+TBLRDPOSTINC
+movff TABLAT,var_a
+TBLRDPOSTINC
+movff TABLAT,var_a+3
+TBLRD
+movff TABLAT,var_a+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var2_a+1
+TBLRDPOSTINC
+movff TABLAT,var2_a
+TBLRDPOSTINC
+movff TABLAT,var2_a+3
+TBLRD
+movff TABLAT,var2_a+2
+addlw 0x40
+movwf TBLPTRL,0
+incf TBLPTRH,1,0
+TBLRDPOSTINC
+movff TABLAT,var_b+1
+TBLRDPOSTINC
+movff TABLAT,var_b
+TBLRDPOSTINC
+movff TABLAT,var_b+3
+TBLRD
+movff TABLAT,var_b+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var2_b+1
+TBLRDPOSTINC
+movff TABLAT,var2_b
+TBLRDPOSTINC
+movff TABLAT,var2_b+3
+TBLRD
+movff TABLAT,var2_b+2
+addlw 0xC0
+movwf TBLPTRL,0
+incf TBLPTRH,1,0
+TBLRDPOSTINC
+movff TABLAT,var_e1min+1
+TBLRDPOSTINC
+movff TABLAT,var_e1min
+TBLRDPOSTINC
+movff TABLAT,var_e1min+3
+TBLRD
+movff TABLAT,var_e1min+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var2_e1min+1
+TBLRDPOSTINC
+movff TABLAT,var2_e1min
+TBLRDPOSTINC
+movff TABLAT,var2_e1min+3
+TBLRD
+movff TABLAT,var2_e1min+2
+_endasm
+
+// N2 1 min
+ temp_tissue = (temp_atem - pres_tissue[ci]) * var_e1min;
+ temp_tissue_safety();
+ pres_tissue[ci] = pres_tissue[ci] + temp_tissue;
+
+// He 1 min
+ temp_tissue = (temp2_atem - pres_tissue[ci+16]) * var2_e1min;
+ temp_tissue_safety();
+ pres_tissue[ci+16] = pres_tissue[ci+16] + temp_tissue;
+
+ temp_tissue = pres_tissue[ci] + pres_tissue[ci+16];
+ var_a = (var_a * pres_tissue[ci] + var2_a * pres_tissue[ci+16]) / temp_tissue;
+ var_b = (var_b * pres_tissue[ci] + var2_b * pres_tissue[ci+16]) / temp_tissue;
+ pres_tissue_limit[ci] = (temp_tissue - var_a) * var_b;
+ if (pres_tissue_limit[ci] < 0)
+ pres_tissue_limit[ci] = 0;
+ if (pres_tissue_limit[ci] > pres_gtissue_limit)
+ {
+ pres_gtissue_limit = pres_tissue_limit[ci];
+ char_O_gtissue_no = ci;
+ }//if
+
+// gradient factor array for graphical display
+// display range is 0 to 250! in steps of 5 for 1 pixel
+// the display is divided in 6 blocks
+// -> double the gradient 100% = 200
+// tissue > respiration (entsaettigungsvorgang)
+// gradient ist wieviel prozent an limit von tissue aus
+// dh. 0% = respiration == tissue
+// dh. 100% = respiration == limit
+temp1 = temp_tissue - pres_respiration;
+temp2 = temp_tissue - pres_tissue_limit[ci]; // changed in v.102
+temp2 = temp1/temp2;
+temp2 = temp2 * 200; // because of output in (Double-)percentage
+if (temp2 < 0)
+ temp2 = 0;
+if (temp2 > 255)
+ temp2 = 255;
+if (temp1 < 0)
+ char_O_array_gradient_weighted[ci] = 0;
+else
+ char_O_array_gradient_weighted[ci] = (char)temp2;
+
+} // for
+} // calc wo deco 1min
+
+#if 0
+// --------
+// debug //
+// --------
+void debug(void)
+{
+for (ci=0;ci<32;ci++)
+{
+ int_O_tissue_for_debug[ci] = (unsigned int)(pres_tissue[ci] *1000);
+}
+} // void debug(void)
+#endif
+
+// ----------
+// md hash //
+// ----------
+void hash(void)
+{
+// init
+ for (md_i=0;md_i<16;md_i++)
+ {
+ md_state[md_i] = 0;
+ md_cksum[md_i] = 0;
+ } // for md_i 16
+
+_asm
+ movlw 0x01
+ movwf TBLPTRU,0
+ movlw 0x06
+ movwf TBLPTRH,0
+ movlw 0x00
+ movwf TBLPTRL,0
+_endasm
+ for (md_i=0;md_i<127;md_i++)
+ {
+_asm
+ TBLRDPOSTINC
+ movff TABLAT,md_temp
+_endasm
+ md_pi_subst[md_i] = md_temp;
+ } // for md_i 256
+_asm
+ TBLRDPOSTINC
+ movff TABLAT,md_temp
+_endasm
+ md_pi_subst[127] = md_temp;
+ for (md_i=0;md_i<127;md_i++)
+ {
+_asm
+ TBLRDPOSTINC
+ movff TABLAT,md_temp
+_endasm
+ md_pi_subst[md_i+128] = md_temp;
+ } // for md_i 256
+_asm
+ TBLRD
+ movff TABLAT,md_temp
+_endasm
+ md_pi_subst[255] = md_temp;
+
+_asm
+ movlw 0x00
+ movwf TBLPTRU,0
+ movlw 0x00
+ movwf TBLPTRH,0
+ movlw 0x00
+ movwf TBLPTRL,0
+_endasm
+// cycle buffers
+for (md_pointer=0x0000;md_pointer<0x17f3;md_pointer++)
+{
+ md_t = 0;
+ for (md_i=0;md_i<16;md_i++)
+ {
+ if(md_pointer == 9)
+ md_temp = md_cksum[md_i];
+ else
+ {
+_asm
+ TBLRDPOSTINC
+ movff TABLAT,md_temp
+_endasm
+ } // else
+ md_buffer[md_i] = md_temp;
+ md_state[md_i+16] = md_buffer[md_i];
+ md_state[md_i+32] = (unsigned char)(md_buffer[md_i] ^ md_state[md_i]);
+ } // for md_i 16
+
+ for (md_i=0;md_i<18;md_i++)
+ {
+ for (md_j=0;md_j<48;md_j++)
+ {
+ md_state[md_j] = (unsigned char)(md_state[md_j] ^ md_pi_subst[md_t]);
+ md_t = md_state[md_j];
+ } // for md_j 48
+ md_t = (unsigned char)(md_t+1);
+ } // for md_i 18
+ md_t = md_cksum[15];
+
+ for (md_i=0;md_i<16;md_i++)
+ {
+ md_cksum[md_i] = (unsigned char)(md_cksum[md_i] ^ md_pi_subst[(md_buffer[md_i] ^ md_t)]);
+ md_t = md_cksum[md_i];
+ } // for md_i 16
+} // for md_pointer
+} // void hash(void)
+
+// ---------------------
+// clear_CNS_fraction //
+// ---------------------
+// new in v.101
+
+void clear_CNS_fraction(void)
+{
+ CNS_fraction = 0.0;
+ char_O_CNS_fraction = 0;
+} // void clear_CNS_fraction(void)
+
+
+// --------------------
+// calc_CNS_fraction //
+// --------------------
+// new in v.101
+// optimized in v.102 : with new variables char_I_actual_ppO2 and actual_ppO2
+
+// Input: char_I_actual_ppO2
+// Output: char_O_CNS_fraction
+// Uses and Updates: CNS_fraction
+// Uses: acutal_ppO2
+
+void calc_CNS_fraction(void)
+{
+ actual_ppO2 = (float)char_I_actual_ppO2 / 100.0;
+
+ if (char_I_actual_ppO2 < 50)
+ CNS_fraction = CNS_fraction;// no changes
+ else if (char_I_actual_ppO2 < 60)
+ CNS_fraction = 1/(-54000.0 * actual_ppO2 + 54000.0) + CNS_fraction;
+ else if (char_I_actual_ppO2 < 70)
+ CNS_fraction = 1/(-45000.0 * actual_ppO2 + 48600.0) + CNS_fraction;
+ else if (char_I_actual_ppO2 < 80)
+ CNS_fraction = 1/(-36000.0 * actual_ppO2 + 42300.0) + CNS_fraction;
+ else if (char_I_actual_ppO2 < 90)
+ CNS_fraction = 1/(-27000.0 * actual_ppO2 + 35100.0) + CNS_fraction;
+ else if (char_I_actual_ppO2 < 110)
+ CNS_fraction = 1/(-18000.0 * actual_ppO2 + 27000.0) + CNS_fraction;
+ else if (char_I_actual_ppO2 < 150)
+ CNS_fraction = 1/(-9000.0 * actual_ppO2 + 17100.0) + CNS_fraction;
+ else if (char_I_actual_ppO2 < 160)
+ CNS_fraction = 1/(-22500.0 * actual_ppO2 + 37350.0) + CNS_fraction;
+ else if (char_I_actual_ppO2 < 165)
+ CNS_fraction = 0.000755 + CNS_fraction; // Arieli et all.(2002): Modeling pulmonary and CNS O2 toxicity... Formula (A1) based on value for 1.55 and c=20
+ else if (char_I_actual_ppO2 < 170)
+ CNS_fraction = 0.00102 + CNS_fraction; // example calculation: Sqrt((1.7/1.55)^20)*0.000404
+ else if (char_I_actual_ppO2 < 175)
+ CNS_fraction = 0.00136 + CNS_fraction;
+ else if (char_I_actual_ppO2 < 180)
+ CNS_fraction = 0.00180 + CNS_fraction;
+ else if (char_I_actual_ppO2 < 185)
+ CNS_fraction = 0.00237 + CNS_fraction;
+ else if (char_I_actual_ppO2 < 190)
+ CNS_fraction = 0.00310 + CNS_fraction;
+ else if (char_I_actual_ppO2 < 195)
+ CNS_fraction = 0.00401 + CNS_fraction;
+ else if (char_I_actual_ppO2 < 200)
+ CNS_fraction = 0.00517 + CNS_fraction;
+ else if (char_I_actual_ppO2 < 230)
+ CNS_fraction = 0.0209 + CNS_fraction;
+ else
+ CNS_fraction = 0.0482 + CNS_fraction; // value for 2.5
+
+ if (CNS_fraction > 2.5)
+ CNS_fraction = 2.5;
+ if (CNS_fraction < 0.0)
+ CNS_fraction = 0.0;
+ char_O_CNS_fraction = (char)((CNS_fraction + 0.005)* 100.0);
+} // void calc_CNS_fraction(void)
+
+// --------------------------
+// calc_CNS_decrease_15min //
+// --------------------------
+// new in v.101
+
+// calculates the half time of 90 minutes in 6 steps of 15 min
+
+// Output: char_O_CNS_fraction
+// Uses and Updates: CNS_fraction
+
+void calc_CNS_decrease_15min(void)
+{
+ CNS_fraction = 0.890899 * CNS_fraction;
+ char_O_CNS_fraction = (char)((CNS_fraction + 0.005)* 100.0);
+}// calc_CNS_decrease_15min(void)
+
+
+// ------------------
+// calc_percentage //
+// ------------------
+// new in v.101
+
+// calculates int_I_temp * char_I_temp / 100
+// output is int_I_temp
+
+void calc_percentage(void)
+{
+ temp1 = (float)int_I_temp;
+ temp2 = (float)char_I_temp / 100.0;
+ temp3 = temp1 * temp2;
+ int_I_temp = (int)temp3;
+}
+void push_tissues_to_vault(void)
+{
+ for (ci=0;ci<32;ci++)
+ pres_tissue_vault[ci] = pres_tissue[ci];
+}
+void pull_tissues_from_vault(void)
+{
+ for (ci=0;ci<32;ci++)
+ pres_tissue[ci] = pres_tissue_vault[ci];
+}
+
+void wp_write_command(void)
+{
+ _asm
+ bcf oled_rs
+ movff wp_command,PORTD
+ bcf oled_rw
+ bsf oled_rw
+ _endasm
+}
+
+void wp_write_data(void)
+{
+ wp_data_8bit_one = wp_data_16bit >> 8;
+ wp_data_8bit_two = wp_data_16bit;
+_asm
+ bsf oled_rs
+ movff wp_data_8bit_one,PORTD
+ bcf oled_rw
+ bsf oled_rw
+ movff wp_data_8bit_two,PORTD
+ bcf oled_rw
+ bsf oled_rw
+_endasm
+}
+
+void wp_write_black(void)
+{
+_asm
+ movff wp_black,PORTD
+ bcf oled_rw
+ bsf oled_rw
+ bcf oled_rw
+ bsf oled_rw
+_endasm
+}
+
+void wp_write_color(void)
+{
+_asm
+ movff wp_color1,PORTD
+ bcf oled_rw
+ bsf oled_rw
+ movff wp_color2,PORTD
+ bcf oled_rw
+ bsf oled_rw
+_endasm
+}
+
+void wp_set_window(void)
+{
+ // x axis start ( 0 - 319)
+ wp_command = 0x35;
+ wp_write_command();
+ wp_data_16bit = ((U16)wp_leftx2) << 1;
+ wp_write_data();
+ // x axis end ( 0 - 319)
+ wp_command = 0x36;
+ wp_write_command();
+ wp_data_16bit = 319;
+ wp_write_data();
+ // y axis start + end ( 0 - 239 )
+ wp_command = 0x37;
+ wp_write_command();
+ // the bottom part
+ wp_data_16bit = wp_top;
+ if(wp_font & 1)
+ {
+ wp_data_16bit += WP_FONT_MEDIUM_HEIGHT;
+ if(wp_font & 2)
+ wp_data_16bit += WP_FONT_MEDIUM_HEIGHT;
+ }
+ else
+ {
+ wp_data_16bit += WP_FONT_SMALL_HEIGHT;
+ if(wp_font & 2)
+ wp_data_16bit += WP_FONT_SMALL_HEIGHT;
+ }
+ wp_data_16bit--;
+ if(wp_data_16bit > 239)
+ wp_data_16bit = 239;
+ // the top part
+ wp_data_16bit |= ((U16)wp_top) << 8;
+ // all together in one 16bit transfer
+ wp_write_data();
+
+ // start
+ wp_command = 0x20;
+ wp_write_command();
+ wp_data_16bit = wp_top;
+ wp_write_data();
+
+ wp_command = 0x21;
+ wp_write_command();
+ wp_data_16bit = ((U16)wp_leftx2) << 1;
+ wp_write_data();
+}
+
+void wp_set_char_font_small(void)
+{
+ if (wp_char > 0x7E)
+ wp_char -= 34;
+ if ((wp_char >= 1) && (wp_char <= 5)) // battery
+ wp_char += 160;
+ if((wp_char < '!') || (wp_char > 166)) // limit to end of battery at the moment
+ wp_char = ' ';
+ if(wp_char != ' ')
+ {
+ wp_start = wp_small_table[wp_char - '!'];
+ wp_end = wp_small_table[1 + wp_char - '!'];
+ }
+}
+
+void wp_set_char_font_medium(void)
+{
+ if (wp_char == 0x27) // 0x27 == '
+ wp_char = 0x3B;
+ if (wp_char == '"')
+ wp_char = 0x3C;
+ if (wp_char == 'm')
+ wp_char = 0x3D;
+ if((wp_char < '.') || (wp_char > 0x3D))
+ wp_char = ' ';
+ if(wp_char != ' ')
+ {
+ wp_start = wp_medium_table[wp_char - '.'];
+ wp_end = wp_medium_table[1 + wp_char - '.'];
+ }
+}
+
+void wordprocessor(void)
+{
+ wp_data_8bit_one = 0;
+ _asm
+ movff wp_data_8bit_one,POSTINC2
+ _endasm
+
+ wp_set_window();
+
+ // access to GRAM
+ wp_command = 0x22;
+ wp_write_command();
+ _asm
+ bsf oled_rs
+ _endasm
+
+ wp_txtptr = 0;
+ wp_char = wp_stringstore[wp_txtptr];
+ while(wp_char)
+ {
+ if(wp_font & 1)
+ wp_set_char_font_medium();
+ else
+ wp_set_char_font_small();
+
+ wp_black = 0;
+ if(wp_char == ' ')
+ {
+ _asm
+ movff wp_black,PORTD
+ _endasm
+ if(wp_font & 1)
+ for(wp_i =0; wp_i> 8;
+ if((wp_temp_U8 & 128))
+ {
+ wp_temp_U8 -= 127;
+ if(wp_invert)
+ {
+ while(wp_temp_U8 > 0)
+ {
+ wp_temp_U8--;
+ wp_write_color();
+ }
+ }
+ else
+ {
+ _asm
+ movff wp_black,PORTD
+ _endasm
+ _asm
+ movff wp_black,PORTD
+ _endasm
+ while(wp_temp_U8 > 0)
+ {
+ wp_temp_U8--;
+ _asm
+ bcf oled_rw
+ bsf oled_rw
+ bcf oled_rw
+ bsf oled_rw
+ _endasm
+ }
+ }
+ }
+ else
+ {
+ wp_temp_U8++;
+ if(wp_invert)
+ {
+ _asm
+ movff wp_black,PORTD
+ _endasm
+ _asm
+ movff wp_black,PORTD
+ _endasm
+ while(wp_temp_U8 > 0)
+ {
+ wp_temp_U8--;
+ _asm
+ bcf oled_rw
+ bsf oled_rw
+ bcf oled_rw
+ bsf oled_rw
+ _endasm
+ }
+ }
+ else
+ {
+ while(wp_temp_U8 > 0)
+ {
+ wp_temp_U8--;
+ wp_write_color();
+ }
+ }
+ }
+ }
+ }
+ wp_txtptr++;
+ wp_char = wp_stringstore[wp_txtptr];
+ }
+ wp_command = 0x00;
+ wp_write_command();
+}
diff -r 000000000000 -r 96a35aeda5f2 code_part1/OSTC_code_c_part2/old/p2_deco_main_old_v107.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/code_part1/OSTC_code_c_part2/old/p2_deco_main_old_v107.c Tue Jan 12 15:05:59 2010 +0100
@@ -0,0 +1,3453 @@
+/*
+ * p2_deco_main_c_v107.c
+ *
+ * Created on: 31.03.2009
+ * Author: chsw
+ */
+
+//#include
+
+
+// OSTC - diving computer code
+// Copyright (C) 2008 HeinrichsWeikamp GbR
+
+// 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 3 of the License, or
+// (at your option) any later version.
+
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// 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, see .
+
+
+// *****************************
+// ** I N T R O D U C T I O N **
+// *****************************
+//
+// OSTC
+//
+// code:
+// p2_deco_main_c_v101.c
+// part2 of the OSTC code
+// code with constant O2 partial pressure routines
+// under construction !!
+//
+// summary:
+// decompression routines
+// for the OSTC experimental project
+// written by Christian Weikamp
+// last revision __________
+// comments added _________
+//
+// additional files:
+// p2_tables_v100.romdata (other files)
+// 18f4685_ostc_v100.lkr (linker script)
+//
+// history:
+// 01/03/08 v100: first release candidate
+// 03/13/08 v101: start of programming ppO2 code
+// 03/13/25 v101a: backup of interrim version with ppO2 calculation
+// 03/13/25 v101: open circuit gas change during deco
+// 03/13/25 v101: CNS_fraction calculation
+// 03/13/26 v101: optimization of tissue calc routines
+// 07/xx/08 v102a: debug of bottom time routine
+// 09/xx/08 v102d: Gradient Factor Model implemenation
+// 10/10/08 v104: renamed to build v103 for v118 stable
+// 10/14/08 v104: integration of temp_depth_last_deco for Gradient Model
+// 03/31/090 v107: integration of FONT Incon24
+
+//
+// literature:
+// B"uhlmann, Albert: Tauchmedizin; 4. Auflage;
+// Schr"oder, Kai & Reith, Steffen; 2000; S"attigungsvorg"ange beim Tauchen, das Modell ZH-L16, Funktionsweise von Tauchcomputern; http://www.achim-und-kai.de/kai/tausim/saett_faq
+// Morrison, Stuart; 2000; DIY DECOMPRESSION; http://www.lizardland.co.uk/DIYDeco.html
+// Balthasar, Steffen; Dekompressionstheorie I: Neo Haldane Modelle; http://www.txfreak.de/dekompressionstheorie_1.pdf
+// Baker, Erik C.; Clearing Up The Confusion About "Deep Stops"
+// Baker, Erik C.; Understanding M-values; http://www.txfreak.de/understanding_m-values.pdf
+
+
+// *********************
+// ** I N C L U D E S **
+// *********************
+ #include
+ #include
+
+// ********************************
+// ** C O N F I G U R A T I O N **
+// ** for simulation without asm **
+// ********************************
+ #pragma config OSC = IRCIO67
+ #pragma config FCMEN = OFF
+ #pragma config IESO = OFF
+ #pragma config PWRT = ON
+ #pragma config BOREN = OFF
+ #pragma config WDT = OFF
+ #pragma config WDTPS = 128
+ #pragma config MCLRE = ON
+ #pragma config LPT1OSC = OFF
+ #pragma config PBADEN = OFF
+ #pragma config DEBUG = OFF
+ #pragma config XINST = OFF
+ #pragma config LVP = OFF
+ #pragma config STVREN = OFF
+
+// ****************************
+// ** D E F I N E S **
+// ** missing in p18f4685.h **
+// ****************************
+#define INT0IF 1
+#define INT1IF 0
+#define TMR1IF 0
+
+#define oled_clk PORTD, 0,0
+#define oled_data PORTD, 1,0
+#define oled_en PORTE, 0,0
+#define oled_rs PORTE, 1,0
+#define flag5 0x29 // in Bank1
+//#define no_sensor_int flag5,7,1 // ; block any further access to pressure sensor
+
+// ***********************
+// ** V A R I A B L E S **
+// ***********************
+// prefixes etc:
+// _O_ = output for use in the assembler code
+// _I_ = input from the assembler code for the c code
+// char_ and int_ = used to identify output and input size
+// var = variable (from b"uhlmann)
+// pres = pressure
+// gtissue = guiding tissue, the one limiting the ascent
+// e2secs = exp of the b"uhlmann formula precalculated for a 2 second step
+// e1min = same for 1 minute step
+// sim = used in simulating the ascent to the surface
+// nullzeit = remaining ground/bottom time for "no deco"
+// hauptroutine = main
+
+#pragma udata bank0a=0x060
+volatile unsigned char dd2_stringstore[17];
+#pragma udata bank0b=0x071
+volatile unsigned char keep_free_bank0[21];
+
+#pragma udata bank0c=0x086
+volatile unsigned char dd2_left; // 1 - 64
+volatile unsigned char dd2_top; // 1 - 64
+volatile unsigned char dd2_heightmax; // 1 - 37
+volatile unsigned char dd2_oled_brightness_offset; // 0 - 15 (15 is pitch black always)
+volatile unsigned char dd2_fontwidth; // 8, 12, 21 for Incon16, Incon24, Incon42
+volatile unsigned char dd2_fontheight; // 14, 21, 37 for "
+volatile unsigned long dd2_pointer; // for font lut
+volatile unsigned char dd2_i;
+volatile unsigned char dd2_j;
+volatile unsigned char dd2_k;
+volatile unsigned char dd2_char;
+volatile unsigned char dd2_lowbyte;
+volatile unsigned char dd2_temp;
+volatile unsigned char dd2_data;
+volatile unsigned long dd2_base; // for font lut
+volatile unsigned char dd2_start; // for font lut
+volatile unsigned char dd2_end; // for font lut
+
+
+ #pragma udata bank1=0x100
+ const unsigned char keep_free_bank1[256]; // used by the assembler code
+
+ #pragma udata bank2a=0x200
+// output:
+ static unsigned int int_O_tissue_for_debug[32];
+ static unsigned int int_O_GF_spare____; // 0x240
+ static unsigned int int_O_GF_step; // 0x242
+ static unsigned int int_O_gtissue_limit; // 0x244
+ static unsigned int int_O_gtissue_press; // 0x246
+ static unsigned int int_O_limit_GF_low; // 0x248
+ static unsigned int int_O_gtissue_press_at_GF_low; // 0x24A
+// ...
+ #pragma udata bank2b=0x24E
+ static unsigned char char_O_GF_low_pointer; // 0x24E
+ static unsigned char char_O_actual_pointer; // 0x24F
+ #pragma udata bank2c=0x250
+ static unsigned char char_O_deco_table[32]; // 0x250
+ #pragma udata bank2d=0x270
+ static unsigned char char_I_table_deco_done[32];
+ #pragma udata bank2e=0x290
+ static unsigned int int_O_calc_tissue_call_counter; // 0x290
+
+
+
+// internal:
+ unsigned char lock_GF_depth_list;
+ static float temp_limit;
+ static float GF_low;
+ static float GF_high;
+ static float GF_delta;
+ static float GF_temp;
+ static float GF_step;
+ static float GF_step2;
+ static float temp_pres_gtissue;
+ static float temp_pres_gtissue_diff;
+ static float temp_pres_gtissue_limit_GF_low;
+ static float temp_pres_gtissue_limit_GF_low_below_surface;
+ static unsigned int temp_depth_limit;
+ static unsigned char temp_decotime;
+ static unsigned char temp_gtissue_no;
+ static unsigned int temp_depth_last_deco; // new in v.101
+
+ static unsigned char temp_depth_GF_low_meter;
+ static unsigned char temp_depth_GF_low_number;
+ static unsigned char internal_deco_pointer;
+ static unsigned char internal_deco_table[32];
+ static float temp_pres_deco_GF_low;
+
+static unsigned int debug_temp;
+
+
+#pragma udata bank3a=0x300
+static char output[32];
+// used by the math routines
+#pragma udata bank3b=0x380
+volatile float pres_tissue_vault[32];
+ #pragma udata bank4a=0x400
+// internal:
+ unsigned char ci ; // don't move - used in _asm routines - if moved then modify movlb commands
+ unsigned char x;
+ unsigned int main_i;
+ unsigned int int_temp;
+ unsigned int int_temp_decostatus;
+ static float pres_respiration;
+ static float pres_surface;
+ static float temp1;
+ static float temp2;
+ static float temp3;
+ static float temp4;
+ static float temp_deco;
+ static float temp_atem;
+ static float temp2_atem;
+ static float temp_tissue;
+ static float temp_surface;
+ static float N2_ratio;
+ static float He_ratio;
+ static float temp_ratio;
+ static float var_a;
+ static float var2_a;
+ static float var_b;
+ static float var2_b;
+ static float var_t05nc;
+ static float var2_t05nc;
+ static float var_e2secs;
+ static float var2_e2secs;
+ static float var_e1min;
+ static float var2_e1min;
+ static float var_halftimes;
+ static float var2_halftimes;
+ static float pres_gtissue_limit;
+ static float temp_pres_gtissue_limit;
+ static float actual_ppO2; // new in v.102
+ #pragma udata bank4b=0x480
+ static float pres_tissue[32];
+
+ #pragma udata bank5=0x500
+// don't move positions in this bank, the registers are addressed directly from assembler code
+// input:
+ static unsigned int int_I_pres_respiration; // 0x500
+ static unsigned int int_I_pres_surface; // 0x502
+ static unsigned int int_I_temp; // 0x504 new in v101
+ static unsigned char char_I_temp; // 0x506 new in v101
+ static unsigned char char_I_actual_ppO2; // 0x507
+ static unsigned int int_I_spare_3;
+ static unsigned int int_I_spare_4;
+ static unsigned int int_I_spare_5;
+ static unsigned int int_I_spare_6;
+ static unsigned char char_I_N2_ratio; // 0x510
+ static unsigned char char_I_He_ratio; // 0x511
+ static unsigned char char_I_saturation_multiplier; // for conservatism/safety values 1.0 (no conservatism) to 1.5 (50% faster saturation
+ static unsigned char char_I_desaturation_multiplier; // for conservatism/safety values 0.66 (50% slower desaturation) to 1.0 (no conservatism)// consveratism used in calc_tissue(), calc_tissue_step_1_min() and sim_tissue_1min()
+ static unsigned char char_I_GF_High_percentage; // 0x514 new in v.102
+ static unsigned char char_I_GF_Low_percentage; // 0x515 new in v.102
+ static unsigned char char_I_spare; // 0x516
+ static unsigned char char_I_deco_distance; // 0x517
+ static unsigned char char_I_const_ppO2; // 0x518 new in v.101
+ static unsigned char char_I_deco_ppO2_change; // 0x519 new in v.101
+ static unsigned char char_I_deco_ppO2; // 0x51A new in v.101
+ static unsigned char char_I_deco_gas_change; // 0x51B new in v.101
+ static unsigned char char_I_deco_N2_ratio; // 0x51C new in v.101
+ static unsigned char char_I_deco_He_ratio; // 0x51D new in v.101
+ static unsigned char char_I_depth_last_deco; // 0x51E new in v.101 unit: [m]
+ static unsigned char char_I_deco_model; // 0x51F new in v.102 ( 1 = MultiGraF, sonst Std. mit (de-)saturation_multiplier)
+// output:
+ static unsigned int int_O_desaturation_time; // 0x520
+ static unsigned char char_O_nullzeit; // 0x522
+ static unsigned char char_O_deco_status; // 0x523
+ static unsigned char char_O_array_decotime[7]; // 0x524
+ static unsigned char char_O_array_decodepth[6]; // 0x52B
+ static unsigned char char_O_ascenttime; // 0x531
+ static unsigned char char_O_gradient_factor; // 0x532
+ static unsigned char char_O_tissue_saturation[32]; // 0x533
+ static unsigned char char_O_array_gradient_weighted[16]; // 0x553
+ static unsigned char char_O_gtissue_no; // 0x563
+ static unsigned char char_O_diluent; // 0x564 new in v.101
+ static unsigned char char_O_CNS_fraction; // 0x565 new in v.101
+ static unsigned char char_O_relative_gradient_GF; // 0x566 new in v.102
+// internal:
+ static float pres_tissue_limit[16];
+ static float sim_pres_tissue_limit[16];
+ static float pres_diluent; // new in v.101
+ static float deco_diluent; // new in v.101
+ static float const_ppO2; // new in v.101
+ static float deco_ppO2_change; // new in v.101
+ static float deco_ppO2; // new in v.101
+
+
+
+ #pragma udata bank6=0x600
+// internal:
+ static float sim_pres_tissue[32];
+ static float sim_pres_tissue_backup[32];
+
+ #pragma udata bank7=0x700
+ const unsigned char keep_free_bank7[256]; // used by the assembler code (DD font2display)
+
+ #pragma udata bank8=0x800
+ static char md_pi_subst[256];
+
+ #pragma udata bank9=0x900
+// output:
+ static char md_state[48]; // DONT MOVE !! has to be at the beginning of bank 9 for the asm code!!!
+// internal:
+ static char md_t;
+ static char md_buffer[16];
+ static char md_cksum[16];
+ static char md_i;
+ static char md_j;
+ static char md_temp;
+ static unsigned int md_pointer;
+ static float deco_N2_ratio; // new in v.101
+ static float deco_He_ratio; // new in v.101
+ static float calc_N2_ratio; // new in v.101
+ static float calc_He_ratio; // new in v.101
+ static float deco_gas_change; // new in v.101
+ static float CNS_fraction; // new in v.101
+ static float float_saturation_multiplier; // new in v.101
+ static float float_desaturation_multiplier; // new in v.101
+ static float float_deco_distance; // new in v.101
+
+
+
+// *************************
+// ** P R O T O T Y P E S **
+// *************************
+void main_calc_hauptroutine(void);
+void main_calc_without_deco(void);
+void main_clear_tissue(void);
+void main_calc_percentage(void);
+void main_calc_wo_deco_step_1_min(void);
+void main_debug(void);
+void main_gradient_array(void);
+void main_hash(void);
+
+void calc_hauptroutine(void);
+void calc_tissue(void);
+void calc_nullzeit(void);
+void backup_sim_pres_tissue(void);
+void restore_sim_pres_tissue(void);
+
+void calc_without_deco(void);
+void clear_tissue(void);
+void calc_ascenttime(void);
+void update_startvalues(void);
+void clear_decoarray(void);
+void update_decoarray(void);
+void sim_tissue_1min(void);
+void sim_tissue_10min(void);
+void calc_gradient_factor(void);
+void calc_gradient_array_only(void);
+void calc_desaturation_time(void);
+void calc_wo_deco_step_1_min(void);
+void calc_tissue_step_1_min(void);
+//void debug(void);
+void hash(void);
+void clear_CNS_fraction(void);
+void calc_CNS_fraction(void);
+void calc_CNS_decrease_15min(void);
+void calc_percentage(void);
+void main(void);
+void calc_hauptroutine_data_input(void);
+void calc_hauptroutine_update_tissues(void);
+void calc_hauptroutine_calc_deco(void);
+void calc_hauptroutine_calc_ascend_to_deco(void);
+//void build_debug_output(void);
+void calc_nextdecodepth_GF(void);
+void copy_deco_table_GF(void);
+void clear_internal_deco_table_GF(void);
+void update_internal_deco_table_GF(void);
+void DD2_write(void);
+void DD2_write_incon42(void);
+void DD2_get_pointer_to_char(void);//dd2_char, &dd2_pointer);
+void DD2_set_column(void);//top, dd2_k);void DD2_load_background(void);//&dd2_columnstore, &dd2_background, dd2_top, dd2_left, dd2_heightmax);
+void DD2_load_background(void);
+void DD2_build_one_line_of_char(void);//&dd2_columnstore, &dd2_pointer, dd2_fontheight, dd2_lowbyte);
+void DD2_print_column(void);//&dd2_columnstore, dd2_heightmax);
+void DD2_CmdWrite(void);
+void DD2_DataWrite(void);
+void push_tissues_to_vault(void);
+void pull_tissues_from_vault(void);
+void main_push_tissues_to_vault(void);
+void main_pull_tissues_from_vault(void);
+
+// *******************************
+// ** start **
+// ** necessary for compilation **
+// *******************************
+#pragma romdata der_code = 0x0000
+#pragma code der_start = 0x0000
+void der_start(void)
+{
+_asm
+ goto main
+_endasm
+}
+
+// ***********************************
+// ** main code for simulation / **
+// ** tests without assembler code **
+// ** is NOT a part of the OSTC **
+// ***********************************
+#pragma code main = 0x9000
+void main(void)
+{
+#if 1
+// new main to test DR-5
+
+GF_low = 1.0;
+GF_high = 1.0;
+
+GF_temp = GF_low * GF_high;
+
+clear_CNS_fraction();
+//char_I_const_ppO2 = 100;
+//for (main_i=0;main_i<255;main_i++)
+//{
+//calc_CNS_fraction();
+//} //for
+
+
+
+
+int_I_pres_respiration = 1000;//980;
+int_I_pres_surface = 1000;//980;
+char_I_N2_ratio = 39; //38;
+char_I_He_ratio = 40; //50;
+char_I_deco_distance = 0; // 10 = 1 meter
+char_I_depth_last_deco = 3; // values below 3 (meter) are ignored
+
+char_I_const_ppO2 = 0;
+char_I_deco_ppO2_change = 0; // [dm] 10 = 1 meter
+char_I_deco_ppO2 = 0;
+
+char_I_deco_gas_change = 0; // [m] 1 = 1 meter
+char_I_deco_N2_ratio = 0;
+char_I_deco_He_ratio = 0;
+
+//char_I_actual_ppO2; // 0x507
+char_I_GF_High_percentage = 100; // 0x514 new in v.102
+char_I_GF_Low_percentage = 100; // 0x515 new in v.102
+
+char_I_saturation_multiplier = 110;
+char_I_desaturation_multiplier = 90;
+
+char_I_deco_model = 0;
+
+main_clear_tissue();
+
+int_I_pres_respiration = 1000 + int_I_pres_surface;
+main_calc_wo_deco_step_1_min();
+int_I_pres_respiration = 3000 + int_I_pres_surface;
+main_calc_wo_deco_step_1_min();
+int_I_pres_respiration = 5000 + int_I_pres_surface;
+main_calc_wo_deco_step_1_min();
+
+
+int_I_pres_respiration = 6000 + int_I_pres_surface;
+for (main_i=0;main_i<27;main_i++)
+ main_calc_wo_deco_step_1_min();
+
+char_O_deco_status = 255;
+while (char_O_deco_status)
+ main_calc_hauptroutine();
+_asm
+nop
+_endasm
+
+for (main_i=0;main_i<50;main_i++)
+{
+main_calc_hauptroutine();
+}
+int_I_pres_respiration = 10000;
+for (main_i=0;main_i<1500;main_i++)
+{
+main_calc_hauptroutine();
+}
+
+_asm
+nop
+_endasm
+
+
+int_I_pres_respiration = 3000;
+for (main_i=0;main_i<150;main_i++)
+{
+ calc_hauptroutine_data_input();
+ calc_hauptroutine_update_tissues();
+} //for
+
+ update_startvalues();
+ clear_decoarray();
+ clear_internal_deco_table_GF();
+ calc_hauptroutine_calc_ascend_to_deco();
+ if (char_O_deco_status > 15) // can't go up to first deco, too deep to calculate in the given time slot
+ {
+ char_O_deco_status = 2;
+// char_O_lock_depth_list = 255;
+ }
+ else
+ {
+// char_O_lock_depth_list = lock_GF_depth_list;
+ calc_hauptroutine_calc_deco();
+ }
+// build_debug_output();
+
+_asm
+nop
+_endasm
+while (char_O_deco_status == 1)
+{
+ char_O_deco_status = 0;
+// char_O_lock_depth_list = 255;
+ calc_hauptroutine_calc_deco();
+// build_debug_output();
+_asm
+nop
+_endasm
+};
+debug_temp = 60; // [mtr Aufstieg in 10 mtr/min (30steps'2sec/min]
+int_I_pres_respiration = 9980;
+for (main_i=0;main_i 15) // can't go up to first deco, too deep to calculate in the given time slot
+ {
+ char_O_deco_status = 2;
+// char_O_lock_depth_list = 255;
+ }
+ else
+ {
+// char_O_lock_depth_list = lock_GF_depth_list;
+ calc_hauptroutine_calc_deco();
+ }
+// build_debug_output();
+
+_asm
+nop
+_endasm
+while (char_O_deco_status == 1)
+{
+ char_O_deco_status = 0;
+// char_O_lock_depth_list = 255;
+ calc_hauptroutine_calc_deco();
+// build_debug_output();
+_asm
+nop
+_endasm
+};
+_asm
+nop
+_endasm
+debug_temp = 60; // [mtr Aufstieg in 10 mtr/min (30steps'2sec/min]
+int_I_pres_respiration = 9980;
+debug_temp = debug_temp * 3;
+for (main_i=0;main_i 31)
+ int_temp = 31; // deepest deco at 93 meter (31 deco stops)
+ if (int_temp < 0)
+ int_temp = 0;
+ temp_depth_GF_low_number = int_temp;
+ temp_depth_GF_low_meter = 3 * temp_depth_GF_low_number;
+ temp2 = (float)temp_depth_GF_low_meter * 0.09995;
+ temp_pres_deco_GF_low = temp2 + float_deco_distance + pres_surface;
+ if (temp_depth_GF_low_number == 0)
+ GF_step = 0;
+ else
+ GF_step = GF_delta / (float)temp_depth_GF_low_number;
+ if (GF_step < 0)
+ GF_step = 0;
+ if (GF_step > GF_delta)
+ GF_step = GF_delta;
+ int_O_GF_step = (int)(GF_step * 10000);
+ int_O_limit_GF_low = (int)(temp_pres_deco_GF_low * 1000);
+ int_O_gtissue_press_at_GF_low = (int)(temp_pres_gtissue * 1000);
+ char_O_GF_low_pointer = temp_depth_GF_low_number;
+ lock_GF_depth_list = 1;
+ internal_deco_pointer = 0;
+ }
+ if (internal_deco_pointer == 0) // new run
+ {
+ internal_deco_pointer = temp_depth_GF_low_number;
+ GF_temp = GF_high - ((float)internal_deco_pointer * GF_step);
+ int_temp = char_I_table_deco_done[internal_deco_pointer];
+ output[8] = int_temp;
+ output[9] = 33;
+ }
+ else
+ {
+ int_temp = 1;
+ }
+ while (int_temp == 1)
+ {
+ int_temp = internal_deco_pointer - 1;
+ if (int_temp == 1) // new in v104
+ {
+ temp2 = (float)(temp_depth_last_deco * int_temp) * 0.09995;
+ GF_step2 = GF_step/3.0 * ((float)(6 - temp_depth_last_deco));
+ }
+ else
+ if (int_temp == 0)
+ {
+ temp2 = 0.0;
+ GF_step2 = GF_high - GF_temp;
+ }
+ else
+ {
+ temp2 = (float)(3 *int_temp) * 0.09995;
+ GF_step2 = GF_step;
+ }
+ temp2 = temp2 + pres_surface; // next deco stop to be tested
+ temp1 = ((GF_temp + GF_step2)* temp_pres_gtissue_diff) + temp_pres_gtissue; // upper limit (lowest pressure allowed) // changes GF_step2 in v104
+ if (temp1 > temp2) // check if ascent to next deco stop is ok
+ {
+ int_temp = 0; // no
+ }
+ else
+ {
+ internal_deco_pointer = int_temp;
+ GF_temp = GF_temp + GF_step2; // changed in v104
+ int_temp = char_I_table_deco_done[internal_deco_pointer]; // yes and check for ascent to even next stop if deco_done is set
+ }
+ } // while
+ if (internal_deco_pointer > 0)
+ {
+ temp2 = (float)(0.29985 * internal_deco_pointer);
+ temp_deco = temp2 + float_deco_distance + pres_surface;
+ if (internal_deco_pointer == 1) // new in v104
+ temp_depth_limit = temp_depth_last_deco;
+ else
+ temp_depth_limit = 3 * internal_deco_pointer;
+ if (output[9] == 33)
+ {
+ output[9] = internal_deco_pointer;
+ output[10] = char_I_table_deco_done[internal_deco_pointer];
+ output[12] = output[12] + 1;
+ if (output[12] == 100)
+ output[12] = 0;
+ }
+ }
+ else // if (char_I_deco_model == 1)
+ {
+ temp_deco = pres_surface;
+ temp_depth_limit = 0;
+ }
+ }
+ else
+ {
+ // calc_nextdecodepth - original
+ // optimized in v.101
+ // depth_last_deco included in v.101
+
+ temp1 = temp_pres_gtissue_limit - pres_surface;
+ if (temp1 >= 0)
+ {
+ temp1 = temp1 / 0.29985; // = temp1 / 99.95 / 0.003;
+ temp_depth_limit = (int) (temp1 + 0.99);
+ temp_depth_limit = 3 * temp_depth_limit; // depth for deco [m]
+ if (temp_depth_limit == 0)
+ temp_deco = pres_surface;
+ else
+ {
+ if (temp_depth_limit < temp_depth_last_deco)
+ temp_depth_limit = temp_depth_last_deco;
+ temp1 = (float)temp_depth_limit * 0.09995;
+ temp_deco = temp1 + float_deco_distance + pres_surface; // depth for deco [bar]
+ } // if (temp_depth_limit == 0)
+ } // if (temp1 >= 0)
+ else
+ {
+ temp_deco = pres_surface;
+ temp_depth_limit = 0;
+ } // if (temp1 >= 0)
+ } // calc_nextdecodepth original
+} // calc_nextdecodepth_GF
+
+
+#if 0
+void build_debug_output(void)
+{
+output[0] = 0; // not used in asm PLED output
+output[1] = (int) (GF_low * 100);
+output[2] = (int) (GF_high * 100);
+output[3] = (int) (GF_step * 100);
+output[4] = (int) temp_depth_GF_low_number;
+output[5] = (int) temp_depth_GF_low_meter;
+//output[6]
+output[7] = (int) internal_deco_pointer;
+//output[8] = char_I_table_deco_done[temp_depth_GF_low_number]
+//output[9] = internal_deco_pointer @ new run
+//output[10] = char_I_table_deco_done[internal_deco_pointer] @ new run
+output [11] = (int) (temp_pres_deco_GF_low * 10);
+} // build_debug_output
+#endif
+
+// ---------------------
+// copy_deco_table_GF //
+// ---------------------
+// new in v.102
+void copy_deco_table_GF(void)
+{
+ if (char_I_deco_model == 1)
+ {
+ int_temp = 32;
+ for (ci=0;ci dd2_fontheight) dd2_heightmax = dd2_fontheight;
+ if ((dd2_top + dd2_heightmax) > 65) dd2_heightmax = 65 - dd2_top;
+
+ dd2_k = dd2_left;
+ dd2_j = 0;
+ dd2_char = dd2_stringstore[dd2_j++];
+ DD2_get_pointer_to_char();//dd2_char, &dd2_pointer);
+ dd2_i = 0;
+ dd2_lowbyte = 1;
+
+while (dd2_char != 0)
+{
+ if (dd2_lowbyte == 1) DD2_load_background();//&dd2_columnstore, &dd2_background, dd2_top, dd2_left, dd2_heightmax);
+ DD2_build_one_line_of_char(); //&dd2_columnstore, &dd2_pointer, dd2_fontheight, dd2_lowbyte); // dd2_heightmax
+ dd2_lowbyte = dd2_lowbyte ^ 1;
+ if (dd2_lowbyte == 1)
+ {
+ DD2_set_column();//top, dd2_k); //
+ if(dd2_k < 64) dd2_k++;
+ DD2_print_column();//&dd2_columnstore, dd2_heightmax); // dd2_column_store, dd2_heightmax
+ }
+ dd2_i++;
+ if ((dd2_i >= dd2_fontwidth) | (((dd2_char == '.') |(dd2_char == ':') | (dd2_char == '<')) & (dd2_i >= 4)))
+ {
+ dd2_char = dd2_stringstore[dd2_j++];
+ DD2_get_pointer_to_char();//dd2_char, &dd2_pointer);
+ dd2_i = 0;
+ }
+}
+} // void dd2_write(void)
+
+void DD2_get_pointer_to_char(void)//dd2_char, &dd2_pointer);
+{
+ if((dd2_char < dd2_start) | (dd2_char > dd2_end))
+ {
+ dd2_pointer = 0;
+ dd2_temp = 0;
+ }
+ else
+ {
+ dd2_pointer = dd2_char - dd2_start;
+ dd2_pointer = dd2_pointer * ((dd2_fontheight+1)/2);
+ dd2_pointer = dd2_pointer * dd2_fontwidth;
+ dd2_pointer += dd2_base;
+ if((dd2_char == '.') | (dd2_char == ':') | (dd2_char == '<'))
+ {
+ dd2_pointer += 2 * dd2_fontheight;
+ }
+
+ }
+} // void DD2_get_pointer_to_char(void)
+
+void DD2_set_column(void)//top, dd2_k);
+{
+ dd2_data = 0x75;
+ DD2_CmdWrite();
+ dd2_data = dd2_top - 1;
+ DD2_CmdWrite();
+ dd2_data = 0x3f;
+ DD2_CmdWrite();
+
+ dd2_data = 0x15;
+ DD2_CmdWrite();
+ dd2_data = dd2_k - 1;
+ DD2_CmdWrite();
+ dd2_data = dd2_k - 1;
+ DD2_CmdWrite();
+} // DD2_set_column()
+
+void DD2_load_background(void)//&dd2_columnstore, &dd2_background, dd2_top, dd2_left, dd2_heightmax);
+{
+ for(dd2_temp = 0; dd2_temp < dd2_heightmax; dd2_temp++)
+ md_pi_subst[dd2_temp] = 0x00;
+} // void DD2_load_background()
+
+void DD2_build_one_line_of_char(void)//&dd2_columnstore, &dd2_pointer, dd2_fontheight, dd2_lowbyte);
+{
+ if (dd2_pointer != 0)
+ {
+ dd2_temp = (char)(dd2_pointer & 255);
+_asm
+ movff dd2_temp,TBLPTRL
+_endasm
+ dd2_temp = (char)((dd2_pointer >> 8) & 255);
+_asm
+ movff dd2_temp,TBLPTRH
+_endasm
+ dd2_temp = (char)((dd2_pointer >> 16)& 255);
+_asm
+ movff dd2_temp,TBLPTRU
+_endasm
+
+ for(dd2_temp = 0; dd2_temp < dd2_heightmax; dd2_temp += 2)
+ {
+_asm
+ TBLRDPOSTINC
+ movff TABLAT,dd2_data
+_endasm
+ if (dd2_oled_brightness_offset != 0)
+ {
+ if ((dd2_oled_brightness_offset << 4) < (dd2_data & 0xF0))
+ dd2_data = dd2_data - (dd2_oled_brightness_offset << 4);
+ if ((dd2_oled_brightness_offset) < (dd2_data & 0x0F))
+ dd2_data = dd2_data - dd2_oled_brightness_offset;
+ }
+ if (dd2_lowbyte == 1)
+ {
+ md_pi_subst[dd2_temp] = dd2_data & 0xF0;
+ md_pi_subst[dd2_temp+1] = (dd2_data << 4) & 0xF0;
+ }
+ else
+ {
+ md_pi_subst[dd2_temp] = (md_pi_subst[dd2_temp] & 0xF0) | ((dd2_data >> 4) & 0x0F);
+ md_pi_subst[dd2_temp+1] = (md_pi_subst[dd2_temp+1] & 0xF0) | (dd2_data & 0x0F);
+ }
+ }//for
+ dd2_pointer += (dd2_fontheight+1)/2;
+ }//if
+} //
+
+void DD2_print_column(void)//&dd2_columnstore, dd2_heightmax);
+{
+_asm
+ bsf oled_rs
+_endasm
+ for(dd2_temp = 0; dd2_temp < dd2_heightmax; dd2_temp++)
+ {
+ dd2_data = md_pi_subst[dd2_temp];
+ DD2_DataWrite();
+ }
+} // void DD2_print_column(void)
+
+//; -----------------------------
+//; DD Write Cmd via W
+//; two jump_ins:
+//; DD_CmdWrite and DD_CmdWrite2
+//; -----------------------------
+void DD2_CmdWrite(void)
+{
+_asm
+ bcf oled_rs
+_endasm
+ DD2_DataWrite();
+}
+
+void DD2_DataWrite(void)
+{
+_asm
+ movlb 1
+// bsf no_sensor_int // flag5, no_sensor_int
+ bcf oled_en
+ movlb 0
+ bcf oled_clk //; CLK=0
+ btfsc dd2_data,7,1 //; Bit
+ bsf oled_data
+ bcf oled_clk //; CLK=0
+ btfss dd2_data,7,1
+ bcf oled_data
+ bsf oled_clk //; CLK=1
+ btfsc dd2_data,6,1 //; Bit
+ bsf oled_data
+ bcf oled_clk //; CLK=0
+ btfss dd2_data,6,1
+ bcf oled_data
+ bsf oled_clk //; CLK=1
+ btfsc dd2_data,5,1 //; Bit
+ bsf oled_data
+ bcf oled_clk //; CLK=0
+ btfss dd2_data,5,1
+ bcf oled_data //;
+ bsf oled_clk //; CLK=1
+ btfsc dd2_data,4,1 //; Bit
+ bsf oled_data
+ bcf oled_clk //; CLK=0
+ btfss dd2_data,4,1
+ bcf oled_data
+ bsf oled_clk //; CLK=1
+ btfsc dd2_data,3,1 //; Bit
+ bsf oled_data
+ bcf oled_clk //; CLK=0
+ btfss dd2_data,3,1
+ bcf oled_data
+ bsf oled_clk //; CLK=1
+ btfsc dd2_data,2,1 //; Bit
+ bsf oled_data
+ bcf oled_clk //; CLK=0
+ btfss dd2_data,2,1
+ bcf oled_data
+ bsf oled_clk //; CLK=1
+ btfsc dd2_data,1,1 //; Bit
+ bsf oled_data
+ bcf oled_clk //; CLK=0
+ btfss dd2_data,1,1
+ bcf oled_data
+ bsf oled_clk //; CLK=1
+ btfsc dd2_data,0,1 //; Bit
+ bsf oled_data
+ bcf oled_clk //; CLK=0
+ btfss dd2_data,0,1
+ bcf oled_data
+ bsf oled_clk //; CLK=1
+ bsf oled_en //; CS#=1
+ movlb 1
+// bcf no_sensor_int // flag5, no_sensor_int
+ movlb 0
+_endasm
+ dd2_data = 0; // to be sure that C knows we are in Bank0
+}
+#pragma romdata font_incon_24h15 = 0x0E100
+ rom const rom unsigned char incon24h15[] =
+ {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x80
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6f, 0xf0
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xe0
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3a, 0xf0
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x4b, 0xff, 0xa0
+ ,0x00, 0x00, 0x00, 0x00, 0x5c, 0xff, 0x91, 0x00
+ ,0x00, 0x00, 0x00, 0x6d, 0xfe, 0x71, 0x00, 0x00
+ ,0x00, 0x01, 0x7e, 0xfd, 0x60, 0x00, 0x00, 0x00
+ ,0x01, 0x8f, 0xfd, 0x50, 0x00, 0x00, 0x00, 0x00
+ ,0x9f, 0xfb, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0xfa, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x01, 0x69, 0xbc, 0xca, 0x72, 0x00, 0x00
+ ,0x00, 0x9f, 0xfe, 0xdc, 0xdf, 0xff, 0xb2, 0x00
+ ,0x1d, 0xf8, 0x20, 0x00, 0x05, 0xfd, 0xff, 0x30
+ ,0xaf, 0x30, 0x00, 0x00, 0x9f, 0x90, 0x2e, 0xd0
+ ,0xf8, 0x00, 0x00, 0x2c, 0xf5, 0x00, 0x06, 0xf0
+ ,0xf8, 0x00, 0x04, 0xed, 0x30, 0x00, 0x05, 0xf0
+ ,0xaf, 0x30, 0x8f, 0xb1, 0x00, 0x00, 0x0c, 0xe0
+ ,0x1d, 0xfd, 0xf8, 0x00, 0x00, 0x16, 0xdf, 0x40
+ ,0x00, 0x9f, 0xff, 0xdc, 0xde, 0xff, 0xc3, 0x00
+ ,0x00, 0x01, 0x69, 0xbc, 0xca, 0x73, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x02, 0x90, 0x00, 0x00, 0x00, 0x00, 0x01, 0x30
+ ,0x0a, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x04, 0xf0
+ ,0x2f, 0x60, 0x00, 0x00, 0x00, 0x00, 0x04, 0xf0
+ ,0xaf, 0x97, 0x77, 0x77, 0x77, 0x77, 0x79, 0xf0
+ ,0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0
+ ,0x12, 0x22, 0x22, 0x22, 0x22, 0x22, 0x26, 0xf0
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xf0
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xd0
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x40
+ ,0x07, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xf0
+ ,0x4f, 0x80, 0x00, 0x00, 0x00, 0x1c, 0xfe, 0xf0
+ ,0xcc, 0x00, 0x00, 0x00, 0x02, 0xef, 0x57, 0xf0
+ ,0xf7, 0x00, 0x00, 0x00, 0x2e, 0xe2, 0x07, 0xf0
+ ,0xf8, 0x00, 0x00, 0x01, 0xde, 0x20, 0x07, 0xf0
+ ,0xce, 0x10, 0x00, 0x2d, 0xe2, 0x00, 0x07, 0xf0
+ ,0x4f, 0xd6, 0x58, 0xfe, 0x30, 0x00, 0x07, 0xf0
+ ,0x06, 0xff, 0xff, 0xb1, 0x00, 0x00, 0x07, 0xf0
+ ,0x00, 0x14, 0x52, 0x00, 0x00, 0x00, 0x05, 0x80
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00
+ ,0x09, 0x20, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x50
+ ,0x6f, 0x40, 0x00, 0x00, 0x00, 0x00, 0x2e, 0xd0
+ ,0xdb, 0x00, 0x00, 0x59, 0x00, 0x00, 0x07, 0xf0
+ ,0xf8, 0x00, 0x00, 0x8e, 0x00, 0x00, 0x04, 0xf0
+ ,0xea, 0x00, 0x00, 0xcf, 0x10, 0x00, 0x06, 0xf0
+ ,0x9f, 0x30, 0x07, 0xff, 0x90, 0x00, 0x1e, 0xe0
+ ,0x1e, 0xfc, 0xdf, 0x87, 0xfb, 0x79, 0xef, 0x50
+ ,0x01, 0x9d, 0xc6, 0x00, 0x7e, 0xff, 0xd5, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x2b, 0xb0, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x06, 0xff, 0xe0, 0x00, 0x00
+ ,0x00, 0x00, 0x02, 0xcf, 0x69, 0xe0, 0x00, 0x00
+ ,0x00, 0x00, 0x7f, 0xb1, 0x09, 0xe0, 0x00, 0x00
+ ,0x00, 0x2c, 0xe6, 0x00, 0x09, 0xe0, 0x00, 0x00
+ ,0x07, 0xfb, 0x10, 0x00, 0x09, 0xe0, 0x00, 0x00
+ ,0xcf, 0xfc, 0xcc, 0xcc, 0xce, 0xfd, 0xdd, 0xd0
+ ,0xde, 0xee, 0xee, 0xee, 0xef, 0xfe, 0xee, 0xe0
+ ,0x00, 0x00, 0x00, 0x00, 0x09, 0xe0, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x08, 0xc0, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00
+ ,0x78, 0xab, 0xcd, 0xed, 0x00, 0x00, 0xce, 0x20
+ ,0xff, 0xed, 0xcc, 0xfa, 0x00, 0x00, 0x5f, 0xb0
+ ,0xf9, 0x00, 0x06, 0xf0, 0x00, 0x00, 0x08, 0xf0
+ ,0xf9, 0x00, 0x0a, 0xb0, 0x00, 0x00, 0x04, 0xf0
+ ,0xf9, 0x00, 0x0a, 0xc0, 0x00, 0x00, 0x04, 0xf0
+ ,0xf9, 0x00, 0x08, 0xf3, 0x00, 0x00, 0x0b, 0xf0
+ ,0xf9, 0x00, 0x01, 0xfe, 0x62, 0x13, 0xbf, 0x90
+ ,0xf9, 0x00, 0x00, 0x4e, 0xff, 0xff, 0xfb, 0x00
+ ,0x11, 0x00, 0x00, 0x01, 0x6a, 0xa9, 0x40, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x03, 0x56, 0x65, 0x30, 0x00, 0x00
+ ,0x00, 0x4b, 0xff, 0xff, 0xff, 0xff, 0xa2, 0x00
+ ,0x08, 0xfe, 0x96, 0x8f, 0x95, 0x6a, 0xff, 0x30
+ ,0x6f, 0x90, 0x01, 0xf8, 0x00, 0x00, 0x3e, 0xd0
+ ,0xec, 0x00, 0x08, 0xf0, 0x00, 0x00, 0x06, 0xf0
+ ,0xf6, 0x00, 0x0a, 0xe0, 0x00, 0x00, 0x04, 0xf0
+ ,0xf7, 0x00, 0x07, 0xf3, 0x00, 0x00, 0x09, 0xf0
+ ,0xcd, 0x10, 0x01, 0xef, 0x72, 0x13, 0xaf, 0x90
+ ,0x4d, 0x20, 0x00, 0x2d, 0xff, 0xff, 0xf9, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x47, 0x86, 0x10, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x90
+ ,0xfa, 0x00, 0x00, 0x00, 0x00, 0x39, 0xef, 0xf0
+ ,0xfa, 0x00, 0x00, 0x01, 0x7d, 0xff, 0xe9, 0x40
+ ,0xfa, 0x00, 0x05, 0xbf, 0xff, 0x94, 0x00, 0x00
+ ,0xfa, 0x18, 0xef, 0xfb, 0x50, 0x00, 0x00, 0x00
+ ,0xfe, 0xff, 0xd7, 0x10, 0x00, 0x00, 0x00, 0x00
+ ,0xff, 0xb4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x02, 0x78, 0x50, 0x00
+ ,0x03, 0xad, 0xb4, 0x00, 0x7f, 0xff, 0xfc, 0x00
+ ,0x3f, 0xfc, 0xff, 0x66, 0xfa, 0x43, 0xaf, 0xa0
+ ,0xcd, 0x10, 0x1c, 0xfe, 0x70, 0x00, 0x0b, 0xf0
+ ,0xf5, 0x00, 0x01, 0xfe, 0x00, 0x00, 0x05, 0xf0
+ ,0xf5, 0x00, 0x00, 0xbf, 0x10, 0x00, 0x04, 0xf0
+ ,0xec, 0x00, 0x07, 0xff, 0xb0, 0x00, 0x0a, 0xf0
+ ,0x6f, 0xd9, 0xcf, 0x78, 0xfb, 0x32, 0x9f, 0x90
+ ,0x07, 0xef, 0xe6, 0x00, 0x9f, 0xff, 0xfb, 0x00
+ ,0x00, 0x01, 0x00, 0x00, 0x03, 0x88, 0x50, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x03, 0x55, 0x20, 0x00, 0x00, 0x00, 0x00
+ ,0x04, 0xdf, 0xff, 0xfb, 0x10, 0x00, 0x0b, 0x60
+ ,0x4f, 0xd7, 0x45, 0x9f, 0xd0, 0x00, 0x1c, 0xe0
+ ,0xdd, 0x00, 0x00, 0x05, 0xf5, 0x00, 0x05, 0xf0
+ ,0xf7, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x04, 0xf0
+ ,0xf8, 0x00, 0x00, 0x00, 0xf7, 0x00, 0x08, 0xf0
+ ,0xbe, 0x20, 0x00, 0x06, 0xf2, 0x00, 0x5f, 0xa0
+ ,0x2e, 0xf9, 0x54, 0x7f, 0x94, 0x7c, 0xfc, 0x00
+ ,0x02, 0xaf, 0xff, 0xff, 0xff, 0xfe, 0x70, 0x00
+ ,0x00, 0x01, 0x46, 0x77, 0x75, 0x30, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x06, 0xa1, 0x00, 0x00, 0x09, 0x80
+ ,0x00, 0x00, 0x1f, 0xf9, 0x00, 0x00, 0x6f, 0xf0
+ ,0x00, 0x00, 0x0d, 0xf5, 0x00, 0x00, 0x3f, 0xe0
+ ,0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0xba, 0xae, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0xff, 0xe9, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x53, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x97, 0x8c, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0xff, 0xfb, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x75, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x75, 0x6a, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0xff, 0xfd, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0xa8, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x2c, 0xff, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0xdd, 0x78, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0xf2, 0x00, 0x5f, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0xf0, 0x00, 0x4f, 0x10, 0x00, 0x00, 0x00, 0x00
+ ,0xea, 0x23, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x4f, 0xff, 0xe2, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x01, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x11, 0x11, 0x11, 0x11, 0x11, 0x10
+ ,0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0
+ ,0x00, 0x00, 0x9f, 0xa7, 0x77, 0x77, 0x77, 0x70
+ ,0x00, 0x00, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x02, 0xf3, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x01, 0xff, 0xcb, 0xbb, 0xbb, 0xbb, 0xb0
+ ,0x00, 0x00, 0x4f, 0xfe, 0xee, 0xee, 0xee, 0xe0
+ ,0x00, 0x00, 0xab, 0x20, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x01, 0xf1, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x02, 0xfa, 0x55, 0x55, 0x55, 0x55, 0x50
+ ,0x00, 0x00, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xf0
+ ,0x00, 0x00, 0x02, 0x44, 0x44, 0x44, 0x44, 0x40
+ };
+
+#pragma romdata font_incon_42 = 0x0F500
+ rom const rom unsigned char incon42[] =
+ {
+ // 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x03, 0x7a, 0xcd, 0xee, 0xdc, 0xa8, 0x40, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x18, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x92, 0x00, 0x00, 0x00
+ ,0x00, 0x07, 0xef, 0xff, 0xff, 0xdc, 0xbb, 0xce, 0xff, 0xff, 0xff, 0x91, 0x00, 0x00
+ ,0x00, 0xbf, 0xff, 0xc7, 0x65, 0x43, 0x22, 0x33, 0x57, 0xbf, 0xff, 0xfd, 0x20, 0x00
+ ,0x0b, 0xff, 0xc4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x6e, 0xff, 0xd1, 0x00
+ ,0x7f, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xbf, 0xfa, 0x00
+ ,0xef, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0xff, 0x20
+ ,0xff, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xff, 0x60
+ ,0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0x70
+ ,0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0x50
+ ,0xcf, 0xf3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1d, 0xff, 0x10
+ ,0x4f, 0xfe, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xcf, 0xf8, 0x00
+ ,0x07, 0xff, 0xd7, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x7e, 0xff, 0xb0, 0x00
+ ,0x00, 0x5e, 0xff, 0xfb, 0x98, 0x54, 0x33, 0x34, 0x58, 0xbf, 0xff, 0xfa, 0x00, 0x00
+ ,0x00, 0x01, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x50, 0x00, 0x00
+ ,0x00, 0x00, 0x01, 0x7b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe9, 0x40, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x02, 0x46, 0x77, 0x65, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ // ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+
+#if 0
+// 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x03, 0x7a, 0xcd, 0xee, 0xdc, 0xa8, 0x40, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x18, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x92, 0x00, 0x00, 0x00
+ ,0x00, 0x07, 0xef, 0xff, 0xff, 0xdc, 0xbb, 0xce, 0xff, 0xff, 0xff, 0x91, 0x00, 0x00
+ ,0x00, 0xbf, 0xff, 0xc7, 0x20, 0x00, 0x00, 0x00, 0x1c, 0xff, 0xff, 0xfd, 0x20, 0x00
+ ,0x0b, 0xff, 0xc4, 0x00, 0x00, 0x00, 0x00, 0x02, 0xcf, 0xfc, 0x6e, 0xff, 0xd1, 0x00
+ ,0x7f, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5e, 0xff, 0x90, 0x01, 0xbf, 0xfa, 0x00
+ ,0xef, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x09, 0xff, 0xe5, 0x00, 0x00, 0x0d, 0xff, 0x20
+ ,0xff, 0x60, 0x00, 0x00, 0x00, 0x02, 0xcf, 0xfc, 0x20, 0x00, 0x00, 0x05, 0xff, 0x60
+ ,0xff, 0x40, 0x00, 0x00, 0x00, 0x5e, 0xff, 0x90, 0x00, 0x00, 0x00, 0x03, 0xff, 0x70
+ ,0xff, 0x80, 0x00, 0x00, 0x08, 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0x50
+ ,0xcf, 0xf3, 0x00, 0x01, 0xcf, 0xfd, 0x30, 0x00, 0x00, 0x00, 0x00, 0x1d, 0xff, 0x10
+ ,0x4f, 0xfe, 0x50, 0x4e, 0xff, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x01, 0xcf, 0xf8, 0x00
+ ,0x07, 0xff, 0xfd, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x01, 0x7e, 0xff, 0xb0, 0x00
+ ,0x00, 0x5e, 0xff, 0xff, 0xd8, 0x54, 0x33, 0x34, 0x58, 0xbf, 0xff, 0xfa, 0x00, 0x00
+ ,0x00, 0x01, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x50, 0x00, 0x00
+ ,0x00, 0x00, 0x01, 0x7b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe9, 0x40, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x02, 0x46, 0x77, 0x65, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+// ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+#endif
+//
+// ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x1f, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x44, 0x00
+ ,0x00, 0x9f, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0x00
+ ,0x02, 0xff, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0x00
+ ,0x0a, 0xff, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0x00
+ ,0x3f, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0x00
+ ,0xbf, 0xfc, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x79, 0xff, 0x00
+ ,0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00
+ ,0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00
+ ,0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x36, 0xff, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xcc, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+// ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ //
+// ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x08, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0xff, 0x00
+ ,0x00, 0xbf, 0xd1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xff, 0x00
+ ,0x0a, 0xff, 0xb3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xdf, 0xff, 0xff, 0x00
+ ,0x4f, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6f, 0xff, 0xdb, 0xff, 0x00
+ ,0xcf, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xf8, 0x08, 0xff, 0x00
+ ,0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9f, 0xfe, 0x40, 0x08, 0xff, 0x00
+ ,0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0xff, 0xd2, 0x00, 0x08, 0xff, 0x00
+ ,0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9f, 0xfd, 0x10, 0x00, 0x08, 0xff, 0x00
+ ,0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xd1, 0x00, 0x00, 0x08, 0xff, 0x00
+ ,0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x8f, 0xfe, 0x20, 0x00, 0x00, 0x08, 0xff, 0x00
+ ,0x9f, 0xfa, 0x00, 0x00, 0x00, 0x1a, 0xff, 0xe2, 0x00, 0x00, 0x00, 0x08, 0xff, 0x00
+ ,0x2e, 0xff, 0xd6, 0x21, 0x38, 0xef, 0xfd, 0x20, 0x00, 0x00, 0x00, 0x08, 0xff, 0x00
+ ,0x04, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0x00
+ ,0x00, 0x3d, 0xff, 0xff, 0xff, 0xe7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0x00
+ ,0x00, 0x00, 0x59, 0xbb, 0x95, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ //,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ //
+// ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5e, 0x30, 0x00
+ ,0x04, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xd0, 0x00
+ ,0x1e, 0xfe, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xdf, 0xf8, 0x00
+ ,0x7f, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xfe, 0x00
+ ,0xdf, 0xc0, 0x00, 0x00, 0x00, 0x07, 0x95, 0x00, 0x00, 0x00, 0x00, 0x09, 0xff, 0x30
+ ,0xff, 0x70, 0x00, 0x00, 0x00, 0x0c, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0x60
+ ,0xff, 0x50, 0x00, 0x00, 0x00, 0x0e, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0x70
+ ,0xff, 0x60, 0x00, 0x00, 0x00, 0x2f, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0x60
+ ,0xff, 0xb0, 0x00, 0x00, 0x00, 0x7f, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x09, 0xff, 0x30
+ ,0xbf, 0xf4, 0x00, 0x00, 0x02, 0xef, 0xff, 0x70, 0x00, 0x00, 0x00, 0x2f, 0xfe, 0x00
+ ,0x4f, 0xfe, 0x60, 0x00, 0x5e, 0xfd, 0xbf, 0xf5, 0x00, 0x00, 0x03, 0xef, 0xf7, 0x00
+ ,0x09, 0xff, 0xff, 0xdf, 0xff, 0xf3, 0x2f, 0xff, 0xb6, 0x56, 0xbf, 0xff, 0xc0, 0x00
+ ,0x00, 0x8f, 0xff, 0xff, 0xfe, 0x40, 0x04, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x00
+ ,0x00, 0x02, 0x8c, 0xdb, 0x71, 0x00, 0x00, 0x2b, 0xff, 0xff, 0xfe, 0x80, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x66, 0x30, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ //,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ //
+// ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xef, 0xc0, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xaf, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5e, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0xff, 0xd4, 0xcf, 0xc0, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x06, 0xef, 0xf8, 0x00, 0xcf, 0xc0, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x02, 0xbf, 0xfc, 0x30, 0x00, 0xcf, 0xc0, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x7f, 0xff, 0x70, 0x00, 0x00, 0xcf, 0xc0, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x2c, 0xff, 0xb2, 0x00, 0x00, 0x00, 0xcf, 0xc0, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x07, 0xff, 0xe6, 0x00, 0x00, 0x00, 0x00, 0xcf, 0xc0, 0x00, 0x00, 0x00, 0x00
+ ,0x03, 0xcf, 0xfa, 0x10, 0x00, 0x00, 0x00, 0x00, 0xcf, 0xc0, 0x00, 0x00, 0x00, 0x00
+ ,0x8f, 0xff, 0xea, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xef, 0xea, 0xaa, 0xaa, 0xaa, 0x00
+ ,0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00
+ ,0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00
+ ,0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0xdf, 0xd4, 0x44, 0x44, 0x44, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcf, 0xc0, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcf, 0xc0, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79, 0x70, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ //,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ //
+// ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x12, 0x34, 0x56, 0x72, 0x00, 0x00, 0x00, 0x03, 0xf8, 0x00, 0x00
+ ,0xab, 0xcd, 0xef, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x1e, 0xff, 0x80, 0x00
+ ,0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x00, 0x00, 0x00, 0x28, 0xff, 0xf3, 0x00
+ ,0xff, 0xda, 0xa9, 0x87, 0x67, 0xff, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xfb, 0x00
+ ,0xff, 0x70, 0x00, 0x00, 0x06, 0xff, 0x10, 0x00, 0x00, 0x00, 0x00, 0x0c, 0xff, 0x10
+ ,0xff, 0x70, 0x00, 0x00, 0x0b, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xff, 0x50
+ ,0xff, 0x70, 0x00, 0x00, 0x0d, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x70
+ ,0xff, 0x70, 0x00, 0x00, 0x0e, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x70
+ ,0xff, 0x70, 0x00, 0x00, 0x0e, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0x60
+ ,0xff, 0x70, 0x00, 0x00, 0x0b, 0xfe, 0x10, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xff, 0x30
+ ,0xff, 0x70, 0x00, 0x00, 0x06, 0xff, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x6f, 0xfd, 0x00
+ ,0xff, 0x70, 0x00, 0x00, 0x00, 0xdf, 0xfd, 0x40, 0x00, 0x00, 0x29, 0xff, 0xf5, 0x00
+ ,0xff, 0x70, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xfe, 0xba, 0xbd, 0xff, 0xff, 0x90, 0x00
+ ,0xff, 0x70, 0x00, 0x00, 0x00, 0x03, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00
+ ,0x55, 0x20, 0x00, 0x00, 0x00, 0x00, 0x07, 0xdf, 0xff, 0xff, 0xea, 0x30, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x34, 0x42, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ //,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ //
+// ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x33, 0x33, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x49, 0xce, 0xff, 0xff, 0xff, 0xff, 0xeb, 0x71, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x00, 0x00
+ ,0x00, 0x3d, 0xff, 0xff, 0xfc, 0xba, 0xff, 0xfb, 0xab, 0xef, 0xff, 0xfd, 0x20, 0x00
+ ,0x04, 0xff, 0xfe, 0x83, 0x00, 0x1c, 0xfd, 0x20, 0x00, 0x02, 0x8e, 0xff, 0xd1, 0x00
+ ,0x1e, 0xff, 0x90, 0x00, 0x00, 0xbf, 0xe1, 0x00, 0x00, 0x00, 0x01, 0xcf, 0xf9, 0x00
+ ,0xaf, 0xf7, 0x00, 0x00, 0x05, 0xff, 0x50, 0x00, 0x00, 0x00, 0x00, 0x1d, 0xff, 0x10
+ ,0xff, 0xb0, 0x00, 0x00, 0x0a, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0x50
+ ,0xff, 0x50, 0x00, 0x00, 0x0d, 0xfb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x70
+ ,0xff, 0x20, 0x00, 0x00, 0x0d, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0x60
+ ,0xff, 0x30, 0x00, 0x00, 0x0a, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0x30
+ ,0xff, 0x70, 0x00, 0x00, 0x05, 0xff, 0xc1, 0x00, 0x00, 0x00, 0x00, 0x4f, 0xfd, 0x00
+ ,0xef, 0xe1, 0x00, 0x00, 0x00, 0xcf, 0xfd, 0x50, 0x00, 0x00, 0x28, 0xff, 0xf4, 0x00
+ ,0x7f, 0xfd, 0x00, 0x00, 0x00, 0x2d, 0xff, 0xff, 0xdb, 0xcd, 0xff, 0xff, 0x70, 0x00
+ ,0x0c, 0xd2, 0x00, 0x00, 0x00, 0x01, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xe5, 0x00, 0x00
+ ,0x01, 0x10, 0x00, 0x00, 0x00, 0x00, 0x03, 0x9d, 0xff, 0xfe, 0xb6, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ //,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ //
+// ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0xcc, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00
+ ,0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0xef, 0x00
+ ,0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x9e, 0xff, 0xff, 0x00
+ ,0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0xdf, 0xff, 0xff, 0xfe, 0x00
+ ,0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x01, 0x7d, 0xff, 0xff, 0xff, 0xd9, 0x40, 0x00
+ ,0xff, 0x90, 0x00, 0x00, 0x00, 0x05, 0xbf, 0xff, 0xff, 0xfd, 0x83, 0x00, 0x00, 0x00
+ ,0xff, 0x90, 0x00, 0x00, 0x39, 0xef, 0xff, 0xff, 0xe8, 0x30, 0x00, 0x00, 0x00, 0x00
+ ,0xff, 0x90, 0x00, 0x6c, 0xff, 0xff, 0xfe, 0x94, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0xff, 0x92, 0x8e, 0xff, 0xff, 0xfb, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0xff, 0xef, 0xff, 0xff, 0xd7, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0xff, 0xff, 0xff, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0xff, 0xfd, 0x71, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0xba, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ //,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ //
+// ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x67, 0x62, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x24, 0x42, 0x00, 0x00, 0x00, 0x04, 0xdf, 0xff, 0xff, 0xb2, 0x00, 0x00
+ ,0x00, 0x3c, 0xff, 0xff, 0xc4, 0x00, 0x00, 0x8f, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x00
+ ,0x05, 0xff, 0xff, 0xff, 0xff, 0x70, 0x08, 0xff, 0xfb, 0x77, 0xaf, 0xff, 0xe1, 0x00
+ ,0x3f, 0xff, 0xa7, 0x8d, 0xff, 0xf6, 0x4f, 0xfc, 0x20, 0x00, 0x02, 0xdf, 0xf9, 0x00
+ ,0xbf, 0xe3, 0x00, 0x00, 0x8f, 0xfe, 0xdf, 0xb0, 0x00, 0x00, 0x00, 0x2e, 0xff, 0x00
+ ,0xff, 0x60, 0x00, 0x00, 0x08, 0xff, 0xfe, 0x10, 0x00, 0x00, 0x00, 0x08, 0xff, 0x40
+ ,0xff, 0x10, 0x00, 0x00, 0x00, 0xcf, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0x60
+ ,0xff, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0x60
+ ,0xff, 0x20, 0x00, 0x00, 0x00, 0x5f, 0xff, 0x10, 0x00, 0x00, 0x00, 0x05, 0xff, 0x50
+ ,0xff, 0x80, 0x00, 0x00, 0x03, 0xef, 0xff, 0xa0, 0x00, 0x00, 0x00, 0x0a, 0xff, 0x20
+ ,0xdf, 0xf6, 0x00, 0x00, 0x5e, 0xfc, 0xcf, 0xf8, 0x00, 0x00, 0x00, 0x4f, 0xfd, 0x00
+ ,0x4f, 0xff, 0xc8, 0x9d, 0xff, 0xf3, 0x3f, 0xff, 0xa2, 0x00, 0x06, 0xff, 0xf5, 0x00
+ ,0x07, 0xff, 0xff, 0xff, 0xfe, 0x40, 0x06, 0xff, 0xff, 0xdc, 0xef, 0xff, 0xa0, 0x00
+ ,0x00, 0x4c, 0xff, 0xff, 0x91, 0x00, 0x00, 0x5e, 0xff, 0xff, 0xff, 0xfa, 0x00, 0x00
+ ,0x00, 0x00, 0x24, 0x30, 0x00, 0x00, 0x00, 0x01, 0x8e, 0xff, 0xfb, 0x40, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ //,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ //
+// ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x02, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x01, 0x7d, 0xff, 0xff, 0xea, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x40, 0x00
+ ,0x00, 0x6e, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x6f, 0xe2, 0x00
+ ,0x08, 0xff, 0xff, 0xb9, 0x9b, 0xef, 0xff, 0xc0, 0x00, 0x00, 0x00, 0xbf, 0xfa, 0x00
+ ,0x4f, 0xff, 0x70, 0x00, 0x00, 0x05, 0xef, 0xf8, 0x00, 0x00, 0x00, 0x0c, 0xff, 0x10
+ ,0xdf, 0xf3, 0x00, 0x00, 0x00, 0x00, 0x1e, 0xff, 0x10, 0x00, 0x00, 0x06, 0xff, 0x50
+ ,0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0x50, 0x00, 0x00, 0x04, 0xff, 0x60
+ ,0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0x70, 0x00, 0x00, 0x04, 0xff, 0x60
+ ,0xff, 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0x70, 0x00, 0x00, 0x07, 0xff, 0x40
+ ,0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0x40, 0x00, 0x00, 0x0d, 0xfe, 0x00
+ ,0xef, 0xe2, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xfd, 0x00, 0x00, 0x00, 0x9f, 0xf8, 0x00
+ ,0x7f, 0xfd, 0x30, 0x00, 0x00, 0x00, 0x7f, 0xf4, 0x00, 0x00, 0x1a, 0xff, 0xd1, 0x00
+ ,0x0b, 0xff, 0xfb, 0x52, 0x00, 0x08, 0xff, 0x60, 0x13, 0x6a, 0xff, 0xfe, 0x20, 0x00
+ ,0x00, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xc2, 0x00, 0x00
+ ,0x00, 0x04, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc5, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x02, 0x69, 0xcd, 0xef, 0xff, 0xed, 0xb9, 0x62, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+// ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ };
+
+#if 0
+#pragma romdata font_incon_42 = 0x0E000
+ rom const rom unsigned char incon42[] =
+ {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x03, 0x7a, 0xcd, 0xee, 0xdc, 0xa8, 0x40, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x18, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x92, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x07, 0xef, 0xff, 0xff, 0xdc, 0xbb, 0xce, 0xff, 0xff, 0xff, 0x91, 0x00, 0x00
+ ,0x00, 0x00, 0xbf, 0xff, 0xc7, 0x20, 0x00, 0x00, 0x00, 0x1c, 0xff, 0xff, 0xfd, 0x20, 0x00
+ ,0x00, 0x0b, 0xff, 0xc4, 0x00, 0x00, 0x00, 0x00, 0x02, 0xcf, 0xfc, 0x6e, 0xff, 0xd1, 0x00
+ ,0x00, 0x7f, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5e, 0xff, 0x90, 0x01, 0xbf, 0xfa, 0x00
+ ,0x00, 0xef, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x09, 0xff, 0xe5, 0x00, 0x00, 0x0d, 0xff, 0x20
+ ,0x03, 0xff, 0x60, 0x00, 0x00, 0x00, 0x02, 0xcf, 0xfc, 0x20, 0x00, 0x00, 0x05, 0xff, 0x60
+ ,0x04, 0xff, 0x40, 0x00, 0x00, 0x00, 0x5e, 0xff, 0x90, 0x00, 0x00, 0x00, 0x03, 0xff, 0x70
+ ,0x02, 0xff, 0x80, 0x00, 0x00, 0x08, 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0x50
+ ,0x00, 0xcf, 0xf3, 0x00, 0x01, 0xcf, 0xfd, 0x30, 0x00, 0x00, 0x00, 0x00, 0x1d, 0xff, 0x10
+ ,0x00, 0x4f, 0xfe, 0x50, 0x4e, 0xff, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x01, 0xcf, 0xf8, 0x00
+ ,0x00, 0x07, 0xff, 0xfd, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x01, 0x7e, 0xff, 0xb0, 0x00
+ ,0x00, 0x00, 0x5e, 0xff, 0xff, 0xd8, 0x54, 0x33, 0x34, 0x58, 0xbf, 0xff, 0xfa, 0x00, 0x00
+ ,0x00, 0x00, 0x01, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x50, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x01, 0x7b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe9, 0x40, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x46, 0x77, 0x65, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x1f, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x44, 0x00
+ ,0x00, 0x00, 0x9f, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0x00
+ ,0x00, 0x02, 0xff, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0x00
+ ,0x00, 0x0a, 0xff, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0x00
+ ,0x00, 0x3f, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0x00
+ ,0x00, 0xbf, 0xfc, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x79, 0xff, 0x00
+ ,0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00
+ ,0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00
+ ,0x00, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x36, 0xff, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xcc, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x08, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0xff, 0x00
+ ,0x00, 0x00, 0xbf, 0xd1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xff, 0x00
+ ,0x00, 0x0a, 0xff, 0xb3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xdf, 0xff, 0xff, 0x00
+ ,0x00, 0x4f, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6f, 0xff, 0xdb, 0xff, 0x00
+ ,0x00, 0xcf, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xf8, 0x08, 0xff, 0x00
+ ,0x01, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9f, 0xfe, 0x40, 0x08, 0xff, 0x00
+ ,0x04, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0xff, 0xd2, 0x00, 0x08, 0xff, 0x00
+ ,0x04, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9f, 0xfd, 0x10, 0x00, 0x08, 0xff, 0x00
+ ,0x03, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xd1, 0x00, 0x00, 0x08, 0xff, 0x00
+ ,0x00, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x8f, 0xfe, 0x20, 0x00, 0x00, 0x08, 0xff, 0x00
+ ,0x00, 0x9f, 0xfa, 0x00, 0x00, 0x00, 0x1a, 0xff, 0xe2, 0x00, 0x00, 0x00, 0x08, 0xff, 0x00
+ ,0x00, 0x2e, 0xff, 0xd6, 0x21, 0x38, 0xef, 0xfd, 0x20, 0x00, 0x00, 0x00, 0x08, 0xff, 0x00
+ ,0x00, 0x04, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0x00
+ ,0x00, 0x00, 0x3d, 0xff, 0xff, 0xff, 0xe7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0x00
+ ,0x00, 0x00, 0x00, 0x59, 0xbb, 0x95, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5e, 0x30, 0x00
+ ,0x00, 0x04, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xd0, 0x00
+ ,0x00, 0x1e, 0xfe, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xdf, 0xf8, 0x00
+ ,0x00, 0x7f, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xfe, 0x00
+ ,0x00, 0xdf, 0xc0, 0x00, 0x00, 0x00, 0x07, 0x95, 0x00, 0x00, 0x00, 0x00, 0x09, 0xff, 0x30
+ ,0x01, 0xff, 0x70, 0x00, 0x00, 0x00, 0x0c, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0x60
+ ,0x03, 0xff, 0x50, 0x00, 0x00, 0x00, 0x0e, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0x70
+ ,0x03, 0xff, 0x60, 0x00, 0x00, 0x00, 0x2f, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0x60
+ ,0x01, 0xff, 0xb0, 0x00, 0x00, 0x00, 0x7f, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x09, 0xff, 0x30
+ ,0x00, 0xbf, 0xf4, 0x00, 0x00, 0x02, 0xef, 0xff, 0x70, 0x00, 0x00, 0x00, 0x2f, 0xfe, 0x00
+ ,0x00, 0x4f, 0xfe, 0x60, 0x00, 0x5e, 0xfd, 0xbf, 0xf5, 0x00, 0x00, 0x03, 0xef, 0xf7, 0x00
+ ,0x00, 0x09, 0xff, 0xff, 0xdf, 0xff, 0xf3, 0x2f, 0xff, 0xb6, 0x56, 0xbf, 0xff, 0xc0, 0x00
+ ,0x00, 0x00, 0x8f, 0xff, 0xff, 0xfe, 0x40, 0x04, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x00
+ ,0x00, 0x00, 0x02, 0x8c, 0xdb, 0x71, 0x00, 0x00, 0x2b, 0xff, 0xff, 0xfe, 0x80, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x66, 0x30, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xef, 0xc0, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xaf, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5e, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0xff, 0xd4, 0xcf, 0xc0, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xef, 0xf8, 0x00, 0xcf, 0xc0, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x02, 0xbf, 0xfc, 0x30, 0x00, 0xcf, 0xc0, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0x70, 0x00, 0x00, 0xcf, 0xc0, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x2c, 0xff, 0xb2, 0x00, 0x00, 0x00, 0xcf, 0xc0, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x07, 0xff, 0xe6, 0x00, 0x00, 0x00, 0x00, 0xcf, 0xc0, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x03, 0xcf, 0xfa, 0x10, 0x00, 0x00, 0x00, 0x00, 0xcf, 0xc0, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x8f, 0xff, 0xea, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xef, 0xea, 0xaa, 0xaa, 0xaa, 0x00
+ ,0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00
+ ,0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00
+ ,0x00, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0xdf, 0xd4, 0x44, 0x44, 0x44, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcf, 0xc0, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcf, 0xc0, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79, 0x70, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x12, 0x34, 0x56, 0x72, 0x00, 0x00, 0x00, 0x03, 0xf8, 0x00, 0x00
+ ,0x01, 0xab, 0xcd, 0xef, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x1e, 0xff, 0x80, 0x00
+ ,0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x00, 0x00, 0x00, 0x28, 0xff, 0xf3, 0x00
+ ,0x02, 0xff, 0xda, 0xa9, 0x87, 0x67, 0xff, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xfb, 0x00
+ ,0x02, 0xff, 0x70, 0x00, 0x00, 0x06, 0xff, 0x10, 0x00, 0x00, 0x00, 0x00, 0x0c, 0xff, 0x10
+ ,0x02, 0xff, 0x70, 0x00, 0x00, 0x0b, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xff, 0x50
+ ,0x02, 0xff, 0x70, 0x00, 0x00, 0x0d, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x70
+ ,0x02, 0xff, 0x70, 0x00, 0x00, 0x0e, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x70
+ ,0x02, 0xff, 0x70, 0x00, 0x00, 0x0e, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0x60
+ ,0x02, 0xff, 0x70, 0x00, 0x00, 0x0b, 0xfe, 0x10, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xff, 0x30
+ ,0x02, 0xff, 0x70, 0x00, 0x00, 0x06, 0xff, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x6f, 0xfd, 0x00
+ ,0x02, 0xff, 0x70, 0x00, 0x00, 0x00, 0xdf, 0xfd, 0x40, 0x00, 0x00, 0x29, 0xff, 0xf5, 0x00
+ ,0x02, 0xff, 0x70, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xfe, 0xba, 0xbd, 0xff, 0xff, 0x90, 0x00
+ ,0x02, 0xff, 0x70, 0x00, 0x00, 0x00, 0x03, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00
+ ,0x01, 0x55, 0x20, 0x00, 0x00, 0x00, 0x00, 0x07, 0xdf, 0xff, 0xff, 0xea, 0x30, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x34, 0x42, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x33, 0x33, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x49, 0xce, 0xff, 0xff, 0xff, 0xff, 0xeb, 0x71, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x00, 0x00
+ ,0x00, 0x00, 0x3d, 0xff, 0xff, 0xfc, 0xba, 0xff, 0xfb, 0xab, 0xef, 0xff, 0xfd, 0x20, 0x00
+ ,0x00, 0x04, 0xff, 0xfe, 0x83, 0x00, 0x1c, 0xfd, 0x20, 0x00, 0x02, 0x8e, 0xff, 0xd1, 0x00
+ ,0x00, 0x1e, 0xff, 0x90, 0x00, 0x00, 0xbf, 0xe1, 0x00, 0x00, 0x00, 0x01, 0xcf, 0xf9, 0x00
+ ,0x00, 0xaf, 0xf7, 0x00, 0x00, 0x05, 0xff, 0x50, 0x00, 0x00, 0x00, 0x00, 0x1d, 0xff, 0x10
+ ,0x01, 0xff, 0xb0, 0x00, 0x00, 0x0a, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0x50
+ ,0x04, 0xff, 0x50, 0x00, 0x00, 0x0d, 0xfb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x70
+ ,0x06, 0xff, 0x20, 0x00, 0x00, 0x0d, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0x60
+ ,0x06, 0xff, 0x30, 0x00, 0x00, 0x0a, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0x30
+ ,0x03, 0xff, 0x70, 0x00, 0x00, 0x05, 0xff, 0xc1, 0x00, 0x00, 0x00, 0x00, 0x4f, 0xfd, 0x00
+ ,0x00, 0xef, 0xe1, 0x00, 0x00, 0x00, 0xcf, 0xfd, 0x50, 0x00, 0x00, 0x28, 0xff, 0xf4, 0x00
+ ,0x00, 0x7f, 0xfd, 0x00, 0x00, 0x00, 0x2d, 0xff, 0xff, 0xdb, 0xcd, 0xff, 0xff, 0x70, 0x00
+ ,0x00, 0x0c, 0xd2, 0x00, 0x00, 0x00, 0x01, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xe5, 0x00, 0x00
+ ,0x00, 0x01, 0x10, 0x00, 0x00, 0x00, 0x00, 0x03, 0x9d, 0xff, 0xfe, 0xb6, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x02, 0xcc, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x02, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x02, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00
+ ,0x02, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0xef, 0x00
+ ,0x02, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x9e, 0xff, 0xff, 0x00
+ ,0x02, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0xdf, 0xff, 0xff, 0xfe, 0x00
+ ,0x02, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x01, 0x7d, 0xff, 0xff, 0xff, 0xd9, 0x40, 0x00
+ ,0x02, 0xff, 0x90, 0x00, 0x00, 0x00, 0x05, 0xbf, 0xff, 0xff, 0xfd, 0x83, 0x00, 0x00, 0x00
+ ,0x02, 0xff, 0x90, 0x00, 0x00, 0x39, 0xef, 0xff, 0xff, 0xe8, 0x30, 0x00, 0x00, 0x00, 0x00
+ ,0x02, 0xff, 0x90, 0x00, 0x6c, 0xff, 0xff, 0xfe, 0x94, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x02, 0xff, 0x92, 0x8e, 0xff, 0xff, 0xfb, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x02, 0xff, 0xef, 0xff, 0xff, 0xd7, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x02, 0xff, 0xff, 0xff, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x02, 0xff, 0xfd, 0x71, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x02, 0xba, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x67, 0x62, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x24, 0x42, 0x00, 0x00, 0x00, 0x04, 0xdf, 0xff, 0xff, 0xb2, 0x00, 0x00
+ ,0x00, 0x00, 0x3c, 0xff, 0xff, 0xc4, 0x00, 0x00, 0x8f, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x00
+ ,0x00, 0x05, 0xff, 0xff, 0xff, 0xff, 0x70, 0x08, 0xff, 0xfb, 0x77, 0xaf, 0xff, 0xe1, 0x00
+ ,0x00, 0x3f, 0xff, 0xa7, 0x8d, 0xff, 0xf6, 0x4f, 0xfc, 0x20, 0x00, 0x02, 0xdf, 0xf9, 0x00
+ ,0x00, 0xbf, 0xe3, 0x00, 0x00, 0x8f, 0xfe, 0xdf, 0xb0, 0x00, 0x00, 0x00, 0x2e, 0xff, 0x00
+ ,0x01, 0xff, 0x60, 0x00, 0x00, 0x08, 0xff, 0xfe, 0x10, 0x00, 0x00, 0x00, 0x08, 0xff, 0x40
+ ,0x05, 0xff, 0x10, 0x00, 0x00, 0x00, 0xcf, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0x60
+ ,0x06, 0xff, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0x60
+ ,0x06, 0xff, 0x20, 0x00, 0x00, 0x00, 0x5f, 0xff, 0x10, 0x00, 0x00, 0x00, 0x05, 0xff, 0x50
+ ,0x03, 0xff, 0x80, 0x00, 0x00, 0x03, 0xef, 0xff, 0xa0, 0x00, 0x00, 0x00, 0x0a, 0xff, 0x20
+ ,0x00, 0xdf, 0xf6, 0x00, 0x00, 0x5e, 0xfc, 0xcf, 0xf8, 0x00, 0x00, 0x00, 0x4f, 0xfd, 0x00
+ ,0x00, 0x4f, 0xff, 0xc8, 0x9d, 0xff, 0xf3, 0x3f, 0xff, 0xa2, 0x00, 0x06, 0xff, 0xf5, 0x00
+ ,0x00, 0x07, 0xff, 0xff, 0xff, 0xfe, 0x40, 0x06, 0xff, 0xff, 0xdc, 0xef, 0xff, 0xa0, 0x00
+ ,0x00, 0x00, 0x4c, 0xff, 0xff, 0x91, 0x00, 0x00, 0x5e, 0xff, 0xff, 0xff, 0xfa, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x24, 0x30, 0x00, 0x00, 0x00, 0x01, 0x8e, 0xff, 0xfb, 0x40, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x02, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x01, 0x7d, 0xff, 0xff, 0xea, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x40, 0x00
+ ,0x00, 0x00, 0x6e, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x6f, 0xe2, 0x00
+ ,0x00, 0x08, 0xff, 0xff, 0xb9, 0x9b, 0xef, 0xff, 0xc0, 0x00, 0x00, 0x00, 0xbf, 0xfa, 0x00
+ ,0x00, 0x4f, 0xff, 0x70, 0x00, 0x00, 0x05, 0xef, 0xf8, 0x00, 0x00, 0x00, 0x0c, 0xff, 0x10
+ ,0x00, 0xdf, 0xf3, 0x00, 0x00, 0x00, 0x00, 0x1e, 0xff, 0x10, 0x00, 0x00, 0x06, 0xff, 0x50
+ ,0x03, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0x50, 0x00, 0x00, 0x04, 0xff, 0x60
+ ,0x05, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0x70, 0x00, 0x00, 0x04, 0xff, 0x60
+ ,0x06, 0xff, 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0x70, 0x00, 0x00, 0x07, 0xff, 0x40
+ ,0x04, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0x40, 0x00, 0x00, 0x0d, 0xfe, 0x00
+ ,0x00, 0xef, 0xe2, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xfd, 0x00, 0x00, 0x00, 0x9f, 0xf8, 0x00
+ ,0x00, 0x7f, 0xfd, 0x30, 0x00, 0x00, 0x00, 0x7f, 0xf4, 0x00, 0x00, 0x1a, 0xff, 0xd1, 0x00
+ ,0x00, 0x0b, 0xff, 0xfb, 0x52, 0x00, 0x08, 0xff, 0x60, 0x13, 0x6a, 0xff, 0xfe, 0x20, 0x00
+ ,0x00, 0x00, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xc2, 0x00, 0x00
+ ,0x00, 0x00, 0x04, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc5, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x02, 0x69, 0xcd, 0xef, 0xff, 0xed, 0xb9, 0x62, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ };
+#endif
+
+// **********************
+// **********************
+// ** THE JUMP-IN CODE **
+// ** for the asm code **
+// **********************
+// **********************
+#pragma code main_calc_hauptroutine = 0x10000
+void main_calc_hauptroutine(void)
+{
+calc_hauptroutine();
+int_O_desaturation_time = 65535;
+} // divemode
+#pragma code main_without_deco = 0x10020
+void main_calc_without_deco(void)
+{
+calc_without_deco();
+calc_desaturation_time();
+}
+
+#pragma code main_clear_CNS_fraction = 0x10030
+void main_clear_CNS_fraction(void)
+{
+clear_CNS_fraction();
+}
+
+#pragma code main_calc_CNS_decrease_15min = 0x10034
+void main_calc_CNS_decrease_15min(void)
+{
+calc_CNS_decrease_15min();
+}
+
+#pragma code main_calc_percentage = 0x10038
+void main_calc_percentage (void)
+{
+calc_percentage();
+}
+
+#pragma code main_clear_tissue = 0x10040
+void main_clear_tissue(void)
+{
+clear_tissue();
+char_I_depth_last_deco = 0; // for compatibility with v.101pre_no_last_deco
+}
+
+#pragma code main_calc_CNS_fraction = 0x10050
+void main_calc_CNS_fraction(void)
+{
+calc_CNS_fraction();
+}
+
+#pragma code main_calc_desaturation_time = 0x10060
+void main_calc_desaturation_time(void)
+{
+calc_desaturation_time();
+}
+
+#pragma code main_calc_wo_deco_step_1_min = 0x10080
+void main_calc_wo_deco_step_1_min(void)
+{
+calc_wo_deco_step_1_min();
+char_O_deco_status = 3; // surface new in v.102 overwrites value of calc_wo_deco_step_1_min
+calc_desaturation_time();
+} // surface mode
+
+#pragma code main_debug = 0x100A0
+void main_debug(void)
+{
+//debug();
+}
+
+#pragma code main_DD2_write_incon42 = 0x100B0
+void main_DD2_write_incon42(void)
+{
+ DD2_write_incon42();
+}
+
+#pragma code main_DD2_write_incon24 = 0x100B4
+void main_DD2_write_incon24(void)
+{
+ DD2_write_incon24();
+}
+
+#pragma code main_gradient_array = 0x100C0
+void main_gradient_array(void)
+{
+calc_gradient_array_only();
+}
+#pragma code main_push_tissues = 0x100C4
+void main_push_tissues_to_vault(void)
+{
+ push_tissues_to_vault();
+}
+#pragma code main_pull_tissues = 0x100C8
+void main_pull_tissues_from_vault(void)
+{
+ pull_tissues_from_vault();
+}
+
+#pragma code main_hash = 0x100E0
+void main_hash(void)
+{
+hash();
+}
+
+// ***********************
+// ***********************
+// ** THE LOOKUP TABLES **
+// ***********************
+// ***********************
+
+#pragma romdata tables = 0x10200
+#include // new table for deco_main_v.101 (var_a modified)
+
+#pragma romdata tables2 = 0x10600
+rom const rom unsigned int md_pi[] =
+{
+ 0x292E, 0x43C9, 0xA2D8, 0x7C01, 0x3D36, 0x54A1, 0xECF0, 0x0613
+ , 0x62A7, 0x05F3, 0xC0C7, 0x738C, 0x9893, 0x2BD9, 0xBC4C, 0x82CA
+ , 0x1E9B, 0x573C, 0xFDD4, 0xE016, 0x6742, 0x6F18, 0x8A17, 0xE512
+ , 0xBE4E, 0xC4D6, 0xDA9E, 0xDE49, 0xA0FB, 0xF58E, 0xBB2F, 0xEE7A
+ , 0xA968, 0x7991, 0x15B2, 0x073F, 0x94C2, 0x1089, 0x0B22, 0x5F21
+ , 0x807F, 0x5D9A, 0x5A90, 0x3227, 0x353E, 0xCCE7, 0xBFF7, 0x9703
+ , 0xFF19, 0x30B3, 0x48A5, 0xB5D1, 0xD75E, 0x922A, 0xAC56, 0xAAC6
+ , 0x4FB8, 0x38D2, 0x96A4, 0x7DB6, 0x76FC, 0x6BE2, 0x9C74, 0x04F1
+ , 0x459D, 0x7059, 0x6471, 0x8720, 0x865B, 0xCF65, 0xE62D, 0xA802
+ , 0x1B60, 0x25AD, 0xAEB0, 0xB9F6, 0x1C46, 0x6169, 0x3440, 0x7E0F
+ , 0x5547, 0xA323, 0xDD51, 0xAF3A, 0xC35C, 0xF9CE, 0xBAC5, 0xEA26
+ , 0x2C53, 0x0D6E, 0x8528, 0x8409, 0xD3DF, 0xCDF4, 0x4181, 0x4D52
+ , 0x6ADC, 0x37C8, 0x6CC1, 0xABFA, 0x24E1, 0x7B08, 0x0CBD, 0xB14A
+ , 0x7888, 0x958B, 0xE363, 0xE86D, 0xE9CB, 0xD5FE, 0x3B00, 0x1D39
+ , 0xF2EF, 0xB70E, 0x6658, 0xD0E4, 0xA677, 0x72F8, 0xEB75, 0x4B0A
+ , 0x3144, 0x50B4, 0x8FED, 0x1F1A, 0xDB99, 0x8D33, 0x9F11, 0x8314
+};
+
+// *********************
+// *********************
+// ** THE SUBROUTINES **
+// *********************
+// *********************
+
+#pragma code subroutines = 0x10700 // can be adapted to fit the romdata tables ahead
+
+
+// ---------------
+// CLEAR tissue //
+// ---------------
+// optimized in v.101 (var_a)
+
+void clear_tissue(void) // preload tissues with standard pressure for the given ambient pressure
+{
+_asm
+lfsr 1, 0x300 // C math routines shall use this variable bank
+movlw 0x01
+movwf TBLPTRU,0
+_endasm
+
+// N2_ratio = (float)char_I_N2_ratio; // the 0.0002 of 0.7902 are missing with standard air
+ N2_ratio = 0.7902; // N2_ratio / 100.0;
+ pres_respiration = (float)int_I_pres_respiration / 1000.0;
+for (ci=0;ci<16;ci++) // cycle through the 16 b"uhlmann tissues
+{
+ pres_tissue[ci] = N2_ratio * (pres_respiration - 0.0627) ;
+_asm
+movlw 0x02
+movwf TBLPTRH,0
+movlb 4 // fuer ci
+movf ci,0,1
+addwf ci,0,1
+addwf ci,0,1
+addwf ci,0,1
+addlw 0x80
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var_a+1
+TBLRDPOSTINC
+movff TABLAT,var_a
+TBLRDPOSTINC
+movff TABLAT,var_a+3
+TBLRD
+movff TABLAT,var_a+2
+addlw 0x80
+movwf TBLPTRL,0
+incf TBLPTRH,1,0
+TBLRDPOSTINC
+movff TABLAT,var_b+1
+TBLRDPOSTINC
+movff TABLAT,var_b
+TBLRDPOSTINC
+movff TABLAT,var_b+3
+TBLRD
+movff TABLAT,var_b+2
+_endasm
+
+pres_tissue_limit[ci] = (pres_tissue[ci] - var_a) * var_b ;
+// now update the guiding tissue
+if (pres_tissue_limit[ci] < 0)
+pres_tissue_limit[ci] = 0;
+} // for 0 to 16
+
+for (ci=16;ci<32;ci++) // cycle through the 16 b"uhlmann tissues for Helium
+{
+ pres_tissue[ci] = 0.0;
+} // for
+
+ clear_decoarray();
+ char_O_deco_status = 0;
+ char_O_nullzeit = 0;
+ char_O_ascenttime = 0;
+ char_O_gradient_factor = 0;
+ char_O_relative_gradient_GF = 0;
+} // clear_tissue(void)
+
+
+// --------------------
+// calc_without_deco //
+// fixed N2_ratio ! //
+// --------------------
+// optimized in v.101 (float_..saturation_multiplier)
+
+void calc_without_deco(void)
+{
+_asm
+ lfsr 1, 0x300
+_endasm
+ N2_ratio = 0.7902; // FIXED RATIO !! sum as stated in b"uhlmann
+ pres_respiration = (float)int_I_pres_respiration / 1000.0; // assembler code uses different digit system
+ pres_surface = (float)int_I_pres_surface / 1000.0;
+ temp_atem = N2_ratio * (pres_respiration - 0.0627); // 0.0627 is the extra pressure in the body
+ temp2_atem = 0.0;
+ temp_surface = pres_surface; // the b"uhlmann formula using temp_surface does apply to the pressure without any inert ratio
+ float_desaturation_multiplier = char_I_desaturation_multiplier / 100.0;
+ float_saturation_multiplier = char_I_saturation_multiplier / 100.0;
+
+ calc_tissue(); // update the pressure in the 16 tissues in accordance with the new ambient pressure
+
+ clear_decoarray();
+ char_O_deco_status = 0;
+ char_O_nullzeit = 0;
+ char_O_ascenttime = 0;
+ calc_gradient_factor();
+
+} // calc_without_deco
+
+
+// --------------------
+// calc_hauptroutine //
+// --------------------
+// this is the major code in dive mode
+// calculates:
+// the tissues,
+// the bottom time
+// and simulates the ascend with all deco stops
+
+void calc_hauptroutine(void)
+{
+ calc_hauptroutine_data_input();
+ calc_hauptroutine_update_tissues();
+ calc_gradient_factor();
+
+
+ switch (char_O_deco_status) // toggle between calculation for nullzeit (bottom time), deco stops and more deco stops (continue)
+ {
+ case 0:
+ update_startvalues();
+ calc_nullzeit();
+ char_O_deco_status = 255; // calc deco next time
+ break;
+ case 1:
+ if (char_O_deco_status == 3)
+ break;
+ char_O_deco_status = 0;
+// char_O_lock_depth_list = 255;
+ calc_hauptroutine_calc_deco();
+// build_debug_output();
+ break;
+ case 3: // new dive
+ clear_decoarray();
+ clear_internal_deco_table_GF();
+ copy_deco_table_GF();
+ internal_deco_pointer = 0;
+ lock_GF_depth_list = 0;
+ update_startvalues();
+ calc_nextdecodepth_GF();
+ char_O_deco_status = 0;
+ break;
+ default:
+ update_startvalues();
+ clear_decoarray();
+ clear_internal_deco_table_GF();
+ output[6] = 1;
+ calc_hauptroutine_calc_ascend_to_deco();
+ if (char_O_deco_status > 15) // can't go up to first deco, too deep to calculate in the given time slot
+ {
+ char_O_deco_status = 2;
+// char_O_lock_depth_list = 255;
+ }
+ else
+ {
+// char_O_lock_depth_list = lock_GF_depth_list;
+ calc_hauptroutine_calc_deco();
+ }
+// build_debug_output();
+ break;
+ }
+ calc_ascenttime();
+}
+
+void calc_hauptroutine_data_input(void)
+{
+ pres_respiration = (float)int_I_pres_respiration / 1000.0;
+ pres_surface = (float)int_I_pres_surface / 1000.0;
+
+ N2_ratio = (float)char_I_N2_ratio / 100.0;; // the 0.0002 of 0.7902 are missing with standard air
+ He_ratio = (float)char_I_He_ratio / 100.0;;
+ deco_N2_ratio = (float)char_I_deco_N2_ratio / 100.0;
+ deco_He_ratio = (float)char_I_deco_He_ratio / 100.0;
+ float_deco_distance = (float)char_I_deco_distance / 100.0;
+ deco_gas_change = (float)char_I_deco_gas_change / 9.995 + pres_surface;
+ deco_gas_change = deco_gas_change + float_deco_distance;
+ const_ppO2 = (float)char_I_const_ppO2 / 100.0;
+ deco_ppO2_change = (float)char_I_deco_ppO2_change / 99.95 + pres_surface;
+ deco_ppO2_change = deco_ppO2_change + float_deco_distance;
+ deco_ppO2 = (float)char_I_deco_ppO2 / 100.0;
+ float_desaturation_multiplier = (float)char_I_desaturation_multiplier / 100.0;
+ float_saturation_multiplier = (float)char_I_saturation_multiplier / 100.0;
+ GF_low = (float)char_I_GF_Low_percentage / 100.0;
+ GF_high = (float)char_I_GF_High_percentage / 100.0;
+ GF_delta = GF_high - GF_low;
+
+ temp2 = (pres_respiration - pres_surface) / 0.29985;
+ int_temp = (int)(temp2);
+ if (int_temp < 0)
+ int_temp = 0;
+ if (int_temp > 255)
+ int_temp = 255;
+ char_O_actual_pointer = int_temp;
+
+ temp_depth_last_deco = (int)char_I_depth_last_deco;
+}
+
+void calc_hauptroutine_update_tissues(void)
+{
+ int_O_calc_tissue_call_counter = int_O_calc_tissue_call_counter + 1;
+ if (char_I_const_ppO2 == 0) // new in v.101
+ pres_diluent = pres_respiration; // new in v.101
+ else // new in v.101
+ pres_diluent = ((pres_respiration - const_ppO2)/(N2_ratio + He_ratio)); // new in v.101
+ if (pres_diluent > pres_respiration) // new in v.101
+ pres_diluent = pres_respiration; // new in v.101
+ if (pres_diluent > 0.0627) // new in v.101
+ {
+ temp_atem = N2_ratio * (pres_diluent - 0.0627); // changed in v.101
+ temp2_atem = He_ratio * (pres_diluent - 0.0627); // changed in v.101
+ char_O_diluent = (char)(pres_diluent/pres_respiration*100.0);
+ }
+ else // new in v.101
+ {
+ temp_atem = 0.0; // new in v.101
+ temp2_atem = 0.0; // new in v.101
+ char_O_diluent = 0;
+ }
+ temp_surface = pres_surface;
+ calc_tissue();
+ int_O_gtissue_limit = (int)(pres_tissue_limit[char_O_gtissue_no] * 1000);
+ int_O_gtissue_press = (int)((pres_tissue[char_O_gtissue_no] + pres_tissue[char_O_gtissue_no+16]) * 1000);
+ if (char_I_deco_model == 1)
+ {
+ temp1 = temp1 * GF_high;
+ }
+ else
+ {
+ temp1 = temp_surface;
+ }
+ if (pres_gtissue_limit > temp1 && char_O_deco_status == 0) // if guiding tissue can not be exposed to surface pressure immediately
+ {
+ char_O_nullzeit = 0; // deco necessary
+ char_O_deco_status = 255; // calculate deco skip nullzeit calculation
+ }
+} // calc_hauptroutine_update_tissues
+void calc_hauptroutine_calc_deco(void)
+{
+ do
+ {
+ int_temp_decostatus = 0;
+ calc_nextdecodepth_GF();
+ if (temp_depth_limit > 0)
+ {
+ if (char_I_const_ppO2 == 0) // new in v.101
+ {
+ deco_diluent = temp_deco; // new in v.101
+ if (temp_deco > deco_gas_change)
+ {
+ calc_N2_ratio = N2_ratio;
+ calc_He_ratio = He_ratio;
+ }
+ else
+ {
+ calc_N2_ratio = deco_N2_ratio;
+ calc_He_ratio = deco_He_ratio;
+ }
+ }
+ else // new in v.101
+ {
+ calc_N2_ratio = N2_ratio;
+ calc_He_ratio = He_ratio;
+ if (temp_deco > deco_ppO2_change)
+ {
+ deco_diluent = ((temp_deco - const_ppO2)/(N2_ratio + He_ratio)); // new in v.101
+ }
+ else
+ {
+ deco_diluent = ((temp_deco - deco_ppO2)/(N2_ratio + He_ratio)); // new in v.101
+ }
+ }
+ if (deco_diluent > temp_deco) // new in v.101
+ deco_diluent = temp_deco; // new in v.101
+ if (deco_diluent > 0.0627) // new in v.101
+ {
+ temp_atem = calc_N2_ratio * (deco_diluent - 0.0627); // changed in v.101
+ temp2_atem = calc_He_ratio * (deco_diluent - 0.0627); // changed in v.101
+ }
+ else // new in v.101
+ {
+ temp_atem = 0.0; // new in v.101
+ temp2_atem = 0.0; // new in v.101
+ }
+ sim_tissue_1min();
+ update_internal_deco_table_GF();
+ temp_decotime = 1;
+ update_decoarray();
+ char_O_deco_status = char_O_deco_status + 1;
+ if (char_O_deco_status < 16)
+ int_temp_decostatus = 1;
+ }
+ else // if (temp_depth_limit > 0)
+ {
+ char_O_deco_status = 0;
+ }
+ } while (int_temp_decostatus == 1);
+ if (char_O_deco_status > 15)
+ {
+ char_O_deco_status = 1;
+ }
+ else
+ {
+ copy_deco_table_GF();
+ char_O_deco_status = 0;
+ }
+}
+
+void calc_hauptroutine_calc_ascend_to_deco(void)
+{
+ update_startvalues();
+ char_O_deco_status = 0;
+ temp_deco = pres_respiration;
+ lock_GF_depth_list = 1; // new in v.102
+ do // go up to first deco
+ {
+ int_temp_decostatus = 0;
+ temp_deco = temp_deco - 1.0;
+ if ( char_I_deco_model == 1) // new in v.102 , 4 = deep stops
+ temp_limit = temp_pres_gtissue_limit_GF_low;
+ else
+ temp_limit = temp_pres_gtissue_limit;
+ if ((temp_deco > temp_limit) && (temp_deco > pres_surface)) // changes in v.102
+ {
+ lock_GF_depth_list = 0; // new in v.102, distance to first stop > 10 mtr.
+ output[6] = 0;
+ if (char_I_const_ppO2 == 0) // new in v.101 // calculate at half of the ascent
+ {
+ deco_diluent = temp_deco + 0.5; // new in v.101
+ if (temp_deco + 0.5 > deco_gas_change)
+ {
+ calc_N2_ratio = N2_ratio;
+ calc_He_ratio = He_ratio;
+ }
+ else
+ {
+ calc_N2_ratio = deco_N2_ratio;
+ calc_He_ratio = deco_He_ratio;
+ }
+ }
+ else // new in v.101
+ {
+ calc_N2_ratio = N2_ratio;
+ calc_He_ratio = He_ratio;
+ if (temp_deco + 0.5 > deco_ppO2_change)
+ deco_diluent = ((temp_deco + 0.5 - const_ppO2)/(N2_ratio + He_ratio)); // new in v.101 // calculate at half of the ascent
+ else
+ deco_diluent = ((temp_deco + 0.5 - deco_ppO2)/(N2_ratio + He_ratio)); // new in v.101 // calculate at half of the ascent
+ if (deco_diluent > (temp_deco +0.5)) // new in v.101
+ deco_diluent = temp_deco + 0.5; // new in v.101 // calculate at half of the ascent
+ }
+ if (deco_diluent > 0.0627) // new in v.101
+ {
+ temp_atem = calc_N2_ratio * (deco_diluent - 0.0627); // changed in v.101
+ temp2_atem = calc_He_ratio * (deco_diluent - 0.0627); // changed in v.101
+ }
+ else // new in v.101
+ {
+ temp_atem = 0.0; // new in v.101
+ temp2_atem = 0.0; // new in v.101
+ }
+ sim_tissue_1min();
+ char_O_deco_status = char_O_deco_status + 1;
+ if (char_O_deco_status < 16) // 16 is the limit of calculations for one time slot
+ int_temp_decostatus = 1;
+ }
+ } while (int_temp_decostatus == 1);
+} // calc_hauptroutine_calc_ascend_to_deco
+
+// --------------
+// calc_tissue //
+// --------------
+// optimized in v.101
+
+void calc_tissue(void)
+{
+_asm
+lfsr 1, 0x300
+movlw 0x01
+movwf TBLPTRU,0
+_endasm
+
+ char_O_gtissue_no = 255;
+ pres_gtissue_limit = 0.0;
+
+for (ci=0;ci<16;ci++)
+{
+_asm
+movlw 0x02
+movwf TBLPTRH,0
+movlb 4 // fuer ci
+movf ci,0,1
+addwf ci,0,1
+addwf ci,0,1
+addwf ci,0,1
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var_e2secs+1 // the order is confussing
+TBLRDPOSTINC
+movff TABLAT,var_e2secs // low byte first, high afterwards
+TBLRDPOSTINC
+movff TABLAT,var_e2secs+3
+TBLRD
+movff TABLAT,var_e2secs+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var2_e2secs+1
+TBLRDPOSTINC
+movff TABLAT,var2_e2secs
+TBLRDPOSTINC
+movff TABLAT,var2_e2secs+3
+TBLRD
+movff TABLAT,var2_e2secs+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var_a+1
+TBLRDPOSTINC
+movff TABLAT,var_a
+TBLRDPOSTINC
+movff TABLAT,var_a+3
+TBLRD
+movff TABLAT,var_a+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var2_a+1
+TBLRDPOSTINC
+movff TABLAT,var2_a
+TBLRDPOSTINC
+movff TABLAT,var2_a+3
+TBLRD
+movff TABLAT,var2_a+2
+addlw 0x40
+movwf TBLPTRL,0
+incf TBLPTRH,1,0
+TBLRDPOSTINC
+movff TABLAT,var_b+1
+TBLRDPOSTINC
+movff TABLAT,var_b
+TBLRDPOSTINC
+movff TABLAT,var_b+3
+TBLRD
+movff TABLAT,var_b+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var2_b+1
+TBLRDPOSTINC
+movff TABLAT,var2_b
+TBLRDPOSTINC
+movff TABLAT,var2_b+3
+TBLRD
+movff TABLAT,var2_b+2
+_endasm
+ // the start values are the previous end values // write new values in temp
+
+// N2
+ temp_tissue = (temp_atem - pres_tissue[ci]) * var_e2secs;
+ temp_tissue_safety();
+ pres_tissue[ci] = pres_tissue[ci] + temp_tissue;
+
+// He
+ temp_tissue = (temp2_atem - pres_tissue[ci+16]) * var2_e2secs;
+ temp_tissue_safety();
+ pres_tissue[ci+16] = pres_tissue[ci+16] + temp_tissue;
+
+ temp_tissue = pres_tissue[ci] + pres_tissue[ci+16];
+
+ var_a = (var_a * pres_tissue[ci] + var2_a * pres_tissue[ci+16]) / temp_tissue;
+ var_b = (var_b * pres_tissue[ci] + var2_b * pres_tissue[ci+16]) / temp_tissue;
+ pres_tissue_limit[ci] = (temp_tissue - var_a) * var_b;
+ if (pres_tissue_limit[ci] < 0)
+ pres_tissue_limit[ci] = 0;
+ if (pres_tissue_limit[ci] > pres_gtissue_limit)
+ {
+ pres_gtissue_limit = pres_tissue_limit[ci];
+ char_O_gtissue_no = ci;
+ }//if
+} // for
+}//calc_tissue(void)
+
+// ----------------
+// calc_nullzeit //
+// ----------------
+// calculates the remaining bottom time
+
+// unchanged in v.101
+
+void calc_nullzeit(void)
+{
+ char_O_nullzeit = 0;
+ int_temp = 1;
+ do
+ {
+ backup_sim_pres_tissue();
+ sim_tissue_10min();
+ char_O_nullzeit = char_O_nullzeit + 10;
+ int_temp = int_temp + 1;
+ if (char_I_deco_model == 1)
+ temp1 = GF_high * temp_pres_gtissue_diff + temp_pres_gtissue;
+ else
+ temp1 = temp_pres_gtissue_limit;
+ if (temp1 > temp_surface) // changed in v.102 , if guiding tissue can not be exposed to surface pressure immediately
+ int_temp = 255;
+ } while (int_temp < 17);
+ if (int_temp == 255)
+ {
+ restore_sim_pres_tissue();
+ char_O_nullzeit = char_O_nullzeit - 10;
+ } //if int_temp == 255]
+ int_temp = 1;
+ if (char_O_nullzeit < 60)
+ {
+ do
+ {
+ sim_tissue_1min();
+ char_O_nullzeit = char_O_nullzeit + 1;
+ int_temp = int_temp + 1; // new in v.102a
+ if (char_I_deco_model == 1)
+ temp1 = GF_high * temp_pres_gtissue_diff + temp_pres_gtissue;
+ else
+ temp1 = temp_pres_gtissue_limit;
+ if (temp1 > temp_surface) // changed in v.102 , if guiding tissue can not be exposed to surface pressure immediately
+ int_temp = 255;
+ } while (int_temp < 10);
+ if (int_temp == 255)
+ char_O_nullzeit = char_O_nullzeit - 1;
+ } // if char_O_nullzeit < 60
+} //calc_nullzeit
+
+// -------------------------
+// backup_sim_pres_tissue //
+// -------------------------
+void backup_sim_pres_tissue(void)
+{
+ for (x = 0;x<16;x++)
+ {
+ sim_pres_tissue_backup[x] = sim_pres_tissue[x];
+ sim_pres_tissue_backup[x+16] = sim_pres_tissue[x+16];
+ }
+} // backup_sim
+
+// --------------------------
+// restore_sim_pres_tissue //
+// --------------------------
+void restore_sim_pres_tissue(void)
+{
+ for (x = 0;x<16;x++)
+ {
+ sim_pres_tissue[x] = sim_pres_tissue_backup[x];
+ sim_pres_tissue[x+16] = sim_pres_tissue_backup[x+16];
+ }
+} // restore_sim
+
+// ------------------
+// calc_ascenttime //
+// ------------------
+
+void calc_ascenttime(void)
+{
+if (pres_respiration > pres_surface)
+ {
+ switch (char_O_deco_status)
+ {
+ case 2:
+ char_O_ascenttime = 255;
+ break;
+ case 1:
+ break;
+ default:
+ temp1 = pres_respiration - pres_surface + 0.6; // + 0.6 hence 1 minute ascent time from a depth of 4 meter on
+ if (temp1 < 0)
+ temp1 = 0;
+ if (temp1 > 255)
+ temp1 = 255;
+ char_O_ascenttime = (char)temp1;
+
+ for(ci=0;ci<7;ci++)
+ {
+ x = char_O_ascenttime + char_O_array_decotime[ci];
+ if (x < char_O_ascenttime)
+ char_O_ascenttime = 255;
+ else
+ char_O_ascenttime = x;
+ }
+ }
+ }
+else
+ char_O_ascenttime = 0;
+} // calc_ascenttime()
+
+
+// ---------------------
+// update_startvalues //
+// ---------------------
+// updated in v.102
+
+void update_startvalues(void)
+{
+ temp_pres_gtissue_limit = pres_gtissue_limit;
+ temp_pres_gtissue = pres_tissue[char_O_gtissue_no] + pres_tissue[char_O_gtissue_no+16];
+ temp_pres_gtissue_diff = temp_pres_gtissue_limit - temp_pres_gtissue; // negative number
+ temp_pres_gtissue_limit_GF_low = GF_low * temp_pres_gtissue_diff + temp_pres_gtissue;
+ temp_pres_gtissue_limit_GF_low_below_surface = temp_pres_gtissue_limit_GF_low - pres_surface;
+ if (temp_pres_gtissue_limit_GF_low_below_surface < 0)
+ temp_pres_gtissue_limit_GF_low_below_surface = 0;
+
+ temp_gtissue_no = char_O_gtissue_no;
+ for (x = 0;x<16;x++)
+ {
+ sim_pres_tissue[x] = pres_tissue[x];
+ sim_pres_tissue[x+16] = pres_tissue[x+16];
+ sim_pres_tissue_limit[x] = pres_tissue_limit[x];
+ }
+} // update_startvalues
+
+
+// ------------------
+// sim_tissue_1min //
+// ------------------
+// optimized in v.101
+
+void sim_tissue_1min(void)
+{
+temp_pres_gtissue_limit = 0.0;
+temp_gtissue_no = 255;
+
+_asm
+lfsr 1, 0x300
+movlw 0x01
+movwf TBLPTRU,0
+_endasm
+
+
+for (ci=0;ci<16;ci++)
+{
+_asm
+movlw 0x02
+movwf TBLPTRH,0
+movlb 4 // fuer ci
+movf ci,0,1
+addwf ci,0,1
+addwf ci,0,1
+addwf ci,0,1
+addlw 0x80
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var_a+1
+TBLRDPOSTINC
+movff TABLAT,var_a
+TBLRDPOSTINC
+movff TABLAT,var_a+3
+TBLRD
+movff TABLAT,var_a+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var2_a+1
+TBLRDPOSTINC
+movff TABLAT,var2_a
+TBLRDPOSTINC
+movff TABLAT,var2_a+3
+TBLRD
+movff TABLAT,var2_a+2
+addlw 0x40
+movwf TBLPTRL,0
+incf TBLPTRH,1,0
+TBLRDPOSTINC
+movff TABLAT,var_b+1
+TBLRDPOSTINC
+movff TABLAT,var_b
+TBLRDPOSTINC
+movff TABLAT,var_b+3
+TBLRD
+movff TABLAT,var_b+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var2_b+1
+TBLRDPOSTINC
+movff TABLAT,var2_b
+TBLRDPOSTINC
+movff TABLAT,var2_b+3
+TBLRD
+movff TABLAT,var2_b+2
+addlw 0xC0
+movwf TBLPTRL,0
+incf TBLPTRH,1,0
+TBLRDPOSTINC
+movff TABLAT,var_e1min+1
+TBLRDPOSTINC
+movff TABLAT,var_e1min
+TBLRDPOSTINC
+movff TABLAT,var_e1min+3
+TBLRD
+movff TABLAT,var_e1min+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var2_e1min+1
+TBLRDPOSTINC
+movff TABLAT,var2_e1min
+TBLRDPOSTINC
+movff TABLAT,var2_e1min+3
+TBLRD
+movff TABLAT,var2_e1min+2
+_endasm
+// N2
+ temp_tissue = (temp_atem - sim_pres_tissue[ci]) * var_e1min;
+ temp_tissue_safety();
+ sim_pres_tissue[ci] = sim_pres_tissue[ci] + temp_tissue;
+// He
+ temp_tissue = (temp2_atem - sim_pres_tissue[ci+16]) * var2_e1min;
+ temp_tissue_safety();
+ sim_pres_tissue[ci+16] = sim_pres_tissue[ci+16] + temp_tissue;
+// pressure limit
+ temp_tissue = sim_pres_tissue[ci] + sim_pres_tissue[ci+16];
+ var_a = (var_a * sim_pres_tissue[ci] + var2_a * sim_pres_tissue[ci+16]) / temp_tissue;
+ var_b = (var_b * sim_pres_tissue[ci] + var2_b * sim_pres_tissue[ci+16]) / temp_tissue;
+ sim_pres_tissue_limit[ci] = (temp_tissue - var_a) * var_b;
+
+ if (sim_pres_tissue_limit[ci] < 0)
+ sim_pres_tissue_limit[ci] = 0;
+ if (sim_pres_tissue_limit[ci] > temp_pres_gtissue_limit)
+ {
+ temp_pres_gtissue = temp_tissue;
+ temp_pres_gtissue_limit = sim_pres_tissue_limit[ci];
+ temp_gtissue_no = ci;
+ }
+} // for
+ temp_pres_gtissue_diff = temp_pres_gtissue_limit - temp_pres_gtissue;
+ temp_pres_gtissue_limit_GF_low = GF_low * temp_pres_gtissue_diff + temp_pres_gtissue;
+ temp_pres_gtissue_limit_GF_low_below_surface = temp_pres_gtissue_limit_GF_low - pres_surface;
+ if (temp_pres_gtissue_limit_GF_low_below_surface < 0)
+ temp_pres_gtissue_limit_GF_low_below_surface = 0;
+} //sim_tissue_1min()
+
+//--------------------
+// sim_tissue_10min //
+//--------------------
+
+// Attention!! uses var_e1min und var2_e1min to load 10min data !!!
+// is identical to sim_tissue_1min routine except for the different load of those variables
+
+// optimized in v.101
+
+void sim_tissue_10min(void)
+{
+temp_pres_gtissue_limit = 0.0;
+temp_gtissue_no = 255;
+
+_asm
+lfsr 1, 0x300
+movlw 0x01
+movwf TBLPTRU,0
+_endasm
+
+for (ci=0;ci<16;ci++)
+{
+_asm
+movlw 0x02
+movwf TBLPTRH,0
+movlb 4 // fuer ci
+movf ci,0,1
+addwf ci,0,1
+addwf ci,0,1
+addwf ci,0,1
+addlw 0x80
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var_a+1
+TBLRDPOSTINC
+movff TABLAT,var_a
+TBLRDPOSTINC
+movff TABLAT,var_a+3
+TBLRD
+movff TABLAT,var_a+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var2_a+1
+TBLRDPOSTINC
+movff TABLAT,var2_a
+TBLRDPOSTINC
+movff TABLAT,var2_a+3
+TBLRD
+movff TABLAT,var2_a+2
+addlw 0x40
+movwf TBLPTRL,0
+incf TBLPTRH,1,0
+TBLRDPOSTINC
+movff TABLAT,var_b+1
+TBLRDPOSTINC
+movff TABLAT,var_b
+TBLRDPOSTINC
+movff TABLAT,var_b+3
+TBLRD
+movff TABLAT,var_b+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var2_b+1
+TBLRDPOSTINC
+movff TABLAT,var2_b
+TBLRDPOSTINC
+movff TABLAT,var2_b+3
+TBLRD
+movff TABLAT,var2_b+2
+addlw 0xC0 // different to 1 min
+movwf TBLPTRL,0
+incf TBLPTRH,1,0
+incf TBLPTRH,1,0 // different to 1 min
+TBLRDPOSTINC
+movff TABLAT,var_e1min+1
+TBLRDPOSTINC
+movff TABLAT,var_e1min
+TBLRDPOSTINC
+movff TABLAT,var_e1min+3
+TBLRD
+movff TABLAT,var_e1min+2
+addlw 0x40
+movwf TBLPTRL,0
+//incf TBLPTRH,1,0 // different to 1 min
+TBLRDPOSTINC
+movff TABLAT,var2_e1min+1
+TBLRDPOSTINC
+movff TABLAT,var2_e1min
+TBLRDPOSTINC
+movff TABLAT,var2_e1min+3
+TBLRD
+movff TABLAT,var2_e1min+2
+_endasm
+// N2
+ temp_tissue = (temp_atem - sim_pres_tissue[ci]) * var_e1min;
+ temp_tissue_safety();
+ sim_pres_tissue[ci] = sim_pres_tissue[ci] + temp_tissue;
+// He
+ temp_tissue = (temp2_atem - sim_pres_tissue[ci+16]) * var2_e1min;
+ temp_tissue_safety();
+ sim_pres_tissue[ci+16] = sim_pres_tissue[ci+16] + temp_tissue;
+// pressure limit
+temp_tissue = sim_pres_tissue[ci] + sim_pres_tissue[ci+16];
+ var_a = (var_a * sim_pres_tissue[ci] + var2_a * sim_pres_tissue[ci+16]) / temp_tissue;
+ var_b = (var_b * sim_pres_tissue[ci] + var2_b * sim_pres_tissue[ci+16]) / temp_tissue;
+
+sim_pres_tissue_limit[ci] = (temp_tissue - var_a) * var_b;
+ if (sim_pres_tissue_limit[ci] < 0)
+ sim_pres_tissue_limit[ci] = 0;
+ if (sim_pres_tissue_limit[ci] > temp_pres_gtissue_limit)
+ {
+ temp_pres_gtissue = temp_tissue;
+ temp_pres_gtissue_limit = sim_pres_tissue_limit[ci];
+ temp_gtissue_no = ci;
+ }
+} // for
+ temp_pres_gtissue_diff = temp_pres_gtissue_limit - temp_pres_gtissue; // negative number
+ temp_pres_gtissue_limit_GF_low = GF_low * temp_pres_gtissue_diff + temp_pres_gtissue;
+ temp_pres_gtissue_limit_GF_low_below_surface = temp_pres_gtissue_limit_GF_low - pres_surface;
+ if (temp_pres_gtissue_limit_GF_low_below_surface < 0)
+ temp_pres_gtissue_limit_GF_low_below_surface = 0;
+} //sim_tissue_10min()
+
+
+// ------------------
+// clear_decoarray //
+// ------------------
+// unchanged in v.101
+
+void clear_decoarray(void)
+{
+char_O_array_decodepth[0] = 0;
+char_O_array_decodepth[1] = 0;
+char_O_array_decodepth[2] = 0;
+char_O_array_decodepth[3] = 0;
+char_O_array_decodepth[4] = 0;
+char_O_array_decodepth[5] = 0;
+char_O_array_decotime[0] = 0;
+char_O_array_decotime[1] = 0;
+char_O_array_decotime[2] = 0;
+char_O_array_decotime[3] = 0;
+char_O_array_decotime[4] = 0;
+char_O_array_decotime[5] = 0;
+char_O_array_decotime[6] = 0;
+} // clear_decoarray
+
+
+// -------------------
+// update_decoarray //
+// -------------------
+// unchanged in v.101
+
+void update_decoarray()
+{
+ x = 0;
+ do
+ {
+ if (char_O_array_decodepth[x] == temp_depth_limit)
+ {
+ int_temp = char_O_array_decotime[x] + temp_decotime;
+ if (int_temp < 0)
+ int_temp = 0;
+ if (int_temp > 240)
+ int_temp = 240;
+ char_O_array_decotime[x] = int_temp;
+ x = 10; // exit
+ } // if
+ else
+ {
+ if (char_O_array_decodepth[x] == 0)
+ {
+ if (temp_depth_limit > 255)
+ char_O_array_decodepth[x] = 255;
+ else
+ char_O_array_decodepth[x] = (char)temp_depth_limit;
+ int_temp = char_O_array_decotime[x] + temp_decotime;
+ if (int_temp > 240)
+ char_O_array_decotime[x] = 240;
+ else
+ char_O_array_decotime[x] = (char)int_temp;
+ x = 10; // exit
+ } // if
+ else
+ x++;
+ } // else
+ } while (x<6);
+ if (x == 6)
+ {
+ int_temp = char_O_array_decotime[6] + temp_decotime;
+ if (int_temp > 220)
+ char_O_array_decotime[6] = 220;
+ else
+ char_O_array_decotime[6] = (char)int_temp;
+ } // if x == 6
+} // update_decoarray
+
+
+// -----------------------
+// calc_gradient_factor //
+// -----------------------
+// optimized in v.101 (var_a)
+// new code in v.102
+
+void calc_gradient_factor(void)
+{
+ // tissue > respiration (entsaettigungsvorgang)
+ // gradient ist wieviel prozent an limit mit basis tissue
+ // dh. 0% = respiration == tissue
+ // dh. 100% = respiration == limit
+ temp_tissue = pres_tissue[char_O_gtissue_no] + pres_tissue[char_O_gtissue_no+16];
+ temp1 = temp_tissue - pres_respiration;
+ temp2 = temp_tissue - pres_tissue_limit[char_O_gtissue_no]; // changed in v.102
+ temp2 = temp1/temp2;
+ temp2 = temp2 * 100; // displayed in percent
+ if (temp2 < 0)
+ temp2 = 0;
+ if (temp2 > 255)
+ temp2 = 255;
+ if (temp1 < 0)
+ char_O_gradient_factor = 0;
+ else
+ char_O_gradient_factor = (char)temp2;
+
+ temp3 = temp2;
+
+ if (char_I_deco_model == 1) // calculate relative gradient factor
+ {
+ temp1 = (float)temp_depth_GF_low_meter * 0.09995;
+ temp2 = pres_respiration - pres_surface;
+ if (temp2 <= 0)
+ temp1 = GF_high;
+ else
+ if (temp2 >= temp1)
+ temp1 = GF_low;
+ else
+ temp1 = GF_low + (temp1 - temp2)/temp1*GF_delta;
+ if (temp_depth_GF_low_meter == 0)
+ temp1 = GF_high;
+ temp2 = temp3 / temp1; // temp3 is already in percent
+ if (temp2 < 0)
+ temp2 = 0;
+ if (temp2 > 255)
+ temp2 = 255;
+ char_O_relative_gradient_GF = (char)temp2;
+ } // calc relative gradient factor
+ else
+ {
+ char_O_relative_gradient_GF = char_O_gradient_factor;
+ }
+} // calc_gradient
+
+// ---------------------------
+// calc_gradient_array_only //
+// ---------------------------
+// optimized in v.101 (var_a)
+// new code in v.102
+
+void calc_gradient_array_only()
+{
+ pres_respiration = (float)int_I_pres_respiration / 1000.0; // assembler code uses different digit system
+for (ci=0;ci<16;ci++)
+{
+ temp_tissue = pres_tissue[ci] + pres_tissue[ci+16];
+ temp1 = temp_tissue - pres_respiration;
+ temp2 = temp_tissue - pres_tissue_limit[ci];
+ temp2 = temp1/temp2;
+ temp2 = temp2 * 200; // because of output in (Double-)percentage
+ if (temp2 < 0)
+ temp2 = 0;
+ if (temp2 > 255)
+ temp2 = 255;
+ if (temp1 < 0)
+ char_O_array_gradient_weighted[ci] = 0;
+ else
+ char_O_array_gradient_weighted[ci] = (char)temp2;
+} // for
+} // calc_gradient_array_only
+
+
+// -------------------------
+// calc_desaturation_time //
+// -------------------------
+// FIXED N2_ratio
+// unchanged in v.101
+
+void calc_desaturation_time(void)
+{
+_asm
+lfsr 1, 0x300
+movlw 0x01
+movwf TBLPTRU,0
+_endasm
+ N2_ratio = 0.7902; // FIXED sum as stated in b"uhlmann
+ pres_surface = (float)int_I_pres_surface / 1000.0;
+ temp_atem = N2_ratio * (pres_surface - 0.0627);
+ int_O_desaturation_time = 0;
+ float_desaturation_multiplier = char_I_desaturation_multiplier / 142.0; // new in v.101 (70,42%/100.=142)
+
+for (ci=0;ci<16;ci++)
+{
+_asm
+movlw 0x04
+movwf TBLPTRH,0
+movlb 4 // fuer ci
+movf ci,0,1
+addwf ci,0,1
+addwf ci,0,1
+addwf ci,0,1
+addlw 0x80
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var_halftimes+1
+TBLRDPOSTINC
+movff TABLAT,var_halftimes
+TBLRDPOSTINC
+movff TABLAT,var_halftimes+3
+TBLRD
+movff TABLAT,var_halftimes+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var2_halftimes+1
+TBLRDPOSTINC
+movff TABLAT,var2_halftimes
+TBLRDPOSTINC
+movff TABLAT,var2_halftimes+3
+TBLRD
+movff TABLAT,var2_halftimes+2
+_endasm
+
+// saturation_time (for flight) and N2_saturation in multiples of halftime
+// version v.100: 1.1 = 10 percent distance to totally clean (totally clean is not possible, would take infinite time )
+// new in version v.101: 1.07 = 7 percent distance to totally clean (totally clean is not possible, would take infinite time )
+// changes in v.101: 1.05 = 5 percent dist to totally clean is new desaturation point for display and noFly calculations
+// N2
+ temp1 = 1.05 * temp_atem;
+ temp1 = temp1 - pres_tissue[ci];
+ temp2 = temp_atem - pres_tissue[ci];
+ if (temp2 >= 0.0)
+ {
+ temp1 = 0;
+ temp2 = 0;
+ }
+ else
+ temp1 = temp1 / temp2;
+ if (temp1 > 0.0)
+ {
+ temp1 = log(1.0 - temp1);
+ temp1 = temp1 / -0.6931; // temp1 is the multiples of half times necessary.
+ // 0.6931 is ln(2), because the math function log() calculates with a base of e not 2 as requested.
+ // minus because log is negative
+ temp2 = var_halftimes * temp1 / float_desaturation_multiplier; // time necessary (in minutes ) for complete desaturation (see comment about 10 percent) , new in v.101: float_desaturation_multiplier
+ }
+ else
+ {
+ temp1 = 0;
+ temp2 = 0;
+ }
+
+// He
+ temp3 = 0.1 - pres_tissue[ci+16];
+if (temp3 >= 0.0)
+ {
+ temp3 = 0;
+ temp4 = 0;
+ }
+ else
+ temp3 = -1.0 * temp3 / pres_tissue[ci+16];
+ if (temp3 > 0.0)
+ {
+ temp3 = log(1.0 - temp3);
+ temp3 = temp3 / -0.6931; // temp1 is the multiples of half times necessary.
+ // 0.6931 is ln(2), because the math function log() calculates with a base of e not 2 as requested.
+ // minus because log is negative
+ temp4 = var2_halftimes * temp3 / float_desaturation_multiplier; // time necessary (in minutes ) for "complete" desaturation, new in v.101 float_desaturation_multiplier
+ }
+ else
+ {
+ temp3 = 0;
+ temp4 = 0;
+ }
+
+// saturation_time (for flight)
+ if (temp4 > temp2)
+ int_temp = (int)temp4;
+ else
+ int_temp = (int)temp2;
+ if(int_temp > int_O_desaturation_time)
+ int_O_desaturation_time = int_temp;
+
+// N2 saturation in multiples of halftime for display purposes
+ temp2 = temp1 * 20.0; // 0 = 1/8, 120 = 0, 249 = 8
+ temp2 = temp2 + 80.0; // set center
+ if (temp2 < 0.0)
+ temp2 = 0.0;
+ if (temp2 > 255.0)
+ temp2 = 255.0;
+ char_O_tissue_saturation[ci] = (char)temp2;
+// He saturation in multiples of halftime for display purposes
+ temp4 = temp3 * 20.0; // 0 = 1/8, 120 = 0, 249 = 8
+ temp4 = temp4 + 80.0; // set center
+ if (temp4 < 0.0)
+ temp4 = 0.0;
+ if (temp4 > 255.0)
+ temp4 = 255.0;
+ char_O_tissue_saturation[ci+16] = (char)temp4;
+} // for
+} // calc_desaturation_time
+
+
+// --------------------------
+// calc_wo_deco_step_1_min //
+// --------------------------
+// FIXED N2 Ratio
+// optimized in v.101 (...saturation_multiplier)
+// desaturation slowed down to 70,42%
+
+void calc_wo_deco_step_1_min(void)
+{
+_asm
+ lfsr 1, 0x300
+_endasm
+ N2_ratio = 0.7902; // FIXED, sum lt. buehlmann
+ pres_respiration = (float)int_I_pres_respiration / 1000.0; // assembler code uses different digit system
+ pres_surface = (float)int_I_pres_surface / 1000.0;
+ temp_atem = N2_ratio * (pres_respiration - 0.0627); // 0.0627 is the extra pressure in the body
+ temp2_atem = 0.0;
+ temp_surface = pres_surface; // the b"uhlmann formula using temp_surface does not use the N2_ratio
+ float_desaturation_multiplier = char_I_desaturation_multiplier / 142.0; // new in v.101 (70,42%/100.=142)
+ float_saturation_multiplier = char_I_saturation_multiplier / 100.0;
+
+ calc_tissue_step_1_min(); // update the pressure in the 16 tissues in accordance with the new ambient pressure
+ clear_decoarray();
+ char_O_deco_status = 0;
+ char_O_nullzeit = 0;
+ char_O_ascenttime = 0;
+ calc_gradient_factor();
+
+} // calc_wo_deco_step_1_min(void)
+
+
+// -------------------------
+// calc_tissue_step_1_min //
+// -------------------------
+// optimized in v.101
+
+void calc_tissue_step_1_min(void)
+{
+_asm
+lfsr 1, 0x300
+movlw 0x01
+movwf TBLPTRU,0
+_endasm
+
+ char_O_gtissue_no = 255;
+ pres_gtissue_limit = 0.0;
+
+for (ci=0;ci<16;ci++)
+{
+_asm
+movlw 0x02
+movwf TBLPTRH,0
+movlb 4 // fuer ci
+movf ci,0,1
+addwf ci,0,1
+addwf ci,0,1
+addwf ci,0,1
+addlw 0x80
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var_a+1
+TBLRDPOSTINC
+movff TABLAT,var_a
+TBLRDPOSTINC
+movff TABLAT,var_a+3
+TBLRD
+movff TABLAT,var_a+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var2_a+1
+TBLRDPOSTINC
+movff TABLAT,var2_a
+TBLRDPOSTINC
+movff TABLAT,var2_a+3
+TBLRD
+movff TABLAT,var2_a+2
+addlw 0x40
+movwf TBLPTRL,0
+incf TBLPTRH,1,0
+TBLRDPOSTINC
+movff TABLAT,var_b+1
+TBLRDPOSTINC
+movff TABLAT,var_b
+TBLRDPOSTINC
+movff TABLAT,var_b+3
+TBLRD
+movff TABLAT,var_b+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var2_b+1
+TBLRDPOSTINC
+movff TABLAT,var2_b
+TBLRDPOSTINC
+movff TABLAT,var2_b+3
+TBLRD
+movff TABLAT,var2_b+2
+addlw 0xC0
+movwf TBLPTRL,0
+incf TBLPTRH,1,0
+TBLRDPOSTINC
+movff TABLAT,var_e1min+1
+TBLRDPOSTINC
+movff TABLAT,var_e1min
+TBLRDPOSTINC
+movff TABLAT,var_e1min+3
+TBLRD
+movff TABLAT,var_e1min+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var2_e1min+1
+TBLRDPOSTINC
+movff TABLAT,var2_e1min
+TBLRDPOSTINC
+movff TABLAT,var2_e1min+3
+TBLRD
+movff TABLAT,var2_e1min+2
+_endasm
+
+// N2 1 min
+ temp_tissue = (temp_atem - pres_tissue[ci]) * var_e1min;
+ temp_tissue_safety();
+ pres_tissue[ci] = pres_tissue[ci] + temp_tissue;
+
+// He 1 min
+ temp_tissue = (temp2_atem - pres_tissue[ci+16]) * var2_e1min;
+ temp_tissue_safety();
+ pres_tissue[ci+16] = pres_tissue[ci+16] + temp_tissue;
+
+ temp_tissue = pres_tissue[ci] + pres_tissue[ci+16];
+ var_a = (var_a * pres_tissue[ci] + var2_a * pres_tissue[ci+16]) / temp_tissue;
+ var_b = (var_b * pres_tissue[ci] + var2_b * pres_tissue[ci+16]) / temp_tissue;
+ pres_tissue_limit[ci] = (temp_tissue - var_a) * var_b;
+ if (pres_tissue_limit[ci] < 0)
+ pres_tissue_limit[ci] = 0;
+ if (pres_tissue_limit[ci] > pres_gtissue_limit)
+ {
+ pres_gtissue_limit = pres_tissue_limit[ci];
+ char_O_gtissue_no = ci;
+ }//if
+
+// gradient factor array for graphical display
+// display range is 0 to 250! in steps of 5 for 1 pixel
+// the display is divided in 6 blocks
+// -> double the gradient 100% = 200
+// tissue > respiration (entsaettigungsvorgang)
+// gradient ist wieviel prozent an limit von tissue aus
+// dh. 0% = respiration == tissue
+// dh. 100% = respiration == limit
+temp1 = temp_tissue - pres_respiration;
+temp2 = temp_tissue - pres_tissue_limit[ci]; // changed in v.102
+temp2 = temp1/temp2;
+temp2 = temp2 * 200; // because of output in (Double-)percentage
+if (temp2 < 0)
+ temp2 = 0;
+if (temp2 > 255)
+ temp2 = 255;
+if (temp1 < 0)
+ char_O_array_gradient_weighted[ci] = 0;
+else
+ char_O_array_gradient_weighted[ci] = (char)temp2;
+
+} // for
+} // calc wo deco 1min
+
+#if 0
+// --------
+// debug //
+// --------
+void debug(void)
+{
+for (ci=0;ci<32;ci++)
+{
+ int_O_tissue_for_debug[ci] = (unsigned int)(pres_tissue[ci] *1000);
+}
+} // void debug(void)
+#endif
+
+// ----------
+// md hash //
+// ----------
+void hash(void)
+{
+// init
+ for (md_i=0;md_i<16;md_i++)
+ {
+ md_state[md_i] = 0;
+ md_cksum[md_i] = 0;
+ } // for md_i 16
+
+_asm
+ movlw 0x01
+ movwf TBLPTRU,0
+ movlw 0x06
+ movwf TBLPTRH,0
+ movlw 0x00
+ movwf TBLPTRL,0
+_endasm
+ for (md_i=0;md_i<127;md_i++)
+ {
+_asm
+ TBLRDPOSTINC
+ movff TABLAT,md_temp
+_endasm
+ md_pi_subst[md_i] = md_temp;
+ } // for md_i 256
+_asm
+ TBLRDPOSTINC
+ movff TABLAT,md_temp
+_endasm
+ md_pi_subst[127] = md_temp;
+ for (md_i=0;md_i<127;md_i++)
+ {
+_asm
+ TBLRDPOSTINC
+ movff TABLAT,md_temp
+_endasm
+ md_pi_subst[md_i+128] = md_temp;
+ } // for md_i 256
+_asm
+ TBLRD
+ movff TABLAT,md_temp
+_endasm
+ md_pi_subst[255] = md_temp;
+
+_asm
+ movlw 0x00
+ movwf TBLPTRU,0
+ movlw 0x00
+ movwf TBLPTRH,0
+ movlw 0x00
+ movwf TBLPTRL,0
+_endasm
+// cycle buffers
+for (md_pointer=0x0000;md_pointer<0x17f3;md_pointer++)
+{
+ md_t = 0;
+ for (md_i=0;md_i<16;md_i++)
+ {
+ if(md_pointer == 9)
+ md_temp = md_cksum[md_i];
+ else
+ {
+_asm
+ TBLRDPOSTINC
+ movff TABLAT,md_temp
+_endasm
+ } // else
+ md_buffer[md_i] = md_temp;
+ md_state[md_i+16] = md_buffer[md_i];
+ md_state[md_i+32] = (unsigned char)(md_buffer[md_i] ^ md_state[md_i]);
+ } // for md_i 16
+
+ for (md_i=0;md_i<18;md_i++)
+ {
+ for (md_j=0;md_j<48;md_j++)
+ {
+ md_state[md_j] = (unsigned char)(md_state[md_j] ^ md_pi_subst[md_t]);
+ md_t = md_state[md_j];
+ } // for md_j 48
+ md_t = (unsigned char)(md_t+1);
+ } // for md_i 18
+ md_t = md_cksum[15];
+
+ for (md_i=0;md_i<16;md_i++)
+ {
+ md_cksum[md_i] = (unsigned char)(md_cksum[md_i] ^ md_pi_subst[(md_buffer[md_i] ^ md_t)]);
+ md_t = md_cksum[md_i];
+ } // for md_i 16
+} // for md_pointer
+} // void hash(void)
+
+// ---------------------
+// clear_CNS_fraction //
+// ---------------------
+// new in v.101
+
+void clear_CNS_fraction(void)
+{
+ CNS_fraction = 0.0;
+ char_O_CNS_fraction = 0;
+} // void clear_CNS_fraction(void)
+
+
+// --------------------
+// calc_CNS_fraction //
+// --------------------
+// new in v.101
+// optimized in v.102 : with new variables char_I_actual_ppO2 and actual_ppO2
+
+// Input: char_I_actual_ppO2
+// Output: char_O_CNS_fraction
+// Uses and Updates: CNS_fraction
+// Uses: acutal_ppO2
+
+void calc_CNS_fraction(void)
+{
+ actual_ppO2 = (float)char_I_actual_ppO2 / 100.0;
+
+ if (char_I_actual_ppO2 < 50)
+ CNS_fraction = CNS_fraction;// no changes
+ else if (char_I_actual_ppO2 < 60)
+ CNS_fraction = 1/(-54000.0 * actual_ppO2 + 54000.0) + CNS_fraction;
+ else if (char_I_actual_ppO2 < 70)
+ CNS_fraction = 1/(-45000.0 * actual_ppO2 + 48600.0) + CNS_fraction;
+ else if (char_I_actual_ppO2 < 80)
+ CNS_fraction = 1/(-36000.0 * actual_ppO2 + 42300.0) + CNS_fraction;
+ else if (char_I_actual_ppO2 < 90)
+ CNS_fraction = 1/(-27000.0 * actual_ppO2 + 35100.0) + CNS_fraction;
+ else if (char_I_actual_ppO2 < 110)
+ CNS_fraction = 1/(-18000.0 * actual_ppO2 + 27000.0) + CNS_fraction;
+ else if (char_I_actual_ppO2 < 150)
+ CNS_fraction = 1/(-9000.0 * actual_ppO2 + 17100.0) + CNS_fraction;
+ else if (char_I_actual_ppO2 < 160)
+ CNS_fraction = 1/(-22500.0 * actual_ppO2 + 37350.0) + CNS_fraction;
+ else if (char_I_actual_ppO2 < 165)
+ CNS_fraction = 0.000755 + CNS_fraction; // Arieli et all.(2002): Modeling pulmonary and CNS O2 toxicity... Formula (A1) based on value for 1.55 and c=20
+ else if (char_I_actual_ppO2 < 170)
+ CNS_fraction = 0.00102 + CNS_fraction; // example calculation: Sqrt((1.7/1.55)^20)*0.000404
+ else if (char_I_actual_ppO2 < 175)
+ CNS_fraction = 0.00136 + CNS_fraction;
+ else if (char_I_actual_ppO2 < 180)
+ CNS_fraction = 0.00180 + CNS_fraction;
+ else if (char_I_actual_ppO2 < 185)
+ CNS_fraction = 0.00237 + CNS_fraction;
+ else if (char_I_actual_ppO2 < 190)
+ CNS_fraction = 0.00310 + CNS_fraction;
+ else if (char_I_actual_ppO2 < 195)
+ CNS_fraction = 0.00401 + CNS_fraction;
+ else if (char_I_actual_ppO2 < 200)
+ CNS_fraction = 0.00517 + CNS_fraction;
+ else if (char_I_actual_ppO2 < 230)
+ CNS_fraction = 0.0209 + CNS_fraction;
+ else
+ CNS_fraction = 0.0482 + CNS_fraction; // value for 2.5
+
+ if (CNS_fraction > 2.5)
+ CNS_fraction = 2.5;
+ if (CNS_fraction < 0.0)
+ CNS_fraction = 0.0;
+ char_O_CNS_fraction = (char)((CNS_fraction + 0.005)* 100.0);
+} // void calc_CNS_fraction(void)
+
+// --------------------------
+// calc_CNS_decrease_15min //
+// --------------------------
+// new in v.101
+
+// calculates the half time of 90 minutes in 6 steps of 15 min
+
+// Output: char_O_CNS_fraction
+// Uses and Updates: CNS_fraction
+
+void calc_CNS_decrease_15min(void)
+{
+ CNS_fraction = 0.890899 * CNS_fraction;
+ char_O_CNS_fraction = (char)((CNS_fraction + 0.005)* 100.0);
+}// calc_CNS_decrease_15min(void)
+
+
+// ------------------
+// calc_percentage //
+// ------------------
+// new in v.101
+
+// calculates int_I_temp * char_I_temp / 100
+// output is int_I_temp
+
+void calc_percentage(void)
+{
+ temp1 = (float)int_I_temp;
+ temp2 = (float)char_I_temp / 100.0;
+ temp3 = temp1 * temp2;
+ int_I_temp = (int)temp3;
+}
+void push_tissues_to_vault(void)
+{
+ for (ci=0;ci<32;ci++)
+ pres_tissue_vault[ci] = pres_tissue[ci];
+}
+void pull_tissues_from_vault(void)
+{
+ for (ci=0;ci<32;ci++)
+ pres_tissue[ci] = pres_tissue_vault[ci];
+}
diff -r 000000000000 -r 96a35aeda5f2 code_part1/OSTC_code_c_part2/old/p2_deco_main_old_v108_pre OSTC2.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/code_part1/OSTC_code_c_part2/old/p2_deco_main_old_v108_pre OSTC2.c Tue Jan 12 15:05:59 2010 +0100
@@ -0,0 +1,3753 @@
+/*
+ * p2_deco_main_c_v108.c
+ *
+ * Created on: 12.05.2009
+ * Author: chsw
+ *
+ * Changes: debug / plausibiliy output
+ */
+
+//#include
+
+
+// OSTC - diving computer code
+// Copyright (C) 2008 HeinrichsWeikamp GbR
+
+// 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 3 of the License, or
+// (at your option) any later version.
+
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// 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, see .
+
+
+// *****************************
+// ** I N T R O D U C T I O N **
+// *****************************
+//
+// OSTC
+//
+// code:
+// p2_deco_main_c_v101.c
+// part2 of the OSTC code
+// code with constant O2 partial pressure routines
+// under construction !!
+//
+// summary:
+// decompression routines
+// for the OSTC experimental project
+// written by Christian Weikamp
+// last revision __________
+// comments added _________
+//
+// additional files:
+// p2_tables_v100.romdata (other files)
+// 18f4685_ostc_v100.lkr (linker script)
+//
+// history:
+// 01/03/08 v100: first release candidate
+// 03/13/08 v101: start of programming ppO2 code
+// 03/13/25 v101a: backup of interrim version with ppO2 calculation
+// 03/13/25 v101: open circuit gas change during deco
+// 03/13/25 v101: CNS_fraction calculation
+// 03/13/26 v101: optimization of tissue calc routines
+// 07/xx/08 v102a: debug of bottom time routine
+// 09/xx/08 v102d: Gradient Factor Model implemenation
+// 10/10/08 v104: renamed to build v103 for v118 stable
+// 10/14/08 v104: integration of temp_depth_last_deco for Gradient Model
+// 03/31/090 v107: integration of FONT Incon24
+
+//
+// literature:
+// B"uhlmann, Albert: Tauchmedizin; 4. Auflage;
+// Schr"oder, Kai & Reith, Steffen; 2000; S"attigungsvorg"ange beim Tauchen, das Modell ZH-L16, Funktionsweise von Tauchcomputern; http://www.achim-und-kai.de/kai/tausim/saett_faq
+// Morrison, Stuart; 2000; DIY DECOMPRESSION; http://www.lizardland.co.uk/DIYDeco.html
+// Balthasar, Steffen; Dekompressionstheorie I: Neo Haldane Modelle; http://www.txfreak.de/dekompressionstheorie_1.pdf
+// Baker, Erik C.; Clearing Up The Confusion About "Deep Stops"
+// Baker, Erik C.; Understanding M-values; http://www.txfreak.de/understanding_m-values.pdf
+
+
+// *********************
+// ** I N C L U D E S **
+// *********************
+ #include
+ #include
+
+// ********************************
+// ** C O N F I G U R A T I O N **
+// ** for simulation without asm **
+// ********************************
+ #pragma config OSC = IRCIO67
+ #pragma config FCMEN = OFF
+ #pragma config IESO = OFF
+ #pragma config PWRT = ON
+ #pragma config BOREN = OFF
+ #pragma config WDT = OFF
+ #pragma config WDTPS = 128
+ #pragma config MCLRE = ON
+ #pragma config LPT1OSC = OFF
+ #pragma config PBADEN = OFF
+ #pragma config DEBUG = OFF
+ #pragma config XINST = OFF
+ #pragma config LVP = OFF
+ #pragma config STVREN = OFF
+
+// ****************************
+// ** D E F I N E S **
+// ** missing in p18f4685.h **
+// ****************************
+#define INT0IF 1
+#define INT1IF 0
+#define TMR1IF 0
+
+#define oled_clk PORTD, 0,0
+#define oled_data PORTD, 1,0
+#define oled_en PORTE, 0,0
+#define oled_rs PORTE, 1,0
+#define flag5 0x29 // in Bank1
+//#define no_sensor_int flag5,7,1 // ; block any further access to pressure sensor
+
+# define DBG_c_gas 0b0000000000000001
+# define DBG_c_ppO2 0b0000000000000010
+# define DBG_RUN 0b0000000000000100
+# define DBG_RESTART 0b0000000000001000
+
+# define DBG_CdeSAT 0b0000000000010000
+# define DBG_C_MODE 0b0000000000100000
+# define DBG_C_SURF 0b0000000001000000
+# define DBG_HEwoHE 0b0000000010000000
+
+# define DBG_C_DPPO2 0b0000000100000000
+# define DBG_C_DGAS 0b0000001000000000
+# define DBG_C_DIST 0b0000010000000000
+# define DBG_C_LAST 0b0000100000000000
+
+# define DBG_C_GF 0b0001000000000000
+# define DBG_ZH16ERR 0b0010000000000000
+# define DBG_PHIGH 0b0100000000000000
+# define DBG_PLOW 0b1000000000000000
+
+
+# define DBS_mode 0b0000000000000001
+# define DBS_ppO2 0b0000000000000010
+# define DBS_HE_sat 0b0000000000000100
+# define DBS_ppO2chg 0b0000000000001000
+
+# define DBS_SAT2l 0b0000000000010000
+# define DBS_SAT2h 0b0000000000100000
+# define DBS_GFLOW2l 0b0000000001000000
+# define DBS_GFLOW2h 0b0000000010000000
+
+# define DBS_GFHGH2l 0b0000000100000000
+# define DBS_GFHGH2h 0b0000001000000000
+# define DBS_GASO22l 0b0000010000000000
+# define DBS_GASO22h 0b0000100000000000
+
+# define DBS_DIST2h 0b0001000000000000
+# define DBS_LAST2h 0b0010000000000000
+# define DBS_DECOO2l 0b0100000000000000
+# define DBS_DECOO2h 0b1000000000000000
+
+
+# define DBS2_PRES2h 0b0000000000000001
+# define DBS2_PRES2l 0b0000000000000010
+# define DBS2_SURF2l 0b0000000000000100
+# define DBS2_SURF2h 0b0000000000001000
+
+# define DBS2_DESAT2l 0b0000000000010000
+# define DBS2_DESAT2h 0b0000000000100000
+# define DBS2_GFDneg 0b0000000001000000
+# define DBS2_ 0b000000000000000
+
+# define DBS2_ 0b000000000000000
+# define DBS2_ 0b000000000000000
+# define DBS2_ 0b000000000000000
+# define DBS2_ 0b000000000000000
+
+// NDL_at_20mtr
+
+
+// ***********************
+// ** V A R I A B L E S **
+// ***********************
+// prefixes etc:
+// _O_ = output for use in the assembler code
+// _I_ = input from the assembler code for the c code
+// char_ and int_ = used to identify output and input size
+// var = variable (from b"uhlmann)
+// pres = pressure
+// gtissue = guiding tissue, the one limiting the ascent
+// e2secs = exp of the b"uhlmann formula precalculated for a 2 second step
+// e1min = same for 1 minute step
+// sim = used in simulating the ascent to the surface
+// nullzeit = remaining ground/bottom time for "no deco"
+// hauptroutine = main
+
+#pragma udata bank0a=0x060
+volatile unsigned char dd2_stringstore[17];
+#pragma udata bank0b=0x071
+volatile unsigned char keep_free_bank0[21];
+
+#pragma udata bank0c=0x086
+volatile unsigned char dd2_left; // 1 - 64
+volatile unsigned char dd2_top; // 1 - 64
+volatile unsigned char dd2_heightmax; // 1 - 37
+volatile unsigned char dd2_oled_brightness_offset; // 0 - 15 (15 is pitch black always)
+volatile unsigned char dd2_fontwidth; // 8, 12, 21 for Incon16, Incon24, Incon42
+volatile unsigned char dd2_fontheight; // 14, 21, 37 for "
+volatile unsigned long dd2_pointer; // for font lut
+volatile unsigned char dd2_i;
+volatile unsigned char dd2_j;
+volatile unsigned char dd2_k;
+volatile unsigned char dd2_char;
+volatile unsigned char dd2_lowbyte;
+volatile unsigned char dd2_temp;
+volatile unsigned char dd2_data;
+volatile unsigned long dd2_base; // for font lut
+volatile unsigned char dd2_start; // for font lut
+volatile unsigned char dd2_end; // for font lut
+
+
+ #pragma udata bank1=0x100
+ const unsigned char keep_free_bank1[256]; // used by the assembler code
+
+ #pragma udata bank2a=0x200
+// output:
+ static unsigned int int_O_tissue_for_debug[32];
+ static unsigned int int_O_GF_spare____; // 0x240
+ static unsigned int int_O_GF_step; // 0x242
+ static unsigned int int_O_gtissue_limit; // 0x244
+ static unsigned int int_O_gtissue_press; // 0x246
+ static unsigned int int_O_limit_GF_low; // 0x248
+ static unsigned int int_O_gtissue_press_at_GF_low; // 0x24A
+// ...
+ #pragma udata bank2b=0x24E
+ static unsigned char char_O_GF_low_pointer; // 0x24E
+ static unsigned char char_O_actual_pointer; // 0x24F
+ #pragma udata bank2c=0x250
+ static unsigned char char_O_deco_table[32]; // 0x250
+ #pragma udata bank2d=0x270
+ static unsigned char char_I_table_deco_done[32];
+ #pragma udata bank2e=0x290
+ static unsigned int int_O_calc_tissue_call_counter; // 0x290
+// internal:
+ unsigned char lock_GF_depth_list;
+ static float temp_limit;
+ static float GF_low;
+ static float GF_high;
+ static float GF_delta;
+ static float GF_temp;
+ static float GF_step;
+ static float GF_step2;
+ static float temp_pres_gtissue;
+ static float temp_pres_gtissue_diff;
+ static float temp_pres_gtissue_limit_GF_low;
+ static float temp_pres_gtissue_limit_GF_low_below_surface;
+ static unsigned int temp_depth_limit;
+ static unsigned char temp_decotime;
+ static unsigned char temp_gtissue_no;
+ static unsigned int temp_depth_last_deco; // new in v.101
+
+ static unsigned char temp_depth_GF_low_meter;
+ static unsigned char temp_depth_GF_low_number;
+ static unsigned char internal_deco_pointer;
+ static unsigned char internal_deco_table[32];
+ static float temp_pres_deco_GF_low;
+
+static unsigned int debug_temp;
+
+
+#pragma udata bank3a=0x300
+static char output[32];
+// used by the math routines
+#pragma udata bank3b=0x380
+volatile float pres_tissue_vault[32];
+ #pragma udata bank4a=0x400
+// internal:
+ unsigned char ci ; // don't move - used in _asm routines - if moved then modify movlb commands
+ unsigned char x;
+ unsigned int main_i;
+ unsigned int int_temp;
+ unsigned int int_temp_decostatus;
+ static float pres_respiration;
+ static float pres_surface;
+ static float temp1;
+ static float temp2;
+ static float temp3;
+ static float temp4;
+ static float temp_deco;
+ static float temp_atem;
+ static float temp2_atem;
+ static float temp_tissue;
+ static float temp_surface;
+ static float N2_ratio;
+ static float He_ratio;
+ static float temp_ratio;
+ static float var_a;
+ static float var2_a;
+ static float var_b;
+ static float var2_b;
+ static float var_t05nc;
+ static float var2_t05nc;
+ static float var_e2secs;
+ static float var2_e2secs;
+ static float var_e1min;
+ static float var2_e1min;
+ static float var_halftimes;
+ static float var2_halftimes;
+ static float pres_gtissue_limit;
+ static float temp_pres_gtissue_limit;
+ static float actual_ppO2; // new in v.102
+ #pragma udata bank4b=0x480
+ static float pres_tissue[32];
+
+ #pragma udata bank5=0x500
+// don't move positions in this bank, the registers are addressed directly from assembler code
+// input:
+ static unsigned int int_I_pres_respiration; // 0x500
+ static unsigned int int_I_pres_surface; // 0x502
+ static unsigned int int_I_temp; // 0x504 new in v101
+ static unsigned char char_I_temp; // 0x506 new in v101
+ static unsigned char char_I_actual_ppO2; // 0x507
+ static unsigned int int_I_spare_3;
+ static unsigned int int_I_spare_4;
+ static unsigned int int_I_spare_5;
+ static unsigned int int_I_spare_6;
+ static unsigned char char_I_N2_ratio; // 0x510
+ static unsigned char char_I_He_ratio; // 0x511
+ static unsigned char char_I_saturation_multiplier; // for conservatism/safety values 1.0 (no conservatism) to 1.5 (50% faster saturation
+ static unsigned char char_I_desaturation_multiplier; // for conservatism/safety values 0.66 (50% slower desaturation) to 1.0 (no conservatism)// consveratism used in calc_tissue(), calc_tissue_step_1_min() and sim_tissue_1min()
+ static unsigned char char_I_GF_High_percentage; // 0x514 new in v.102
+ static unsigned char char_I_GF_Low_percentage; // 0x515 new in v.102
+ static unsigned char char_I_spare; // 0x516
+ static unsigned char char_I_deco_distance; // 0x517
+ static unsigned char char_I_const_ppO2; // 0x518 new in v.101
+ static unsigned char char_I_deco_ppO2_change; // 0x519 new in v.101
+ static unsigned char char_I_deco_ppO2; // 0x51A new in v.101
+ static unsigned char char_I_deco_gas_change; // 0x51B new in v.101
+ static unsigned char char_I_deco_N2_ratio; // 0x51C new in v.101
+ static unsigned char char_I_deco_He_ratio; // 0x51D new in v.101
+ static unsigned char char_I_depth_last_deco; // 0x51E new in v.101 unit: [m]
+ static unsigned char char_I_deco_model; // 0x51F new in v.102 ( 1 = MultiGraF, sonst Std. mit (de-)saturation_multiplier)
+// output:
+ static unsigned int int_O_desaturation_time; // 0x520
+ static unsigned char char_O_nullzeit; // 0x522
+ static unsigned char char_O_deco_status; // 0x523
+ static unsigned char char_O_array_decotime[7]; // 0x524
+ static unsigned char char_O_array_decodepth[6]; // 0x52B
+ static unsigned char char_O_ascenttime; // 0x531
+ static unsigned char char_O_gradient_factor; // 0x532
+ static unsigned char char_O_tissue_saturation[32]; // 0x533
+ static unsigned char char_O_array_gradient_weighted[16]; // 0x553
+ static unsigned char char_O_gtissue_no; // 0x563
+ static unsigned char char_O_diluent; // 0x564 new in v.101
+ static unsigned char char_O_CNS_fraction; // 0x565 new in v.101
+ static unsigned char char_O_relative_gradient_GF; // 0x566 new in v.102
+
+// internal:
+ static float pres_tissue_limit[16];
+ static float sim_pres_tissue_limit[16];
+ static float pres_diluent; // new in v.101
+ static float deco_diluent; // new in v.101
+ static float const_ppO2; // new in v.101
+ static float deco_ppO2_change; // new in v.101
+ static float deco_ppO2; // new in v.101
+
+
+
+ #pragma udata bank6=0x600
+// internal:
+ static float sim_pres_tissue[32];
+ static float sim_pres_tissue_backup[32];
+
+ #pragma udata bank7=0x700
+ const unsigned char keep_free_bank7[256]; // used by the assembler code (DD font2display)
+
+ #pragma udata bank8=0x800
+ static char md_pi_subst[256];
+
+ #pragma udata bank9a=0x900
+// output:
+ static char md_state[48]; // DONT MOVE !! // has to be at the beginning of bank 9 for the asm code!!!
+ #pragma udata bank9b=0x930
+// output:
+ static unsigned int int_O_DBS_bitfield; // 0x930 new in v.108
+ static unsigned int int_O_DBS2_bitfield; // 0x932 new in v.108
+ static unsigned int int_O_DBG_pre_bitfield; // 0x934 new in v.108
+ static unsigned int int_O_DBG_post_bitfield; // 0x936 new in v.108
+ static char char_O_NDL_at_20mtr; // 0x938 new in v.108 // 0xFF == undefined, max. 254
+// internal:
+ static char md_t;
+ static char md_buffer[16];
+ static char md_cksum[16];
+ static char md_i;
+ static char md_j;
+ static char md_temp;
+ static unsigned int md_pointer;
+ static float deco_N2_ratio; // new in v.101
+ static float deco_He_ratio; // new in v.101
+ static float calc_N2_ratio; // new in v.101
+ static float calc_He_ratio; // new in v.101
+ static float deco_gas_change; // new in v.101
+ static float CNS_fraction; // new in v.101
+ static float float_saturation_multiplier; // new in v.101
+ static float float_desaturation_multiplier; // new in v.101
+ static float float_deco_distance; // new in v.101
+// internal, dbg:
+ static unsigned char DBG_char_I_deco_model; // new in v.108
+ static unsigned char DBG_char_I_depth_last_deco; // new in v.108
+ static float DBG_pres_surface; // new in v.108
+ static float DBG_GF_low; // new in v.108
+ static float DBG_GF_high; // new in v.108
+ static float DBG_const_ppO2; // new in v.108
+ static float DBG_deco_ppO2_change; // new in v.108
+ static float DBG_deco_ppO2; // new in v.108
+ static float DBG_deco_N2_ratio; // new in v.108
+ static float DBG_deco_He_ratio; // new in v.108
+ static float DBG_deco_gas_change; // new in v.108
+ static float DBG_float_saturation_multiplier; // new in v.108
+ static float DBG_float_desaturation_multiplier; // new in v.108
+ static float DBG_float_deco_distance; // new in v.108
+ static float DBG_deco_N2_ratio; // new in v.108
+ static float DBG_deco_He_ratio; // new in v.108
+ static float DBG_N2_ratio; // new in v.108
+ static float DBG_He_ratio; // new in v.108
+ static char flag_in_divemode; // new in v.108
+ static int int_dbg_i; // new in v.108
+ unsigned int temp_DBS;
+
+// *************************
+// ** P R O T O T Y P E S **
+// *************************
+void main_calc_hauptroutine(void);
+void main_calc_without_deco(void);
+void main_clear_tissue(void);
+void main_calc_percentage(void);
+void main_calc_wo_deco_step_1_min(void);
+void main_debug(void);
+void main_gradient_array(void);
+void main_hash(void);
+
+void calc_hauptroutine(void);
+void calc_tissue(void);
+void calc_nullzeit(void);
+void backup_sim_pres_tissue(void);
+void restore_sim_pres_tissue(void);
+
+void calc_without_deco(void);
+void clear_tissue(void);
+void calc_ascenttime(void);
+void update_startvalues(void);
+void clear_decoarray(void);
+void update_decoarray(void);
+void sim_tissue_1min(void);
+void sim_tissue_10min(void);
+void calc_gradient_factor(void);
+void calc_gradient_array_only(void);
+void calc_desaturation_time(void);
+void calc_wo_deco_step_1_min(void);
+void calc_tissue_step_1_min(void);
+//void debug(void);
+void hash(void);
+void clear_CNS_fraction(void);
+void calc_CNS_fraction(void);
+void calc_CNS_decrease_15min(void);
+void calc_percentage(void);
+void main(void);
+void calc_hauptroutine_data_input(void);
+void calc_hauptroutine_update_tissues(void);
+void calc_hauptroutine_calc_deco(void);
+void calc_hauptroutine_calc_ascend_to_deco(void);
+//void build_debug_output(void);
+void calc_nextdecodepth_GF(void);
+void copy_deco_table_GF(void);
+void clear_internal_deco_table_GF(void);
+void update_internal_deco_table_GF(void);
+void DD2_write(void);
+void DD2_write_incon42(void);
+void DD2_get_pointer_to_char(void);//dd2_char, &dd2_pointer);
+void DD2_set_column(void);//top, dd2_k);void DD2_load_background(void);//&dd2_columnstore, &dd2_background, dd2_top, dd2_left, dd2_heightmax);
+void DD2_load_background(void);
+void DD2_build_one_line_of_char(void);//&dd2_columnstore, &dd2_pointer, dd2_fontheight, dd2_lowbyte);
+void DD2_print_column(void);//&dd2_columnstore, dd2_heightmax);
+void DD2_CmdWrite(void);
+void DD2_DataWrite(void);
+void push_tissues_to_vault(void);
+void pull_tissues_from_vault(void);
+void main_push_tissues_to_vault(void);
+void main_pull_tissues_from_vault(void);
+
+// *******************************
+// ** start **
+// ** necessary for compilation **
+// *******************************
+#pragma romdata der_code = 0x0000
+#pragma code der_start = 0x0000
+void der_start(void)
+{
+_asm
+ goto main
+_endasm
+}
+
+// ***********************************
+// ** main code for simulation / **
+// ** tests without assembler code **
+// ** is NOT a part of the OSTC **
+// ***********************************
+#pragma code main = 0x9000
+void main(void)
+{
+#if 1
+// new main to test DR-5
+
+GF_low = 1.0;
+GF_high = 1.0;
+
+GF_temp = GF_low * GF_high;
+
+clear_CNS_fraction();
+//char_I_const_ppO2 = 100;
+//for (main_i=0;main_i<255;main_i++)
+//{
+//calc_CNS_fraction();
+//} //for
+
+
+
+
+int_I_pres_respiration = 1000;//980;
+int_I_pres_surface = 1000;//980;
+char_I_N2_ratio = 39; //38;
+char_I_He_ratio = 40; //50;
+char_I_deco_distance = 0; // 10 = 1 meter
+char_I_depth_last_deco = 3; // values below 3 (meter) are ignored
+
+char_I_const_ppO2 = 0;
+char_I_deco_ppO2_change = 0; // [dm] 10 = 1 meter
+char_I_deco_ppO2 = 0;
+
+char_I_deco_gas_change = 0; // [m] 1 = 1 meter
+char_I_deco_N2_ratio = 0;
+char_I_deco_He_ratio = 0;
+
+//char_I_actual_ppO2; // 0x507
+char_I_GF_High_percentage = 100; // 0x514 new in v.102
+char_I_GF_Low_percentage = 100; // 0x515 new in v.102
+
+char_I_saturation_multiplier = 110;
+char_I_desaturation_multiplier = 90;
+
+char_I_deco_model = 0;
+
+main_clear_tissue();
+
+int_I_pres_respiration = 1000 + int_I_pres_surface;
+main_calc_wo_deco_step_1_min();
+int_I_pres_respiration = 3000 + int_I_pres_surface;
+main_calc_wo_deco_step_1_min();
+int_I_pres_respiration = 5000 + int_I_pres_surface;
+main_calc_wo_deco_step_1_min();
+
+/*
+int_I_pres_respiration = 6000 + int_I_pres_surface;
+for (main_i=0;main_i<27;main_i++)
+ main_calc_wo_deco_step_1_min();
+*/
+
+char_O_deco_status = 255;
+while (char_O_deco_status)
+ main_calc_hauptroutine();
+_asm
+nop
+_endasm
+
+for (main_i=0;main_i<50;main_i++)
+{
+main_calc_hauptroutine();
+}
+int_I_pres_respiration = 10000;
+for (main_i=0;main_i<1500;main_i++)
+{
+main_calc_hauptroutine();
+}
+
+_asm
+nop
+_endasm
+
+
+int_I_pres_respiration = 3000;
+for (main_i=0;main_i<150;main_i++)
+{
+ calc_hauptroutine_data_input();
+ calc_hauptroutine_update_tissues();
+} //for
+
+ update_startvalues();
+ clear_decoarray();
+ clear_internal_deco_table_GF();
+ calc_hauptroutine_calc_ascend_to_deco();
+ if (char_O_deco_status > 15) // can't go up to first deco, too deep to calculate in the given time slot
+ {
+ char_O_deco_status = 2;
+// char_O_lock_depth_list = 255;
+ }
+ else
+ {
+// char_O_lock_depth_list = lock_GF_depth_list;
+ calc_hauptroutine_calc_deco();
+ }
+// build_debug_output();
+
+_asm
+nop
+_endasm
+while (char_O_deco_status == 1)
+{
+ char_O_deco_status = 0;
+// char_O_lock_depth_list = 255;
+ calc_hauptroutine_calc_deco();
+// build_debug_output();
+_asm
+nop
+_endasm
+};
+debug_temp = 60; // [mtr Aufstieg in 10 mtr/min (30steps'2sec/min]
+int_I_pres_respiration = 9980;
+for (main_i=0;main_i 15) // can't go up to first deco, too deep to calculate in the given time slot
+ {
+ char_O_deco_status = 2;
+// char_O_lock_depth_list = 255;
+ }
+ else
+ {
+// char_O_lock_depth_list = lock_GF_depth_list;
+ calc_hauptroutine_calc_deco();
+ }
+// build_debug_output();
+
+_asm
+nop
+_endasm
+while (char_O_deco_status == 1)
+{
+ char_O_deco_status = 0;
+// char_O_lock_depth_list = 255;
+ calc_hauptroutine_calc_deco();
+// build_debug_output();
+_asm
+nop
+_endasm
+};
+_asm
+nop
+_endasm
+debug_temp = 60; // [mtr Aufstieg in 10 mtr/min (30steps'2sec/min]
+int_I_pres_respiration = 9980;
+debug_temp = debug_temp * 3;
+for (main_i=0;main_i 1.3)
+ int_O_DBS_bitfield |= DBS_SAT2h;
+ if(GF_low < 0.19)
+ int_O_DBS_bitfield |= DBS_GFLOW2l;
+ if(GF_low > 1.01)
+ int_O_DBS_bitfield |= DBS_GFLOW2h;
+ if(GF_high < 0.6)
+ int_O_DBS_bitfield |= DBS_GFHGH2l;
+ if(GF_high > 1.01)
+ int_O_DBS_bitfield |= DBS_GFHGH2h;
+ if((N2_ratio + He_ratio) > 0.95)
+ int_O_DBS_bitfield |= DBS_GASO22l;
+ if((N2_ratio + He_ratio) < 0.05)
+ int_O_DBS_bitfield |= DBS_GASO22h;
+ if(float_deco_distance > 0.25)
+ int_O_DBS_bitfield |= DBS_DIST2h;
+ if(char_I_depth_last_deco > 8)
+ int_O_DBS_bitfield |= DBS_LAST2h;
+ if(DBG_deco_gas_change && ((deco_N2_ratio + deco_He_ratio) > 0.95))
+ int_O_DBS_bitfield |= DBS_DECOO2l;
+ if(DBG_deco_gas_change && ((deco_N2_ratio + deco_He_ratio) < 0.05))
+ int_O_DBS_bitfield |= DBS_DECOO2h;
+ if(pres_respiration > 3.0)
+ int_O_DBS2_bitfield |= DBS2_PRES2h;
+ if(pres_surface - pres_respiration > 0.2)
+ int_O_DBS2_bitfield |= DBS2_PRES2l;
+ if(pres_surface < 0.75)
+ int_O_DBS2_bitfield |= DBS2_SURF2l;
+ if(pres_surface > 1.11)
+ int_O_DBS2_bitfield |= DBS2_SURF2h;
+ if(float_desaturation_multiplier < 0.70)
+ int_O_DBS2_bitfield |= DBS2_DESAT2l;
+ if(float_desaturation_multiplier > 1.01)
+ int_O_DBS2_bitfield |= DBS2_DESAT2h;
+ if(GF_low > GF_high)
+ int_O_DBS2_bitfield |= DBS2_GFDneg;
+}
+
+// -------------------------------
+// DBG - set DBG to end_of_dive //
+// -------------------------------
+void set_dbg_end_of_dive(void)
+{
+ int_O_DBG_pre_bitfield &= (~DBG_RUN);
+ int_O_DBG_post_bitfield &= (~DBG_RUN);
+}
+
+// -------------------------------
+// DBG - NDL at first 20 m. hit //
+// -------------------------------
+void check_ndl(void)
+{
+ if((char_O_NDL_at_20mtr == -1) && (int_I_pres_respiration > 3000))
+ {
+ char_O_NDL_at_20mtr = char_O_nullzeit;
+ if(char_O_NDL_at_20mtr == 255)
+ char_O_NDL_at_20mtr == 254;
+ }
+}
+
+// -------------------------------
+// DBG - multi main during dive //
+// -------------------------------
+void check_dbg(char is_post_check)
+{
+ temp_DBS = 0;
+ if( (DBG_N2_ratio != N2_ratio) || (DBG_He_ratio != He_ratio) )
+ temp_DBS |= DBG_c_gas;
+ if(DBG_const_ppO2 != const_ppO2)
+ temp_DBS |= DBG_c_ppO2;
+ if((DBG_float_saturation_multiplier != float_saturation_multiplier) || (DBG_float_desaturation_multiplier != float_desaturation_multiplier))
+ temp_DBS |= DBG_CdeSAT;
+ if(DBG_char_I_deco_model != char_I_deco_model)
+ temp_DBS |= DBG_C_MODE;
+ if(DBG_pres_surface != pres_surface)
+ temp_DBS |= DBG_C_SURF;
+ if((!DBS_HE_sat) && (!He_ratio))
+ for(int_dbg_i = 16; int_dbg_i < 32; int_dbg_i++)
+ if(pres_tissue[int_dbg_i])
+ temp_DBS |= DBG_HEwoHE;
+ if(DBG_deco_ppO2 != deco_ppO2)
+ temp_DBS |= DBG_C_DPPO2;
+ if((DBG_deco_gas_change != deco_gas_change) || (DBG_deco_N2_ratio != deco_N2_ratio) || (DBG_deco_He_ratio != deco_He_ratio))
+ temp_DBS |= DBG_C_DGAS;
+ if(DBG_float_deco_distance != float_deco_distance)
+ temp_DBS |= DBG_C_DIST;
+ if(DBG_char_I_depth_last_deco != char_I_depth_last_deco)
+ temp_DBS |= DBG_C_LAST;
+ if((DBG_GF_low != GF_low) || (DBG_GF_high != GF_high))
+ temp_DBS |= DBG_C_GF;
+ if(pres_respiration > 13.0)
+ temp_DBS |= DBG_PHIGH;
+ if(pres_surface - pres_respiration > 0.2)
+ temp_DBS |= DBG_PLOW;
+/*
+ if()
+ temp_DBS |= ;
+ if()
+ temp_DBS |= ;
+ */
+ if(is_post_check)
+ int_O_DBG_post_bitfield |= temp_DBS;
+ else
+ int_O_DBG_pre_bitfield |= temp_DBS;
+}
+
+// -------------------------------
+// DBG - prior to calc. of dive //
+// -------------------------------
+void check_pre_dbg(void)
+{
+ check_dbg(0);
+}
+
+// -------------------------------
+// DBG - after decocalc of dive //
+// -------------------------------
+void check_post_dbg(void)
+{
+ check_dbg(1);
+}
+
+
+
+// -------------------------
+// calc_next_decodepth_GF //
+// -------------------------
+// new in v.102
+void calc_nextdecodepth_GF(void)
+{
+// INPUT, changing during dive:
+// temp_pres_gtissue_limit_GF_low
+// temp_pres_gtissue_limit_GF_low_below_surface
+// temp_pres_gtissue
+// temp_pres_gtissue_diff
+// lock_GF_depth_list
+
+// INPUT, fixed during dive:
+// pres_surface
+// GF_delta
+// GF_high
+// GF_low
+// temp_depth_last_deco
+// float_deco_distance
+
+// OUTPUT
+// GF_step
+// temp_deco
+// temp_depth_limt
+// lock_GF_depth_list
+
+// USES
+// temp1
+// temp2
+// int_temp
+
+ char_I_table_deco_done[0] = 0; // safety if changed somewhere else. Needed for exit
+ if (char_I_deco_model == 1)
+ {
+ if (lock_GF_depth_list == 0)
+ {
+ temp2 = temp_pres_gtissue_limit_GF_low_below_surface / 0.29985; // = ... / 99.95 / 0.003;
+ int_temp = (int) (temp2 + 0.99);
+ if (int_temp > 31)
+ int_temp = 31; // deepest deco at 93 meter (31 deco stops)
+ if (int_temp < 0)
+ int_temp = 0;
+ temp_depth_GF_low_number = int_temp;
+ temp_depth_GF_low_meter = 3 * temp_depth_GF_low_number;
+ temp2 = (float)temp_depth_GF_low_meter * 0.09995;
+ temp_pres_deco_GF_low = temp2 + float_deco_distance + pres_surface;
+ if (temp_depth_GF_low_number == 0)
+ GF_step = 0;
+ else
+ GF_step = GF_delta / (float)temp_depth_GF_low_number;
+ if (GF_step < 0)
+ GF_step = 0;
+ if (GF_step > GF_delta)
+ GF_step = GF_delta;
+ int_O_GF_step = (int)(GF_step * 10000);
+ int_O_limit_GF_low = (int)(temp_pres_deco_GF_low * 1000);
+ int_O_gtissue_press_at_GF_low = (int)(temp_pres_gtissue * 1000);
+ char_O_GF_low_pointer = temp_depth_GF_low_number;
+ lock_GF_depth_list = 1;
+ internal_deco_pointer = 0;
+ }
+ if (internal_deco_pointer == 0) // new run
+ {
+ internal_deco_pointer = temp_depth_GF_low_number;
+ GF_temp = GF_high - ((float)internal_deco_pointer * GF_step);
+ int_temp = char_I_table_deco_done[internal_deco_pointer];
+ output[8] = int_temp;
+ output[9] = 33;
+ }
+ else
+ {
+ int_temp = 1;
+ }
+ while (int_temp == 1)
+ {
+ int_temp = internal_deco_pointer - 1;
+ if (int_temp == 1) // new in v104
+ {
+ temp2 = (float)(temp_depth_last_deco * int_temp) * 0.09995;
+ GF_step2 = GF_step/3.0 * ((float)(6 - temp_depth_last_deco));
+ }
+ else
+ if (int_temp == 0)
+ {
+ temp2 = 0.0;
+ GF_step2 = GF_high - GF_temp;
+ }
+ else
+ {
+ temp2 = (float)(3 *int_temp) * 0.09995;
+ GF_step2 = GF_step;
+ }
+ temp2 = temp2 + pres_surface; // next deco stop to be tested
+ temp1 = ((GF_temp + GF_step2)* temp_pres_gtissue_diff) + temp_pres_gtissue; // upper limit (lowest pressure allowed) // changes GF_step2 in v104
+ if (temp1 > temp2) // check if ascent to next deco stop is ok
+ {
+ int_temp = 0; // no
+ }
+ else
+ {
+ internal_deco_pointer = int_temp;
+ GF_temp = GF_temp + GF_step2; // changed in v104
+ int_temp = char_I_table_deco_done[internal_deco_pointer]; // yes and check for ascent to even next stop if deco_done is set
+ }
+ } // while
+ if (internal_deco_pointer > 0)
+ {
+ temp2 = (float)(0.29985 * internal_deco_pointer);
+ temp_deco = temp2 + float_deco_distance + pres_surface;
+ if (internal_deco_pointer == 1) // new in v104
+ temp_depth_limit = temp_depth_last_deco;
+ else
+ temp_depth_limit = 3 * internal_deco_pointer;
+ if (output[9] == 33)
+ {
+ output[9] = internal_deco_pointer;
+ output[10] = char_I_table_deco_done[internal_deco_pointer];
+ output[12] = output[12] + 1;
+ if (output[12] == 100)
+ output[12] = 0;
+ }
+ }
+ else // if (char_I_deco_model == 1)
+ {
+ temp_deco = pres_surface;
+ temp_depth_limit = 0;
+ }
+ }
+ else
+ {
+ // calc_nextdecodepth - original
+ // optimized in v.101
+ // depth_last_deco included in v.101
+
+ temp1 = temp_pres_gtissue_limit - pres_surface;
+ if (temp1 >= 0)
+ {
+ temp1 = temp1 / 0.29985; // = temp1 / 99.95 / 0.003;
+ temp_depth_limit = (int) (temp1 + 0.99);
+ temp_depth_limit = 3 * temp_depth_limit; // depth for deco [m]
+ if (temp_depth_limit == 0)
+ temp_deco = pres_surface;
+ else
+ {
+ if (temp_depth_limit < temp_depth_last_deco)
+ temp_depth_limit = temp_depth_last_deco;
+ temp1 = (float)temp_depth_limit * 0.09995;
+ temp_deco = temp1 + float_deco_distance + pres_surface; // depth for deco [bar]
+ } // if (temp_depth_limit == 0)
+ } // if (temp1 >= 0)
+ else
+ {
+ temp_deco = pres_surface;
+ temp_depth_limit = 0;
+ } // if (temp1 >= 0)
+ } // calc_nextdecodepth original
+} // calc_nextdecodepth_GF
+
+
+#if 0
+void build_debug_output(void)
+{
+output[0] = 0; // not used in asm PLED output
+output[1] = (int) (GF_low * 100);
+output[2] = (int) (GF_high * 100);
+output[3] = (int) (GF_step * 100);
+output[4] = (int) temp_depth_GF_low_number;
+output[5] = (int) temp_depth_GF_low_meter;
+//output[6]
+output[7] = (int) internal_deco_pointer;
+//output[8] = char_I_table_deco_done[temp_depth_GF_low_number]
+//output[9] = internal_deco_pointer @ new run
+//output[10] = char_I_table_deco_done[internal_deco_pointer] @ new run
+output [11] = (int) (temp_pres_deco_GF_low * 10);
+} // build_debug_output
+#endif
+
+// ---------------------
+// copy_deco_table_GF //
+// ---------------------
+// new in v.102
+void copy_deco_table_GF(void)
+{
+ if (char_I_deco_model == 1)
+ {
+ int_temp = 32;
+ for (ci=0;ci dd2_fontheight) dd2_heightmax = dd2_fontheight;
+ if ((dd2_top + dd2_heightmax) > 65) dd2_heightmax = 65 - dd2_top;
+
+ dd2_k = dd2_left;
+ dd2_j = 0;
+ dd2_char = dd2_stringstore[dd2_j++];
+ DD2_get_pointer_to_char();//dd2_char, &dd2_pointer);
+ dd2_i = 0;
+ dd2_lowbyte = 1;
+
+while (dd2_char != 0)
+{
+ if (dd2_lowbyte == 1) DD2_load_background();//&dd2_columnstore, &dd2_background, dd2_top, dd2_left, dd2_heightmax);
+ DD2_build_one_line_of_char(); //&dd2_columnstore, &dd2_pointer, dd2_fontheight, dd2_lowbyte); // dd2_heightmax
+ dd2_lowbyte = dd2_lowbyte ^ 1;
+ if (dd2_lowbyte == 1)
+ {
+ DD2_set_column();//top, dd2_k); //
+ if(dd2_k < 64) dd2_k++;
+ DD2_print_column();//&dd2_columnstore, dd2_heightmax); // dd2_column_store, dd2_heightmax
+ }
+ dd2_i++;
+ if ((dd2_i >= dd2_fontwidth) | (((dd2_char == '.') |(dd2_char == ':') | (dd2_char == '<')) & (dd2_i >= 4)))
+ {
+ dd2_char = dd2_stringstore[dd2_j++];
+ DD2_get_pointer_to_char();//dd2_char, &dd2_pointer);
+ dd2_i = 0;
+ }
+}
+} // void dd2_write(void)
+
+void DD2_get_pointer_to_char(void)//dd2_char, &dd2_pointer);
+{
+ if((dd2_char < dd2_start) | (dd2_char > dd2_end))
+ {
+ dd2_pointer = 0;
+ dd2_temp = 0;
+ }
+ else
+ {
+ dd2_pointer = dd2_char - dd2_start;
+ dd2_pointer = dd2_pointer * ((dd2_fontheight+1)/2);
+ dd2_pointer = dd2_pointer * dd2_fontwidth;
+ dd2_pointer += dd2_base;
+ if((dd2_char == '.') | (dd2_char == ':') | (dd2_char == '<'))
+ {
+ dd2_pointer += 2 * dd2_fontheight;
+ }
+
+ }
+} // void DD2_get_pointer_to_char(void)
+
+void DD2_set_column(void)//top, dd2_k);
+{
+ dd2_data = 0x75;
+ DD2_CmdWrite();
+ dd2_data = dd2_top - 1;
+ DD2_CmdWrite();
+ dd2_data = 0x3f;
+ DD2_CmdWrite();
+
+ dd2_data = 0x15;
+ DD2_CmdWrite();
+ dd2_data = dd2_k - 1;
+ DD2_CmdWrite();
+ dd2_data = dd2_k - 1;
+ DD2_CmdWrite();
+} // DD2_set_column()
+
+void DD2_load_background(void)//&dd2_columnstore, &dd2_background, dd2_top, dd2_left, dd2_heightmax);
+{
+ for(dd2_temp = 0; dd2_temp < dd2_heightmax; dd2_temp++)
+ md_pi_subst[dd2_temp] = 0x00;
+} // void DD2_load_background()
+
+void DD2_build_one_line_of_char(void)//&dd2_columnstore, &dd2_pointer, dd2_fontheight, dd2_lowbyte);
+{
+ if (dd2_pointer != 0)
+ {
+ dd2_temp = (char)(dd2_pointer & 255);
+_asm
+ movff dd2_temp,TBLPTRL
+_endasm
+ dd2_temp = (char)((dd2_pointer >> 8) & 255);
+_asm
+ movff dd2_temp,TBLPTRH
+_endasm
+ dd2_temp = (char)((dd2_pointer >> 16)& 255);
+_asm
+ movff dd2_temp,TBLPTRU
+_endasm
+
+ for(dd2_temp = 0; dd2_temp < dd2_heightmax; dd2_temp += 2)
+ {
+_asm
+ TBLRDPOSTINC
+ movff TABLAT,dd2_data
+_endasm
+ if (dd2_oled_brightness_offset != 0)
+ {
+ if ((dd2_oled_brightness_offset << 4) < (dd2_data & 0xF0))
+ dd2_data = dd2_data - (dd2_oled_brightness_offset << 4);
+ if ((dd2_oled_brightness_offset) < (dd2_data & 0x0F))
+ dd2_data = dd2_data - dd2_oled_brightness_offset;
+ }
+ if (dd2_lowbyte == 1)
+ {
+ md_pi_subst[dd2_temp] = dd2_data & 0xF0;
+ md_pi_subst[dd2_temp+1] = (dd2_data << 4) & 0xF0;
+ }
+ else
+ {
+ md_pi_subst[dd2_temp] = (md_pi_subst[dd2_temp] & 0xF0) | ((dd2_data >> 4) & 0x0F);
+ md_pi_subst[dd2_temp+1] = (md_pi_subst[dd2_temp+1] & 0xF0) | (dd2_data & 0x0F);
+ }
+ }//for
+ dd2_pointer += (dd2_fontheight+1)/2;
+ }//if
+} //
+
+void DD2_print_column(void)//&dd2_columnstore, dd2_heightmax);
+{
+_asm
+ bsf oled_rs
+_endasm
+ for(dd2_temp = 0; dd2_temp < dd2_heightmax; dd2_temp++)
+ {
+ dd2_data = md_pi_subst[dd2_temp];
+ DD2_DataWrite();
+ }
+} // void DD2_print_column(void)
+
+//; -----------------------------
+//; DD Write Cmd via W
+//; two jump_ins:
+//; DD_CmdWrite and DD_CmdWrite2
+//; -----------------------------
+void DD2_CmdWrite(void)
+{
+_asm
+ bcf oled_rs
+_endasm
+ DD2_DataWrite();
+}
+
+void DD2_DataWrite(void)
+{
+_asm
+ movlb 1
+// bsf no_sensor_int // flag5, no_sensor_int
+ bcf oled_en
+ movlb 0
+ bcf oled_clk //; CLK=0
+ btfsc dd2_data,7,1 //; Bit
+ bsf oled_data
+ bcf oled_clk //; CLK=0
+ btfss dd2_data,7,1
+ bcf oled_data
+ bsf oled_clk //; CLK=1
+ btfsc dd2_data,6,1 //; Bit
+ bsf oled_data
+ bcf oled_clk //; CLK=0
+ btfss dd2_data,6,1
+ bcf oled_data
+ bsf oled_clk //; CLK=1
+ btfsc dd2_data,5,1 //; Bit
+ bsf oled_data
+ bcf oled_clk //; CLK=0
+ btfss dd2_data,5,1
+ bcf oled_data //;
+ bsf oled_clk //; CLK=1
+ btfsc dd2_data,4,1 //; Bit
+ bsf oled_data
+ bcf oled_clk //; CLK=0
+ btfss dd2_data,4,1
+ bcf oled_data
+ bsf oled_clk //; CLK=1
+ btfsc dd2_data,3,1 //; Bit
+ bsf oled_data
+ bcf oled_clk //; CLK=0
+ btfss dd2_data,3,1
+ bcf oled_data
+ bsf oled_clk //; CLK=1
+ btfsc dd2_data,2,1 //; Bit
+ bsf oled_data
+ bcf oled_clk //; CLK=0
+ btfss dd2_data,2,1
+ bcf oled_data
+ bsf oled_clk //; CLK=1
+ btfsc dd2_data,1,1 //; Bit
+ bsf oled_data
+ bcf oled_clk //; CLK=0
+ btfss dd2_data,1,1
+ bcf oled_data
+ bsf oled_clk //; CLK=1
+ btfsc dd2_data,0,1 //; Bit
+ bsf oled_data
+ bcf oled_clk //; CLK=0
+ btfss dd2_data,0,1
+ bcf oled_data
+ bsf oled_clk //; CLK=1
+ bsf oled_en //; CS#=1
+ movlb 1
+// bcf no_sensor_int // flag5, no_sensor_int
+ movlb 0
+_endasm
+ dd2_data = 0; // to be sure that C knows we are in Bank0
+}
+#pragma romdata font_incon_24h15 = 0x0E100
+ rom const rom unsigned char incon24h15[] =
+ {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x80
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6f, 0xf0
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xe0
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3a, 0xf0
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x4b, 0xff, 0xa0
+ ,0x00, 0x00, 0x00, 0x00, 0x5c, 0xff, 0x91, 0x00
+ ,0x00, 0x00, 0x00, 0x6d, 0xfe, 0x71, 0x00, 0x00
+ ,0x00, 0x01, 0x7e, 0xfd, 0x60, 0x00, 0x00, 0x00
+ ,0x01, 0x8f, 0xfd, 0x50, 0x00, 0x00, 0x00, 0x00
+ ,0x9f, 0xfb, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0xfa, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x01, 0x69, 0xbc, 0xca, 0x72, 0x00, 0x00
+ ,0x00, 0x9f, 0xfe, 0xdc, 0xdf, 0xff, 0xb2, 0x00
+ ,0x1d, 0xf8, 0x20, 0x00, 0x05, 0xfd, 0xff, 0x30
+ ,0xaf, 0x30, 0x00, 0x00, 0x9f, 0x90, 0x2e, 0xd0
+ ,0xf8, 0x00, 0x00, 0x2c, 0xf5, 0x00, 0x06, 0xf0
+ ,0xf8, 0x00, 0x04, 0xed, 0x30, 0x00, 0x05, 0xf0
+ ,0xaf, 0x30, 0x8f, 0xb1, 0x00, 0x00, 0x0c, 0xe0
+ ,0x1d, 0xfd, 0xf8, 0x00, 0x00, 0x16, 0xdf, 0x40
+ ,0x00, 0x9f, 0xff, 0xdc, 0xde, 0xff, 0xc3, 0x00
+ ,0x00, 0x01, 0x69, 0xbc, 0xca, 0x73, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x02, 0x90, 0x00, 0x00, 0x00, 0x00, 0x01, 0x30
+ ,0x0a, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x04, 0xf0
+ ,0x2f, 0x60, 0x00, 0x00, 0x00, 0x00, 0x04, 0xf0
+ ,0xaf, 0x97, 0x77, 0x77, 0x77, 0x77, 0x79, 0xf0
+ ,0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0
+ ,0x12, 0x22, 0x22, 0x22, 0x22, 0x22, 0x26, 0xf0
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xf0
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xd0
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x40
+ ,0x07, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xf0
+ ,0x4f, 0x80, 0x00, 0x00, 0x00, 0x1c, 0xfe, 0xf0
+ ,0xcc, 0x00, 0x00, 0x00, 0x02, 0xef, 0x57, 0xf0
+ ,0xf7, 0x00, 0x00, 0x00, 0x2e, 0xe2, 0x07, 0xf0
+ ,0xf8, 0x00, 0x00, 0x01, 0xde, 0x20, 0x07, 0xf0
+ ,0xce, 0x10, 0x00, 0x2d, 0xe2, 0x00, 0x07, 0xf0
+ ,0x4f, 0xd6, 0x58, 0xfe, 0x30, 0x00, 0x07, 0xf0
+ ,0x06, 0xff, 0xff, 0xb1, 0x00, 0x00, 0x07, 0xf0
+ ,0x00, 0x14, 0x52, 0x00, 0x00, 0x00, 0x05, 0x80
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00
+ ,0x09, 0x20, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x50
+ ,0x6f, 0x40, 0x00, 0x00, 0x00, 0x00, 0x2e, 0xd0
+ ,0xdb, 0x00, 0x00, 0x59, 0x00, 0x00, 0x07, 0xf0
+ ,0xf8, 0x00, 0x00, 0x8e, 0x00, 0x00, 0x04, 0xf0
+ ,0xea, 0x00, 0x00, 0xcf, 0x10, 0x00, 0x06, 0xf0
+ ,0x9f, 0x30, 0x07, 0xff, 0x90, 0x00, 0x1e, 0xe0
+ ,0x1e, 0xfc, 0xdf, 0x87, 0xfb, 0x79, 0xef, 0x50
+ ,0x01, 0x9d, 0xc6, 0x00, 0x7e, 0xff, 0xd5, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x2b, 0xb0, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x06, 0xff, 0xe0, 0x00, 0x00
+ ,0x00, 0x00, 0x02, 0xcf, 0x69, 0xe0, 0x00, 0x00
+ ,0x00, 0x00, 0x7f, 0xb1, 0x09, 0xe0, 0x00, 0x00
+ ,0x00, 0x2c, 0xe6, 0x00, 0x09, 0xe0, 0x00, 0x00
+ ,0x07, 0xfb, 0x10, 0x00, 0x09, 0xe0, 0x00, 0x00
+ ,0xcf, 0xfc, 0xcc, 0xcc, 0xce, 0xfd, 0xdd, 0xd0
+ ,0xde, 0xee, 0xee, 0xee, 0xef, 0xfe, 0xee, 0xe0
+ ,0x00, 0x00, 0x00, 0x00, 0x09, 0xe0, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x08, 0xc0, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00
+ ,0x78, 0xab, 0xcd, 0xed, 0x00, 0x00, 0xce, 0x20
+ ,0xff, 0xed, 0xcc, 0xfa, 0x00, 0x00, 0x5f, 0xb0
+ ,0xf9, 0x00, 0x06, 0xf0, 0x00, 0x00, 0x08, 0xf0
+ ,0xf9, 0x00, 0x0a, 0xb0, 0x00, 0x00, 0x04, 0xf0
+ ,0xf9, 0x00, 0x0a, 0xc0, 0x00, 0x00, 0x04, 0xf0
+ ,0xf9, 0x00, 0x08, 0xf3, 0x00, 0x00, 0x0b, 0xf0
+ ,0xf9, 0x00, 0x01, 0xfe, 0x62, 0x13, 0xbf, 0x90
+ ,0xf9, 0x00, 0x00, 0x4e, 0xff, 0xff, 0xfb, 0x00
+ ,0x11, 0x00, 0x00, 0x01, 0x6a, 0xa9, 0x40, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x03, 0x56, 0x65, 0x30, 0x00, 0x00
+ ,0x00, 0x4b, 0xff, 0xff, 0xff, 0xff, 0xa2, 0x00
+ ,0x08, 0xfe, 0x96, 0x8f, 0x95, 0x6a, 0xff, 0x30
+ ,0x6f, 0x90, 0x01, 0xf8, 0x00, 0x00, 0x3e, 0xd0
+ ,0xec, 0x00, 0x08, 0xf0, 0x00, 0x00, 0x06, 0xf0
+ ,0xf6, 0x00, 0x0a, 0xe0, 0x00, 0x00, 0x04, 0xf0
+ ,0xf7, 0x00, 0x07, 0xf3, 0x00, 0x00, 0x09, 0xf0
+ ,0xcd, 0x10, 0x01, 0xef, 0x72, 0x13, 0xaf, 0x90
+ ,0x4d, 0x20, 0x00, 0x2d, 0xff, 0xff, 0xf9, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x47, 0x86, 0x10, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x90
+ ,0xfa, 0x00, 0x00, 0x00, 0x00, 0x39, 0xef, 0xf0
+ ,0xfa, 0x00, 0x00, 0x01, 0x7d, 0xff, 0xe9, 0x40
+ ,0xfa, 0x00, 0x05, 0xbf, 0xff, 0x94, 0x00, 0x00
+ ,0xfa, 0x18, 0xef, 0xfb, 0x50, 0x00, 0x00, 0x00
+ ,0xfe, 0xff, 0xd7, 0x10, 0x00, 0x00, 0x00, 0x00
+ ,0xff, 0xb4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x02, 0x78, 0x50, 0x00
+ ,0x03, 0xad, 0xb4, 0x00, 0x7f, 0xff, 0xfc, 0x00
+ ,0x3f, 0xfc, 0xff, 0x66, 0xfa, 0x43, 0xaf, 0xa0
+ ,0xcd, 0x10, 0x1c, 0xfe, 0x70, 0x00, 0x0b, 0xf0
+ ,0xf5, 0x00, 0x01, 0xfe, 0x00, 0x00, 0x05, 0xf0
+ ,0xf5, 0x00, 0x00, 0xbf, 0x10, 0x00, 0x04, 0xf0
+ ,0xec, 0x00, 0x07, 0xff, 0xb0, 0x00, 0x0a, 0xf0
+ ,0x6f, 0xd9, 0xcf, 0x78, 0xfb, 0x32, 0x9f, 0x90
+ ,0x07, 0xef, 0xe6, 0x00, 0x9f, 0xff, 0xfb, 0x00
+ ,0x00, 0x01, 0x00, 0x00, 0x03, 0x88, 0x50, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x03, 0x55, 0x20, 0x00, 0x00, 0x00, 0x00
+ ,0x04, 0xdf, 0xff, 0xfb, 0x10, 0x00, 0x0b, 0x60
+ ,0x4f, 0xd7, 0x45, 0x9f, 0xd0, 0x00, 0x1c, 0xe0
+ ,0xdd, 0x00, 0x00, 0x05, 0xf5, 0x00, 0x05, 0xf0
+ ,0xf7, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x04, 0xf0
+ ,0xf8, 0x00, 0x00, 0x00, 0xf7, 0x00, 0x08, 0xf0
+ ,0xbe, 0x20, 0x00, 0x06, 0xf2, 0x00, 0x5f, 0xa0
+ ,0x2e, 0xf9, 0x54, 0x7f, 0x94, 0x7c, 0xfc, 0x00
+ ,0x02, 0xaf, 0xff, 0xff, 0xff, 0xfe, 0x70, 0x00
+ ,0x00, 0x01, 0x46, 0x77, 0x75, 0x30, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x06, 0xa1, 0x00, 0x00, 0x09, 0x80
+ ,0x00, 0x00, 0x1f, 0xf9, 0x00, 0x00, 0x6f, 0xf0
+ ,0x00, 0x00, 0x0d, 0xf5, 0x00, 0x00, 0x3f, 0xe0
+ ,0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0xba, 0xae, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0xff, 0xe9, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x53, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x97, 0x8c, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0xff, 0xfb, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x75, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x75, 0x6a, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0xff, 0xfd, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0xa8, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x2c, 0xff, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0xdd, 0x78, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0xf2, 0x00, 0x5f, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0xf0, 0x00, 0x4f, 0x10, 0x00, 0x00, 0x00, 0x00
+ ,0xea, 0x23, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x4f, 0xff, 0xe2, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x01, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x11, 0x11, 0x11, 0x11, 0x11, 0x10
+ ,0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0
+ ,0x00, 0x00, 0x9f, 0xa7, 0x77, 0x77, 0x77, 0x70
+ ,0x00, 0x00, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x02, 0xf3, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x01, 0xff, 0xcb, 0xbb, 0xbb, 0xbb, 0xb0
+ ,0x00, 0x00, 0x4f, 0xfe, 0xee, 0xee, 0xee, 0xe0
+ ,0x00, 0x00, 0xab, 0x20, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x01, 0xf1, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x02, 0xfa, 0x55, 0x55, 0x55, 0x55, 0x50
+ ,0x00, 0x00, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xf0
+ ,0x00, 0x00, 0x02, 0x44, 0x44, 0x44, 0x44, 0x40
+ };
+
+#pragma romdata font_incon_42 = 0x0F500
+ rom const rom unsigned char incon42[] =
+ {
+ // 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x03, 0x7a, 0xcd, 0xee, 0xdc, 0xa8, 0x40, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x18, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x92, 0x00, 0x00, 0x00
+ ,0x00, 0x07, 0xef, 0xff, 0xff, 0xdc, 0xbb, 0xce, 0xff, 0xff, 0xff, 0x91, 0x00, 0x00
+ ,0x00, 0xbf, 0xff, 0xc7, 0x65, 0x43, 0x22, 0x33, 0x57, 0xbf, 0xff, 0xfd, 0x20, 0x00
+ ,0x0b, 0xff, 0xc4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x6e, 0xff, 0xd1, 0x00
+ ,0x7f, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xbf, 0xfa, 0x00
+ ,0xef, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0xff, 0x20
+ ,0xff, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xff, 0x60
+ ,0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0x70
+ ,0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0x50
+ ,0xcf, 0xf3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1d, 0xff, 0x10
+ ,0x4f, 0xfe, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xcf, 0xf8, 0x00
+ ,0x07, 0xff, 0xd7, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x7e, 0xff, 0xb0, 0x00
+ ,0x00, 0x5e, 0xff, 0xfb, 0x98, 0x54, 0x33, 0x34, 0x58, 0xbf, 0xff, 0xfa, 0x00, 0x00
+ ,0x00, 0x01, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x50, 0x00, 0x00
+ ,0x00, 0x00, 0x01, 0x7b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe9, 0x40, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x02, 0x46, 0x77, 0x65, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ // ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+
+#if 0
+// 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x03, 0x7a, 0xcd, 0xee, 0xdc, 0xa8, 0x40, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x18, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x92, 0x00, 0x00, 0x00
+ ,0x00, 0x07, 0xef, 0xff, 0xff, 0xdc, 0xbb, 0xce, 0xff, 0xff, 0xff, 0x91, 0x00, 0x00
+ ,0x00, 0xbf, 0xff, 0xc7, 0x20, 0x00, 0x00, 0x00, 0x1c, 0xff, 0xff, 0xfd, 0x20, 0x00
+ ,0x0b, 0xff, 0xc4, 0x00, 0x00, 0x00, 0x00, 0x02, 0xcf, 0xfc, 0x6e, 0xff, 0xd1, 0x00
+ ,0x7f, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5e, 0xff, 0x90, 0x01, 0xbf, 0xfa, 0x00
+ ,0xef, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x09, 0xff, 0xe5, 0x00, 0x00, 0x0d, 0xff, 0x20
+ ,0xff, 0x60, 0x00, 0x00, 0x00, 0x02, 0xcf, 0xfc, 0x20, 0x00, 0x00, 0x05, 0xff, 0x60
+ ,0xff, 0x40, 0x00, 0x00, 0x00, 0x5e, 0xff, 0x90, 0x00, 0x00, 0x00, 0x03, 0xff, 0x70
+ ,0xff, 0x80, 0x00, 0x00, 0x08, 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0x50
+ ,0xcf, 0xf3, 0x00, 0x01, 0xcf, 0xfd, 0x30, 0x00, 0x00, 0x00, 0x00, 0x1d, 0xff, 0x10
+ ,0x4f, 0xfe, 0x50, 0x4e, 0xff, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x01, 0xcf, 0xf8, 0x00
+ ,0x07, 0xff, 0xfd, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x01, 0x7e, 0xff, 0xb0, 0x00
+ ,0x00, 0x5e, 0xff, 0xff, 0xd8, 0x54, 0x33, 0x34, 0x58, 0xbf, 0xff, 0xfa, 0x00, 0x00
+ ,0x00, 0x01, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x50, 0x00, 0x00
+ ,0x00, 0x00, 0x01, 0x7b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe9, 0x40, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x02, 0x46, 0x77, 0x65, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+// ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+#endif
+//
+// ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x1f, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x44, 0x00
+ ,0x00, 0x9f, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0x00
+ ,0x02, 0xff, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0x00
+ ,0x0a, 0xff, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0x00
+ ,0x3f, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0x00
+ ,0xbf, 0xfc, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x79, 0xff, 0x00
+ ,0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00
+ ,0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00
+ ,0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x36, 0xff, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xcc, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+// ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ //
+// ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x08, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0xff, 0x00
+ ,0x00, 0xbf, 0xd1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xff, 0x00
+ ,0x0a, 0xff, 0xb3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xdf, 0xff, 0xff, 0x00
+ ,0x4f, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6f, 0xff, 0xdb, 0xff, 0x00
+ ,0xcf, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xf8, 0x08, 0xff, 0x00
+ ,0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9f, 0xfe, 0x40, 0x08, 0xff, 0x00
+ ,0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0xff, 0xd2, 0x00, 0x08, 0xff, 0x00
+ ,0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9f, 0xfd, 0x10, 0x00, 0x08, 0xff, 0x00
+ ,0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xd1, 0x00, 0x00, 0x08, 0xff, 0x00
+ ,0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x8f, 0xfe, 0x20, 0x00, 0x00, 0x08, 0xff, 0x00
+ ,0x9f, 0xfa, 0x00, 0x00, 0x00, 0x1a, 0xff, 0xe2, 0x00, 0x00, 0x00, 0x08, 0xff, 0x00
+ ,0x2e, 0xff, 0xd6, 0x21, 0x38, 0xef, 0xfd, 0x20, 0x00, 0x00, 0x00, 0x08, 0xff, 0x00
+ ,0x04, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0x00
+ ,0x00, 0x3d, 0xff, 0xff, 0xff, 0xe7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0x00
+ ,0x00, 0x00, 0x59, 0xbb, 0x95, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ //,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ //
+// ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5e, 0x30, 0x00
+ ,0x04, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xd0, 0x00
+ ,0x1e, 0xfe, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xdf, 0xf8, 0x00
+ ,0x7f, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xfe, 0x00
+ ,0xdf, 0xc0, 0x00, 0x00, 0x00, 0x07, 0x95, 0x00, 0x00, 0x00, 0x00, 0x09, 0xff, 0x30
+ ,0xff, 0x70, 0x00, 0x00, 0x00, 0x0c, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0x60
+ ,0xff, 0x50, 0x00, 0x00, 0x00, 0x0e, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0x70
+ ,0xff, 0x60, 0x00, 0x00, 0x00, 0x2f, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0x60
+ ,0xff, 0xb0, 0x00, 0x00, 0x00, 0x7f, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x09, 0xff, 0x30
+ ,0xbf, 0xf4, 0x00, 0x00, 0x02, 0xef, 0xff, 0x70, 0x00, 0x00, 0x00, 0x2f, 0xfe, 0x00
+ ,0x4f, 0xfe, 0x60, 0x00, 0x5e, 0xfd, 0xbf, 0xf5, 0x00, 0x00, 0x03, 0xef, 0xf7, 0x00
+ ,0x09, 0xff, 0xff, 0xdf, 0xff, 0xf3, 0x2f, 0xff, 0xb6, 0x56, 0xbf, 0xff, 0xc0, 0x00
+ ,0x00, 0x8f, 0xff, 0xff, 0xfe, 0x40, 0x04, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x00
+ ,0x00, 0x02, 0x8c, 0xdb, 0x71, 0x00, 0x00, 0x2b, 0xff, 0xff, 0xfe, 0x80, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x66, 0x30, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ //,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ //
+// ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xef, 0xc0, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xaf, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5e, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0xff, 0xd4, 0xcf, 0xc0, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x06, 0xef, 0xf8, 0x00, 0xcf, 0xc0, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x02, 0xbf, 0xfc, 0x30, 0x00, 0xcf, 0xc0, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x7f, 0xff, 0x70, 0x00, 0x00, 0xcf, 0xc0, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x2c, 0xff, 0xb2, 0x00, 0x00, 0x00, 0xcf, 0xc0, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x07, 0xff, 0xe6, 0x00, 0x00, 0x00, 0x00, 0xcf, 0xc0, 0x00, 0x00, 0x00, 0x00
+ ,0x03, 0xcf, 0xfa, 0x10, 0x00, 0x00, 0x00, 0x00, 0xcf, 0xc0, 0x00, 0x00, 0x00, 0x00
+ ,0x8f, 0xff, 0xea, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xef, 0xea, 0xaa, 0xaa, 0xaa, 0x00
+ ,0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00
+ ,0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00
+ ,0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0xdf, 0xd4, 0x44, 0x44, 0x44, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcf, 0xc0, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcf, 0xc0, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79, 0x70, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ //,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ //
+// ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x12, 0x34, 0x56, 0x72, 0x00, 0x00, 0x00, 0x03, 0xf8, 0x00, 0x00
+ ,0xab, 0xcd, 0xef, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x1e, 0xff, 0x80, 0x00
+ ,0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x00, 0x00, 0x00, 0x28, 0xff, 0xf3, 0x00
+ ,0xff, 0xda, 0xa9, 0x87, 0x67, 0xff, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xfb, 0x00
+ ,0xff, 0x70, 0x00, 0x00, 0x06, 0xff, 0x10, 0x00, 0x00, 0x00, 0x00, 0x0c, 0xff, 0x10
+ ,0xff, 0x70, 0x00, 0x00, 0x0b, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xff, 0x50
+ ,0xff, 0x70, 0x00, 0x00, 0x0d, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x70
+ ,0xff, 0x70, 0x00, 0x00, 0x0e, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x70
+ ,0xff, 0x70, 0x00, 0x00, 0x0e, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0x60
+ ,0xff, 0x70, 0x00, 0x00, 0x0b, 0xfe, 0x10, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xff, 0x30
+ ,0xff, 0x70, 0x00, 0x00, 0x06, 0xff, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x6f, 0xfd, 0x00
+ ,0xff, 0x70, 0x00, 0x00, 0x00, 0xdf, 0xfd, 0x40, 0x00, 0x00, 0x29, 0xff, 0xf5, 0x00
+ ,0xff, 0x70, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xfe, 0xba, 0xbd, 0xff, 0xff, 0x90, 0x00
+ ,0xff, 0x70, 0x00, 0x00, 0x00, 0x03, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00
+ ,0x55, 0x20, 0x00, 0x00, 0x00, 0x00, 0x07, 0xdf, 0xff, 0xff, 0xea, 0x30, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x34, 0x42, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ //,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ //
+// ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x33, 0x33, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x49, 0xce, 0xff, 0xff, 0xff, 0xff, 0xeb, 0x71, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x00, 0x00
+ ,0x00, 0x3d, 0xff, 0xff, 0xfc, 0xba, 0xff, 0xfb, 0xab, 0xef, 0xff, 0xfd, 0x20, 0x00
+ ,0x04, 0xff, 0xfe, 0x83, 0x00, 0x1c, 0xfd, 0x20, 0x00, 0x02, 0x8e, 0xff, 0xd1, 0x00
+ ,0x1e, 0xff, 0x90, 0x00, 0x00, 0xbf, 0xe1, 0x00, 0x00, 0x00, 0x01, 0xcf, 0xf9, 0x00
+ ,0xaf, 0xf7, 0x00, 0x00, 0x05, 0xff, 0x50, 0x00, 0x00, 0x00, 0x00, 0x1d, 0xff, 0x10
+ ,0xff, 0xb0, 0x00, 0x00, 0x0a, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0x50
+ ,0xff, 0x50, 0x00, 0x00, 0x0d, 0xfb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x70
+ ,0xff, 0x20, 0x00, 0x00, 0x0d, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0x60
+ ,0xff, 0x30, 0x00, 0x00, 0x0a, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0x30
+ ,0xff, 0x70, 0x00, 0x00, 0x05, 0xff, 0xc1, 0x00, 0x00, 0x00, 0x00, 0x4f, 0xfd, 0x00
+ ,0xef, 0xe1, 0x00, 0x00, 0x00, 0xcf, 0xfd, 0x50, 0x00, 0x00, 0x28, 0xff, 0xf4, 0x00
+ ,0x7f, 0xfd, 0x00, 0x00, 0x00, 0x2d, 0xff, 0xff, 0xdb, 0xcd, 0xff, 0xff, 0x70, 0x00
+ ,0x0c, 0xd2, 0x00, 0x00, 0x00, 0x01, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xe5, 0x00, 0x00
+ ,0x01, 0x10, 0x00, 0x00, 0x00, 0x00, 0x03, 0x9d, 0xff, 0xfe, 0xb6, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ //,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ //
+// ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0xcc, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00
+ ,0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0xef, 0x00
+ ,0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x9e, 0xff, 0xff, 0x00
+ ,0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0xdf, 0xff, 0xff, 0xfe, 0x00
+ ,0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x01, 0x7d, 0xff, 0xff, 0xff, 0xd9, 0x40, 0x00
+ ,0xff, 0x90, 0x00, 0x00, 0x00, 0x05, 0xbf, 0xff, 0xff, 0xfd, 0x83, 0x00, 0x00, 0x00
+ ,0xff, 0x90, 0x00, 0x00, 0x39, 0xef, 0xff, 0xff, 0xe8, 0x30, 0x00, 0x00, 0x00, 0x00
+ ,0xff, 0x90, 0x00, 0x6c, 0xff, 0xff, 0xfe, 0x94, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0xff, 0x92, 0x8e, 0xff, 0xff, 0xfb, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0xff, 0xef, 0xff, 0xff, 0xd7, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0xff, 0xff, 0xff, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0xff, 0xfd, 0x71, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0xba, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ //,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ //
+// ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x67, 0x62, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x24, 0x42, 0x00, 0x00, 0x00, 0x04, 0xdf, 0xff, 0xff, 0xb2, 0x00, 0x00
+ ,0x00, 0x3c, 0xff, 0xff, 0xc4, 0x00, 0x00, 0x8f, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x00
+ ,0x05, 0xff, 0xff, 0xff, 0xff, 0x70, 0x08, 0xff, 0xfb, 0x77, 0xaf, 0xff, 0xe1, 0x00
+ ,0x3f, 0xff, 0xa7, 0x8d, 0xff, 0xf6, 0x4f, 0xfc, 0x20, 0x00, 0x02, 0xdf, 0xf9, 0x00
+ ,0xbf, 0xe3, 0x00, 0x00, 0x8f, 0xfe, 0xdf, 0xb0, 0x00, 0x00, 0x00, 0x2e, 0xff, 0x00
+ ,0xff, 0x60, 0x00, 0x00, 0x08, 0xff, 0xfe, 0x10, 0x00, 0x00, 0x00, 0x08, 0xff, 0x40
+ ,0xff, 0x10, 0x00, 0x00, 0x00, 0xcf, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0x60
+ ,0xff, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0x60
+ ,0xff, 0x20, 0x00, 0x00, 0x00, 0x5f, 0xff, 0x10, 0x00, 0x00, 0x00, 0x05, 0xff, 0x50
+ ,0xff, 0x80, 0x00, 0x00, 0x03, 0xef, 0xff, 0xa0, 0x00, 0x00, 0x00, 0x0a, 0xff, 0x20
+ ,0xdf, 0xf6, 0x00, 0x00, 0x5e, 0xfc, 0xcf, 0xf8, 0x00, 0x00, 0x00, 0x4f, 0xfd, 0x00
+ ,0x4f, 0xff, 0xc8, 0x9d, 0xff, 0xf3, 0x3f, 0xff, 0xa2, 0x00, 0x06, 0xff, 0xf5, 0x00
+ ,0x07, 0xff, 0xff, 0xff, 0xfe, 0x40, 0x06, 0xff, 0xff, 0xdc, 0xef, 0xff, 0xa0, 0x00
+ ,0x00, 0x4c, 0xff, 0xff, 0x91, 0x00, 0x00, 0x5e, 0xff, 0xff, 0xff, 0xfa, 0x00, 0x00
+ ,0x00, 0x00, 0x24, 0x30, 0x00, 0x00, 0x00, 0x01, 0x8e, 0xff, 0xfb, 0x40, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ //,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ //
+// ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x02, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x01, 0x7d, 0xff, 0xff, 0xea, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x40, 0x00
+ ,0x00, 0x6e, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x6f, 0xe2, 0x00
+ ,0x08, 0xff, 0xff, 0xb9, 0x9b, 0xef, 0xff, 0xc0, 0x00, 0x00, 0x00, 0xbf, 0xfa, 0x00
+ ,0x4f, 0xff, 0x70, 0x00, 0x00, 0x05, 0xef, 0xf8, 0x00, 0x00, 0x00, 0x0c, 0xff, 0x10
+ ,0xdf, 0xf3, 0x00, 0x00, 0x00, 0x00, 0x1e, 0xff, 0x10, 0x00, 0x00, 0x06, 0xff, 0x50
+ ,0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0x50, 0x00, 0x00, 0x04, 0xff, 0x60
+ ,0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0x70, 0x00, 0x00, 0x04, 0xff, 0x60
+ ,0xff, 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0x70, 0x00, 0x00, 0x07, 0xff, 0x40
+ ,0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0x40, 0x00, 0x00, 0x0d, 0xfe, 0x00
+ ,0xef, 0xe2, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xfd, 0x00, 0x00, 0x00, 0x9f, 0xf8, 0x00
+ ,0x7f, 0xfd, 0x30, 0x00, 0x00, 0x00, 0x7f, 0xf4, 0x00, 0x00, 0x1a, 0xff, 0xd1, 0x00
+ ,0x0b, 0xff, 0xfb, 0x52, 0x00, 0x08, 0xff, 0x60, 0x13, 0x6a, 0xff, 0xfe, 0x20, 0x00
+ ,0x00, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xc2, 0x00, 0x00
+ ,0x00, 0x04, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc5, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x02, 0x69, 0xcd, 0xef, 0xff, 0xed, 0xb9, 0x62, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+// ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ };
+
+#if 0
+#pragma romdata font_incon_42 = 0x0E000
+ rom const rom unsigned char incon42[] =
+ {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x03, 0x7a, 0xcd, 0xee, 0xdc, 0xa8, 0x40, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x18, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x92, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x07, 0xef, 0xff, 0xff, 0xdc, 0xbb, 0xce, 0xff, 0xff, 0xff, 0x91, 0x00, 0x00
+ ,0x00, 0x00, 0xbf, 0xff, 0xc7, 0x20, 0x00, 0x00, 0x00, 0x1c, 0xff, 0xff, 0xfd, 0x20, 0x00
+ ,0x00, 0x0b, 0xff, 0xc4, 0x00, 0x00, 0x00, 0x00, 0x02, 0xcf, 0xfc, 0x6e, 0xff, 0xd1, 0x00
+ ,0x00, 0x7f, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5e, 0xff, 0x90, 0x01, 0xbf, 0xfa, 0x00
+ ,0x00, 0xef, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x09, 0xff, 0xe5, 0x00, 0x00, 0x0d, 0xff, 0x20
+ ,0x03, 0xff, 0x60, 0x00, 0x00, 0x00, 0x02, 0xcf, 0xfc, 0x20, 0x00, 0x00, 0x05, 0xff, 0x60
+ ,0x04, 0xff, 0x40, 0x00, 0x00, 0x00, 0x5e, 0xff, 0x90, 0x00, 0x00, 0x00, 0x03, 0xff, 0x70
+ ,0x02, 0xff, 0x80, 0x00, 0x00, 0x08, 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0x50
+ ,0x00, 0xcf, 0xf3, 0x00, 0x01, 0xcf, 0xfd, 0x30, 0x00, 0x00, 0x00, 0x00, 0x1d, 0xff, 0x10
+ ,0x00, 0x4f, 0xfe, 0x50, 0x4e, 0xff, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x01, 0xcf, 0xf8, 0x00
+ ,0x00, 0x07, 0xff, 0xfd, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x01, 0x7e, 0xff, 0xb0, 0x00
+ ,0x00, 0x00, 0x5e, 0xff, 0xff, 0xd8, 0x54, 0x33, 0x34, 0x58, 0xbf, 0xff, 0xfa, 0x00, 0x00
+ ,0x00, 0x00, 0x01, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x50, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x01, 0x7b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe9, 0x40, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x46, 0x77, 0x65, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x1f, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x44, 0x00
+ ,0x00, 0x00, 0x9f, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0x00
+ ,0x00, 0x02, 0xff, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0x00
+ ,0x00, 0x0a, 0xff, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0x00
+ ,0x00, 0x3f, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0x00
+ ,0x00, 0xbf, 0xfc, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x79, 0xff, 0x00
+ ,0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00
+ ,0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00
+ ,0x00, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x36, 0xff, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xcc, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x08, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0xff, 0x00
+ ,0x00, 0x00, 0xbf, 0xd1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xff, 0x00
+ ,0x00, 0x0a, 0xff, 0xb3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xdf, 0xff, 0xff, 0x00
+ ,0x00, 0x4f, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6f, 0xff, 0xdb, 0xff, 0x00
+ ,0x00, 0xcf, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xf8, 0x08, 0xff, 0x00
+ ,0x01, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9f, 0xfe, 0x40, 0x08, 0xff, 0x00
+ ,0x04, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0xff, 0xd2, 0x00, 0x08, 0xff, 0x00
+ ,0x04, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9f, 0xfd, 0x10, 0x00, 0x08, 0xff, 0x00
+ ,0x03, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xd1, 0x00, 0x00, 0x08, 0xff, 0x00
+ ,0x00, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x8f, 0xfe, 0x20, 0x00, 0x00, 0x08, 0xff, 0x00
+ ,0x00, 0x9f, 0xfa, 0x00, 0x00, 0x00, 0x1a, 0xff, 0xe2, 0x00, 0x00, 0x00, 0x08, 0xff, 0x00
+ ,0x00, 0x2e, 0xff, 0xd6, 0x21, 0x38, 0xef, 0xfd, 0x20, 0x00, 0x00, 0x00, 0x08, 0xff, 0x00
+ ,0x00, 0x04, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0x00
+ ,0x00, 0x00, 0x3d, 0xff, 0xff, 0xff, 0xe7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0x00
+ ,0x00, 0x00, 0x00, 0x59, 0xbb, 0x95, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5e, 0x30, 0x00
+ ,0x00, 0x04, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xd0, 0x00
+ ,0x00, 0x1e, 0xfe, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xdf, 0xf8, 0x00
+ ,0x00, 0x7f, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xfe, 0x00
+ ,0x00, 0xdf, 0xc0, 0x00, 0x00, 0x00, 0x07, 0x95, 0x00, 0x00, 0x00, 0x00, 0x09, 0xff, 0x30
+ ,0x01, 0xff, 0x70, 0x00, 0x00, 0x00, 0x0c, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0x60
+ ,0x03, 0xff, 0x50, 0x00, 0x00, 0x00, 0x0e, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0x70
+ ,0x03, 0xff, 0x60, 0x00, 0x00, 0x00, 0x2f, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0x60
+ ,0x01, 0xff, 0xb0, 0x00, 0x00, 0x00, 0x7f, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x09, 0xff, 0x30
+ ,0x00, 0xbf, 0xf4, 0x00, 0x00, 0x02, 0xef, 0xff, 0x70, 0x00, 0x00, 0x00, 0x2f, 0xfe, 0x00
+ ,0x00, 0x4f, 0xfe, 0x60, 0x00, 0x5e, 0xfd, 0xbf, 0xf5, 0x00, 0x00, 0x03, 0xef, 0xf7, 0x00
+ ,0x00, 0x09, 0xff, 0xff, 0xdf, 0xff, 0xf3, 0x2f, 0xff, 0xb6, 0x56, 0xbf, 0xff, 0xc0, 0x00
+ ,0x00, 0x00, 0x8f, 0xff, 0xff, 0xfe, 0x40, 0x04, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x00
+ ,0x00, 0x00, 0x02, 0x8c, 0xdb, 0x71, 0x00, 0x00, 0x2b, 0xff, 0xff, 0xfe, 0x80, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x66, 0x30, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xef, 0xc0, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xaf, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5e, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0xff, 0xd4, 0xcf, 0xc0, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xef, 0xf8, 0x00, 0xcf, 0xc0, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x02, 0xbf, 0xfc, 0x30, 0x00, 0xcf, 0xc0, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0x70, 0x00, 0x00, 0xcf, 0xc0, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x2c, 0xff, 0xb2, 0x00, 0x00, 0x00, 0xcf, 0xc0, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x07, 0xff, 0xe6, 0x00, 0x00, 0x00, 0x00, 0xcf, 0xc0, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x03, 0xcf, 0xfa, 0x10, 0x00, 0x00, 0x00, 0x00, 0xcf, 0xc0, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x8f, 0xff, 0xea, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xef, 0xea, 0xaa, 0xaa, 0xaa, 0x00
+ ,0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00
+ ,0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00
+ ,0x00, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0xdf, 0xd4, 0x44, 0x44, 0x44, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcf, 0xc0, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcf, 0xc0, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79, 0x70, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x12, 0x34, 0x56, 0x72, 0x00, 0x00, 0x00, 0x03, 0xf8, 0x00, 0x00
+ ,0x01, 0xab, 0xcd, 0xef, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x1e, 0xff, 0x80, 0x00
+ ,0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x00, 0x00, 0x00, 0x28, 0xff, 0xf3, 0x00
+ ,0x02, 0xff, 0xda, 0xa9, 0x87, 0x67, 0xff, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xfb, 0x00
+ ,0x02, 0xff, 0x70, 0x00, 0x00, 0x06, 0xff, 0x10, 0x00, 0x00, 0x00, 0x00, 0x0c, 0xff, 0x10
+ ,0x02, 0xff, 0x70, 0x00, 0x00, 0x0b, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xff, 0x50
+ ,0x02, 0xff, 0x70, 0x00, 0x00, 0x0d, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x70
+ ,0x02, 0xff, 0x70, 0x00, 0x00, 0x0e, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x70
+ ,0x02, 0xff, 0x70, 0x00, 0x00, 0x0e, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0x60
+ ,0x02, 0xff, 0x70, 0x00, 0x00, 0x0b, 0xfe, 0x10, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xff, 0x30
+ ,0x02, 0xff, 0x70, 0x00, 0x00, 0x06, 0xff, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x6f, 0xfd, 0x00
+ ,0x02, 0xff, 0x70, 0x00, 0x00, 0x00, 0xdf, 0xfd, 0x40, 0x00, 0x00, 0x29, 0xff, 0xf5, 0x00
+ ,0x02, 0xff, 0x70, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xfe, 0xba, 0xbd, 0xff, 0xff, 0x90, 0x00
+ ,0x02, 0xff, 0x70, 0x00, 0x00, 0x00, 0x03, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00
+ ,0x01, 0x55, 0x20, 0x00, 0x00, 0x00, 0x00, 0x07, 0xdf, 0xff, 0xff, 0xea, 0x30, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x34, 0x42, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x33, 0x33, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x49, 0xce, 0xff, 0xff, 0xff, 0xff, 0xeb, 0x71, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x00, 0x00
+ ,0x00, 0x00, 0x3d, 0xff, 0xff, 0xfc, 0xba, 0xff, 0xfb, 0xab, 0xef, 0xff, 0xfd, 0x20, 0x00
+ ,0x00, 0x04, 0xff, 0xfe, 0x83, 0x00, 0x1c, 0xfd, 0x20, 0x00, 0x02, 0x8e, 0xff, 0xd1, 0x00
+ ,0x00, 0x1e, 0xff, 0x90, 0x00, 0x00, 0xbf, 0xe1, 0x00, 0x00, 0x00, 0x01, 0xcf, 0xf9, 0x00
+ ,0x00, 0xaf, 0xf7, 0x00, 0x00, 0x05, 0xff, 0x50, 0x00, 0x00, 0x00, 0x00, 0x1d, 0xff, 0x10
+ ,0x01, 0xff, 0xb0, 0x00, 0x00, 0x0a, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0x50
+ ,0x04, 0xff, 0x50, 0x00, 0x00, 0x0d, 0xfb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x70
+ ,0x06, 0xff, 0x20, 0x00, 0x00, 0x0d, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0x60
+ ,0x06, 0xff, 0x30, 0x00, 0x00, 0x0a, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0x30
+ ,0x03, 0xff, 0x70, 0x00, 0x00, 0x05, 0xff, 0xc1, 0x00, 0x00, 0x00, 0x00, 0x4f, 0xfd, 0x00
+ ,0x00, 0xef, 0xe1, 0x00, 0x00, 0x00, 0xcf, 0xfd, 0x50, 0x00, 0x00, 0x28, 0xff, 0xf4, 0x00
+ ,0x00, 0x7f, 0xfd, 0x00, 0x00, 0x00, 0x2d, 0xff, 0xff, 0xdb, 0xcd, 0xff, 0xff, 0x70, 0x00
+ ,0x00, 0x0c, 0xd2, 0x00, 0x00, 0x00, 0x01, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xe5, 0x00, 0x00
+ ,0x00, 0x01, 0x10, 0x00, 0x00, 0x00, 0x00, 0x03, 0x9d, 0xff, 0xfe, 0xb6, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x02, 0xcc, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x02, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x02, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00
+ ,0x02, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0xef, 0x00
+ ,0x02, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x9e, 0xff, 0xff, 0x00
+ ,0x02, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0xdf, 0xff, 0xff, 0xfe, 0x00
+ ,0x02, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x01, 0x7d, 0xff, 0xff, 0xff, 0xd9, 0x40, 0x00
+ ,0x02, 0xff, 0x90, 0x00, 0x00, 0x00, 0x05, 0xbf, 0xff, 0xff, 0xfd, 0x83, 0x00, 0x00, 0x00
+ ,0x02, 0xff, 0x90, 0x00, 0x00, 0x39, 0xef, 0xff, 0xff, 0xe8, 0x30, 0x00, 0x00, 0x00, 0x00
+ ,0x02, 0xff, 0x90, 0x00, 0x6c, 0xff, 0xff, 0xfe, 0x94, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x02, 0xff, 0x92, 0x8e, 0xff, 0xff, 0xfb, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x02, 0xff, 0xef, 0xff, 0xff, 0xd7, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x02, 0xff, 0xff, 0xff, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x02, 0xff, 0xfd, 0x71, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x02, 0xba, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x67, 0x62, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x24, 0x42, 0x00, 0x00, 0x00, 0x04, 0xdf, 0xff, 0xff, 0xb2, 0x00, 0x00
+ ,0x00, 0x00, 0x3c, 0xff, 0xff, 0xc4, 0x00, 0x00, 0x8f, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x00
+ ,0x00, 0x05, 0xff, 0xff, 0xff, 0xff, 0x70, 0x08, 0xff, 0xfb, 0x77, 0xaf, 0xff, 0xe1, 0x00
+ ,0x00, 0x3f, 0xff, 0xa7, 0x8d, 0xff, 0xf6, 0x4f, 0xfc, 0x20, 0x00, 0x02, 0xdf, 0xf9, 0x00
+ ,0x00, 0xbf, 0xe3, 0x00, 0x00, 0x8f, 0xfe, 0xdf, 0xb0, 0x00, 0x00, 0x00, 0x2e, 0xff, 0x00
+ ,0x01, 0xff, 0x60, 0x00, 0x00, 0x08, 0xff, 0xfe, 0x10, 0x00, 0x00, 0x00, 0x08, 0xff, 0x40
+ ,0x05, 0xff, 0x10, 0x00, 0x00, 0x00, 0xcf, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0x60
+ ,0x06, 0xff, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0x60
+ ,0x06, 0xff, 0x20, 0x00, 0x00, 0x00, 0x5f, 0xff, 0x10, 0x00, 0x00, 0x00, 0x05, 0xff, 0x50
+ ,0x03, 0xff, 0x80, 0x00, 0x00, 0x03, 0xef, 0xff, 0xa0, 0x00, 0x00, 0x00, 0x0a, 0xff, 0x20
+ ,0x00, 0xdf, 0xf6, 0x00, 0x00, 0x5e, 0xfc, 0xcf, 0xf8, 0x00, 0x00, 0x00, 0x4f, 0xfd, 0x00
+ ,0x00, 0x4f, 0xff, 0xc8, 0x9d, 0xff, 0xf3, 0x3f, 0xff, 0xa2, 0x00, 0x06, 0xff, 0xf5, 0x00
+ ,0x00, 0x07, 0xff, 0xff, 0xff, 0xfe, 0x40, 0x06, 0xff, 0xff, 0xdc, 0xef, 0xff, 0xa0, 0x00
+ ,0x00, 0x00, 0x4c, 0xff, 0xff, 0x91, 0x00, 0x00, 0x5e, 0xff, 0xff, 0xff, 0xfa, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x24, 0x30, 0x00, 0x00, 0x00, 0x01, 0x8e, 0xff, 0xfb, 0x40, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x02, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x01, 0x7d, 0xff, 0xff, 0xea, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x40, 0x00
+ ,0x00, 0x00, 0x6e, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x6f, 0xe2, 0x00
+ ,0x00, 0x08, 0xff, 0xff, 0xb9, 0x9b, 0xef, 0xff, 0xc0, 0x00, 0x00, 0x00, 0xbf, 0xfa, 0x00
+ ,0x00, 0x4f, 0xff, 0x70, 0x00, 0x00, 0x05, 0xef, 0xf8, 0x00, 0x00, 0x00, 0x0c, 0xff, 0x10
+ ,0x00, 0xdf, 0xf3, 0x00, 0x00, 0x00, 0x00, 0x1e, 0xff, 0x10, 0x00, 0x00, 0x06, 0xff, 0x50
+ ,0x03, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0x50, 0x00, 0x00, 0x04, 0xff, 0x60
+ ,0x05, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0x70, 0x00, 0x00, 0x04, 0xff, 0x60
+ ,0x06, 0xff, 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0x70, 0x00, 0x00, 0x07, 0xff, 0x40
+ ,0x04, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0x40, 0x00, 0x00, 0x0d, 0xfe, 0x00
+ ,0x00, 0xef, 0xe2, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xfd, 0x00, 0x00, 0x00, 0x9f, 0xf8, 0x00
+ ,0x00, 0x7f, 0xfd, 0x30, 0x00, 0x00, 0x00, 0x7f, 0xf4, 0x00, 0x00, 0x1a, 0xff, 0xd1, 0x00
+ ,0x00, 0x0b, 0xff, 0xfb, 0x52, 0x00, 0x08, 0xff, 0x60, 0x13, 0x6a, 0xff, 0xfe, 0x20, 0x00
+ ,0x00, 0x00, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xc2, 0x00, 0x00
+ ,0x00, 0x00, 0x04, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc5, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x02, 0x69, 0xcd, 0xef, 0xff, 0xed, 0xb9, 0x62, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ };
+#endif
+
+// **********************
+// **********************
+// ** THE JUMP-IN CODE **
+// ** for the asm code **
+// **********************
+// **********************
+#pragma code main_calc_hauptroutine = 0x10000
+void main_calc_hauptroutine(void)
+{
+calc_hauptroutine();
+int_O_desaturation_time = 65535;
+} // divemode
+#pragma code main_without_deco = 0x10020
+void main_calc_without_deco(void)
+{
+calc_without_deco();
+calc_desaturation_time();
+}
+
+#pragma code main_clear_CNS_fraction = 0x10030
+void main_clear_CNS_fraction(void)
+{
+clear_CNS_fraction();
+}
+
+#pragma code main_calc_CNS_decrease_15min = 0x10034
+void main_calc_CNS_decrease_15min(void)
+{
+calc_CNS_decrease_15min();
+}
+
+#pragma code main_calc_percentage = 0x10038
+void main_calc_percentage (void)
+{
+calc_percentage();
+}
+
+#pragma code main_clear_tissue = 0x10040
+void main_clear_tissue(void)
+{
+clear_tissue();
+char_I_depth_last_deco = 0; // for compatibility with v.101pre_no_last_deco
+}
+
+#pragma code main_calc_CNS_fraction = 0x10050
+void main_calc_CNS_fraction(void)
+{
+calc_CNS_fraction();
+}
+
+#pragma code main_calc_desaturation_time = 0x10060
+void main_calc_desaturation_time(void)
+{
+calc_desaturation_time();
+}
+
+#pragma code main_calc_wo_deco_step_1_min = 0x10080
+void main_calc_wo_deco_step_1_min(void)
+{
+calc_wo_deco_step_1_min();
+char_O_deco_status = 3; // surface new in v.102 overwrites value of calc_wo_deco_step_1_min
+calc_desaturation_time();
+} // surface mode
+
+#pragma code main_debug = 0x100A0
+void main_debug(void)
+{
+//debug();
+}
+
+#pragma code main_DD2_write_incon42 = 0x100B0
+void main_DD2_write_incon42(void)
+{
+ DD2_write_incon42();
+}
+
+#pragma code main_DD2_write_incon24 = 0x100B4
+void main_DD2_write_incon24(void)
+{
+ DD2_write_incon24();
+}
+
+#pragma code main_gradient_array = 0x100C0
+void main_gradient_array(void)
+{
+calc_gradient_array_only();
+}
+#pragma code main_push_tissues = 0x100C4
+void main_push_tissues_to_vault(void)
+{
+ push_tissues_to_vault();
+}
+#pragma code main_pull_tissues = 0x100C8
+void main_pull_tissues_from_vault(void)
+{
+ pull_tissues_from_vault();
+}
+
+#pragma code main_hash = 0x100E0
+void main_hash(void)
+{
+hash();
+}
+
+// ***********************
+// ***********************
+// ** THE LOOKUP TABLES **
+// ***********************
+// ***********************
+
+#pragma romdata tables = 0x10200
+#include // new table for deco_main_v.101 (var_a modified)
+
+#pragma romdata tables2 = 0x10600
+rom const rom unsigned int md_pi[] =
+{
+ 0x292E, 0x43C9, 0xA2D8, 0x7C01, 0x3D36, 0x54A1, 0xECF0, 0x0613
+ , 0x62A7, 0x05F3, 0xC0C7, 0x738C, 0x9893, 0x2BD9, 0xBC4C, 0x82CA
+ , 0x1E9B, 0x573C, 0xFDD4, 0xE016, 0x6742, 0x6F18, 0x8A17, 0xE512
+ , 0xBE4E, 0xC4D6, 0xDA9E, 0xDE49, 0xA0FB, 0xF58E, 0xBB2F, 0xEE7A
+ , 0xA968, 0x7991, 0x15B2, 0x073F, 0x94C2, 0x1089, 0x0B22, 0x5F21
+ , 0x807F, 0x5D9A, 0x5A90, 0x3227, 0x353E, 0xCCE7, 0xBFF7, 0x9703
+ , 0xFF19, 0x30B3, 0x48A5, 0xB5D1, 0xD75E, 0x922A, 0xAC56, 0xAAC6
+ , 0x4FB8, 0x38D2, 0x96A4, 0x7DB6, 0x76FC, 0x6BE2, 0x9C74, 0x04F1
+ , 0x459D, 0x7059, 0x6471, 0x8720, 0x865B, 0xCF65, 0xE62D, 0xA802
+ , 0x1B60, 0x25AD, 0xAEB0, 0xB9F6, 0x1C46, 0x6169, 0x3440, 0x7E0F
+ , 0x5547, 0xA323, 0xDD51, 0xAF3A, 0xC35C, 0xF9CE, 0xBAC5, 0xEA26
+ , 0x2C53, 0x0D6E, 0x8528, 0x8409, 0xD3DF, 0xCDF4, 0x4181, 0x4D52
+ , 0x6ADC, 0x37C8, 0x6CC1, 0xABFA, 0x24E1, 0x7B08, 0x0CBD, 0xB14A
+ , 0x7888, 0x958B, 0xE363, 0xE86D, 0xE9CB, 0xD5FE, 0x3B00, 0x1D39
+ , 0xF2EF, 0xB70E, 0x6658, 0xD0E4, 0xA677, 0x72F8, 0xEB75, 0x4B0A
+ , 0x3144, 0x50B4, 0x8FED, 0x1F1A, 0xDB99, 0x8D33, 0x9F11, 0x8314
+};
+
+// *********************
+// *********************
+// ** THE SUBROUTINES **
+// *********************
+// *********************
+
+#pragma code subroutines = 0x10700 // can be adapted to fit the romdata tables ahead
+
+
+// ---------------
+// CLEAR tissue //
+// ---------------
+// optimized in v.101 (var_a)
+
+void clear_tissue(void) // preload tissues with standard pressure for the given ambient pressure
+{
+
+ flag_in_divemode = 0;
+ int_O_DBS_bitfield = 0;
+ int_O_DBS2_bitfield = 0;
+ int_O_DBG_pre_bitfield = 0;
+ int_O_DBG_post_bitfield = 0;
+ char_O_NDL_at_20mtr = 255;
+
+_asm
+lfsr 1, 0x300 // C math routines shall use this variable bank
+movlw 0x01
+movwf TBLPTRU,0
+_endasm
+
+// N2_ratio = (float)char_I_N2_ratio; // the 0.0002 of 0.7902 are missing with standard air
+ N2_ratio = 0.7902; // N2_ratio / 100.0;
+ pres_respiration = (float)int_I_pres_respiration / 1000.0;
+for (ci=0;ci<16;ci++) // cycle through the 16 b"uhlmann tissues
+{
+ pres_tissue[ci] = N2_ratio * (pres_respiration - 0.0627) ;
+_asm
+movlw 0x02
+movwf TBLPTRH,0
+movlb 4 // fuer ci
+movf ci,0,1
+addwf ci,0,1
+addwf ci,0,1
+addwf ci,0,1
+addlw 0x80
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var_a+1
+TBLRDPOSTINC
+movff TABLAT,var_a
+TBLRDPOSTINC
+movff TABLAT,var_a+3
+TBLRD
+movff TABLAT,var_a+2
+addlw 0x80
+movwf TBLPTRL,0
+incf TBLPTRH,1,0
+TBLRDPOSTINC
+movff TABLAT,var_b+1
+TBLRDPOSTINC
+movff TABLAT,var_b
+TBLRDPOSTINC
+movff TABLAT,var_b+3
+TBLRD
+movff TABLAT,var_b+2
+_endasm
+
+pres_tissue_limit[ci] = (pres_tissue[ci] - var_a) * var_b ;
+// now update the guiding tissue
+if (pres_tissue_limit[ci] < 0)
+pres_tissue_limit[ci] = 0;
+} // for 0 to 16
+
+for (ci=16;ci<32;ci++) // cycle through the 16 b"uhlmann tissues for Helium
+{
+ pres_tissue[ci] = 0.0;
+} // for
+
+ clear_decoarray();
+ char_O_deco_status = 0;
+ char_O_nullzeit = 0;
+ char_O_ascenttime = 0;
+ char_O_gradient_factor = 0;
+ char_O_relative_gradient_GF = 0;
+} // clear_tissue(void)
+
+
+// --------------------
+// calc_without_deco //
+// fixed N2_ratio ! //
+// --------------------
+// optimized in v.101 (float_..saturation_multiplier)
+
+void calc_without_deco(void)
+{
+_asm
+ lfsr 1, 0x300
+_endasm
+ N2_ratio = 0.7902; // FIXED RATIO !! sum as stated in b"uhlmann
+ pres_respiration = (float)int_I_pres_respiration / 1000.0; // assembler code uses different digit system
+ pres_surface = (float)int_I_pres_surface / 1000.0;
+ temp_atem = N2_ratio * (pres_respiration - 0.0627); // 0.0627 is the extra pressure in the body
+ temp2_atem = 0.0;
+ temp_surface = pres_surface; // the b"uhlmann formula using temp_surface does apply to the pressure without any inert ratio
+ float_desaturation_multiplier = char_I_desaturation_multiplier / 100.0;
+ float_saturation_multiplier = char_I_saturation_multiplier / 100.0;
+
+ calc_tissue(); // update the pressure in the 16 tissues in accordance with the new ambient pressure
+
+ clear_decoarray();
+ char_O_deco_status = 0;
+ char_O_nullzeit = 0;
+ char_O_ascenttime = 0;
+ calc_gradient_factor();
+
+} // calc_without_deco
+
+
+// --------------------
+// calc_hauptroutine //
+// --------------------
+// this is the major code in dive mode
+// calculates:
+// the tissues,
+// the bottom time
+// and simulates the ascend with all deco stops
+
+void calc_hauptroutine(void)
+{
+ calc_hauptroutine_data_input();
+
+ if(!flag_in_divemode)
+ {
+ flag_in_divemode = 1;
+ create_dbs_set_dbg_and_ndl20mtr();
+ }
+ else
+ check_pre_dbg();
+
+ calc_hauptroutine_update_tissues();
+ calc_gradient_factor();
+
+
+ switch (char_O_deco_status) // toggle between calculation for nullzeit (bottom time), deco stops and more deco stops (continue)
+ {
+ case 0:
+ update_startvalues();
+ calc_nullzeit();
+ check_ndl();
+ char_O_deco_status = 255; // calc deco next time
+ break;
+ case 1:
+ if (char_O_deco_status == 3)
+ break;
+ char_O_deco_status = 0;
+// char_O_lock_depth_list = 255;
+ calc_hauptroutine_calc_deco();
+// build_debug_output();
+ break;
+ case 3: // new dive
+ clear_decoarray();
+ clear_internal_deco_table_GF();
+ copy_deco_table_GF();
+ internal_deco_pointer = 0;
+ lock_GF_depth_list = 0;
+ update_startvalues();
+ calc_nextdecodepth_GF();
+ char_O_deco_status = 0;
+ break;
+ default:
+ update_startvalues();
+ clear_decoarray();
+ clear_internal_deco_table_GF();
+ output[6] = 1;
+ calc_hauptroutine_calc_ascend_to_deco();
+ if (char_O_deco_status > 15) // can't go up to first deco, too deep to calculate in the given time slot
+ {
+ char_O_deco_status = 2;
+// char_O_lock_depth_list = 255;
+ }
+ else
+ {
+// char_O_lock_depth_list = lock_GF_depth_list;
+ calc_hauptroutine_calc_deco();
+ }
+// build_debug_output();
+ break;
+ }
+ calc_ascenttime();
+ check_post_dbg();
+}
+
+void calc_hauptroutine_data_input(void)
+{
+ pres_respiration = (float)int_I_pres_respiration / 1000.0;
+ pres_surface = (float)int_I_pres_surface / 1000.0;
+
+ N2_ratio = (float)char_I_N2_ratio / 100.0;; // the 0.0002 of 0.7902 are missing with standard air
+ He_ratio = (float)char_I_He_ratio / 100.0;;
+ deco_N2_ratio = (float)char_I_deco_N2_ratio / 100.0;
+ deco_He_ratio = (float)char_I_deco_He_ratio / 100.0;
+ float_deco_distance = (float)char_I_deco_distance / 100.0;
+ if(char_I_deco_gas_change)
+ {
+ deco_gas_change = (float)char_I_deco_gas_change / 9.995 + pres_surface;
+ deco_gas_change = deco_gas_change + float_deco_distance;
+ }
+ else
+ deco_gas_change = 0;
+ const_ppO2 = (float)char_I_const_ppO2 / 100.0;
+ deco_ppO2_change = (float)char_I_deco_ppO2_change / 99.95 + pres_surface;
+ deco_ppO2_change = deco_ppO2_change + float_deco_distance;
+ deco_ppO2 = (float)char_I_deco_ppO2 / 100.0;
+ float_desaturation_multiplier = char_I_desaturation_multiplier / 100.0;
+ float_saturation_multiplier = char_I_saturation_multiplier / 100.0;
+ GF_low = (float)char_I_GF_Low_percentage / 100.0;
+ GF_high = (float)char_I_GF_High_percentage / 100.0;
+ GF_delta = GF_high - GF_low;
+
+ temp2 = (pres_respiration - pres_surface) / 0.29985;
+ int_temp = (int)(temp2);
+ if (int_temp < 0)
+ int_temp = 0;
+ if (int_temp > 255)
+ int_temp = 255;
+ char_O_actual_pointer = int_temp;
+
+ temp_depth_last_deco = (int)char_I_depth_last_deco;
+}
+
+void calc_hauptroutine_update_tissues(void)
+{
+ int_O_calc_tissue_call_counter = int_O_calc_tissue_call_counter + 1;
+ if (char_I_const_ppO2 == 0) // new in v.101
+ pres_diluent = pres_respiration; // new in v.101
+ else // new in v.101
+ pres_diluent = ((pres_respiration - const_ppO2)/(N2_ratio + He_ratio)); // new in v.101
+ if (pres_diluent > pres_respiration) // new in v.101
+ pres_diluent = pres_respiration; // new in v.101
+ if (pres_diluent > 0.0627) // new in v.101
+ {
+ temp_atem = N2_ratio * (pres_diluent - 0.0627); // changed in v.101
+ temp2_atem = He_ratio * (pres_diluent - 0.0627); // changed in v.101
+ char_O_diluent = (char)(pres_diluent/pres_respiration*100.0);
+ }
+ else // new in v.101
+ {
+ temp_atem = 0.0; // new in v.101
+ temp2_atem = 0.0; // new in v.101
+ char_O_diluent = 0;
+ }
+ temp_surface = pres_surface;
+ calc_tissue();
+ int_O_gtissue_limit = (int)(pres_tissue_limit[char_O_gtissue_no] * 1000);
+ int_O_gtissue_press = (int)((pres_tissue[char_O_gtissue_no] + pres_tissue[char_O_gtissue_no+16]) * 1000);
+ if (char_I_deco_model == 1)
+ {
+ temp1 = temp1 * GF_high;
+ }
+ else
+ {
+ temp1 = temp_surface;
+ }
+ if (pres_gtissue_limit > temp1 && char_O_deco_status == 0) // if guiding tissue can not be exposed to surface pressure immediately
+ {
+ char_O_nullzeit = 0; // deco necessary
+ char_O_deco_status = 255; // calculate deco skip nullzeit calculation
+ }
+} // calc_hauptroutine_update_tissues
+void calc_hauptroutine_calc_deco(void)
+{
+ do
+ {
+ int_temp_decostatus = 0;
+ calc_nextdecodepth_GF();
+ if (temp_depth_limit > 0)
+ {
+ if (char_I_const_ppO2 == 0) // new in v.101
+ {
+ deco_diluent = temp_deco; // new in v.101
+ if (temp_deco > deco_gas_change)
+ {
+ calc_N2_ratio = N2_ratio;
+ calc_He_ratio = He_ratio;
+ }
+ else
+ {
+ calc_N2_ratio = deco_N2_ratio;
+ calc_He_ratio = deco_He_ratio;
+ }
+ }
+ else // new in v.101
+ {
+ calc_N2_ratio = N2_ratio;
+ calc_He_ratio = He_ratio;
+ if (temp_deco > deco_ppO2_change)
+ {
+ deco_diluent = ((temp_deco - const_ppO2)/(N2_ratio + He_ratio)); // new in v.101
+ }
+ else
+ {
+ deco_diluent = ((temp_deco - deco_ppO2)/(N2_ratio + He_ratio)); // new in v.101
+ }
+ }
+ if (deco_diluent > temp_deco) // new in v.101
+ deco_diluent = temp_deco; // new in v.101
+ if (deco_diluent > 0.0627) // new in v.101
+ {
+ temp_atem = calc_N2_ratio * (deco_diluent - 0.0627); // changed in v.101
+ temp2_atem = calc_He_ratio * (deco_diluent - 0.0627); // changed in v.101
+ }
+ else // new in v.101
+ {
+ temp_atem = 0.0; // new in v.101
+ temp2_atem = 0.0; // new in v.101
+ }
+ sim_tissue_1min();
+ update_internal_deco_table_GF();
+ temp_decotime = 1;
+ update_decoarray();
+ char_O_deco_status = char_O_deco_status + 1;
+ if (char_O_deco_status < 16)
+ int_temp_decostatus = 1;
+ }
+ else // if (temp_depth_limit > 0)
+ {
+ char_O_deco_status = 0;
+ }
+ } while (int_temp_decostatus == 1);
+ if (char_O_deco_status > 15)
+ {
+ char_O_deco_status = 1;
+ }
+ else
+ {
+ copy_deco_table_GF();
+ char_O_deco_status = 0;
+ }
+}
+
+void calc_hauptroutine_calc_ascend_to_deco(void)
+{
+ update_startvalues();
+ char_O_deco_status = 0;
+ temp_deco = pres_respiration;
+ lock_GF_depth_list = 1; // new in v.102
+ do // go up to first deco
+ {
+ int_temp_decostatus = 0;
+ temp_deco = temp_deco - 1.0;
+ if ( char_I_deco_model == 1) // new in v.102 , 4 = deep stops
+ temp_limit = temp_pres_gtissue_limit_GF_low;
+ else
+ temp_limit = temp_pres_gtissue_limit;
+ if ((temp_deco > temp_limit) && (temp_deco > pres_surface)) // changes in v.102
+ {
+ lock_GF_depth_list = 0; // new in v.102, distance to first stop > 10 mtr.
+ output[6] = 0;
+ if (char_I_const_ppO2 == 0) // new in v.101 // calculate at half of the ascent
+ {
+ deco_diluent = temp_deco + 0.5; // new in v.101
+ if (temp_deco + 0.5 > deco_gas_change)
+ {
+ calc_N2_ratio = N2_ratio;
+ calc_He_ratio = He_ratio;
+ }
+ else
+ {
+ calc_N2_ratio = deco_N2_ratio;
+ calc_He_ratio = deco_He_ratio;
+ }
+ }
+ else // new in v.101
+ {
+ calc_N2_ratio = N2_ratio;
+ calc_He_ratio = He_ratio;
+ if (temp_deco + 0.5 > deco_ppO2_change)
+ deco_diluent = ((temp_deco + 0.5 - const_ppO2)/(N2_ratio + He_ratio)); // new in v.101 // calculate at half of the ascent
+ else
+ deco_diluent = ((temp_deco + 0.5 - deco_ppO2)/(N2_ratio + He_ratio)); // new in v.101 // calculate at half of the ascent
+ if (deco_diluent > (temp_deco +0.5)) // new in v.101
+ deco_diluent = temp_deco + 0.5; // new in v.101 // calculate at half of the ascent
+ }
+ if (deco_diluent > 0.0627) // new in v.101
+ {
+ temp_atem = calc_N2_ratio * (deco_diluent - 0.0627); // changed in v.101
+ temp2_atem = calc_He_ratio * (deco_diluent - 0.0627); // changed in v.101
+ }
+ else // new in v.101
+ {
+ temp_atem = 0.0; // new in v.101
+ temp2_atem = 0.0; // new in v.101
+ }
+ sim_tissue_1min();
+ char_O_deco_status = char_O_deco_status + 1;
+ if (char_O_deco_status < 16) // 16 is the limit of calculations for one time slot
+ int_temp_decostatus = 1;
+ }
+ } while (int_temp_decostatus == 1);
+} // calc_hauptroutine_calc_ascend_to_deco
+
+// --------------
+// calc_tissue //
+// --------------
+// optimized in v.101
+
+void calc_tissue(void)
+{
+_asm
+lfsr 1, 0x300
+movlw 0x01
+movwf TBLPTRU,0
+_endasm
+
+ char_O_gtissue_no = 255;
+ pres_gtissue_limit = 0.0;
+
+for (ci=0;ci<16;ci++)
+{
+_asm
+movlw 0x02
+movwf TBLPTRH,0
+movlb 4 // fuer ci
+movf ci,0,1
+addwf ci,0,1
+addwf ci,0,1
+addwf ci,0,1
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var_e2secs+1 // the order is confussing
+TBLRDPOSTINC
+movff TABLAT,var_e2secs // low byte first, high afterwards
+TBLRDPOSTINC
+movff TABLAT,var_e2secs+3
+TBLRD
+movff TABLAT,var_e2secs+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var2_e2secs+1
+TBLRDPOSTINC
+movff TABLAT,var2_e2secs
+TBLRDPOSTINC
+movff TABLAT,var2_e2secs+3
+TBLRD
+movff TABLAT,var2_e2secs+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var_a+1
+TBLRDPOSTINC
+movff TABLAT,var_a
+TBLRDPOSTINC
+movff TABLAT,var_a+3
+TBLRD
+movff TABLAT,var_a+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var2_a+1
+TBLRDPOSTINC
+movff TABLAT,var2_a
+TBLRDPOSTINC
+movff TABLAT,var2_a+3
+TBLRD
+movff TABLAT,var2_a+2
+addlw 0x40
+movwf TBLPTRL,0
+incf TBLPTRH,1,0
+TBLRDPOSTINC
+movff TABLAT,var_b+1
+TBLRDPOSTINC
+movff TABLAT,var_b
+TBLRDPOSTINC
+movff TABLAT,var_b+3
+TBLRD
+movff TABLAT,var_b+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var2_b+1
+TBLRDPOSTINC
+movff TABLAT,var2_b
+TBLRDPOSTINC
+movff TABLAT,var2_b+3
+TBLRD
+movff TABLAT,var2_b+2
+_endasm
+ // the start values are the previous end values // write new values in temp
+
+ if( (var_e2secs < 0.0000363)
+ || (var_e2secs > 0.00577)
+ || (var2_e2secs < 0.0000961)
+ || (var2_e2secs > 0.150)
+ || (var_a < 0.231)
+ || (var_a > 1.27)
+ || (var_b < 0.504)
+ || (var_b > 0.966)
+ || (var2_a < 0.510)
+ || (var2_a > 1.75)
+ || (var2_b < 0.423)
+ || (var2_b > 0.927)
+ )
+ int_O_DBG_pre_bitfield |= DBG_ZH16ERR;
+
+// N2
+ temp_tissue = (temp_atem - pres_tissue[ci]) * var_e2secs;
+ temp_tissue_safety();
+ pres_tissue[ci] = pres_tissue[ci] + temp_tissue;
+
+// He
+ temp_tissue = (temp2_atem - pres_tissue[ci+16]) * var2_e2secs;
+ temp_tissue_safety();
+ pres_tissue[ci+16] = pres_tissue[ci+16] + temp_tissue;
+
+ temp_tissue = pres_tissue[ci] + pres_tissue[ci+16];
+
+ var_a = (var_a * pres_tissue[ci] + var2_a * pres_tissue[ci+16]) / temp_tissue;
+ var_b = (var_b * pres_tissue[ci] + var2_b * pres_tissue[ci+16]) / temp_tissue;
+ pres_tissue_limit[ci] = (temp_tissue - var_a) * var_b;
+ if (pres_tissue_limit[ci] < 0)
+ pres_tissue_limit[ci] = 0;
+ if (pres_tissue_limit[ci] > pres_gtissue_limit)
+ {
+ pres_gtissue_limit = pres_tissue_limit[ci];
+ char_O_gtissue_no = ci;
+ }//if
+} // for
+}//calc_tissue(void)
+
+// ----------------
+// calc_nullzeit //
+// ----------------
+// calculates the remaining bottom time
+
+// unchanged in v.101
+
+void calc_nullzeit(void)
+{
+ char_O_nullzeit = 0;
+ int_temp = 1;
+ do
+ {
+ backup_sim_pres_tissue();
+ sim_tissue_10min();
+ char_O_nullzeit = char_O_nullzeit + 10;
+ int_temp = int_temp + 1;
+ if (char_I_deco_model == 1)
+ temp1 = GF_high * temp_pres_gtissue_diff + temp_pres_gtissue;
+ else
+ temp1 = temp_pres_gtissue_limit;
+ if (temp1 > temp_surface) // changed in v.102 , if guiding tissue can not be exposed to surface pressure immediately
+ int_temp = 255;
+ } while (int_temp < 17);
+ if (int_temp == 255)
+ {
+ restore_sim_pres_tissue();
+ char_O_nullzeit = char_O_nullzeit - 10;
+ } //if int_temp == 255]
+ int_temp = 1;
+ if (char_O_nullzeit < 60)
+ {
+ do
+ {
+ sim_tissue_1min();
+ char_O_nullzeit = char_O_nullzeit + 1;
+ int_temp = int_temp + 1; // new in v.102a
+ if (char_I_deco_model == 1)
+ temp1 = GF_high * temp_pres_gtissue_diff + temp_pres_gtissue;
+ else
+ temp1 = temp_pres_gtissue_limit;
+ if (temp1 > temp_surface) // changed in v.102 , if guiding tissue can not be exposed to surface pressure immediately
+ int_temp = 255;
+ } while (int_temp < 10);
+ if (int_temp == 255)
+ char_O_nullzeit = char_O_nullzeit - 1;
+ } // if char_O_nullzeit < 60
+} //calc_nullzeit
+
+// -------------------------
+// backup_sim_pres_tissue //
+// -------------------------
+void backup_sim_pres_tissue(void)
+{
+ for (x = 0;x<16;x++)
+ {
+ sim_pres_tissue_backup[x] = sim_pres_tissue[x];
+ sim_pres_tissue_backup[x+16] = sim_pres_tissue[x+16];
+ }
+} // backup_sim
+
+// --------------------------
+// restore_sim_pres_tissue //
+// --------------------------
+void restore_sim_pres_tissue(void)
+{
+ for (x = 0;x<16;x++)
+ {
+ sim_pres_tissue[x] = sim_pres_tissue_backup[x];
+ sim_pres_tissue[x+16] = sim_pres_tissue_backup[x+16];
+ }
+} // restore_sim
+
+// ------------------
+// calc_ascenttime //
+// ------------------
+
+void calc_ascenttime(void)
+{
+if (pres_respiration > pres_surface)
+ {
+ switch (char_O_deco_status)
+ {
+ case 2:
+ char_O_ascenttime = 255;
+ break;
+ case 1:
+ break;
+ default:
+ temp1 = pres_respiration - pres_surface + 0.6; // + 0.6 hence 1 minute ascent time from a depth of 4 meter on
+ if (temp1 < 0)
+ temp1 = 0;
+ if (temp1 > 255)
+ temp1 = 255;
+ char_O_ascenttime = (char)temp1;
+
+ for(ci=0;ci<7;ci++)
+ {
+ x = char_O_ascenttime + char_O_array_decotime[ci];
+ if (x < char_O_ascenttime)
+ char_O_ascenttime = 255;
+ else
+ char_O_ascenttime = x;
+ }
+ }
+ }
+else
+ char_O_ascenttime = 0;
+} // calc_ascenttime()
+
+
+// ---------------------
+// update_startvalues //
+// ---------------------
+// updated in v.102
+
+void update_startvalues(void)
+{
+ temp_pres_gtissue_limit = pres_gtissue_limit;
+ temp_pres_gtissue = pres_tissue[char_O_gtissue_no] + pres_tissue[char_O_gtissue_no+16];
+ temp_pres_gtissue_diff = temp_pres_gtissue_limit - temp_pres_gtissue; // negative number
+ temp_pres_gtissue_limit_GF_low = GF_low * temp_pres_gtissue_diff + temp_pres_gtissue;
+ temp_pres_gtissue_limit_GF_low_below_surface = temp_pres_gtissue_limit_GF_low - pres_surface;
+ if (temp_pres_gtissue_limit_GF_low_below_surface < 0)
+ temp_pres_gtissue_limit_GF_low_below_surface = 0;
+
+ temp_gtissue_no = char_O_gtissue_no;
+ for (x = 0;x<16;x++)
+ {
+ sim_pres_tissue[x] = pres_tissue[x];
+ sim_pres_tissue[x+16] = pres_tissue[x+16];
+ sim_pres_tissue_limit[x] = pres_tissue_limit[x];
+ }
+} // update_startvalues
+
+
+// ------------------
+// sim_tissue_1min //
+// ------------------
+// optimized in v.101
+
+void sim_tissue_1min(void)
+{
+temp_pres_gtissue_limit = 0.0;
+temp_gtissue_no = 255;
+
+_asm
+lfsr 1, 0x300
+movlw 0x01
+movwf TBLPTRU,0
+_endasm
+
+
+for (ci=0;ci<16;ci++)
+{
+_asm
+movlw 0x02
+movwf TBLPTRH,0
+movlb 4 // fuer ci
+movf ci,0,1
+addwf ci,0,1
+addwf ci,0,1
+addwf ci,0,1
+addlw 0x80
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var_a+1
+TBLRDPOSTINC
+movff TABLAT,var_a
+TBLRDPOSTINC
+movff TABLAT,var_a+3
+TBLRD
+movff TABLAT,var_a+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var2_a+1
+TBLRDPOSTINC
+movff TABLAT,var2_a
+TBLRDPOSTINC
+movff TABLAT,var2_a+3
+TBLRD
+movff TABLAT,var2_a+2
+addlw 0x40
+movwf TBLPTRL,0
+incf TBLPTRH,1,0
+TBLRDPOSTINC
+movff TABLAT,var_b+1
+TBLRDPOSTINC
+movff TABLAT,var_b
+TBLRDPOSTINC
+movff TABLAT,var_b+3
+TBLRD
+movff TABLAT,var_b+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var2_b+1
+TBLRDPOSTINC
+movff TABLAT,var2_b
+TBLRDPOSTINC
+movff TABLAT,var2_b+3
+TBLRD
+movff TABLAT,var2_b+2
+addlw 0xC0
+movwf TBLPTRL,0
+incf TBLPTRH,1,0
+TBLRDPOSTINC
+movff TABLAT,var_e1min+1
+TBLRDPOSTINC
+movff TABLAT,var_e1min
+TBLRDPOSTINC
+movff TABLAT,var_e1min+3
+TBLRD
+movff TABLAT,var_e1min+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var2_e1min+1
+TBLRDPOSTINC
+movff TABLAT,var2_e1min
+TBLRDPOSTINC
+movff TABLAT,var2_e1min+3
+TBLRD
+movff TABLAT,var2_e1min+2
+_endasm
+// N2
+ temp_tissue = (temp_atem - sim_pres_tissue[ci]) * var_e1min;
+ temp_tissue_safety();
+ sim_pres_tissue[ci] = sim_pres_tissue[ci] + temp_tissue;
+// He
+ temp_tissue = (temp2_atem - sim_pres_tissue[ci+16]) * var2_e1min;
+ temp_tissue_safety();
+ sim_pres_tissue[ci+16] = sim_pres_tissue[ci+16] + temp_tissue;
+// pressure limit
+ temp_tissue = sim_pres_tissue[ci] + sim_pres_tissue[ci+16];
+ var_a = (var_a * sim_pres_tissue[ci] + var2_a * sim_pres_tissue[ci+16]) / temp_tissue;
+ var_b = (var_b * sim_pres_tissue[ci] + var2_b * sim_pres_tissue[ci+16]) / temp_tissue;
+ sim_pres_tissue_limit[ci] = (temp_tissue - var_a) * var_b;
+
+ if (sim_pres_tissue_limit[ci] < 0)
+ sim_pres_tissue_limit[ci] = 0;
+ if (sim_pres_tissue_limit[ci] > temp_pres_gtissue_limit)
+ {
+ temp_pres_gtissue = temp_tissue;
+ temp_pres_gtissue_limit = sim_pres_tissue_limit[ci];
+ temp_gtissue_no = ci;
+ }
+} // for
+ temp_pres_gtissue_diff = temp_pres_gtissue_limit - temp_pres_gtissue;
+ temp_pres_gtissue_limit_GF_low = GF_low * temp_pres_gtissue_diff + temp_pres_gtissue;
+ temp_pres_gtissue_limit_GF_low_below_surface = temp_pres_gtissue_limit_GF_low - pres_surface;
+ if (temp_pres_gtissue_limit_GF_low_below_surface < 0)
+ temp_pres_gtissue_limit_GF_low_below_surface = 0;
+} //sim_tissue_1min()
+
+//--------------------
+// sim_tissue_10min //
+//--------------------
+
+// Attention!! uses var_e1min und var2_e1min to load 10min data !!!
+// is identical to sim_tissue_1min routine except for the different load of those variables
+
+// optimized in v.101
+
+void sim_tissue_10min(void)
+{
+temp_pres_gtissue_limit = 0.0;
+temp_gtissue_no = 255;
+
+_asm
+lfsr 1, 0x300
+movlw 0x01
+movwf TBLPTRU,0
+_endasm
+
+for (ci=0;ci<16;ci++)
+{
+_asm
+movlw 0x02
+movwf TBLPTRH,0
+movlb 4 // fuer ci
+movf ci,0,1
+addwf ci,0,1
+addwf ci,0,1
+addwf ci,0,1
+addlw 0x80
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var_a+1
+TBLRDPOSTINC
+movff TABLAT,var_a
+TBLRDPOSTINC
+movff TABLAT,var_a+3
+TBLRD
+movff TABLAT,var_a+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var2_a+1
+TBLRDPOSTINC
+movff TABLAT,var2_a
+TBLRDPOSTINC
+movff TABLAT,var2_a+3
+TBLRD
+movff TABLAT,var2_a+2
+addlw 0x40
+movwf TBLPTRL,0
+incf TBLPTRH,1,0
+TBLRDPOSTINC
+movff TABLAT,var_b+1
+TBLRDPOSTINC
+movff TABLAT,var_b
+TBLRDPOSTINC
+movff TABLAT,var_b+3
+TBLRD
+movff TABLAT,var_b+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var2_b+1
+TBLRDPOSTINC
+movff TABLAT,var2_b
+TBLRDPOSTINC
+movff TABLAT,var2_b+3
+TBLRD
+movff TABLAT,var2_b+2
+addlw 0xC0 // different to 1 min
+movwf TBLPTRL,0
+incf TBLPTRH,1,0
+incf TBLPTRH,1,0 // different to 1 min
+TBLRDPOSTINC
+movff TABLAT,var_e1min+1
+TBLRDPOSTINC
+movff TABLAT,var_e1min
+TBLRDPOSTINC
+movff TABLAT,var_e1min+3
+TBLRD
+movff TABLAT,var_e1min+2
+addlw 0x40
+movwf TBLPTRL,0
+//incf TBLPTRH,1,0 // different to 1 min
+TBLRDPOSTINC
+movff TABLAT,var2_e1min+1
+TBLRDPOSTINC
+movff TABLAT,var2_e1min
+TBLRDPOSTINC
+movff TABLAT,var2_e1min+3
+TBLRD
+movff TABLAT,var2_e1min+2
+_endasm
+// N2
+ temp_tissue = (temp_atem - sim_pres_tissue[ci]) * var_e1min;
+ temp_tissue_safety();
+ sim_pres_tissue[ci] = sim_pres_tissue[ci] + temp_tissue;
+// He
+ temp_tissue = (temp2_atem - sim_pres_tissue[ci+16]) * var2_e1min;
+ temp_tissue_safety();
+ sim_pres_tissue[ci+16] = sim_pres_tissue[ci+16] + temp_tissue;
+// pressure limit
+temp_tissue = sim_pres_tissue[ci] + sim_pres_tissue[ci+16];
+ var_a = (var_a * sim_pres_tissue[ci] + var2_a * sim_pres_tissue[ci+16]) / temp_tissue;
+ var_b = (var_b * sim_pres_tissue[ci] + var2_b * sim_pres_tissue[ci+16]) / temp_tissue;
+
+sim_pres_tissue_limit[ci] = (temp_tissue - var_a) * var_b;
+ if (sim_pres_tissue_limit[ci] < 0)
+ sim_pres_tissue_limit[ci] = 0;
+ if (sim_pres_tissue_limit[ci] > temp_pres_gtissue_limit)
+ {
+ temp_pres_gtissue = temp_tissue;
+ temp_pres_gtissue_limit = sim_pres_tissue_limit[ci];
+ temp_gtissue_no = ci;
+ }
+} // for
+ temp_pres_gtissue_diff = temp_pres_gtissue_limit - temp_pres_gtissue; // negative number
+ temp_pres_gtissue_limit_GF_low = GF_low * temp_pres_gtissue_diff + temp_pres_gtissue;
+ temp_pres_gtissue_limit_GF_low_below_surface = temp_pres_gtissue_limit_GF_low - pres_surface;
+ if (temp_pres_gtissue_limit_GF_low_below_surface < 0)
+ temp_pres_gtissue_limit_GF_low_below_surface = 0;
+} //sim_tissue_10min()
+
+
+// ------------------
+// clear_decoarray //
+// ------------------
+// unchanged in v.101
+
+void clear_decoarray(void)
+{
+char_O_array_decodepth[0] = 0;
+char_O_array_decodepth[1] = 0;
+char_O_array_decodepth[2] = 0;
+char_O_array_decodepth[3] = 0;
+char_O_array_decodepth[4] = 0;
+char_O_array_decodepth[5] = 0;
+char_O_array_decotime[0] = 0;
+char_O_array_decotime[1] = 0;
+char_O_array_decotime[2] = 0;
+char_O_array_decotime[3] = 0;
+char_O_array_decotime[4] = 0;
+char_O_array_decotime[5] = 0;
+char_O_array_decotime[6] = 0;
+} // clear_decoarray
+
+
+// -------------------
+// update_decoarray //
+// -------------------
+// unchanged in v.101
+
+void update_decoarray()
+{
+ x = 0;
+ do
+ {
+ if (char_O_array_decodepth[x] == temp_depth_limit)
+ {
+ int_temp = char_O_array_decotime[x] + temp_decotime;
+ if (int_temp < 0)
+ int_temp = 0;
+ if (int_temp > 240)
+ int_temp = 240;
+ char_O_array_decotime[x] = int_temp;
+ x = 10; // exit
+ } // if
+ else
+ {
+ if (char_O_array_decodepth[x] == 0)
+ {
+ if (temp_depth_limit > 255)
+ char_O_array_decodepth[x] = 255;
+ else
+ char_O_array_decodepth[x] = (char)temp_depth_limit;
+ int_temp = char_O_array_decotime[x] + temp_decotime;
+ if (int_temp > 240)
+ char_O_array_decotime[x] = 240;
+ else
+ char_O_array_decotime[x] = (char)int_temp;
+ x = 10; // exit
+ } // if
+ else
+ x++;
+ } // else
+ } while (x<6);
+ if (x == 6)
+ {
+ int_temp = char_O_array_decotime[6] + temp_decotime;
+ if (int_temp > 220)
+ char_O_array_decotime[6] = 220;
+ else
+ char_O_array_decotime[6] = (char)int_temp;
+ } // if x == 6
+} // update_decoarray
+
+
+// -----------------------
+// calc_gradient_factor //
+// -----------------------
+// optimized in v.101 (var_a)
+// new code in v.102
+
+void calc_gradient_factor(void)
+{
+ // tissue > respiration (entsaettigungsvorgang)
+ // gradient ist wieviel prozent an limit mit basis tissue
+ // dh. 0% = respiration == tissue
+ // dh. 100% = respiration == limit
+ temp_tissue = pres_tissue[char_O_gtissue_no] + pres_tissue[char_O_gtissue_no+16];
+ temp1 = temp_tissue - pres_respiration;
+ temp2 = temp_tissue - pres_tissue_limit[char_O_gtissue_no]; // changed in v.102
+ temp2 = temp1/temp2;
+ temp2 = temp2 * 100; // displayed in percent
+ if (temp2 < 0)
+ temp2 = 0;
+ if (temp2 > 255)
+ temp2 = 255;
+ if (temp1 < 0)
+ char_O_gradient_factor = 0;
+ else
+ char_O_gradient_factor = (char)temp2;
+
+ temp3 = temp2;
+
+ if (char_I_deco_model == 1) // calculate relative gradient factor
+ {
+ temp1 = (float)temp_depth_GF_low_meter * 0.09995;
+ temp2 = pres_respiration - pres_surface;
+ if (temp2 <= 0)
+ temp1 = GF_high;
+ else
+ if (temp2 >= temp1)
+ temp1 = GF_low;
+ else
+ temp1 = GF_low + (temp1 - temp2)/temp1*GF_delta;
+ if (temp_depth_GF_low_meter == 0)
+ temp1 = GF_high;
+ temp2 = temp3 / temp1; // temp3 is already in percent
+ if (temp2 < 0)
+ temp2 = 0;
+ if (temp2 > 255)
+ temp2 = 255;
+ char_O_relative_gradient_GF = (char)temp2;
+ } // calc relative gradient factor
+ else
+ {
+ char_O_relative_gradient_GF = char_O_gradient_factor;
+ }
+} // calc_gradient
+
+// ---------------------------
+// calc_gradient_array_only //
+// ---------------------------
+// optimized in v.101 (var_a)
+// new code in v.102
+
+void calc_gradient_array_only()
+{
+ pres_respiration = (float)int_I_pres_respiration / 1000.0; // assembler code uses different digit system
+for (ci=0;ci<16;ci++)
+{
+ temp_tissue = pres_tissue[ci] + pres_tissue[ci+16];
+ temp1 = temp_tissue - pres_respiration;
+ temp2 = temp_tissue - pres_tissue_limit[ci];
+ temp2 = temp1/temp2;
+ temp2 = temp2 * 200; // because of output in (Double-)percentage
+ if (temp2 < 0)
+ temp2 = 0;
+ if (temp2 > 255)
+ temp2 = 255;
+ if (temp1 < 0)
+ char_O_array_gradient_weighted[ci] = 0;
+ else
+ char_O_array_gradient_weighted[ci] = (char)temp2;
+} // for
+} // calc_gradient_array_only
+
+
+// -------------------------
+// calc_desaturation_time //
+// -------------------------
+// FIXED N2_ratio
+// unchanged in v.101
+
+void calc_desaturation_time(void)
+{
+_asm
+lfsr 1, 0x300
+movlw 0x01
+movwf TBLPTRU,0
+_endasm
+ N2_ratio = 0.7902; // FIXED sum as stated in b"uhlmann
+ pres_surface = (float)int_I_pres_surface / 1000.0;
+ temp_atem = N2_ratio * (pres_surface - 0.0627);
+ int_O_desaturation_time = 0;
+ float_desaturation_multiplier = char_I_desaturation_multiplier / 142.0; // new in v.101 (70,42%/100.=142)
+
+for (ci=0;ci<16;ci++)
+{
+_asm
+movlw 0x04
+movwf TBLPTRH,0
+movlb 4 // fuer ci
+movf ci,0,1
+addwf ci,0,1
+addwf ci,0,1
+addwf ci,0,1
+addlw 0x80
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var_halftimes+1
+TBLRDPOSTINC
+movff TABLAT,var_halftimes
+TBLRDPOSTINC
+movff TABLAT,var_halftimes+3
+TBLRD
+movff TABLAT,var_halftimes+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var2_halftimes+1
+TBLRDPOSTINC
+movff TABLAT,var2_halftimes
+TBLRDPOSTINC
+movff TABLAT,var2_halftimes+3
+TBLRD
+movff TABLAT,var2_halftimes+2
+_endasm
+
+// saturation_time (for flight) and N2_saturation in multiples of halftime
+// version v.100: 1.1 = 10 percent distance to totally clean (totally clean is not possible, would take infinite time )
+// new in version v.101: 1.07 = 7 percent distance to totally clean (totally clean is not possible, would take infinite time )
+// changes in v.101: 1.05 = 5 percent dist to totally clean is new desaturation point for display and noFly calculations
+// N2
+ temp1 = 1.05 * temp_atem;
+ temp1 = temp1 - pres_tissue[ci];
+ temp2 = temp_atem - pres_tissue[ci];
+ if (temp2 >= 0.0)
+ {
+ temp1 = 0;
+ temp2 = 0;
+ }
+ else
+ temp1 = temp1 / temp2;
+ if (temp1 > 0.0)
+ {
+ temp1 = log(1.0 - temp1);
+ temp1 = temp1 / -0.6931; // temp1 is the multiples of half times necessary.
+ // 0.6931 is ln(2), because the math function log() calculates with a base of e not 2 as requested.
+ // minus because log is negative
+ temp2 = var_halftimes * temp1 / float_desaturation_multiplier; // time necessary (in minutes ) for complete desaturation (see comment about 10 percent) , new in v.101: float_desaturation_multiplier
+ }
+ else
+ {
+ temp1 = 0;
+ temp2 = 0;
+ }
+
+// He
+ temp3 = 0.1 - pres_tissue[ci+16];
+if (temp3 >= 0.0)
+ {
+ temp3 = 0;
+ temp4 = 0;
+ }
+ else
+ temp3 = -1.0 * temp3 / pres_tissue[ci+16];
+ if (temp3 > 0.0)
+ {
+ temp3 = log(1.0 - temp3);
+ temp3 = temp3 / -0.6931; // temp1 is the multiples of half times necessary.
+ // 0.6931 is ln(2), because the math function log() calculates with a base of e not 2 as requested.
+ // minus because log is negative
+ temp4 = var2_halftimes * temp3 / float_desaturation_multiplier; // time necessary (in minutes ) for "complete" desaturation, new in v.101 float_desaturation_multiplier
+ }
+ else
+ {
+ temp3 = 0;
+ temp4 = 0;
+ }
+
+// saturation_time (for flight)
+ if (temp4 > temp2)
+ int_temp = (int)temp4;
+ else
+ int_temp = (int)temp2;
+ if(int_temp > int_O_desaturation_time)
+ int_O_desaturation_time = int_temp;
+
+// N2 saturation in multiples of halftime for display purposes
+ temp2 = temp1 * 20.0; // 0 = 1/8, 120 = 0, 249 = 8
+ temp2 = temp2 + 80.0; // set center
+ if (temp2 < 0.0)
+ temp2 = 0.0;
+ if (temp2 > 255.0)
+ temp2 = 255.0;
+ char_O_tissue_saturation[ci] = (char)temp2;
+// He saturation in multiples of halftime for display purposes
+ temp4 = temp3 * 20.0; // 0 = 1/8, 120 = 0, 249 = 8
+ temp4 = temp4 + 80.0; // set center
+ if (temp4 < 0.0)
+ temp4 = 0.0;
+ if (temp4 > 255.0)
+ temp4 = 255.0;
+ char_O_tissue_saturation[ci+16] = (char)temp4;
+} // for
+} // calc_desaturation_time
+
+
+// --------------------------
+// calc_wo_deco_step_1_min //
+// --------------------------
+// FIXED N2 Ratio
+// optimized in v.101 (...saturation_multiplier)
+// desaturation slowed down to 70,42%
+
+void calc_wo_deco_step_1_min(void)
+{
+ if(flag_in_divemode)
+ {
+ flag_in_divemode = 0;
+ set_dbg_end_of_dive();
+ }
+_asm
+ lfsr 1, 0x300
+_endasm
+ N2_ratio = 0.7902; // FIXED, sum lt. buehlmann
+ pres_respiration = (float)int_I_pres_respiration / 1000.0; // assembler code uses different digit system
+ pres_surface = (float)int_I_pres_surface / 1000.0;
+ temp_atem = N2_ratio * (pres_respiration - 0.0627); // 0.0627 is the extra pressure in the body
+ temp2_atem = 0.0;
+ temp_surface = pres_surface; // the b"uhlmann formula using temp_surface does not use the N2_ratio
+ float_desaturation_multiplier = char_I_desaturation_multiplier / 142.0; // new in v.101 (70,42%/100.=142)
+ float_saturation_multiplier = char_I_saturation_multiplier / 100.0;
+
+ calc_tissue_step_1_min(); // update the pressure in the 16 tissues in accordance with the new ambient pressure
+ clear_decoarray();
+ char_O_deco_status = 0;
+ char_O_nullzeit = 0;
+ char_O_ascenttime = 0;
+ calc_gradient_factor();
+
+} // calc_wo_deco_step_1_min(void)
+
+
+// -------------------------
+// calc_tissue_step_1_min //
+// -------------------------
+// optimized in v.101
+
+void calc_tissue_step_1_min(void)
+{
+_asm
+lfsr 1, 0x300
+movlw 0x01
+movwf TBLPTRU,0
+_endasm
+
+ char_O_gtissue_no = 255;
+ pres_gtissue_limit = 0.0;
+
+for (ci=0;ci<16;ci++)
+{
+_asm
+movlw 0x02
+movwf TBLPTRH,0
+movlb 4 // fuer ci
+movf ci,0,1
+addwf ci,0,1
+addwf ci,0,1
+addwf ci,0,1
+addlw 0x80
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var_a+1
+TBLRDPOSTINC
+movff TABLAT,var_a
+TBLRDPOSTINC
+movff TABLAT,var_a+3
+TBLRD
+movff TABLAT,var_a+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var2_a+1
+TBLRDPOSTINC
+movff TABLAT,var2_a
+TBLRDPOSTINC
+movff TABLAT,var2_a+3
+TBLRD
+movff TABLAT,var2_a+2
+addlw 0x40
+movwf TBLPTRL,0
+incf TBLPTRH,1,0
+TBLRDPOSTINC
+movff TABLAT,var_b+1
+TBLRDPOSTINC
+movff TABLAT,var_b
+TBLRDPOSTINC
+movff TABLAT,var_b+3
+TBLRD
+movff TABLAT,var_b+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var2_b+1
+TBLRDPOSTINC
+movff TABLAT,var2_b
+TBLRDPOSTINC
+movff TABLAT,var2_b+3
+TBLRD
+movff TABLAT,var2_b+2
+addlw 0xC0
+movwf TBLPTRL,0
+incf TBLPTRH,1,0
+TBLRDPOSTINC
+movff TABLAT,var_e1min+1
+TBLRDPOSTINC
+movff TABLAT,var_e1min
+TBLRDPOSTINC
+movff TABLAT,var_e1min+3
+TBLRD
+movff TABLAT,var_e1min+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var2_e1min+1
+TBLRDPOSTINC
+movff TABLAT,var2_e1min
+TBLRDPOSTINC
+movff TABLAT,var2_e1min+3
+TBLRD
+movff TABLAT,var2_e1min+2
+_endasm
+
+// N2 1 min
+ temp_tissue = (temp_atem - pres_tissue[ci]) * var_e1min;
+ temp_tissue_safety();
+ pres_tissue[ci] = pres_tissue[ci] + temp_tissue;
+
+// He 1 min
+ temp_tissue = (temp2_atem - pres_tissue[ci+16]) * var2_e1min;
+ temp_tissue_safety();
+ pres_tissue[ci+16] = pres_tissue[ci+16] + temp_tissue;
+
+ temp_tissue = pres_tissue[ci] + pres_tissue[ci+16];
+ var_a = (var_a * pres_tissue[ci] + var2_a * pres_tissue[ci+16]) / temp_tissue;
+ var_b = (var_b * pres_tissue[ci] + var2_b * pres_tissue[ci+16]) / temp_tissue;
+ pres_tissue_limit[ci] = (temp_tissue - var_a) * var_b;
+ if (pres_tissue_limit[ci] < 0)
+ pres_tissue_limit[ci] = 0;
+ if (pres_tissue_limit[ci] > pres_gtissue_limit)
+ {
+ pres_gtissue_limit = pres_tissue_limit[ci];
+ char_O_gtissue_no = ci;
+ }//if
+
+// gradient factor array for graphical display
+// display range is 0 to 250! in steps of 5 for 1 pixel
+// the display is divided in 6 blocks
+// -> double the gradient 100% = 200
+// tissue > respiration (entsaettigungsvorgang)
+// gradient ist wieviel prozent an limit von tissue aus
+// dh. 0% = respiration == tissue
+// dh. 100% = respiration == limit
+temp1 = temp_tissue - pres_respiration;
+temp2 = temp_tissue - pres_tissue_limit[ci]; // changed in v.102
+temp2 = temp1/temp2;
+temp2 = temp2 * 200; // because of output in (Double-)percentage
+if (temp2 < 0)
+ temp2 = 0;
+if (temp2 > 255)
+ temp2 = 255;
+if (temp1 < 0)
+ char_O_array_gradient_weighted[ci] = 0;
+else
+ char_O_array_gradient_weighted[ci] = (char)temp2;
+
+} // for
+} // calc wo deco 1min
+
+#if 0
+// --------
+// debug //
+// --------
+void debug(void)
+{
+for (ci=0;ci<32;ci++)
+{
+ int_O_tissue_for_debug[ci] = (unsigned int)(pres_tissue[ci] *1000);
+}
+} // void debug(void)
+#endif
+
+// ----------
+// md hash //
+// ----------
+void hash(void)
+{
+// init
+ for (md_i=0;md_i<16;md_i++)
+ {
+ md_state[md_i] = 0;
+ md_cksum[md_i] = 0;
+ } // for md_i 16
+
+_asm
+ movlw 0x01
+ movwf TBLPTRU,0
+ movlw 0x06
+ movwf TBLPTRH,0
+ movlw 0x00
+ movwf TBLPTRL,0
+_endasm
+ for (md_i=0;md_i<127;md_i++)
+ {
+_asm
+ TBLRDPOSTINC
+ movff TABLAT,md_temp
+_endasm
+ md_pi_subst[md_i] = md_temp;
+ } // for md_i 256
+_asm
+ TBLRDPOSTINC
+ movff TABLAT,md_temp
+_endasm
+ md_pi_subst[127] = md_temp;
+ for (md_i=0;md_i<127;md_i++)
+ {
+_asm
+ TBLRDPOSTINC
+ movff TABLAT,md_temp
+_endasm
+ md_pi_subst[md_i+128] = md_temp;
+ } // for md_i 256
+_asm
+ TBLRD
+ movff TABLAT,md_temp
+_endasm
+ md_pi_subst[255] = md_temp;
+
+_asm
+ movlw 0x00
+ movwf TBLPTRU,0
+ movlw 0x00
+ movwf TBLPTRH,0
+ movlw 0x00
+ movwf TBLPTRL,0
+_endasm
+// cycle buffers
+for (md_pointer=0x0000;md_pointer<0x17f3;md_pointer++)
+{
+ md_t = 0;
+ for (md_i=0;md_i<16;md_i++)
+ {
+ if(md_pointer == 9)
+ md_temp = md_cksum[md_i];
+ else
+ {
+_asm
+ TBLRDPOSTINC
+ movff TABLAT,md_temp
+_endasm
+ } // else
+ md_buffer[md_i] = md_temp;
+ md_state[md_i+16] = md_buffer[md_i];
+ md_state[md_i+32] = (unsigned char)(md_buffer[md_i] ^ md_state[md_i]);
+ } // for md_i 16
+
+ for (md_i=0;md_i<18;md_i++)
+ {
+ for (md_j=0;md_j<48;md_j++)
+ {
+ md_state[md_j] = (unsigned char)(md_state[md_j] ^ md_pi_subst[md_t]);
+ md_t = md_state[md_j];
+ } // for md_j 48
+ md_t = (unsigned char)(md_t+1);
+ } // for md_i 18
+ md_t = md_cksum[15];
+
+ for (md_i=0;md_i<16;md_i++)
+ {
+ md_cksum[md_i] = (unsigned char)(md_cksum[md_i] ^ md_pi_subst[(md_buffer[md_i] ^ md_t)]);
+ md_t = md_cksum[md_i];
+ } // for md_i 16
+} // for md_pointer
+} // void hash(void)
+
+// ---------------------
+// clear_CNS_fraction //
+// ---------------------
+// new in v.101
+
+void clear_CNS_fraction(void)
+{
+ CNS_fraction = 0.0;
+ char_O_CNS_fraction = 0;
+} // void clear_CNS_fraction(void)
+
+
+// --------------------
+// calc_CNS_fraction //
+// --------------------
+// new in v.101
+// optimized in v.102 : with new variables char_I_actual_ppO2 and actual_ppO2
+
+// Input: char_I_actual_ppO2
+// Output: char_O_CNS_fraction
+// Uses and Updates: CNS_fraction
+// Uses: acutal_ppO2
+
+void calc_CNS_fraction(void)
+{
+ actual_ppO2 = (float)char_I_actual_ppO2 / 100.0;
+
+ if (char_I_actual_ppO2 < 50)
+ CNS_fraction = CNS_fraction;// no changes
+ else if (char_I_actual_ppO2 < 60)
+ CNS_fraction = 1/(-54000.0 * actual_ppO2 + 54000.0) + CNS_fraction;
+ else if (char_I_actual_ppO2 < 70)
+ CNS_fraction = 1/(-45000.0 * actual_ppO2 + 48600.0) + CNS_fraction;
+ else if (char_I_actual_ppO2 < 80)
+ CNS_fraction = 1/(-36000.0 * actual_ppO2 + 42300.0) + CNS_fraction;
+ else if (char_I_actual_ppO2 < 90)
+ CNS_fraction = 1/(-27000.0 * actual_ppO2 + 35100.0) + CNS_fraction;
+ else if (char_I_actual_ppO2 < 110)
+ CNS_fraction = 1/(-18000.0 * actual_ppO2 + 27000.0) + CNS_fraction;
+ else if (char_I_actual_ppO2 < 150)
+ CNS_fraction = 1/(-9000.0 * actual_ppO2 + 17100.0) + CNS_fraction;
+ else if (char_I_actual_ppO2 < 160)
+ CNS_fraction = 1/(-22500.0 * actual_ppO2 + 37350.0) + CNS_fraction;
+ else if (char_I_actual_ppO2 < 165)
+ CNS_fraction = 0.000755 + CNS_fraction; // Arieli et all.(2002): Modeling pulmonary and CNS O2 toxicity... Formula (A1) based on value for 1.55 and c=20
+ else if (char_I_actual_ppO2 < 170)
+ CNS_fraction = 0.00102 + CNS_fraction; // example calculation: Sqrt((1.7/1.55)^20)*0.000404
+ else if (char_I_actual_ppO2 < 175)
+ CNS_fraction = 0.00136 + CNS_fraction;
+ else if (char_I_actual_ppO2 < 180)
+ CNS_fraction = 0.00180 + CNS_fraction;
+ else if (char_I_actual_ppO2 < 185)
+ CNS_fraction = 0.00237 + CNS_fraction;
+ else if (char_I_actual_ppO2 < 190)
+ CNS_fraction = 0.00310 + CNS_fraction;
+ else if (char_I_actual_ppO2 < 195)
+ CNS_fraction = 0.00401 + CNS_fraction;
+ else if (char_I_actual_ppO2 < 200)
+ CNS_fraction = 0.00517 + CNS_fraction;
+ else if (char_I_actual_ppO2 < 230)
+ CNS_fraction = 0.0209 + CNS_fraction;
+ else
+ CNS_fraction = 0.0482 + CNS_fraction; // value for 2.5
+
+ if (CNS_fraction > 2.5)
+ CNS_fraction = 2.5;
+ if (CNS_fraction < 0.0)
+ CNS_fraction = 0.0;
+ char_O_CNS_fraction = (char)((CNS_fraction + 0.005)* 100.0);
+} // void calc_CNS_fraction(void)
+
+// --------------------------
+// calc_CNS_decrease_15min //
+// --------------------------
+// new in v.101
+
+// calculates the half time of 90 minutes in 6 steps of 15 min
+
+// Output: char_O_CNS_fraction
+// Uses and Updates: CNS_fraction
+
+void calc_CNS_decrease_15min(void)
+{
+ CNS_fraction = 0.890899 * CNS_fraction;
+ char_O_CNS_fraction = (char)((CNS_fraction + 0.005)* 100.0);
+}// calc_CNS_decrease_15min(void)
+
+
+// ------------------
+// calc_percentage //
+// ------------------
+// new in v.101
+
+// calculates int_I_temp * char_I_temp / 100
+// output is int_I_temp
+
+void calc_percentage(void)
+{
+ temp1 = (float)int_I_temp;
+ temp2 = (float)char_I_temp / 100.0;
+ temp3 = temp1 * temp2;
+ int_I_temp = (int)temp3;
+}
+void push_tissues_to_vault(void)
+{
+ for (ci=0;ci<32;ci++)
+ pres_tissue_vault[ci] = pres_tissue[ci];
+}
+void pull_tissues_from_vault(void)
+{
+ for (ci=0;ci<32;ci++)
+ pres_tissue[ci] = pres_tissue_vault[ci];
+}
+
diff -r 000000000000 -r 96a35aeda5f2 code_part1/OSTC_code_c_part2/ostc28.drx.txt
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/code_part1/OSTC_code_c_part2/ostc28.drx.txt Tue Jan 12 15:05:59 2010 +0100
@@ -0,0 +1,2487 @@
+0xF803
+,0x8A01
+,0x850C
+,0x8202
+,0x850A
+,0x8302
+,0xFF94
+,0xCD00
+,0x9105
+,0x9103
+,0xC701
+,0x9105
+,0x9103
+,0xDA9D
+,0x0183
+,0x018F
+,0x0183
+,0x018F
+,0x0183
+,0x0688
+,0x0D87
+,0x0781
+,0x018F
+,0x0183
+,0x018F
+,0x0183
+,0x018F
+,0x0182
+,0x0786
+,0x0D89
+,0x0583
+,0x018F
+,0x0183
+,0x018F
+,0x0183
+,0x00A2
+,0xB402
+,0x8601
+,0x8A04
+,0x8601
+,0x8801
+,0x8102
+,0x8501
+,0x8800
+,0x8301
+,0x8600
+,0x8702
+,0x8202
+,0x8501
+,0x8512
+,0x8501
+,0x8402
+,0x8401
+,0x8700
+,0x8501
+,0x8301
+,0x8801
+,0x8402
+,0x8201
+,0x8901
+,0x8405
+,0x9203
+,0x9F9A
+,0x0392
+,0x0588
+,0x0185
+,0x0183
+,0x0185
+,0x0286
+,0x0183
+,0x0084
+,0x0289
+,0x0582
+,0x038B
+,0x0382
+,0x0292
+,0x0282
+,0x028C
+,0x0283
+,0x0489
+,0x0284
+,0x0182
+,0x0186
+,0x0385
+,0x0183
+,0x0086
+,0x0187
+,0x0182
+,0x0191
+,0x049D
+,0xA403
+,0x9106
+,0x8804
+,0x8102
+,0x8202
+,0x8608
+,0x8501
+,0x8600
+,0x8402
+,0x8501
+,0x8600
+,0x8403
+,0x8401
+,0x8601
+,0x8205
+,0x8301
+,0x8606
+,0x8202
+,0x8001
+,0x8803
+,0x8503
+,0x9402
+,0x9206
+,0x9001
+,0x8200
+,0x9DFF
+,0x9401
+,0x9006
+,0x9102
+,0xFF8B
+,0xE707
+,0x8C0C
+,0x8903
+,0x8703
+,0x8602
+,0x8B02
+,0x8401
+,0x8E02
+,0x8201
+,0x9101
+,0x8101
+,0x9102
+,0x8000
+,0x9300
+,0xB0B0
+,0x0093
+,0x0081
+,0x0191
+,0x0181
+,0x028F
+,0x0282
+,0x028D
+,0x0284
+,0x028B
+,0x0286
+,0x0387
+,0x0389
+,0x0B8D
+,0x07E7
+,0x9F00
+,0x9601
+,0x9501
+,0x8202
+,0x9000
+,0x8102
+,0x9104
+,0x8D07
+,0x8F07
+,0x9404
+,0x9200
+,0x8102
+,0x9001
+,0x8301
+,0x8F01
+,0x9500
+,0xA6A0
+,0x0195
+,0x0195
+,0x0195
+,0x0195
+,0x0191
+,0x0A8B
+,0x0B90
+,0x0195
+,0x0195
+,0x0195
+,0x0195
+,0x01A4
+,0xFF88
+,0x0182
+,0x018F
+,0x0690
+,0x0494
+,0x00FC
+,0xB801
+,0x9501
+,0x9501
+,0x9501
+,0x9501
+,0x9501
+,0x9501
+,0x9501
+,0x9501
+,0x9501
+,0xBCFF
+,0x8701
+,0x9502
+,0x9402
+,0xFF94
+,0xC101
+,0x9303
+,0x9004
+,0x9004
+,0x9004
+,0x9003
+,0x9103
+,0x9103
+,0x9103
+,0x9301
+,0xC4A0
+,0x0290
+,0x0A8B
+,0x0285
+,0x0389
+,0x0186
+,0x0587
+,0x0186
+,0x0183
+,0x0186
+,0x0086
+,0x0184
+,0x0186
+,0x0084
+,0x0285
+,0x0186
+,0x0182
+,0x0286
+,0x0186
+,0x0280
+,0x0187
+,0x0188
+,0x0484
+,0x038B
+,0x0A90
+,0x02A3
+,0xCA01
+,0x9501
+,0x9401
+,0x9510
+,0x8610
+,0xFF94
+,0xB300
+,0x8B01
+,0x8701
+,0x8903
+,0x8601
+,0x8904
+,0x8601
+,0x8802
+,0x8001
+,0x8600
+,0x8801
+,0x8201
+,0x8600
+,0x8701
+,0x8301
+,0x8601
+,0x8501
+,0x8401
+,0x8602
+,0x8301
+,0x8501
+,0x8706
+,0x8601
+,0x8804
+,0x8701
+,0xB4BF
+,0x0188
+,0x008B
+,0x0187
+,0x018C
+,0x0186
+,0x0085
+,0x0185
+,0x0186
+,0x0085
+,0x0185
+,0x0186
+,0x0085
+,0x0185
+,0x0186
+,0x0183
+,0x0285
+,0x0186
+,0x0281
+,0x0180
+,0x0183
+,0x0188
+,0x0482
+,0x0592
+,0x03B7
+,0xA400
+,0x9402
+,0x9204
+,0x9102
+,0x8001
+,0x8F02
+,0x8201
+,0x8E02
+,0x8301
+,0x8C02
+,0x8501
+,0x8B10
+,0x8610
+,0x9002
+,0x9401
+,0x9600
+,0xA1B7
+,0x0185
+,0x0088
+,0x0883
+,0x0287
+,0x0282
+,0x0185
+,0x0187
+,0x0084
+,0x0087
+,0x0186
+,0x0084
+,0x0087
+,0x0186
+,0x0084
+,0x0087
+,0x0186
+,0x0084
+,0x0186
+,0x0186
+,0x0084
+,0x0185
+,0x0187
+,0x0085
+,0x0887
+,0x0086
+,0x06B6
+,0xB508
+,0x8C0C
+,0x8902
+,0x8201
+,0x8302
+,0x8701
+,0x8301
+,0x8601
+,0x8601
+,0x8301
+,0x8601
+,0x8600
+,0x8400
+,0x8701
+,0x8600
+,0x8401
+,0x8601
+,0x8601
+,0x8302
+,0x8401
+,0x8701
+,0x8408
+,0x8F05
+,0xB7B1
+,0x0096
+,0x0096
+,0x008D
+,0x0186
+,0x008A
+,0x0486
+,0x0087
+,0x0588
+,0x0085
+,0x048B
+,0x0082
+,0x058D
+,0x0690
+,0x0393
+,0x01C3
+,0xBB04
+,0x8904
+,0x8206
+,0x8702
+,0x8002
+,0x8001
+,0x8301
+,0x8701
+,0x8302
+,0x8501
+,0x8600
+,0x8501
+,0x8501
+,0x8600
+,0x8501
+,0x8501
+,0x8601
+,0x8302
+,0x8501
+,0x8602
+,0x8101
+,0x8001
+,0x8301
+,0x8805
+,0x8106
+,0x8902
+,0x8404
+,0xB6B3
+,0x0586
+,0x0088
+,0x0784
+,0x0187
+,0x0284
+,0x0184
+,0x0186
+,0x0186
+,0x0084
+,0x0186
+,0x0087
+,0x0183
+,0x0186
+,0x0087
+,0x0084
+,0x0186
+,0x0185
+,0x0183
+,0x0187
+,0x0284
+,0x0182
+,0x0288
+,0x0D8B
+,0x09B8
+,0xFE01
+,0x8601
+,0x8C02
+,0x8502
+,0x8B02
+,0x8502
+,0xFF94
+,0xFF01
+,0x8601
+,0x8201
+,0x8602
+,0x8506
+,0x8702
+,0x8504
+,0x9400
+,0xFCA0
+,0x0195
+,0x0293
+,0x0393
+,0x0081
+,0x0191
+,0x0181
+,0x0190
+,0x0183
+,0x018F
+,0x0184
+,0x018D
+,0x0185
+,0x018D
+,0x0186
+,0x018B
+,0x0187
+,0x018B
+,0x0188
+,0x0189
+,0x0189
+,0x019E
+,0x9E00
+,0x8400
+,0x9000
+,0x8400
+,0x9000
+,0x8400
+,0x9000
+,0x8400
+,0x9000
+,0x8400
+,0x9000
+,0x8400
+,0x9000
+,0x8400
+,0x9000
+,0x8400
+,0x9000
+,0x8400
+,0x9000
+,0x8400
+,0x9000
+,0x8400
+,0x9000
+,0x8400
+,0xA19A
+,0x0189
+,0x018A
+,0x0188
+,0x018A
+,0x0187
+,0x018C
+,0x0186
+,0x018C
+,0x0185
+,0x018E
+,0x0184
+,0x018E
+,0x0183
+,0x0190
+,0x0181
+,0x0192
+,0x0081
+,0x0192
+,0x0394
+,0x0294
+,0x01A4
+,0xB101
+,0x9501
+,0x9401
+,0x9501
+,0x9401
+,0x8801
+,0x8202
+,0x8401
+,0x8604
+,0x8102
+,0x8501
+,0x8402
+,0x8401
+,0x8602
+,0x8202
+,0x8F06
+,0x9104
+,0xBF9D
+,0x078D
+,0x0481
+,0x048A
+,0x0287
+,0x0288
+,0x018B
+,0x0187
+,0x0184
+,0x0383
+,0x0087
+,0x0084
+,0x0582
+,0x0186
+,0x0083
+,0x0182
+,0x0182
+,0x0186
+,0x0083
+,0x0084
+,0x0082
+,0x0186
+,0x0182
+,0x0084
+,0x0082
+,0x0186
+,0x0281
+,0x0083
+,0x0182
+,0x0187
+,0x0A82
+,0x008A
+,0x08A1
+,0xA702
+,0x9104
+,0x8F04
+,0x8F06
+,0x8D04
+,0x8201
+,0x8B03
+,0x8501
+,0x8C04
+,0x8301
+,0x8F04
+,0x8001
+,0x9105
+,0x9404
+,0x9504
+,0x9402
+,0x9C99
+,0x1086
+,0x1086
+,0x0085
+,0x0185
+,0x0186
+,0x0085
+,0x0086
+,0x0186
+,0x0085
+,0x0086
+,0x0186
+,0x0085
+,0x0086
+,0x0186
+,0x0085
+,0x0185
+,0x0186
+,0x0183
+,0x0285
+,0x0186
+,0x0183
+,0x0284
+,0x0287
+,0x0580
+,0x0281
+,0x0289
+,0x0382
+,0x0593
+,0x029F
+,0x9E06
+,0x8E0A
+,0x8A03
+,0x8503
+,0x8901
+,0x8902
+,0x8701
+,0x8B02
+,0x8600
+,0x8D01
+,0x8600
+,0x8D01
+,0x8600
+,0x8D01
+,0x8601
+,0x8C01
+,0x8601
+,0x8B01
+,0x8802
+,0x8802
+,0x8900
+,0x8A00
+,0x9E99
+,0x1086
+,0x1086
+,0x008D
+,0x0186
+,0x008D
+,0x0186
+,0x008D
+,0x0186
+,0x008D
+,0x0186
+,0x018C
+,0x0186
+,0x018C
+,0x0186
+,0x028A
+,0x0188
+,0x0386
+,0x028B
+,0x0A8E
+,0x05A2
+,0xB110
+,0x8610
+,0x8600
+,0x8501
+,0x8501
+,0x8600
+,0x8501
+,0x8501
+,0x8600
+,0x8501
+,0x8501
+,0x8600
+,0x8501
+,0x8501
+,0x8600
+,0x8501
+,0x8501
+,0x8600
+,0x8501
+,0x8501
+,0x8600
+,0x8501
+,0x8501
+,0x8600
+,0x8D01
+,0xB4B1
+,0x1086
+,0x1086
+,0x0085
+,0x018E
+,0x0085
+,0x008F
+,0x0085
+,0x008F
+,0x0085
+,0x008F
+,0x0085
+,0x008F
+,0x0085
+,0x008F
+,0x0085
+,0x008F
+,0x00C4
+,0x9E06
+,0x8D0B
+,0x8A02
+,0x8702
+,0x8802
+,0x8A01
+,0x8701
+,0x8C01
+,0x8600
+,0x8D01
+,0x8600
+,0x8D01
+,0x8600
+,0x8700
+,0x8401
+,0x8601
+,0x8600
+,0x8401
+,0x8601
+,0x8600
+,0x8400
+,0x8802
+,0x8406
+,0x8900
+,0x8505
+,0x9EB1
+,0x1086
+,0x108D
+,0x0195
+,0x0195
+,0x0195
+,0x0195
+,0x0195
+,0x018E
+,0x1086
+,0x10B4
+,0xB100
+,0x8E00
+,0x8600
+,0x8D01
+,0x8600
+,0x8D01
+,0x8600
+,0x8D01
+,0x8610
+,0x8610
+,0x8600
+,0x8D01
+,0x8600
+,0x8D01
+,0x8600
+,0x8D01
+,0xCCBF
+,0x0196
+,0x0195
+,0x0186
+,0x008D
+,0x0186
+,0x008D
+,0x0186
+,0x008C
+,0x0187
+,0x0F87
+,0x0D89
+,0x0096
+,0x0096
+,0x00AC
+,0x9910
+,0x8610
+,0x8D02
+,0x9302
+,0x9304
+,0x9102
+,0x8002
+,0x8F02
+,0x8202
+,0x8D01
+,0x8503
+,0x8A01
+,0x8802
+,0x8801
+,0x8A03
+,0x8600
+,0x8D01
+,0x9600
+,0x9CB1
+,0x1086
+,0x1095
+,0x0195
+,0x0195
+,0x0195
+,0x0195
+,0x0195
+,0x0195
+,0x0195
+,0x01B4
+,0x9910
+,0x8610
+,0x8703
+,0x9503
+,0x9503
+,0x9503
+,0x9302
+,0x9202
+,0x9203
+,0x9103
+,0x9210
+,0x8610
+,0x9C99
+,0x1086
+,0x1086
+,0x0395
+,0x0295
+,0x0395
+,0x0395
+,0x0395
+,0x0395
+,0x0295
+,0x0387
+,0x1086
+,0x109C
+,0x9D08
+,0x8C0C
+,0x8902
+,0x8703
+,0x8701
+,0x8B01
+,0x8701
+,0x8C01
+,0x8600
+,0x8D01
+,0x8600
+,0x8D01
+,0x8601
+,0x8C01
+,0x8601
+,0x8B01
+,0x8802
+,0x8802
+,0x890C
+,0x8C08
+,0xA0B1
+,0x1086
+,0x1086
+,0x0086
+,0x008E
+,0x0086
+,0x008E
+,0x0086
+,0x008E
+,0x0086
+,0x008E
+,0x0184
+,0x018E
+,0x0184
+,0x018E
+,0x0282
+,0x028F
+,0x0692
+,0x02A7
+,0x9D08
+,0x8C0C
+,0x8902
+,0x8802
+,0x8701
+,0x8B02
+,0x8601
+,0x8C01
+,0x8600
+,0x8E02
+,0x8400
+,0x8E04
+,0x8201
+,0x8C01
+,0x8101
+,0x8201
+,0x8C01
+,0x8101
+,0x8302
+,0x8802
+,0x8201
+,0x840C
+,0x8301
+,0x8608
+,0xA0B1
+,0x1086
+,0x1086
+,0x0086
+,0x008E
+,0x0086
+,0x008E
+,0x0086
+,0x008E
+,0x0086
+,0x018D
+,0x0184
+,0x048B
+,0x0184
+,0x0180
+,0x0389
+,0x0783
+,0x0388
+,0x0586
+,0x028A
+,0x008A
+,0x009C
+,0xB303
+,0x8602
+,0x8805
+,0x8601
+,0x8701
+,0x8202
+,0x8601
+,0x8601
+,0x8301
+,0x8601
+,0x8600
+,0x8501
+,0x8501
+,0x8600
+,0x8501
+,0x8501
+,0x8600
+,0x8501
+,0x8501
+,0x8601
+,0x8501
+,0x8302
+,0x8602
+,0x8402
+,0x8102
+,0x8801
+,0x8505
+,0x9301
+,0xA099
+,0x0096
+,0x0096
+,0x0096
+,0x0096
+,0x0096
+,0x1086
+,0x1086
+,0x0096
+,0x0096
+,0x0096
+,0x0096
+,0x00AC
+,0x990C
+,0x8A0E
+,0x9502
+,0x9501
+,0x9601
+,0x9501
+,0x9501
+,0x9501
+,0x9401
+,0x9402
+,0x870E
+,0x880C
+,0xA099
+,0x0195
+,0x0494
+,0x0594
+,0x0594
+,0x0594
+,0x0592
+,0x048F
+,0x048F
+,0x048F
+,0x048F
+,0x0492
+,0x01AB
+,0x9905
+,0x920A
+,0x9209
+,0x9004
+,0x8E05
+,0x8E04
+,0x9005
+,0x9406
+,0x9406
+,0x9206
+,0x8909
+,0x8A06
+,0xA6A9
+,0x0086
+,0x018B
+,0x0286
+,0x0388
+,0x0388
+,0x0384
+,0x038B
+,0x0381
+,0x038F
+,0x0591
+,0x058F
+,0x0381
+,0x038C
+,0x0285
+,0x0388
+,0x0387
+,0x0387
+,0x018B
+,0x0296
+,0x009C
+,0x9900
+,0x9602
+,0x9503
+,0x9503
+,0x9503
+,0x940A
+,0x8D09
+,0x8B04
+,0x9004
+,0x9003
+,0x9202
+,0x9400
+,0xACA9
+,0x0086
+,0x008C
+,0x0286
+,0x008A
+,0x0486
+,0x0089
+,0x0280
+,0x0186
+,0x0087
+,0x0381
+,0x0186
+,0x0085
+,0x0383
+,0x0186
+,0x0084
+,0x0285
+,0x0186
+,0x0082
+,0x0386
+,0x0186
+,0x0080
+,0x0388
+,0x0186
+,0x038A
+,0x0186
+,0x028B
+,0x0195
+,0x019C
+,0xDF15
+,0x8101
+,0x9101
+,0x8101
+,0x9101
+,0x8101
+,0x9101
+,0x8101
+,0x9101
+,0x8101
+,0x9101
+,0x8101
+,0x9101
+,0x8200
+,0x9100
+,0xB2B0
+,0x0195
+,0x0395
+,0x0395
+,0x0395
+,0x0395
+,0x0494
+,0x0495
+,0x0395
+,0x0395
+,0x01B3
+,0xB000
+,0x9100
+,0x8201
+,0x9101
+,0x8101
+,0x9101
+,0x8101
+,0x9101
+,0x8101
+,0x9101
+,0x8101
+,0x9101
+,0x8101
+,0x9101
+,0x8115
+,0xE1CE
+,0x0194
+,0x0292
+,0x0292
+,0x0294
+,0x0296
+,0x0295
+,0x0395
+,0x01D6
+,0xAB00
+,0x9600
+,0x9600
+,0x9600
+,0x9600
+,0x9600
+,0x9600
+,0x9600
+,0x9600
+,0x9600
+,0x9600
+,0x9600
+,0x9AE0
+,0x0195
+,0x0395
+,0x0295
+,0x0295
+,0x00FF
+,0x89A6
+,0x0193
+,0x048C
+,0x0183
+,0x0180
+,0x028B
+,0x0083
+,0x0182
+,0x018A
+,0x0183
+,0x0084
+,0x008A
+,0x0183
+,0x0084
+,0x008A
+,0x0183
+,0x0084
+,0x008A
+,0x0183
+,0x0083
+,0x008C
+,0x0182
+,0x0082
+,0x018C
+,0x0B8C
+,0x0AB4
+,0xAF12
+,0x8411
+,0x8C01
+,0x8601
+,0x8C00
+,0x8801
+,0x8A01
+,0x8801
+,0x8A01
+,0x8801
+,0x8A01
+,0x8801
+,0x8B01
+,0x8602
+,0x8B03
+,0x8302
+,0x8D08
+,0x9004
+,0xA0B8
+,0x068F
+,0x088D
+,0x0284
+,0x028C
+,0x0186
+,0x028A
+,0x0188
+,0x018A
+,0x0188
+,0x018A
+,0x0188
+,0x018A
+,0x0188
+,0x018B
+,0x0186
+,0x018C
+,0x0285
+,0x018D
+,0x00A6
+,0xA104
+,0x9008
+,0x8D02
+,0x8402
+,0x8C01
+,0x8602
+,0x8A01
+,0x8801
+,0x8A01
+,0x8801
+,0x8A01
+,0x8801
+,0x8B00
+,0x8800
+,0x8C01
+,0x8601
+,0x8611
+,0x8412
+,0xB4A2
+,0x0292
+,0x078E
+,0x0480
+,0x038C
+,0x0181
+,0x0182
+,0x018B
+,0x0182
+,0x0183
+,0x018A
+,0x0182
+,0x0183
+,0x018A
+,0x0182
+,0x0183
+,0x018A
+,0x0182
+,0x0183
+,0x018B
+,0x0181
+,0x0183
+,0x018B
+,0x0582
+,0x018D
+,0x0483
+,0x00B5
+,0xB601
+,0x9501
+,0x9501
+,0x9010
+,0x8503
+,0x8101
+,0x8F01
+,0x8301
+,0x8F00
+,0x8401
+,0x8E01
+,0x8401
+,0x8E01
+,0x8400
+,0x9001
+,0x9502
+,0xABAA
+,0x0289
+,0x0481
+,0x0180
+,0x0487
+,0x0B81
+,0x0186
+,0x0183
+,0x0181
+,0x0183
+,0x0086
+,0x0085
+,0x0082
+,0x0083
+,0x0185
+,0x0085
+,0x0082
+,0x0083
+,0x0185
+,0x0085
+,0x0082
+,0x0083
+,0x0185
+,0x0183
+,0x0182
+,0x0083
+,0x0186
+,0x0583
+,0x0083
+,0x0086
+,0x0584
+,0x0181
+,0x0186
+,0x0089
+,0x0487
+,0x008B
+,0x019A
+,0xAF12
+,0x8412
+,0x8C01
+,0x9401
+,0x9500
+,0x9501
+,0x9501
+,0x9502
+,0x950B
+,0x8C0A
+,0xB4CD
+,0x0188
+,0x018A
+,0x0188
+,0x018A
+,0x0188
+,0x0185
+,0x0182
+,0x0C85
+,0x0182
+,0x0C95
+,0x0195
+,0x0195
+,0x01CC
+,0xC401
+,0x9601
+,0x8501
+,0x8D01
+,0x8501
+,0x8D01
+,0x8501
+,0x8D01
+,0x8501
+,0x8C01
+,0x8101
+,0x8210
+,0x8102
+,0x810F
+,0x8201
+,0xDCAF
+,0x1284
+,0x128F
+,0x0294
+,0x0194
+,0x0392
+,0x0180
+,0x0290
+,0x0182
+,0x028E
+,0x0184
+,0x028C
+,0x0186
+,0x038A
+,0x0089
+,0x0196
+,0x009C
+,0xB000
+,0x8E01
+,0x8401
+,0x8E01
+,0x8401
+,0x8E01
+,0x8401
+,0x8E01
+,0x8412
+,0x8412
+,0x9501
+,0x9501
+,0x9501
+,0x9600
+,0xB49D
+,0x0C8A
+,0x0C8B
+,0x0095
+,0x0195
+,0x0195
+,0x0C8B
+,0x0B8B
+,0x0194
+,0x0195
+,0x0195
+,0x0C8B
+,0x0B9C
+,0xB50C
+,0x8A0C
+,0x8C01
+,0x9401
+,0x9500
+,0x9501
+,0x9501
+,0x9502
+,0x950B
+,0x8C0A
+,0xB4A1
+,0x0491
+,0x078E
+,0x0282
+,0x038C
+,0x0186
+,0x018B
+,0x0188
+,0x018A
+,0x0188
+,0x018A
+,0x0188
+,0x018A
+,0x0188
+,0x018B
+,0x0186
+,0x018C
+,0x0383
+,0x028D
+,0x0890
+,0x04A0
+,0xB511
+,0x8510
+,0x8701
+,0x8601
+,0x8C00
+,0x8800
+,0x8B01
+,0x8801
+,0x8A01
+,0x8801
+,0x8A01
+,0x8801
+,0x8B01
+,0x8602
+,0x8B02
+,0x8402
+,0x8D08
+,0x9004
+,0xA0A1
+,0x0490
+,0x088D
+,0x0283
+,0x038C
+,0x0087
+,0x028A
+,0x0188
+,0x018A
+,0x0188
+,0x018A
+,0x0188
+,0x018B
+,0x0088
+,0x008C
+,0x0186
+,0x018C
+,0x0F86
+,0x11AF
+,0xCD0C
+,0x8A0C
+,0x8C01
+,0x9401
+,0x9500
+,0x9501
+,0x9501
+,0x9501
+,0x9601
+,0x9500
+,0xA7B8
+,0x0085
+,0x018C
+,0x0483
+,0x018C
+,0x0484
+,0x018A
+,0x0182
+,0x0183
+,0x018A
+,0x0182
+,0x0183
+,0x018A
+,0x0182
+,0x0183
+,0x018A
+,0x0183
+,0x0182
+,0x018B
+,0x0083
+,0x0182
+,0x018B
+,0x0182
+,0x058D
+,0x0083
+,0x03B6
+,0xB501
+,0x9501
+,0x9501
+,0x920E
+,0x880F
+,0x8A01
+,0x8801
+,0x8A01
+,0x8801
+,0x8A01
+,0x8801
+,0x8A01
+,0x8801
+,0x9401
+,0xB5B5
+,0x0A8C
+,0x0B95
+,0x0295
+,0x0196
+,0x0096
+,0x0095
+,0x0095
+,0x018B
+,0x0C8A
+,0x0CB4
+,0x9D00
+,0x9603
+,0x9404
+,0x9504
+,0x9404
+,0x9404
+,0x9303
+,0x9103
+,0x9103
+,0x9004
+,0x9003
+,0x9300
+,0xA89D
+,0x0593
+,0x0893
+,0x0593
+,0x038F
+,0x048F
+,0x0492
+,0x0395
+,0x0594
+,0x0593
+,0x038C
+,0x098B
+,0x06A2
+,0xB501
+,0x8801
+,0x8A02
+,0x8602
+,0x8C02
+,0x8203
+,0x8E02
+,0x8002
+,0x9104
+,0x9204
+,0x9102
+,0x8002
+,0x8E02
+,0x8303
+,0x8B02
+,0x8602
+,0x8A00
+,0x8901
+,0xB4AC
+,0x0186
+,0x028C
+,0x0185
+,0x0589
+,0x0188
+,0x0487
+,0x018A
+,0x0484
+,0x018E
+,0x0791
+,0x048F
+,0x0490
+,0x048F
+,0x0490
+,0x0393
+,0x01A7
+,0xA900
+,0x8A01
+,0x8702
+,0x8A01
+,0x8603
+,0x8A01
+,0x8504
+,0x8A01
+,0x8402
+,0x8001
+,0x8A01
+,0x8202
+,0x8201
+,0x8A01
+,0x8102
+,0x8301
+,0x8A01
+,0x8002
+,0x8401
+,0x8A04
+,0x8501
+,0x8A02
+,0x8701
+,0x8A01
+,0x8801
+,0x9501
+,0x9CA2
+,0x0096
+,0x0195
+,0x0193
+,0x0581
+,0x0286
+,0x0781
+,0x0883
+,0x068A
+,0x0281
+,0x0191
+,0x0181
+,0x0192
+,0x0081
+,0x0192
+,0x0081
+,0x0192
+,0x00C8
+,0xFF90
+,0x1581
+,0x15FF
+,0x90C8
+,0x0192
+,0x0081
+,0x0192
+,0x0081
+,0x0192
+,0x0081
+,0x0191
+,0x0182
+,0x0685
+,0x0181
+,0x0383
+,0x0781
+,0x088A
+,0x0581
+,0x018F
+,0x0195
+,0x01BA
+,0x9F00
+,0x9501
+,0x9501
+,0x9401
+,0x9501
+,0x9601
+,0x9502
+,0x9501
+,0x9501
+,0x9501
+,0x9401
+,0x9501
+,0xA6F8
+,0x0189
+,0x0485
+,0x0381
+,0x0C85
+,0x0283
+,0x0AFF
+,0x94A1
+,0x0291
+,0x078E
+,0x0382
+,0x038C
+,0x0186
+,0x018B
+,0x0188
+,0x018A
+,0x0086
+,0x0786
+,0x0E86
+,0x0884
+,0x0187
+,0x0081
+,0x0188
+,0x018A
+,0x0187
+,0x028B
+,0x0186
+,0x01B6
+,0xA900
+,0x8C01
+,0x8601
+,0x8904
+,0x8502
+,0x870E
+,0x8702
+,0x8206
+,0x8001
+,0x8701
+,0x8301
+,0x8600
+,0x8700
+,0x8401
+,0x8601
+,0x8600
+,0x8D01
+,0x8601
+,0x8D00
+,0x8601
+,0x8D00
+,0x9501
+,0x9501
+,0x9CB4
+,0x0086
+,0x008E
+,0x088F
+,0x0182
+,0x018F
+,0x0184
+,0x008F
+,0x0184
+,0x018E
+,0x0184
+,0x018E
+,0x0184
+,0x0090
+,0x0182
+,0x018F
+,0x088E
+,0x0086
+,0x00B9
+,0xB101
+,0x8700
+,0x8100
+,0x8903
+,0x8401
+,0x8100
+,0x8B03
+,0x8201
+,0x8100
+,0x8D02
+,0x8101
+,0x8100
+,0x8F0A
+,0x8C0A
+,0x8A03
+,0x8001
+,0x8100
+,0x8B03
+,0x8201
+,0x8100
+,0x8903
+,0x8401
+,0x8100
+,0x8901
+,0x8601
+,0x8100
+,0x8900
+,0xACFF
+,0x9009
+,0x8208
+,0x8109
+,0x8208
+,0xFF90
+,0xB802
+,0x8500
+,0x8604
+,0x8004
+,0x8302
+,0x8407
+,0x8101
+,0x8401
+,0x8401
+,0x8201
+,0x8301
+,0x8401
+,0x8201
+,0x8301
+,0x8301
+,0x8401
+,0x8201
+,0x8401
+,0x8201
+,0x8401
+,0x8300
+,0x8401
+,0x8301
+,0x8201
+,0x8401
+,0x8402
+,0x8007
+,0x8501
+,0x8304
+,0x8004
+,0x8E01
+,0xBBC8
+,0x0194
+,0x0295
+,0x01C5
+,0x0194
+,0x0295
+,0x01DC
+,0x8902
+,0x9107
+,0x8E01
+,0x8502
+,0x8B01
+,0x8202
+,0x8200
+,0x8B00
+,0x8105
+,0x8200
+,0x8901
+,0x8100
+,0x8301
+,0x8100
+,0x8900
+,0x8101
+,0x8401
+,0x8000
+,0x8900
+,0x8101
+,0x8401
+,0x8000
+,0x8901
+,0x8001
+,0x8400
+,0x8100
+,0x8A00
+,0x8101
+,0x8201
+,0x8100
+,0x8A01
+,0x8100
+,0x8501
+,0x8B01
+,0x8601
+,0x8D02
+,0x8202
+,0x9004
+,0x89BC
+,0x018F
+,0x0381
+,0x018A
+,0x0181
+,0x0481
+,0x018A
+,0x0082
+,0x0181
+,0x0180
+,0x018A
+,0x0082
+,0x0082
+,0x0180
+,0x018A
+,0x0082
+,0x0082
+,0x0180
+,0x018A
+,0x0181
+,0x0081
+,0x0181
+,0x018A
+,0x0881
+,0x018B
+,0x0781
+,0x0195
+,0x01B8
+,0xBA01 // double left arrows, pos 0xE3C = 3644
+,0x9403
+,0x9202
+,0x8001
+,0x9002
+,0x8201
+,0x8F01
+,0x8401
+,0x9101
+,0x9403
+,0x9202
+,0x8001
+,0x9002
+,0x8201
+,0x8F01
+,0x8401
+,0xB6D0 // ..., cursor
+,0x0195
+,0x0190
+,0x0C8B
+,0x0A8D
+,0x088F
+,0x0691
+,0x0493
+,0x0295
+,0x00BC // cursor
+,0xFFFF
+,0xCF89
+,0x0291
+,0x078E
+,0x0185
+,0x028B
+,0x0188
+,0x008B
+,0x0080
+,0x0781
+,0x0089
+,0x0180
+,0x0781
+,0x0089
+,0x0081
+,0x0082
+,0x0084
+,0x0089
+,0x0081
+,0x0082
+,0x0084
+,0x0089
+,0x0180
+,0x0180
+,0x0382
+,0x008A
+,0x0081
+,0x0281
+,0x0181
+,0x008A
+,0x0188
+,0x018B
+,0x0186
+,0x018D
+,0x0282
+,0x0290
+,0x0489
+,0xC900
+,0x9600
+,0x9600
+,0x9600
+,0x9600
+,0x9600
+,0x9600
+,0x9600
+,0xDCCB
+,0x0193
+,0x0591
+,0x0181
+,0x0190
+,0x0183
+,0x018F
+,0x0183
+,0x018F
+,0x0183
+,0x0091
+,0x0592
+,0x03D8
+,0x9F00
+,0x8700
+,0x8D00
+,0x8701
+,0x8C00
+,0x8701
+,0x8C00
+,0x8701
+,0x8C00
+,0x8701
+,0x870B
+,0x8101
+,0x870B
+,0x8101
+,0x8C00
+,0x8701
+,0x8C00
+,0x8701
+,0x8C00
+,0x8701
+,0x8C00
+,0x8701
+,0x8C00
+,0x8700
+,0x9DCA
+,0x0086
+,0x008D
+,0x0184
+,0x028C
+,0x0184
+,0x038C
+,0x0184
+,0x0080
+,0x018C
+,0x0183
+,0x0180
+,0x018C
+,0x0182
+,0x0181
+,0x018D
+,0x0482
+,0x018E
+,0x0283
+,0x01D3
+,0xD100
+,0x8E01
+,0x8401
+,0x8D01
+,0x8601
+,0x8C01
+,0x8200
+,0x8201
+,0x8C01
+,0x8200
+,0x8201
+,0x8C01
+,0x8101
+,0x8201
+,0x8D05
+,0x8001
+,0x8F01
+,0x8103
+,0xD4FF
+,0x9101
+,0x9303
+,0x9301
+,0x9500
+,0xF69D
+,0x1185
+,0x0B95
+,0x0196
+,0x0195
+,0x0195
+,0x0195
+,0x0094
+,0x028B
+,0x0B95
+,0x0295
+,0x0195
+,0x0195
+,0x0085
+,0xFFFF
+,0xCF00
+/*
+,0xB204
+,0x9106
+,0x8F07
+,0x8F08
+,0x8E08
+,0x8D14
+,0x8201
+,0x9501
+,0x9501
+,0x9514
+,0xB2FF
+,0x8001
+,0x9402
+,0x9402
+,0xFF9C
+,0xFF8D
+,0x0096
+,0x0192
+,0x0181
+,0x0093
+,0x0081
+,0x0093
+,0x0394
+,0x01C8
+,0xE200
+,0x9501
+,0x9501
+,0x9509
+,0xFF9B
+,0xBC01
+,0x8C05
+,0x8201
+,0x8B02
+,0x8102
+,0x8101
+,0x8A01
+,0x8501
+,0x8001
+,0x8A00
+,0x8601
+,0x8001
+,0x8A00
+,0x8601
+,0x8001
+,0x8A01
+,0x8401
+,0x8101
+,0x8B07
+,0x8101
+,0x8C04
+,0x8301
+,0x9501
+,0xB8B7
+,0x0086
+,0x008E
+,0x0183
+,0x028F
+,0x0181
+,0x0291
+,0x0493
+,0x0299
+,0x008E
+,0x0183
+,0x028F
+,0x0181
+,0x0291
+,0x0493
+,0x02B9
+,0x9800
+,0x9501
+,0x9000
+,0x8308
+,0x8603
+,0x9103
+,0x9103
+,0x9103
+,0x9102
+,0x8501
+,0x8A02
+,0x8602
+,0x8703
+,0x8601
+,0x8100
+,0x8503
+,0x8701
+,0x8101
+,0x8501
+,0x8808
+,0x9400
+,0x9C98
+,0x0095
+,0x0190
+,0x0083
+,0x0886
+,0x0391
+,0x0391
+,0x0391
+,0x0391
+,0x0292
+,0x0283
+,0x0183
+,0x0185
+,0x0385
+,0x0083
+,0x0283
+,0x0386
+,0x0182
+,0x0180
+,0x0083
+,0x0189
+,0x0081
+,0x0181
+,0x008F
+,0x0382
+,0x0090
+,0x0183
+,0x0082
+,0x9800
+,0x8301
+,0x8F00
+,0x8500
+,0x8F00
+,0x8101
+,0x8101
+,0x8702
+,0x8300
+,0x8101
+,0x8100
+,0x8602
+,0x8606
+,0x8303
+,0x8C01
+,0x8203
+,0x9103
+,0x8401
+,0x8A02
+,0x8602
+,0x8802
+,0x8601
+,0x8100
+,0x8602
+,0x8701
+,0x8101
+,0x8501
+,0x8808
+,0x9400
+,0x9CFF
+,0xFFCF
+,0xB600
+,0x9402
+,0x9302
+,0x9301
+,0x9411
+,0x8412
+,0x8502
+,0x9602
+,0x9502
+,0x9600
+,0xBFBC
+,0x0096
+,0x0295
+,0x0296
+,0x0285
+,0x1284
+,0x1194
+,0x0193
+,0x0293
+,0x0294
+,0x00B9
+,0xA803
+,0x9303
+,0x9600
+,0x9600
+,0x9600
+,0x9600
+,0x9600
+,0x9600
+,0x9600
+,0x9600
+,0x9303
+,0x9303
+,0x9AFF
+,0xFFCF
+,0xFFFF
+,0xCFFF
+/*
+,0xFFCF
+,0xFFFF
+,0xCFFF
+,0xFFCF
+,0xFFFF
+,0xCFFF
+,0xFFCF
+,0xFFFF
+,0xCFFF
+,0xFFCF
+,0xFFFF
+,0xCFFF
+,0xFFCF
+,0xFFFF
+,0xCFFF
+,0xFFCF
+,0xFFFF
+,0xCFFF
+,0xFFCF
+,0xFFFF
+,0xCFFF
+,0xFFCF
+,0xFFFF
+,0xCFFF
+,0xFFCF
+,0xFFFF
+,0xCFFF
+,0xFFCF
+,0xFFFF
+,0xCFFF
+,0xFFCF
+,0xFFFF
+,0xCFFF
+,0xFFCF
+,0xFFFF
+,0xCFFF
+,0xFFCF
+,0xFFFF
+,0xCFFF
+,0xFFCF
+,0xFFFF
+,0xCFFF
+,0xFFCF
+,0xFFFF
+,0xCFFF
+,0xFFCF
+,0xFFFF
+,0xCFFF
+,0xFFCF
+,0xFFFF
+,0xCFFF
+,0xFFCF
+,0xFFFF
+,0xCFFF
+,0xFFCF
+,0xFFFF
+,0xCFFF
+,0xFFCF
+,0xFFFF
+,0xCFFF
+,0xFFCF
+,0xFFFF
+,0xCFFF
+,0xFFCF
+,0xFFFF
+,0xCFFF
+,0xFFCF
+,0xFFFF
+,0xCFFF
+,0xFFCF
+,0xFFFF
+,0xCFFF
+,0xFFCF
+,0xFFFF
+,0xCFFF
+,0xFFCF
+,0xFFFF
+,0xCFFF
+,0xFFCF
+,0xFFFF
+,0xCFFF
+,0xFFCF
+,0xFFFF
+,0xCFFF
+,0xFFCF
+,0xFFFF
+,0xCFFF
+,0xFFCF
+,0xFFFF
+,0xCFFF
+,0xFFCF
+,0xFFFF
+,0xCFFF
+,0xFFCF
+,0xFFFF
+,0xCFFF
+,0xFFCF
+,0xFFFF
+,0xCFFF
+,0xFFCF
+,0xFFFF
+,0xCFFF
+,0xFFCF
+,0xFFFF
+,0xCFFF
+,0xFFCF
+,0xFFFF
+,0xCFFF
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF81F
+,0xF800
+*/
\ No newline at end of file
diff -r 000000000000 -r 96a35aeda5f2 code_part1/OSTC_code_c_part2/ostc28.tbl.txt
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/code_part1/OSTC_code_c_part2/ostc28.tbl.txt Tue Jan 12 15:05:59 2010 +0100
@@ -0,0 +1,205 @@
+0x0000
+,0x000E
+,0x001B
+,0x0048
+,0x007D
+,0x00B4
+,0x00E7
+,0x00F0
+,0x010D
+,0x012A
+,0x014B
+,0x0164
+,0x0170
+,0x0185
+,0x018E
+,0x01A3
+,0x01D6
+,0x01E2
+,0x0215
+,0x0246
+,0x0267
+,0x029C
+,0x02CB
+,0x02EA
+,0x0321
+,0x0352
+,0x0360
+,0x0371
+,0x039C
+,0x03CD
+,0x03F8
+,0x041B
+,0x045C
+,0x047D
+,0x04B8
+,0x04E5
+,0x050E
+,0x0541
+,0x0564
+,0x0597
+,0x05AC
+,0x05CD
+,0x05EA
+,0x060F
+,0x0624
+,0x063D
+,0x0656
+,0x067F
+,0x06A4
+,0x06D5
+,0x0700
+,0x0739
+,0x0752
+,0x076B
+,0x0784
+,0x079D
+,0x07C6
+,0x07DF
+,0x0818
+,0x0837
+,0x084C
+,0x086B
+,0x087C
+,0x0895
+,0x08A1 // a
+,0x08D4
+,0x08F9
+,0x0920
+,0x0945
+,0x097A
+,0x099B
+,0x09E4
+,0x09F9
+,0x0A14
+,0x0A33
+,0x0A54
+,0x0A71
+,0x0A8A
+,0x0A9F
+,0x0AC8
+,0x0AED
+,0x0B12
+,0x0B27
+,0x0B5A
+,0x0B77
+,0x0B8C
+,0x0BA5
+,0x0BBE
+,0x0BE3
+,0x0C04
+,0x0C39
+,0x0C5C
+,0x0C63
+,0x0C86
+,0x0C9F
+,0x0CAD
+,0x0CD6
+,0x0D05
+,0x0D2A
+,0x0D61
+,0x0D6C
+,0x0DAB
+,0x0DB8
+,0x0E05
+,0x0E3C
+,0x0E5D // cursor
+,0x0E70 //
+,0x0E73 // Ū
+,0x0EBA // Ŋ
+,0x0ECB // °
+,0x0EE4 // ą
+,0x0F15 // ē
+,0x0F3C
+,0x0F61
+,0x0F6B // ĩ
+,0x0F86 //
+,0x0F89 //,0x0F9B
+
+/*
+,0x0FA4
+,0x0FB6
+,0x0FC0
+,0x0FEF
+,0x100E
+,0x1039
+,0x1070
+,0x10AB
+,0x10AE
+,0x10C3
+,0x10D8
+,0x10F1 //
+,0x10F4
+,0x10F7
+,0x10FA
+,0x10FD
+,0x1100
+,0x1103
+,0x1106
+,0x1109
+,0x110C
+,0x110F
+,0x1112
+,0x1115
+,0x1118
+,0x111B
+,0x111E
+,0x1121
+,0x1124
+,0x1127
+,0x112A
+,0x112D
+,0x1130
+,0x1133
+,0x1136
+,0x1139
+,0x113C
+,0x113F
+,0x1142
+,0x1145
+,0x1148
+,0x114B
+,0x114E
+,0x1151
+,0x1154
+,0x1157
+,0x115A
+,0x115D
+,0x1160
+,0x1163
+,0x1166
+,0x1169
+,0x116C
+,0x116F
+,0x1172
+,0x1175
+,0x1178
+,0x117B
+,0x117E
+,0x1181
+,0x1184
+,0x1187
+,0x118A
+,0x118D
+,0x1190
+,0x1193
+,0x1196
+,0x1199
+,0x119C
+,0x119F
+,0x11A2
+,0x11A5
+,0x11A8
+,0x11AB
+,0x11AE
+,0x11B1
+,0x11B4
+,0x11B7
+,0x11BA
+,0x11BD
+,0x11C0
+,0x11C3
+,0x11C6
+,0x11C9
+,0x1100
+*/
\ No newline at end of file
diff -r 000000000000 -r 96a35aeda5f2 code_part1/OSTC_code_c_part2/ostc48.drx.txt
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/code_part1/OSTC_code_c_part2/ostc48.drx.txt Tue Jan 12 15:05:59 2010 +0100
@@ -0,0 +1,443 @@
+0x9F9F
+,0xBA03
+,0x9A04
+,0x9A05
+,0x9904
+,0x9B03
+,0x9F9F
+,0xC09F // .. |
+,0x9FBF
+,0x7F9F
+,0x9FBF
+,0xCD03 // 0
+,0x960E
+,0x8E12
+,0x8A16
+,0x8704
+,0x8B07
+,0x8503
+,0x8C03
+,0x8004
+,0x8303
+,0x8B04
+,0x8204
+,0x8202
+,0x8B04
+,0x8403
+,0x8102
+,0x8B03
+,0x8702
+,0x8102
+,0x8A03
+,0x8802
+,0x8102
+,0x8804
+,0x8903
+,0x8002
+,0x8703
+,0x8B02
+,0x8103
+,0x8503
+,0x8C02
+,0x8203
+,0x8204
+,0x8C03
+,0x8303
+,0x8004
+,0x8C03
+,0x8506
+,0x8C04
+,0x8716
+,0x8913
+,0x8E0E
+,0x9503
+,0xCDFF // .. 1
+,0x8400
+,0x9E01
+,0x9C02
+,0x9B02
+,0x9C02
+,0x9B03
+,0x9B02
+,0x9B1D
+,0x811D
+,0x811D
+,0xFFFF
+,0xC0FC
+,0x0185
+,0x0094
+,0x0384
+,0x0291
+,0x0583
+,0x0390
+,0x0682
+,0x0390
+,0x0782
+,0x0290
+,0x0381
+,0x0281
+,0x028F
+,0x0482
+,0x0281
+,0x028E
+,0x0483
+,0x0281
+,0x028D
+,0x0484
+,0x0281
+,0x028D
+,0x0385
+,0x0281
+,0x028C
+,0x0386
+,0x0281
+,0x038A
+,0x0387
+,0x0282
+,0x0288
+,0x0488
+,0x0282
+,0x0386
+,0x0489
+,0x0283
+,0x0D8A
+,0x0284
+,0x0A8C
+,0x0285
+,0x088D
+,0x0287
+,0x0390
+,0x02E0
+,0xFF9A
+,0x0185
+,0x0292
+,0x0483
+,0x0393
+,0x0482
+,0x0295
+,0x0382
+,0x0296
+,0x0281
+,0x0289
+,0x028A
+,0x0281
+,0x0289
+,0x028A
+,0x0281
+,0x0289
+,0x028A
+,0x0281
+,0x0289
+,0x028A
+,0x0281
+,0x0288
+,0x038A
+,0x0282
+,0x0287
+,0x0489
+,0x0282
+,0x0385
+,0x0687
+,0x0383
+,0x0A81
+,0x0384
+,0x0484
+,0x0A81
+,0x0C87
+,0x0684
+,0x0A8A
+,0x0288
+,0x07FF
+,0x84D3
+,0x029A
+,0x0499
+,0x0597
+,0x0796
+,0x0381
+,0x0294
+,0x0482
+,0x0293
+,0x0384
+,0x0291
+,0x0485
+,0x0290
+,0x0387
+,0x028E
+,0x0488
+,0x028D
+,0x038A
+,0x028B
+,0x048B
+,0x028A
+,0x1C81
+,0x1D81
+,0x1D81
+,0x1D94
+,0x029C
+,0x029C
+,0x029C
+,0x02C8
+,0xFA00
+,0x8D06
+,0x8802
+,0x830F
+,0x8704
+,0x820F
+,0x8803
+,0x8209
+,0x8102
+,0x8A03
+,0x8102
+,0x8702
+,0x8C02
+,0x8102
+,0x8702
+,0x8C02
+,0x8102
+,0x8701
+,0x8D02
+,0x8102
+,0x8701
+,0x8E02
+,0x8002
+,0x8701
+,0x8D03
+,0x8002
+,0x8702
+,0x8C02
+,0x8102
+,0x8702
+,0x8C02
+,0x8102
+,0x8703
+,0x8A03
+,0x8102
+,0x8803
+,0x8804
+,0x8102
+,0x8805
+,0x8405
+,0x8202
+,0x890E
+,0x8302
+,0x8A0C
+,0x9408
+,0xE5EC
+,0x0891
+,0x118B
+,0x1588
+,0x1785
+,0x0584
+,0x0286
+,0x0584
+,0x0385
+,0x0289
+,0x0383
+,0x0386
+,0x028A
+,0x0381
+,0x0386
+,0x028C
+,0x0281
+,0x0287
+,0x028C
+,0x0281
+,0x0287
+,0x028D
+,0x0280
+,0x0287
+,0x028C
+,0x0281
+,0x0287
+,0x028C
+,0x0281
+,0x0287
+,0x038B
+,0x0281
+,0x0288
+,0x0389
+,0x0283
+,0x0287
+,0x0584
+,0x0583
+,0x0387
+,0x0E85
+,0x008A
+,0x0C95
+,0x06E6
+,0xFF80
+,0x029C
+,0x029C
+,0x029C
+,0x0297
+,0x0281
+,0x0294
+,0x0581
+,0x0291
+,0x0881
+,0x028F
+,0x0982
+,0x028C
+,0x0985
+,0x0289
+,0x0988
+,0x0287
+,0x088B
+,0x0284
+,0x098D
+,0x0282
+,0x0890
+,0x0B93
+,0x0995
+,0x0698
+,0x049A
+,0x01FC
+,0xF405
+,0x8A03
+,0x8808
+,0x8707
+,0x850A
+,0x8509
+,0x8304
+,0x8105
+,0x830B
+,0x8103
+,0x8504
+,0x8202
+,0x8506
+,0x8803
+,0x8102
+,0x8705
+,0x8902
+,0x8102
+,0x8803
+,0x8A02
+,0x8102
+,0x8803
+,0x8A02
+,0x8102
+,0x8902
+,0x8A02
+,0x8102
+,0x8803
+,0x8A02
+,0x8102
+,0x8804
+,0x8902
+,0x8103
+,0x8606
+,0x8802
+,0x8203
+,0x8303
+,0x8103
+,0x8602
+,0x830B
+,0x8105
+,0x8204
+,0x8408
+,0x840B
+,0x8705
+,0x8609
+,0x9705
+,0xE5E7
+,0x0498
+,0x098B
+,0x0086
+,0x0C89
+,0x0284
+,0x0E88
+,0x0382
+,0x0388
+,0x0388
+,0x0282
+,0x028A
+,0x0387
+,0x0281
+,0x028C
+,0x0287
+,0x0281
+,0x028C
+,0x0287
+,0x0380
+,0x028C
+,0x0287
+,0x0281
+,0x028C
+,0x0287
+,0x0281
+,0x028C
+,0x0287
+,0x0281
+,0x038A
+,0x0287
+,0x0382
+,0x0389
+,0x0286
+,0x0383
+,0x0487
+,0x0285
+,0x0485
+,0x0781
+,0x0381
+,0x0887
+,0x168A
+,0x128F
+,0x0CE9
+,0x9F9F // :
+,0xAB03
+,0x8A03
+,0x8B04
+,0x8904
+,0x8B04
+,0x8905
+,0x8A04
+,0x8904
+,0x8C02
+,0x8B03
+,0x9F9F
+,0xC09F // .. '
+,0x9FC8
+,0x0194
+,0x0A94
+,0x0A94
+,0x0896
+,0x059F
+,0x9FB9
+,0xFFA9 // "
+,0x009B
+,0x0394
+,0x0A94
+,0x0995
+,0x0698
+,0x03FF
+,0x8302
+,0x940A
+,0x940A
+,0x9407
+,0x9704
+,0xFFBA
+,0xC815 // m
+,0x8915
+,0x8915
+,0x8B02
+,0x9B01
+,0x9C01
+,0x9D01
+,0x9D02
+,0x9C04
+,0x9A15
+,0x8A14
+,0x8B13
+,0x8A02
+,0x9B02
+,0x9C01
+,0x9D01
+,0x9D02
+,0x9C15
+,0x8915
+,0x8A14
+,0x8D11
+,0xA0FF
+,0xFFFF
+,0xFFFF
+,0xFF00
diff -r 000000000000 -r 96a35aeda5f2 code_part1/OSTC_code_c_part2/ostc48.tbl.txt
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/code_part1/OSTC_code_c_part2/ostc48.tbl.txt Tue Jan 12 15:05:59 2010 +0100
@@ -0,0 +1,18 @@
+0x0000
+,0x000F // | bzw. /
+,0x0016 // 0
+,0x006B // 1
+,0x0083
+,0x00DC
+,0x012D
+,0x0166
+,0x01C1
+,0x0216
+,0x024C
+,0x02AB // 9
+,0x0302 // :
+,0x031B // '
+,0x032A // "
+,0x0344 // m
+,0x036F //
+,0x0375 // the end
diff -r 000000000000 -r 96a35aeda5f2 code_part1/OSTC_code_c_part2/ostc90.drx.txt
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/code_part1/OSTC_code_c_part2/ostc90.drx.txt Tue Jan 12 15:05:59 2010 +0100
@@ -0,0 +1,718 @@
+0x9BAF
+,0xAFAF
+,0xAFAF
+,0xAFD1
+,0x05B2
+,0x07B0
+,0x08B0
+,0x09AF
+,0x09AF
+,0x09AF
+,0x09AF
+,0x08B1
+,0x07B2
+,0x049B
+,0x9F9F
+,0x9F9F
+,0x9FAE
+,0xFFFF
+,0xFFFF
+,0xFFFF
+,0xFFFF
+,0xFFFF
+,0xFFFF
+,0xFFFF
+,0xFFFF
+,0xFFFF
+,0x8FFF
+,0xFF82
+,0x04AC
+,0x14A1
+,0x1A9B
+,0x2096
+,0x2492
+,0x288F
+,0x0E8A
+,0x108C
+,0x0B94
+,0x0C8A
+,0x0996
+,0x0F87
+,0x0896
+,0x1285
+,0x0797
+,0x0783
+,0x0785
+,0x0697
+,0x0785
+,0x0783
+,0x0696
+,0x0887
+,0x0782
+,0x0596
+,0x078A
+,0x0681
+,0x0596
+,0x078C
+,0x0581
+,0x0594
+,0x088E
+,0x0580
+,0x0494
+,0x0790
+,0x0580
+,0x0493
+,0x0791
+,0x0580
+,0x0491
+,0x0892
+,0x0580
+,0x0490
+,0x0794
+,0x0580
+,0x058E
+,0x0795
+,0x0580
+,0x058C
+,0x0896
+,0x0580
+,0x068A
+,0x0896
+,0x0582
+,0x0688
+,0x0797
+,0x0682
+,0x0785
+,0x0897
+,0x0684
+,0x0783
+,0x0897
+,0x0785
+,0x0880
+,0x0798
+,0x0787
+,0x0F97
+,0x0889
+,0x0D95
+,0x0A8B
+,0x108C
+,0x0E8E
+,0x2891
+,0x2694
+,0x2299
+,0x1CA0
+,0x15AA
+,0x0797
+,0xFFFF
+,0xFFD7
+,0x01B7
+,0x03B4
+,0x04B4
+,0x03B4
+,0x04B4
+,0x04B3
+,0x04B3
+,0x05B3
+,0x05B2
+,0x06B2
+,0x05B2
+,0x06B2
+,0x3681
+,0x3781
+,0x3781
+,0x3781
+,0x3781
+,0x37FF
+,0xFFFF
+,0xFFFF
+,0xFFAC
+,0xFFFF
+,0xFF90
+,0x0389
+,0x00A8
+,0x0587
+,0x03A5
+,0x0786
+,0x05A3
+,0x0885
+,0x07A0
+,0x0A84
+,0x089F
+,0x0B84
+,0x069F
+,0x0D83
+,0x069F
+,0x0E82
+,0x069F
+,0x0881
+,0x0482
+,0x059E
+,0x0883
+,0x0482
+,0x049E
+,0x0884
+,0x0481
+,0x059D
+,0x0885
+,0x0481
+,0x059C
+,0x0787
+,0x0481
+,0x049C
+,0x0788
+,0x0481
+,0x049B
+,0x0789
+,0x0481
+,0x049A
+,0x078A
+,0x0481
+,0x0499
+,0x078B
+,0x0481
+,0x0498
+,0x078C
+,0x0481
+,0x0596
+,0x078D
+,0x0481
+,0x0595
+,0x078E
+,0x0481
+,0x0594
+,0x078F
+,0x0481
+,0x0692
+,0x0790
+,0x0482
+,0x0690
+,0x0791
+,0x0482
+,0x078E
+,0x0792
+,0x0483
+,0x078B
+,0x0893
+,0x0483
+,0x0986
+,0x0A94
+,0x0484
+,0x1995
+,0x0485
+,0x1796
+,0x0486
+,0x1498
+,0x0487
+,0x1299
+,0x0489
+,0x0E9B
+,0x048C
+,0x089D
+,0x05B3
+,0x05BA
+,0xFFFF
+,0xFF8E
+,0x00B7
+,0x028A
+,0x01A8
+,0x0488
+,0x03A5
+,0x0786
+,0x05A3
+,0x0886
+,0x05A5
+,0x0784
+,0x05A7
+,0x0684
+,0x05A8
+,0x0682
+,0x05AA
+,0x0582
+,0x05AA
+,0x0581
+,0x0591
+,0x0495
+,0x0580
+,0x0591
+,0x0495
+,0x0580
+,0x0591
+,0x0495
+,0x0580
+,0x0492
+,0x0495
+,0x0580
+,0x0492
+,0x0495
+,0x0580
+,0x0492
+,0x0495
+,0x0580
+,0x0492
+,0x0594
+,0x0580
+,0x0590
+,0x0694
+,0x0580
+,0x0590
+,0x0694
+,0x0580
+,0x058F
+,0x0892
+,0x0582
+,0x058E
+,0x0892
+,0x0582
+,0x068C
+,0x0A90
+,0x0682
+,0x078A
+,0x0C8E
+,0x0684
+,0x0787
+,0x0681
+,0x068C
+,0x0785
+,0x1581
+,0x0789
+,0x0887
+,0x1383
+,0x1889
+,0x1185
+,0x168B
+,0x0F87
+,0x148D
+,0x0C8A
+,0x1291
+,0x078E
+,0x0EAC
+,0x0AFF
+,0xB8FF
+,0xFF8B
+,0x05B2
+,0x06B0
+,0x08AF
+,0x09AD
+,0x0BAC
+,0x0CAA
+,0x0EA9
+,0x0781
+,0x05A7
+,0x0882
+,0x05A6
+,0x0784
+,0x05A4
+,0x0786
+,0x05A3
+,0x0787
+,0x05A1
+,0x0789
+,0x059F
+,0x088A
+,0x059E
+,0x078C
+,0x059C
+,0x088D
+,0x059B
+,0x078F
+,0x0599
+,0x0890
+,0x0598
+,0x0792
+,0x0596
+,0x0794
+,0x0595
+,0x0795
+,0x0593
+,0x0797
+,0x0592
+,0x3581
+,0x3781
+,0x3781
+,0x3781
+,0x3781
+,0x3781
+,0x37A4
+,0x05B3
+,0x05B3
+,0x05B3
+,0x05B3
+,0x05B3
+,0x05B3
+,0x058F
+,0xFFFF
+,0xFF8C
+,0x01A2
+,0x0092
+,0x0392
+,0x1090
+,0x0585
+,0x1C8F
+,0x0784
+,0x1D8E
+,0x0883
+,0x1D8E
+,0x0883
+,0x1C91
+,0x0782
+,0x1B93
+,0x0682
+,0x058E
+,0x0595
+,0x0681
+,0x058E
+,0x0497
+,0x0581
+,0x058E
+,0x0497
+,0x0581
+,0x058D
+,0x0598
+,0x0580
+,0x058D
+,0x0499
+,0x0580
+,0x058D
+,0x0499
+,0x0580
+,0x058D
+,0x0499
+,0x0580
+,0x058D
+,0x0499
+,0x0580
+,0x058D
+,0x0499
+,0x0580
+,0x058D
+,0x0499
+,0x0580
+,0x058D
+,0x0499
+,0x0580
+,0x058D
+,0x0499
+,0x0580
+,0x058D
+,0x0597
+,0x0581
+,0x058D
+,0x0597
+,0x0581
+,0x058E
+,0x0595
+,0x0681
+,0x058E
+,0x0693
+,0x0682
+,0x058E
+,0x0791
+,0x0782
+,0x058F
+,0x088D
+,0x0883
+,0x0590
+,0x0A87
+,0x0B83
+,0x0591
+,0x1C84
+,0x0592
+,0x1A85
+,0x0593
+,0x1886
+,0x0594
+,0x15A5
+,0x11AA
+,0x0CC5
+,0xFFFF
+,0xF111
+,0xA21B
+,0x9A21
+,0x9426
+,0x9029
+,0x8E2B
+,0x8C0D
+,0x8505
+,0x850E
+,0x880B
+,0x8805
+,0x8B09
+,0x8808
+,0x8906
+,0x8E08
+,0x8607
+,0x8B05
+,0x9107
+,0x8407
+,0x8B05
+,0x9306
+,0x8306
+,0x8C05
+,0x9506
+,0x8205
+,0x8D05
+,0x9605
+,0x8106
+,0x8D04
+,0x9706
+,0x8005
+,0x8D05
+,0x9805
+,0x8005
+,0x8D05
+,0x9805
+,0x8004
+,0x8E04
+,0x990B
+,0x8E04
+,0x990B
+,0x8E05
+,0x980B
+,0x8E05
+,0x980B
+,0x8E05
+,0x9805
+,0x8004
+,0x8E06
+,0x9605
+,0x8104
+,0x8F05
+,0x9605
+,0x8105
+,0x8E06
+,0x9405
+,0x8205
+,0x8F07
+,0x9007
+,0x8305
+,0x8E09
+,0x8C08
+,0x8407
+,0x8D0B
+,0x860A
+,0x8507
+,0x8E1B
+,0x8705
+,0x9019
+,0x8903
+,0x9217
+,0x8B00
+,0x9613
+,0xA70F
+,0xAD07
+,0xC8FF
+,0xFFFF
+,0x9605
+,0xB305
+,0xB305
+,0xB305
+,0xB305
+,0xB305
+,0xAF01
+,0x8105
+,0xAC04
+,0x8105
+,0xA907
+,0x8105
+,0xA60A
+,0x8105
+,0xA40C
+,0x8105
+,0xA10F
+,0x8105
+,0x9E12
+,0x8105
+,0x9B13
+,0x8305
+,0x9813
+,0x8605
+,0x9612
+,0x8905
+,0x9312
+,0x8C05
+,0x9012
+,0x8F05
+,0x8E11
+,0x9205
+,0x8B11
+,0x9505
+,0x8910
+,0x9805
+,0x8610
+,0x9B05
+,0x840F
+,0x9E05
+,0x8110
+,0xA015
+,0xA312
+,0xA610
+,0xA80D
+,0xAB0B
+,0xAD09
+,0xAF06
+,0xB204
+,0xFFA7
+,0xFFFF
+,0xCA03
+,0xB10B
+,0xAB0F
+,0x9007
+,0x8F11
+,0x8D0C
+,0x8A14
+,0x8A0F
+,0x8816
+,0x8811
+,0x8618
+,0x8614
+,0x8407
+,0x8708
+,0x8515
+,0x8306
+,0x8B07
+,0x8406
+,0x8608
+,0x8106
+,0x8D06
+,0x8306
+,0x8907
+,0x8004
+,0x9006
+,0x8205
+,0x8B0C
+,0x9105
+,0x8105
+,0x8D0A
+,0x9205
+,0x8104
+,0x8F08
+,0x9405
+,0x8004
+,0x9006
+,0x9505
+,0x8004
+,0x9006
+,0x950B
+,0x9105
+,0x950B
+,0x9105
+,0x950B
+,0x9205
+,0x940B
+,0x9106
+,0x9405
+,0x8004
+,0x9107
+,0x9305
+,0x8005
+,0x8F08
+,0x9304
+,0x8105
+,0x8E0A
+,0x9105
+,0x8106
+,0x8C0C
+,0x8F06
+,0x8206
+,0x8906
+,0x8106
+,0x8E05
+,0x8308
+,0x8508
+,0x8107
+,0x8C06
+,0x8415
+,0x8308
+,0x8807
+,0x8613
+,0x850A
+,0x820A
+,0x8711
+,0x8716
+,0x890F
+,0x8914
+,0x8B0C
+,0x8C12
+,0x8F06
+,0x9010
+,0xAA0C
+,0xAF06
+,0xC5FF // .., 9
+,0xFFE9
+,0x09AC
+,0x0F98
+,0x008D
+,0x1395
+,0x028A
+,0x1792
+,0x0488
+,0x1990
+,0x0686
+,0x1B8E
+,0x0785
+,0x0988
+,0x0A8F
+,0x0683
+,0x088D
+,0x0790
+,0x0582
+,0x0790
+,0x078F
+,0x0582
+,0x0693
+,0x0590
+,0x0580
+,0x0694
+,0x068F
+,0x0580
+,0x0596
+,0x058F
+,0x0580
+,0x0597
+,0x048F
+,0x0580
+,0x0498
+,0x048F
+,0x0580
+,0x0498
+,0x058E
+,0x0B98
+,0x058E
+,0x0B98
+,0x048F
+,0x0580
+,0x0498
+,0x048E
+,0x0581
+,0x0597
+,0x048E
+,0x0581
+,0x0596
+,0x058D
+,0x0681
+,0x0695
+,0x048E
+,0x0583
+,0x0594
+,0x058D
+,0x0683
+,0x0693
+,0x048D
+,0x0685
+,0x0790
+,0x058B
+,0x0786
+,0x098D
+,0x058A
+,0x0888
+,0x0B88
+,0x0687
+,0x0C89
+,0x2D8C
+,0x2B8F
+,0x2793
+,0x2496
+,0x1F9D
+,0x17A9
+,0x07D3 // end of 9
+,0xFF00
diff -r 000000000000 -r 96a35aeda5f2 code_part1/OSTC_code_c_part2/ostc90.tbl.txt
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/code_part1/OSTC_code_c_part2/ostc90.tbl.txt Tue Jan 12 15:05:59 2010 +0100
@@ -0,0 +1,13 @@
+0x0000 // .
+,0x0022 //
+,0x0035 // 0
+,0x00D2
+,0x0100
+,0x01A8
+,0x0243
+,0x02AC
+,0x0354
+,0x03ED
+,0x0454
+,0x04FF // 9
+,0x059A // end
diff -r 000000000000 -r 96a35aeda5f2 code_part1/OSTC_code_c_part2/ostc_bigscreen.cof
Binary file code_part1/OSTC_code_c_part2/ostc_bigscreen.cof has changed
diff -r 000000000000 -r 96a35aeda5f2 code_part1/OSTC_code_c_part2/ostc_bigscreen.hex
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/code_part1/OSTC_code_c_part2/ostc_bigscreen.hex Tue Jan 12 15:05:59 2010 +0100
@@ -0,0 +1,513 @@
+:020000040000FA
+:0600000000EF48F01200C1
+:1090000000010A0E7C6F00010A0E7D6F00017A6973
+:1090100000017B6900017E6B00017F6B0001200E67
+:10902000606F0001210E616F0001220E626F00016E
+:0E9030003A0E636F0001646B90EC5BF012006F
+:109A0000AF9BAFAFAFAFD1AFB205B007B008AF09F2
+:109A1000AF09AF09AF09B108B2079B049F9F9F9F91
+:109A2000AE9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7
+:109A3000FFFFFFFFFF8F82FFAC04A1149B1A96204B
+:109A400092248F288A0E8C10940B8A0C9609870F0B
+:109A5000960885129707830785079706850783076A
+:109A600096068708820796058A07810696058C0761
+:109A7000810594058E088005940490078005930461
+:109A80009107800591049208800590049407800551
+:109A90008E05950780058C05960880058A06960830
+:109AA000820588069707820685079708840683073C
+:109AB00097088507800898078707970F8908950DED
+:109AC0008B0A8C108E0E912894269922A01CAA1520
+:109AD0009707FFFFD7FFB701B403B404B403B4047E
+:109AE000B304B304B305B205B206B205B2068136BB
+:109AF0008137813781378137FF37FFFFFFFFACFFA9
+:109B0000FFFF90FF8903A8008705A5038607A3052B
+:109B10008508A007840A9F08840B9F06830D9F0673
+:109B2000820E9F06810882049E05830882049E049B
+:109B3000840881049D05850881049C0587078104AC
+:109B40009C04880781049B04890781049A048A077E
+:109B5000810499048B07810498048C07810496057D
+:109B60008D07810495058E07810494058F07810474
+:109B70009206900782049006910782048E0792074E
+:109B800083048B07930883048609940A8404951937
+:109B900085049617860498148704991289049B0EED
+:109BA0008C049D08B305BA05FFFF8EFFB7008A023B
+:109BB000A8018804A5038607A3058608A5058407D0
+:109BC000A7058406A8058206AA058205AA058105BF
+:109BD00091059504800591059504800591059504EE
+:109BE00080059204950480059204950480059204F2
+:109BF00095048005920494058005900594068005DF
+:109C00009005940680058F05920882058E059208BE
+:109C100082058C06900A82068A078E0C84068707C6
+:109C200081068C06850781158907870883138918A3
+:109C300085118B16870F8D148A0C91128E07AC0E2E
+:109C4000FF0AFFB88BFFB205B006AF08AD09AC0B39
+:109C5000AA0CA90E8107A7058208A6058407A405FA
+:109C60008607A3058707A10589079F058A089E0522
+:109C70008C079C058D089B058F0799059008980512
+:109C80009207960594079505950793059707920502
+:109C9000813581378137813781378137A437B305E3
+:109CA000B305B305B305B305B3058F05FFFF8CFFFF
+:109CB000A20192009203901085058F1C84078E1DCF
+:109CC00083088E1D8308911C8207931B82068E05D4
+:109CD000950581068E05970481058E0597048105FB
+:109CE0008D05980580058D05990480058D059904DD
+:109CF00080058D05990480058D05990480058D05E5
+:109D0000990480058D05990480058D0599048005C9
+:109D10008D05990480058D05970581058D059705AD
+:109D200081058E05950581068E05930682068E05B2
+:109D3000910782078F058D0883089005870A830B9A
+:109D40009105841C9205851A930586189405A5151E
+:109D5000AA11C50CFFFF11F11BA2219A269429908C
+:109D60002B8E0D8C05850E850B880588098B088840
+:109D70000689088E0786058B07910784058B069355
+:109D80000683058C06950582058D05960681048D52
+:109D900006970580058D05980580058D059804803A
+:109DA000048E0B99048E0B99058E0B98058E0B98DB
+:109DB000058E05980480068E05960481058F05960C
+:109DC0000581068E05940582078F07900583098E0D
+:109DD000088C07840B8D0A8607851B8E05871990D2
+:109DE00003891792008B13960FA707ADFFC8FFFFDB
+:109DF000059605B305B305B305B305B301AF0581FA
+:109E000004AC058107A905810AA605810CA405817A
+:109E10000FA10581129E0581139B0583139805866A
+:109E2000129605891293058C1290058F118E05925A
+:109E3000118B0595108905981086059B0F84059E4A
+:109E4000108115A012A310A60DA80BAB09AD06AF8B
+:109E500004B2A7FFFFFF03CA0BB10FAB0790118F2E
+:109E60000C8D148A0F8A1688118818861486078428
+:109E7000088715850683078B068408860681068D6C
+:109E8000068307890480069005820C8B0591058165
+:109E90000A8D05920481088F05940480069005952B
+:109EA000048006900B9505910B9505910B950592F5
+:109EB0000B94069105940480079105930580088F03
+:109EC000049305810A8E059106810C8C068F06820B
+:109ED00006890681058E088308850781068C15840E
+:109EE0000883078813860A850A82118716870F89D7
+:109EF00014890C8B128C068F10900CAA06AFFFC52C
+:109F0000E9FFAC09980F8D0095138A029217880417
+:109F1000901986068E1B850788098F0A83068D088F
+:109F20009007820590078F078205930690058005AC
+:109F300094068F06800596058F05800597058F048A
+:109F4000800598048F04800598048E05980B8E0573
+:109F5000980B8F04800598048E04810597058E0464
+:109F6000810596058D05810695068E048305940569
+:109F70008D05830693068D04850690078B0586075D
+:109F80008D098A058808880B8706890C8C2D8F2BF4
+:0C9F9000932796249D1FA917D30700FFFC
+:109FA000000022003500D2000001A8014302AC02EB
+:0A9FB0005403ED035404FF049A0566
+:069FBA0000EE00F00D0EA8
+:089FC000EE6AEA62FDD712000F
+:10A0000000000F0016006B008300DC002D016601CC
+:10A01000C10116024C02AB0202031B032A034403D4
+:04A020006F03750352
+:0CA024009F9F03BA049A059A0499039BBD
+:10A030009F9F9FC0BF9F9F7FBF9F03CD0E96128E95
+:10A04000168A0487078B0385038C04800383048BA3
+:10A0500004820282048B03840281038B02870281C3
+:10A06000038A028802810488038902800387028BA5
+:10A0700003810385028C03820482038C03830480A2
+:10A08000038C0685048C168713890E8E0395FFCDED
+:10A090000084019E029C029B029C039B029B1D9BD1
+:10A0A0001D811D81FFFFFCC0850194008403910286
+:10A0B0008305900382069003820790028103810248
+:10A0C0008F02820481028E02830481028D02840445
+:10A0D00081028D02850381028C02860381028A033C
+:10A0E000870382028802880482028603890483022D
+:10A0F0008A0D84028C0A85028D0887029003E00293
+:10A100009AFF8501920283049303820495028203DD
+:10A110009602810289028A02810289028A028102F0
+:10A1200089028A02810289028A02810288028A03E4
+:10A130008202870289048202850387068303810ADB
+:10A1400084038404810A870C84068A0A8802FF0734
+:10A15000D3849A0299049705960781039402820496
+:10A160009302840391028504900287038E0288047F
+:10A170008D028A038B028B048A02811C811D811D42
+:10A18000941D9C029C029C02C80200FA068D028863
+:10A190000F8304870F82038809820281038A028168
+:10A1A0000287028C02810287028C02810187028D64
+:10A1B00002810187028E02800187038D028002875F
+:10A1C000028C02810287028C02810387038A02814A
+:10A1D0000388048802810588058402820E8902832F
+:10A1E0000C8A0894ECE591088B1188158517840575
+:10A1F0008602840585038902830386038A0281031C
+:10A2000086038C02810287028C02810287028D0202
+:10A21000800287028C02810287028C0281028702FF
+:10A220008B038102880289038302870284058305E8
+:10A230008703850E8A00950CE60680FF9C029C022F
+:10A240009C029702810294028105910281088F028B
+:10A2500082098C0285098902880987028B08840299
+:10A260008D0982029008930B950998069A04FC01C7
+:10A2700005F4038A088807870A8509850483058110
+:10A280000B8303810485028206850388028105878A
+:10A29000028902810388028A02810388028A02817C
+:10A2A0000289028A02810388028A02810488028963
+:10A2B00003810686028803820383038102860B835F
+:10A2C0000581048208840B84058709860597E7E5E4
+:10A2D00098048B098600890C8402880E8203880307
+:10A2E000880382028A02870381028C02870281022C
+:10A2F0008C02870280038C02870281028C02870213
+:10A3000081028C02870281028A0387028203890309
+:10A3100086028303870485028504810781038708F9
+:10A320008A168F12E90C9F9F03AB038A048B048962
+:10A33000048B0589048A0489028C038B9F9F9FC02C
+:10A34000C89F9401940A940A96089F05B99FA9FF93
+:10A350009B009403940A95099806FF0302830A94CC
+:10A360000A9407940497BAFF15C815891589028BBA
+:10A37000019B019C019D029D049C159A148A138BDC
+:10A38000028A029B019C019D029D159C1589148ADD
+:0AA39000118DFFA0FFFFFFFF00FF8B
+:06A39A0000000E001B0094
+:10A3A00048007D00B400E700F0000D012A014B01D8
+:10A3B0006401700185018E01A301D601E20115023D
+:10A3C000460267029C02CB02EA02210352036003A9
+:10A3D00071039C03CD03F8031B045C047D04B804E3
+:10A3E000E5040E05410564059705AC05CD05EA05B4
+:10A3F0000F0624063D0656067F06A406D50600076E
+:10A40000390752076B0784079D07C607DF0718083F
+:10A4100037084C086B087C089508A108D408F9088F
+:10A42000200945097A099B09E409F909140A330A44
+:10A43000540A710A8A0A9F0AC80AED0A120B270BEE
+:10A440005A0B770B8C0BA50BBE0BE30B040C390CD2
+:10A450005C0C630C860C9F0CAD0CD60C050D2A0D04
+:10A46000610D6C0DAB0DB80D050E3C0E5D0E700E42
+:10A47000730EBA0ECB0EE40E150F3C0F610F6B0F6F
+:04A48000860F890FAB
+:08A4880003F8018A0C85028231
+:10A490000A85028394FF00CD0591039101C70591C0
+:10A4A00003919DDA83018F0183018F018301880667
+:10A4B000870D81078F0183018F0183018F01820145
+:10A4C0008607890D83058F0183018F018301A20017
+:10A4D00002B40186048A0186018802810185008810
+:10A4E000018300860287028201851285018502842C
+:10A4F000018400870185018301880284018201892A
+:10A50000058403929A9F9203880585018301850142
+:10A51000860283018400890282058B0382039202F2
+:10A5200082028C02830289048402820186018503EF
+:10A53000830186008701820191019D0403A4069195
+:10A5400004880281028208860185008602840185D2
+:10A5500000860384018401860582018306860282C7
+:10A560000180038803850294069201900082FF9D7A
+:10A570000194069002918BFF07E70C8C03890387F7
+:10A580000286028B0184028E018201910181029177
+:10A5900000800093B0B093008100910181018F028F
+:10A5A00082028D0284028B028602870389038D0B4F
+:10A5B000E707009F019601950282009002810491B5
+:10A5C000078D078F04940092028101900183018F0F
+:10A5D0000095A0A6950195019501950191018B0A21
+:10A5E000900B9501950195019501A40188FF8201C9
+:10A5F0008F0190069404FC0001B801950195019526
+:10A60000019501950195019501950195FFBC018783
+:10A610000295029494FF01C1039304900490049066
+:10A6200003900391039103910193A0C490028B0ABC
+:10A6300085028903860187058601830186018600DC
+:10A6400084018601840085028601820186028601DA
+:10A6500080028701880184048B03900AA30201CA47
+:10A66000019501941095108694FF00B3018B01872A
+:10A670000389018604890186028801800086018899
+:10A68000018200860187018301860185018402869B
+:10A69000018301850687018604880187BFB488018C
+:10A6A0008B0087018C01860185008501860185006C
+:10A6B0008501860185008501860183018502860169
+:10A6C000810280018301880182049205B70300A4FE
+:10A6D0000294049202910180028F0182028E018312
+:10A6E000028C0185108B1086029001940096B7A110
+:10A6F0008501880083088702820285018701840022
+:10A700008700860184008700860184008700860117
+:10A710008400860186018400850187018500870801
+:10A720008600B60608B50C8C028901820283018777
+:10A7300001830186018601830186008600840187EA
+:10A7400000860184018601860283018401870884D2
+:10A75000058FB1B7960096008D0086018A008604A9
+:10A760008700880585008B0482008D059006930381
+:10A77000C30104BB04890682028702800180018331
+:10A780000187028301850086018501850086018598
+:10A790000185018602830185028601810180018392
+:10A7A0000588068102890484B3B68605880084077B
+:10A7B0008701840284018601860184008601870066
+:10A7C000830186018700840086018501830187015A
+:10A7D0008402820188028B0DB80901FE0186028C79
+:10A7E0000285028B028594FF01FF018601820286A9
+:10A7F0000685028704850094A0FC950193029303CB
+:10A80000810091018101900183018F0184018D01FB
+:10A8100085018D0186018B0187018B0188018901EA
+:10A8200089019E01009E00840090008400900084B5
+:10A8300000900084009000840090008400900084C8
+:10A8400000900084009000840090008400900084B8
+:10A85000009000849AA189018A0188018A018701F8
+:10A860008C0186018C0185018E0184018E0183019A
+:10A870009001810192018100920194039402A4014C
+:10A8800001B101950194019501940188028201842E
+:10A890000486028101850284018402860282068F79
+:10A8A00004919DBF8D0781048A04870288028B0171
+:10A8B0008701840183038700840082058601830069
+:10A8C0008201820186018300840082008601820168
+:10A8D0008400820086018102830082018701820A4E
+:10A8E0008A00A10802A70491048F068F048D0182BB
+:10A8F000038B0185048C0183048F018005910494EE
+:10A9000004950294999C8610861085008501860125
+:10A910008500860086018500860086018500860008
+:10A9200086018500850186018301850286018301F8
+:10A9300084028702800581028902820393059F02B7
+:10A94000069E0A8E038A0385018902890187028B8C
+:10A950000086018D0086018D0086018D0186018CA7
+:10A960000186018B028802880089008A999E8610E0
+:10A9700086108D0086018D0086018D0086018D0078
+:10A9800086018C0186018C0186018A02880186037A
+:10A990008B028E0AA20510B1108600860185018502
+:10A9A0000086018501850086018501850086018577
+:10A9B0000185008601850185008601850185008667
+:10A9C000018501850086018DB1B486108610850051
+:10A9D0008E0185008F0085008F0085008F00850027
+:10A9E0008F0085008F0085008F00C400069E0B8DB0
+:10A9F000028A02870288018A0187018C0086018D04
+:10AA00000086018D0086008701840186008601840E
+:10AA10000186008600840288068400890585B19E2F
+:10AA200086108D10950195019501950195018E0176
+:10AA30008610B41000B1008E0086018D0086018D55
+:10AA40000086018D108610860086018D0086018D9E
+:10AA50000086018DBFCC9601950186018D0086018F
+:10AA60008D0086018C008701870F890D9600960066
+:10AA7000AC0010991086028D02930493029102801B
+:10AA8000028F0282018D0385018A02880188038A70
+:10AA90000086018D0096B19C861095109501950158
+:10AAA00095019501950195019501B40110991086C4
+:10AAB00003870395039503950293029203920391F2
+:10AAC00010921086999C8610861095039502950326
+:10AAD0009503950395039502870386109C10089DA6
+:10AAE0000C8C028903870187018B0187018C00860A
+:10AAF000018D0086018D0186018C0186018B028803
+:10AB000002880C89088CB1A08610861086008E0001
+:10AB100086008E0086008E0086008E0084018E01E5
+:10AB200084018E0182028F029206A702089D0C8C7E
+:10AB3000028902880187028B0186018C0086028EC1
+:10AB40000084048E0182018C01810182018C0181CB
+:10AB50000283028801820C8401830886B1A08610DA
+:10AB6000861086008E0086008E0086008E0086008D
+:10AB70008D0184018B04840180018903830788038C
+:10AB800086058A028A009C0003B302860588018636
+:10AB90000187028201860186018301860086018584
+:10ABA0000185008601850185008601850185018674
+:10ABB0000185028302860284028101880585019352
+:10ABC00099A0960096009600960096008610861032
+:10ABD0009600960096009600AC000C990E8A02959D
+:10ABE00001950196019501950195019402940E87B6
+:10ABF0000C8899A0950194049405940594059205F8
+:10AC00008F048F048F048F049204AB0105990A927C
+:10AC100009920490058E048E05900694069406927F
+:10AC20000989068AA9A686008B0186028803880303
+:10AC300084038B0381038F0391058F0581038C03AC
+:10AC400085028803870387038B0196029C00009985
+:10AC500002960395039503950A94098D048B04903D
+:10AC6000039002920094A9AC86008C0086028A00B0
+:10AC700086048900800286018700810386018500A1
+:10AC80008303860184008502860182008603860193
+:10AC90008000880386018A0386018B0295019C014E
+:10ACA00015DF0181019101810191018101910181F2
+:10ACB0000191018101910181019100820091B0B265
+:10ACC00095019503950395039503940495049503C5
+:10ACD0009503B30100B000910182019101810191BE
+:10ACE0000181019101810191018101910181019114
+:10ACF0001581CEE19401920292029402960295028D
+:10AD00009503D60100AB009600960096009600963B
+:10AD1000009600960096009600960096E09A95019F
+:10AD2000950395029502FF00A68993018C04830187
+:10AD300080018B02830082018A01830184008A00E2
+:10AD4000830184008A00830184008A0083018300D8
+:10AD50008C00820182008C018C0BB40A12AF11842A
+:10AD6000018C0186008C0188018A0188018A018892
+:10AD7000018A0188018B0286038B0283088D04906F
+:10AD8000B8A08F068D0884028C0286018A02880191
+:10AD90008A0188018A0188018A0188018B01860164
+:10ADA0008C0185028D01A60004A10890028D028409
+:10ADB000018C0286018A0188018A0188018A018842
+:10ADC000008B0088018C018611861284A2B4920245
+:10ADD0008E0780048C03810182018B018201830133
+:10ADE0008A01820183018A01820183018A01820131
+:10ADF00083018B01810183018B0182058D01830415
+:10AE0000B50001B601950195109003850181018F70
+:10AE10000183008F0184018E0184018E00840190E2
+:10AE20000295AAAB8902810480018704810B860107
+:10AE300083018101830186008500820083008501F2
+:10AE400085008200830085018500820083008501E2
+:10AE500083018201830086018305830086008405C7
+:10AE600081018601890087048B009A0112AF128448
+:10AE7000018C019400950195019502950B950A8C22
+:10AE8000CDB488018A0188018A0188018501820187
+:10AE9000850C8201950C95019501CC0101C40196A8
+:10AEA0000185018D0185018D0185018D0185018C53
+:10AEB0000181108202810F810182AFDC84128F1226
+:10AEC0009402940192038001900282018E02840117
+:10AED0008C0286018A03890096019C0000B0018ED5
+:10AEE0000184018E0184018E0184018E12841284FA
+:10AEF00001950195019500969DB48A0C8B0C9500E7
+:10AF0000950195018B0C8B0B9401950195018B0C90
+:10AF10009C0B0CB50C8A018C019400950195019550
+:10AF200002950B950A8CA1B491048E0782028C03C2
+:10AF300086018B0188018A0188018A0188018A01C2
+:10AF400088018B0186018C0183038D029008A00487
+:10AF500011B5108501870186008C0088018B01885E
+:10AF6000018A0188018A0188018B0286028B028492
+:10AF7000088D0490A1A090048D0883028C038700A3
+:10AF80008A0288018A0188018A0188018B01880070
+:10AF90008C0086018C01860FAF110CCD0C8A018CC0
+:10AFA0000194009501950195019501960095B8A72A
+:10AFB00085008C0183048C0184048A018201830151
+:10AFC0008A01820183018A01820183018A0183014E
+:10AFD00082018B01830082018B0182018D05830038
+:10AFE000B60301B5019501950E920F88018A01887B
+:10AFF000018A0188018A0188018A01880194B5B516
+:10B000008C0A950B950296019600950095008B0190
+:10B010008A0CB40C009D0396049404950494049443
+:10B020000393039103910490039000939DA89305CB
+:10B03000930893058F038F04920495039405930559
+:10B040008C038B09A20601B50188028A0286028C54
+:10B050000382028E02800491049202910280028E89
+:10B060000383028B0286008A0189ACB486018C02BC
+:10B0700085018905880187048A0184048E0191076E
+:10B080008F0490048F0490049303A70100A9018A00
+:10B090000287018A0386018A0485018A028401806D
+:10B0A000018A02820182018A02810183018A02806F
+:10B0B0000184048A0185028A0187018A0188019539
+:10B0C000A29C960095019301810586028107830861
+:10B0D0008A06810291018101920181009201810021
+:10B0E0009201C80090FF8115FF15C8909201810060
+:10B0F0009201810092018100910182018506810106
+:10B10000830381078A0881058F019501BA01009F99
+:10B11000019501950194019501960295019501957E
+:10B12000019501940195F8A6890185048103850C98
+:10B130008302FF0AA19491028E0782038C03860189
+:10B140008B0188018A0186008607860E84088701A4
+:10B15000810088018A0187018B028601B60100A95E
+:10B16000018C0186048902850E8702870682018090
+:10B170000187018300860087018401860086018D96
+:10B180000186008D0186008D01950195B49C860095
+:10B190008E008F0882018F0184018F0084018E014F
+:10B1A00084018E018401900082018F018E08860047
+:10B1B000B90001B100870081038901840081038BFC
+:10B1C00001820081028D018100810A8F0A8C038A2D
+:10B1D00001800081038B0182008103890184008149
+:10B1E0000189018600810089FFAC099008820981EC
+:10B1F000088290FF02B800850486048002830784D9
+:10B20000018101840184018201830184018201831F
+:10B21000018301840182018401820184008301840D
+:10B2200001830182018402840780018504830480F4
+:10B23000018EC8BB94019502C50194019502DC0101
+:10B2400002890791018E0285018B02820082008BA8
+:10B2500005810082018900810183008100890181CB
+:10B2600001840080008901810184008001890180BE
+:10B2700000840081008A018101820081018A0081AD
+:10B280000185018B0186028D02820490BC898F01A9
+:10B2900081038A01810181048A0182008101800188
+:10B2A0008A018200820080018A018200820080017E
+:10B2B0008A018101810081018A0181088B01810756
+:10B2C0009501B80101BA03940292018002900182B3
+:10B2D000018F018401910394029201800290018206
+:10B2E000018F0184D0B6950190018B0C8D0A8F08D7
+:10B2F000910693049502BC00FFFF89CF91028E074F
+:10B3000085018B0288018B00800081078900800104
+:10B310008107890081008200840089008100820009
+:10B32000840089008001800182038A0081008102FB
+:10B3300081018A0088018B0186018D0182029002C1
+:10B34000890400C900960096009600960096009623
+:10B350000096CBDC930191058101900183018F015F
+:10B3600083018F01830191009205D803009F00871C
+:10B37000008D0187008C0187008C0187008C01877C
+:10B380000B8701810B870181008C0187008C01876D
+:10B39000008C0187008C0187008C0087CA9D860085
+:10B3A0008D0084018C0284018C03840180008C0157
+:10B3B000830180018C01820181018D0182048E0153
+:10B3C0008302D30100D1018E0184018D0186018C9D
+:10B3D00000820182018C00820182018C0181018244
+:10B3E000058D0180018F0381FFD4019103930193A7
+:10B3F00000959DF68511950B960195019501950196
+:10B4000094008B02950B9502950195018500FFFF35
+:02B4100000CF6B
+:06B4680090EC5BF0120005
+:02B46E000000DC
+:10B47000849083C083FF80948084120085C000F094
+:10B48000016A00C086F084C087F0848086C083FF94
+:10B490008094808487C083FF8094808412008EC053
+:10B4A00083FF809480848094808412007AC083FF1C
+:10B4B000809480847BC083FF80948084120000018C
+:10B4C000350E836FD5DF00017D510001846F856BE0
+:10B4D0000001D89084378537D1DF0001360E836FA5
+:10B4E000C7DF00013F0E846F010E856FC7DF0001CB
+:10B4F000370E836FBDDF00017C510001846F856BC7
+:10B50000020E00017E5D07E13A0E00018427000E65
+:10B510000001852310D000017E0507E1200E000107
+:10B520008427000E0001852306D0180E0001842711
+:10B53000000E0001852300018407000E855B0001D9
+:10B54000EF0ED8808455000E855504E2EF0E000101
+:10B55000846F856B7CC000F000C001F0006A005071
+:10B560000001841301500001851388DF0001200EC3
+:10B57000836F7EDF00017C510001846F856B7EDF6D
+:10B580000001210E836F74DF00017D510001846F83
+:10B59000856B0001D8908437853770DF1200200E4C
+:10B5A0000001825D03E10001B60E826F000182514D
+:10B5B0007E0803E2220E0001825F210E0001825DFF
+:10B5C00004E300018251A30803E20001820E826FAE
+:10B5D000210E0001825DF66EF76AD890F636F736D6
+:10B5E0009A0EF626A30EF7220900F5CF88F00A007E
+:10B5F000F5CF89F000018229DF0FF66EF76AD89047
+:10B60000F636F7369A0EF626A30EF7220900F5CF86
+:10B610008AF00A00F5CF8BF01200270E0001825D40
+:10B6200003E100013B0E826F220E0001825D03E107
+:10B6300000013C0E826F6D0E0001825D03E100018E
+:10B640003D0E826F200E0001825D03E100013E0E7F
+:10B65000826F2E0E0001825D04E3000182513E08DC
+:10B6600003E200013E0E826F2E0E0001825DF66E37
+:10B67000F76AD890F636F736000EF626A00EF722B7
+:10B680000900F5CF88F00A00F5CF89F00001822982
+:10B69000D20FF66EF76AD890F636F736000EF62619
+:10B6A000A00EF7220900F5CF8AF00A00F5CF8BF043
+:10B6B0001200200E0001825D03E100012F0E826F57
+:10B6C0002E0E0001825D04E300018251390803E27D
+:10B6D00000012F0E826F2E0E0001825DF66EF76A5A
+:10B6E000D890F636F736A00EF6269F0EF722090000
+:10B6F000F5CF88F00A00F5CF89F000018229D20F3A
+:10B70000F66EF76AD890F636F736A00EF6269F0E3C
+:10B71000F7220900F5CF8AF00A00F5CF8BF012006E
+:10B7200000017C51006E016A013404E20050E60819
+:10B73000000E015403E20001E60E7C6F00017D5112
+:10B74000006E016A013404E200509B08000E0154AF
+:10B7500003E200019B0E7D6FB2DE0001220E836FBB
+:10B7600087DE84800001816B00018151EA6A600FED
+:10B77000E96E000EEA22EFCF82F00001825106E16D
+:10B7800000013A0E826F0001190E816FF86A000104
+:10B79000825101E1DCD01A0E0001815D01E3D7D0B6
+:10B7A000020E00017E5D02E184DF06D000017E050D
+:10B7B00002E133DF01D0F3DE00018E6B88C08CF034
+:10B7C00089C08DF000018A5100018C5D00018B5110
+:10B7D00000018D5901E3AFD0020E00017E5D1DE135
+:10B7E0008CC0F6FF8DC0F7FF010E0F0B05E0D8905F
+:10B7F000F732F632E806FBE1010ED890F636F7365E
+:10B80000E806FBE1000EF6269A0EF7220900F5CFB6
+:10B8100084F00A00F5CF85F03CD000017E051DE1E3
+:10B820008CC0F6FF8DC0F7FF010E0F0B05E0D8901E
+:10B83000F732F632E806FBE1010ED890F636F7361D
+:10B84000E806FBE1240EF626A00EF7220900F5CF4C
+:10B8500084F00A00F5CF85F01CD08CC0F6FF8DC0B7
+:10B86000F7FF010E0F0B05E0D890F732F632E8062D
+:10B87000FBE1010ED890F636F736E806FBE1880EBC
+:10B88000F626A40EF7220900F5CF84F00A00F5CFC2
+:10B8900085F000018C51010B05E00001845100018D
+:10B8A000806F05D085C000F0016A00C080F0000103
+:10B8B0008051006E016A0050800B1DE07F0E000178
+:10B8C000805F00017F5109E000018051000804E21F
+:10B8D00000018007EBDDF8D70DD08EC083FF00019B
+:10B8E0008051000807E200018007809480848094E2
+:10B8F0008084F5D71BD00001802B00017F510EE022
+:10B900008EC083FF00018051000807E2000180071C
+:10B910008094808480948084F5D708D00001805181
+:10B92000000804E200018007C1DDF8D700018C2B7C
+:10B93000000E8D2347D70001812B00018151EA6A57
+:10B94000600FE96E000EEA22EFCF82F020D70001EF
+:06B95000836B8EDD120086
+:020000040030CA
+:0100010008F6
+:0100020018E5
+:010003000EEE
+:01000500807A
+:010006008079
+:00000001FF
diff -r 000000000000 -r 96a35aeda5f2 code_part1/OSTC_code_c_part2/ostc_bigscreen.map
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/code_part1/OSTC_code_c_part2/ostc_bigscreen.map Tue Jan 12 15:05:59 2010 +0100
@@ -0,0 +1,1722 @@
+MPLINK 4.33, Linker
+Linker Map File - Created Thu Sep 24 11:19:30 2009
+
+ Section Info
+ Section Type Address Location Size(Bytes)
+ --------- --------- --------- --------- ---------
+ der_code romdata 0x000000 program 0x000000
+ der_start code 0x000000 program 0x000006
+ main code 0x009000 program 0x00003e
+ font_data_large romdata 0x009a00 program 0x00059c
+.romdata_p3_wordprocessor.o romdata 0x009f9c program 0x000000
+ .code_p3_wordprocessor.o code 0x009f9c program 0x000000
+ font_table_large romdata 0x009fa0 program 0x00001a
+ .code code 0x009fba program 0x00000e
+ font_table_medium romdata 0x00a000 program 0x000024
+ font_data_medium romdata 0x00a024 program 0x000376
+ font_table_small romdata 0x00a39a program 0x0000ea
+.idata_p3_wordprocessor.o_i romdata 0x00a484 program 0x000000
+ font_data_small romdata 0x00a488 program 0x000f8a
+ main_wordprocessor code 0x00b468 program 0x000006
+ .cinit romdata 0x00b46e program 0x000002
+ subroutines2 code 0x00b470 program 0x0004e6
+.config_300001_p3_wordprocessor.o romdata 0x300001 program 0x000001
+.config_300002_p3_wordprocessor.o romdata 0x300002 program 0x000001
+.config_300003_p3_wordprocessor.o romdata 0x300003 program 0x000001
+.config_300005_p3_wordprocessor.o romdata 0x300005 program 0x000001
+.config_300006_p3_wordprocessor.o romdata 0x300006 program 0x000001
+ .tmpdata udata 0x000000 data 0x000002
+ MATH_DATA udata 0x000002 data 0x000000
+ bank0a udata 0x000060 data 0x000030
+.udata_p3_wordprocessor.o udata 0x000090 data 0x000000
+.idata_p3_wordprocessor.o idata 0x000090 data 0x000000
+ .stack udata 0x000c00 data 0x000100
+ SFR_BANKED0 udata 0x000d60 data 0x00000c
+ SFR_BANKED1 udata 0x000d70 data 0x00000c
+ SFR_BANKED2 udata 0x000d80 data 0x00000c
+ SFR_BANKED3 udata 0x000d90 data 0x000004
+ SFR_BANKED4 udata 0x000dd4 data 0x000002
+ SFR_BANKED5 udata 0x000dd8 data 0x000001
+ SFR_BANKED6 udata 0x000de0 data 0x000008
+ SFR_BANKED7 udata 0x000df0 data 0x000004
+ SFR_BANKED8 udata 0x000df8 data 0x000001
+ SFR_BANKED9 udata 0x000dfa data 0x000001
+ SFR_BANKED10 udata 0x000dfc data 0x000001
+ SFR_BANKED11 udata 0x000e20 data 0x000060
+ SFR_BANKED12 udata 0x000f00 data 0x000060
+ SFR_UNBANKED0 udata 0x000f60 data 0x000018
+ SFR_UNBANKED1 udata 0x000f80 data 0x000080
+
+
+
+ Program Memory Usage
+ Start End
+ --------- ---------
+ 0x000000 0x000005
+ 0x009000 0x00903d
+ 0x009a00 0x009f9b
+ 0x009fa0 0x009fc7
+ 0x00a000 0x00a483
+ 0x00a488 0x00b411
+ 0x00b468 0x00b955
+ 0x300001 0x300003
+ 0x300005 0x300006
+ 7945 out of 99352 program addresses used, program memory utilization is 7%
+
+
+
+ Symbols - Sorted by Name
+ Name Address Location Storage File
+ --------- --------- --------- --------- ---------
+ ___else_lbl00037 0x00b7b6 program static
+ ___else_lbl00039 0x00b7ac program static
+ ___else_lbl00043 0x00b85a program static
+ ___else_lbl00045 0x00b81a program static
+ ___else_lbl00047 0x00b8a4 program static
+ ___else_lbl00053 0x00b8da program static
+ ___else_lbl00059 0x00b91c program static
+ ___else_lbl00061 0x00b8f6 program static
+ ___for_lbl00040 0x00b92c program static
+ ___for_lbl00041 0x00b936 program static
+ ___for_lbl00062 0x00b7c4 program static
+ ___if_lbl00030 0x00b73c program static
+ ___if_lbl00031 0x00b758 program static
+ ___if_lbl00032 0x00b78c program static
+ ___if_lbl00036 0x00b7b8 program static
+ ___if_lbl00038 0x00b7b8 program static
+ ___if_lbl00042 0x00b892 program static
+ ___if_lbl00044 0x00b892 program static
+ ___if_lbl00046 0x00b8ae program static
+ ___if_lbl00052 0x00b8f4 program static
+ ___if_lbl00058 0x00b92c program static
+ ___if_lbl00060 0x00b92c program static
+ ___return_lbl00000 0x000004 program static
+ ___return_lbl00003 0x00b47a program static
+ ___return_lbl00004 0x00b49c program static
+ ___return_lbl00005 0x00b4aa program static
+ ___return_lbl00006 0x00b4bc program static
+ ___return_lbl00029 0x00b954 program static
+ ___while_lbl00033 0x00b78e program static
+ ___while_lbl00034 0x00b94e program static
+ ___while_lbl00048 0x00b8c8 program static
+ ___while_lbl00049 0x00b8d8 program static
+ ___while_lbl00050 0x00b8de program static
+ ___while_lbl00051 0x00b8f4 program static
+ ___while_lbl00054 0x00b904 program static
+ ___while_lbl00055 0x00b91a program static
+ ___while_lbl00056 0x00b91c program static
+ ___while_lbl00057 0x00b92c program static
+ __config_0 0x300001 program static Q:\Data\OSTC2\ostc_bigscreen\src\p3_wordprocessor.c
+ __config_1 0x300002 program static Q:\Data\OSTC2\ostc_bigscreen\src\p3_wordprocessor.c
+ __config_2 0x300003 program static Q:\Data\OSTC2\ostc_bigscreen\src\p3_wordprocessor.c
+ __config_3 0x300005 program static Q:\Data\OSTC2\ostc_bigscreen\src\p3_wordprocessor.c
+ __config_4 0x300006 program static Q:\Data\OSTC2\ostc_bigscreen\src\p3_wordprocessor.c
+ __tmplbl_6 0x00b7a0 program static
+ __tmplbl_7 0x00b796 program static
+ __zero_memory 0x009fba program extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ clear_loop 0x009fc0 program static C:\MCC18\src\traditional\proc\p18F4685.asm
+ der_start 0x000000 program extern Q:\Data\OSTC2\ostc_bigscreen\src\p3_wordprocessor.c
+ main 0x009000 program extern Q:\Data\OSTC2\ostc_bigscreen\src\p3_wordprocessor.c
+ main_wordprocessor 0x00b468 program extern Q:\Data\OSTC2\ostc_bigscreen\src\p3_wordprocessor.c
+ wordprocessor 0x00b720 program extern Q:\Data\OSTC2\ostc_bigscreen\src\p3_wordprocessor.c
+ wp_large_data 0x009a00 program extern Q:\Data\OSTC2\ostc_bigscreen\src\p3_wordprocessor.c
+ wp_large_table 0x009fa0 program extern Q:\Data\OSTC2\ostc_bigscreen\src\p3_wordprocessor.c
+ wp_medium_data 0x00a024 program extern Q:\Data\OSTC2\ostc_bigscreen\src\p3_wordprocessor.c
+ wp_medium_table 0x00a000 program extern Q:\Data\OSTC2\ostc_bigscreen\src\p3_wordprocessor.c
+ wp_set_char_font_large 0x00b6b2 program extern Q:\Data\OSTC2\ostc_bigscreen\src\p3_wordprocessor.c
+ wp_set_char_font_medium 0x00b61a program extern Q:\Data\OSTC2\ostc_bigscreen\src\p3_wordprocessor.c
+ wp_set_char_font_small 0x00b59e program extern Q:\Data\OSTC2\ostc_bigscreen\src\p3_wordprocessor.c
+ wp_set_window 0x00b4be program extern Q:\Data\OSTC2\ostc_bigscreen\src\p3_wordprocessor.c
+ wp_small_data 0x00a488 program extern Q:\Data\OSTC2\ostc_bigscreen\src\p3_wordprocessor.c
+ wp_small_table 0x00a39a program extern Q:\Data\OSTC2\ostc_bigscreen\src\p3_wordprocessor.c
+ wp_write_black 0x00b49e program extern Q:\Data\OSTC2\ostc_bigscreen\src\p3_wordprocessor.c
+ wp_write_color 0x00b4ac program extern Q:\Data\OSTC2\ostc_bigscreen\src\p3_wordprocessor.c
+ wp_write_command 0x00b470 program extern Q:\Data\OSTC2\ostc_bigscreen\src\p3_wordprocessor.c
+ wp_write_data 0x00b47c program extern Q:\Data\OSTC2\ostc_bigscreen\src\p3_wordprocessor.c
+ ADCON0 0x000fc2 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ ADCON0bits 0x000fc2 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ ADCON1 0x000fc1 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ ADCON1bits 0x000fc1 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ ADCON2 0x000fc0 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ ADCON2bits 0x000fc0 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ ADRES 0x000fc3 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ ADRESH 0x000fc4 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ ADRESL 0x000fc3 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B0CON 0x000e20 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B0CONbits 0x000e20 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B0D0 0x000e26 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B0D0bits 0x000e26 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B0D1 0x000e27 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B0D1bits 0x000e27 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B0D2 0x000e28 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B0D2bits 0x000e28 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B0D3 0x000e29 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B0D3bits 0x000e29 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B0D4 0x000e2a data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B0D4bits 0x000e2a data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B0D5 0x000e2b data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B0D5bits 0x000e2b data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B0D6 0x000e2c data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B0D6bits 0x000e2c data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B0D7 0x000e2d data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B0D7bits 0x000e2d data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B0DLC 0x000e25 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B0DLCbits 0x000e25 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B0EIDH 0x000e23 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B0EIDHbits 0x000e23 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B0EIDL 0x000e24 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B0EIDLbits 0x000e24 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B0SIDH 0x000e21 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B0SIDHbits 0x000e21 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B0SIDL 0x000e22 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B0SIDLbits 0x000e22 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B1CON 0x000e30 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B1CONbits 0x000e30 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B1D0 0x000e36 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B1D0bits 0x000e36 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B1D1 0x000e37 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B1D1bits 0x000e37 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B1D2 0x000e38 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B1D2bits 0x000e38 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B1D3 0x000e39 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B1D3bits 0x000e39 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B1D4 0x000e3a data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B1D4bits 0x000e3a data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B1D5 0x000e3b data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B1D5bits 0x000e3b data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B1D6 0x000e3c data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B1D6bits 0x000e3c data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B1D7 0x000e3d data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B1D7bits 0x000e3d data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B1DLC 0x000e35 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B1DLCbits 0x000e35 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B1EIDH 0x000e33 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B1EIDHbits 0x000e33 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B1EIDL 0x000e34 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B1EIDLbits 0x000e34 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B1SIDH 0x000e31 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B1SIDHbits 0x000e31 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B1SIDL 0x000e32 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B1SIDLbits 0x000e32 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B2CON 0x000e40 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B2CONbits 0x000e40 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B2D0 0x000e46 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B2D0bits 0x000e46 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B2D1 0x000e47 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B2D1bits 0x000e47 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B2D2 0x000e48 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B2D2bits 0x000e48 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B2D3 0x000e49 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B2D3bits 0x000e49 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B2D4 0x000e4a data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B2D4bits 0x000e4a data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B2D5 0x000e4b data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B2D5bits 0x000e4b data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B2D6 0x000e4c data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B2D6bits 0x000e4c data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B2D7 0x000e4d data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B2D7bits 0x000e4d data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B2DLC 0x000e45 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B2DLCbits 0x000e45 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B2EIDH 0x000e43 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B2EIDHbits 0x000e43 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B2EIDL 0x000e44 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B2EIDLbits 0x000e44 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B2SIDH 0x000e41 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B2SIDHbits 0x000e41 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B2SIDL 0x000e42 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B2SIDLbits 0x000e42 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B3CON 0x000e50 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B3CONbits 0x000e50 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B3D0 0x000e56 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B3D0bits 0x000e56 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B3D1 0x000e57 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B3D1bits 0x000e57 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B3D2 0x000e58 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B3D2bits 0x000e58 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B3D3 0x000e59 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B3D3bits 0x000e59 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B3D4 0x000e5a data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B3D4bits 0x000e5a data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B3D5 0x000e5b data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B3D5bits 0x000e5b data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B3D6 0x000e5c data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B3D6bits 0x000e5c data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B3D7 0x000e5d data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B3D7bits 0x000e5d data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B3DLC 0x000e55 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B3DLCbits 0x000e55 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B3EIDH 0x000e53 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B3EIDHbits 0x000e53 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B3EIDL 0x000e54 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B3EIDLbits 0x000e54 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B3SIDH 0x000e51 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B3SIDHbits 0x000e51 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B3SIDL 0x000e52 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B3SIDLbits 0x000e52 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B4CON 0x000e60 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B4CONbits 0x000e60 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B4D0 0x000e66 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B4D0bits 0x000e66 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B4D1 0x000e67 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B4D1bits 0x000e67 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B4D2 0x000e68 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B4D2bits 0x000e68 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B4D3 0x000e69 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B4D3bits 0x000e69 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B4D4 0x000e6a data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B4D4bits 0x000e6a data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B4D5 0x000e6b data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B4D5bits 0x000e6b data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B4D6 0x000e6c data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B4D6bits 0x000e6c data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B4D7 0x000e6d data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B4D7bits 0x000e6d data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B4DLC 0x000e65 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B4DLCbits 0x000e65 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B4EIDH 0x000e63 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B4EIDHbits 0x000e63 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B4EIDL 0x000e64 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B4EIDLbits 0x000e64 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B4SIDH 0x000e61 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B4SIDHbits 0x000e61 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B4SIDL 0x000e62 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B4SIDLbits 0x000e62 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B5CON 0x000e70 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B5CONbits 0x000e70 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B5D0 0x000e76 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B5D0bits 0x000e76 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B5D1 0x000e77 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B5D1bits 0x000e77 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B5D2 0x000e78 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B5D2bits 0x000e78 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B5D3 0x000e79 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B5D3bits 0x000e79 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B5D4 0x000e7a data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B5D4bits 0x000e7a data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B5D5 0x000e7b data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B5D5bits 0x000e7b data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B5D6 0x000e7c data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B5D6bits 0x000e7c data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B5D7 0x000e7d data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B5D7bits 0x000e7d data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B5DLC 0x000e75 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B5DLCbits 0x000e75 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B5EIDH 0x000e73 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B5EIDHbits 0x000e73 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B5EIDL 0x000e74 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B5EIDLbits 0x000e74 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B5SIDH 0x000e71 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B5SIDHbits 0x000e71 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B5SIDL 0x000e72 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B5SIDLbits 0x000e72 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ BAUDCON 0x000fb8 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ BAUDCONbits 0x000fb8 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ BIE0 0x000dfa data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ BIE0bits 0x000dfa data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ BRGCON1 0x000f70 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ BRGCON1bits 0x000f70 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ BRGCON2 0x000f71 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ BRGCON2bits 0x000f71 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ BRGCON3 0x000f72 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ BRGCON3bits 0x000f72 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ BSEL0 0x000df8 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ BSEL0bits 0x000df8 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ BSR 0x000fe0 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CANCON 0x000f6f data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CANCON_RO0 0x000f5f data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CANCON_RO0bits 0x000f5f data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CANCON_RO1 0x000f4f data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CANCON_RO1bits 0x000f4f data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CANCON_RO2 0x000f3f data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CANCON_RO2bits 0x000f3f data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CANCON_RO3 0x000f2f data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CANCON_RO3bits 0x000f2f data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CANCON_RO4 0x000e7f data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CANCON_RO4bits 0x000e7f data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CANCON_RO5 0x000e6f data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CANCON_RO5bits 0x000e6f data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CANCON_RO6 0x000e5f data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CANCON_RO6bits 0x000e5f data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CANCON_RO7 0x000e4f data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CANCON_RO7bits 0x000e4f data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CANCON_RO8 0x000e3f data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CANCON_RO8bits 0x000e3f data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CANCON_RO9 0x000e2f data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CANCON_RO9bits 0x000e2f data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CANCONbits 0x000f6f data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CANSTAT 0x000f6e data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CANSTAT_RO0 0x000f5e data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CANSTAT_RO0bits 0x000f5e data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CANSTAT_RO1 0x000f4e data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CANSTAT_RO1bits 0x000f4e data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CANSTAT_RO2 0x000f3e data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CANSTAT_RO2bits 0x000f3e data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CANSTAT_RO3 0x000f2e data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CANSTAT_RO3bits 0x000f2e data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CANSTAT_RO4 0x000e7e data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CANSTAT_RO4bits 0x000e7e data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CANSTAT_RO5 0x000e6e data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CANSTAT_RO5bits 0x000e6e data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CANSTAT_RO6 0x000e5e data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CANSTAT_RO6bits 0x000e5e data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CANSTAT_RO7 0x000e4e data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CANSTAT_RO7bits 0x000e4e data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CANSTAT_RO8 0x000e3e data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CANSTAT_RO8bits 0x000e3e data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CANSTAT_RO9 0x000e2e data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CANSTAT_RO9bits 0x000e2e data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CANSTATbits 0x000f6e data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CCP1CON 0x000fbd data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CCP1CONbits 0x000fbd data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CCPR1 0x000fbe data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CCPR1H 0x000fbf data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CCPR1L 0x000fbe data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CIOCON 0x000f73 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CIOCONbits 0x000f73 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CMCON 0x000fb4 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CMCONbits 0x000fb4 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ COMSTAT 0x000f74 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ COMSTATbits 0x000f74 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CVRCON 0x000fb5 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CVRCONbits 0x000fb5 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ DDRA 0x000f92 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ DDRAbits 0x000f92 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ DDRB 0x000f93 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ DDRBbits 0x000f93 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ DDRC 0x000f94 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ DDRCbits 0x000f94 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ DDRD 0x000f95 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ DDRDbits 0x000f95 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ DDRE 0x000f96 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ DDREbits 0x000f96 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ ECANCON 0x000f77 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ ECANCONbits 0x000f77 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ ECCP1AS 0x000fb6 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ ECCP1ASbits 0x000fb6 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ ECCP1CON 0x000fba data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ ECCP1CONbits 0x000fba data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ ECCP1DEL 0x000fb7 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ ECCP1DELbits 0x000fb7 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ ECCPR1 0x000fbb data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ ECCPR1H 0x000fbc data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ ECCPR1L 0x000fbb data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ EEADR 0x000fa9 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ EEADRH 0x000faa data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ EECON1 0x000fa6 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ EECON1bits 0x000fa6 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ EECON2 0x000fa7 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ EEDATA 0x000fa8 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ FSR0 0x000fe9 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ FSR0H 0x000fea data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ FSR0L 0x000fe9 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ FSR1 0x000fe1 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ FSR1H 0x000fe2 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ FSR1L 0x000fe1 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ FSR2 0x000fd9 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ FSR2H 0x000fda data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ FSR2L 0x000fd9 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ HLVDCON 0x000fd2 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ HLVDCONbits 0x000fd2 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ INDF0 0x000fef data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ INDF1 0x000fe7 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ INDF2 0x000fdf data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ INTCON 0x000ff2 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ INTCON2 0x000ff1 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ INTCON2bits 0x000ff1 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ INTCON3 0x000ff0 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ INTCON3bits 0x000ff0 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ INTCONbits 0x000ff2 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ IPR1 0x000f9f data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ IPR1bits 0x000f9f data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ IPR2 0x000fa2 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ IPR2bits 0x000fa2 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ IPR3 0x000fa5 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ IPR3bits 0x000fa5 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ LATA 0x000f89 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ LATAbits 0x000f89 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ LATB 0x000f8a data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ LATBbits 0x000f8a data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ LATC 0x000f8b data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ LATCbits 0x000f8b data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ LATD 0x000f8c data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ LATDbits 0x000f8c data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ LATE 0x000f8d data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ LATEbits 0x000f8d data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ LVDCON 0x000fd2 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ LVDCONbits 0x000fd2 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ MSEL0 0x000df0 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ MSEL0bits 0x000df0 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ MSEL1 0x000df1 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ MSEL1bits 0x000df1 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ MSEL2 0x000df2 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ MSEL2bits 0x000df2 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ MSEL3 0x000df3 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ MSEL3bits 0x000df3 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ OSCCON 0x000fd3 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ OSCCONbits 0x000fd3 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ OSCTUNE 0x000f9b data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ OSCTUNEbits 0x000f9b data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ PC 0x000ff9 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ PCL 0x000ff9 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ PCLATH 0x000ffa data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ PCLATU 0x000ffb data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ PIE1 0x000f9d data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ PIE1bits 0x000f9d data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ PIE2 0x000fa0 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ PIE2bits 0x000fa0 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ PIE3 0x000fa3 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ PIE3bits 0x000fa3 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ PIR1 0x000f9e data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ PIR1bits 0x000f9e data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ PIR2 0x000fa1 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ PIR2bits 0x000fa1 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ PIR3 0x000fa4 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ PIR3bits 0x000fa4 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ PLUSW0 0x000feb data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ PLUSW1 0x000fe3 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ PLUSW2 0x000fdb data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ PORTA 0x000f80 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ PORTAbits 0x000f80 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ PORTB 0x000f81 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ PORTBbits 0x000f81 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ PORTC 0x000f82 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ PORTCbits 0x000f82 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ PORTD 0x000f83 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ PORTDbits 0x000f83 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ PORTE 0x000f84 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ PORTEbits 0x000f84 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ POSTDEC0 0x000fed data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ POSTDEC1 0x000fe5 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ POSTDEC2 0x000fdd data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ POSTINC0 0x000fee data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ POSTINC1 0x000fe6 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ POSTINC2 0x000fde data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ PR2 0x000fcb data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ PREINC0 0x000fec data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ PREINC1 0x000fe4 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ PREINC2 0x000fdc data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ PROD 0x000ff3 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ PRODH 0x000ff4 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ PRODL 0x000ff3 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RCON 0x000fd0 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RCONbits 0x000fd0 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RCREG 0x000fae data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RCSTA 0x000fab data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RCSTAbits 0x000fab data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB0CON 0x000f60 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB0CONbits 0x000f60 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB0D0 0x000f66 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB0D0bits 0x000f66 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB0D1 0x000f67 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB0D1bits 0x000f67 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB0D2 0x000f68 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB0D2bits 0x000f68 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB0D3 0x000f69 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB0D3bits 0x000f69 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB0D4 0x000f6a data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB0D4bits 0x000f6a data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB0D5 0x000f6b data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB0D5bits 0x000f6b data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB0D6 0x000f6c data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB0D6bits 0x000f6c data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB0D7 0x000f6d data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB0D7bits 0x000f6d data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB0DLC 0x000f65 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB0DLCbits 0x000f65 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB0EIDH 0x000f63 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB0EIDHbits 0x000f63 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB0EIDL 0x000f64 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB0EIDLbits 0x000f64 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB0SIDH 0x000f61 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB0SIDHbits 0x000f61 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB0SIDL 0x000f62 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB0SIDLbits 0x000f62 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB1CON 0x000f50 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB1CONbits 0x000f50 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB1D0 0x000f56 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB1D0bits 0x000f56 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB1D1 0x000f57 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB1D1bits 0x000f57 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB1D2 0x000f58 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB1D2bits 0x000f58 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB1D3 0x000f59 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB1D3bits 0x000f59 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB1D4 0x000f5a data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB1D4bits 0x000f5a data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB1D5 0x000f5b data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB1D5bits 0x000f5b data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB1D6 0x000f5c data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB1D6bits 0x000f5c data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB1D7 0x000f5d data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB1D7bits 0x000f5d data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB1DLC 0x000f55 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB1DLCbits 0x000f55 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB1EIDH 0x000f53 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB1EIDHbits 0x000f53 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB1EIDL 0x000f54 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB1EIDLbits 0x000f54 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB1SIDH 0x000f51 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB1SIDHbits 0x000f51 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB1SIDL 0x000f52 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB1SIDLbits 0x000f52 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXERRCNT 0x000f75 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXERRCNTbits 0x000f75 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF0EIDH 0x000f02 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF0EIDHbits 0x000f02 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF0EIDL 0x000f03 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF0EIDLbits 0x000f03 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF0SIDH 0x000f00 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF0SIDHbits 0x000f00 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF0SIDL 0x000f01 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF0SIDLbits 0x000f01 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF10EIDH 0x000d76 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF10EIDHbits 0x000d76 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF10EIDL 0x000d77 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF10EIDLbits 0x000d77 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF10SIDH 0x000d74 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF10SIDHbits 0x000d74 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF10SIDL 0x000d75 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF10SIDLbits 0x000d75 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF11EIDH 0x000d7a data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF11EIDHbits 0x000d7a data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF11EIDL 0x000d7b data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF11EIDLbits 0x000d7b data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF11SIDH 0x000d78 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF11SIDHbits 0x000d78 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF11SIDL 0x000d79 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF11SIDLbits 0x000d79 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF12EIDH 0x000d82 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF12EIDHbits 0x000d82 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF12EIDL 0x000d83 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF12EIDLbits 0x000d83 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF12SIDH 0x000d80 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF12SIDHbits 0x000d80 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF12SIDL 0x000d81 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF12SIDLbits 0x000d81 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF13EIDH 0x000d86 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF13EIDHbits 0x000d86 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF13EIDL 0x000d87 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF13EIDLbits 0x000d87 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF13SIDH 0x000d84 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF13SIDHbits 0x000d84 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF13SIDL 0x000d85 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF13SIDLbits 0x000d85 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF14EIDH 0x000d8a data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF14EIDHbits 0x000d8a data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF14EIDL 0x000d8b data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF14EIDLbits 0x000d8b data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF14SIDH 0x000d88 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF14SIDHbits 0x000d88 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF14SIDL 0x000d89 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF14SIDLbits 0x000d89 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF15EIDH 0x000d92 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF15EIDHbits 0x000d92 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF15EIDL 0x000d93 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF15EIDLbits 0x000d93 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF15SIDH 0x000d90 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF15SIDHbits 0x000d90 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF15SIDL 0x000d91 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF15SIDLbits 0x000d91 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF1EIDH 0x000f06 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF1EIDHbits 0x000f06 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF1EIDL 0x000f07 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF1EIDLbits 0x000f07 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF1SIDH 0x000f04 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF1SIDHbits 0x000f04 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF1SIDL 0x000f05 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF1SIDLbits 0x000f05 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF2EIDH 0x000f0a data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF2EIDHbits 0x000f0a data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF2EIDL 0x000f0b data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF2EIDLbits 0x000f0b data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF2SIDH 0x000f08 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF2SIDHbits 0x000f08 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF2SIDL 0x000f09 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF2SIDLbits 0x000f09 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF3EIDH 0x000f0e data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF3EIDHbits 0x000f0e data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF3EIDL 0x000f0f data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF3EIDLbits 0x000f0f data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF3SIDH 0x000f0c data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF3SIDHbits 0x000f0c data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF3SIDL 0x000f0d data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF3SIDLbits 0x000f0d data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF4EIDH 0x000f12 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF4EIDHbits 0x000f12 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF4EIDL 0x000f13 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF4EIDLbits 0x000f13 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF4SIDH 0x000f10 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF4SIDHbits 0x000f10 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF4SIDL 0x000f11 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF4SIDLbits 0x000f11 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF5EIDH 0x000f16 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF5EIDHbits 0x000f16 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF5EIDL 0x000f17 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF5EIDLbits 0x000f17 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF5SIDH 0x000f14 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF5SIDHbits 0x000f14 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF5SIDL 0x000f15 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF5SIDLbits 0x000f15 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF6EIDH 0x000d62 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF6EIDHbits 0x000d62 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF6EIDL 0x000d63 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF6EIDLbits 0x000d63 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF6SIDH 0x000d60 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF6SIDHbits 0x000d60 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF6SIDL 0x000d61 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF6SIDLbits 0x000d61 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF7EIDH 0x000d66 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF7EIDHbits 0x000d66 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF7EIDL 0x000d67 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF7EIDLbits 0x000d67 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF7SIDH 0x000d64 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF7SIDHbits 0x000d64 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF7SIDL 0x000d65 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF7SIDLbits 0x000d65 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF8EIDH 0x000d6a data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF8EIDHbits 0x000d6a data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF8EIDL 0x000d6b data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF8EIDLbits 0x000d6b data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF8SIDH 0x000d68 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF8SIDHbits 0x000d68 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF8SIDL 0x000d69 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF8SIDLbits 0x000d69 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF9EIDH 0x000d72 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF9EIDHbits 0x000d72 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF9EIDL 0x000d73 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF9EIDLbits 0x000d73 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF9SIDH 0x000d70 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF9SIDHbits 0x000d70 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF9SIDL 0x000d71 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF9SIDLbits 0x000d71 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXFBCON0 0x000de0 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXFBCON0bits 0x000de0 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXFBCON1 0x000de1 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXFBCON1bits 0x000de1 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXFBCON2 0x000de2 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXFBCON2bits 0x000de2 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXFBCON3 0x000de3 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXFBCON3bits 0x000de3 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXFBCON4 0x000de4 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXFBCON4bits 0x000de4 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXFBCON5 0x000de5 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXFBCON5bits 0x000de5 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXFBCON6 0x000de6 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXFBCON6bits 0x000de6 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXFBCON7 0x000de7 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXFBCON7bits 0x000de7 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXFCON0 0x000dd4 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXFCON0bits 0x000dd4 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXFCON1 0x000dd5 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXFCON1bits 0x000dd5 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXM0EIDH 0x000f1a data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXM0EIDHbits 0x000f1a data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXM0EIDL 0x000f1b data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXM0EIDLbits 0x000f1b data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXM0SIDH 0x000f18 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXM0SIDHbits 0x000f18 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXM0SIDL 0x000f19 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXM0SIDLbits 0x000f19 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXM1EIDH 0x000f1e data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXM1EIDHbits 0x000f1e data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXM1EIDL 0x000f1f data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXM1EIDLbits 0x000f1f data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXM1SIDH 0x000f1c data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXM1SIDHbits 0x000f1c data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXM1SIDL 0x000f1d data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXM1SIDLbits 0x000f1d data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ SDFLC 0x000dd8 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ SDFLCbits 0x000dd8 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ SPBRG 0x000faf data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ SPBRGH 0x000fb0 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ SSPADD 0x000fc8 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ SSPBUF 0x000fc9 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ SSPCON1 0x000fc6 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ SSPCON1bits 0x000fc6 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ SSPCON2 0x000fc5 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ SSPCON2bits 0x000fc5 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ SSPSTAT 0x000fc7 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ SSPSTATbits 0x000fc7 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ STATUS 0x000fd8 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ STATUSbits 0x000fd8 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ STKPTR 0x000ffc data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ STKPTRbits 0x000ffc data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ T0CON 0x000fd5 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ T0CONbits 0x000fd5 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ T1CON 0x000fcd data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ T1CONbits 0x000fcd data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ T2CON 0x000fca data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ T2CONbits 0x000fca data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ T3CON 0x000fb1 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ T3CONbits 0x000fb1 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TABLAT 0x000ff5 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TBLPTR 0x000ff6 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TBLPTRH 0x000ff7 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TBLPTRL 0x000ff6 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TBLPTRU 0x000ff8 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TMR0H 0x000fd7 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TMR0L 0x000fd6 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TMR1H 0x000fcf data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TMR1L 0x000fce data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TMR2 0x000fcc data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TMR3H 0x000fb3 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TMR3L 0x000fb2 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TOS 0x000ffd data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TOSH 0x000ffe data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TOSL 0x000ffd data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TOSU 0x000fff data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TRISA 0x000f92 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TRISAbits 0x000f92 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TRISB 0x000f93 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TRISBbits 0x000f93 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TRISC 0x000f94 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TRISCbits 0x000f94 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TRISD 0x000f95 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TRISDbits 0x000f95 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TRISE 0x000f96 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TRISEbits 0x000f96 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB0CON 0x000f40 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB0CONbits 0x000f40 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB0D0 0x000f46 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB0D0bits 0x000f46 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB0D1 0x000f47 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB0D1bits 0x000f47 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB0D2 0x000f48 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB0D2bits 0x000f48 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB0D3 0x000f49 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB0D3bits 0x000f49 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB0D4 0x000f4a data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB0D4bits 0x000f4a data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB0D5 0x000f4b data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB0D5bits 0x000f4b data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB0D6 0x000f4c data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB0D6bits 0x000f4c data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB0D7 0x000f4d data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB0D7bits 0x000f4d data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB0DLC 0x000f45 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB0DLCbits 0x000f45 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB0EIDH 0x000f43 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB0EIDHbits 0x000f43 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB0EIDL 0x000f44 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB0EIDLbits 0x000f44 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB0SIDH 0x000f41 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB0SIDHbits 0x000f41 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB0SIDL 0x000f42 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB0SIDLbits 0x000f42 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB1CON 0x000f30 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB1CONbits 0x000f30 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB1D0 0x000f36 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB1D0bits 0x000f36 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB1D1 0x000f37 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB1D1bits 0x000f37 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB1D2 0x000f38 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB1D2bits 0x000f38 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB1D3 0x000f39 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB1D3bits 0x000f39 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB1D4 0x000f3a data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB1D4bits 0x000f3a data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB1D5 0x000f3b data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB1D5bits 0x000f3b data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB1D6 0x000f3c data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB1D6bits 0x000f3c data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB1D7 0x000f3d data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB1D7bits 0x000f3d data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB1DLC 0x000f35 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB1DLCbits 0x000f35 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB1EIDH 0x000f33 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB1EIDHbits 0x000f33 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB1EIDL 0x000f34 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB1EIDLbits 0x000f34 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB1SIDH 0x000f31 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB1SIDHbits 0x000f31 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB1SIDL 0x000f32 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB1SIDLbits 0x000f32 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB2CON 0x000f20 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB2CONbits 0x000f20 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB2D0 0x000f26 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB2D0bits 0x000f26 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB2D1 0x000f27 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB2D1bits 0x000f27 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB2D2 0x000f28 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB2D2bits 0x000f28 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB2D3 0x000f29 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB2D3bits 0x000f29 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB2D4 0x000f2a data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB2D4bits 0x000f2a data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB2D5 0x000f2b data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB2D5bits 0x000f2b data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB2D6 0x000f2c data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB2D6bits 0x000f2c data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB2D7 0x000f2d data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB2D7bits 0x000f2d data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB2DLC 0x000f25 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB2DLCbits 0x000f25 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB2EIDH 0x000f23 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB2EIDHbits 0x000f23 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB2EIDL 0x000f24 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB2EIDLbits 0x000f24 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB2SIDH 0x000f21 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB2SIDHbits 0x000f21 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB2SIDL 0x000f22 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB2SIDLbits 0x000f22 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXBIE 0x000dfc data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXBIEbits 0x000dfc data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXERRCNT 0x000f76 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXERRCNTbits 0x000f76 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXREG 0x000fad data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXSTA 0x000fac data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXSTAbits 0x000fac data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ WDTCON 0x000fd1 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ WDTCONbits 0x000fd1 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ WREG 0x000fe8 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ __tmp_0 0x000000 data static Q:\Data\OSTC2\ostc_bigscreen\src\p3_wordprocessor.c
+ wp_black 0x00008e data extern Q:\Data\OSTC2\ostc_bigscreen\src\p3_wordprocessor.c
+ wp_char 0x000082 data extern Q:\Data\OSTC2\ostc_bigscreen\src\p3_wordprocessor.c
+ wp_color1 0x00007a data extern Q:\Data\OSTC2\ostc_bigscreen\src\p3_wordprocessor.c
+ wp_color2 0x00007b data extern Q:\Data\OSTC2\ostc_bigscreen\src\p3_wordprocessor.c
+ wp_command 0x000083 data extern Q:\Data\OSTC2\ostc_bigscreen\src\p3_wordprocessor.c
+ wp_data_16bit 0x000084 data extern Q:\Data\OSTC2\ostc_bigscreen\src\p3_wordprocessor.c
+ wp_data_8bit_one 0x000086 data extern Q:\Data\OSTC2\ostc_bigscreen\src\p3_wordprocessor.c
+ wp_data_8bit_two 0x000087 data extern Q:\Data\OSTC2\ostc_bigscreen\src\p3_wordprocessor.c
+ wp_debug_U8 0x00008f data extern Q:\Data\OSTC2\ostc_bigscreen\src\p3_wordprocessor.c
+ wp_end 0x00008a data extern Q:\Data\OSTC2\ostc_bigscreen\src\p3_wordprocessor.c
+ wp_font 0x00007e data extern Q:\Data\OSTC2\ostc_bigscreen\src\p3_wordprocessor.c
+ wp_i 0x00008c data extern Q:\Data\OSTC2\ostc_bigscreen\src\p3_wordprocessor.c
+ wp_invert 0x00007f data extern Q:\Data\OSTC2\ostc_bigscreen\src\p3_wordprocessor.c
+ wp_leftx2 0x00007d data extern Q:\Data\OSTC2\ostc_bigscreen\src\p3_wordprocessor.c
+ wp_start 0x000088 data extern Q:\Data\OSTC2\ostc_bigscreen\src\p3_wordprocessor.c
+ wp_stringstore 0x000060 data extern Q:\Data\OSTC2\ostc_bigscreen\src\p3_wordprocessor.c
+ wp_temp_U8 0x000080 data extern Q:\Data\OSTC2\ostc_bigscreen\src\p3_wordprocessor.c
+ wp_top 0x00007c data extern Q:\Data\OSTC2\ostc_bigscreen\src\p3_wordprocessor.c
+ wp_txtptr 0x000081 data extern Q:\Data\OSTC2\ostc_bigscreen\src\p3_wordprocessor.c
+
+
+
+ Symbols - Sorted by Address
+ Name Address Location Storage File
+ --------- --------- --------- --------- ---------
+ der_start 0x000000 program extern Q:\Data\OSTC2\ostc_bigscreen\src\p3_wordprocessor.c
+ ___return_lbl00000 0x000004 program static
+ main 0x009000 program extern Q:\Data\OSTC2\ostc_bigscreen\src\p3_wordprocessor.c
+ wp_large_data 0x009a00 program extern Q:\Data\OSTC2\ostc_bigscreen\src\p3_wordprocessor.c
+ wp_large_table 0x009fa0 program extern Q:\Data\OSTC2\ostc_bigscreen\src\p3_wordprocessor.c
+ __zero_memory 0x009fba program extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ clear_loop 0x009fc0 program static C:\MCC18\src\traditional\proc\p18F4685.asm
+ wp_medium_table 0x00a000 program extern Q:\Data\OSTC2\ostc_bigscreen\src\p3_wordprocessor.c
+ wp_medium_data 0x00a024 program extern Q:\Data\OSTC2\ostc_bigscreen\src\p3_wordprocessor.c
+ wp_small_table 0x00a39a program extern Q:\Data\OSTC2\ostc_bigscreen\src\p3_wordprocessor.c
+ wp_small_data 0x00a488 program extern Q:\Data\OSTC2\ostc_bigscreen\src\p3_wordprocessor.c
+ main_wordprocessor 0x00b468 program extern Q:\Data\OSTC2\ostc_bigscreen\src\p3_wordprocessor.c
+ wp_write_command 0x00b470 program extern Q:\Data\OSTC2\ostc_bigscreen\src\p3_wordprocessor.c
+ ___return_lbl00003 0x00b47a program static
+ wp_write_data 0x00b47c program extern Q:\Data\OSTC2\ostc_bigscreen\src\p3_wordprocessor.c
+ ___return_lbl00004 0x00b49c program static
+ wp_write_black 0x00b49e program extern Q:\Data\OSTC2\ostc_bigscreen\src\p3_wordprocessor.c
+ ___return_lbl00005 0x00b4aa program static
+ wp_write_color 0x00b4ac program extern Q:\Data\OSTC2\ostc_bigscreen\src\p3_wordprocessor.c
+ ___return_lbl00006 0x00b4bc program static
+ wp_set_window 0x00b4be program extern Q:\Data\OSTC2\ostc_bigscreen\src\p3_wordprocessor.c
+ wp_set_char_font_small 0x00b59e program extern Q:\Data\OSTC2\ostc_bigscreen\src\p3_wordprocessor.c
+ wp_set_char_font_medium 0x00b61a program extern Q:\Data\OSTC2\ostc_bigscreen\src\p3_wordprocessor.c
+ wp_set_char_font_large 0x00b6b2 program extern Q:\Data\OSTC2\ostc_bigscreen\src\p3_wordprocessor.c
+ wordprocessor 0x00b720 program extern Q:\Data\OSTC2\ostc_bigscreen\src\p3_wordprocessor.c
+ ___if_lbl00030 0x00b73c program static
+ ___if_lbl00031 0x00b758 program static
+ ___if_lbl00032 0x00b78c program static
+ ___while_lbl00033 0x00b78e program static
+ __tmplbl_7 0x00b796 program static
+ __tmplbl_6 0x00b7a0 program static
+ ___else_lbl00039 0x00b7ac program static
+ ___else_lbl00037 0x00b7b6 program static
+ ___if_lbl00036 0x00b7b8 program static
+ ___if_lbl00038 0x00b7b8 program static
+ ___for_lbl00062 0x00b7c4 program static
+ ___else_lbl00045 0x00b81a program static
+ ___else_lbl00043 0x00b85a program static
+ ___if_lbl00042 0x00b892 program static
+ ___if_lbl00044 0x00b892 program static
+ ___else_lbl00047 0x00b8a4 program static
+ ___if_lbl00046 0x00b8ae program static
+ ___while_lbl00048 0x00b8c8 program static
+ ___while_lbl00049 0x00b8d8 program static
+ ___else_lbl00053 0x00b8da program static
+ ___while_lbl00050 0x00b8de program static
+ ___while_lbl00051 0x00b8f4 program static
+ ___if_lbl00052 0x00b8f4 program static
+ ___else_lbl00061 0x00b8f6 program static
+ ___while_lbl00054 0x00b904 program static
+ ___while_lbl00055 0x00b91a program static
+ ___while_lbl00056 0x00b91c program static
+ ___else_lbl00059 0x00b91c program static
+ ___for_lbl00040 0x00b92c program static
+ ___while_lbl00057 0x00b92c program static
+ ___if_lbl00058 0x00b92c program static
+ ___if_lbl00060 0x00b92c program static
+ ___for_lbl00041 0x00b936 program static
+ ___while_lbl00034 0x00b94e program static
+ ___return_lbl00029 0x00b954 program static
+ __config_0 0x300001 program static Q:\Data\OSTC2\ostc_bigscreen\src\p3_wordprocessor.c
+ __config_1 0x300002 program static Q:\Data\OSTC2\ostc_bigscreen\src\p3_wordprocessor.c
+ __config_2 0x300003 program static Q:\Data\OSTC2\ostc_bigscreen\src\p3_wordprocessor.c
+ __config_3 0x300005 program static Q:\Data\OSTC2\ostc_bigscreen\src\p3_wordprocessor.c
+ __config_4 0x300006 program static Q:\Data\OSTC2\ostc_bigscreen\src\p3_wordprocessor.c
+ __tmp_0 0x000000 data static Q:\Data\OSTC2\ostc_bigscreen\src\p3_wordprocessor.c
+ wp_stringstore 0x000060 data extern Q:\Data\OSTC2\ostc_bigscreen\src\p3_wordprocessor.c
+ wp_color1 0x00007a data extern Q:\Data\OSTC2\ostc_bigscreen\src\p3_wordprocessor.c
+ wp_color2 0x00007b data extern Q:\Data\OSTC2\ostc_bigscreen\src\p3_wordprocessor.c
+ wp_top 0x00007c data extern Q:\Data\OSTC2\ostc_bigscreen\src\p3_wordprocessor.c
+ wp_leftx2 0x00007d data extern Q:\Data\OSTC2\ostc_bigscreen\src\p3_wordprocessor.c
+ wp_font 0x00007e data extern Q:\Data\OSTC2\ostc_bigscreen\src\p3_wordprocessor.c
+ wp_invert 0x00007f data extern Q:\Data\OSTC2\ostc_bigscreen\src\p3_wordprocessor.c
+ wp_temp_U8 0x000080 data extern Q:\Data\OSTC2\ostc_bigscreen\src\p3_wordprocessor.c
+ wp_txtptr 0x000081 data extern Q:\Data\OSTC2\ostc_bigscreen\src\p3_wordprocessor.c
+ wp_char 0x000082 data extern Q:\Data\OSTC2\ostc_bigscreen\src\p3_wordprocessor.c
+ wp_command 0x000083 data extern Q:\Data\OSTC2\ostc_bigscreen\src\p3_wordprocessor.c
+ wp_data_16bit 0x000084 data extern Q:\Data\OSTC2\ostc_bigscreen\src\p3_wordprocessor.c
+ wp_data_8bit_one 0x000086 data extern Q:\Data\OSTC2\ostc_bigscreen\src\p3_wordprocessor.c
+ wp_data_8bit_two 0x000087 data extern Q:\Data\OSTC2\ostc_bigscreen\src\p3_wordprocessor.c
+ wp_start 0x000088 data extern Q:\Data\OSTC2\ostc_bigscreen\src\p3_wordprocessor.c
+ wp_end 0x00008a data extern Q:\Data\OSTC2\ostc_bigscreen\src\p3_wordprocessor.c
+ wp_i 0x00008c data extern Q:\Data\OSTC2\ostc_bigscreen\src\p3_wordprocessor.c
+ wp_black 0x00008e data extern Q:\Data\OSTC2\ostc_bigscreen\src\p3_wordprocessor.c
+ wp_debug_U8 0x00008f data extern Q:\Data\OSTC2\ostc_bigscreen\src\p3_wordprocessor.c
+ RXF6SIDHbits 0x000d60 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF6SIDH 0x000d60 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF6SIDLbits 0x000d61 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF6SIDL 0x000d61 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF6EIDHbits 0x000d62 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF6EIDH 0x000d62 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF6EIDLbits 0x000d63 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF6EIDL 0x000d63 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF7SIDHbits 0x000d64 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF7SIDH 0x000d64 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF7SIDLbits 0x000d65 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF7SIDL 0x000d65 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF7EIDH 0x000d66 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF7EIDHbits 0x000d66 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF7EIDLbits 0x000d67 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF7EIDL 0x000d67 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF8SIDH 0x000d68 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF8SIDHbits 0x000d68 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF8SIDLbits 0x000d69 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF8SIDL 0x000d69 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF8EIDH 0x000d6a data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF8EIDHbits 0x000d6a data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF8EIDL 0x000d6b data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF8EIDLbits 0x000d6b data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF9SIDHbits 0x000d70 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF9SIDH 0x000d70 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF9SIDL 0x000d71 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF9SIDLbits 0x000d71 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF9EIDH 0x000d72 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF9EIDHbits 0x000d72 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF9EIDL 0x000d73 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF9EIDLbits 0x000d73 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF10SIDH 0x000d74 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF10SIDHbits 0x000d74 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF10SIDLbits 0x000d75 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF10SIDL 0x000d75 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF10EIDH 0x000d76 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF10EIDHbits 0x000d76 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF10EIDLbits 0x000d77 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF10EIDL 0x000d77 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF11SIDH 0x000d78 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF11SIDHbits 0x000d78 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF11SIDLbits 0x000d79 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF11SIDL 0x000d79 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF11EIDH 0x000d7a data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF11EIDHbits 0x000d7a data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF11EIDL 0x000d7b data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF11EIDLbits 0x000d7b data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF12SIDHbits 0x000d80 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF12SIDH 0x000d80 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF12SIDLbits 0x000d81 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF12SIDL 0x000d81 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF12EIDH 0x000d82 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF12EIDHbits 0x000d82 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF12EIDL 0x000d83 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF12EIDLbits 0x000d83 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF13SIDHbits 0x000d84 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF13SIDH 0x000d84 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF13SIDL 0x000d85 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF13SIDLbits 0x000d85 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF13EIDHbits 0x000d86 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF13EIDH 0x000d86 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF13EIDL 0x000d87 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF13EIDLbits 0x000d87 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF14SIDH 0x000d88 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF14SIDHbits 0x000d88 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF14SIDLbits 0x000d89 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF14SIDL 0x000d89 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF14EIDH 0x000d8a data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF14EIDHbits 0x000d8a data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF14EIDLbits 0x000d8b data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF14EIDL 0x000d8b data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF15SIDH 0x000d90 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF15SIDHbits 0x000d90 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF15SIDL 0x000d91 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF15SIDLbits 0x000d91 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF15EIDH 0x000d92 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF15EIDHbits 0x000d92 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF15EIDL 0x000d93 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF15EIDLbits 0x000d93 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXFCON0bits 0x000dd4 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXFCON0 0x000dd4 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXFCON1bits 0x000dd5 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXFCON1 0x000dd5 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ SDFLC 0x000dd8 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ SDFLCbits 0x000dd8 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXFBCON0 0x000de0 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXFBCON0bits 0x000de0 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXFBCON1 0x000de1 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXFBCON1bits 0x000de1 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXFBCON2 0x000de2 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXFBCON2bits 0x000de2 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXFBCON3 0x000de3 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXFBCON3bits 0x000de3 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXFBCON4 0x000de4 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXFBCON4bits 0x000de4 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXFBCON5 0x000de5 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXFBCON5bits 0x000de5 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXFBCON6bits 0x000de6 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXFBCON6 0x000de6 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXFBCON7bits 0x000de7 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXFBCON7 0x000de7 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ MSEL0bits 0x000df0 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ MSEL0 0x000df0 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ MSEL1bits 0x000df1 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ MSEL1 0x000df1 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ MSEL2bits 0x000df2 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ MSEL2 0x000df2 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ MSEL3bits 0x000df3 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ MSEL3 0x000df3 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ BSEL0bits 0x000df8 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ BSEL0 0x000df8 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ BIE0bits 0x000dfa data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ BIE0 0x000dfa data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXBIE 0x000dfc data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXBIEbits 0x000dfc data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B0CONbits 0x000e20 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B0CON 0x000e20 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B0SIDH 0x000e21 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B0SIDHbits 0x000e21 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B0SIDL 0x000e22 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B0SIDLbits 0x000e22 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B0EIDH 0x000e23 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B0EIDHbits 0x000e23 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B0EIDLbits 0x000e24 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B0EIDL 0x000e24 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B0DLC 0x000e25 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B0DLCbits 0x000e25 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B0D0bits 0x000e26 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B0D0 0x000e26 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B0D1 0x000e27 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B0D1bits 0x000e27 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B0D2 0x000e28 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B0D2bits 0x000e28 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B0D3bits 0x000e29 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B0D3 0x000e29 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B0D4 0x000e2a data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B0D4bits 0x000e2a data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B0D5 0x000e2b data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B0D5bits 0x000e2b data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B0D6 0x000e2c data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B0D6bits 0x000e2c data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B0D7bits 0x000e2d data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B0D7 0x000e2d data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CANSTAT_RO9bits 0x000e2e data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CANSTAT_RO9 0x000e2e data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CANCON_RO9 0x000e2f data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CANCON_RO9bits 0x000e2f data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B1CON 0x000e30 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B1CONbits 0x000e30 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B1SIDHbits 0x000e31 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B1SIDH 0x000e31 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B1SIDLbits 0x000e32 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B1SIDL 0x000e32 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B1EIDH 0x000e33 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B1EIDHbits 0x000e33 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B1EIDL 0x000e34 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B1EIDLbits 0x000e34 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B1DLCbits 0x000e35 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B1DLC 0x000e35 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B1D0bits 0x000e36 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B1D0 0x000e36 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B1D1bits 0x000e37 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B1D1 0x000e37 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B1D2bits 0x000e38 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B1D2 0x000e38 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B1D3bits 0x000e39 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B1D3 0x000e39 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B1D4bits 0x000e3a data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B1D4 0x000e3a data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B1D5 0x000e3b data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B1D5bits 0x000e3b data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B1D6 0x000e3c data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B1D6bits 0x000e3c data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B1D7 0x000e3d data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B1D7bits 0x000e3d data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CANSTAT_RO8 0x000e3e data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CANSTAT_RO8bits 0x000e3e data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CANCON_RO8bits 0x000e3f data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CANCON_RO8 0x000e3f data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B2CONbits 0x000e40 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B2CON 0x000e40 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B2SIDHbits 0x000e41 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B2SIDH 0x000e41 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B2SIDLbits 0x000e42 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B2SIDL 0x000e42 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B2EIDHbits 0x000e43 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B2EIDH 0x000e43 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B2EIDLbits 0x000e44 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B2EIDL 0x000e44 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B2DLC 0x000e45 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B2DLCbits 0x000e45 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B2D0 0x000e46 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B2D0bits 0x000e46 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B2D1 0x000e47 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B2D1bits 0x000e47 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B2D2 0x000e48 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B2D2bits 0x000e48 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B2D3bits 0x000e49 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B2D3 0x000e49 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B2D4bits 0x000e4a data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B2D4 0x000e4a data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B2D5bits 0x000e4b data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B2D5 0x000e4b data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B2D6bits 0x000e4c data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B2D6 0x000e4c data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B2D7bits 0x000e4d data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B2D7 0x000e4d data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CANSTAT_RO7 0x000e4e data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CANSTAT_RO7bits 0x000e4e data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CANCON_RO7bits 0x000e4f data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CANCON_RO7 0x000e4f data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B3CON 0x000e50 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B3CONbits 0x000e50 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B3SIDHbits 0x000e51 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B3SIDH 0x000e51 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B3SIDLbits 0x000e52 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B3SIDL 0x000e52 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B3EIDHbits 0x000e53 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B3EIDH 0x000e53 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B3EIDLbits 0x000e54 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B3EIDL 0x000e54 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B3DLCbits 0x000e55 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B3DLC 0x000e55 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B3D0bits 0x000e56 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B3D0 0x000e56 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B3D1 0x000e57 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B3D1bits 0x000e57 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B3D2 0x000e58 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B3D2bits 0x000e58 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B3D3 0x000e59 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B3D3bits 0x000e59 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B3D4 0x000e5a data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B3D4bits 0x000e5a data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B3D5 0x000e5b data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B3D5bits 0x000e5b data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B3D6 0x000e5c data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B3D6bits 0x000e5c data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B3D7 0x000e5d data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B3D7bits 0x000e5d data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CANSTAT_RO6 0x000e5e data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CANSTAT_RO6bits 0x000e5e data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CANCON_RO6 0x000e5f data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CANCON_RO6bits 0x000e5f data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B4CON 0x000e60 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B4CONbits 0x000e60 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B4SIDH 0x000e61 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B4SIDHbits 0x000e61 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B4SIDL 0x000e62 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B4SIDLbits 0x000e62 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B4EIDH 0x000e63 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B4EIDHbits 0x000e63 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B4EIDL 0x000e64 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B4EIDLbits 0x000e64 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B4DLCbits 0x000e65 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B4DLC 0x000e65 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B4D0 0x000e66 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B4D0bits 0x000e66 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B4D1bits 0x000e67 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B4D1 0x000e67 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B4D2bits 0x000e68 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B4D2 0x000e68 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B4D3bits 0x000e69 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B4D3 0x000e69 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B4D4 0x000e6a data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B4D4bits 0x000e6a data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B4D5 0x000e6b data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B4D5bits 0x000e6b data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B4D6 0x000e6c data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B4D6bits 0x000e6c data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B4D7bits 0x000e6d data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B4D7 0x000e6d data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CANSTAT_RO5bits 0x000e6e data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CANSTAT_RO5 0x000e6e data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CANCON_RO5 0x000e6f data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CANCON_RO5bits 0x000e6f data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B5CONbits 0x000e70 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B5CON 0x000e70 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B5SIDHbits 0x000e71 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B5SIDH 0x000e71 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B5SIDLbits 0x000e72 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B5SIDL 0x000e72 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B5EIDHbits 0x000e73 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B5EIDH 0x000e73 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B5EIDL 0x000e74 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B5EIDLbits 0x000e74 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B5DLCbits 0x000e75 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B5DLC 0x000e75 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B5D0 0x000e76 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B5D0bits 0x000e76 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B5D1 0x000e77 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B5D1bits 0x000e77 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B5D2bits 0x000e78 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B5D2 0x000e78 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B5D3bits 0x000e79 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B5D3 0x000e79 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B5D4bits 0x000e7a data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B5D4 0x000e7a data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B5D5 0x000e7b data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B5D5bits 0x000e7b data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B5D6 0x000e7c data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B5D6bits 0x000e7c data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B5D7 0x000e7d data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ B5D7bits 0x000e7d data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CANSTAT_RO4 0x000e7e data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CANSTAT_RO4bits 0x000e7e data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CANCON_RO4 0x000e7f data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CANCON_RO4bits 0x000e7f data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF0SIDHbits 0x000f00 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF0SIDH 0x000f00 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF0SIDLbits 0x000f01 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF0SIDL 0x000f01 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF0EIDHbits 0x000f02 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF0EIDH 0x000f02 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF0EIDLbits 0x000f03 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF0EIDL 0x000f03 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF1SIDH 0x000f04 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF1SIDHbits 0x000f04 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF1SIDLbits 0x000f05 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF1SIDL 0x000f05 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF1EIDH 0x000f06 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF1EIDHbits 0x000f06 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF1EIDL 0x000f07 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF1EIDLbits 0x000f07 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF2SIDHbits 0x000f08 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF2SIDH 0x000f08 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF2SIDLbits 0x000f09 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF2SIDL 0x000f09 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF2EIDHbits 0x000f0a data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF2EIDH 0x000f0a data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF2EIDLbits 0x000f0b data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF2EIDL 0x000f0b data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF3SIDH 0x000f0c data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF3SIDHbits 0x000f0c data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF3SIDL 0x000f0d data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF3SIDLbits 0x000f0d data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF3EIDHbits 0x000f0e data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF3EIDH 0x000f0e data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF3EIDLbits 0x000f0f data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF3EIDL 0x000f0f data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF4SIDH 0x000f10 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF4SIDHbits 0x000f10 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF4SIDL 0x000f11 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF4SIDLbits 0x000f11 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF4EIDHbits 0x000f12 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF4EIDH 0x000f12 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF4EIDL 0x000f13 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF4EIDLbits 0x000f13 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF5SIDHbits 0x000f14 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF5SIDH 0x000f14 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF5SIDLbits 0x000f15 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF5SIDL 0x000f15 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF5EIDHbits 0x000f16 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF5EIDH 0x000f16 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF5EIDLbits 0x000f17 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXF5EIDL 0x000f17 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXM0SIDH 0x000f18 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXM0SIDHbits 0x000f18 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXM0SIDL 0x000f19 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXM0SIDLbits 0x000f19 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXM0EIDH 0x000f1a data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXM0EIDHbits 0x000f1a data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXM0EIDL 0x000f1b data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXM0EIDLbits 0x000f1b data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXM1SIDHbits 0x000f1c data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXM1SIDH 0x000f1c data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXM1SIDLbits 0x000f1d data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXM1SIDL 0x000f1d data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXM1EIDHbits 0x000f1e data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXM1EIDH 0x000f1e data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXM1EIDLbits 0x000f1f data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXM1EIDL 0x000f1f data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB2CON 0x000f20 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB2CONbits 0x000f20 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB2SIDHbits 0x000f21 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB2SIDH 0x000f21 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB2SIDLbits 0x000f22 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB2SIDL 0x000f22 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB2EIDHbits 0x000f23 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB2EIDH 0x000f23 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB2EIDLbits 0x000f24 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB2EIDL 0x000f24 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB2DLCbits 0x000f25 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB2DLC 0x000f25 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB2D0 0x000f26 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB2D0bits 0x000f26 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB2D1bits 0x000f27 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB2D1 0x000f27 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB2D2bits 0x000f28 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB2D2 0x000f28 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB2D3bits 0x000f29 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB2D3 0x000f29 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB2D4bits 0x000f2a data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB2D4 0x000f2a data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB2D5 0x000f2b data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB2D5bits 0x000f2b data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB2D6bits 0x000f2c data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB2D6 0x000f2c data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB2D7bits 0x000f2d data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB2D7 0x000f2d data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CANSTAT_RO3bits 0x000f2e data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CANSTAT_RO3 0x000f2e data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CANCON_RO3 0x000f2f data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CANCON_RO3bits 0x000f2f data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB1CONbits 0x000f30 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB1CON 0x000f30 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB1SIDH 0x000f31 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB1SIDHbits 0x000f31 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB1SIDL 0x000f32 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB1SIDLbits 0x000f32 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB1EIDHbits 0x000f33 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB1EIDH 0x000f33 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB1EIDLbits 0x000f34 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB1EIDL 0x000f34 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB1DLCbits 0x000f35 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB1DLC 0x000f35 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB1D0 0x000f36 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB1D0bits 0x000f36 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB1D1bits 0x000f37 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB1D1 0x000f37 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB1D2 0x000f38 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB1D2bits 0x000f38 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB1D3bits 0x000f39 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB1D3 0x000f39 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB1D4bits 0x000f3a data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB1D4 0x000f3a data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB1D5bits 0x000f3b data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB1D5 0x000f3b data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB1D6bits 0x000f3c data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB1D6 0x000f3c data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB1D7bits 0x000f3d data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB1D7 0x000f3d data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CANSTAT_RO2 0x000f3e data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CANSTAT_RO2bits 0x000f3e data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CANCON_RO2bits 0x000f3f data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CANCON_RO2 0x000f3f data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB0CON 0x000f40 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB0CONbits 0x000f40 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB0SIDHbits 0x000f41 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB0SIDH 0x000f41 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB0SIDLbits 0x000f42 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB0SIDL 0x000f42 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB0EIDHbits 0x000f43 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB0EIDH 0x000f43 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB0EIDLbits 0x000f44 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB0EIDL 0x000f44 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB0DLCbits 0x000f45 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB0DLC 0x000f45 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB0D0 0x000f46 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB0D0bits 0x000f46 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB0D1bits 0x000f47 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB0D1 0x000f47 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB0D2bits 0x000f48 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB0D2 0x000f48 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB0D3bits 0x000f49 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB0D3 0x000f49 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB0D4bits 0x000f4a data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB0D4 0x000f4a data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB0D5bits 0x000f4b data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB0D5 0x000f4b data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB0D6bits 0x000f4c data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB0D6 0x000f4c data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB0D7bits 0x000f4d data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXB0D7 0x000f4d data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CANSTAT_RO1bits 0x000f4e data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CANSTAT_RO1 0x000f4e data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CANCON_RO1bits 0x000f4f data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CANCON_RO1 0x000f4f data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB1CON 0x000f50 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB1CONbits 0x000f50 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB1SIDH 0x000f51 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB1SIDHbits 0x000f51 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB1SIDLbits 0x000f52 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB1SIDL 0x000f52 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB1EIDHbits 0x000f53 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB1EIDH 0x000f53 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB1EIDLbits 0x000f54 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB1EIDL 0x000f54 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB1DLCbits 0x000f55 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB1DLC 0x000f55 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB1D0bits 0x000f56 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB1D0 0x000f56 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB1D1bits 0x000f57 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB1D1 0x000f57 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB1D2bits 0x000f58 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB1D2 0x000f58 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB1D3bits 0x000f59 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB1D3 0x000f59 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB1D4 0x000f5a data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB1D4bits 0x000f5a data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB1D5 0x000f5b data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB1D5bits 0x000f5b data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB1D6 0x000f5c data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB1D6bits 0x000f5c data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB1D7bits 0x000f5d data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB1D7 0x000f5d data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CANSTAT_RO0bits 0x000f5e data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CANSTAT_RO0 0x000f5e data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CANCON_RO0bits 0x000f5f data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CANCON_RO0 0x000f5f data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB0CON 0x000f60 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB0CONbits 0x000f60 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB0SIDH 0x000f61 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB0SIDHbits 0x000f61 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB0SIDL 0x000f62 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB0SIDLbits 0x000f62 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB0EIDH 0x000f63 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB0EIDHbits 0x000f63 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB0EIDL 0x000f64 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB0EIDLbits 0x000f64 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB0DLCbits 0x000f65 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB0DLC 0x000f65 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB0D0bits 0x000f66 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB0D0 0x000f66 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB0D1bits 0x000f67 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB0D1 0x000f67 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB0D2bits 0x000f68 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB0D2 0x000f68 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB0D3bits 0x000f69 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB0D3 0x000f69 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB0D4bits 0x000f6a data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB0D4 0x000f6a data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB0D5bits 0x000f6b data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB0D5 0x000f6b data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB0D6bits 0x000f6c data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB0D6 0x000f6c data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB0D7bits 0x000f6d data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXB0D7 0x000f6d data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CANSTATbits 0x000f6e data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CANSTAT 0x000f6e data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CANCON 0x000f6f data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CANCONbits 0x000f6f data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ BRGCON1 0x000f70 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ BRGCON1bits 0x000f70 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ BRGCON2 0x000f71 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ BRGCON2bits 0x000f71 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ BRGCON3 0x000f72 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ BRGCON3bits 0x000f72 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CIOCONbits 0x000f73 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CIOCON 0x000f73 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ COMSTAT 0x000f74 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ COMSTATbits 0x000f74 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXERRCNT 0x000f75 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RXERRCNTbits 0x000f75 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXERRCNT 0x000f76 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXERRCNTbits 0x000f76 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ ECANCONbits 0x000f77 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ ECANCON 0x000f77 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ PORTA 0x000f80 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ PORTAbits 0x000f80 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ PORTB 0x000f81 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ PORTBbits 0x000f81 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ PORTC 0x000f82 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ PORTCbits 0x000f82 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ PORTD 0x000f83 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ PORTDbits 0x000f83 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ PORTE 0x000f84 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ PORTEbits 0x000f84 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ LATAbits 0x000f89 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ LATA 0x000f89 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ LATBbits 0x000f8a data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ LATB 0x000f8a data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ LATCbits 0x000f8b data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ LATC 0x000f8b data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ LATDbits 0x000f8c data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ LATD 0x000f8c data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ LATEbits 0x000f8d data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ LATE 0x000f8d data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TRISA 0x000f92 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TRISAbits 0x000f92 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ DDRA 0x000f92 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ DDRAbits 0x000f92 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ DDRBbits 0x000f93 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ DDRB 0x000f93 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TRISB 0x000f93 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TRISBbits 0x000f93 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ DDRC 0x000f94 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ DDRCbits 0x000f94 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TRISC 0x000f94 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TRISCbits 0x000f94 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ DDRD 0x000f95 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ DDRDbits 0x000f95 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TRISD 0x000f95 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TRISDbits 0x000f95 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TRISE 0x000f96 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TRISEbits 0x000f96 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ DDRE 0x000f96 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ DDREbits 0x000f96 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ OSCTUNEbits 0x000f9b data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ OSCTUNE 0x000f9b data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ PIE1bits 0x000f9d data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ PIE1 0x000f9d data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ PIR1 0x000f9e data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ PIR1bits 0x000f9e data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ IPR1bits 0x000f9f data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ IPR1 0x000f9f data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ PIE2 0x000fa0 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ PIE2bits 0x000fa0 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ PIR2 0x000fa1 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ PIR2bits 0x000fa1 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ IPR2bits 0x000fa2 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ IPR2 0x000fa2 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ PIE3 0x000fa3 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ PIE3bits 0x000fa3 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ PIR3bits 0x000fa4 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ PIR3 0x000fa4 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ IPR3bits 0x000fa5 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ IPR3 0x000fa5 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ EECON1bits 0x000fa6 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ EECON1 0x000fa6 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ EECON2 0x000fa7 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ EEDATA 0x000fa8 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ EEADR 0x000fa9 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ EEADRH 0x000faa data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RCSTAbits 0x000fab data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RCSTA 0x000fab data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXSTA 0x000fac data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXSTAbits 0x000fac data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TXREG 0x000fad data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RCREG 0x000fae data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ SPBRG 0x000faf data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ SPBRGH 0x000fb0 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ T3CONbits 0x000fb1 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ T3CON 0x000fb1 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TMR3L 0x000fb2 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TMR3H 0x000fb3 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CMCON 0x000fb4 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CMCONbits 0x000fb4 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CVRCON 0x000fb5 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CVRCONbits 0x000fb5 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ ECCP1AS 0x000fb6 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ ECCP1ASbits 0x000fb6 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ ECCP1DEL 0x000fb7 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ ECCP1DELbits 0x000fb7 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ BAUDCON 0x000fb8 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ BAUDCONbits 0x000fb8 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ ECCP1CON 0x000fba data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ ECCP1CONbits 0x000fba data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ ECCPR1 0x000fbb data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ ECCPR1L 0x000fbb data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ ECCPR1H 0x000fbc data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CCP1CONbits 0x000fbd data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CCP1CON 0x000fbd data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CCPR1L 0x000fbe data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CCPR1 0x000fbe data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ CCPR1H 0x000fbf data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ ADCON2 0x000fc0 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ ADCON2bits 0x000fc0 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ ADCON1bits 0x000fc1 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ ADCON1 0x000fc1 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ ADCON0bits 0x000fc2 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ ADCON0 0x000fc2 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ ADRESL 0x000fc3 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ ADRES 0x000fc3 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ ADRESH 0x000fc4 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ SSPCON2bits 0x000fc5 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ SSPCON2 0x000fc5 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ SSPCON1bits 0x000fc6 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ SSPCON1 0x000fc6 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ SSPSTATbits 0x000fc7 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ SSPSTAT 0x000fc7 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ SSPADD 0x000fc8 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ SSPBUF 0x000fc9 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ T2CON 0x000fca data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ T2CONbits 0x000fca data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ PR2 0x000fcb data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TMR2 0x000fcc data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ T1CON 0x000fcd data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ T1CONbits 0x000fcd data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TMR1L 0x000fce data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TMR1H 0x000fcf data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RCON 0x000fd0 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ RCONbits 0x000fd0 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ WDTCONbits 0x000fd1 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ WDTCON 0x000fd1 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ HLVDCONbits 0x000fd2 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ HLVDCON 0x000fd2 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ LVDCONbits 0x000fd2 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ LVDCON 0x000fd2 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ OSCCONbits 0x000fd3 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ OSCCON 0x000fd3 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ T0CONbits 0x000fd5 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ T0CON 0x000fd5 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TMR0L 0x000fd6 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TMR0H 0x000fd7 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ STATUS 0x000fd8 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ STATUSbits 0x000fd8 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ FSR2L 0x000fd9 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ FSR2 0x000fd9 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ FSR2H 0x000fda data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ PLUSW2 0x000fdb data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ PREINC2 0x000fdc data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ POSTDEC2 0x000fdd data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ POSTINC2 0x000fde data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ INDF2 0x000fdf data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ BSR 0x000fe0 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ FSR1L 0x000fe1 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ FSR1 0x000fe1 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ FSR1H 0x000fe2 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ PLUSW1 0x000fe3 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ PREINC1 0x000fe4 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ POSTDEC1 0x000fe5 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ POSTINC1 0x000fe6 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ INDF1 0x000fe7 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ WREG 0x000fe8 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ FSR0 0x000fe9 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ FSR0L 0x000fe9 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ FSR0H 0x000fea data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ PLUSW0 0x000feb data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ PREINC0 0x000fec data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ POSTDEC0 0x000fed data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ POSTINC0 0x000fee data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ INDF0 0x000fef data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ INTCON3bits 0x000ff0 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ INTCON3 0x000ff0 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ INTCON2 0x000ff1 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ INTCON2bits 0x000ff1 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ INTCON 0x000ff2 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ INTCONbits 0x000ff2 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ PROD 0x000ff3 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ PRODL 0x000ff3 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ PRODH 0x000ff4 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TABLAT 0x000ff5 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TBLPTRL 0x000ff6 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TBLPTR 0x000ff6 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TBLPTRH 0x000ff7 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TBLPTRU 0x000ff8 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ PCL 0x000ff9 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ PC 0x000ff9 data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ PCLATH 0x000ffa data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ PCLATU 0x000ffb data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ STKPTR 0x000ffc data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ STKPTRbits 0x000ffc data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TOSL 0x000ffd data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TOS 0x000ffd data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TOSH 0x000ffe data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+ TOSU 0x000fff data extern C:\MCC18\src\traditional\proc\p18F4685.asm
+
+
diff -r 000000000000 -r 96a35aeda5f2 code_part1/OSTC_code_c_part2/ostc_bigscreen.mcp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/code_part1/OSTC_code_c_part2/ostc_bigscreen.mcp Tue Jan 12 15:05:59 2010 +0100
@@ -0,0 +1,41 @@
+[HEADER]
+magic_cookie={66E99B07-E706-4689-9E80-9B2582898A13}
+file_version=1.0
+[PATH_INFO]
+BuildDirPolicy=BuildDirIsProjectDir
+dir_src=
+dir_bin=
+dir_tmp=
+dir_sin=
+dir_inc=C:\Users\chsw\Documents\avr32workspace\ostc_bigscreen
+dir_lib=C:\MCC18\lib
+dir_lkr=
+[CAT_FILTERS]
+filter_src=*.asm;*.c
+filter_inc=*.h;*.inc
+filter_obj=*.o
+filter_lib=*.lib
+filter_lkr=*.lkr
+[OTHER_FILES]
+file_000=no
+file_001=no
+file_002=yes
+[FILE_INFO]
+file_000=Q:\Data\OSTC2\ostc_bigscreen\src\p3_wordprocessor.c
+file_001=18f4685_ostc.lkr
+file_002=p2_tables.romdata
+[SUITE_INFO]
+suite_guid={5B7D72DD-9861-47BD-9F60-2BE967BF8416}
+suite_state=
+[TOOL_SETTINGS]
+TS{DD2213A8-6310-47B1-8376-9430CDFC013F}=
+TS{BFD27FBA-4A02-4C0E-A5E5-B812F3E7707C}=/m"$(BINDIR_)$(TARGETBASE).map" /w /o"$(BINDIR_)$(TARGETBASE).cof"
+TS{C2AF05E7-1416-4625-923D-E114DB6E2B96}=-O-
+TS{ADE93A55-C7C7-4D4D-A4BA-59305F7D0391}=
+[INSTRUMENTED_TRACE]
+enable=0
+transport=0
+format=0
+[CUSTOM_BUILD]
+Pre-Build=
+Post-Build=
diff -r 000000000000 -r 96a35aeda5f2 code_part1/OSTC_code_c_part2/ostc_bigscreen.mcs
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/code_part1/OSTC_code_c_part2/ostc_bigscreen.mcs Tue Jan 12 15:05:59 2010 +0100
@@ -0,0 +1,58 @@
+[Header]
+MagicCookie={0b13fe8c-dfe0-40eb-8900-6712719559a7}
+Version=1.0
+[File000]
+Location=Q:\Data\OSTC2\code\OSTC_code_c_part2\p3_wordprocessor.o
+Folder=Intermediary
+DeviceName=PIC18F4685
+LanguageToolSuiteID={5B7D72DD-9861-47BD-9F60-2BE967BF8416}
+LanguageToolID={E56A1C86-9D32-4DF6-8C34-FE0388B1B644}
+LanguageToolLocation=C:\MCC18\bin\mcc18.exe
+PPAD=$(BINDIR)||$(TMPDIR)||$(AINDIR)||$(INCDIR)|C:\Users\chsw\Documents\avr32workspace\ostc_bigscreen||$(LIBDIR)|C:\MCC18\lib||$(LKRDIR)||
+SOLK=|Q:\Data\OSTC2\ostc_bigscreen\src\p3_wordprocessor.c|||||||18f4685_ostc.lkr||
+SuiteArgsString=
+ToolArgsString=-O-
+TraceCmdString=
+DebugOptions=
+[File001]
+Location=Q:\Data\OSTC2\code\OSTC_code_c_part2\ostc_bigscreen.cof
+Folder=Output
+DeviceName=PIC18F4685
+LanguageToolSuiteID={5B7D72DD-9861-47BD-9F60-2BE967BF8416}
+LanguageToolID={96C98149-AA1B-4CF9-B967-FAE79CAB663C}
+LanguageToolLocation=C:\MCC18\bin\mplink.exe
+PPAD=$(BINDIR)||$(TMPDIR)||$(AINDIR)||$(INCDIR)|C:\Users\chsw\Documents\avr32workspace\ostc_bigscreen||$(LIBDIR)|C:\MCC18\lib||$(LKRDIR)||
+SOLK=|Q:\Data\OSTC2\ostc_bigscreen\src\p3_wordprocessor.c|||||||18f4685_ostc.lkr||
+SuiteArgsString=
+ToolArgsString=/m"$(BINDIR_)$(TARGETBASE).map" /w /o"$(BINDIR_)$(TARGETBASE).cof"
+TraceCmdString=
+DebugOptions=
+[File002]
+Location=Q:\Data\OSTC2\code\OSTC_code_c_part2\ostc_bigscreen.hex
+Folder=Output
+DeviceName=PIC18F4685
+LanguageToolSuiteID={5B7D72DD-9861-47BD-9F60-2BE967BF8416}
+LanguageToolID={96C98149-AA1B-4CF9-B967-FAE79CAB663C}
+LanguageToolLocation=C:\MCC18\bin\mplink.exe
+PPAD=$(BINDIR)||$(TMPDIR)||$(AINDIR)||$(INCDIR)|C:\Users\chsw\Documents\avr32workspace\ostc_bigscreen||$(LIBDIR)|C:\MCC18\lib||$(LKRDIR)||
+SOLK=|Q:\Data\OSTC2\ostc_bigscreen\src\p3_wordprocessor.c|||||||18f4685_ostc.lkr||
+SuiteArgsString=
+ToolArgsString=/m"$(BINDIR_)$(TARGETBASE).map" /w /o"$(BINDIR_)$(TARGETBASE).cof"
+TraceCmdString=
+DebugOptions=
+[File003]
+Location=Q:\Data\OSTC2\code\OSTC_code_c_part2\ostc_bigscreen.map
+Folder=Output
+DeviceName=PIC18F4685
+LanguageToolSuiteID={5B7D72DD-9861-47BD-9F60-2BE967BF8416}
+LanguageToolID={96C98149-AA1B-4CF9-B967-FAE79CAB663C}
+LanguageToolLocation=C:\MCC18\bin\mplink.exe
+PPAD=$(BINDIR)||$(TMPDIR)||$(AINDIR)||$(INCDIR)|C:\Users\chsw\Documents\avr32workspace\ostc_bigscreen||$(LIBDIR)|C:\MCC18\lib||$(LKRDIR)||
+SOLK=|Q:\Data\OSTC2\ostc_bigscreen\src\p3_wordprocessor.c|||||||18f4685_ostc.lkr||
+SuiteArgsString=
+ToolArgsString=/m"$(BINDIR_)$(TARGETBASE).map" /w /o"$(BINDIR_)$(TARGETBASE).cof"
+TraceCmdString=
+DebugOptions=
+[TOOL_LOC_STAMPS]
+tool_loc{96C98149-AA1B-4CF9-B967-FAE79CAB663C}=C:\MCC18\bin\mplink.exe
+tool_loc{E56A1C86-9D32-4DF6-8C34-FE0388B1B644}=C:\MCC18\bin\mcc18.exe
diff -r 000000000000 -r 96a35aeda5f2 code_part1/OSTC_code_c_part2/ostc_bigscreen.mcw
Binary file code_part1/OSTC_code_c_part2/ostc_bigscreen.mcw has changed
diff -r 000000000000 -r 96a35aeda5f2 code_part1/OSTC_code_c_part2/p2_deco_main - 090915a.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/code_part1/OSTC_code_c_part2/p2_deco_main - 090915a.c Tue Jan 12 15:05:59 2010 +0100
@@ -0,0 +1,3202 @@
+/*
+ * p2_deco_main.c
+ *
+ * Created on: 31.08.2009
+ * Author: christian.w @ heinrichsweikamp.com
+ *
+ */
+
+//#include
+
+// OSTC - diving computer code
+// Copyright (C) 2009 HeinrichsWeikamp GbR
+
+// 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 3 of the License, or
+// (at your option) any later version.
+
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// 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, see .
+
+
+// *****************************
+// ** I N T R O D U C T I O N **
+// *****************************
+//
+// OSTC
+//
+// code:
+// p2_deco_main_c_v101.c
+// part2 of the OSTC code
+// code with constant O2 partial pressure routines
+// under construction !!
+//
+// summary:
+// decompression routines
+// for the OSTC experimental project
+// written by Christian Weikamp
+// last revision __________
+// comments added _________
+//
+// additional files:
+// p2_tables_v100.romdata (other files)
+// 18f4685_ostc_v100.lkr (linker script)
+//
+// history:
+// 01/03/08 v100: first release candidate
+// 03/13/08 v101: start of programming ppO2 code
+// 03/13/25 v101a: backup of interrim version with ppO2 calculation
+// 03/13/25 v101: open circuit gas change during deco
+// 03/13/25 v101: CNS_fraction calculation
+// 03/13/26 v101: optimization of tissue calc routines
+// 07/xx/08 v102a: debug of bottom time routine
+// 09/xx/08 v102d: Gradient Factor Model implemenation
+// 10/10/08 v104: renamed to build v103 for v118 stable
+// 10/14/08 v104: integration of temp_depth_last_deco for Gradient Model
+// 03/31/090 v107: integration of FONT Incon24
+
+//
+// literature:
+// B"uhlmann, Albert: Tauchmedizin; 4. Auflage;
+// Schr"oder, Kai & Reith, Steffen; 2000; S"attigungsvorg"ange beim Tauchen, das Modell ZH-L16, Funktionsweise von Tauchcomputern; http://www.achim-und-kai.de/kai/tausim/saett_faq
+// Morrison, Stuart; 2000; DIY DECOMPRESSION; http://www.lizardland.co.uk/DIYDeco.html
+// Balthasar, Steffen; Dekompressionstheorie I: Neo Haldane Modelle; http://www.txfreak.de/dekompressionstheorie_1.pdf
+// Baker, Erik C.; Clearing Up The Confusion About "Deep Stops"
+// Baker, Erik C.; Understanding M-values; http://www.txfreak.de/understanding_m-values.pdf
+
+
+// *********************
+// ** I N C L U D E S **
+// *********************
+ #include
+ #include
+
+// ********************************
+// ** C O N F I G U R A T I O N **
+// ** for simulation without asm **
+// ********************************
+ #pragma config OSC = IRCIO67
+ #pragma config FCMEN = OFF
+ #pragma config IESO = OFF
+ #pragma config PWRT = ON
+ #pragma config BOREN = OFF
+ #pragma config WDT = OFF
+ #pragma config WDTPS = 128
+ #pragma config MCLRE = ON
+ #pragma config LPT1OSC = OFF
+ #pragma config PBADEN = OFF
+ #pragma config DEBUG = OFF
+ #pragma config XINST = OFF
+ #pragma config LVP = OFF
+ #pragma config STVREN = OFF
+
+// ****************************
+// ** D E F I N E S **
+// ** missing in p18f4685.h **
+// ****************************
+#define INT0IF 1
+#define INT1IF 0
+#define TMR1IF 0
+
+
+# define DBG_c_gas 0b0000000000000001
+# define DBG_c_ppO2 0b0000000000000010
+# define DBG_RUN 0b0000000000000100
+# define DBG_RESTART 0b0000000000001000
+
+# define DBG_CdeSAT 0b0000000000010000
+# define DBG_C_MODE 0b0000000000100000
+# define DBG_C_SURF 0b0000000001000000
+# define DBG_HEwoHE 0b0000000010000000
+
+# define DBG_C_DPPO2 0b0000000100000000
+# define DBG_C_DGAS 0b0000001000000000
+# define DBG_C_DIST 0b0000010000000000
+# define DBG_C_LAST 0b0000100000000000
+
+# define DBG_C_GF 0b0001000000000000
+# define DBG_ZH16ERR 0b0010000000000000
+# define DBG_PHIGH 0b0100000000000000
+# define DBG_PLOW 0b1000000000000000
+
+
+# define DBS_mode 0b0000000000000001
+# define DBS_ppO2 0b0000000000000010
+# define DBS_HE_sat 0b0000000000000100
+# define DBS_ppO2chg 0b0000000000001000
+
+# define DBS_SAT2l 0b0000000000010000
+# define DBS_SAT2h 0b0000000000100000
+# define DBS_GFLOW2l 0b0000000001000000
+# define DBS_GFLOW2h 0b0000000010000000
+
+# define DBS_GFHGH2l 0b0000000100000000
+# define DBS_GFHGH2h 0b0000001000000000
+# define DBS_GASO22l 0b0000010000000000
+# define DBS_GASO22h 0b0000100000000000
+
+# define DBS_DIST2h 0b0001000000000000
+# define DBS_LAST2h 0b0010000000000000
+# define DBS_DECOO2l 0b0100000000000000
+# define DBS_DECOO2h 0b1000000000000000
+
+
+# define DBS2_PRES2h 0b0000000000000001
+# define DBS2_PRES2l 0b0000000000000010
+# define DBS2_SURF2l 0b0000000000000100
+# define DBS2_SURF2h 0b0000000000001000
+
+# define DBS2_DESAT2l 0b0000000000010000
+# define DBS2_DESAT2h 0b0000000000100000
+# define DBS2_GFDneg 0b0000000001000000
+# define DBS2_ 0b000000000000000
+
+# define DBS2_ 0b000000000000000
+# define DBS2_ 0b000000000000000
+# define DBS2_ 0b000000000000000
+# define DBS2_ 0b000000000000000
+
+// NDL_at_20mtr
+
+
+
+// ***********************
+// ** V A R I A B L E S **
+// ***********************
+// prefixes etc:
+// _O_ = output for use in the assembler code
+// _I_ = input from the assembler code for the c code
+// char_ and int_ = used to identify output and input size
+// var = variable (from b"uhlmann)
+// pres = pressure
+// gtissue = guiding tissue, the one limiting the ascent
+// e2secs = exp of the b"uhlmann formula precalculated for a 2 second step
+// e1min = same for 1 minute step
+// sim = used in simulating the ascent to the surface
+// nullzeit = remaining ground/bottom time for "no deco"
+// hauptroutine = main
+
+#define WP_FONT_SMALL_HEIGHT 24
+#define WP_FONT_MEDIUM_HEIGHT 32
+#define WP_FONT_LARGE_HEIGHT 58
+
+#define oled_rw PORTA,2,0
+#define oled_rs PORTE,0,0
+
+#define U8 unsigned char
+#define U16 unsigned int
+
+// IO assembler
+#pragma udata bank0a=0x060
+volatile unsigned char wp_stringstore[26];
+volatile U8 wp_color1;
+volatile U8 wp_color2;
+volatile U8 wp_top;
+volatile U8 wp_leftx2;
+volatile U8 wp_font;
+volatile U8 wp_invert;
+volatile U8 wp_temp_U8;
+// internal C
+#pragma udata bank0b=0x081
+volatile U8 wp_txtptr;
+volatile unsigned char wp_char;
+volatile U8 wp_command;
+volatile U16 wp_data_16bit;
+volatile U8 wp_data_8bit_one;
+volatile U8 wp_data_8bit_two;
+volatile U16 wp_start;
+volatile U16 wp_end;
+volatile U16 wp_i;
+volatile U8 wp_black;
+// some spare
+volatile U8 wp_debug_U8;
+
+// asm only
+#pragma udata bank0c=0x0D0
+#define LENGTH_kf_bank0 48
+volatile unsigned char keep_free_bank0[LENGTH_kf_bank0];
+
+
+#pragma udata bank1=0x100
+#define LENGTH_kf_bank1 256
+volatile unsigned char keep_free_bank1[LENGTH_kf_bank1]; // used by the assembler code
+
+ #pragma udata bank2a=0x200
+// output:
+ static unsigned int int_O_tissue_for_debug[32];
+ static unsigned int int_O_GF_spare____; // 0x240
+ static unsigned int int_O_GF_step; // 0x242
+ static unsigned int int_O_gtissue_limit; // 0x244
+ static unsigned int int_O_gtissue_press; // 0x246
+ static unsigned int int_O_limit_GF_low; // 0x248
+ static unsigned int int_O_gtissue_press_at_GF_low; // 0x24A
+// 0x24C + 0x24D noch unbenutzt
+
+ #pragma udata bank2b=0x24E
+ static unsigned char char_O_GF_low_pointer; // 0x24E
+ static unsigned char char_O_actual_pointer; // 0x24F
+ #pragma udata bank2c=0x250
+ static unsigned char char_O_deco_table[32]; // 0x250
+ #pragma udata bank2d=0x270
+ static unsigned char char_I_table_deco_done[32];
+ #pragma udata bank2e=0x290
+ static unsigned int int_O_calc_tissue_call_counter; // 0x290
+// internal:
+ unsigned char lock_GF_depth_list;
+ static float temp_limit;
+ static float GF_low;
+ static float GF_high;
+ static float GF_delta;
+ static float GF_temp;
+ static float GF_step;
+ static float GF_step2;
+ static float temp_pres_gtissue;
+ static float temp_pres_gtissue_diff;
+ static float temp_pres_gtissue_limit_GF_low;
+ static float temp_pres_gtissue_limit_GF_low_below_surface;
+ static unsigned int temp_depth_limit;
+ static unsigned char temp_decotime;
+ static unsigned char temp_gtissue_no;
+ static unsigned int temp_depth_last_deco; // new in v.101
+
+ static unsigned char temp_depth_GF_low_meter;
+ static unsigned char temp_depth_GF_low_number;
+ static unsigned char internal_deco_pointer;
+ static unsigned char internal_deco_table[32];
+ static float temp_pres_deco_GF_low;
+
+static unsigned int debug_temp;
+
+
+#pragma udata bank3a=0x300
+static char output[32];
+// used by the math routines
+#pragma udata bank3b=0x380
+volatile float pres_tissue_vault[32];
+ #pragma udata bank4a=0x400
+// internal:
+ unsigned char ci ; // don't move - used in _asm routines - if moved then modify movlb commands
+ unsigned char x;
+ unsigned int main_i;
+ unsigned int int_temp;
+ unsigned int int_temp_decostatus;
+ static float pres_respiration;
+ static float pres_surface;
+ static float temp1;
+ static float temp2;
+ static float temp3;
+ static float temp4;
+ static float temp_deco;
+ static float temp_atem;
+ static float temp2_atem;
+ static float temp_tissue;
+ static float temp_surface;
+ static float N2_ratio;
+ static float He_ratio;
+ static float temp_ratio;
+ static float var_a;
+ static float var2_a;
+ static float var_b;
+ static float var2_b;
+ static float var_t05nc;
+ static float var2_t05nc;
+ static float var_e2secs;
+ static float var2_e2secs;
+ static float var_e1min;
+ static float var2_e1min;
+ static float var_halftimes;
+ static float var2_halftimes;
+ static float pres_gtissue_limit;
+ static float temp_pres_gtissue_limit;
+ static float actual_ppO2; // new in v.102
+ #pragma udata bank4b=0x480
+ static float pres_tissue[32];
+
+ #pragma udata bank5=0x500
+// don't move positions in this bank, the registers are addressed directly from assembler code
+// input:
+ static unsigned int int_I_pres_respiration; // 0x500
+ static unsigned int int_I_pres_surface; // 0x502
+ static unsigned int int_I_temp; // 0x504 new in v101
+ static unsigned char char_I_temp; // 0x506 new in v101
+ static unsigned char char_I_actual_ppO2; // 0x507
+ static unsigned int int_I_spare_3;
+ static unsigned int int_I_spare_4;
+ static unsigned int int_I_spare_5;
+ static unsigned int int_I_spare_6;
+ static unsigned char char_I_N2_ratio; // 0x510
+ static unsigned char char_I_He_ratio; // 0x511
+ static unsigned char char_I_saturation_multiplier; // for conservatism/safety values 1.0 (no conservatism) to 1.5 (50% faster saturation
+ static unsigned char char_I_desaturation_multiplier; // for conservatism/safety values 0.66 (50% slower desaturation) to 1.0 (no conservatism)// consveratism used in calc_tissue(), calc_tissue_step_1_min() and sim_tissue_1min()
+ static unsigned char char_I_GF_High_percentage; // 0x514 new in v.102
+ static unsigned char char_I_GF_Low_percentage; // 0x515 new in v.102
+ static unsigned char char_I_spare; // 0x516
+ static unsigned char char_I_deco_distance; // 0x517
+ static unsigned char char_I_const_ppO2; // 0x518 new in v.101
+ static unsigned char char_I_deco_ppO2_change; // 0x519 new in v.101
+ static unsigned char char_I_deco_ppO2; // 0x51A new in v.101
+ static unsigned char char_I_deco_gas_change; // 0x51B new in v.101
+ static unsigned char char_I_deco_N2_ratio; // 0x51C new in v.101
+ static unsigned char char_I_deco_He_ratio; // 0x51D new in v.101
+ static unsigned char char_I_depth_last_deco; // 0x51E new in v.101 unit: [m]
+ static unsigned char char_I_deco_model; // 0x51F new in v.102 ( 1 = MultiGraF, sonst Std. mit (de-)saturation_multiplier)
+// output:
+ static unsigned int int_O_desaturation_time; // 0x520
+ static unsigned char char_O_nullzeit; // 0x522
+ static unsigned char char_O_deco_status; // 0x523
+ static unsigned char char_O_array_decotime[7]; // 0x524
+ static unsigned char char_O_array_decodepth[6]; // 0x52B
+ static unsigned char char_O_ascenttime; // 0x531
+ static unsigned char char_O_gradient_factor; // 0x532
+ static unsigned char char_O_tissue_saturation[32]; // 0x533
+ static unsigned char char_O_array_gradient_weighted[16]; // 0x553
+ static unsigned char char_O_gtissue_no; // 0x563
+ static unsigned char char_O_diluent; // 0x564 new in v.101
+ static unsigned char char_O_CNS_fraction; // 0x565 new in v.101
+ static unsigned char char_O_relative_gradient_GF; // 0x566 new in v.102
+
+// internal:
+ static float pres_tissue_limit[16];
+ static float sim_pres_tissue_limit[16];
+ static float pres_diluent; // new in v.101
+ static float deco_diluent; // new in v.101
+ static float const_ppO2; // new in v.101
+ static float deco_ppO2_change; // new in v.101
+ static float deco_ppO2; // new in v.101
+
+
+
+ #pragma udata bank6=0x600
+// internal:
+ static float sim_pres_tissue[32];
+ static float sim_pres_tissue_backup[32];
+
+ //#pragma udata bank7=0x700
+ //const unsigned char keep_free_bank7[256]; // used by the assembler code (DD font2display)
+
+ #pragma udata bank8=0x800
+ static char md_pi_subst[256];
+
+ #pragma udata bank9a=0x900
+// output:
+ static char md_state[48]; // DONT MOVE !! // has to be at the beginning of bank 9 for the asm code!!!
+ #pragma udata bank9b=0x930
+// output:
+ static unsigned int int_O_DBS_bitfield; // 0x930 new in v.108
+ static unsigned int int_O_DBS2_bitfield; // 0x932 new in v.108
+ static unsigned int int_O_DBG_pre_bitfield; // 0x934 new in v.108
+ static unsigned int int_O_DBG_post_bitfield; // 0x936 new in v.108
+ static char char_O_NDL_at_20mtr; // 0x938 new in v.108 // 0xFF == undefined, max. 254
+// internal:
+ static char md_t;
+ static char md_buffer[16];
+ static char md_cksum[16];
+ static char md_i;
+ static char md_j;
+ static char md_temp;
+ static unsigned int md_pointer;
+ static float deco_N2_ratio; // new in v.101
+ static float deco_He_ratio; // new in v.101
+ static float calc_N2_ratio; // new in v.101
+ static float calc_He_ratio; // new in v.101
+ static float deco_gas_change; // new in v.101
+ static float CNS_fraction; // new in v.101
+ static float float_saturation_multiplier; // new in v.101
+ static float float_desaturation_multiplier; // new in v.101
+ static float float_deco_distance; // new in v.101
+// internal, dbg:
+ static unsigned char DBG_char_I_deco_model; // new in v.108
+ static unsigned char DBG_char_I_depth_last_deco; // new in v.108
+ static float DBG_pres_surface; // new in v.108
+ static float DBG_GF_low; // new in v.108
+ static float DBG_GF_high; // new in v.108
+ static float DBG_const_ppO2; // new in v.108
+ static float DBG_deco_ppO2_change; // new in v.108
+ static float DBG_deco_ppO2; // new in v.108
+ static float DBG_deco_N2_ratio; // new in v.108
+ static float DBG_deco_He_ratio; // new in v.108
+ static float DBG_deco_gas_change; // new in v.108
+ static float DBG_float_saturation_multiplier; // new in v.108
+ static float DBG_float_desaturation_multiplier; // new in v.108
+ static float DBG_float_deco_distance; // new in v.108
+ static float DBG_deco_N2_ratio; // new in v.108
+ static float DBG_deco_He_ratio; // new in v.108
+ static float DBG_N2_ratio; // new in v.108
+ static float DBG_He_ratio; // new in v.108
+ static char flag_in_divemode; // new in v.108
+ static int int_dbg_i; // new in v.108
+ unsigned int temp_DBS;
+
+// *************************
+// ** P R O T O T Y P E S **
+// *************************
+void main_calc_hauptroutine(void);
+void main_calc_without_deco(void);
+void main_clear_tissue(void);
+void main_calc_percentage(void);
+void main_calc_wo_deco_step_1_min(void);
+void main_debug(void);
+void main_gradient_array(void);
+void main_hash(void);
+
+void calc_hauptroutine(void);
+void calc_tissue(void);
+void calc_nullzeit(void);
+void backup_sim_pres_tissue(void);
+void restore_sim_pres_tissue(void);
+
+void calc_without_deco(void);
+void clear_tissue(void);
+void calc_ascenttime(void);
+void update_startvalues(void);
+void clear_decoarray(void);
+void update_decoarray(void);
+void sim_tissue_1min(void);
+void sim_tissue_10min(void);
+void calc_gradient_factor(void);
+void calc_gradient_array_only(void);
+void calc_desaturation_time(void);
+void calc_wo_deco_step_1_min(void);
+void calc_tissue_step_1_min(void);
+void hash(void);
+void clear_CNS_fraction(void);
+void calc_CNS_fraction(void);
+void calc_CNS_decrease_15min(void);
+void calc_percentage(void);
+void main(void);
+void calc_hauptroutine_data_input(void);
+void calc_hauptroutine_update_tissues(void);
+void calc_hauptroutine_calc_deco(void);
+void calc_hauptroutine_calc_ascend_to_deco(void);
+void calc_nextdecodepth_GF(void);
+void copy_deco_table_GF(void);
+void clear_internal_deco_table_GF(void);
+void update_internal_deco_table_GF(void);
+void DD2_write(void);
+void DD2_write_incon42(void);
+void DD2_get_pointer_to_char(void);
+void DD2_set_column(void);
+void DD2_load_background(void);
+void DD2_build_one_line_of_char(void);
+void DD2_print_column(void);
+void DD2_CmdWrite(void);
+void DD2_DataWrite(void);
+void push_tissues_to_vault(void);
+void pull_tissues_from_vault(void);
+void main_push_tissues_to_vault(void);
+void main_pull_tissues_from_vault(void);
+void wordprocessor(void);
+
+// *******************************
+// ** start **
+// ** necessary for compilation **
+// *******************************
+#pragma romdata der_code = 0x0000
+#pragma code der_start = 0x0000
+void der_start(void)
+{
+_asm
+ goto main
+_endasm
+}
+
+// ***********************************
+// ** main code for simulation / **
+// ** tests without assembler code **
+// ** is NOT a part of the OSTC **
+// ***********************************
+#pragma code main = 0x9000
+void main(void)
+{
+ for(wp_temp_U8=0;wp_temp_U8 15) // can't go up to first deco, too deep to calculate in the given time slot
+ {
+ char_O_deco_status = 2;
+// char_O_lock_depth_list = 255;
+ }
+ else
+ {
+// char_O_lock_depth_list = lock_GF_depth_list;
+ calc_hauptroutine_calc_deco();
+ }
+// build_debug_output();
+
+_asm
+nop
+_endasm
+while (char_O_deco_status == 1)
+{
+ char_O_deco_status = 0;
+// char_O_lock_depth_list = 255;
+ calc_hauptroutine_calc_deco();
+// build_debug_output();
+_asm
+nop
+_endasm
+};
+debug_temp = 60; // [mtr Aufstieg in 10 mtr/min (30steps'2sec/min]
+int_I_pres_respiration = 9980;
+for (main_i=0;main_i 15) // can't go up to first deco, too deep to calculate in the given time slot
+ {
+ char_O_deco_status = 2;
+// char_O_lock_depth_list = 255;
+ }
+ else
+ {
+// char_O_lock_depth_list = lock_GF_depth_list;
+ calc_hauptroutine_calc_deco();
+ }
+// build_debug_output();
+
+_asm
+nop
+_endasm
+while (char_O_deco_status == 1)
+{
+ char_O_deco_status = 0;
+// char_O_lock_depth_list = 255;
+ calc_hauptroutine_calc_deco();
+// build_debug_output();
+_asm
+nop
+_endasm
+};
+_asm
+nop
+_endasm
+debug_temp = 60; // [mtr Aufstieg in 10 mtr/min (30steps'2sec/min]
+int_I_pres_respiration = 9980;
+debug_temp = debug_temp * 3;
+for (main_i=0;main_i 1.3)
+ int_O_DBS_bitfield |= DBS_SAT2h;
+ if(GF_low < 0.19)
+ int_O_DBS_bitfield |= DBS_GFLOW2l;
+ if(GF_low > 1.01)
+ int_O_DBS_bitfield |= DBS_GFLOW2h;
+ if(GF_high < 0.6)
+ int_O_DBS_bitfield |= DBS_GFHGH2l;
+ if(GF_high > 1.01)
+ int_O_DBS_bitfield |= DBS_GFHGH2h;
+ if((N2_ratio + He_ratio) > 0.95)
+ int_O_DBS_bitfield |= DBS_GASO22l;
+ if((N2_ratio + He_ratio) < 0.05)
+ int_O_DBS_bitfield |= DBS_GASO22h;
+ if(float_deco_distance > 0.25)
+ int_O_DBS_bitfield |= DBS_DIST2h;
+ if(char_I_depth_last_deco > 8)
+ int_O_DBS_bitfield |= DBS_LAST2h;
+ if(DBG_deco_gas_change && ((deco_N2_ratio + deco_He_ratio) > 0.95))
+ int_O_DBS_bitfield |= DBS_DECOO2l;
+ if(DBG_deco_gas_change && ((deco_N2_ratio + deco_He_ratio) < 0.05))
+ int_O_DBS_bitfield |= DBS_DECOO2h;
+ if(pres_respiration > 3.0)
+ int_O_DBS2_bitfield |= DBS2_PRES2h;
+ if(pres_surface - pres_respiration > 0.2)
+ int_O_DBS2_bitfield |= DBS2_PRES2l;
+ if(pres_surface < 0.75)
+ int_O_DBS2_bitfield |= DBS2_SURF2l;
+ if(pres_surface > 1.11)
+ int_O_DBS2_bitfield |= DBS2_SURF2h;
+ if(float_desaturation_multiplier < 0.70)
+ int_O_DBS2_bitfield |= DBS2_DESAT2l;
+ if(float_desaturation_multiplier > 1.01)
+ int_O_DBS2_bitfield |= DBS2_DESAT2h;
+ if(GF_low > GF_high)
+ int_O_DBS2_bitfield |= DBS2_GFDneg;
+}
+
+// -------------------------------
+// DBG - set DBG to end_of_dive //
+// -------------------------------
+void set_dbg_end_of_dive(void)
+{
+ int_O_DBG_pre_bitfield &= (~DBG_RUN);
+ int_O_DBG_post_bitfield &= (~DBG_RUN);
+}
+
+// -------------------------------
+// DBG - NDL at first 20 m. hit //
+// -------------------------------
+void check_ndl(void)
+{
+ if((char_O_NDL_at_20mtr == -1) && (int_I_pres_respiration > 3000))
+ {
+ char_O_NDL_at_20mtr = char_O_nullzeit;
+ if(char_O_NDL_at_20mtr == 255)
+ char_O_NDL_at_20mtr == 254;
+ }
+}
+
+// -------------------------------
+// DBG - multi main during dive //
+// -------------------------------
+void check_dbg(char is_post_check)
+{
+ temp_DBS = 0;
+ if( (DBG_N2_ratio != N2_ratio) || (DBG_He_ratio != He_ratio) )
+ temp_DBS |= DBG_c_gas;
+ if(DBG_const_ppO2 != const_ppO2)
+ temp_DBS |= DBG_c_ppO2;
+ if((DBG_float_saturation_multiplier != float_saturation_multiplier) || (DBG_float_desaturation_multiplier != float_desaturation_multiplier))
+ temp_DBS |= DBG_CdeSAT;
+ if(DBG_char_I_deco_model != char_I_deco_model)
+ temp_DBS |= DBG_C_MODE;
+ if(DBG_pres_surface != pres_surface)
+ temp_DBS |= DBG_C_SURF;
+ if((!DBS_HE_sat) && (!He_ratio))
+ for(int_dbg_i = 16; int_dbg_i < 32; int_dbg_i++)
+ if(pres_tissue[int_dbg_i])
+ temp_DBS |= DBG_HEwoHE;
+ if(DBG_deco_ppO2 != deco_ppO2)
+ temp_DBS |= DBG_C_DPPO2;
+ if((DBG_deco_gas_change != deco_gas_change) || (DBG_deco_N2_ratio != deco_N2_ratio) || (DBG_deco_He_ratio != deco_He_ratio))
+ temp_DBS |= DBG_C_DGAS;
+ if(DBG_float_deco_distance != float_deco_distance)
+ temp_DBS |= DBG_C_DIST;
+ if(DBG_char_I_depth_last_deco != char_I_depth_last_deco)
+ temp_DBS |= DBG_C_LAST;
+ if((DBG_GF_low != GF_low) || (DBG_GF_high != GF_high))
+ temp_DBS |= DBG_C_GF;
+ if(pres_respiration > 13.0)
+ temp_DBS |= DBG_PHIGH;
+ if(pres_surface - pres_respiration > 0.2)
+ temp_DBS |= DBG_PLOW;
+/*
+ if()
+ temp_DBS |= ;
+ if()
+ temp_DBS |= ;
+ */
+ if(is_post_check)
+ int_O_DBG_post_bitfield |= temp_DBS;
+ else
+ int_O_DBG_pre_bitfield |= temp_DBS;
+}
+
+// -------------------------------
+// DBG - prior to calc. of dive //
+// -------------------------------
+void check_pre_dbg(void)
+{
+ check_dbg(0);
+}
+
+// -------------------------------
+// DBG - after decocalc of dive //
+// -------------------------------
+void check_post_dbg(void)
+{
+ check_dbg(1);
+}
+
+
+
+// -------------------------
+// calc_next_decodepth_GF //
+// -------------------------
+// new in v.102
+void calc_nextdecodepth_GF(void)
+{
+// INPUT, changing during dive:
+// temp_pres_gtissue_limit_GF_low
+// temp_pres_gtissue_limit_GF_low_below_surface
+// temp_pres_gtissue
+// temp_pres_gtissue_diff
+// lock_GF_depth_list
+
+// INPUT, fixed during dive:
+// pres_surface
+// GF_delta
+// GF_high
+// GF_low
+// temp_depth_last_deco
+// float_deco_distance
+
+// OUTPUT
+// GF_step
+// temp_deco
+// temp_depth_limt
+// lock_GF_depth_list
+
+// USES
+// temp1
+// temp2
+// int_temp
+
+ char_I_table_deco_done[0] = 0; // safety if changed somewhere else. Needed for exit
+ if (char_I_deco_model == 1)
+ {
+ if (lock_GF_depth_list == 0)
+ {
+ temp2 = temp_pres_gtissue_limit_GF_low_below_surface / 0.29985; // = ... / 99.95 / 0.003;
+ int_temp = (int) (temp2 + 0.99);
+ if (int_temp > 31)
+ int_temp = 31; // deepest deco at 93 meter (31 deco stops)
+ if (int_temp < 0)
+ int_temp = 0;
+ temp_depth_GF_low_number = int_temp;
+ temp_depth_GF_low_meter = 3 * temp_depth_GF_low_number;
+ temp2 = (float)temp_depth_GF_low_meter * 0.09995;
+ temp_pres_deco_GF_low = temp2 + float_deco_distance + pres_surface;
+ if (temp_depth_GF_low_number == 0)
+ GF_step = 0;
+ else
+ GF_step = GF_delta / (float)temp_depth_GF_low_number;
+ if (GF_step < 0)
+ GF_step = 0;
+ if (GF_step > GF_delta)
+ GF_step = GF_delta;
+ int_O_GF_step = (int)(GF_step * 10000);
+ int_O_limit_GF_low = (int)(temp_pres_deco_GF_low * 1000);
+ int_O_gtissue_press_at_GF_low = (int)(temp_pres_gtissue * 1000);
+ char_O_GF_low_pointer = temp_depth_GF_low_number;
+ lock_GF_depth_list = 1;
+ internal_deco_pointer = 0;
+ }
+ if (internal_deco_pointer == 0) // new run
+ {
+ internal_deco_pointer = temp_depth_GF_low_number;
+ GF_temp = GF_high - ((float)internal_deco_pointer * GF_step);
+ int_temp = char_I_table_deco_done[internal_deco_pointer];
+ output[8] = int_temp;
+ output[9] = 33;
+ }
+ else
+ {
+ int_temp = 1;
+ }
+ while (int_temp == 1)
+ {
+ int_temp = internal_deco_pointer - 1;
+ if (int_temp == 1) // new in v104
+ {
+ temp2 = (float)(temp_depth_last_deco * int_temp) * 0.09995;
+ GF_step2 = GF_step/3.0 * ((float)(6 - temp_depth_last_deco));
+ }
+ else
+ if (int_temp == 0)
+ {
+ temp2 = 0.0;
+ GF_step2 = GF_high - GF_temp;
+ }
+ else
+ {
+ temp2 = (float)(3 *int_temp) * 0.09995;
+ GF_step2 = GF_step;
+ }
+ temp2 = temp2 + pres_surface; // next deco stop to be tested
+ temp1 = ((GF_temp + GF_step2)* temp_pres_gtissue_diff) + temp_pres_gtissue; // upper limit (lowest pressure allowed) // changes GF_step2 in v104
+ if (temp1 > temp2) // check if ascent to next deco stop is ok
+ {
+ int_temp = 0; // no
+ }
+ else
+ {
+ internal_deco_pointer = int_temp;
+ GF_temp = GF_temp + GF_step2; // changed in v104
+ int_temp = char_I_table_deco_done[internal_deco_pointer]; // yes and check for ascent to even next stop if deco_done is set
+ }
+ } // while
+ if (internal_deco_pointer > 0)
+ {
+ temp2 = (float)(0.29985 * internal_deco_pointer);
+ temp_deco = temp2 + float_deco_distance + pres_surface;
+ if (internal_deco_pointer == 1) // new in v104
+ temp_depth_limit = temp_depth_last_deco;
+ else
+ temp_depth_limit = 3 * internal_deco_pointer;
+ if (output[9] == 33)
+ {
+ output[9] = internal_deco_pointer;
+ output[10] = char_I_table_deco_done[internal_deco_pointer];
+ output[12] = output[12] + 1;
+ if (output[12] == 100)
+ output[12] = 0;
+ }
+ }
+ else // if (char_I_deco_model == 1)
+ {
+ temp_deco = pres_surface;
+ temp_depth_limit = 0;
+ }
+ }
+ else
+ {
+ // calc_nextdecodepth - original
+ // optimized in v.101
+ // depth_last_deco included in v.101
+
+ temp1 = temp_pres_gtissue_limit - pres_surface;
+ if (temp1 >= 0)
+ {
+ temp1 = temp1 / 0.29985; // = temp1 / 99.95 / 0.003;
+ temp_depth_limit = (int) (temp1 + 0.99);
+ temp_depth_limit = 3 * temp_depth_limit; // depth for deco [m]
+ if (temp_depth_limit == 0)
+ temp_deco = pres_surface;
+ else
+ {
+ if (temp_depth_limit < temp_depth_last_deco)
+ temp_depth_limit = temp_depth_last_deco;
+ temp1 = (float)temp_depth_limit * 0.09995;
+ temp_deco = temp1 + float_deco_distance + pres_surface; // depth for deco [bar]
+ } // if (temp_depth_limit == 0)
+ } // if (temp1 >= 0)
+ else
+ {
+ temp_deco = pres_surface;
+ temp_depth_limit = 0;
+ } // if (temp1 >= 0)
+ } // calc_nextdecodepth original
+} // calc_nextdecodepth_GF
+
+
+#if 0
+void build_debug_output(void)
+{
+output[0] = 0; // not used in asm PLED output
+output[1] = (int) (GF_low * 100);
+output[2] = (int) (GF_high * 100);
+output[3] = (int) (GF_step * 100);
+output[4] = (int) temp_depth_GF_low_number;
+output[5] = (int) temp_depth_GF_low_meter;
+//output[6]
+output[7] = (int) internal_deco_pointer;
+//output[8] = char_I_table_deco_done[temp_depth_GF_low_number]
+//output[9] = internal_deco_pointer @ new run
+//output[10] = char_I_table_deco_done[internal_deco_pointer] @ new run
+output [11] = (int) (temp_pres_deco_GF_low * 10);
+} // build_debug_output
+#endif
+
+// ---------------------
+// copy_deco_table_GF //
+// ---------------------
+// new in v.102
+void copy_deco_table_GF(void)
+{
+ if (char_I_deco_model == 1)
+ {
+ int_temp = 32;
+ for (ci=0;ci // new table for deco_main_v.101 (var_a modified)
+
+#pragma romdata tables2 = 0x10600
+rom const rom unsigned int md_pi[] =
+{
+ 0x292E, 0x43C9, 0xA2D8, 0x7C01, 0x3D36, 0x54A1, 0xECF0, 0x0613
+ , 0x62A7, 0x05F3, 0xC0C7, 0x738C, 0x9893, 0x2BD9, 0xBC4C, 0x82CA
+ , 0x1E9B, 0x573C, 0xFDD4, 0xE016, 0x6742, 0x6F18, 0x8A17, 0xE512
+ , 0xBE4E, 0xC4D6, 0xDA9E, 0xDE49, 0xA0FB, 0xF58E, 0xBB2F, 0xEE7A
+ , 0xA968, 0x7991, 0x15B2, 0x073F, 0x94C2, 0x1089, 0x0B22, 0x5F21
+ , 0x807F, 0x5D9A, 0x5A90, 0x3227, 0x353E, 0xCCE7, 0xBFF7, 0x9703
+ , 0xFF19, 0x30B3, 0x48A5, 0xB5D1, 0xD75E, 0x922A, 0xAC56, 0xAAC6
+ , 0x4FB8, 0x38D2, 0x96A4, 0x7DB6, 0x76FC, 0x6BE2, 0x9C74, 0x04F1
+ , 0x459D, 0x7059, 0x6471, 0x8720, 0x865B, 0xCF65, 0xE62D, 0xA802
+ , 0x1B60, 0x25AD, 0xAEB0, 0xB9F6, 0x1C46, 0x6169, 0x3440, 0x7E0F
+ , 0x5547, 0xA323, 0xDD51, 0xAF3A, 0xC35C, 0xF9CE, 0xBAC5, 0xEA26
+ , 0x2C53, 0x0D6E, 0x8528, 0x8409, 0xD3DF, 0xCDF4, 0x4181, 0x4D52
+ , 0x6ADC, 0x37C8, 0x6CC1, 0xABFA, 0x24E1, 0x7B08, 0x0CBD, 0xB14A
+ , 0x7888, 0x958B, 0xE363, 0xE86D, 0xE9CB, 0xD5FE, 0x3B00, 0x1D39
+ , 0xF2EF, 0xB70E, 0x6658, 0xD0E4, 0xA677, 0x72F8, 0xEB75, 0x4B0A
+ , 0x3144, 0x50B4, 0x8FED, 0x1F1A, 0xDB99, 0x8D33, 0x9F11, 0x8314
+};
+
+// *********************
+// *********************
+// ** THE SUBROUTINES **
+// *********************
+// *********************
+
+#pragma code subroutines = 0x10700 // can be adapted to fit the romdata tables ahead
+
+
+// ---------------
+// CLEAR tissue //
+// ---------------
+// optimized in v.101 (var_a)
+
+void clear_tissue(void) // preload tissues with standard pressure for the given ambient pressure
+{
+
+ flag_in_divemode = 0;
+ int_O_DBS_bitfield = 0;
+ int_O_DBS2_bitfield = 0;
+ int_O_DBG_pre_bitfield = 0;
+ int_O_DBG_post_bitfield = 0;
+ char_O_NDL_at_20mtr = 255;
+
+_asm
+lfsr 1, 0x300 // C math routines shall use this variable bank
+movlw 0x01
+movwf TBLPTRU,0
+_endasm
+
+// N2_ratio = (float)char_I_N2_ratio; // the 0.0002 of 0.7902 are missing with standard air
+ N2_ratio = 0.7902; // N2_ratio / 100.0;
+ pres_respiration = (float)int_I_pres_respiration / 1000.0;
+for (ci=0;ci<16;ci++) // cycle through the 16 b"uhlmann tissues
+{
+ pres_tissue[ci] = N2_ratio * (pres_respiration - 0.0627) ;
+_asm
+movlw 0x02
+movwf TBLPTRH,0
+movlb 4 // fuer ci
+movf ci,0,1
+addwf ci,0,1
+addwf ci,0,1
+addwf ci,0,1
+addlw 0x80
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var_a+1
+TBLRDPOSTINC
+movff TABLAT,var_a
+TBLRDPOSTINC
+movff TABLAT,var_a+3
+TBLRD
+movff TABLAT,var_a+2
+addlw 0x80
+movwf TBLPTRL,0
+incf TBLPTRH,1,0
+TBLRDPOSTINC
+movff TABLAT,var_b+1
+TBLRDPOSTINC
+movff TABLAT,var_b
+TBLRDPOSTINC
+movff TABLAT,var_b+3
+TBLRD
+movff TABLAT,var_b+2
+_endasm
+
+pres_tissue_limit[ci] = (pres_tissue[ci] - var_a) * var_b ;
+// now update the guiding tissue
+if (pres_tissue_limit[ci] < 0)
+pres_tissue_limit[ci] = 0;
+} // for 0 to 16
+
+for (ci=16;ci<32;ci++) // cycle through the 16 b"uhlmann tissues for Helium
+{
+ pres_tissue[ci] = 0.0;
+} // for
+
+ clear_decoarray();
+ char_O_deco_status = 0;
+ char_O_nullzeit = 0;
+ char_O_ascenttime = 0;
+ char_O_gradient_factor = 0;
+ char_O_relative_gradient_GF = 0;
+} // clear_tissue(void)
+
+
+// --------------------
+// calc_without_deco //
+// fixed N2_ratio ! //
+// --------------------
+// optimized in v.101 (float_..saturation_multiplier)
+
+void calc_without_deco(void)
+{
+_asm
+ lfsr 1, 0x300
+_endasm
+ N2_ratio = 0.7902; // FIXED RATIO !! sum as stated in b"uhlmann
+ pres_respiration = (float)int_I_pres_respiration / 1000.0; // assembler code uses different digit system
+ pres_surface = (float)int_I_pres_surface / 1000.0;
+ temp_atem = N2_ratio * (pres_respiration - 0.0627); // 0.0627 is the extra pressure in the body
+ temp2_atem = 0.0;
+ temp_surface = pres_surface; // the b"uhlmann formula using temp_surface does apply to the pressure without any inert ratio
+ float_desaturation_multiplier = char_I_desaturation_multiplier / 100.0;
+ float_saturation_multiplier = char_I_saturation_multiplier / 100.0;
+
+ calc_tissue(); // update the pressure in the 16 tissues in accordance with the new ambient pressure
+
+ clear_decoarray();
+ char_O_deco_status = 0;
+ char_O_nullzeit = 0;
+ char_O_ascenttime = 0;
+ calc_gradient_factor();
+
+} // calc_without_deco
+
+
+// --------------------
+// calc_hauptroutine //
+// --------------------
+// this is the major code in dive mode
+// calculates:
+// the tissues,
+// the bottom time
+// and simulates the ascend with all deco stops
+
+void calc_hauptroutine(void)
+{
+ calc_hauptroutine_data_input();
+
+ if(!flag_in_divemode)
+ {
+ flag_in_divemode = 1;
+ create_dbs_set_dbg_and_ndl20mtr();
+ }
+ else
+ check_pre_dbg();
+
+ calc_hauptroutine_update_tissues();
+ calc_gradient_factor();
+
+
+ switch (char_O_deco_status) // toggle between calculation for nullzeit (bottom time), deco stops and more deco stops (continue)
+ {
+ case 0:
+ update_startvalues();
+ calc_nullzeit();
+ check_ndl();
+ char_O_deco_status = 255; // calc deco next time
+ break;
+ case 1:
+ if (char_O_deco_status == 3)
+ break;
+ char_O_deco_status = 0;
+// char_O_lock_depth_list = 255;
+ calc_hauptroutine_calc_deco();
+// build_debug_output();
+ break;
+ case 3: // new dive
+ clear_decoarray();
+ clear_internal_deco_table_GF();
+ copy_deco_table_GF();
+ internal_deco_pointer = 0;
+ lock_GF_depth_list = 0;
+ update_startvalues();
+ calc_nextdecodepth_GF();
+ char_O_deco_status = 0;
+ break;
+ default:
+ update_startvalues();
+ clear_decoarray();
+ clear_internal_deco_table_GF();
+ output[6] = 1;
+ calc_hauptroutine_calc_ascend_to_deco();
+ if (char_O_deco_status > 15) // can't go up to first deco, too deep to calculate in the given time slot
+ {
+ char_O_deco_status = 2;
+// char_O_lock_depth_list = 255;
+ }
+ else
+ {
+// char_O_lock_depth_list = lock_GF_depth_list;
+ calc_hauptroutine_calc_deco();
+ }
+// build_debug_output();
+ break;
+ }
+ calc_ascenttime();
+ check_post_dbg();
+}
+
+void calc_hauptroutine_data_input(void)
+{
+ pres_respiration = (float)int_I_pres_respiration / 1000.0;
+ pres_surface = (float)int_I_pres_surface / 1000.0;
+
+ N2_ratio = (float)char_I_N2_ratio / 100.0;; // the 0.0002 of 0.7902 are missing with standard air
+ He_ratio = (float)char_I_He_ratio / 100.0;;
+ deco_N2_ratio = (float)char_I_deco_N2_ratio / 100.0;
+ deco_He_ratio = (float)char_I_deco_He_ratio / 100.0;
+ float_deco_distance = (float)char_I_deco_distance / 100.0;
+ if(char_I_deco_gas_change)
+ {
+ deco_gas_change = (float)char_I_deco_gas_change / 9.995 + pres_surface;
+ deco_gas_change = deco_gas_change + float_deco_distance;
+ }
+ else
+ deco_gas_change = 0;
+ const_ppO2 = (float)char_I_const_ppO2 / 100.0;
+ deco_ppO2_change = (float)char_I_deco_ppO2_change / 99.95 + pres_surface;
+ deco_ppO2_change = deco_ppO2_change + float_deco_distance;
+ deco_ppO2 = (float)char_I_deco_ppO2 / 100.0;
+ float_desaturation_multiplier = char_I_desaturation_multiplier / 100.0;
+ float_saturation_multiplier = char_I_saturation_multiplier / 100.0;
+ GF_low = (float)char_I_GF_Low_percentage / 100.0;
+ GF_high = (float)char_I_GF_High_percentage / 100.0;
+ GF_delta = GF_high - GF_low;
+
+ temp2 = (pres_respiration - pres_surface) / 0.29985;
+ int_temp = (int)(temp2);
+ if (int_temp < 0)
+ int_temp = 0;
+ if (int_temp > 255)
+ int_temp = 255;
+ char_O_actual_pointer = int_temp;
+
+ temp_depth_last_deco = (int)char_I_depth_last_deco;
+}
+
+void calc_hauptroutine_update_tissues(void)
+{
+ int_O_calc_tissue_call_counter = int_O_calc_tissue_call_counter + 1;
+ if (char_I_const_ppO2 == 0) // new in v.101
+ pres_diluent = pres_respiration; // new in v.101
+ else // new in v.101
+ pres_diluent = ((pres_respiration - const_ppO2)/(N2_ratio + He_ratio)); // new in v.101
+ if (pres_diluent > pres_respiration) // new in v.101
+ pres_diluent = pres_respiration; // new in v.101
+ if (pres_diluent > 0.0627) // new in v.101
+ {
+ temp_atem = N2_ratio * (pres_diluent - 0.0627); // changed in v.101
+ temp2_atem = He_ratio * (pres_diluent - 0.0627); // changed in v.101
+ char_O_diluent = (char)(pres_diluent/pres_respiration*100.0);
+ }
+ else // new in v.101
+ {
+ temp_atem = 0.0; // new in v.101
+ temp2_atem = 0.0; // new in v.101
+ char_O_diluent = 0;
+ }
+ temp_surface = pres_surface;
+ calc_tissue();
+ int_O_gtissue_limit = (int)(pres_tissue_limit[char_O_gtissue_no] * 1000);
+ int_O_gtissue_press = (int)((pres_tissue[char_O_gtissue_no] + pres_tissue[char_O_gtissue_no+16]) * 1000);
+ if (char_I_deco_model == 1)
+ {
+ temp1 = temp1 * GF_high;
+ }
+ else
+ {
+ temp1 = temp_surface;
+ }
+ if (pres_gtissue_limit > temp1 && char_O_deco_status == 0) // if guiding tissue can not be exposed to surface pressure immediately
+ {
+ char_O_nullzeit = 0; // deco necessary
+ char_O_deco_status = 255; // calculate deco skip nullzeit calculation
+ }
+} // calc_hauptroutine_update_tissues
+void calc_hauptroutine_calc_deco(void)
+{
+ do
+ {
+ int_temp_decostatus = 0;
+ calc_nextdecodepth_GF();
+ if (temp_depth_limit > 0)
+ {
+ if (char_I_const_ppO2 == 0) // new in v.101
+ {
+ deco_diluent = temp_deco; // new in v.101
+ if (temp_deco > deco_gas_change)
+ {
+ calc_N2_ratio = N2_ratio;
+ calc_He_ratio = He_ratio;
+ }
+ else
+ {
+ calc_N2_ratio = deco_N2_ratio;
+ calc_He_ratio = deco_He_ratio;
+ }
+ }
+ else // new in v.101
+ {
+ calc_N2_ratio = N2_ratio;
+ calc_He_ratio = He_ratio;
+ if (temp_deco > deco_ppO2_change)
+ {
+ deco_diluent = ((temp_deco - const_ppO2)/(N2_ratio + He_ratio)); // new in v.101
+ }
+ else
+ {
+ deco_diluent = ((temp_deco - deco_ppO2)/(N2_ratio + He_ratio)); // new in v.101
+ }
+ }
+ if (deco_diluent > temp_deco) // new in v.101
+ deco_diluent = temp_deco; // new in v.101
+ if (deco_diluent > 0.0627) // new in v.101
+ {
+ temp_atem = calc_N2_ratio * (deco_diluent - 0.0627); // changed in v.101
+ temp2_atem = calc_He_ratio * (deco_diluent - 0.0627); // changed in v.101
+ }
+ else // new in v.101
+ {
+ temp_atem = 0.0; // new in v.101
+ temp2_atem = 0.0; // new in v.101
+ }
+ sim_tissue_1min();
+ update_internal_deco_table_GF();
+ temp_decotime = 1;
+ update_decoarray();
+ char_O_deco_status = char_O_deco_status + 1;
+ if (char_O_deco_status < 16)
+ int_temp_decostatus = 1;
+ }
+ else // if (temp_depth_limit > 0)
+ {
+ char_O_deco_status = 0;
+ }
+ } while (int_temp_decostatus == 1);
+ if (char_O_deco_status > 15)
+ {
+ char_O_deco_status = 1;
+ }
+ else
+ {
+ copy_deco_table_GF();
+ char_O_deco_status = 0;
+ }
+}
+
+void calc_hauptroutine_calc_ascend_to_deco(void)
+{
+ update_startvalues();
+ char_O_deco_status = 0;
+ temp_deco = pres_respiration;
+ lock_GF_depth_list = 1; // new in v.102
+ do // go up to first deco
+ {
+ int_temp_decostatus = 0;
+ temp_deco = temp_deco - 1.0;
+ if ( char_I_deco_model == 1) // new in v.102 , 4 = deep stops
+ temp_limit = temp_pres_gtissue_limit_GF_low;
+ else
+ temp_limit = temp_pres_gtissue_limit;
+ if ((temp_deco > temp_limit) && (temp_deco > pres_surface)) // changes in v.102
+ {
+ lock_GF_depth_list = 0; // new in v.102, distance to first stop > 10 mtr.
+ output[6] = 0;
+ if (char_I_const_ppO2 == 0) // new in v.101 // calculate at half of the ascent
+ {
+ deco_diluent = temp_deco + 0.5; // new in v.101
+ if (temp_deco + 0.5 > deco_gas_change)
+ {
+ calc_N2_ratio = N2_ratio;
+ calc_He_ratio = He_ratio;
+ }
+ else
+ {
+ calc_N2_ratio = deco_N2_ratio;
+ calc_He_ratio = deco_He_ratio;
+ }
+ }
+ else // new in v.101
+ {
+ calc_N2_ratio = N2_ratio;
+ calc_He_ratio = He_ratio;
+ if (temp_deco + 0.5 > deco_ppO2_change)
+ deco_diluent = ((temp_deco + 0.5 - const_ppO2)/(N2_ratio + He_ratio)); // new in v.101 // calculate at half of the ascent
+ else
+ deco_diluent = ((temp_deco + 0.5 - deco_ppO2)/(N2_ratio + He_ratio)); // new in v.101 // calculate at half of the ascent
+ if (deco_diluent > (temp_deco +0.5)) // new in v.101
+ deco_diluent = temp_deco + 0.5; // new in v.101 // calculate at half of the ascent
+ }
+ if (deco_diluent > 0.0627) // new in v.101
+ {
+ temp_atem = calc_N2_ratio * (deco_diluent - 0.0627); // changed in v.101
+ temp2_atem = calc_He_ratio * (deco_diluent - 0.0627); // changed in v.101
+ }
+ else // new in v.101
+ {
+ temp_atem = 0.0; // new in v.101
+ temp2_atem = 0.0; // new in v.101
+ }
+ sim_tissue_1min();
+ char_O_deco_status = char_O_deco_status + 1;
+ if (char_O_deco_status < 16) // 16 is the limit of calculations for one time slot
+ int_temp_decostatus = 1;
+ }
+ } while (int_temp_decostatus == 1);
+} // calc_hauptroutine_calc_ascend_to_deco
+
+// --------------
+// calc_tissue //
+// --------------
+// optimized in v.101
+
+void calc_tissue(void)
+{
+_asm
+lfsr 1, 0x300
+movlw 0x01
+movwf TBLPTRU,0
+_endasm
+
+ char_O_gtissue_no = 255;
+ pres_gtissue_limit = 0.0;
+
+for (ci=0;ci<16;ci++)
+{
+_asm
+movlw 0x02
+movwf TBLPTRH,0
+movlb 4 // fuer ci
+movf ci,0,1
+addwf ci,0,1
+addwf ci,0,1
+addwf ci,0,1
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var_e2secs+1 // the order is confussing
+TBLRDPOSTINC
+movff TABLAT,var_e2secs // low byte first, high afterwards
+TBLRDPOSTINC
+movff TABLAT,var_e2secs+3
+TBLRD
+movff TABLAT,var_e2secs+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var2_e2secs+1
+TBLRDPOSTINC
+movff TABLAT,var2_e2secs
+TBLRDPOSTINC
+movff TABLAT,var2_e2secs+3
+TBLRD
+movff TABLAT,var2_e2secs+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var_a+1
+TBLRDPOSTINC
+movff TABLAT,var_a
+TBLRDPOSTINC
+movff TABLAT,var_a+3
+TBLRD
+movff TABLAT,var_a+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var2_a+1
+TBLRDPOSTINC
+movff TABLAT,var2_a
+TBLRDPOSTINC
+movff TABLAT,var2_a+3
+TBLRD
+movff TABLAT,var2_a+2
+addlw 0x40
+movwf TBLPTRL,0
+incf TBLPTRH,1,0
+TBLRDPOSTINC
+movff TABLAT,var_b+1
+TBLRDPOSTINC
+movff TABLAT,var_b
+TBLRDPOSTINC
+movff TABLAT,var_b+3
+TBLRD
+movff TABLAT,var_b+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var2_b+1
+TBLRDPOSTINC
+movff TABLAT,var2_b
+TBLRDPOSTINC
+movff TABLAT,var2_b+3
+TBLRD
+movff TABLAT,var2_b+2
+_endasm
+ // the start values are the previous end values // write new values in temp
+
+ if( (var_e2secs < 0.0000363)
+ || (var_e2secs > 0.00577)
+ || (var2_e2secs < 0.0000961)
+ || (var2_e2secs > 0.150)
+ || (var_a < 0.231)
+ || (var_a > 1.27)
+ || (var_b < 0.504)
+ || (var_b > 0.966)
+ || (var2_a < 0.510)
+ || (var2_a > 1.75)
+ || (var2_b < 0.423)
+ || (var2_b > 0.927)
+ )
+ int_O_DBG_pre_bitfield |= DBG_ZH16ERR;
+
+// N2
+ temp_tissue = (temp_atem - pres_tissue[ci]) * var_e2secs;
+ temp_tissue_safety();
+ pres_tissue[ci] = pres_tissue[ci] + temp_tissue;
+
+// He
+ temp_tissue = (temp2_atem - pres_tissue[ci+16]) * var2_e2secs;
+ temp_tissue_safety();
+ pres_tissue[ci+16] = pres_tissue[ci+16] + temp_tissue;
+
+ temp_tissue = pres_tissue[ci] + pres_tissue[ci+16];
+
+ var_a = (var_a * pres_tissue[ci] + var2_a * pres_tissue[ci+16]) / temp_tissue;
+ var_b = (var_b * pres_tissue[ci] + var2_b * pres_tissue[ci+16]) / temp_tissue;
+ pres_tissue_limit[ci] = (temp_tissue - var_a) * var_b;
+ if (pres_tissue_limit[ci] < 0)
+ pres_tissue_limit[ci] = 0;
+ if (pres_tissue_limit[ci] > pres_gtissue_limit)
+ {
+ pres_gtissue_limit = pres_tissue_limit[ci];
+ char_O_gtissue_no = ci;
+ }//if
+} // for
+}//calc_tissue(void)
+
+// ----------------
+// calc_nullzeit //
+// ----------------
+// calculates the remaining bottom time
+
+// unchanged in v.101
+
+void calc_nullzeit(void)
+{
+ char_O_nullzeit = 0;
+ int_temp = 1;
+ do
+ {
+ backup_sim_pres_tissue();
+ sim_tissue_10min();
+ char_O_nullzeit = char_O_nullzeit + 10;
+ int_temp = int_temp + 1;
+ if (char_I_deco_model == 1)
+ temp1 = GF_high * temp_pres_gtissue_diff + temp_pres_gtissue;
+ else
+ temp1 = temp_pres_gtissue_limit;
+ if (temp1 > temp_surface) // changed in v.102 , if guiding tissue can not be exposed to surface pressure immediately
+ int_temp = 255;
+ } while (int_temp < 17);
+ if (int_temp == 255)
+ {
+ restore_sim_pres_tissue();
+ char_O_nullzeit = char_O_nullzeit - 10;
+ } //if int_temp == 255]
+ int_temp = 1;
+ if (char_O_nullzeit < 60)
+ {
+ do
+ {
+ sim_tissue_1min();
+ char_O_nullzeit = char_O_nullzeit + 1;
+ int_temp = int_temp + 1; // new in v.102a
+ if (char_I_deco_model == 1)
+ temp1 = GF_high * temp_pres_gtissue_diff + temp_pres_gtissue;
+ else
+ temp1 = temp_pres_gtissue_limit;
+ if (temp1 > temp_surface) // changed in v.102 , if guiding tissue can not be exposed to surface pressure immediately
+ int_temp = 255;
+ } while (int_temp < 10);
+ if (int_temp == 255)
+ char_O_nullzeit = char_O_nullzeit - 1;
+ } // if char_O_nullzeit < 60
+} //calc_nullzeit
+
+// -------------------------
+// backup_sim_pres_tissue //
+// -------------------------
+void backup_sim_pres_tissue(void)
+{
+ for (x = 0;x<16;x++)
+ {
+ sim_pres_tissue_backup[x] = sim_pres_tissue[x];
+ sim_pres_tissue_backup[x+16] = sim_pres_tissue[x+16];
+ }
+} // backup_sim
+
+// --------------------------
+// restore_sim_pres_tissue //
+// --------------------------
+void restore_sim_pres_tissue(void)
+{
+ for (x = 0;x<16;x++)
+ {
+ sim_pres_tissue[x] = sim_pres_tissue_backup[x];
+ sim_pres_tissue[x+16] = sim_pres_tissue_backup[x+16];
+ }
+} // restore_sim
+
+// ------------------
+// calc_ascenttime //
+// ------------------
+
+void calc_ascenttime(void)
+{
+if (pres_respiration > pres_surface)
+ {
+ switch (char_O_deco_status)
+ {
+ case 2:
+ char_O_ascenttime = 255;
+ break;
+ case 1:
+ break;
+ default:
+ temp1 = pres_respiration - pres_surface + 0.6; // + 0.6 hence 1 minute ascent time from a depth of 4 meter on
+ if (temp1 < 0)
+ temp1 = 0;
+ if (temp1 > 255)
+ temp1 = 255;
+ char_O_ascenttime = (char)temp1;
+
+ for(ci=0;ci<7;ci++)
+ {
+ x = char_O_ascenttime + char_O_array_decotime[ci];
+ if (x < char_O_ascenttime)
+ char_O_ascenttime = 255;
+ else
+ char_O_ascenttime = x;
+ }
+ }
+ }
+else
+ char_O_ascenttime = 0;
+} // calc_ascenttime()
+
+
+// ---------------------
+// update_startvalues //
+// ---------------------
+// updated in v.102
+
+void update_startvalues(void)
+{
+ temp_pres_gtissue_limit = pres_gtissue_limit;
+ temp_pres_gtissue = pres_tissue[char_O_gtissue_no] + pres_tissue[char_O_gtissue_no+16];
+ temp_pres_gtissue_diff = temp_pres_gtissue_limit - temp_pres_gtissue; // negative number
+ temp_pres_gtissue_limit_GF_low = GF_low * temp_pres_gtissue_diff + temp_pres_gtissue;
+ temp_pres_gtissue_limit_GF_low_below_surface = temp_pres_gtissue_limit_GF_low - pres_surface;
+ if (temp_pres_gtissue_limit_GF_low_below_surface < 0)
+ temp_pres_gtissue_limit_GF_low_below_surface = 0;
+
+ temp_gtissue_no = char_O_gtissue_no;
+ for (x = 0;x<16;x++)
+ {
+ sim_pres_tissue[x] = pres_tissue[x];
+ sim_pres_tissue[x+16] = pres_tissue[x+16];
+ sim_pres_tissue_limit[x] = pres_tissue_limit[x];
+ }
+} // update_startvalues
+
+
+// ------------------
+// sim_tissue_1min //
+// ------------------
+// optimized in v.101
+
+void sim_tissue_1min(void)
+{
+temp_pres_gtissue_limit = 0.0;
+temp_gtissue_no = 255;
+
+_asm
+lfsr 1, 0x300
+movlw 0x01
+movwf TBLPTRU,0
+_endasm
+
+
+for (ci=0;ci<16;ci++)
+{
+_asm
+movlw 0x02
+movwf TBLPTRH,0
+movlb 4 // fuer ci
+movf ci,0,1
+addwf ci,0,1
+addwf ci,0,1
+addwf ci,0,1
+addlw 0x80
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var_a+1
+TBLRDPOSTINC
+movff TABLAT,var_a
+TBLRDPOSTINC
+movff TABLAT,var_a+3
+TBLRD
+movff TABLAT,var_a+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var2_a+1
+TBLRDPOSTINC
+movff TABLAT,var2_a
+TBLRDPOSTINC
+movff TABLAT,var2_a+3
+TBLRD
+movff TABLAT,var2_a+2
+addlw 0x40
+movwf TBLPTRL,0
+incf TBLPTRH,1,0
+TBLRDPOSTINC
+movff TABLAT,var_b+1
+TBLRDPOSTINC
+movff TABLAT,var_b
+TBLRDPOSTINC
+movff TABLAT,var_b+3
+TBLRD
+movff TABLAT,var_b+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var2_b+1
+TBLRDPOSTINC
+movff TABLAT,var2_b
+TBLRDPOSTINC
+movff TABLAT,var2_b+3
+TBLRD
+movff TABLAT,var2_b+2
+addlw 0xC0
+movwf TBLPTRL,0
+incf TBLPTRH,1,0
+TBLRDPOSTINC
+movff TABLAT,var_e1min+1
+TBLRDPOSTINC
+movff TABLAT,var_e1min
+TBLRDPOSTINC
+movff TABLAT,var_e1min+3
+TBLRD
+movff TABLAT,var_e1min+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var2_e1min+1
+TBLRDPOSTINC
+movff TABLAT,var2_e1min
+TBLRDPOSTINC
+movff TABLAT,var2_e1min+3
+TBLRD
+movff TABLAT,var2_e1min+2
+_endasm
+// N2
+ temp_tissue = (temp_atem - sim_pres_tissue[ci]) * var_e1min;
+ temp_tissue_safety();
+ sim_pres_tissue[ci] = sim_pres_tissue[ci] + temp_tissue;
+// He
+ temp_tissue = (temp2_atem - sim_pres_tissue[ci+16]) * var2_e1min;
+ temp_tissue_safety();
+ sim_pres_tissue[ci+16] = sim_pres_tissue[ci+16] + temp_tissue;
+// pressure limit
+ temp_tissue = sim_pres_tissue[ci] + sim_pres_tissue[ci+16];
+ var_a = (var_a * sim_pres_tissue[ci] + var2_a * sim_pres_tissue[ci+16]) / temp_tissue;
+ var_b = (var_b * sim_pres_tissue[ci] + var2_b * sim_pres_tissue[ci+16]) / temp_tissue;
+ sim_pres_tissue_limit[ci] = (temp_tissue - var_a) * var_b;
+
+ if (sim_pres_tissue_limit[ci] < 0)
+ sim_pres_tissue_limit[ci] = 0;
+ if (sim_pres_tissue_limit[ci] > temp_pres_gtissue_limit)
+ {
+ temp_pres_gtissue = temp_tissue;
+ temp_pres_gtissue_limit = sim_pres_tissue_limit[ci];
+ temp_gtissue_no = ci;
+ }
+} // for
+ temp_pres_gtissue_diff = temp_pres_gtissue_limit - temp_pres_gtissue;
+ temp_pres_gtissue_limit_GF_low = GF_low * temp_pres_gtissue_diff + temp_pres_gtissue;
+ temp_pres_gtissue_limit_GF_low_below_surface = temp_pres_gtissue_limit_GF_low - pres_surface;
+ if (temp_pres_gtissue_limit_GF_low_below_surface < 0)
+ temp_pres_gtissue_limit_GF_low_below_surface = 0;
+} //sim_tissue_1min()
+
+//--------------------
+// sim_tissue_10min //
+//--------------------
+
+// Attention!! uses var_e1min und var2_e1min to load 10min data !!!
+// is identical to sim_tissue_1min routine except for the different load of those variables
+
+// optimized in v.101
+
+void sim_tissue_10min(void)
+{
+temp_pres_gtissue_limit = 0.0;
+temp_gtissue_no = 255;
+
+_asm
+lfsr 1, 0x300
+movlw 0x01
+movwf TBLPTRU,0
+_endasm
+
+for (ci=0;ci<16;ci++)
+{
+_asm
+movlw 0x02
+movwf TBLPTRH,0
+movlb 4 // fuer ci
+movf ci,0,1
+addwf ci,0,1
+addwf ci,0,1
+addwf ci,0,1
+addlw 0x80
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var_a+1
+TBLRDPOSTINC
+movff TABLAT,var_a
+TBLRDPOSTINC
+movff TABLAT,var_a+3
+TBLRD
+movff TABLAT,var_a+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var2_a+1
+TBLRDPOSTINC
+movff TABLAT,var2_a
+TBLRDPOSTINC
+movff TABLAT,var2_a+3
+TBLRD
+movff TABLAT,var2_a+2
+addlw 0x40
+movwf TBLPTRL,0
+incf TBLPTRH,1,0
+TBLRDPOSTINC
+movff TABLAT,var_b+1
+TBLRDPOSTINC
+movff TABLAT,var_b
+TBLRDPOSTINC
+movff TABLAT,var_b+3
+TBLRD
+movff TABLAT,var_b+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var2_b+1
+TBLRDPOSTINC
+movff TABLAT,var2_b
+TBLRDPOSTINC
+movff TABLAT,var2_b+3
+TBLRD
+movff TABLAT,var2_b+2
+addlw 0xC0 // different to 1 min
+movwf TBLPTRL,0
+incf TBLPTRH,1,0
+incf TBLPTRH,1,0 // different to 1 min
+TBLRDPOSTINC
+movff TABLAT,var_e1min+1
+TBLRDPOSTINC
+movff TABLAT,var_e1min
+TBLRDPOSTINC
+movff TABLAT,var_e1min+3
+TBLRD
+movff TABLAT,var_e1min+2
+addlw 0x40
+movwf TBLPTRL,0
+//incf TBLPTRH,1,0 // different to 1 min
+TBLRDPOSTINC
+movff TABLAT,var2_e1min+1
+TBLRDPOSTINC
+movff TABLAT,var2_e1min
+TBLRDPOSTINC
+movff TABLAT,var2_e1min+3
+TBLRD
+movff TABLAT,var2_e1min+2
+_endasm
+// N2
+ temp_tissue = (temp_atem - sim_pres_tissue[ci]) * var_e1min;
+ temp_tissue_safety();
+ sim_pres_tissue[ci] = sim_pres_tissue[ci] + temp_tissue;
+// He
+ temp_tissue = (temp2_atem - sim_pres_tissue[ci+16]) * var2_e1min;
+ temp_tissue_safety();
+ sim_pres_tissue[ci+16] = sim_pres_tissue[ci+16] + temp_tissue;
+// pressure limit
+temp_tissue = sim_pres_tissue[ci] + sim_pres_tissue[ci+16];
+ var_a = (var_a * sim_pres_tissue[ci] + var2_a * sim_pres_tissue[ci+16]) / temp_tissue;
+ var_b = (var_b * sim_pres_tissue[ci] + var2_b * sim_pres_tissue[ci+16]) / temp_tissue;
+
+sim_pres_tissue_limit[ci] = (temp_tissue - var_a) * var_b;
+ if (sim_pres_tissue_limit[ci] < 0)
+ sim_pres_tissue_limit[ci] = 0;
+ if (sim_pres_tissue_limit[ci] > temp_pres_gtissue_limit)
+ {
+ temp_pres_gtissue = temp_tissue;
+ temp_pres_gtissue_limit = sim_pres_tissue_limit[ci];
+ temp_gtissue_no = ci;
+ }
+} // for
+ temp_pres_gtissue_diff = temp_pres_gtissue_limit - temp_pres_gtissue; // negative number
+ temp_pres_gtissue_limit_GF_low = GF_low * temp_pres_gtissue_diff + temp_pres_gtissue;
+ temp_pres_gtissue_limit_GF_low_below_surface = temp_pres_gtissue_limit_GF_low - pres_surface;
+ if (temp_pres_gtissue_limit_GF_low_below_surface < 0)
+ temp_pres_gtissue_limit_GF_low_below_surface = 0;
+} //sim_tissue_10min()
+
+
+// ------------------
+// clear_decoarray //
+// ------------------
+// unchanged in v.101
+
+void clear_decoarray(void)
+{
+char_O_array_decodepth[0] = 0;
+char_O_array_decodepth[1] = 0;
+char_O_array_decodepth[2] = 0;
+char_O_array_decodepth[3] = 0;
+char_O_array_decodepth[4] = 0;
+char_O_array_decodepth[5] = 0;
+char_O_array_decotime[0] = 0;
+char_O_array_decotime[1] = 0;
+char_O_array_decotime[2] = 0;
+char_O_array_decotime[3] = 0;
+char_O_array_decotime[4] = 0;
+char_O_array_decotime[5] = 0;
+char_O_array_decotime[6] = 0;
+} // clear_decoarray
+
+
+// -------------------
+// update_decoarray //
+// -------------------
+// unchanged in v.101
+
+void update_decoarray()
+{
+ x = 0;
+ do
+ {
+ if (char_O_array_decodepth[x] == temp_depth_limit)
+ {
+ int_temp = char_O_array_decotime[x] + temp_decotime;
+ if (int_temp < 0)
+ int_temp = 0;
+ if (int_temp > 240)
+ int_temp = 240;
+ char_O_array_decotime[x] = int_temp;
+ x = 10; // exit
+ } // if
+ else
+ {
+ if (char_O_array_decodepth[x] == 0)
+ {
+ if (temp_depth_limit > 255)
+ char_O_array_decodepth[x] = 255;
+ else
+ char_O_array_decodepth[x] = (char)temp_depth_limit;
+ int_temp = char_O_array_decotime[x] + temp_decotime;
+ if (int_temp > 240)
+ char_O_array_decotime[x] = 240;
+ else
+ char_O_array_decotime[x] = (char)int_temp;
+ x = 10; // exit
+ } // if
+ else
+ x++;
+ } // else
+ } while (x<6);
+ if (x == 6)
+ {
+ int_temp = char_O_array_decotime[6] + temp_decotime;
+ if (int_temp > 220)
+ char_O_array_decotime[6] = 220;
+ else
+ char_O_array_decotime[6] = (char)int_temp;
+ } // if x == 6
+} // update_decoarray
+
+
+// -----------------------
+// calc_gradient_factor //
+// -----------------------
+// optimized in v.101 (var_a)
+// new code in v.102
+
+void calc_gradient_factor(void)
+{
+ // tissue > respiration (entsaettigungsvorgang)
+ // gradient ist wieviel prozent an limit mit basis tissue
+ // dh. 0% = respiration == tissue
+ // dh. 100% = respiration == limit
+ temp_tissue = pres_tissue[char_O_gtissue_no] + pres_tissue[char_O_gtissue_no+16];
+ temp1 = temp_tissue - pres_respiration;
+ temp2 = temp_tissue - pres_tissue_limit[char_O_gtissue_no]; // changed in v.102
+ temp2 = temp1/temp2;
+ temp2 = temp2 * 100; // displayed in percent
+ if (temp2 < 0)
+ temp2 = 0;
+ if (temp2 > 255)
+ temp2 = 255;
+ if (temp1 < 0)
+ char_O_gradient_factor = 0;
+ else
+ char_O_gradient_factor = (char)temp2;
+
+ temp3 = temp2;
+
+ if (char_I_deco_model == 1) // calculate relative gradient factor
+ {
+ temp1 = (float)temp_depth_GF_low_meter * 0.09995;
+ temp2 = pres_respiration - pres_surface;
+ if (temp2 <= 0)
+ temp1 = GF_high;
+ else
+ if (temp2 >= temp1)
+ temp1 = GF_low;
+ else
+ temp1 = GF_low + (temp1 - temp2)/temp1*GF_delta;
+ if (temp_depth_GF_low_meter == 0)
+ temp1 = GF_high;
+ temp2 = temp3 / temp1; // temp3 is already in percent
+ if (temp2 < 0)
+ temp2 = 0;
+ if (temp2 > 255)
+ temp2 = 255;
+ char_O_relative_gradient_GF = (char)temp2;
+ } // calc relative gradient factor
+ else
+ {
+ char_O_relative_gradient_GF = char_O_gradient_factor;
+ }
+} // calc_gradient
+
+// ---------------------------
+// calc_gradient_array_only //
+// ---------------------------
+// optimized in v.101 (var_a)
+// new code in v.102
+
+void calc_gradient_array_only()
+{
+ pres_respiration = (float)int_I_pres_respiration / 1000.0; // assembler code uses different digit system
+for (ci=0;ci<16;ci++)
+{
+ temp_tissue = pres_tissue[ci] + pres_tissue[ci+16];
+ temp1 = temp_tissue - pres_respiration;
+ temp2 = temp_tissue - pres_tissue_limit[ci];
+ temp2 = temp1/temp2;
+ temp2 = temp2 * 200; // because of output in (Double-)percentage
+ if (temp2 < 0)
+ temp2 = 0;
+ if (temp2 > 255)
+ temp2 = 255;
+ if (temp1 < 0)
+ char_O_array_gradient_weighted[ci] = 0;
+ else
+ char_O_array_gradient_weighted[ci] = (char)temp2;
+} // for
+} // calc_gradient_array_only
+
+
+// -------------------------
+// calc_desaturation_time //
+// -------------------------
+// FIXED N2_ratio
+// unchanged in v.101
+
+void calc_desaturation_time(void)
+{
+_asm
+lfsr 1, 0x300
+movlw 0x01
+movwf TBLPTRU,0
+_endasm
+ N2_ratio = 0.7902; // FIXED sum as stated in b"uhlmann
+ pres_surface = (float)int_I_pres_surface / 1000.0;
+ temp_atem = N2_ratio * (pres_surface - 0.0627);
+ int_O_desaturation_time = 0;
+ float_desaturation_multiplier = char_I_desaturation_multiplier / 142.0; // new in v.101 (70,42%/100.=142)
+
+for (ci=0;ci<16;ci++)
+{
+_asm
+movlw 0x04
+movwf TBLPTRH,0
+movlb 4 // fuer ci
+movf ci,0,1
+addwf ci,0,1
+addwf ci,0,1
+addwf ci,0,1
+addlw 0x80
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var_halftimes+1
+TBLRDPOSTINC
+movff TABLAT,var_halftimes
+TBLRDPOSTINC
+movff TABLAT,var_halftimes+3
+TBLRD
+movff TABLAT,var_halftimes+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var2_halftimes+1
+TBLRDPOSTINC
+movff TABLAT,var2_halftimes
+TBLRDPOSTINC
+movff TABLAT,var2_halftimes+3
+TBLRD
+movff TABLAT,var2_halftimes+2
+_endasm
+
+// saturation_time (for flight) and N2_saturation in multiples of halftime
+// version v.100: 1.1 = 10 percent distance to totally clean (totally clean is not possible, would take infinite time )
+// new in version v.101: 1.07 = 7 percent distance to totally clean (totally clean is not possible, would take infinite time )
+// changes in v.101: 1.05 = 5 percent dist to totally clean is new desaturation point for display and noFly calculations
+// N2
+ temp1 = 1.05 * temp_atem;
+ temp1 = temp1 - pres_tissue[ci];
+ temp2 = temp_atem - pres_tissue[ci];
+ if (temp2 >= 0.0)
+ {
+ temp1 = 0;
+ temp2 = 0;
+ }
+ else
+ temp1 = temp1 / temp2;
+ if (temp1 > 0.0)
+ {
+ temp1 = log(1.0 - temp1);
+ temp1 = temp1 / -0.6931; // temp1 is the multiples of half times necessary.
+ // 0.6931 is ln(2), because the math function log() calculates with a base of e not 2 as requested.
+ // minus because log is negative
+ temp2 = var_halftimes * temp1 / float_desaturation_multiplier; // time necessary (in minutes ) for complete desaturation (see comment about 10 percent) , new in v.101: float_desaturation_multiplier
+ }
+ else
+ {
+ temp1 = 0;
+ temp2 = 0;
+ }
+
+// He
+ temp3 = 0.1 - pres_tissue[ci+16];
+if (temp3 >= 0.0)
+ {
+ temp3 = 0;
+ temp4 = 0;
+ }
+ else
+ temp3 = -1.0 * temp3 / pres_tissue[ci+16];
+ if (temp3 > 0.0)
+ {
+ temp3 = log(1.0 - temp3);
+ temp3 = temp3 / -0.6931; // temp1 is the multiples of half times necessary.
+ // 0.6931 is ln(2), because the math function log() calculates with a base of e not 2 as requested.
+ // minus because log is negative
+ temp4 = var2_halftimes * temp3 / float_desaturation_multiplier; // time necessary (in minutes ) for "complete" desaturation, new in v.101 float_desaturation_multiplier
+ }
+ else
+ {
+ temp3 = 0;
+ temp4 = 0;
+ }
+
+// saturation_time (for flight)
+ if (temp4 > temp2)
+ int_temp = (int)temp4;
+ else
+ int_temp = (int)temp2;
+ if(int_temp > int_O_desaturation_time)
+ int_O_desaturation_time = int_temp;
+
+// N2 saturation in multiples of halftime for display purposes
+ temp2 = temp1 * 20.0; // 0 = 1/8, 120 = 0, 249 = 8
+ temp2 = temp2 + 80.0; // set center
+ if (temp2 < 0.0)
+ temp2 = 0.0;
+ if (temp2 > 255.0)
+ temp2 = 255.0;
+ char_O_tissue_saturation[ci] = (char)temp2;
+// He saturation in multiples of halftime for display purposes
+ temp4 = temp3 * 20.0; // 0 = 1/8, 120 = 0, 249 = 8
+ temp4 = temp4 + 80.0; // set center
+ if (temp4 < 0.0)
+ temp4 = 0.0;
+ if (temp4 > 255.0)
+ temp4 = 255.0;
+ char_O_tissue_saturation[ci+16] = (char)temp4;
+} // for
+} // calc_desaturation_time
+
+
+// --------------------------
+// calc_wo_deco_step_1_min //
+// --------------------------
+// FIXED N2 Ratio
+// optimized in v.101 (...saturation_multiplier)
+// desaturation slowed down to 70,42%
+
+void calc_wo_deco_step_1_min(void)
+{
+ if(flag_in_divemode)
+ {
+ flag_in_divemode = 0;
+ set_dbg_end_of_dive();
+ }
+_asm
+ lfsr 1, 0x300
+_endasm
+ N2_ratio = 0.7902; // FIXED, sum lt. buehlmann
+ pres_respiration = (float)int_I_pres_respiration / 1000.0; // assembler code uses different digit system
+ pres_surface = (float)int_I_pres_surface / 1000.0;
+ temp_atem = N2_ratio * (pres_respiration - 0.0627); // 0.0627 is the extra pressure in the body
+ temp2_atem = 0.0;
+ temp_surface = pres_surface; // the b"uhlmann formula using temp_surface does not use the N2_ratio
+ float_desaturation_multiplier = char_I_desaturation_multiplier / 142.0; // new in v.101 (70,42%/100.=142)
+ float_saturation_multiplier = char_I_saturation_multiplier / 100.0;
+
+ calc_tissue_step_1_min(); // update the pressure in the 16 tissues in accordance with the new ambient pressure
+ clear_decoarray();
+ char_O_deco_status = 0;
+ char_O_nullzeit = 0;
+ char_O_ascenttime = 0;
+ calc_gradient_factor();
+
+} // calc_wo_deco_step_1_min(void)
+
+
+// -------------------------
+// calc_tissue_step_1_min //
+// -------------------------
+// optimized in v.101
+
+void calc_tissue_step_1_min(void)
+{
+_asm
+lfsr 1, 0x300
+movlw 0x01
+movwf TBLPTRU,0
+_endasm
+
+ char_O_gtissue_no = 255;
+ pres_gtissue_limit = 0.0;
+
+for (ci=0;ci<16;ci++)
+{
+_asm
+movlw 0x02
+movwf TBLPTRH,0
+movlb 4 // fuer ci
+movf ci,0,1
+addwf ci,0,1
+addwf ci,0,1
+addwf ci,0,1
+addlw 0x80
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var_a+1
+TBLRDPOSTINC
+movff TABLAT,var_a
+TBLRDPOSTINC
+movff TABLAT,var_a+3
+TBLRD
+movff TABLAT,var_a+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var2_a+1
+TBLRDPOSTINC
+movff TABLAT,var2_a
+TBLRDPOSTINC
+movff TABLAT,var2_a+3
+TBLRD
+movff TABLAT,var2_a+2
+addlw 0x40
+movwf TBLPTRL,0
+incf TBLPTRH,1,0
+TBLRDPOSTINC
+movff TABLAT,var_b+1
+TBLRDPOSTINC
+movff TABLAT,var_b
+TBLRDPOSTINC
+movff TABLAT,var_b+3
+TBLRD
+movff TABLAT,var_b+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var2_b+1
+TBLRDPOSTINC
+movff TABLAT,var2_b
+TBLRDPOSTINC
+movff TABLAT,var2_b+3
+TBLRD
+movff TABLAT,var2_b+2
+addlw 0xC0
+movwf TBLPTRL,0
+incf TBLPTRH,1,0
+TBLRDPOSTINC
+movff TABLAT,var_e1min+1
+TBLRDPOSTINC
+movff TABLAT,var_e1min
+TBLRDPOSTINC
+movff TABLAT,var_e1min+3
+TBLRD
+movff TABLAT,var_e1min+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var2_e1min+1
+TBLRDPOSTINC
+movff TABLAT,var2_e1min
+TBLRDPOSTINC
+movff TABLAT,var2_e1min+3
+TBLRD
+movff TABLAT,var2_e1min+2
+_endasm
+
+// N2 1 min
+ temp_tissue = (temp_atem - pres_tissue[ci]) * var_e1min;
+ temp_tissue_safety();
+ pres_tissue[ci] = pres_tissue[ci] + temp_tissue;
+
+// He 1 min
+ temp_tissue = (temp2_atem - pres_tissue[ci+16]) * var2_e1min;
+ temp_tissue_safety();
+ pres_tissue[ci+16] = pres_tissue[ci+16] + temp_tissue;
+
+ temp_tissue = pres_tissue[ci] + pres_tissue[ci+16];
+ var_a = (var_a * pres_tissue[ci] + var2_a * pres_tissue[ci+16]) / temp_tissue;
+ var_b = (var_b * pres_tissue[ci] + var2_b * pres_tissue[ci+16]) / temp_tissue;
+ pres_tissue_limit[ci] = (temp_tissue - var_a) * var_b;
+ if (pres_tissue_limit[ci] < 0)
+ pres_tissue_limit[ci] = 0;
+ if (pres_tissue_limit[ci] > pres_gtissue_limit)
+ {
+ pres_gtissue_limit = pres_tissue_limit[ci];
+ char_O_gtissue_no = ci;
+ }//if
+
+// gradient factor array for graphical display
+// display range is 0 to 250! in steps of 5 for 1 pixel
+// the display is divided in 6 blocks
+// -> double the gradient 100% = 200
+// tissue > respiration (entsaettigungsvorgang)
+// gradient ist wieviel prozent an limit von tissue aus
+// dh. 0% = respiration == tissue
+// dh. 100% = respiration == limit
+temp1 = temp_tissue - pres_respiration;
+temp2 = temp_tissue - pres_tissue_limit[ci]; // changed in v.102
+temp2 = temp1/temp2;
+temp2 = temp2 * 200; // because of output in (Double-)percentage
+if (temp2 < 0)
+ temp2 = 0;
+if (temp2 > 255)
+ temp2 = 255;
+if (temp1 < 0)
+ char_O_array_gradient_weighted[ci] = 0;
+else
+ char_O_array_gradient_weighted[ci] = (char)temp2;
+
+} // for
+} // calc wo deco 1min
+
+#if 0
+// --------
+// debug //
+// --------
+void debug(void)
+{
+for (ci=0;ci<32;ci++)
+{
+ int_O_tissue_for_debug[ci] = (unsigned int)(pres_tissue[ci] *1000);
+}
+} // void debug(void)
+#endif
+
+// ----------
+// md hash //
+// ----------
+void hash(void)
+{
+// init
+ for (md_i=0;md_i<16;md_i++)
+ {
+ md_state[md_i] = 0;
+ md_cksum[md_i] = 0;
+ } // for md_i 16
+
+_asm
+ movlw 0x01
+ movwf TBLPTRU,0
+ movlw 0x06
+ movwf TBLPTRH,0
+ movlw 0x00
+ movwf TBLPTRL,0
+_endasm
+ for (md_i=0;md_i<127;md_i++)
+ {
+_asm
+ TBLRDPOSTINC
+ movff TABLAT,md_temp
+_endasm
+ md_pi_subst[md_i] = md_temp;
+ } // for md_i 256
+_asm
+ TBLRDPOSTINC
+ movff TABLAT,md_temp
+_endasm
+ md_pi_subst[127] = md_temp;
+ for (md_i=0;md_i<127;md_i++)
+ {
+_asm
+ TBLRDPOSTINC
+ movff TABLAT,md_temp
+_endasm
+ md_pi_subst[md_i+128] = md_temp;
+ } // for md_i 256
+_asm
+ TBLRD
+ movff TABLAT,md_temp
+_endasm
+ md_pi_subst[255] = md_temp;
+
+_asm
+ movlw 0x00
+ movwf TBLPTRU,0
+ movlw 0x00
+ movwf TBLPTRH,0
+ movlw 0x00
+ movwf TBLPTRL,0
+_endasm
+// cycle buffers
+for (md_pointer=0x0000;md_pointer<0x17f3;md_pointer++)
+{
+ md_t = 0;
+ for (md_i=0;md_i<16;md_i++)
+ {
+ if(md_pointer == 9)
+ md_temp = md_cksum[md_i];
+ else
+ {
+_asm
+ TBLRDPOSTINC
+ movff TABLAT,md_temp
+_endasm
+ } // else
+ md_buffer[md_i] = md_temp;
+ md_state[md_i+16] = md_buffer[md_i];
+ md_state[md_i+32] = (unsigned char)(md_buffer[md_i] ^ md_state[md_i]);
+ } // for md_i 16
+
+ for (md_i=0;md_i<18;md_i++)
+ {
+ for (md_j=0;md_j<48;md_j++)
+ {
+ md_state[md_j] = (unsigned char)(md_state[md_j] ^ md_pi_subst[md_t]);
+ md_t = md_state[md_j];
+ } // for md_j 48
+ md_t = (unsigned char)(md_t+1);
+ } // for md_i 18
+ md_t = md_cksum[15];
+
+ for (md_i=0;md_i<16;md_i++)
+ {
+ md_cksum[md_i] = (unsigned char)(md_cksum[md_i] ^ md_pi_subst[(md_buffer[md_i] ^ md_t)]);
+ md_t = md_cksum[md_i];
+ } // for md_i 16
+} // for md_pointer
+} // void hash(void)
+
+// ---------------------
+// clear_CNS_fraction //
+// ---------------------
+// new in v.101
+
+void clear_CNS_fraction(void)
+{
+ CNS_fraction = 0.0;
+ char_O_CNS_fraction = 0;
+} // void clear_CNS_fraction(void)
+
+
+// --------------------
+// calc_CNS_fraction //
+// --------------------
+// new in v.101
+// optimized in v.102 : with new variables char_I_actual_ppO2 and actual_ppO2
+
+// Input: char_I_actual_ppO2
+// Output: char_O_CNS_fraction
+// Uses and Updates: CNS_fraction
+// Uses: acutal_ppO2
+
+void calc_CNS_fraction(void)
+{
+ actual_ppO2 = (float)char_I_actual_ppO2 / 100.0;
+
+ if (char_I_actual_ppO2 < 50)
+ CNS_fraction = CNS_fraction;// no changes
+ else if (char_I_actual_ppO2 < 60)
+ CNS_fraction = 1/(-54000.0 * actual_ppO2 + 54000.0) + CNS_fraction;
+ else if (char_I_actual_ppO2 < 70)
+ CNS_fraction = 1/(-45000.0 * actual_ppO2 + 48600.0) + CNS_fraction;
+ else if (char_I_actual_ppO2 < 80)
+ CNS_fraction = 1/(-36000.0 * actual_ppO2 + 42300.0) + CNS_fraction;
+ else if (char_I_actual_ppO2 < 90)
+ CNS_fraction = 1/(-27000.0 * actual_ppO2 + 35100.0) + CNS_fraction;
+ else if (char_I_actual_ppO2 < 110)
+ CNS_fraction = 1/(-18000.0 * actual_ppO2 + 27000.0) + CNS_fraction;
+ else if (char_I_actual_ppO2 < 150)
+ CNS_fraction = 1/(-9000.0 * actual_ppO2 + 17100.0) + CNS_fraction;
+ else if (char_I_actual_ppO2 < 160)
+ CNS_fraction = 1/(-22500.0 * actual_ppO2 + 37350.0) + CNS_fraction;
+ else if (char_I_actual_ppO2 < 165)
+ CNS_fraction = 0.000755 + CNS_fraction; // Arieli et all.(2002): Modeling pulmonary and CNS O2 toxicity... Formula (A1) based on value for 1.55 and c=20
+ else if (char_I_actual_ppO2 < 170)
+ CNS_fraction = 0.00102 + CNS_fraction; // example calculation: Sqrt((1.7/1.55)^20)*0.000404
+ else if (char_I_actual_ppO2 < 175)
+ CNS_fraction = 0.00136 + CNS_fraction;
+ else if (char_I_actual_ppO2 < 180)
+ CNS_fraction = 0.00180 + CNS_fraction;
+ else if (char_I_actual_ppO2 < 185)
+ CNS_fraction = 0.00237 + CNS_fraction;
+ else if (char_I_actual_ppO2 < 190)
+ CNS_fraction = 0.00310 + CNS_fraction;
+ else if (char_I_actual_ppO2 < 195)
+ CNS_fraction = 0.00401 + CNS_fraction;
+ else if (char_I_actual_ppO2 < 200)
+ CNS_fraction = 0.00517 + CNS_fraction;
+ else if (char_I_actual_ppO2 < 230)
+ CNS_fraction = 0.0209 + CNS_fraction;
+ else
+ CNS_fraction = 0.0482 + CNS_fraction; // value for 2.5
+
+ if (CNS_fraction > 2.5)
+ CNS_fraction = 2.5;
+ if (CNS_fraction < 0.0)
+ CNS_fraction = 0.0;
+ char_O_CNS_fraction = (char)((CNS_fraction + 0.005)* 100.0);
+} // void calc_CNS_fraction(void)
+
+// --------------------------
+// calc_CNS_decrease_15min //
+// --------------------------
+// new in v.101
+
+// calculates the half time of 90 minutes in 6 steps of 15 min
+
+// Output: char_O_CNS_fraction
+// Uses and Updates: CNS_fraction
+
+void calc_CNS_decrease_15min(void)
+{
+ CNS_fraction = 0.890899 * CNS_fraction;
+ char_O_CNS_fraction = (char)((CNS_fraction + 0.005)* 100.0);
+}// calc_CNS_decrease_15min(void)
+
+
+// ------------------
+// calc_percentage //
+// ------------------
+// new in v.101
+
+// calculates int_I_temp * char_I_temp / 100
+// output is int_I_temp
+
+void calc_percentage(void)
+{
+ temp1 = (float)int_I_temp;
+ temp2 = (float)char_I_temp / 100.0;
+ temp3 = temp1 * temp2;
+ int_I_temp = (int)temp3;
+}
+void push_tissues_to_vault(void)
+{
+ for (ci=0;ci<32;ci++)
+ pres_tissue_vault[ci] = pres_tissue[ci];
+}
+void pull_tissues_from_vault(void)
+{
+ for (ci=0;ci<32;ci++)
+ pres_tissue[ci] = pres_tissue_vault[ci];
+}
+
+void wp_write_command(void)
+{
+ _asm
+ bcf oled_rs
+ movff wp_command,PORTD
+ bcf oled_rw
+ bsf oled_rw
+ _endasm
+}
+
+void wp_write_data(void)
+{
+ wp_data_8bit_one = wp_data_16bit >> 8;
+ wp_data_8bit_two = wp_data_16bit;
+_asm
+ bsf oled_rs
+ movff wp_data_8bit_one,PORTD
+ bcf oled_rw
+ bsf oled_rw
+ movff wp_data_8bit_two,PORTD
+ bcf oled_rw
+ bsf oled_rw
+_endasm
+}
+
+void wp_write_black(void)
+{
+_asm
+ movff wp_black,PORTD
+ bcf oled_rw
+ bsf oled_rw
+ bcf oled_rw
+ bsf oled_rw
+_endasm
+}
+
+void wp_write_color(void)
+{
+_asm
+ movff wp_color1,PORTD
+ bcf oled_rw
+ bsf oled_rw
+ movff wp_color2,PORTD
+ bcf oled_rw
+ bsf oled_rw
+_endasm
+}
+
+void wp_set_window(void)
+{
+ // x axis start ( 0 - 319)
+ wp_command = 0x35;
+ wp_write_command();
+ wp_data_16bit = ((U16)wp_leftx2) << 1;
+ wp_write_data();
+ // x axis end ( 0 - 319)
+ wp_command = 0x36;
+ wp_write_command();
+ wp_data_16bit = 319;
+ wp_write_data();
+ // y axis start + end ( 0 - 239 )
+ wp_command = 0x37;
+ wp_write_command();
+ // the bottom part
+ wp_data_16bit = wp_top;
+ if(wp_font == 2)
+ wp_data_16bit += WP_FONT_LARGE_HEIGHT;
+ else if(wp_font == 1)
+ wp_data_16bit += WP_FONT_MEDIUM_HEIGHT;
+ else
+ wp_data_16bit += WP_FONT_SMALL_HEIGHT;
+ wp_data_16bit--;
+ if(wp_data_16bit > 239)
+ wp_data_16bit = 239;
+ // the top part
+ wp_data_16bit |= ((U16)wp_top) << 8;
+ // all together in one 16bit transfer
+ wp_write_data();
+
+ // start
+ wp_command = 0x20;
+ wp_write_command();
+ wp_data_16bit = wp_top;
+ wp_write_data();
+
+ wp_command = 0x21;
+ wp_write_command();
+ wp_data_16bit = ((U16)wp_leftx2) << 1;
+ wp_write_data();
+}
+
+void wp_set_char_font_small(void)
+{
+ // space is A1
+ if (wp_char > 0x7E) // skip space between ~ and Ą
+ wp_char -= 34;
+
+ if (wp_char == ' ')
+ wp_char = 0xA1;
+
+ if((wp_char < '!') || (wp_char > 0xA1)) // font has 34 chars after ~ // ū + 4 chars limit to end of battery at the moment
+ wp_char = 0x82; // Ī
+
+ wp_start = wp_small_table[wp_char - '!'];
+ wp_end = wp_small_table[1 + wp_char - '!'];
+}
+
+void wp_set_char_font_medium(void)
+{
+ // space is 3E
+ if (wp_char == 0x27) // 0x27 == '
+ wp_char = 0x3B;
+ if (wp_char == '"')
+ wp_char = 0x3C;
+ if (wp_char == 'm')
+ wp_char = 0x3D;
+ if (wp_char == ' ')
+ wp_char = 0x3E;
+
+ if((wp_char < '.') || (wp_char > 0x3E))
+ wp_char = 0x3E;
+ wp_start = wp_medium_table[wp_char - '.'];
+ wp_end = wp_medium_table[1 + wp_char - '.'];
+}
+
+void wp_set_char_font_large(void)
+{
+ // space is / = 0x2F
+ if (wp_char == ' ')
+ wp_char = 0x2F;
+
+ if((wp_char < '.') || (wp_char > '9'))
+ wp_char = 0x2F;
+ wp_start = wp_large_table[wp_char - '.'];
+ wp_end = wp_large_table[1 + wp_char - '.'];
+}
+
+void wordprocessor(void)
+{
+ wp_set_window();
+
+ // access to GRAM
+ wp_command = 0x22;
+ wp_write_command();
+ _asm
+ bsf oled_rs
+ _endasm
+
+ wp_txtptr = 0;
+ wp_char = wp_stringstore[wp_txtptr];
+
+ while(wp_char)
+ {
+ if(wp_font == 2)
+ wp_set_char_font_large();
+ else if(wp_font == 1)
+ wp_set_char_font_medium();
+ else
+ wp_set_char_font_small();
+
+ wp_black = 0;
+
+ for(wp_i = wp_start; wp_i> 8;
+ if((wp_temp_U8 & 128))
+ {
+ wp_temp_U8 -= 127;
+ if(wp_invert)
+ {
+ while(wp_temp_U8 > 0)
+ {
+ wp_temp_U8--;
+ wp_write_color();
+ }
+ }
+ else
+ {
+ _asm
+ movff wp_black,PORTD
+ _endasm
+ while(wp_temp_U8 > 0)
+ {
+ wp_temp_U8--;
+ _asm
+ bcf oled_rw
+ bsf oled_rw
+ bcf oled_rw
+ bsf oled_rw
+ _endasm
+ }
+ }
+ }
+ else
+ {
+ wp_temp_U8++;
+ if(wp_invert)
+ {
+ _asm
+ movff wp_black,PORTD
+ _endasm
+ while(wp_temp_U8 > 0)
+ {
+ wp_temp_U8--;
+ _asm
+ bcf oled_rw
+ bsf oled_rw
+ bcf oled_rw
+ bsf oled_rw
+ _endasm
+ }
+ }
+ else
+ {
+ while(wp_temp_U8 > 0)
+ {
+ wp_temp_U8--;
+ wp_write_color();
+ }
+ }
+ }
+ }
+ wp_txtptr++;
+ wp_char = wp_stringstore[wp_txtptr];
+ }
+ wp_command = 0x00;
+ wp_write_command();
+ wp_top = 0;
+ wp_leftx2 = 0;
+ wp_font = 0;
+ wp_invert = 0;
+}
+
diff -r 000000000000 -r 96a35aeda5f2 code_part1/OSTC_code_c_part2/p2_deco_main - 090915b.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/code_part1/OSTC_code_c_part2/p2_deco_main - 090915b.c Tue Jan 12 15:05:59 2010 +0100
@@ -0,0 +1,3144 @@
+/*
+ * OSTC - diving computer code
+ * ===========================
+ * PART 2 : C code
+ *
+ * p2_deco_main.c for OSTC Mk.2
+ * Created on: 31.08.2009
+ * Author: christian.w @ heinrichsweikamp.com
+ *
+ * #include
+ * #include "ostc28.drx.txt"
+ * #include "ostc28.tbl.txt"
+ * #include "ostc48.tbl.txt"
+ * #include "ostc48.drx.txt"
+ * #include "ostc90.drx.txt"
+ * #include "ostc90.tbl.txt"
+ */
+
+// Copyright (C) 2009 HeinrichsWeikamp GbR
+
+// 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 3 of the License, or
+// (at your option) any later version.
+
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// 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, see .
+
+
+// *****************************
+// ** I N T R O D U C T I O N **
+// *****************************
+//
+// OSTC
+//
+// code:
+// p2_deco_main_c_v101.c
+// part2 of the OSTC code
+// code with constant O2 partial pressure routines
+// experimental
+//
+// summary:
+// decompression routines
+// and display routines
+// for the OSTC experimental project
+// written by Christian Weikamp
+// last revision __________
+// comments added _________
+//
+// additional files:
+// #include
+// #include "ostc28.drx.txt"
+// #include "ostc28.tbl.txt"
+// #include "ostc48.tbl.txt"
+// #include "ostc48.drx.txt"
+// #include "ostc90.drx.txt"
+// #include "ostc90.tbl.txt"
+// assembler code (PART 1) for working OSTC experimental plattform
+//
+// history:
+// 14/09/09 v201: first alpha candidate for Mk. 2 based on v108 for OSTC
+//
+// literature:
+// B"uhlmann, Albert: Tauchmedizin; 4. Auflage;
+// Schr"oder, Kai & Reith, Steffen; 2000; S"attigungsvorg"ange beim Tauchen, das Modell ZH-L16, Funktionsweise von Tauchcomputern; http://www.achim-und-kai.de/kai/tausim/saett_faq
+// Morrison, Stuart; 2000; DIY DECOMPRESSION; http://www.lizardland.co.uk/DIYDeco.html
+// Balthasar, Steffen; Dekompressionstheorie I: Neo Haldane Modelle; http://www.txfreak.de/dekompressionstheorie_1.pdf
+// Baker, Erik C.; Clearing Up The Confusion About "Deep Stops"
+// Baker, Erik C.; Understanding M-values; http://www.txfreak.de/understanding_m-values.pdf
+
+
+// *********************
+// ** I N C L U D E S **
+// *********************
+ #include
+ #include
+
+// ********************************
+// ** C O N F I G U R A T I O N **
+// ** for simulation without asm **
+// ********************************
+ #pragma config OSC = IRCIO67
+ #pragma config FCMEN = OFF
+ #pragma config IESO = OFF
+ #pragma config PWRT = ON
+ #pragma config BOREN = OFF
+ #pragma config WDT = OFF
+ #pragma config WDTPS = 128
+ #pragma config MCLRE = ON
+ #pragma config LPT1OSC = OFF
+ #pragma config PBADEN = OFF
+ #pragma config DEBUG = OFF
+ #pragma config XINST = OFF
+ #pragma config LVP = OFF
+ #pragma config STVREN = OFF
+
+// ****************************
+// ** D E F I N E S **
+// ** missing in p18f4685.h **
+// ****************************
+#define INT0IF 1
+#define INT1IF 0
+#define TMR1IF 0
+
+
+# define DBG_c_gas 0b0000000000000001
+# define DBG_c_ppO2 0b0000000000000010
+# define DBG_RUN 0b0000000000000100
+# define DBG_RESTART 0b0000000000001000
+
+# define DBG_CdeSAT 0b0000000000010000
+# define DBG_C_MODE 0b0000000000100000
+# define DBG_C_SURF 0b0000000001000000
+# define DBG_HEwoHE 0b0000000010000000
+
+# define DBG_C_DPPO2 0b0000000100000000
+# define DBG_C_DGAS 0b0000001000000000
+# define DBG_C_DIST 0b0000010000000000
+# define DBG_C_LAST 0b0000100000000000
+
+# define DBG_C_GF 0b0001000000000000
+# define DBG_ZH16ERR 0b0010000000000000
+# define DBG_PHIGH 0b0100000000000000
+# define DBG_PLOW 0b1000000000000000
+
+
+# define DBS_mode 0b0000000000000001
+# define DBS_ppO2 0b0000000000000010
+# define DBS_HE_sat 0b0000000000000100
+# define DBS_ppO2chg 0b0000000000001000
+
+# define DBS_SAT2l 0b0000000000010000
+# define DBS_SAT2h 0b0000000000100000
+# define DBS_GFLOW2l 0b0000000001000000
+# define DBS_GFLOW2h 0b0000000010000000
+
+# define DBS_GFHGH2l 0b0000000100000000
+# define DBS_GFHGH2h 0b0000001000000000
+# define DBS_GASO22l 0b0000010000000000
+# define DBS_GASO22h 0b0000100000000000
+
+# define DBS_DIST2h 0b0001000000000000
+# define DBS_LAST2h 0b0010000000000000
+# define DBS_DECOO2l 0b0100000000000000
+# define DBS_DECOO2h 0b1000000000000000
+
+
+# define DBS2_PRES2h 0b0000000000000001
+# define DBS2_PRES2l 0b0000000000000010
+# define DBS2_SURF2l 0b0000000000000100
+# define DBS2_SURF2h 0b0000000000001000
+
+# define DBS2_DESAT2l 0b0000000000010000
+# define DBS2_DESAT2h 0b0000000000100000
+# define DBS2_GFDneg 0b0000000001000000
+# define DBS2_ 0b000000000000000
+
+# define DBS2_ 0b000000000000000
+# define DBS2_ 0b000000000000000
+# define DBS2_ 0b000000000000000
+# define DBS2_ 0b000000000000000
+
+// NDL_at_20mtr
+
+
+
+// ***********************
+// ** V A R I A B L E S **
+// ***********************
+// prefixes etc:
+// _O_ = output for use in the assembler code
+// _I_ = input from the assembler code for the c code
+// char_ and int_ = used to identify output and input size
+// var = variable (from b"uhlmann)
+// pres = pressure
+// gtissue = guiding tissue, the one limiting the ascent
+// e2secs = exp of the b"uhlmann formula precalculated for a 2 second step
+// e1min = same for 1 minute step
+// sim = used in simulating the ascent to the surface
+// nullzeit = remaining ground/bottom time for "no deco"
+// hauptroutine = main
+
+#define WP_FONT_SMALL_HEIGHT 24
+#define WP_FONT_MEDIUM_HEIGHT 32
+#define WP_FONT_LARGE_HEIGHT 58
+
+#define oled_rw PORTA,2,0
+#define oled_rs PORTE,0,0
+
+#define U8 unsigned char
+#define U16 unsigned int
+
+// IO assembler
+#pragma udata bank0a=0x060
+volatile unsigned char wp_stringstore[26];
+volatile U8 wp_color1;
+volatile U8 wp_color2;
+volatile U8 wp_top;
+volatile U8 wp_leftx2;
+volatile U8 wp_font;
+volatile U8 wp_invert;
+volatile U8 wp_temp_U8;
+// internal C
+#pragma udata bank0b=0x081
+volatile U8 wp_txtptr;
+volatile unsigned char wp_char;
+volatile U8 wp_command;
+volatile U16 wp_data_16bit;
+volatile U8 wp_data_8bit_one;
+volatile U8 wp_data_8bit_two;
+volatile U16 wp_start;
+volatile U16 wp_end;
+volatile U16 wp_i;
+volatile U8 wp_black;
+// some spare
+volatile U8 wp_debug_U8;
+
+// asm only
+#pragma udata bank0c=0x0D0
+#define LENGTH_kf_bank0 48
+volatile unsigned char keep_free_bank0[LENGTH_kf_bank0];
+
+
+#pragma udata bank1=0x100
+#define LENGTH_kf_bank1 256
+volatile unsigned char keep_free_bank1[LENGTH_kf_bank1]; // used by the assembler code
+
+ #pragma udata bank2a=0x200
+// output:
+ static unsigned int int_O_tissue_for_debug[32];
+ static unsigned int int_O_GF_spare____; // 0x240
+ static unsigned int int_O_GF_step; // 0x242
+ static unsigned int int_O_gtissue_limit; // 0x244
+ static unsigned int int_O_gtissue_press; // 0x246
+ static unsigned int int_O_limit_GF_low; // 0x248
+ static unsigned int int_O_gtissue_press_at_GF_low; // 0x24A
+// 0x24C + 0x24D noch unbenutzt
+
+ #pragma udata bank2b=0x24E
+ static unsigned char char_O_GF_low_pointer; // 0x24E
+ static unsigned char char_O_actual_pointer; // 0x24F
+ #pragma udata bank2c=0x250
+ static unsigned char char_O_deco_table[32]; // 0x250
+ #pragma udata bank2d=0x270
+ static unsigned char char_I_table_deco_done[32];
+ #pragma udata bank2e=0x290
+ static unsigned int int_O_calc_tissue_call_counter; // 0x290
+// internal:
+ unsigned char lock_GF_depth_list;
+ static float temp_limit;
+ static float GF_low;
+ static float GF_high;
+ static float GF_delta;
+ static float GF_temp;
+ static float GF_step;
+ static float GF_step2;
+ static float temp_pres_gtissue;
+ static float temp_pres_gtissue_diff;
+ static float temp_pres_gtissue_limit_GF_low;
+ static float temp_pres_gtissue_limit_GF_low_below_surface;
+ static unsigned int temp_depth_limit;
+ static unsigned char temp_decotime;
+ static unsigned char temp_gtissue_no;
+ static unsigned int temp_depth_last_deco; // new in v.101
+
+ static unsigned char temp_depth_GF_low_meter;
+ static unsigned char temp_depth_GF_low_number;
+ static unsigned char internal_deco_pointer;
+ static unsigned char internal_deco_table[32];
+ static float temp_pres_deco_GF_low;
+
+static unsigned int debug_temp;
+
+
+#pragma udata bank3a=0x300
+static char output[32];
+
+#pragma udata bank3b=0x380
+volatile float pres_tissue_vault[32];
+
+#pragma udata bank4a=0x400
+// internal:
+ unsigned char ci ; // don't move - used in _asm routines - if moved then modify movlb commands
+ unsigned char x;
+ unsigned int main_i;
+ unsigned int int_temp;
+ unsigned int int_temp_decostatus;
+ static float pres_respiration;
+ static float pres_surface;
+ static float temp1;
+ static float temp2;
+ static float temp3;
+ static float temp4;
+ static float temp_deco;
+ static float temp_atem;
+ static float temp2_atem;
+ static float temp_tissue;
+ static float temp_surface;
+ static float N2_ratio;
+ static float He_ratio;
+ static float temp_ratio;
+ static float var_a;
+ static float var2_a;
+ static float var_b;
+ static float var2_b;
+ static float var_t05nc;
+ static float var2_t05nc;
+ static float var_e2secs;
+ static float var2_e2secs;
+ static float var_e1min;
+ static float var2_e1min;
+ static float var_halftimes;
+ static float var2_halftimes;
+ static float pres_gtissue_limit;
+ static float temp_pres_gtissue_limit;
+ static float actual_ppO2; // new in v.102
+
+ #pragma udata bank4b=0x480
+ static float pres_tissue[32];
+
+ #pragma udata bank5=0x500
+// don't move positions in this bank, the registers are addressed directly from assembler code
+// input:
+ static unsigned int int_I_pres_respiration; // 0x500
+ static unsigned int int_I_pres_surface; // 0x502
+ static unsigned int int_I_temp; // 0x504 new in v101
+ static unsigned char char_I_temp; // 0x506 new in v101
+ static unsigned char char_I_actual_ppO2; // 0x507
+ static unsigned int int_I_spare_3;
+ static unsigned int int_I_spare_4;
+ static unsigned int int_I_spare_5;
+ static unsigned int int_I_spare_6;
+ static unsigned char char_I_N2_ratio; // 0x510
+ static unsigned char char_I_He_ratio; // 0x511
+ static unsigned char char_I_saturation_multiplier; // for conservatism/safety values 1.0 (no conservatism) to 1.5 (50% faster saturation
+ static unsigned char char_I_desaturation_multiplier; // for conservatism/safety values 0.66 (50% slower desaturation) to 1.0 (no conservatism)// consveratism used in calc_tissue(), calc_tissue_step_1_min() and sim_tissue_1min()
+ static unsigned char char_I_GF_High_percentage; // 0x514 new in v.102
+ static unsigned char char_I_GF_Low_percentage; // 0x515 new in v.102
+ static unsigned char char_I_spare; // 0x516
+ static unsigned char char_I_deco_distance; // 0x517
+ static unsigned char char_I_const_ppO2; // 0x518 new in v.101
+ static unsigned char char_I_deco_ppO2_change; // 0x519 new in v.101
+ static unsigned char char_I_deco_ppO2; // 0x51A new in v.101
+ static unsigned char char_I_deco_gas_change; // 0x51B new in v.101
+ static unsigned char char_I_deco_N2_ratio; // 0x51C new in v.101
+ static unsigned char char_I_deco_He_ratio; // 0x51D new in v.101
+ static unsigned char char_I_depth_last_deco; // 0x51E new in v.101 unit: [m]
+ static unsigned char char_I_deco_model; // 0x51F new in v.102 ( 1 = MultiGraF, sonst Std. mit (de-)saturation_multiplier)
+// output:
+ static unsigned int int_O_desaturation_time; // 0x520
+ static unsigned char char_O_nullzeit; // 0x522
+ static unsigned char char_O_deco_status; // 0x523
+ static unsigned char char_O_array_decotime[7]; // 0x524
+ static unsigned char char_O_array_decodepth[6]; // 0x52B
+ static unsigned char char_O_ascenttime; // 0x531
+ static unsigned char char_O_gradient_factor; // 0x532
+ static unsigned char char_O_tissue_saturation[32]; // 0x533
+ static unsigned char char_O_array_gradient_weighted[16]; // 0x553
+ static unsigned char char_O_gtissue_no; // 0x563
+ static unsigned char char_O_diluent; // 0x564 new in v.101
+ static unsigned char char_O_CNS_fraction; // 0x565 new in v.101
+ static unsigned char char_O_relative_gradient_GF; // 0x566 new in v.102
+
+// internal:
+ static float pres_tissue_limit[16];
+ static float sim_pres_tissue_limit[16];
+ static float pres_diluent; // new in v.101
+ static float deco_diluent; // new in v.101
+ static float const_ppO2; // new in v.101
+ static float deco_ppO2_change; // new in v.101
+ static float deco_ppO2; // new in v.101
+
+ #pragma udata bank6=0x600
+// internal:
+ static float sim_pres_tissue[32];
+ static float sim_pres_tissue_backup[32];
+
+ //#pragma udata bank7=0x700
+ //const unsigned char keep_free_bank7[256]; // used by the assembler code
+
+ #pragma udata bank8=0x800
+ static char md_pi_subst[256];
+
+ #pragma udata bank9a=0x900
+// output:
+ static char md_state[48]; // DONT MOVE !! // has to be at the beginning of bank 9 for the asm code!!!
+ #pragma udata bank9b=0x930
+// output:
+ static unsigned int int_O_DBS_bitfield; // 0x930 new in v.108
+ static unsigned int int_O_DBS2_bitfield; // 0x932 new in v.108
+ static unsigned int int_O_DBG_pre_bitfield; // 0x934 new in v.108
+ static unsigned int int_O_DBG_post_bitfield; // 0x936 new in v.108
+ static char char_O_NDL_at_20mtr; // 0x938 new in v.108 // 0xFF == undefined, max. 254
+// internal:
+ static char md_t;
+ static char md_buffer[16];
+ static char md_cksum[16];
+ static char md_i;
+ static char md_j;
+ static char md_temp;
+ static unsigned int md_pointer;
+ static float deco_N2_ratio; // new in v.101
+ static float deco_He_ratio; // new in v.101
+ static float calc_N2_ratio; // new in v.101
+ static float calc_He_ratio; // new in v.101
+ static float deco_gas_change; // new in v.101
+ static float CNS_fraction; // new in v.101
+ static float float_saturation_multiplier; // new in v.101
+ static float float_desaturation_multiplier; // new in v.101
+ static float float_deco_distance; // new in v.101
+// internal, dbg:
+ static unsigned char DBG_char_I_deco_model; // new in v.108
+ static unsigned char DBG_char_I_depth_last_deco; // new in v.108
+ static float DBG_pres_surface; // new in v.108
+ static float DBG_GF_low; // new in v.108
+ static float DBG_GF_high; // new in v.108
+ static float DBG_const_ppO2; // new in v.108
+ static float DBG_deco_ppO2_change; // new in v.108
+ static float DBG_deco_ppO2; // new in v.108
+ static float DBG_deco_N2_ratio; // new in v.108
+ static float DBG_deco_He_ratio; // new in v.108
+ static float DBG_deco_gas_change; // new in v.108
+ static float DBG_float_saturation_multiplier; // new in v.108
+ static float DBG_float_desaturation_multiplier; // new in v.108
+ static float DBG_float_deco_distance; // new in v.108
+ static float DBG_deco_N2_ratio; // new in v.108
+ static float DBG_deco_He_ratio; // new in v.108
+ static float DBG_N2_ratio; // new in v.108
+ static float DBG_He_ratio; // new in v.108
+ static char flag_in_divemode; // new in v.108
+ static int int_dbg_i; // new in v.108
+ unsigned int temp_DBS;
+
+// *************************
+// ** P R O T O T Y P E S **
+// *************************
+void main_calc_hauptroutine(void);
+void main_calc_without_deco(void);
+void main_clear_tissue(void);
+void main_calc_percentage(void);
+void main_calc_wo_deco_step_1_min(void);
+void main_debug(void);
+void main_gradient_array(void);
+void main_hash(void);
+
+void calc_hauptroutine(void);
+void calc_tissue(void);
+void calc_nullzeit(void);
+void backup_sim_pres_tissue(void);
+void restore_sim_pres_tissue(void);
+
+void calc_without_deco(void);
+void clear_tissue(void);
+void calc_ascenttime(void);
+void update_startvalues(void);
+void clear_decoarray(void);
+void update_decoarray(void);
+void sim_tissue_1min(void);
+void sim_tissue_10min(void);
+void calc_gradient_factor(void);
+void calc_gradient_array_only(void);
+void calc_desaturation_time(void);
+void calc_wo_deco_step_1_min(void);
+void calc_tissue_step_1_min(void);
+void hash(void);
+void clear_CNS_fraction(void);
+void calc_CNS_fraction(void);
+void calc_CNS_decrease_15min(void);
+void calc_percentage(void);
+void main(void);
+void calc_hauptroutine_data_input(void);
+void calc_hauptroutine_update_tissues(void);
+void calc_hauptroutine_calc_deco(void);
+void calc_hauptroutine_calc_ascend_to_deco(void);
+void calc_nextdecodepth_GF(void);
+void copy_deco_table_GF(void);
+void clear_internal_deco_table_GF(void);
+void update_internal_deco_table_GF(void);
+void push_tissues_to_vault(void);
+void pull_tissues_from_vault(void);
+void main_push_tissues_to_vault(void);
+void main_pull_tissues_from_vault(void);
+void wordprocessor(void);
+
+// *******************************
+// ** start **
+// ** necessary for compilation **
+// *******************************
+#pragma romdata der_code = 0x0000
+#pragma code der_start = 0x0000
+void der_start(void)
+{
+_asm
+ goto main
+_endasm
+}
+
+// ***********************************
+// ** main code for simulation / **
+// ** tests without assembler code **
+// ** is NOT a part of the OSTC **
+// ***********************************
+#pragma code main = 0x9000
+void main(void)
+{
+ for(wp_temp_U8=0;wp_temp_U8 15) // can't go up to first deco, too deep to calculate in the given time slot
+ {
+ char_O_deco_status = 2;
+// char_O_lock_depth_list = 255;
+ }
+ else
+ {
+// char_O_lock_depth_list = lock_GF_depth_list;
+ calc_hauptroutine_calc_deco();
+ }
+// build_debug_output();
+
+_asm
+nop
+_endasm
+while (char_O_deco_status == 1)
+{
+ char_O_deco_status = 0;
+// char_O_lock_depth_list = 255;
+ calc_hauptroutine_calc_deco();
+// build_debug_output();
+_asm
+nop
+_endasm
+};
+debug_temp = 60; // [mtr Aufstieg in 10 mtr/min (30steps'2sec/min]
+int_I_pres_respiration = 9980;
+for (main_i=0;main_i 15) // can't go up to first deco, too deep to calculate in the given time slot
+ {
+ char_O_deco_status = 2;
+// char_O_lock_depth_list = 255;
+ }
+ else
+ {
+// char_O_lock_depth_list = lock_GF_depth_list;
+ calc_hauptroutine_calc_deco();
+ }
+// build_debug_output();
+
+_asm
+nop
+_endasm
+while (char_O_deco_status == 1)
+{
+ char_O_deco_status = 0;
+// char_O_lock_depth_list = 255;
+ calc_hauptroutine_calc_deco();
+// build_debug_output();
+_asm
+nop
+_endasm
+};
+_asm
+nop
+_endasm
+debug_temp = 60; // [mtr Aufstieg in 10 mtr/min (30steps'2sec/min]
+int_I_pres_respiration = 9980;
+debug_temp = debug_temp * 3;
+for (main_i=0;main_i 1.3)
+ int_O_DBS_bitfield |= DBS_SAT2h;
+ if(GF_low < 0.19)
+ int_O_DBS_bitfield |= DBS_GFLOW2l;
+ if(GF_low > 1.01)
+ int_O_DBS_bitfield |= DBS_GFLOW2h;
+ if(GF_high < 0.6)
+ int_O_DBS_bitfield |= DBS_GFHGH2l;
+ if(GF_high > 1.01)
+ int_O_DBS_bitfield |= DBS_GFHGH2h;
+ if((N2_ratio + He_ratio) > 0.95)
+ int_O_DBS_bitfield |= DBS_GASO22l;
+ if((N2_ratio + He_ratio) < 0.05)
+ int_O_DBS_bitfield |= DBS_GASO22h;
+ if(float_deco_distance > 0.25)
+ int_O_DBS_bitfield |= DBS_DIST2h;
+ if(char_I_depth_last_deco > 8)
+ int_O_DBS_bitfield |= DBS_LAST2h;
+ if(DBG_deco_gas_change && ((deco_N2_ratio + deco_He_ratio) > 0.95))
+ int_O_DBS_bitfield |= DBS_DECOO2l;
+ if(DBG_deco_gas_change && ((deco_N2_ratio + deco_He_ratio) < 0.05))
+ int_O_DBS_bitfield |= DBS_DECOO2h;
+ if(pres_respiration > 3.0)
+ int_O_DBS2_bitfield |= DBS2_PRES2h;
+ if(pres_surface - pres_respiration > 0.2)
+ int_O_DBS2_bitfield |= DBS2_PRES2l;
+ if(pres_surface < 0.75)
+ int_O_DBS2_bitfield |= DBS2_SURF2l;
+ if(pres_surface > 1.11)
+ int_O_DBS2_bitfield |= DBS2_SURF2h;
+ if(float_desaturation_multiplier < 0.70)
+ int_O_DBS2_bitfield |= DBS2_DESAT2l;
+ if(float_desaturation_multiplier > 1.01)
+ int_O_DBS2_bitfield |= DBS2_DESAT2h;
+ if(GF_low > GF_high)
+ int_O_DBS2_bitfield |= DBS2_GFDneg;
+}
+
+// -------------------------------
+// DBG - set DBG to end_of_dive //
+// -------------------------------
+void set_dbg_end_of_dive(void)
+{
+ int_O_DBG_pre_bitfield &= (~DBG_RUN);
+ int_O_DBG_post_bitfield &= (~DBG_RUN);
+}
+
+// -------------------------------
+// DBG - NDL at first 20 m. hit //
+// -------------------------------
+void check_ndl(void)
+{
+ if((char_O_NDL_at_20mtr == -1) && (int_I_pres_respiration > 3000))
+ {
+ char_O_NDL_at_20mtr = char_O_nullzeit;
+ if(char_O_NDL_at_20mtr == 255)
+ char_O_NDL_at_20mtr == 254;
+ }
+}
+
+// -------------------------------
+// DBG - multi main during dive //
+// -------------------------------
+void check_dbg(char is_post_check)
+{
+ temp_DBS = 0;
+ if( (DBG_N2_ratio != N2_ratio) || (DBG_He_ratio != He_ratio) )
+ temp_DBS |= DBG_c_gas;
+ if(DBG_const_ppO2 != const_ppO2)
+ temp_DBS |= DBG_c_ppO2;
+ if((DBG_float_saturation_multiplier != float_saturation_multiplier) || (DBG_float_desaturation_multiplier != float_desaturation_multiplier))
+ temp_DBS |= DBG_CdeSAT;
+ if(DBG_char_I_deco_model != char_I_deco_model)
+ temp_DBS |= DBG_C_MODE;
+ if(DBG_pres_surface != pres_surface)
+ temp_DBS |= DBG_C_SURF;
+ if((!DBS_HE_sat) && (!He_ratio))
+ for(int_dbg_i = 16; int_dbg_i < 32; int_dbg_i++)
+ if(pres_tissue[int_dbg_i])
+ temp_DBS |= DBG_HEwoHE;
+ if(DBG_deco_ppO2 != deco_ppO2)
+ temp_DBS |= DBG_C_DPPO2;
+ if((DBG_deco_gas_change != deco_gas_change) || (DBG_deco_N2_ratio != deco_N2_ratio) || (DBG_deco_He_ratio != deco_He_ratio))
+ temp_DBS |= DBG_C_DGAS;
+ if(DBG_float_deco_distance != float_deco_distance)
+ temp_DBS |= DBG_C_DIST;
+ if(DBG_char_I_depth_last_deco != char_I_depth_last_deco)
+ temp_DBS |= DBG_C_LAST;
+ if((DBG_GF_low != GF_low) || (DBG_GF_high != GF_high))
+ temp_DBS |= DBG_C_GF;
+ if(pres_respiration > 13.0)
+ temp_DBS |= DBG_PHIGH;
+ if(pres_surface - pres_respiration > 0.2)
+ temp_DBS |= DBG_PLOW;
+/*
+ if()
+ temp_DBS |= ;
+ if()
+ temp_DBS |= ;
+ */
+ if(is_post_check)
+ int_O_DBG_post_bitfield |= temp_DBS;
+ else
+ int_O_DBG_pre_bitfield |= temp_DBS;
+}
+
+// -------------------------------
+// DBG - prior to calc. of dive //
+// -------------------------------
+void check_pre_dbg(void)
+{
+ check_dbg(0);
+}
+
+// -------------------------------
+// DBG - after decocalc of dive //
+// -------------------------------
+void check_post_dbg(void)
+{
+ check_dbg(1);
+}
+
+
+
+// -------------------------
+// calc_next_decodepth_GF //
+// -------------------------
+// new in v.102
+void calc_nextdecodepth_GF(void)
+{
+// INPUT, changing during dive:
+// temp_pres_gtissue_limit_GF_low
+// temp_pres_gtissue_limit_GF_low_below_surface
+// temp_pres_gtissue
+// temp_pres_gtissue_diff
+// lock_GF_depth_list
+
+// INPUT, fixed during dive:
+// pres_surface
+// GF_delta
+// GF_high
+// GF_low
+// temp_depth_last_deco
+// float_deco_distance
+
+// OUTPUT
+// GF_step
+// temp_deco
+// temp_depth_limt
+// lock_GF_depth_list
+
+// USES
+// temp1
+// temp2
+// int_temp
+
+ char_I_table_deco_done[0] = 0; // safety if changed somewhere else. Needed for exit
+ if (char_I_deco_model == 1)
+ {
+ if (lock_GF_depth_list == 0)
+ {
+ temp2 = temp_pres_gtissue_limit_GF_low_below_surface / 0.29985; // = ... / 99.95 / 0.003;
+ int_temp = (int) (temp2 + 0.99);
+ if (int_temp > 31)
+ int_temp = 31; // deepest deco at 93 meter (31 deco stops)
+ if (int_temp < 0)
+ int_temp = 0;
+ temp_depth_GF_low_number = int_temp;
+ temp_depth_GF_low_meter = 3 * temp_depth_GF_low_number;
+ temp2 = (float)temp_depth_GF_low_meter * 0.09995;
+ temp_pres_deco_GF_low = temp2 + float_deco_distance + pres_surface;
+ if (temp_depth_GF_low_number == 0)
+ GF_step = 0;
+ else
+ GF_step = GF_delta / (float)temp_depth_GF_low_number;
+ if (GF_step < 0)
+ GF_step = 0;
+ if (GF_step > GF_delta)
+ GF_step = GF_delta;
+ int_O_GF_step = (int)(GF_step * 10000);
+ int_O_limit_GF_low = (int)(temp_pres_deco_GF_low * 1000);
+ int_O_gtissue_press_at_GF_low = (int)(temp_pres_gtissue * 1000);
+ char_O_GF_low_pointer = temp_depth_GF_low_number;
+ lock_GF_depth_list = 1;
+ internal_deco_pointer = 0;
+ }
+ if (internal_deco_pointer == 0) // new run
+ {
+ internal_deco_pointer = temp_depth_GF_low_number;
+ GF_temp = GF_high - ((float)internal_deco_pointer * GF_step);
+ int_temp = char_I_table_deco_done[internal_deco_pointer];
+ output[8] = int_temp;
+ output[9] = 33;
+ }
+ else
+ {
+ int_temp = 1;
+ }
+ while (int_temp == 1)
+ {
+ int_temp = internal_deco_pointer - 1;
+ if (int_temp == 1) // new in v104
+ {
+ temp2 = (float)(temp_depth_last_deco * int_temp) * 0.09995;
+ GF_step2 = GF_step/3.0 * ((float)(6 - temp_depth_last_deco));
+ }
+ else
+ if (int_temp == 0)
+ {
+ temp2 = 0.0;
+ GF_step2 = GF_high - GF_temp;
+ }
+ else
+ {
+ temp2 = (float)(3 *int_temp) * 0.09995;
+ GF_step2 = GF_step;
+ }
+ temp2 = temp2 + pres_surface; // next deco stop to be tested
+ temp1 = ((GF_temp + GF_step2)* temp_pres_gtissue_diff) + temp_pres_gtissue; // upper limit (lowest pressure allowed) // changes GF_step2 in v104
+ if (temp1 > temp2) // check if ascent to next deco stop is ok
+ {
+ int_temp = 0; // no
+ }
+ else
+ {
+ internal_deco_pointer = int_temp;
+ GF_temp = GF_temp + GF_step2; // changed in v104
+ int_temp = char_I_table_deco_done[internal_deco_pointer]; // yes and check for ascent to even next stop if deco_done is set
+ }
+ } // while
+ if (internal_deco_pointer > 0)
+ {
+ temp2 = (float)(0.29985 * internal_deco_pointer);
+ temp_deco = temp2 + float_deco_distance + pres_surface;
+ if (internal_deco_pointer == 1) // new in v104
+ temp_depth_limit = temp_depth_last_deco;
+ else
+ temp_depth_limit = 3 * internal_deco_pointer;
+ if (output[9] == 33)
+ {
+ output[9] = internal_deco_pointer;
+ output[10] = char_I_table_deco_done[internal_deco_pointer];
+ output[12] = output[12] + 1;
+ if (output[12] == 100)
+ output[12] = 0;
+ }
+ }
+ else // if (char_I_deco_model == 1)
+ {
+ temp_deco = pres_surface;
+ temp_depth_limit = 0;
+ }
+ }
+ else
+ {
+ // calc_nextdecodepth - original
+ // optimized in v.101
+ // depth_last_deco included in v.101
+
+ temp1 = temp_pres_gtissue_limit - pres_surface;
+ if (temp1 >= 0)
+ {
+ temp1 = temp1 / 0.29985; // = temp1 / 99.95 / 0.003;
+ temp_depth_limit = (int) (temp1 + 0.99);
+ temp_depth_limit = 3 * temp_depth_limit; // depth for deco [m]
+ if (temp_depth_limit == 0)
+ temp_deco = pres_surface;
+ else
+ {
+ if (temp_depth_limit < temp_depth_last_deco)
+ temp_depth_limit = temp_depth_last_deco;
+ temp1 = (float)temp_depth_limit * 0.09995;
+ temp_deco = temp1 + float_deco_distance + pres_surface; // depth for deco [bar]
+ } // if (temp_depth_limit == 0)
+ } // if (temp1 >= 0)
+ else
+ {
+ temp_deco = pres_surface;
+ temp_depth_limit = 0;
+ } // if (temp1 >= 0)
+ } // calc_nextdecodepth original
+} // calc_nextdecodepth_GF
+
+
+#if 0
+void build_debug_output(void)
+{
+output[0] = 0; // not used in asm PLED output
+output[1] = (int) (GF_low * 100);
+output[2] = (int) (GF_high * 100);
+output[3] = (int) (GF_step * 100);
+output[4] = (int) temp_depth_GF_low_number;
+output[5] = (int) temp_depth_GF_low_meter;
+//output[6]
+output[7] = (int) internal_deco_pointer;
+//output[8] = char_I_table_deco_done[temp_depth_GF_low_number]
+//output[9] = internal_deco_pointer @ new run
+//output[10] = char_I_table_deco_done[internal_deco_pointer] @ new run
+output [11] = (int) (temp_pres_deco_GF_low * 10);
+} // build_debug_output
+#endif
+
+// ---------------------
+// copy_deco_table_GF //
+// ---------------------
+// new in v.102
+void copy_deco_table_GF(void)
+{
+ if (char_I_deco_model == 1)
+ {
+ int_temp = 32;
+ for (ci=0;ci // new table for deco_main_v.101 (var_a modified)
+
+#pragma romdata tables2 = 0x10600
+rom const rom unsigned int md_pi[] =
+{
+ 0x292E, 0x43C9, 0xA2D8, 0x7C01, 0x3D36, 0x54A1, 0xECF0, 0x0613
+ , 0x62A7, 0x05F3, 0xC0C7, 0x738C, 0x9893, 0x2BD9, 0xBC4C, 0x82CA
+ , 0x1E9B, 0x573C, 0xFDD4, 0xE016, 0x6742, 0x6F18, 0x8A17, 0xE512
+ , 0xBE4E, 0xC4D6, 0xDA9E, 0xDE49, 0xA0FB, 0xF58E, 0xBB2F, 0xEE7A
+ , 0xA968, 0x7991, 0x15B2, 0x073F, 0x94C2, 0x1089, 0x0B22, 0x5F21
+ , 0x807F, 0x5D9A, 0x5A90, 0x3227, 0x353E, 0xCCE7, 0xBFF7, 0x9703
+ , 0xFF19, 0x30B3, 0x48A5, 0xB5D1, 0xD75E, 0x922A, 0xAC56, 0xAAC6
+ , 0x4FB8, 0x38D2, 0x96A4, 0x7DB6, 0x76FC, 0x6BE2, 0x9C74, 0x04F1
+ , 0x459D, 0x7059, 0x6471, 0x8720, 0x865B, 0xCF65, 0xE62D, 0xA802
+ , 0x1B60, 0x25AD, 0xAEB0, 0xB9F6, 0x1C46, 0x6169, 0x3440, 0x7E0F
+ , 0x5547, 0xA323, 0xDD51, 0xAF3A, 0xC35C, 0xF9CE, 0xBAC5, 0xEA26
+ , 0x2C53, 0x0D6E, 0x8528, 0x8409, 0xD3DF, 0xCDF4, 0x4181, 0x4D52
+ , 0x6ADC, 0x37C8, 0x6CC1, 0xABFA, 0x24E1, 0x7B08, 0x0CBD, 0xB14A
+ , 0x7888, 0x958B, 0xE363, 0xE86D, 0xE9CB, 0xD5FE, 0x3B00, 0x1D39
+ , 0xF2EF, 0xB70E, 0x6658, 0xD0E4, 0xA677, 0x72F8, 0xEB75, 0x4B0A
+ , 0x3144, 0x50B4, 0x8FED, 0x1F1A, 0xDB99, 0x8D33, 0x9F11, 0x8314
+};
+
+// *********************
+// *********************
+// ** THE SUBROUTINES **
+// *********************
+// *********************
+
+#pragma code subroutines = 0x10700 // can be adapted to fit the romdata tables ahead
+
+
+// ---------------
+// CLEAR tissue //
+// ---------------
+// optimized in v.101 (var_a)
+
+void clear_tissue(void) // preload tissues with standard pressure for the given ambient pressure
+{
+
+ flag_in_divemode = 0;
+ int_O_DBS_bitfield = 0;
+ int_O_DBS2_bitfield = 0;
+ int_O_DBG_pre_bitfield = 0;
+ int_O_DBG_post_bitfield = 0;
+ char_O_NDL_at_20mtr = 255;
+
+_asm
+lfsr 1, 0x300 // C math routines shall use this variable bank
+movlw 0x01
+movwf TBLPTRU,0
+_endasm
+
+// N2_ratio = (float)char_I_N2_ratio; // the 0.0002 of 0.7902 are missing with standard air
+ N2_ratio = 0.7902; // N2_ratio / 100.0;
+ pres_respiration = (float)int_I_pres_respiration / 1000.0;
+for (ci=0;ci<16;ci++) // cycle through the 16 b"uhlmann tissues
+{
+ pres_tissue[ci] = N2_ratio * (pres_respiration - 0.0627) ;
+_asm
+movlw 0x02
+movwf TBLPTRH,0
+movlb 4 // fuer ci
+movf ci,0,1
+addwf ci,0,1
+addwf ci,0,1
+addwf ci,0,1
+addlw 0x80
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var_a+1
+TBLRDPOSTINC
+movff TABLAT,var_a
+TBLRDPOSTINC
+movff TABLAT,var_a+3
+TBLRD
+movff TABLAT,var_a+2
+addlw 0x80
+movwf TBLPTRL,0
+incf TBLPTRH,1,0
+TBLRDPOSTINC
+movff TABLAT,var_b+1
+TBLRDPOSTINC
+movff TABLAT,var_b
+TBLRDPOSTINC
+movff TABLAT,var_b+3
+TBLRD
+movff TABLAT,var_b+2
+_endasm
+
+pres_tissue_limit[ci] = (pres_tissue[ci] - var_a) * var_b ;
+// now update the guiding tissue
+if (pres_tissue_limit[ci] < 0)
+pres_tissue_limit[ci] = 0;
+} // for 0 to 16
+
+for (ci=16;ci<32;ci++) // cycle through the 16 b"uhlmann tissues for Helium
+{
+ pres_tissue[ci] = 0.0;
+} // for
+
+ clear_decoarray();
+ char_O_deco_status = 0;
+ char_O_nullzeit = 0;
+ char_O_ascenttime = 0;
+ char_O_gradient_factor = 0;
+ char_O_relative_gradient_GF = 0;
+} // clear_tissue(void)
+
+
+// --------------------
+// calc_without_deco //
+// fixed N2_ratio ! //
+// --------------------
+// optimized in v.101 (float_..saturation_multiplier)
+
+void calc_without_deco(void)
+{
+_asm
+ lfsr 1, 0x300
+_endasm
+ N2_ratio = 0.7902; // FIXED RATIO !! sum as stated in b"uhlmann
+ pres_respiration = (float)int_I_pres_respiration / 1000.0; // assembler code uses different digit system
+ pres_surface = (float)int_I_pres_surface / 1000.0;
+ temp_atem = N2_ratio * (pres_respiration - 0.0627); // 0.0627 is the extra pressure in the body
+ temp2_atem = 0.0;
+ temp_surface = pres_surface; // the b"uhlmann formula using temp_surface does apply to the pressure without any inert ratio
+ float_desaturation_multiplier = char_I_desaturation_multiplier / 100.0;
+ float_saturation_multiplier = char_I_saturation_multiplier / 100.0;
+
+ calc_tissue(); // update the pressure in the 16 tissues in accordance with the new ambient pressure
+
+ clear_decoarray();
+ char_O_deco_status = 0;
+ char_O_nullzeit = 0;
+ char_O_ascenttime = 0;
+ calc_gradient_factor();
+
+} // calc_without_deco
+
+
+// --------------------
+// calc_hauptroutine //
+// --------------------
+// this is the major code in dive mode
+// calculates:
+// the tissues,
+// the bottom time
+// and simulates the ascend with all deco stops
+
+void calc_hauptroutine(void)
+{
+ calc_hauptroutine_data_input();
+
+ if(!flag_in_divemode)
+ {
+ flag_in_divemode = 1;
+ create_dbs_set_dbg_and_ndl20mtr();
+ }
+ else
+ check_pre_dbg();
+
+ calc_hauptroutine_update_tissues();
+ calc_gradient_factor();
+
+
+ switch (char_O_deco_status) // toggle between calculation for nullzeit (bottom time), deco stops and more deco stops (continue)
+ {
+ case 0:
+ update_startvalues();
+ calc_nullzeit();
+ check_ndl();
+ char_O_deco_status = 255; // calc deco next time
+ break;
+ case 1:
+ if (char_O_deco_status == 3)
+ break;
+ char_O_deco_status = 0;
+// char_O_lock_depth_list = 255;
+ calc_hauptroutine_calc_deco();
+// build_debug_output();
+ break;
+ case 3: // new dive
+ clear_decoarray();
+ clear_internal_deco_table_GF();
+ copy_deco_table_GF();
+ internal_deco_pointer = 0;
+ lock_GF_depth_list = 0;
+ update_startvalues();
+ calc_nextdecodepth_GF();
+ char_O_deco_status = 0;
+ break;
+ default:
+ update_startvalues();
+ clear_decoarray();
+ clear_internal_deco_table_GF();
+ output[6] = 1;
+ calc_hauptroutine_calc_ascend_to_deco();
+ if (char_O_deco_status > 15) // can't go up to first deco, too deep to calculate in the given time slot
+ {
+ char_O_deco_status = 2;
+// char_O_lock_depth_list = 255;
+ }
+ else
+ {
+// char_O_lock_depth_list = lock_GF_depth_list;
+ calc_hauptroutine_calc_deco();
+ }
+// build_debug_output();
+ break;
+ }
+ calc_ascenttime();
+ check_post_dbg();
+}
+
+void calc_hauptroutine_data_input(void)
+{
+ pres_respiration = (float)int_I_pres_respiration / 1000.0;
+ pres_surface = (float)int_I_pres_surface / 1000.0;
+
+ N2_ratio = (float)char_I_N2_ratio / 100.0;; // the 0.0002 of 0.7902 are missing with standard air
+ He_ratio = (float)char_I_He_ratio / 100.0;;
+ deco_N2_ratio = (float)char_I_deco_N2_ratio / 100.0;
+ deco_He_ratio = (float)char_I_deco_He_ratio / 100.0;
+ float_deco_distance = (float)char_I_deco_distance / 100.0;
+ if(char_I_deco_gas_change)
+ {
+ deco_gas_change = (float)char_I_deco_gas_change / 9.995 + pres_surface;
+ deco_gas_change = deco_gas_change + float_deco_distance;
+ }
+ else
+ deco_gas_change = 0;
+ const_ppO2 = (float)char_I_const_ppO2 / 100.0;
+ deco_ppO2_change = (float)char_I_deco_ppO2_change / 99.95 + pres_surface;
+ deco_ppO2_change = deco_ppO2_change + float_deco_distance;
+ deco_ppO2 = (float)char_I_deco_ppO2 / 100.0;
+ float_desaturation_multiplier = char_I_desaturation_multiplier / 100.0;
+ float_saturation_multiplier = char_I_saturation_multiplier / 100.0;
+ GF_low = (float)char_I_GF_Low_percentage / 100.0;
+ GF_high = (float)char_I_GF_High_percentage / 100.0;
+ GF_delta = GF_high - GF_low;
+
+ temp2 = (pres_respiration - pres_surface) / 0.29985;
+ int_temp = (int)(temp2);
+ if (int_temp < 0)
+ int_temp = 0;
+ if (int_temp > 255)
+ int_temp = 255;
+ char_O_actual_pointer = int_temp;
+
+ temp_depth_last_deco = (int)char_I_depth_last_deco;
+}
+
+void calc_hauptroutine_update_tissues(void)
+{
+ int_O_calc_tissue_call_counter = int_O_calc_tissue_call_counter + 1;
+ if (char_I_const_ppO2 == 0) // new in v.101
+ pres_diluent = pres_respiration; // new in v.101
+ else // new in v.101
+ pres_diluent = ((pres_respiration - const_ppO2)/(N2_ratio + He_ratio)); // new in v.101
+ if (pres_diluent > pres_respiration) // new in v.101
+ pres_diluent = pres_respiration; // new in v.101
+ if (pres_diluent > 0.0627) // new in v.101
+ {
+ temp_atem = N2_ratio * (pres_diluent - 0.0627); // changed in v.101
+ temp2_atem = He_ratio * (pres_diluent - 0.0627); // changed in v.101
+ char_O_diluent = (char)(pres_diluent/pres_respiration*100.0);
+ }
+ else // new in v.101
+ {
+ temp_atem = 0.0; // new in v.101
+ temp2_atem = 0.0; // new in v.101
+ char_O_diluent = 0;
+ }
+ temp_surface = pres_surface;
+ calc_tissue();
+ int_O_gtissue_limit = (int)(pres_tissue_limit[char_O_gtissue_no] * 1000);
+ int_O_gtissue_press = (int)((pres_tissue[char_O_gtissue_no] + pres_tissue[char_O_gtissue_no+16]) * 1000);
+ if (char_I_deco_model == 1)
+ {
+ temp1 = temp1 * GF_high;
+ }
+ else
+ {
+ temp1 = temp_surface;
+ }
+ if (pres_gtissue_limit > temp1 && char_O_deco_status == 0) // if guiding tissue can not be exposed to surface pressure immediately
+ {
+ char_O_nullzeit = 0; // deco necessary
+ char_O_deco_status = 255; // calculate deco skip nullzeit calculation
+ }
+} // calc_hauptroutine_update_tissues
+void calc_hauptroutine_calc_deco(void)
+{
+ do
+ {
+ int_temp_decostatus = 0;
+ calc_nextdecodepth_GF();
+ if (temp_depth_limit > 0)
+ {
+ if (char_I_const_ppO2 == 0) // new in v.101
+ {
+ deco_diluent = temp_deco; // new in v.101
+ if (temp_deco > deco_gas_change)
+ {
+ calc_N2_ratio = N2_ratio;
+ calc_He_ratio = He_ratio;
+ }
+ else
+ {
+ calc_N2_ratio = deco_N2_ratio;
+ calc_He_ratio = deco_He_ratio;
+ }
+ }
+ else // new in v.101
+ {
+ calc_N2_ratio = N2_ratio;
+ calc_He_ratio = He_ratio;
+ if (temp_deco > deco_ppO2_change)
+ {
+ deco_diluent = ((temp_deco - const_ppO2)/(N2_ratio + He_ratio)); // new in v.101
+ }
+ else
+ {
+ deco_diluent = ((temp_deco - deco_ppO2)/(N2_ratio + He_ratio)); // new in v.101
+ }
+ }
+ if (deco_diluent > temp_deco) // new in v.101
+ deco_diluent = temp_deco; // new in v.101
+ if (deco_diluent > 0.0627) // new in v.101
+ {
+ temp_atem = calc_N2_ratio * (deco_diluent - 0.0627); // changed in v.101
+ temp2_atem = calc_He_ratio * (deco_diluent - 0.0627); // changed in v.101
+ }
+ else // new in v.101
+ {
+ temp_atem = 0.0; // new in v.101
+ temp2_atem = 0.0; // new in v.101
+ }
+ sim_tissue_1min();
+ update_internal_deco_table_GF();
+ temp_decotime = 1;
+ update_decoarray();
+ char_O_deco_status = char_O_deco_status + 1;
+ if (char_O_deco_status < 16)
+ int_temp_decostatus = 1;
+ }
+ else // if (temp_depth_limit > 0)
+ {
+ char_O_deco_status = 0;
+ }
+ } while (int_temp_decostatus == 1);
+ if (char_O_deco_status > 15)
+ {
+ char_O_deco_status = 1;
+ }
+ else
+ {
+ copy_deco_table_GF();
+ char_O_deco_status = 0;
+ }
+}
+
+void calc_hauptroutine_calc_ascend_to_deco(void)
+{
+ update_startvalues();
+ char_O_deco_status = 0;
+ temp_deco = pres_respiration;
+ lock_GF_depth_list = 1; // new in v.102
+ do // go up to first deco
+ {
+ int_temp_decostatus = 0;
+ temp_deco = temp_deco - 1.0;
+ if ( char_I_deco_model == 1) // new in v.102 , 4 = deep stops
+ temp_limit = temp_pres_gtissue_limit_GF_low;
+ else
+ temp_limit = temp_pres_gtissue_limit;
+ if ((temp_deco > temp_limit) && (temp_deco > pres_surface)) // changes in v.102
+ {
+ lock_GF_depth_list = 0; // new in v.102, distance to first stop > 10 mtr.
+ output[6] = 0;
+ if (char_I_const_ppO2 == 0) // new in v.101 // calculate at half of the ascent
+ {
+ deco_diluent = temp_deco + 0.5; // new in v.101
+ if (temp_deco + 0.5 > deco_gas_change)
+ {
+ calc_N2_ratio = N2_ratio;
+ calc_He_ratio = He_ratio;
+ }
+ else
+ {
+ calc_N2_ratio = deco_N2_ratio;
+ calc_He_ratio = deco_He_ratio;
+ }
+ }
+ else // new in v.101
+ {
+ calc_N2_ratio = N2_ratio;
+ calc_He_ratio = He_ratio;
+ if (temp_deco + 0.5 > deco_ppO2_change)
+ deco_diluent = ((temp_deco + 0.5 - const_ppO2)/(N2_ratio + He_ratio)); // new in v.101 // calculate at half of the ascent
+ else
+ deco_diluent = ((temp_deco + 0.5 - deco_ppO2)/(N2_ratio + He_ratio)); // new in v.101 // calculate at half of the ascent
+ if (deco_diluent > (temp_deco +0.5)) // new in v.101
+ deco_diluent = temp_deco + 0.5; // new in v.101 // calculate at half of the ascent
+ }
+ if (deco_diluent > 0.0627) // new in v.101
+ {
+ temp_atem = calc_N2_ratio * (deco_diluent - 0.0627); // changed in v.101
+ temp2_atem = calc_He_ratio * (deco_diluent - 0.0627); // changed in v.101
+ }
+ else // new in v.101
+ {
+ temp_atem = 0.0; // new in v.101
+ temp2_atem = 0.0; // new in v.101
+ }
+ sim_tissue_1min();
+ char_O_deco_status = char_O_deco_status + 1;
+ if (char_O_deco_status < 16) // 16 is the limit of calculations for one time slot
+ int_temp_decostatus = 1;
+ }
+ } while (int_temp_decostatus == 1);
+} // calc_hauptroutine_calc_ascend_to_deco
+
+// --------------
+// calc_tissue //
+// --------------
+// optimized in v.101
+
+void calc_tissue(void)
+{
+_asm
+lfsr 1, 0x300
+movlw 0x01
+movwf TBLPTRU,0
+_endasm
+
+ char_O_gtissue_no = 255;
+ pres_gtissue_limit = 0.0;
+
+for (ci=0;ci<16;ci++)
+{
+_asm
+movlw 0x02
+movwf TBLPTRH,0
+movlb 4 // fuer ci
+movf ci,0,1
+addwf ci,0,1
+addwf ci,0,1
+addwf ci,0,1
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var_e2secs+1 // the order is confussing
+TBLRDPOSTINC
+movff TABLAT,var_e2secs // low byte first, high afterwards
+TBLRDPOSTINC
+movff TABLAT,var_e2secs+3
+TBLRD
+movff TABLAT,var_e2secs+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var2_e2secs+1
+TBLRDPOSTINC
+movff TABLAT,var2_e2secs
+TBLRDPOSTINC
+movff TABLAT,var2_e2secs+3
+TBLRD
+movff TABLAT,var2_e2secs+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var_a+1
+TBLRDPOSTINC
+movff TABLAT,var_a
+TBLRDPOSTINC
+movff TABLAT,var_a+3
+TBLRD
+movff TABLAT,var_a+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var2_a+1
+TBLRDPOSTINC
+movff TABLAT,var2_a
+TBLRDPOSTINC
+movff TABLAT,var2_a+3
+TBLRD
+movff TABLAT,var2_a+2
+addlw 0x40
+movwf TBLPTRL,0
+incf TBLPTRH,1,0
+TBLRDPOSTINC
+movff TABLAT,var_b+1
+TBLRDPOSTINC
+movff TABLAT,var_b
+TBLRDPOSTINC
+movff TABLAT,var_b+3
+TBLRD
+movff TABLAT,var_b+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var2_b+1
+TBLRDPOSTINC
+movff TABLAT,var2_b
+TBLRDPOSTINC
+movff TABLAT,var2_b+3
+TBLRD
+movff TABLAT,var2_b+2
+_endasm
+ // the start values are the previous end values // write new values in temp
+
+ if( (var_e2secs < 0.0000363)
+ || (var_e2secs > 0.00577)
+ || (var2_e2secs < 0.0000961)
+ || (var2_e2secs > 0.150)
+ || (var_a < 0.231)
+ || (var_a > 1.27)
+ || (var_b < 0.504)
+ || (var_b > 0.966)
+ || (var2_a < 0.510)
+ || (var2_a > 1.75)
+ || (var2_b < 0.423)
+ || (var2_b > 0.927)
+ )
+ int_O_DBG_pre_bitfield |= DBG_ZH16ERR;
+
+// N2
+ temp_tissue = (temp_atem - pres_tissue[ci]) * var_e2secs;
+ temp_tissue_safety();
+ pres_tissue[ci] = pres_tissue[ci] + temp_tissue;
+
+// He
+ temp_tissue = (temp2_atem - pres_tissue[ci+16]) * var2_e2secs;
+ temp_tissue_safety();
+ pres_tissue[ci+16] = pres_tissue[ci+16] + temp_tissue;
+
+ temp_tissue = pres_tissue[ci] + pres_tissue[ci+16];
+
+ var_a = (var_a * pres_tissue[ci] + var2_a * pres_tissue[ci+16]) / temp_tissue;
+ var_b = (var_b * pres_tissue[ci] + var2_b * pres_tissue[ci+16]) / temp_tissue;
+ pres_tissue_limit[ci] = (temp_tissue - var_a) * var_b;
+ if (pres_tissue_limit[ci] < 0)
+ pres_tissue_limit[ci] = 0;
+ if (pres_tissue_limit[ci] > pres_gtissue_limit)
+ {
+ pres_gtissue_limit = pres_tissue_limit[ci];
+ char_O_gtissue_no = ci;
+ }//if
+} // for
+}//calc_tissue(void)
+
+// ----------------
+// calc_nullzeit //
+// ----------------
+// calculates the remaining bottom time
+
+// unchanged in v.101
+
+void calc_nullzeit(void)
+{
+ char_O_nullzeit = 0;
+ int_temp = 1;
+ do
+ {
+ backup_sim_pres_tissue();
+ sim_tissue_10min();
+ char_O_nullzeit = char_O_nullzeit + 10;
+ int_temp = int_temp + 1;
+ if (char_I_deco_model == 1)
+ temp1 = GF_high * temp_pres_gtissue_diff + temp_pres_gtissue;
+ else
+ temp1 = temp_pres_gtissue_limit;
+ if (temp1 > temp_surface) // changed in v.102 , if guiding tissue can not be exposed to surface pressure immediately
+ int_temp = 255;
+ } while (int_temp < 17);
+ if (int_temp == 255)
+ {
+ restore_sim_pres_tissue();
+ char_O_nullzeit = char_O_nullzeit - 10;
+ } //if int_temp == 255]
+ int_temp = 1;
+ if (char_O_nullzeit < 60)
+ {
+ do
+ {
+ sim_tissue_1min();
+ char_O_nullzeit = char_O_nullzeit + 1;
+ int_temp = int_temp + 1; // new in v.102a
+ if (char_I_deco_model == 1)
+ temp1 = GF_high * temp_pres_gtissue_diff + temp_pres_gtissue;
+ else
+ temp1 = temp_pres_gtissue_limit;
+ if (temp1 > temp_surface) // changed in v.102 , if guiding tissue can not be exposed to surface pressure immediately
+ int_temp = 255;
+ } while (int_temp < 10);
+ if (int_temp == 255)
+ char_O_nullzeit = char_O_nullzeit - 1;
+ } // if char_O_nullzeit < 60
+} //calc_nullzeit
+
+// -------------------------
+// backup_sim_pres_tissue //
+// -------------------------
+void backup_sim_pres_tissue(void)
+{
+ for (x = 0;x<16;x++)
+ {
+ sim_pres_tissue_backup[x] = sim_pres_tissue[x];
+ sim_pres_tissue_backup[x+16] = sim_pres_tissue[x+16];
+ }
+} // backup_sim
+
+// --------------------------
+// restore_sim_pres_tissue //
+// --------------------------
+void restore_sim_pres_tissue(void)
+{
+ for (x = 0;x<16;x++)
+ {
+ sim_pres_tissue[x] = sim_pres_tissue_backup[x];
+ sim_pres_tissue[x+16] = sim_pres_tissue_backup[x+16];
+ }
+} // restore_sim
+
+// ------------------
+// calc_ascenttime //
+// ------------------
+
+void calc_ascenttime(void)
+{
+if (pres_respiration > pres_surface)
+ {
+ switch (char_O_deco_status)
+ {
+ case 2:
+ char_O_ascenttime = 255;
+ break;
+ case 1:
+ break;
+ default:
+ temp1 = pres_respiration - pres_surface + 0.6; // + 0.6 hence 1 minute ascent time from a depth of 4 meter on
+ if (temp1 < 0)
+ temp1 = 0;
+ if (temp1 > 255)
+ temp1 = 255;
+ char_O_ascenttime = (char)temp1;
+
+ for(ci=0;ci<7;ci++)
+ {
+ x = char_O_ascenttime + char_O_array_decotime[ci];
+ if (x < char_O_ascenttime)
+ char_O_ascenttime = 255;
+ else
+ char_O_ascenttime = x;
+ }
+ }
+ }
+else
+ char_O_ascenttime = 0;
+} // calc_ascenttime()
+
+
+// ---------------------
+// update_startvalues //
+// ---------------------
+// updated in v.102
+
+void update_startvalues(void)
+{
+ temp_pres_gtissue_limit = pres_gtissue_limit;
+ temp_pres_gtissue = pres_tissue[char_O_gtissue_no] + pres_tissue[char_O_gtissue_no+16];
+ temp_pres_gtissue_diff = temp_pres_gtissue_limit - temp_pres_gtissue; // negative number
+ temp_pres_gtissue_limit_GF_low = GF_low * temp_pres_gtissue_diff + temp_pres_gtissue;
+ temp_pres_gtissue_limit_GF_low_below_surface = temp_pres_gtissue_limit_GF_low - pres_surface;
+ if (temp_pres_gtissue_limit_GF_low_below_surface < 0)
+ temp_pres_gtissue_limit_GF_low_below_surface = 0;
+
+ temp_gtissue_no = char_O_gtissue_no;
+ for (x = 0;x<16;x++)
+ {
+ sim_pres_tissue[x] = pres_tissue[x];
+ sim_pres_tissue[x+16] = pres_tissue[x+16];
+ sim_pres_tissue_limit[x] = pres_tissue_limit[x];
+ }
+} // update_startvalues
+
+
+// ------------------
+// sim_tissue_1min //
+// ------------------
+// optimized in v.101
+
+void sim_tissue_1min(void)
+{
+temp_pres_gtissue_limit = 0.0;
+temp_gtissue_no = 255;
+
+_asm
+lfsr 1, 0x300
+movlw 0x01
+movwf TBLPTRU,0
+_endasm
+
+
+for (ci=0;ci<16;ci++)
+{
+_asm
+movlw 0x02
+movwf TBLPTRH,0
+movlb 4 // fuer ci
+movf ci,0,1
+addwf ci,0,1
+addwf ci,0,1
+addwf ci,0,1
+addlw 0x80
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var_a+1
+TBLRDPOSTINC
+movff TABLAT,var_a
+TBLRDPOSTINC
+movff TABLAT,var_a+3
+TBLRD
+movff TABLAT,var_a+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var2_a+1
+TBLRDPOSTINC
+movff TABLAT,var2_a
+TBLRDPOSTINC
+movff TABLAT,var2_a+3
+TBLRD
+movff TABLAT,var2_a+2
+addlw 0x40
+movwf TBLPTRL,0
+incf TBLPTRH,1,0
+TBLRDPOSTINC
+movff TABLAT,var_b+1
+TBLRDPOSTINC
+movff TABLAT,var_b
+TBLRDPOSTINC
+movff TABLAT,var_b+3
+TBLRD
+movff TABLAT,var_b+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var2_b+1
+TBLRDPOSTINC
+movff TABLAT,var2_b
+TBLRDPOSTINC
+movff TABLAT,var2_b+3
+TBLRD
+movff TABLAT,var2_b+2
+addlw 0xC0
+movwf TBLPTRL,0
+incf TBLPTRH,1,0
+TBLRDPOSTINC
+movff TABLAT,var_e1min+1
+TBLRDPOSTINC
+movff TABLAT,var_e1min
+TBLRDPOSTINC
+movff TABLAT,var_e1min+3
+TBLRD
+movff TABLAT,var_e1min+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var2_e1min+1
+TBLRDPOSTINC
+movff TABLAT,var2_e1min
+TBLRDPOSTINC
+movff TABLAT,var2_e1min+3
+TBLRD
+movff TABLAT,var2_e1min+2
+_endasm
+// N2
+ temp_tissue = (temp_atem - sim_pres_tissue[ci]) * var_e1min;
+ temp_tissue_safety();
+ sim_pres_tissue[ci] = sim_pres_tissue[ci] + temp_tissue;
+// He
+ temp_tissue = (temp2_atem - sim_pres_tissue[ci+16]) * var2_e1min;
+ temp_tissue_safety();
+ sim_pres_tissue[ci+16] = sim_pres_tissue[ci+16] + temp_tissue;
+// pressure limit
+ temp_tissue = sim_pres_tissue[ci] + sim_pres_tissue[ci+16];
+ var_a = (var_a * sim_pres_tissue[ci] + var2_a * sim_pres_tissue[ci+16]) / temp_tissue;
+ var_b = (var_b * sim_pres_tissue[ci] + var2_b * sim_pres_tissue[ci+16]) / temp_tissue;
+ sim_pres_tissue_limit[ci] = (temp_tissue - var_a) * var_b;
+
+ if (sim_pres_tissue_limit[ci] < 0)
+ sim_pres_tissue_limit[ci] = 0;
+ if (sim_pres_tissue_limit[ci] > temp_pres_gtissue_limit)
+ {
+ temp_pres_gtissue = temp_tissue;
+ temp_pres_gtissue_limit = sim_pres_tissue_limit[ci];
+ temp_gtissue_no = ci;
+ }
+} // for
+ temp_pres_gtissue_diff = temp_pres_gtissue_limit - temp_pres_gtissue;
+ temp_pres_gtissue_limit_GF_low = GF_low * temp_pres_gtissue_diff + temp_pres_gtissue;
+ temp_pres_gtissue_limit_GF_low_below_surface = temp_pres_gtissue_limit_GF_low - pres_surface;
+ if (temp_pres_gtissue_limit_GF_low_below_surface < 0)
+ temp_pres_gtissue_limit_GF_low_below_surface = 0;
+} //sim_tissue_1min()
+
+//--------------------
+// sim_tissue_10min //
+//--------------------
+
+// Attention!! uses var_e1min und var2_e1min to load 10min data !!!
+// is identical to sim_tissue_1min routine except for the different load of those variables
+
+// optimized in v.101
+
+void sim_tissue_10min(void)
+{
+temp_pres_gtissue_limit = 0.0;
+temp_gtissue_no = 255;
+
+_asm
+lfsr 1, 0x300
+movlw 0x01
+movwf TBLPTRU,0
+_endasm
+
+for (ci=0;ci<16;ci++)
+{
+_asm
+movlw 0x02
+movwf TBLPTRH,0
+movlb 4 // fuer ci
+movf ci,0,1
+addwf ci,0,1
+addwf ci,0,1
+addwf ci,0,1
+addlw 0x80
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var_a+1
+TBLRDPOSTINC
+movff TABLAT,var_a
+TBLRDPOSTINC
+movff TABLAT,var_a+3
+TBLRD
+movff TABLAT,var_a+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var2_a+1
+TBLRDPOSTINC
+movff TABLAT,var2_a
+TBLRDPOSTINC
+movff TABLAT,var2_a+3
+TBLRD
+movff TABLAT,var2_a+2
+addlw 0x40
+movwf TBLPTRL,0
+incf TBLPTRH,1,0
+TBLRDPOSTINC
+movff TABLAT,var_b+1
+TBLRDPOSTINC
+movff TABLAT,var_b
+TBLRDPOSTINC
+movff TABLAT,var_b+3
+TBLRD
+movff TABLAT,var_b+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var2_b+1
+TBLRDPOSTINC
+movff TABLAT,var2_b
+TBLRDPOSTINC
+movff TABLAT,var2_b+3
+TBLRD
+movff TABLAT,var2_b+2
+addlw 0xC0 // different to 1 min
+movwf TBLPTRL,0
+incf TBLPTRH,1,0
+incf TBLPTRH,1,0 // different to 1 min
+TBLRDPOSTINC
+movff TABLAT,var_e1min+1
+TBLRDPOSTINC
+movff TABLAT,var_e1min
+TBLRDPOSTINC
+movff TABLAT,var_e1min+3
+TBLRD
+movff TABLAT,var_e1min+2
+addlw 0x40
+movwf TBLPTRL,0
+//incf TBLPTRH,1,0 // different to 1 min
+TBLRDPOSTINC
+movff TABLAT,var2_e1min+1
+TBLRDPOSTINC
+movff TABLAT,var2_e1min
+TBLRDPOSTINC
+movff TABLAT,var2_e1min+3
+TBLRD
+movff TABLAT,var2_e1min+2
+_endasm
+// N2
+ temp_tissue = (temp_atem - sim_pres_tissue[ci]) * var_e1min;
+ temp_tissue_safety();
+ sim_pres_tissue[ci] = sim_pres_tissue[ci] + temp_tissue;
+// He
+ temp_tissue = (temp2_atem - sim_pres_tissue[ci+16]) * var2_e1min;
+ temp_tissue_safety();
+ sim_pres_tissue[ci+16] = sim_pres_tissue[ci+16] + temp_tissue;
+// pressure limit
+temp_tissue = sim_pres_tissue[ci] + sim_pres_tissue[ci+16];
+ var_a = (var_a * sim_pres_tissue[ci] + var2_a * sim_pres_tissue[ci+16]) / temp_tissue;
+ var_b = (var_b * sim_pres_tissue[ci] + var2_b * sim_pres_tissue[ci+16]) / temp_tissue;
+
+sim_pres_tissue_limit[ci] = (temp_tissue - var_a) * var_b;
+ if (sim_pres_tissue_limit[ci] < 0)
+ sim_pres_tissue_limit[ci] = 0;
+ if (sim_pres_tissue_limit[ci] > temp_pres_gtissue_limit)
+ {
+ temp_pres_gtissue = temp_tissue;
+ temp_pres_gtissue_limit = sim_pres_tissue_limit[ci];
+ temp_gtissue_no = ci;
+ }
+} // for
+ temp_pres_gtissue_diff = temp_pres_gtissue_limit - temp_pres_gtissue; // negative number
+ temp_pres_gtissue_limit_GF_low = GF_low * temp_pres_gtissue_diff + temp_pres_gtissue;
+ temp_pres_gtissue_limit_GF_low_below_surface = temp_pres_gtissue_limit_GF_low - pres_surface;
+ if (temp_pres_gtissue_limit_GF_low_below_surface < 0)
+ temp_pres_gtissue_limit_GF_low_below_surface = 0;
+} //sim_tissue_10min()
+
+
+// ------------------
+// clear_decoarray //
+// ------------------
+// unchanged in v.101
+
+void clear_decoarray(void)
+{
+char_O_array_decodepth[0] = 0;
+char_O_array_decodepth[1] = 0;
+char_O_array_decodepth[2] = 0;
+char_O_array_decodepth[3] = 0;
+char_O_array_decodepth[4] = 0;
+char_O_array_decodepth[5] = 0;
+char_O_array_decotime[0] = 0;
+char_O_array_decotime[1] = 0;
+char_O_array_decotime[2] = 0;
+char_O_array_decotime[3] = 0;
+char_O_array_decotime[4] = 0;
+char_O_array_decotime[5] = 0;
+char_O_array_decotime[6] = 0;
+} // clear_decoarray
+
+
+// -------------------
+// update_decoarray //
+// -------------------
+// unchanged in v.101
+
+void update_decoarray()
+{
+ x = 0;
+ do
+ {
+ if (char_O_array_decodepth[x] == temp_depth_limit)
+ {
+ int_temp = char_O_array_decotime[x] + temp_decotime;
+ if (int_temp < 0)
+ int_temp = 0;
+ if (int_temp > 240)
+ int_temp = 240;
+ char_O_array_decotime[x] = int_temp;
+ x = 10; // exit
+ } // if
+ else
+ {
+ if (char_O_array_decodepth[x] == 0)
+ {
+ if (temp_depth_limit > 255)
+ char_O_array_decodepth[x] = 255;
+ else
+ char_O_array_decodepth[x] = (char)temp_depth_limit;
+ int_temp = char_O_array_decotime[x] + temp_decotime;
+ if (int_temp > 240)
+ char_O_array_decotime[x] = 240;
+ else
+ char_O_array_decotime[x] = (char)int_temp;
+ x = 10; // exit
+ } // if
+ else
+ x++;
+ } // else
+ } while (x<6);
+ if (x == 6)
+ {
+ int_temp = char_O_array_decotime[6] + temp_decotime;
+ if (int_temp > 220)
+ char_O_array_decotime[6] = 220;
+ else
+ char_O_array_decotime[6] = (char)int_temp;
+ } // if x == 6
+} // update_decoarray
+
+
+// -----------------------
+// calc_gradient_factor //
+// -----------------------
+// optimized in v.101 (var_a)
+// new code in v.102
+
+void calc_gradient_factor(void)
+{
+ // tissue > respiration (entsaettigungsvorgang)
+ // gradient ist wieviel prozent an limit mit basis tissue
+ // dh. 0% = respiration == tissue
+ // dh. 100% = respiration == limit
+ temp_tissue = pres_tissue[char_O_gtissue_no] + pres_tissue[char_O_gtissue_no+16];
+ temp1 = temp_tissue - pres_respiration;
+ temp2 = temp_tissue - pres_tissue_limit[char_O_gtissue_no]; // changed in v.102
+ temp2 = temp1/temp2;
+ temp2 = temp2 * 100; // displayed in percent
+ if (temp2 < 0)
+ temp2 = 0;
+ if (temp2 > 255)
+ temp2 = 255;
+ if (temp1 < 0)
+ char_O_gradient_factor = 0;
+ else
+ char_O_gradient_factor = (char)temp2;
+
+ temp3 = temp2;
+
+ if (char_I_deco_model == 1) // calculate relative gradient factor
+ {
+ temp1 = (float)temp_depth_GF_low_meter * 0.09995;
+ temp2 = pres_respiration - pres_surface;
+ if (temp2 <= 0)
+ temp1 = GF_high;
+ else
+ if (temp2 >= temp1)
+ temp1 = GF_low;
+ else
+ temp1 = GF_low + (temp1 - temp2)/temp1*GF_delta;
+ if (temp_depth_GF_low_meter == 0)
+ temp1 = GF_high;
+ temp2 = temp3 / temp1; // temp3 is already in percent
+ if (temp2 < 0)
+ temp2 = 0;
+ if (temp2 > 255)
+ temp2 = 255;
+ char_O_relative_gradient_GF = (char)temp2;
+ } // calc relative gradient factor
+ else
+ {
+ char_O_relative_gradient_GF = char_O_gradient_factor;
+ }
+} // calc_gradient
+
+// ---------------------------
+// calc_gradient_array_only //
+// ---------------------------
+// optimized in v.101 (var_a)
+// new code in v.102
+
+void calc_gradient_array_only()
+{
+ pres_respiration = (float)int_I_pres_respiration / 1000.0; // assembler code uses different digit system
+for (ci=0;ci<16;ci++)
+{
+ temp_tissue = pres_tissue[ci] + pres_tissue[ci+16];
+ temp1 = temp_tissue - pres_respiration;
+ temp2 = temp_tissue - pres_tissue_limit[ci];
+ temp2 = temp1/temp2;
+ temp2 = temp2 * 200; // because of output in (Double-)percentage
+ if (temp2 < 0)
+ temp2 = 0;
+ if (temp2 > 255)
+ temp2 = 255;
+ if (temp1 < 0)
+ char_O_array_gradient_weighted[ci] = 0;
+ else
+ char_O_array_gradient_weighted[ci] = (char)temp2;
+} // for
+} // calc_gradient_array_only
+
+
+// -------------------------
+// calc_desaturation_time //
+// -------------------------
+// FIXED N2_ratio
+// unchanged in v.101
+
+void calc_desaturation_time(void)
+{
+_asm
+lfsr 1, 0x300
+movlw 0x01
+movwf TBLPTRU,0
+_endasm
+ N2_ratio = 0.7902; // FIXED sum as stated in b"uhlmann
+ pres_surface = (float)int_I_pres_surface / 1000.0;
+ temp_atem = N2_ratio * (pres_surface - 0.0627);
+ int_O_desaturation_time = 0;
+ float_desaturation_multiplier = char_I_desaturation_multiplier / 142.0; // new in v.101 (70,42%/100.=142)
+
+for (ci=0;ci<16;ci++)
+{
+_asm
+movlw 0x04
+movwf TBLPTRH,0
+movlb 4 // fuer ci
+movf ci,0,1
+addwf ci,0,1
+addwf ci,0,1
+addwf ci,0,1
+addlw 0x80
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var_halftimes+1
+TBLRDPOSTINC
+movff TABLAT,var_halftimes
+TBLRDPOSTINC
+movff TABLAT,var_halftimes+3
+TBLRD
+movff TABLAT,var_halftimes+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var2_halftimes+1
+TBLRDPOSTINC
+movff TABLAT,var2_halftimes
+TBLRDPOSTINC
+movff TABLAT,var2_halftimes+3
+TBLRD
+movff TABLAT,var2_halftimes+2
+_endasm
+
+// saturation_time (for flight) and N2_saturation in multiples of halftime
+// version v.100: 1.1 = 10 percent distance to totally clean (totally clean is not possible, would take infinite time )
+// new in version v.101: 1.07 = 7 percent distance to totally clean (totally clean is not possible, would take infinite time )
+// changes in v.101: 1.05 = 5 percent dist to totally clean is new desaturation point for display and noFly calculations
+// N2
+ temp1 = 1.05 * temp_atem;
+ temp1 = temp1 - pres_tissue[ci];
+ temp2 = temp_atem - pres_tissue[ci];
+ if (temp2 >= 0.0)
+ {
+ temp1 = 0;
+ temp2 = 0;
+ }
+ else
+ temp1 = temp1 / temp2;
+ if (temp1 > 0.0)
+ {
+ temp1 = log(1.0 - temp1);
+ temp1 = temp1 / -0.6931; // temp1 is the multiples of half times necessary.
+ // 0.6931 is ln(2), because the math function log() calculates with a base of e not 2 as requested.
+ // minus because log is negative
+ temp2 = var_halftimes * temp1 / float_desaturation_multiplier; // time necessary (in minutes ) for complete desaturation (see comment about 10 percent) , new in v.101: float_desaturation_multiplier
+ }
+ else
+ {
+ temp1 = 0;
+ temp2 = 0;
+ }
+
+// He
+ temp3 = 0.1 - pres_tissue[ci+16];
+if (temp3 >= 0.0)
+ {
+ temp3 = 0;
+ temp4 = 0;
+ }
+ else
+ temp3 = -1.0 * temp3 / pres_tissue[ci+16];
+ if (temp3 > 0.0)
+ {
+ temp3 = log(1.0 - temp3);
+ temp3 = temp3 / -0.6931; // temp1 is the multiples of half times necessary.
+ // 0.6931 is ln(2), because the math function log() calculates with a base of e not 2 as requested.
+ // minus because log is negative
+ temp4 = var2_halftimes * temp3 / float_desaturation_multiplier; // time necessary (in minutes ) for "complete" desaturation, new in v.101 float_desaturation_multiplier
+ }
+ else
+ {
+ temp3 = 0;
+ temp4 = 0;
+ }
+
+// saturation_time (for flight)
+ if (temp4 > temp2)
+ int_temp = (int)temp4;
+ else
+ int_temp = (int)temp2;
+ if(int_temp > int_O_desaturation_time)
+ int_O_desaturation_time = int_temp;
+
+// N2 saturation in multiples of halftime for display purposes
+ temp2 = temp1 * 20.0; // 0 = 1/8, 120 = 0, 249 = 8
+ temp2 = temp2 + 80.0; // set center
+ if (temp2 < 0.0)
+ temp2 = 0.0;
+ if (temp2 > 255.0)
+ temp2 = 255.0;
+ char_O_tissue_saturation[ci] = (char)temp2;
+// He saturation in multiples of halftime for display purposes
+ temp4 = temp3 * 20.0; // 0 = 1/8, 120 = 0, 249 = 8
+ temp4 = temp4 + 80.0; // set center
+ if (temp4 < 0.0)
+ temp4 = 0.0;
+ if (temp4 > 255.0)
+ temp4 = 255.0;
+ char_O_tissue_saturation[ci+16] = (char)temp4;
+} // for
+} // calc_desaturation_time
+
+
+// --------------------------
+// calc_wo_deco_step_1_min //
+// --------------------------
+// FIXED N2 Ratio
+// optimized in v.101 (...saturation_multiplier)
+// desaturation slowed down to 70,42%
+
+void calc_wo_deco_step_1_min(void)
+{
+ if(flag_in_divemode)
+ {
+ flag_in_divemode = 0;
+ set_dbg_end_of_dive();
+ }
+_asm
+ lfsr 1, 0x300
+_endasm
+ N2_ratio = 0.7902; // FIXED, sum lt. buehlmann
+ pres_respiration = (float)int_I_pres_respiration / 1000.0; // assembler code uses different digit system
+ pres_surface = (float)int_I_pres_surface / 1000.0;
+ temp_atem = N2_ratio * (pres_respiration - 0.0627); // 0.0627 is the extra pressure in the body
+ temp2_atem = 0.0;
+ temp_surface = pres_surface; // the b"uhlmann formula using temp_surface does not use the N2_ratio
+ float_desaturation_multiplier = char_I_desaturation_multiplier / 142.0; // new in v.101 (70,42%/100.=142)
+ float_saturation_multiplier = char_I_saturation_multiplier / 100.0;
+
+ calc_tissue_step_1_min(); // update the pressure in the 16 tissues in accordance with the new ambient pressure
+ clear_decoarray();
+ char_O_deco_status = 0;
+ char_O_nullzeit = 0;
+ char_O_ascenttime = 0;
+ calc_gradient_factor();
+
+} // calc_wo_deco_step_1_min(void)
+
+
+// -------------------------
+// calc_tissue_step_1_min //
+// -------------------------
+// optimized in v.101
+
+void calc_tissue_step_1_min(void)
+{
+_asm
+lfsr 1, 0x300
+movlw 0x01
+movwf TBLPTRU,0
+_endasm
+
+ char_O_gtissue_no = 255;
+ pres_gtissue_limit = 0.0;
+
+for (ci=0;ci<16;ci++)
+{
+_asm
+movlw 0x02
+movwf TBLPTRH,0
+movlb 4 // fuer ci
+movf ci,0,1
+addwf ci,0,1
+addwf ci,0,1
+addwf ci,0,1
+addlw 0x80
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var_a+1
+TBLRDPOSTINC
+movff TABLAT,var_a
+TBLRDPOSTINC
+movff TABLAT,var_a+3
+TBLRD
+movff TABLAT,var_a+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var2_a+1
+TBLRDPOSTINC
+movff TABLAT,var2_a
+TBLRDPOSTINC
+movff TABLAT,var2_a+3
+TBLRD
+movff TABLAT,var2_a+2
+addlw 0x40
+movwf TBLPTRL,0
+incf TBLPTRH,1,0
+TBLRDPOSTINC
+movff TABLAT,var_b+1
+TBLRDPOSTINC
+movff TABLAT,var_b
+TBLRDPOSTINC
+movff TABLAT,var_b+3
+TBLRD
+movff TABLAT,var_b+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var2_b+1
+TBLRDPOSTINC
+movff TABLAT,var2_b
+TBLRDPOSTINC
+movff TABLAT,var2_b+3
+TBLRD
+movff TABLAT,var2_b+2
+addlw 0xC0
+movwf TBLPTRL,0
+incf TBLPTRH,1,0
+TBLRDPOSTINC
+movff TABLAT,var_e1min+1
+TBLRDPOSTINC
+movff TABLAT,var_e1min
+TBLRDPOSTINC
+movff TABLAT,var_e1min+3
+TBLRD
+movff TABLAT,var_e1min+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var2_e1min+1
+TBLRDPOSTINC
+movff TABLAT,var2_e1min
+TBLRDPOSTINC
+movff TABLAT,var2_e1min+3
+TBLRD
+movff TABLAT,var2_e1min+2
+_endasm
+
+// N2 1 min
+ temp_tissue = (temp_atem - pres_tissue[ci]) * var_e1min;
+ temp_tissue_safety();
+ pres_tissue[ci] = pres_tissue[ci] + temp_tissue;
+
+// He 1 min
+ temp_tissue = (temp2_atem - pres_tissue[ci+16]) * var2_e1min;
+ temp_tissue_safety();
+ pres_tissue[ci+16] = pres_tissue[ci+16] + temp_tissue;
+
+ temp_tissue = pres_tissue[ci] + pres_tissue[ci+16];
+ var_a = (var_a * pres_tissue[ci] + var2_a * pres_tissue[ci+16]) / temp_tissue;
+ var_b = (var_b * pres_tissue[ci] + var2_b * pres_tissue[ci+16]) / temp_tissue;
+ pres_tissue_limit[ci] = (temp_tissue - var_a) * var_b;
+ if (pres_tissue_limit[ci] < 0)
+ pres_tissue_limit[ci] = 0;
+ if (pres_tissue_limit[ci] > pres_gtissue_limit)
+ {
+ pres_gtissue_limit = pres_tissue_limit[ci];
+ char_O_gtissue_no = ci;
+ }//if
+
+// gradient factor array for graphical display
+// display range is 0 to 250! in steps of 5 for 1 pixel
+// the display is divided in 6 blocks
+// -> double the gradient 100% = 200
+// tissue > respiration (entsaettigungsvorgang)
+// gradient ist wieviel prozent an limit von tissue aus
+// dh. 0% = respiration == tissue
+// dh. 100% = respiration == limit
+temp1 = temp_tissue - pres_respiration;
+temp2 = temp_tissue - pres_tissue_limit[ci]; // changed in v.102
+temp2 = temp1/temp2;
+temp2 = temp2 * 200; // because of output in (Double-)percentage
+if (temp2 < 0)
+ temp2 = 0;
+if (temp2 > 255)
+ temp2 = 255;
+if (temp1 < 0)
+ char_O_array_gradient_weighted[ci] = 0;
+else
+ char_O_array_gradient_weighted[ci] = (char)temp2;
+
+} // for
+} // calc wo deco 1min
+
+#if 0
+// --------
+// debug //
+// --------
+void debug(void)
+{
+for (ci=0;ci<32;ci++)
+{
+ int_O_tissue_for_debug[ci] = (unsigned int)(pres_tissue[ci] *1000);
+}
+} // void debug(void)
+#endif
+
+// ----------
+// md hash //
+// ----------
+void hash(void)
+{
+// init
+ for (md_i=0;md_i<16;md_i++)
+ {
+ md_state[md_i] = 0;
+ md_cksum[md_i] = 0;
+ } // for md_i 16
+
+_asm
+ movlw 0x01
+ movwf TBLPTRU,0
+ movlw 0x06
+ movwf TBLPTRH,0
+ movlw 0x00
+ movwf TBLPTRL,0
+_endasm
+ for (md_i=0;md_i<127;md_i++)
+ {
+_asm
+ TBLRDPOSTINC
+ movff TABLAT,md_temp
+_endasm
+ md_pi_subst[md_i] = md_temp;
+ } // for md_i 256
+_asm
+ TBLRDPOSTINC
+ movff TABLAT,md_temp
+_endasm
+ md_pi_subst[127] = md_temp;
+ for (md_i=0;md_i<127;md_i++)
+ {
+_asm
+ TBLRDPOSTINC
+ movff TABLAT,md_temp
+_endasm
+ md_pi_subst[md_i+128] = md_temp;
+ } // for md_i 256
+_asm
+ TBLRD
+ movff TABLAT,md_temp
+_endasm
+ md_pi_subst[255] = md_temp;
+
+_asm
+ movlw 0x00
+ movwf TBLPTRU,0
+ movlw 0x00
+ movwf TBLPTRH,0
+ movlw 0x00
+ movwf TBLPTRL,0
+_endasm
+// cycle buffers
+for (md_pointer=0x0000;md_pointer<0x17f3;md_pointer++)
+{
+ md_t = 0;
+ for (md_i=0;md_i<16;md_i++)
+ {
+ if(md_pointer == 9)
+ md_temp = md_cksum[md_i];
+ else
+ {
+_asm
+ TBLRDPOSTINC
+ movff TABLAT,md_temp
+_endasm
+ } // else
+ md_buffer[md_i] = md_temp;
+ md_state[md_i+16] = md_buffer[md_i];
+ md_state[md_i+32] = (unsigned char)(md_buffer[md_i] ^ md_state[md_i]);
+ } // for md_i 16
+
+ for (md_i=0;md_i<18;md_i++)
+ {
+ for (md_j=0;md_j<48;md_j++)
+ {
+ md_state[md_j] = (unsigned char)(md_state[md_j] ^ md_pi_subst[md_t]);
+ md_t = md_state[md_j];
+ } // for md_j 48
+ md_t = (unsigned char)(md_t+1);
+ } // for md_i 18
+ md_t = md_cksum[15];
+
+ for (md_i=0;md_i<16;md_i++)
+ {
+ md_cksum[md_i] = (unsigned char)(md_cksum[md_i] ^ md_pi_subst[(md_buffer[md_i] ^ md_t)]);
+ md_t = md_cksum[md_i];
+ } // for md_i 16
+} // for md_pointer
+} // void hash(void)
+
+// ---------------------
+// clear_CNS_fraction //
+// ---------------------
+// new in v.101
+
+void clear_CNS_fraction(void)
+{
+ CNS_fraction = 0.0;
+ char_O_CNS_fraction = 0;
+} // void clear_CNS_fraction(void)
+
+
+// --------------------
+// calc_CNS_fraction //
+// --------------------
+// new in v.101
+// optimized in v.102 : with new variables char_I_actual_ppO2 and actual_ppO2
+
+// Input: char_I_actual_ppO2
+// Output: char_O_CNS_fraction
+// Uses and Updates: CNS_fraction
+// Uses: acutal_ppO2
+
+void calc_CNS_fraction(void)
+{
+ actual_ppO2 = (float)char_I_actual_ppO2 / 100.0;
+
+ if (char_I_actual_ppO2 < 50)
+ CNS_fraction = CNS_fraction;// no changes
+ else if (char_I_actual_ppO2 < 60)
+ CNS_fraction = 1/(-54000.0 * actual_ppO2 + 54000.0) + CNS_fraction;
+ else if (char_I_actual_ppO2 < 70)
+ CNS_fraction = 1/(-45000.0 * actual_ppO2 + 48600.0) + CNS_fraction;
+ else if (char_I_actual_ppO2 < 80)
+ CNS_fraction = 1/(-36000.0 * actual_ppO2 + 42300.0) + CNS_fraction;
+ else if (char_I_actual_ppO2 < 90)
+ CNS_fraction = 1/(-27000.0 * actual_ppO2 + 35100.0) + CNS_fraction;
+ else if (char_I_actual_ppO2 < 110)
+ CNS_fraction = 1/(-18000.0 * actual_ppO2 + 27000.0) + CNS_fraction;
+ else if (char_I_actual_ppO2 < 150)
+ CNS_fraction = 1/(-9000.0 * actual_ppO2 + 17100.0) + CNS_fraction;
+ else if (char_I_actual_ppO2 < 160)
+ CNS_fraction = 1/(-22500.0 * actual_ppO2 + 37350.0) + CNS_fraction;
+ else if (char_I_actual_ppO2 < 165)
+ CNS_fraction = 0.000755 + CNS_fraction; // Arieli et all.(2002): Modeling pulmonary and CNS O2 toxicity... Formula (A1) based on value for 1.55 and c=20
+ else if (char_I_actual_ppO2 < 170)
+ CNS_fraction = 0.00102 + CNS_fraction; // example calculation: Sqrt((1.7/1.55)^20)*0.000404
+ else if (char_I_actual_ppO2 < 175)
+ CNS_fraction = 0.00136 + CNS_fraction;
+ else if (char_I_actual_ppO2 < 180)
+ CNS_fraction = 0.00180 + CNS_fraction;
+ else if (char_I_actual_ppO2 < 185)
+ CNS_fraction = 0.00237 + CNS_fraction;
+ else if (char_I_actual_ppO2 < 190)
+ CNS_fraction = 0.00310 + CNS_fraction;
+ else if (char_I_actual_ppO2 < 195)
+ CNS_fraction = 0.00401 + CNS_fraction;
+ else if (char_I_actual_ppO2 < 200)
+ CNS_fraction = 0.00517 + CNS_fraction;
+ else if (char_I_actual_ppO2 < 230)
+ CNS_fraction = 0.0209 + CNS_fraction;
+ else
+ CNS_fraction = 0.0482 + CNS_fraction; // value for 2.5
+
+ if (CNS_fraction > 2.5)
+ CNS_fraction = 2.5;
+ if (CNS_fraction < 0.0)
+ CNS_fraction = 0.0;
+ char_O_CNS_fraction = (char)((CNS_fraction + 0.005)* 100.0);
+} // void calc_CNS_fraction(void)
+
+// --------------------------
+// calc_CNS_decrease_15min //
+// --------------------------
+// new in v.101
+
+// calculates the half time of 90 minutes in 6 steps of 15 min
+
+// Output: char_O_CNS_fraction
+// Uses and Updates: CNS_fraction
+
+void calc_CNS_decrease_15min(void)
+{
+ CNS_fraction = 0.890899 * CNS_fraction;
+ char_O_CNS_fraction = (char)((CNS_fraction + 0.005)* 100.0);
+}// calc_CNS_decrease_15min(void)
+
+
+// ------------------
+// calc_percentage //
+// ------------------
+// new in v.101
+
+// calculates int_I_temp * char_I_temp / 100
+// output is int_I_temp
+
+void calc_percentage(void)
+{
+ temp1 = (float)int_I_temp;
+ temp2 = (float)char_I_temp / 100.0;
+ temp3 = temp1 * temp2;
+ int_I_temp = (int)temp3;
+}
+void push_tissues_to_vault(void)
+{
+ for (ci=0;ci<32;ci++)
+ pres_tissue_vault[ci] = pres_tissue[ci];
+}
+void pull_tissues_from_vault(void)
+{
+ for (ci=0;ci<32;ci++)
+ pres_tissue[ci] = pres_tissue_vault[ci];
+}
+
+void wp_write_command(void)
+{
+ _asm
+ bcf oled_rs
+ movff wp_command,PORTD
+ bcf oled_rw
+ bsf oled_rw
+ _endasm
+}
+
+void wp_write_data(void)
+{
+ wp_data_8bit_one = wp_data_16bit >> 8;
+ wp_data_8bit_two = wp_data_16bit;
+_asm
+ bsf oled_rs
+ movff wp_data_8bit_one,PORTD
+ bcf oled_rw
+ bsf oled_rw
+ movff wp_data_8bit_two,PORTD
+ bcf oled_rw
+ bsf oled_rw
+_endasm
+}
+
+void wp_write_black(void)
+{
+_asm
+ movff wp_black,PORTD
+ bcf oled_rw
+ bsf oled_rw
+ bcf oled_rw
+ bsf oled_rw
+_endasm
+}
+
+void wp_write_color(void)
+{
+_asm
+ movff wp_color1,PORTD
+ bcf oled_rw
+ bsf oled_rw
+ movff wp_color2,PORTD
+ bcf oled_rw
+ bsf oled_rw
+_endasm
+}
+
+void wp_set_window(void)
+{
+ // x axis start ( 0 - 319)
+ wp_command = 0x35;
+ wp_write_command();
+ wp_data_16bit = ((U16)wp_leftx2) << 1;
+ wp_write_data();
+ // x axis end ( 0 - 319)
+ wp_command = 0x36;
+ wp_write_command();
+ wp_data_16bit = 319;
+ wp_write_data();
+ // y axis start + end ( 0 - 239 )
+ wp_command = 0x37;
+ wp_write_command();
+ // the bottom part
+ wp_data_16bit = wp_top;
+ if(wp_font == 2)
+ wp_data_16bit += WP_FONT_LARGE_HEIGHT;
+ else if(wp_font == 1)
+ wp_data_16bit += WP_FONT_MEDIUM_HEIGHT;
+ else
+ wp_data_16bit += WP_FONT_SMALL_HEIGHT;
+ wp_data_16bit--;
+ if(wp_data_16bit > 239)
+ wp_data_16bit = 239;
+ // the top part
+ wp_data_16bit |= ((U16)wp_top) << 8;
+ // all together in one 16bit transfer
+ wp_write_data();
+
+ // start
+ wp_command = 0x20;
+ wp_write_command();
+ wp_data_16bit = wp_top;
+ wp_write_data();
+
+ wp_command = 0x21;
+ wp_write_command();
+ wp_data_16bit = ((U16)wp_leftx2) << 1;
+ wp_write_data();
+}
+
+void wp_set_char_font_small(void)
+{
+ if (wp_char == ' ')
+ wp_char = 'ķ';
+
+ if((wp_char < '!') || (wp_char > 'ķ')) // font has 34 chars after ~ // ū + 4 chars limit to end of battery at the moment
+ wp_char = 'Ī'; // 0x82; // Ī
+
+ if (wp_char > 0x7E) // skip space between ~ and Ą
+ wp_char -= 34;
+
+ wp_start = wp_small_table[wp_char - '!'];
+ wp_end = wp_small_table[1 + wp_char - '!'];
+}
+
+void wp_set_char_font_medium(void)
+{
+ // space is 3E
+ if (wp_char == 0x27) // 0x27 == '
+ wp_char = 0x3B;
+ if (wp_char == '"')
+ wp_char = 0x3C;
+ if (wp_char == 'm')
+ wp_char = 0x3D;
+ if (wp_char == ' ')
+ wp_char = 0x3E;
+
+ if((wp_char < '.') || (wp_char > 0x3E))
+ wp_char = 0x3E;
+ wp_start = wp_medium_table[wp_char - '.'];
+ wp_end = wp_medium_table[1 + wp_char - '.'];
+}
+
+void wp_set_char_font_large(void)
+{
+ // space is / = 0x2F
+ if (wp_char == ' ')
+ wp_char = 0x2F;
+
+ if((wp_char < '.') || (wp_char > '9'))
+ wp_char = 0x2F;
+ wp_start = wp_large_table[wp_char - '.'];
+ wp_end = wp_large_table[1 + wp_char - '.'];
+}
+
+void wordprocessor(void)
+{
+ wp_set_window();
+
+ // access to GRAM
+ wp_command = 0x22;
+ wp_write_command();
+ _asm
+ bsf oled_rs
+ _endasm
+
+ wp_txtptr = 0;
+ wp_char = wp_stringstore[wp_txtptr];
+
+ while(wp_char)
+ {
+ if(wp_font == 2)
+ wp_set_char_font_large();
+ else if(wp_font == 1)
+ wp_set_char_font_medium();
+ else
+ wp_set_char_font_small();
+
+ wp_black = 0;
+
+ for(wp_i = wp_start; wp_i> 8;
+ if((wp_temp_U8 & 128))
+ {
+ wp_temp_U8 -= 127;
+ if(wp_invert)
+ {
+ while(wp_temp_U8 > 0)
+ {
+ wp_temp_U8--;
+ wp_write_color();
+ }
+ }
+ else
+ {
+ _asm
+ movff wp_black,PORTD
+ _endasm
+ while(wp_temp_U8 > 0)
+ {
+ wp_temp_U8--;
+ _asm
+ bcf oled_rw
+ bsf oled_rw
+ bcf oled_rw
+ bsf oled_rw
+ _endasm
+ }
+ }
+ }
+ else
+ {
+ wp_temp_U8++;
+ if(wp_invert)
+ {
+ _asm
+ movff wp_black,PORTD
+ _endasm
+ while(wp_temp_U8 > 0)
+ {
+ wp_temp_U8--;
+ _asm
+ bcf oled_rw
+ bsf oled_rw
+ bcf oled_rw
+ bsf oled_rw
+ _endasm
+ }
+ }
+ else
+ {
+ while(wp_temp_U8 > 0)
+ {
+ wp_temp_U8--;
+ wp_write_color();
+ }
+ }
+ }
+ }
+ wp_txtptr++;
+ wp_char = wp_stringstore[wp_txtptr];
+ }
+ wp_command = 0x00;
+ wp_write_command();
+}
diff -r 000000000000 -r 96a35aeda5f2 code_part1/OSTC_code_c_part2/p2_deco_main - 090915b.err
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/code_part1/OSTC_code_c_part2/p2_deco_main - 090915b.err Tue Jan 12 15:05:59 2010 +0100
@@ -0,0 +1,1 @@
+Error[1027] Q:\Data\OSTC2\code\OSTC_code_c_part2\p2_deco_main - 090915b.c 1295 : unable to locate 'p2_tables.romdata'
diff -r 000000000000 -r 96a35aeda5f2 code_part1/OSTC_code_c_part2/p2_deco_main - 090915b.i
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/code_part1/OSTC_code_c_part2/p2_deco_main - 090915b.i Tue Jan 12 15:05:59 2010 +0100
@@ -0,0 +1,11459 @@
+#line 1 "p2_deco_main - 090915b.c"
+#line 1 "p2_deco_main - 090915b.c"
+
+#line 17 "p2_deco_main - 090915b.c"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#line 1 "C:/MCC18/h/p18f4685.h"
+
+#line 5 "C:/MCC18/h/p18f4685.h"
+
+
+
+#line 9 "C:/MCC18/h/p18f4685.h"
+
+extern volatile far unsigned char RXF6SIDH;
+extern volatile far struct {
+ unsigned SID3:1;
+ unsigned SID4:1;
+ unsigned SID5:1;
+ unsigned SID6:1;
+ unsigned SID7:1;
+ unsigned SID8:1;
+ unsigned SID9:1;
+ unsigned SID10:1;
+} RXF6SIDHbits;
+extern volatile far unsigned char RXF6SIDL;
+extern volatile far union {
+ struct {
+ unsigned EID16:1;
+ unsigned EID17:1;
+ unsigned :1;
+ unsigned EXIDE:1;
+ unsigned :1;
+ unsigned SID0:1;
+ unsigned SID1:1;
+ unsigned SID2:1;
+ };
+ struct {
+ unsigned :3;
+ unsigned EXIDEN:1;
+ };
+} RXF6SIDLbits;
+extern volatile far unsigned char RXF6EIDH;
+extern volatile far struct {
+ unsigned EID8:1;
+ unsigned EID9:1;
+ unsigned EID10:1;
+ unsigned EID11:1;
+ unsigned EID12:1;
+ unsigned EID13:1;
+ unsigned EID14:1;
+ unsigned EID15:1;
+} RXF6EIDHbits;
+extern volatile far unsigned char RXF6EIDL;
+extern volatile far struct {
+ unsigned EID0:1;
+ unsigned EID1:1;
+ unsigned EID2:1;
+ unsigned EID3:1;
+ unsigned EID4:1;
+ unsigned EID5:1;
+ unsigned EID6:1;
+ unsigned EID7:1;
+} RXF6EIDLbits;
+extern volatile far unsigned char RXF7SIDH;
+extern volatile far struct {
+ unsigned SID3:1;
+ unsigned SID4:1;
+ unsigned SID5:1;
+ unsigned SID6:1;
+ unsigned SID7:1;
+ unsigned SID8:1;
+ unsigned SID9:1;
+ unsigned SID10:1;
+} RXF7SIDHbits;
+extern volatile far unsigned char RXF7SIDL;
+extern volatile far union {
+ struct {
+ unsigned EID16:1;
+ unsigned EID17:1;
+ unsigned :1;
+ unsigned EXIDE:1;
+ unsigned :1;
+ unsigned SID0:1;
+ unsigned SID1:1;
+ unsigned SID2:1;
+ };
+ struct {
+ unsigned :3;
+ unsigned EXIDEN:1;
+ };
+} RXF7SIDLbits;
+extern volatile far unsigned char RXF7EIDH;
+extern volatile far struct {
+ unsigned EID8:1;
+ unsigned EID9:1;
+ unsigned EID10:1;
+ unsigned EID11:1;
+ unsigned EID12:1;
+ unsigned EID13:1;
+ unsigned EID14:1;
+ unsigned EID15:1;
+} RXF7EIDHbits;
+extern volatile far unsigned char RXF7EIDL;
+extern volatile far struct {
+ unsigned EID0:1;
+ unsigned EID1:1;
+ unsigned EID2:1;
+ unsigned EID3:1;
+ unsigned EID4:1;
+ unsigned EID5:1;
+ unsigned EID6:1;
+ unsigned EID7:1;
+} RXF7EIDLbits;
+extern volatile far unsigned char RXF8SIDH;
+extern volatile far struct {
+ unsigned SID3:1;
+ unsigned SID4:1;
+ unsigned SID5:1;
+ unsigned SID6:1;
+ unsigned SID7:1;
+ unsigned SID8:1;
+ unsigned SID9:1;
+ unsigned SID10:1;
+} RXF8SIDHbits;
+extern volatile far unsigned char RXF8SIDL;
+extern volatile far union {
+ struct {
+ unsigned EID16:1;
+ unsigned EID17:1;
+ unsigned :1;
+ unsigned EXIDE:1;
+ unsigned :1;
+ unsigned SID0:1;
+ unsigned SID1:1;
+ unsigned SID2:1;
+ };
+ struct {
+ unsigned :3;
+ unsigned EXIDEN:1;
+ };
+} RXF8SIDLbits;
+extern volatile far unsigned char RXF8EIDH;
+extern volatile far struct {
+ unsigned EID8:1;
+ unsigned EID9:1;
+ unsigned EID10:1;
+ unsigned EID11:1;
+ unsigned EID12:1;
+ unsigned EID13:1;
+ unsigned EID14:1;
+ unsigned EID15:1;
+} RXF8EIDHbits;
+extern volatile far unsigned char RXF8EIDL;
+extern volatile far struct {
+ unsigned EID0:1;
+ unsigned EID1:1;
+ unsigned EID2:1;
+ unsigned EID3:1;
+ unsigned EID4:1;
+ unsigned EID5:1;
+ unsigned EID6:1;
+ unsigned EID7:1;
+} RXF8EIDLbits;
+extern volatile far unsigned char RXF9SIDH;
+extern volatile far struct {
+ unsigned SID3:1;
+ unsigned SID4:1;
+ unsigned SID5:1;
+ unsigned SID6:1;
+ unsigned SID7:1;
+ unsigned SID8:1;
+ unsigned SID9:1;
+ unsigned SID10:1;
+} RXF9SIDHbits;
+extern volatile far unsigned char RXF9SIDL;
+extern volatile far union {
+ struct {
+ unsigned EID16:1;
+ unsigned EID17:1;
+ unsigned :1;
+ unsigned EXIDE:1;
+ unsigned :1;
+ unsigned SID0:1;
+ unsigned SID1:1;
+ unsigned SID2:1;
+ };
+ struct {
+ unsigned :3;
+ unsigned EXIDEN:1;
+ };
+} RXF9SIDLbits;
+extern volatile far unsigned char RXF9EIDH;
+extern volatile far struct {
+ unsigned EID8:1;
+ unsigned EID9:1;
+ unsigned EID10:1;
+ unsigned EID11:1;
+ unsigned EID12:1;
+ unsigned EID13:1;
+ unsigned EID14:1;
+ unsigned EID15:1;
+} RXF9EIDHbits;
+extern volatile far unsigned char RXF9EIDL;
+extern volatile far struct {
+ unsigned EID0:1;
+ unsigned EID1:1;
+ unsigned EID2:1;
+ unsigned EID3:1;
+ unsigned EID4:1;
+ unsigned EID5:1;
+ unsigned EID6:1;
+ unsigned EID7:1;
+} RXF9EIDLbits;
+extern volatile far unsigned char RXF10SIDH;
+extern volatile far struct {
+ unsigned SID3:1;
+ unsigned SID4:1;
+ unsigned SID5:1;
+ unsigned SID6:1;
+ unsigned SID7:1;
+ unsigned SID8:1;
+ unsigned SID9:1;
+ unsigned SID10:1;
+} RXF10SIDHbits;
+extern volatile far unsigned char RXF10SIDL;
+extern volatile far union {
+ struct {
+ unsigned EID16:1;
+ unsigned EID17:1;
+ unsigned :1;
+ unsigned EXIDE:1;
+ unsigned :1;
+ unsigned SID0:1;
+ unsigned SID1:1;
+ unsigned SID2:1;
+ };
+ struct {
+ unsigned :3;
+ unsigned EXIDEN:1;
+ };
+} RXF10SIDLbits;
+extern volatile far unsigned char RXF10EIDH;
+extern volatile far struct {
+ unsigned EID8:1;
+ unsigned EID9:1;
+ unsigned EID10:1;
+ unsigned EID11:1;
+ unsigned EID12:1;
+ unsigned EID13:1;
+ unsigned EID14:1;
+ unsigned EID15:1;
+} RXF10EIDHbits;
+extern volatile far unsigned char RXF10EIDL;
+extern volatile far struct {
+ unsigned EID0:1;
+ unsigned EID1:1;
+ unsigned EID2:1;
+ unsigned EID3:1;
+ unsigned EID4:1;
+ unsigned EID5:1;
+ unsigned EID6:1;
+ unsigned EID7:1;
+} RXF10EIDLbits;
+extern volatile far unsigned char RXF11SIDH;
+extern volatile far struct {
+ unsigned SID3:1;
+ unsigned SID4:1;
+ unsigned SID5:1;
+ unsigned SID6:1;
+ unsigned SID7:1;
+ unsigned SID8:1;
+ unsigned SID9:1;
+ unsigned SID10:1;
+} RXF11SIDHbits;
+extern volatile far unsigned char RXF11SIDL;
+extern volatile far union {
+ struct {
+ unsigned EID16:1;
+ unsigned EID17:1;
+ unsigned :1;
+ unsigned EXIDE:1;
+ unsigned :1;
+ unsigned SID0:1;
+ unsigned SID1:1;
+ unsigned SID2:1;
+ };
+ struct {
+ unsigned :3;
+ unsigned EXIDEN:1;
+ };
+} RXF11SIDLbits;
+extern volatile far unsigned char RXF11EIDH;
+extern volatile far struct {
+ unsigned EID8:1;
+ unsigned EID9:1;
+ unsigned EID10:1;
+ unsigned EID11:1;
+ unsigned EID12:1;
+ unsigned EID13:1;
+ unsigned EID14:1;
+ unsigned EID15:1;
+} RXF11EIDHbits;
+extern volatile far unsigned char RXF11EIDL;
+extern volatile far struct {
+ unsigned EID0:1;
+ unsigned EID1:1;
+ unsigned EID2:1;
+ unsigned EID3:1;
+ unsigned EID4:1;
+ unsigned EID5:1;
+ unsigned EID6:1;
+ unsigned EID7:1;
+} RXF11EIDLbits;
+extern volatile far unsigned char RXF12SIDH;
+extern volatile far struct {
+ unsigned SID3:1;
+ unsigned SID4:1;
+ unsigned SID5:1;
+ unsigned SID6:1;
+ unsigned SID7:1;
+ unsigned SID8:1;
+ unsigned SID9:1;
+ unsigned SID10:1;
+} RXF12SIDHbits;
+extern volatile far unsigned char RXF12SIDL;
+extern volatile far union {
+ struct {
+ unsigned EID16:1;
+ unsigned EID17:1;
+ unsigned :1;
+ unsigned EXIDE:1;
+ unsigned :1;
+ unsigned SID0:1;
+ unsigned SID1:1;
+ unsigned SID2:1;
+ };
+ struct {
+ unsigned :3;
+ unsigned EXIDEN:1;
+ };
+} RXF12SIDLbits;
+extern volatile far unsigned char RXF12EIDH;
+extern volatile far struct {
+ unsigned EID8:1;
+ unsigned EID9:1;
+ unsigned EID10:1;
+ unsigned EID11:1;
+ unsigned EID12:1;
+ unsigned EID13:1;
+ unsigned EID14:1;
+ unsigned EID15:1;
+} RXF12EIDHbits;
+extern volatile far unsigned char RXF12EIDL;
+extern volatile far struct {
+ unsigned EID0:1;
+ unsigned EID1:1;
+ unsigned EID2:1;
+ unsigned EID3:1;
+ unsigned EID4:1;
+ unsigned EID5:1;
+ unsigned EID6:1;
+ unsigned EID7:1;
+} RXF12EIDLbits;
+extern volatile far unsigned char RXF13SIDH;
+extern volatile far struct {
+ unsigned SID3:1;
+ unsigned SID4:1;
+ unsigned SID5:1;
+ unsigned SID6:1;
+ unsigned SID7:1;
+ unsigned SID8:1;
+ unsigned SID9:1;
+ unsigned SID10:1;
+} RXF13SIDHbits;
+extern volatile far unsigned char RXF13SIDL;
+extern volatile far union {
+ struct {
+ unsigned EID16:1;
+ unsigned EID17:1;
+ unsigned :1;
+ unsigned EXIDE:1;
+ unsigned :1;
+ unsigned SID0:1;
+ unsigned SID1:1;
+ unsigned SID2:1;
+ };
+ struct {
+ unsigned :3;
+ unsigned EXIDEN:1;
+ };
+} RXF13SIDLbits;
+extern volatile far unsigned char RXF13EIDH;
+extern volatile far struct {
+ unsigned EID8:1;
+ unsigned EID9:1;
+ unsigned EID10:1;
+ unsigned EID11:1;
+ unsigned EID12:1;
+ unsigned EID13:1;
+ unsigned EID14:1;
+ unsigned EID15:1;
+} RXF13EIDHbits;
+extern volatile far unsigned char RXF13EIDL;
+extern volatile far struct {
+ unsigned EID0:1;
+ unsigned EID1:1;
+ unsigned EID2:1;
+ unsigned EID3:1;
+ unsigned EID4:1;
+ unsigned EID5:1;
+ unsigned EID6:1;
+ unsigned EID7:1;
+} RXF13EIDLbits;
+extern volatile far unsigned char RXF14SIDH;
+extern volatile far struct {
+ unsigned SID3:1;
+ unsigned SID4:1;
+ unsigned SID5:1;
+ unsigned SID6:1;
+ unsigned SID7:1;
+ unsigned SID8:1;
+ unsigned SID9:1;
+ unsigned SID10:1;
+} RXF14SIDHbits;
+extern volatile far unsigned char RXF14SIDL;
+extern volatile far union {
+ struct {
+ unsigned EID16:1;
+ unsigned EID17:1;
+ unsigned :1;
+ unsigned EXIDE:1;
+ unsigned :1;
+ unsigned SID0:1;
+ unsigned SID1:1;
+ unsigned SID2:1;
+ };
+ struct {
+ unsigned :3;
+ unsigned EXIDEN:1;
+ };
+} RXF14SIDLbits;
+extern volatile far unsigned char RXF14EIDH;
+extern volatile far struct {
+ unsigned EID8:1;
+ unsigned EID9:1;
+ unsigned EID10:1;
+ unsigned EID11:1;
+ unsigned EID12:1;
+ unsigned EID13:1;
+ unsigned EID14:1;
+ unsigned EID15:1;
+} RXF14EIDHbits;
+extern volatile far unsigned char RXF14EIDL;
+extern volatile far struct {
+ unsigned EID0:1;
+ unsigned EID1:1;
+ unsigned EID2:1;
+ unsigned EID3:1;
+ unsigned EID4:1;
+ unsigned EID5:1;
+ unsigned EID6:1;
+ unsigned EID7:1;
+} RXF14EIDLbits;
+extern volatile far unsigned char RXF15SIDH;
+extern volatile far struct {
+ unsigned SID3:1;
+ unsigned SID4:1;
+ unsigned SID5:1;
+ unsigned SID6:1;
+ unsigned SID7:1;
+ unsigned SID8:1;
+ unsigned SID9:1;
+ unsigned SID10:1;
+} RXF15SIDHbits;
+extern volatile far unsigned char RXF15SIDL;
+extern volatile far union {
+ struct {
+ unsigned EID16:1;
+ unsigned EID17:1;
+ unsigned :1;
+ unsigned EXIDE:1;
+ unsigned :1;
+ unsigned SID0:1;
+ unsigned SID1:1;
+ unsigned SID2:1;
+ };
+ struct {
+ unsigned :3;
+ unsigned EXIDEN:1;
+ };
+} RXF15SIDLbits;
+extern volatile far unsigned char RXF15EIDH;
+extern volatile far struct {
+ unsigned EID8:1;
+ unsigned EID9:1;
+ unsigned EID10:1;
+ unsigned EID11:1;
+ unsigned EID12:1;
+ unsigned EID13:1;
+ unsigned EID14:1;
+ unsigned EID15:1;
+} RXF15EIDHbits;
+extern volatile far unsigned char RXF15EIDL;
+extern volatile far struct {
+ unsigned EID0:1;
+ unsigned EID1:1;
+ unsigned EID2:1;
+ unsigned EID3:1;
+ unsigned EID4:1;
+ unsigned EID5:1;
+ unsigned EID6:1;
+ unsigned EID7:1;
+} RXF15EIDLbits;
+extern volatile far unsigned char RXFCON0;
+extern volatile far struct {
+ unsigned RXF0EN:1;
+ unsigned RXF1EN:1;
+ unsigned RXF2EN:1;
+ unsigned RXF3EN:1;
+ unsigned RXF4EN:1;
+ unsigned RXF5EN:1;
+ unsigned RXF6EN:1;
+ unsigned RXF7EN:1;
+} RXFCON0bits;
+extern volatile far unsigned char RXFCON1;
+extern volatile far struct {
+ unsigned RXF8EN:1;
+ unsigned RXF9EN:1;
+ unsigned RXF10EN:1;
+ unsigned RXF11EN:1;
+ unsigned RXF12EN:1;
+ unsigned RXF13EN:1;
+ unsigned RXF14EN:1;
+ unsigned RXF15EN:1;
+} RXFCON1bits;
+extern volatile far unsigned char SDFLC;
+extern volatile far union {
+ struct {
+ unsigned DFLC0:1;
+ unsigned DFLC1:1;
+ unsigned DFLC2:1;
+ unsigned DFLC3:1;
+ unsigned DFLC4:1;
+ };
+ struct {
+ unsigned FLC0:1;
+ unsigned FLC1:1;
+ unsigned FLC2:1;
+ unsigned FLC3:1;
+ unsigned FLC4:1;
+ };
+} SDFLCbits;
+extern volatile far unsigned char RXFBCON0;
+extern volatile far struct {
+ unsigned F0BP_0:1;
+ unsigned F0BP_1:1;
+ unsigned F0BP_2:1;
+ unsigned F0BP_3:1;
+ unsigned F1BP_0:1;
+ unsigned F1BP_1:1;
+ unsigned F1BP_2:1;
+ unsigned F1BP_3:1;
+} RXFBCON0bits;
+extern volatile far unsigned char RXFBCON1;
+extern volatile far struct {
+ unsigned F2BP_0:1;
+ unsigned F2BP_1:1;
+ unsigned F2BP_2:1;
+ unsigned F2BP_3:1;
+ unsigned F3BP_0:1;
+ unsigned F3BP_1:1;
+ unsigned F3BP_2:1;
+ unsigned F3BP_3:1;
+} RXFBCON1bits;
+extern volatile far unsigned char RXFBCON2;
+extern volatile far struct {
+ unsigned F4BP_0:1;
+ unsigned F4BP_1:1;
+ unsigned F4BP_2:1;
+ unsigned F4BP_3:1;
+ unsigned F5BP_0:1;
+ unsigned F5BP_1:1;
+ unsigned F5BP_2:1;
+ unsigned F5BP_3:1;
+} RXFBCON2bits;
+extern volatile far unsigned char RXFBCON3;
+extern volatile far struct {
+ unsigned F6BP_0:1;
+ unsigned F6BP_1:1;
+ unsigned F6BP_2:1;
+ unsigned F6BP_3:1;
+ unsigned F7BP_0:1;
+ unsigned F7BP_1:1;
+ unsigned F7BP_2:1;
+ unsigned F7BP_3:1;
+} RXFBCON3bits;
+extern volatile far unsigned char RXFBCON4;
+extern volatile far struct {
+ unsigned F8BP_0:1;
+ unsigned F8BP_1:1;
+ unsigned F8BP_2:1;
+ unsigned F8BP_3:1;
+ unsigned F9BP_0:1;
+ unsigned F9BP_1:1;
+ unsigned F9BP_2:1;
+ unsigned F9BP_3:1;
+} RXFBCON4bits;
+extern volatile far unsigned char RXFBCON5;
+extern volatile far struct {
+ unsigned F10BP_0:1;
+ unsigned F10BP_1:1;
+ unsigned F10BP_2:1;
+ unsigned F10BP_3:1;
+ unsigned F11BP_0:1;
+ unsigned F11BP_1:1;
+ unsigned F11BP_2:1;
+ unsigned F11BP_3:1;
+} RXFBCON5bits;
+extern volatile far unsigned char RXFBCON6;
+extern volatile far struct {
+ unsigned F12BP_0:1;
+ unsigned F12BP_1:1;
+ unsigned F12BP_2:1;
+ unsigned F12BP_3:1;
+ unsigned F13BP_0:1;
+ unsigned F13BP_1:1;
+ unsigned F13BP_2:1;
+ unsigned F13BP_3:1;
+} RXFBCON6bits;
+extern volatile far unsigned char RXFBCON7;
+extern volatile far struct {
+ unsigned F14BP_0:1;
+ unsigned F14BP_1:1;
+ unsigned F14BP_2:1;
+ unsigned F14BP_3:1;
+ unsigned F15BP_0:1;
+ unsigned F15BP_1:1;
+ unsigned F15BP_2:1;
+ unsigned F15BP_3:1;
+} RXFBCON7bits;
+extern volatile far unsigned char MSEL0;
+extern volatile far struct {
+ unsigned FIL0_0:1;
+ unsigned FIL0_1:1;
+ unsigned FIL1_0:1;
+ unsigned FIL1_1:1;
+ unsigned FIL2_0:1;
+ unsigned FIL2_1:1;
+ unsigned FIL3_0:1;
+ unsigned FIL3_1:1;
+} MSEL0bits;
+extern volatile far unsigned char MSEL1;
+extern volatile far struct {
+ unsigned FIL4_0:1;
+ unsigned FIL4_1:1;
+ unsigned FIL5_0:1;
+ unsigned FIL5_1:1;
+ unsigned FIL6_0:1;
+ unsigned FIL6_1:1;
+ unsigned FIL7_0:1;
+ unsigned FIL7_1:1;
+} MSEL1bits;
+extern volatile far unsigned char MSEL2;
+extern volatile far struct {
+ unsigned FIL8_0:1;
+ unsigned FIL8_1:1;
+ unsigned FIL9_0:1;
+ unsigned FIL9_1:1;
+ unsigned FIL10_0:1;
+ unsigned FIL10_1:1;
+ unsigned FIL11_0:1;
+ unsigned FIL11_1:1;
+} MSEL2bits;
+extern volatile far unsigned char MSEL3;
+extern volatile far struct {
+ unsigned FIL12_0:1;
+ unsigned FIL12_1:1;
+ unsigned FIL13_0:1;
+ unsigned FIL13_1:1;
+ unsigned FIL14_0:1;
+ unsigned FIL14_1:1;
+ unsigned FIL15_0:1;
+ unsigned FIL15_1:1;
+} MSEL3bits;
+extern volatile far unsigned char BSEL0;
+extern volatile far struct {
+ unsigned :2;
+ unsigned B0TXEN:1;
+ unsigned B1TXEN:1;
+ unsigned B2TXEN:1;
+ unsigned B3TXEN:1;
+ unsigned B4TXEN:1;
+ unsigned B5TXEN:1;
+} BSEL0bits;
+extern volatile far unsigned char BIE0;
+extern volatile far struct {
+ unsigned RXB0IE:1;
+ unsigned RXB1IE:1;
+ unsigned B0IE:1;
+ unsigned B1IE:1;
+ unsigned B2IE:1;
+ unsigned B3IE:1;
+ unsigned B4IE:1;
+ unsigned B5IE:1;
+} BIE0bits;
+extern volatile far unsigned char TXBIE;
+extern volatile far struct {
+ unsigned :2;
+ unsigned TXB0IE:1;
+ unsigned TXB1IE:1;
+ unsigned TXB2IE:1;
+} TXBIEbits;
+extern volatile far unsigned char B0CON;
+extern volatile far union {
+ struct {
+ unsigned FILHIT0:1;
+ unsigned FILHIT1:1;
+ unsigned FILHIT2:1;
+ unsigned FILHIT3:1;
+ unsigned FILHIT4:1;
+ unsigned RTRRO:1;
+ unsigned RXM1:1;
+ unsigned RXFUL:1;
+ };
+ struct {
+ unsigned TXPRI0:1;
+ unsigned TXPRI1:1;
+ unsigned RTREN:1;
+ unsigned TXREQ:1;
+ unsigned TXERR:1;
+ unsigned TXLARB:1;
+ unsigned TXABT:1;
+ unsigned TXBIF:1;
+ };
+ struct {
+ unsigned :5;
+ unsigned RXRTRRO:1;
+ };
+} B0CONbits;
+extern volatile far unsigned char B0SIDH;
+extern volatile far struct {
+ unsigned SID3:1;
+ unsigned SID4:1;
+ unsigned SID5:1;
+ unsigned SID6:1;
+ unsigned SID7:1;
+ unsigned SID8:1;
+ unsigned SID9:1;
+ unsigned SID10:1;
+} B0SIDHbits;
+extern volatile far unsigned char B0SIDL;
+extern volatile far union {
+ struct {
+ unsigned EID16:1;
+ unsigned EID17:1;
+ unsigned :1;
+ unsigned EXID:1;
+ unsigned SRR:1;
+ unsigned SID0:1;
+ unsigned SID1:1;
+ unsigned SID2:1;
+ };
+ struct {
+ unsigned :3;
+ unsigned EXIDE:1;
+ };
+} B0SIDLbits;
+extern volatile far unsigned char B0EIDH;
+extern volatile far struct {
+ unsigned EID8:1;
+ unsigned EID9:1;
+ unsigned EID10:1;
+ unsigned EID11:1;
+ unsigned EID12:1;
+ unsigned EID13:1;
+ unsigned EID14:1;
+ unsigned EID15:1;
+} B0EIDHbits;
+extern volatile far unsigned char B0EIDL;
+extern volatile far struct {
+ unsigned EID0:1;
+ unsigned EID1:1;
+ unsigned EID2:1;
+ unsigned EID3:1;
+ unsigned EID4:1;
+ unsigned EID5:1;
+ unsigned EID6:1;
+ unsigned EID7:1;
+} B0EIDLbits;
+extern volatile far unsigned char B0DLC;
+extern volatile far union {
+ struct {
+ unsigned DLC0:1;
+ unsigned DLC1:1;
+ unsigned DLC2:1;
+ unsigned DLC3:1;
+ unsigned RESRB0:1;
+ unsigned RESRB1:1;
+ unsigned RXRTR:1;
+ };
+ struct {
+ unsigned :6;
+ unsigned TXRTR:1;
+ };
+ struct {
+ unsigned :4;
+ unsigned RB0:1;
+ unsigned RB1:1;
+ };
+} B0DLCbits;
+extern volatile far unsigned char B0D0;
+extern volatile far struct {
+ unsigned B0D00:1;
+ unsigned B0D01:1;
+ unsigned B0D02:1;
+ unsigned B0D03:1;
+ unsigned B0D04:1;
+ unsigned B0D05:1;
+ unsigned B0D06:1;
+ unsigned B0D07:1;
+} B0D0bits;
+extern volatile far unsigned char B0D1;
+extern volatile far struct {
+ unsigned B0D10:1;
+ unsigned B0D11:1;
+ unsigned B0D12:1;
+ unsigned B0D13:1;
+ unsigned B0D14:1;
+ unsigned B0D15:1;
+ unsigned B0D16:1;
+ unsigned B0D17:1;
+} B0D1bits;
+extern volatile far unsigned char B0D2;
+extern volatile far struct {
+ unsigned B0D20:1;
+ unsigned B0D21:1;
+ unsigned B0D22:1;
+ unsigned B0D23:1;
+ unsigned B0D24:1;
+ unsigned B0D25:1;
+ unsigned B0D26:1;
+ unsigned B0D27:1;
+} B0D2bits;
+extern volatile far unsigned char B0D3;
+extern volatile far struct {
+ unsigned B0D30:1;
+ unsigned B0D31:1;
+ unsigned B0D32:1;
+ unsigned B0D33:1;
+ unsigned B0D34:1;
+ unsigned B0D35:1;
+ unsigned B0D36:1;
+ unsigned B0D37:1;
+} B0D3bits;
+extern volatile far unsigned char B0D4;
+extern volatile far struct {
+ unsigned B0D40:1;
+ unsigned B0D41:1;
+ unsigned B0D42:1;
+ unsigned B0D43:1;
+ unsigned B0D44:1;
+ unsigned B0D45:1;
+ unsigned B0D46:1;
+ unsigned B0D47:1;
+} B0D4bits;
+extern volatile far unsigned char B0D5;
+extern volatile far struct {
+ unsigned B0D50:1;
+ unsigned B0D51:1;
+ unsigned B0D52:1;
+ unsigned B0D53:1;
+ unsigned B0D54:1;
+ unsigned B0D55:1;
+ unsigned B0D56:1;
+ unsigned B0D57:1;
+} B0D5bits;
+extern volatile far unsigned char B0D6;
+extern volatile far struct {
+ unsigned B0D60:1;
+ unsigned B0D61:1;
+ unsigned B0D62:1;
+ unsigned B0D63:1;
+ unsigned B0D64:1;
+ unsigned B0D65:1;
+ unsigned B0D66:1;
+ unsigned B0D67:1;
+} B0D6bits;
+extern volatile far unsigned char B0D7;
+extern volatile far struct {
+ unsigned B0D70:1;
+ unsigned B0D71:1;
+ unsigned B0D72:1;
+ unsigned B0D73:1;
+ unsigned B0D74:1;
+ unsigned B0D75:1;
+ unsigned B0D76:1;
+ unsigned B0D77:1;
+} B0D7bits;
+extern volatile far unsigned char CANSTAT_RO9;
+extern volatile far struct {
+ unsigned ICODE0:1;
+ unsigned ICODE1:1;
+ unsigned ICODE2:1;
+ unsigned ICODE3:1;
+ unsigned ICODE4:1;
+ unsigned OPMODE:1;
+ unsigned REQOP1:1;
+ unsigned REQOP2:1;
+} CANSTAT_RO9bits;
+extern volatile far unsigned char CANCON_RO9;
+extern volatile far struct {
+ unsigned :1;
+ unsigned WIN0:1;
+ unsigned WIN1:1;
+ unsigned WIN2:1;
+ unsigned ABAT:1;
+ unsigned REQOP0:1;
+ unsigned REQOP1:1;
+ unsigned REQOP2:1;
+} CANCON_RO9bits;
+extern volatile far unsigned char B1CON;
+extern volatile far union {
+ struct {
+ unsigned FILHIT0:1;
+ unsigned FILHIT1:1;
+ unsigned FILHIT2:1;
+ unsigned FILHIT3:1;
+ unsigned FILHIT4:1;
+ unsigned RTRRO:1;
+ unsigned RXM1:1;
+ unsigned RXFUL:1;
+ };
+ struct {
+ unsigned TXPRI0:1;
+ unsigned TXPRI1:1;
+ unsigned RTREN:1;
+ unsigned TXREQ:1;
+ unsigned TXERR:1;
+ unsigned TXLARB:1;
+ unsigned TXABT:1;
+ unsigned TXBIF:1;
+ };
+ struct {
+ unsigned :5;
+ unsigned RXRTRRO:1;
+ };
+} B1CONbits;
+extern volatile far unsigned char B1SIDH;
+extern volatile far struct {
+ unsigned SID3:1;
+ unsigned SID4:1;
+ unsigned SID5:1;
+ unsigned SID6:1;
+ unsigned SID7:1;
+ unsigned SID8:1;
+ unsigned SID9:1;
+ unsigned SID10:1;
+} B1SIDHbits;
+extern volatile far unsigned char B1SIDL;
+extern volatile far union {
+ struct {
+ unsigned EID16:1;
+ unsigned EID17:1;
+ unsigned :1;
+ unsigned EXID:1;
+ unsigned SRR:1;
+ unsigned SID0:1;
+ unsigned SID1:1;
+ unsigned SID2:1;
+ };
+ struct {
+ unsigned :3;
+ unsigned EXIDE:1;
+ };
+} B1SIDLbits;
+extern volatile far unsigned char B1EIDH;
+extern volatile far struct {
+ unsigned EID8:1;
+ unsigned EID9:1;
+ unsigned EID10:1;
+ unsigned EID11:1;
+ unsigned EID12:1;
+ unsigned EID13:1;
+ unsigned EID14:1;
+ unsigned EID15:1;
+} B1EIDHbits;
+extern volatile far unsigned char B1EIDL;
+extern volatile far struct {
+ unsigned EID0:1;
+ unsigned EID1:1;
+ unsigned EID2:1;
+ unsigned EID3:1;
+ unsigned EID4:1;
+ unsigned EID5:1;
+ unsigned EID6:1;
+ unsigned EID7:1;
+} B1EIDLbits;
+extern volatile far unsigned char B1DLC;
+extern volatile far union {
+ struct {
+ unsigned DLC0:1;
+ unsigned DLC1:1;
+ unsigned DLC2:1;
+ unsigned DLC3:1;
+ unsigned RESRB0:1;
+ unsigned RESRB1:1;
+ unsigned RXRTR:1;
+ };
+ struct {
+ unsigned :4;
+ unsigned RB0:1;
+ unsigned RB1:1;
+ };
+ struct {
+ unsigned :6;
+ unsigned TXRTR:1;
+ };
+} B1DLCbits;
+extern volatile far unsigned char B1D0;
+extern volatile far struct {
+ unsigned B1D00:1;
+ unsigned B1D01:1;
+ unsigned B1D02:1;
+ unsigned B1D03:1;
+ unsigned B1D04:1;
+ unsigned B1D05:1;
+ unsigned B1D06:1;
+ unsigned B1D07:1;
+} B1D0bits;
+extern volatile far unsigned char B1D1;
+extern volatile far struct {
+ unsigned B1D10:1;
+ unsigned B1D11:1;
+ unsigned B1D12:1;
+ unsigned B1D13:1;
+ unsigned B1D14:1;
+ unsigned B1D15:1;
+ unsigned B1D16:1;
+ unsigned B1D17:1;
+} B1D1bits;
+extern volatile far unsigned char B1D2;
+extern volatile far struct {
+ unsigned B1D20:1;
+ unsigned B1D21:1;
+ unsigned B1D22:1;
+ unsigned B1D23:1;
+ unsigned B1D24:1;
+ unsigned B1D25:1;
+ unsigned B1D26:1;
+ unsigned B1D27:1;
+} B1D2bits;
+extern volatile far unsigned char B1D3;
+extern volatile far struct {
+ unsigned B1D30:1;
+ unsigned B1D31:1;
+ unsigned B1D32:1;
+ unsigned B1D33:1;
+ unsigned B1D34:1;
+ unsigned B1D35:1;
+ unsigned B1D36:1;
+ unsigned B1D37:1;
+} B1D3bits;
+extern volatile far unsigned char B1D4;
+extern volatile far struct {
+ unsigned B1D40:1;
+ unsigned B1D41:1;
+ unsigned B1D42:1;
+ unsigned B1D43:1;
+ unsigned B1D44:1;
+ unsigned B1D45:1;
+ unsigned B1D46:1;
+ unsigned B1D47:1;
+} B1D4bits;
+extern volatile far unsigned char B1D5;
+extern volatile far struct {
+ unsigned B1D50:1;
+ unsigned B1D51:1;
+ unsigned B1D52:1;
+ unsigned B1D53:1;
+ unsigned B1D54:1;
+ unsigned B1D55:1;
+ unsigned B1D56:1;
+ unsigned B1D57:1;
+} B1D5bits;
+extern volatile far unsigned char B1D6;
+extern volatile far struct {
+ unsigned B1D60:1;
+ unsigned B1D61:1;
+ unsigned B1D62:1;
+ unsigned B1D63:1;
+ unsigned B1D64:1;
+ unsigned B1D65:1;
+ unsigned B1D66:1;
+ unsigned B1D67:1;
+} B1D6bits;
+extern volatile far unsigned char B1D7;
+extern volatile far struct {
+ unsigned B1D70:1;
+ unsigned B1D71:1;
+ unsigned B1D72:1;
+ unsigned B1D73:1;
+ unsigned B1D74:1;
+ unsigned B1D75:1;
+ unsigned B1D76:1;
+ unsigned B1D77:1;
+} B1D7bits;
+extern volatile far unsigned char CANSTAT_RO8;
+extern volatile far struct {
+ unsigned ICODE0:1;
+ unsigned ICODE1:1;
+ unsigned ICODE2:1;
+ unsigned ICODE3:1;
+ unsigned ICODE4:1;
+ unsigned OPMODE:1;
+ unsigned REQOP1:1;
+ unsigned REQOP2:1;
+} CANSTAT_RO8bits;
+extern volatile far unsigned char CANCON_RO8;
+extern volatile far struct {
+ unsigned :1;
+ unsigned WIN0:1;
+ unsigned WIN1:1;
+ unsigned WIN2:1;
+ unsigned ABAT:1;
+ unsigned REQOP0:1;
+ unsigned REQOP1:1;
+ unsigned REQOP2:1;
+} CANCON_RO8bits;
+extern volatile far unsigned char B2CON;
+extern volatile far union {
+ struct {
+ unsigned FILHIT0:1;
+ unsigned FILHIT1:1;
+ unsigned FILHIT2:1;
+ unsigned FILHIT3:1;
+ unsigned FILHIT4:1;
+ unsigned RTRRO:1;
+ unsigned RXM1:1;
+ unsigned RXFUL:1;
+ };
+ struct {
+ unsigned TXPRI0:1;
+ unsigned TXPRI1:1;
+ unsigned RTREN:1;
+ unsigned TXREQ:1;
+ unsigned TXERR:1;
+ unsigned TXLARB:1;
+ unsigned TXABT:1;
+ unsigned TXBIF:1;
+ };
+ struct {
+ unsigned :5;
+ unsigned RXRTRRO:1;
+ };
+} B2CONbits;
+extern volatile far unsigned char B2SIDH;
+extern volatile far struct {
+ unsigned SID3:1;
+ unsigned SID4:1;
+ unsigned SID5:1;
+ unsigned SID6:1;
+ unsigned SID7:1;
+ unsigned SID8:1;
+ unsigned SID9:1;
+ unsigned SID10:1;
+} B2SIDHbits;
+extern volatile far unsigned char B2SIDL;
+extern volatile far union {
+ struct {
+ unsigned EID16:1;
+ unsigned EID17:1;
+ unsigned :1;
+ unsigned EXID:1;
+ unsigned SRR:1;
+ unsigned SID0:1;
+ unsigned SID1:1;
+ unsigned SID2:1;
+ };
+ struct {
+ unsigned :3;
+ unsigned EXIDE:1;
+ };
+} B2SIDLbits;
+extern volatile far unsigned char B2EIDH;
+extern volatile far struct {
+ unsigned EID8:1;
+ unsigned EID9:1;
+ unsigned EID10:1;
+ unsigned EID11:1;
+ unsigned EID12:1;
+ unsigned EID13:1;
+ unsigned EID14:1;
+ unsigned EID15:1;
+} B2EIDHbits;
+extern volatile far unsigned char B2EIDL;
+extern volatile far struct {
+ unsigned EID0:1;
+ unsigned EID1:1;
+ unsigned EID2:1;
+ unsigned EID3:1;
+ unsigned EID4:1;
+ unsigned EID5:1;
+ unsigned EID6:1;
+ unsigned EID7:1;
+} B2EIDLbits;
+extern volatile far unsigned char B2DLC;
+extern volatile far union {
+ struct {
+ unsigned DLC0:1;
+ unsigned DLC1:1;
+ unsigned DLC2:1;
+ unsigned DLC3:1;
+ unsigned RESRB0:1;
+ unsigned RESRB1:1;
+ unsigned RXRTR:1;
+ };
+ struct {
+ unsigned :6;
+ unsigned TXRTR:1;
+ };
+ struct {
+ unsigned :4;
+ unsigned RB0:1;
+ unsigned RB1:1;
+ };
+} B2DLCbits;
+extern volatile far unsigned char B2D0;
+extern volatile far struct {
+ unsigned B2D00:1;
+ unsigned B2D01:1;
+ unsigned B2D02:1;
+ unsigned B2D03:1;
+ unsigned B2D04:1;
+ unsigned B2D05:1;
+ unsigned B2D06:1;
+ unsigned B2D07:1;
+} B2D0bits;
+extern volatile far unsigned char B2D1;
+extern volatile far struct {
+ unsigned B2D10:1;
+ unsigned B2D11:1;
+ unsigned B2D12:1;
+ unsigned B2D13:1;
+ unsigned B2D14:1;
+ unsigned B2D15:1;
+ unsigned B2D16:1;
+ unsigned B2D17:1;
+} B2D1bits;
+extern volatile far unsigned char B2D2;
+extern volatile far struct {
+ unsigned B2D20:1;
+ unsigned B2D21:1;
+ unsigned B2D22:1;
+ unsigned B2D23:1;
+ unsigned B2D24:1;
+ unsigned B2D25:1;
+ unsigned B2D26:1;
+ unsigned B2D27:1;
+} B2D2bits;
+extern volatile far unsigned char B2D3;
+extern volatile far struct {
+ unsigned B2D30:1;
+ unsigned B2D31:1;
+ unsigned B2D32:1;
+ unsigned B2D33:1;
+ unsigned B2D34:1;
+ unsigned B2D35:1;
+ unsigned B2D36:1;
+ unsigned B2D37:1;
+} B2D3bits;
+extern volatile far unsigned char B2D4;
+extern volatile far struct {
+ unsigned B2D40:1;
+ unsigned B2D41:1;
+ unsigned B2D42:1;
+ unsigned B2D43:1;
+ unsigned B2D44:1;
+ unsigned B2D45:1;
+ unsigned B2D46:1;
+ unsigned B2D47:1;
+} B2D4bits;
+extern volatile far unsigned char B2D5;
+extern volatile far struct {
+ unsigned B2D50:1;
+ unsigned B2D51:1;
+ unsigned B2D52:1;
+ unsigned B2D53:1;
+ unsigned B2D54:1;
+ unsigned B2D55:1;
+ unsigned B2D56:1;
+ unsigned B2D57:1;
+} B2D5bits;
+extern volatile far unsigned char B2D6;
+extern volatile far struct {
+ unsigned B2D60:1;
+ unsigned B2D61:1;
+ unsigned B2D62:1;
+ unsigned B2D63:1;
+ unsigned B2D64:1;
+ unsigned B2D65:1;
+ unsigned B2D66:1;
+ unsigned B2D67:1;
+} B2D6bits;
+extern volatile far unsigned char B2D7;
+extern volatile far struct {
+ unsigned B2D70:1;
+ unsigned B2D71:1;
+ unsigned B2D72:1;
+ unsigned B2D73:1;
+ unsigned B2D74:1;
+ unsigned B2D75:1;
+ unsigned B2D76:1;
+ unsigned B2D77:1;
+} B2D7bits;
+extern volatile far unsigned char CANSTAT_RO7;
+extern volatile far struct {
+ unsigned ICODE0:1;
+ unsigned ICODE1:1;
+ unsigned ICODE2:1;
+ unsigned ICODE3:1;
+ unsigned ICODE4:1;
+ unsigned OPMODE:1;
+ unsigned REQOP1:1;
+ unsigned REQOP2:1;
+} CANSTAT_RO7bits;
+extern volatile far unsigned char CANCON_RO7;
+extern volatile far struct {
+ unsigned :1;
+ unsigned WIN0:1;
+ unsigned WIN1:1;
+ unsigned WIN2:1;
+ unsigned ABAT:1;
+ unsigned REQOP0:1;
+ unsigned REQOP1:1;
+ unsigned REQOP2:1;
+} CANCON_RO7bits;
+extern volatile far unsigned char B3CON;
+extern volatile far union {
+ struct {
+ unsigned FILHIT0:1;
+ unsigned FILHIT1:1;
+ unsigned FILHIT2:1;
+ unsigned FILHIT3:1;
+ unsigned FILHIT4:1;
+ unsigned RTRRO:1;
+ unsigned RXM1:1;
+ unsigned RXFUL:1;
+ };
+ struct {
+ unsigned TXPRI0:1;
+ unsigned TXPRI1:1;
+ unsigned RTREN:1;
+ unsigned TXREQ:1;
+ unsigned TXERR:1;
+ unsigned TXLARB:1;
+ unsigned TXABT:1;
+ unsigned TXBIF:1;
+ };
+ struct {
+ unsigned :5;
+ unsigned RXRTRRO:1;
+ };
+} B3CONbits;
+extern volatile far unsigned char B3SIDH;
+extern volatile far struct {
+ unsigned SID3:1;
+ unsigned SID4:1;
+ unsigned SID5:1;
+ unsigned SID6:1;
+ unsigned SID7:1;
+ unsigned SID8:1;
+ unsigned SID9:1;
+ unsigned SID10:1;
+} B3SIDHbits;
+extern volatile far unsigned char B3SIDL;
+extern volatile far union {
+ struct {
+ unsigned EID16:1;
+ unsigned EID17:1;
+ unsigned :1;
+ unsigned EXID:1;
+ unsigned SRR:1;
+ unsigned SID0:1;
+ unsigned SID1:1;
+ unsigned SID2:1;
+ };
+ struct {
+ unsigned :3;
+ unsigned EXIDE:1;
+ };
+} B3SIDLbits;
+extern volatile far unsigned char B3EIDH;
+extern volatile far struct {
+ unsigned EID8:1;
+ unsigned EID9:1;
+ unsigned EID10:1;
+ unsigned EID11:1;
+ unsigned EID12:1;
+ unsigned EID13:1;
+ unsigned EID14:1;
+ unsigned EID15:1;
+} B3EIDHbits;
+extern volatile far unsigned char B3EIDL;
+extern volatile far struct {
+ unsigned EID0:1;
+ unsigned EID1:1;
+ unsigned EID2:1;
+ unsigned EID3:1;
+ unsigned EID4:1;
+ unsigned EID5:1;
+ unsigned EID6:1;
+ unsigned EID7:1;
+} B3EIDLbits;
+extern volatile far unsigned char B3DLC;
+extern volatile far union {
+ struct {
+ unsigned DLC0:1;
+ unsigned DLC1:1;
+ unsigned DLC2:1;
+ unsigned DLC3:1;
+ unsigned RESRB0:1;
+ unsigned RESRB1:1;
+ unsigned RXRTR:1;
+ };
+ struct {
+ unsigned :6;
+ unsigned TXRTR:1;
+ };
+ struct {
+ unsigned :4;
+ unsigned RB0:1;
+ unsigned RB1:1;
+ };
+} B3DLCbits;
+extern volatile far unsigned char B3D0;
+extern volatile far struct {
+ unsigned B3D00:1;
+ unsigned B3D01:1;
+ unsigned B3D02:1;
+ unsigned B3D03:1;
+ unsigned B3D04:1;
+ unsigned B3D05:1;
+ unsigned B3D06:1;
+ unsigned B3D07:1;
+} B3D0bits;
+extern volatile far unsigned char B3D1;
+extern volatile far struct {
+ unsigned B3D10:1;
+ unsigned B3D11:1;
+ unsigned B3D12:1;
+ unsigned B3D13:1;
+ unsigned B3D14:1;
+ unsigned B3D15:1;
+ unsigned B3D16:1;
+ unsigned B3D17:1;
+} B3D1bits;
+extern volatile far unsigned char B3D2;
+extern volatile far struct {
+ unsigned B3D20:1;
+ unsigned B3D21:1;
+ unsigned B3D22:1;
+ unsigned B3D23:1;
+ unsigned B3D24:1;
+ unsigned B3D25:1;
+ unsigned B3D26:1;
+ unsigned B3D27:1;
+} B3D2bits;
+extern volatile far unsigned char B3D3;
+extern volatile far struct {
+ unsigned B3D30:1;
+ unsigned B3D31:1;
+ unsigned B3D32:1;
+ unsigned B3D33:1;
+ unsigned B3D34:1;
+ unsigned B3D35:1;
+ unsigned B3D36:1;
+ unsigned B3D37:1;
+} B3D3bits;
+extern volatile far unsigned char B3D4;
+extern volatile far struct {
+ unsigned B3D40:1;
+ unsigned B3D41:1;
+ unsigned B3D42:1;
+ unsigned B3D43:1;
+ unsigned B3D44:1;
+ unsigned B3D45:1;
+ unsigned B3D46:1;
+ unsigned B3D47:1;
+} B3D4bits;
+extern volatile far unsigned char B3D5;
+extern volatile far struct {
+ unsigned B3D50:1;
+ unsigned B3D51:1;
+ unsigned B3D52:1;
+ unsigned B3D53:1;
+ unsigned B3D54:1;
+ unsigned B3D55:1;
+ unsigned B3D56:1;
+ unsigned B3D57:1;
+} B3D5bits;
+extern volatile far unsigned char B3D6;
+extern volatile far struct {
+ unsigned B3D60:1;
+ unsigned B3D61:1;
+ unsigned B3D62:1;
+ unsigned B3D63:1;
+ unsigned B3D64:1;
+ unsigned B3D65:1;
+ unsigned B3D66:1;
+ unsigned B3D67:1;
+} B3D6bits;
+extern volatile far unsigned char B3D7;
+extern volatile far struct {
+ unsigned B3D70:1;
+ unsigned B3D71:1;
+ unsigned B3D72:1;
+ unsigned B3D73:1;
+ unsigned B3D74:1;
+ unsigned B3D75:1;
+ unsigned B3D76:1;
+ unsigned B3D77:1;
+} B3D7bits;
+extern volatile far unsigned char CANSTAT_RO6;
+extern volatile far struct {
+ unsigned ICODE0:1;
+ unsigned ICODE1:1;
+ unsigned ICODE2:1;
+ unsigned ICODE3:1;
+ unsigned ICODE4:1;
+ unsigned OPMODE:1;
+ unsigned REQOP1:1;
+ unsigned REQOP2:1;
+} CANSTAT_RO6bits;
+extern volatile far unsigned char CANCON_RO6;
+extern volatile far struct {
+ unsigned :1;
+ unsigned WIN0:1;
+ unsigned WIN1:1;
+ unsigned WIN2:1;
+ unsigned ABAT:1;
+ unsigned REQOP0:1;
+ unsigned REQOP1:1;
+ unsigned REQOP2:1;
+} CANCON_RO6bits;
+extern volatile far unsigned char B4CON;
+extern volatile far union {
+ struct {
+ unsigned FILHIT0:1;
+ unsigned FILHIT1:1;
+ unsigned FILHIT2:1;
+ unsigned FILHIT3:1;
+ unsigned FILHIT4:1;
+ unsigned RTRRO:1;
+ unsigned RXM1:1;
+ unsigned RXFUL:1;
+ };
+ struct {
+ unsigned TXPRI0:1;
+ unsigned TXPRI1:1;
+ unsigned RTREN:1;
+ unsigned TXREQ:1;
+ unsigned TXERR:1;
+ unsigned TXLARB:1;
+ unsigned TXABT:1;
+ unsigned TXBIF:1;
+ };
+ struct {
+ unsigned :5;
+ unsigned RXRTRRO:1;
+ };
+} B4CONbits;
+extern volatile far unsigned char B4SIDH;
+extern volatile far struct {
+ unsigned SID3:1;
+ unsigned SID4:1;
+ unsigned SID5:1;
+ unsigned SID6:1;
+ unsigned SID7:1;
+ unsigned SID8:1;
+ unsigned SID9:1;
+ unsigned SID10:1;
+} B4SIDHbits;
+extern volatile far unsigned char B4SIDL;
+extern volatile far union {
+ struct {
+ unsigned EID16:1;
+ unsigned EID17:1;
+ unsigned :1;
+ unsigned EXID:1;
+ unsigned SRR:1;
+ unsigned SID0:1;
+ unsigned SID1:1;
+ unsigned SID2:1;
+ };
+ struct {
+ unsigned :3;
+ unsigned EXIDE:1;
+ };
+} B4SIDLbits;
+extern volatile far unsigned char B4EIDH;
+extern volatile far struct {
+ unsigned EID8:1;
+ unsigned EID9:1;
+ unsigned EID10:1;
+ unsigned EID11:1;
+ unsigned EID12:1;
+ unsigned EID13:1;
+ unsigned EID14:1;
+ unsigned EID15:1;
+} B4EIDHbits;
+extern volatile far unsigned char B4EIDL;
+extern volatile far struct {
+ unsigned EID0:1;
+ unsigned EID1:1;
+ unsigned EID2:1;
+ unsigned EID3:1;
+ unsigned EID4:1;
+ unsigned EID5:1;
+ unsigned EID6:1;
+ unsigned EID7:1;
+} B4EIDLbits;
+extern volatile far unsigned char B4DLC;
+extern volatile far union {
+ struct {
+ unsigned DLC0:1;
+ unsigned DLC1:1;
+ unsigned DLC2:1;
+ unsigned DLC3:1;
+ unsigned RESRB0:1;
+ unsigned RESRB1:1;
+ unsigned RXRTR:1;
+ };
+ struct {
+ unsigned :6;
+ unsigned TXRTR:1;
+ };
+ struct {
+ unsigned :4;
+ unsigned RB0:1;
+ unsigned RB1:1;
+ };
+} B4DLCbits;
+extern volatile far unsigned char B4D0;
+extern volatile far struct {
+ unsigned B4D00:1;
+ unsigned B4D01:1;
+ unsigned B4D02:1;
+ unsigned B4D03:1;
+ unsigned B4D04:1;
+ unsigned B4D05:1;
+ unsigned B4D06:1;
+ unsigned B4D07:1;
+} B4D0bits;
+extern volatile far unsigned char B4D1;
+extern volatile far struct {
+ unsigned B4D10:1;
+ unsigned B4D11:1;
+ unsigned B4D12:1;
+ unsigned B4D13:1;
+ unsigned B4D14:1;
+ unsigned B4D15:1;
+ unsigned B4D16:1;
+ unsigned B4D17:1;
+} B4D1bits;
+extern volatile far unsigned char B4D2;
+extern volatile far struct {
+ unsigned B4D20:1;
+ unsigned B4D21:1;
+ unsigned B4D22:1;
+ unsigned B4D23:1;
+ unsigned B4D24:1;
+ unsigned B4D25:1;
+ unsigned B4D26:1;
+ unsigned B4D27:1;
+} B4D2bits;
+extern volatile far unsigned char B4D3;
+extern volatile far struct {
+ unsigned B4D30:1;
+ unsigned B4D31:1;
+ unsigned B4D32:1;
+ unsigned B4D33:1;
+ unsigned B4D34:1;
+ unsigned B4D35:1;
+ unsigned B4D36:1;
+ unsigned B4D37:1;
+} B4D3bits;
+extern volatile far unsigned char B4D4;
+extern volatile far struct {
+ unsigned B4D40:1;
+ unsigned B4D41:1;
+ unsigned B4D42:1;
+ unsigned B4D43:1;
+ unsigned B4D44:1;
+ unsigned B4D45:1;
+ unsigned B4D46:1;
+ unsigned B4D47:1;
+} B4D4bits;
+extern volatile far unsigned char B4D5;
+extern volatile far struct {
+ unsigned B4D50:1;
+ unsigned B4D51:1;
+ unsigned B4D52:1;
+ unsigned B4D53:1;
+ unsigned B4D54:1;
+ unsigned B4D55:1;
+ unsigned B4D56:1;
+ unsigned B4D57:1;
+} B4D5bits;
+extern volatile far unsigned char B4D6;
+extern volatile far struct {
+ unsigned B4D60:1;
+ unsigned B4D61:1;
+ unsigned B4D62:1;
+ unsigned B4D63:1;
+ unsigned B4D64:1;
+ unsigned B4D65:1;
+ unsigned B4D66:1;
+ unsigned B4D67:1;
+} B4D6bits;
+extern volatile far unsigned char B4D7;
+extern volatile far union {
+ struct {
+ unsigned B4D70:1;
+ unsigned B4D71:1;
+ unsigned B4D72:1;
+ unsigned B4D73:1;
+ unsigned B4D74:1;
+ unsigned B4D75:1;
+ unsigned B4D76:1;
+ unsigned B46D77:1;
+ };
+ struct {
+ unsigned :7;
+ unsigned B4D77:1;
+ };
+} B4D7bits;
+extern volatile far unsigned char CANSTAT_RO5;
+extern volatile far struct {
+ unsigned ICODE0:1;
+ unsigned ICODE1:1;
+ unsigned ICODE2:1;
+ unsigned ICODE3:1;
+ unsigned ICODE4:1;
+ unsigned OPMODE:1;
+ unsigned REQOP1:1;
+ unsigned REQOP2:1;
+} CANSTAT_RO5bits;
+extern volatile far unsigned char CANCON_RO5;
+extern volatile far struct {
+ unsigned :1;
+ unsigned WIN0:1;
+ unsigned WIN1:1;
+ unsigned WIN2:1;
+ unsigned ABAT:1;
+ unsigned REQOP0:1;
+ unsigned REQOP1:1;
+ unsigned REQOP2:1;
+} CANCON_RO5bits;
+extern volatile far unsigned char B5CON;
+extern volatile far union {
+ struct {
+ unsigned FILHIT0:1;
+ unsigned FILHIT1:1;
+ unsigned FILHIT2:1;
+ unsigned FILHIT3:1;
+ unsigned FILHIT4:1;
+ unsigned RTRRO:1;
+ unsigned RXM1:1;
+ unsigned RXFUL:1;
+ };
+ struct {
+ unsigned TXPRI0:1;
+ unsigned TXPRI1:1;
+ unsigned RTREN:1;
+ unsigned TXREQ:1;
+ unsigned TXERR:1;
+ unsigned TXLARB:1;
+ unsigned TXABT:1;
+ unsigned TXBIF:1;
+ };
+ struct {
+ unsigned :5;
+ unsigned RXRTRRO:1;
+ };
+} B5CONbits;
+extern volatile far unsigned char B5SIDH;
+extern volatile far struct {
+ unsigned SID3:1;
+ unsigned SID4:1;
+ unsigned SID5:1;
+ unsigned SID6:1;
+ unsigned SID7:1;
+ unsigned SID8:1;
+ unsigned SID9:1;
+ unsigned SID10:1;
+} B5SIDHbits;
+extern volatile far unsigned char B5SIDL;
+extern volatile far union {
+ struct {
+ unsigned EID16:1;
+ unsigned EID17:1;
+ unsigned :1;
+ unsigned EXID:1;
+ unsigned SRR:1;
+ unsigned SID0:1;
+ unsigned SID1:1;
+ unsigned SID2:1;
+ };
+ struct {
+ unsigned :3;
+ unsigned EXIDEN:1;
+ };
+} B5SIDLbits;
+extern volatile far unsigned char B5EIDH;
+extern volatile far struct {
+ unsigned EID8:1;
+ unsigned EID9:1;
+ unsigned EID10:1;
+ unsigned EID11:1;
+ unsigned EID12:1;
+ unsigned EID13:1;
+ unsigned EID14:1;
+ unsigned EID15:1;
+} B5EIDHbits;
+extern volatile far unsigned char B5EIDL;
+extern volatile far struct {
+ unsigned EID0:1;
+ unsigned EID1:1;
+ unsigned EID2:1;
+ unsigned EID3:1;
+ unsigned EID4:1;
+ unsigned EID5:1;
+ unsigned EID6:1;
+ unsigned EID7:1;
+} B5EIDLbits;
+extern volatile far unsigned char B5DLC;
+extern volatile far union {
+ struct {
+ unsigned DLC0:1;
+ unsigned DLC1:1;
+ unsigned DLC2:1;
+ unsigned DLC3:1;
+ unsigned RESRB0:1;
+ unsigned RESRB1:1;
+ unsigned RXRTR:1;
+ };
+ struct {
+ unsigned :4;
+ unsigned RB0:1;
+ unsigned RB1:1;
+ };
+} B5DLCbits;
+extern volatile far unsigned char B5D0;
+extern volatile far union {
+ struct {
+ unsigned B5D00:1;
+ unsigned B5D01:1;
+ unsigned B5D02:1;
+ unsigned B5D03:1;
+ unsigned B5D04:1;
+ unsigned B5D05:1;
+ unsigned B5D06:1;
+ unsigned B57D07:1;
+ };
+ struct {
+ unsigned :7;
+ unsigned B5D07:1;
+ };
+} B5D0bits;
+extern volatile far unsigned char B5D1;
+extern volatile far struct {
+ unsigned B5D10:1;
+ unsigned B5D11:1;
+ unsigned B5D12:1;
+ unsigned B5D13:1;
+ unsigned B5D14:1;
+ unsigned B5D15:1;
+ unsigned B5D16:1;
+ unsigned B5D17:1;
+} B5D1bits;
+extern volatile far unsigned char B5D2;
+extern volatile far union {
+ struct {
+ unsigned B5D20:1;
+ unsigned B5D21:1;
+ unsigned B5D22:1;
+ unsigned B57D23:1;
+ unsigned B5D24:1;
+ unsigned B5D25:1;
+ unsigned B5D26:1;
+ unsigned B5D27:1;
+ };
+ struct {
+ unsigned :3;
+ unsigned B5D23:1;
+ };
+} B5D2bits;
+extern volatile far unsigned char B5D3;
+extern volatile far struct {
+ unsigned B5D30:1;
+ unsigned B5D31:1;
+ unsigned B5D32:1;
+ unsigned B5D33:1;
+ unsigned B5D34:1;
+ unsigned B5D35:1;
+ unsigned B5D36:1;
+ unsigned B5D37:1;
+} B5D3bits;
+extern volatile far unsigned char B5D4;
+extern volatile far struct {
+ unsigned B5D40:1;
+ unsigned B5D41:1;
+ unsigned B5D42:1;
+ unsigned B5D43:1;
+ unsigned B5D44:1;
+ unsigned B5D45:1;
+ unsigned B5D46:1;
+ unsigned B5D47:1;
+} B5D4bits;
+extern volatile far unsigned char B5D5;
+extern volatile far struct {
+ unsigned B5D50:1;
+ unsigned B5D51:1;
+ unsigned B5D52:1;
+ unsigned B5D53:1;
+ unsigned B5D54:1;
+ unsigned B5D55:1;
+ unsigned B5D56:1;
+ unsigned B5D57:1;
+} B5D5bits;
+extern volatile far unsigned char B5D6;
+extern volatile far struct {
+ unsigned B5D60:1;
+ unsigned B5D61:1;
+ unsigned B5D62:1;
+ unsigned B5D63:1;
+ unsigned B5D64:1;
+ unsigned B5D65:1;
+ unsigned B5D66:1;
+ unsigned B5D67:1;
+} B5D6bits;
+extern volatile far unsigned char B5D7;
+extern volatile far struct {
+ unsigned B5D70:1;
+ unsigned B5D71:1;
+ unsigned B5D72:1;
+ unsigned B5D73:1;
+ unsigned B5D74:1;
+ unsigned B5D75:1;
+ unsigned B5D76:1;
+ unsigned B5D77:1;
+} B5D7bits;
+extern volatile far unsigned char CANSTAT_RO4;
+extern volatile far struct {
+ unsigned ICODE0:1;
+ unsigned ICODE1:1;
+ unsigned ICODE2:1;
+ unsigned ICODE3:1;
+ unsigned ICODE4:1;
+ unsigned OPMODE:1;
+ unsigned REQOP1:1;
+ unsigned REQOP2:1;
+} CANSTAT_RO4bits;
+extern volatile far unsigned char CANCON_RO4;
+extern volatile far struct {
+ unsigned :1;
+ unsigned WIN0:1;
+ unsigned WIN1:1;
+ unsigned WIN2:1;
+ unsigned ABAT:1;
+ unsigned REQOP0:1;
+ unsigned REQOP1:1;
+ unsigned REQOP2:1;
+} CANCON_RO4bits;
+extern volatile far unsigned char RXF0SIDH;
+extern volatile far struct {
+ unsigned SID3:1;
+ unsigned SID4:1;
+ unsigned SID5:1;
+ unsigned SID6:1;
+ unsigned SID7:1;
+ unsigned SID8:1;
+ unsigned SID9:1;
+ unsigned SID10:1;
+} RXF0SIDHbits;
+extern volatile far unsigned char RXF0SIDL;
+extern volatile far union {
+ struct {
+ unsigned EID16:1;
+ unsigned EID17:1;
+ unsigned :1;
+ unsigned EXIDE:1;
+ unsigned :1;
+ unsigned SID0:1;
+ unsigned SID1:1;
+ unsigned SID2:1;
+ };
+ struct {
+ unsigned :3;
+ unsigned EXIDEN:1;
+ };
+} RXF0SIDLbits;
+extern volatile far unsigned char RXF0EIDH;
+extern volatile far struct {
+ unsigned EID8:1;
+ unsigned EID9:1;
+ unsigned EID10:1;
+ unsigned EID11:1;
+ unsigned EID12:1;
+ unsigned EID13:1;
+ unsigned EID14:1;
+ unsigned EID15:1;
+} RXF0EIDHbits;
+extern volatile far unsigned char RXF0EIDL;
+extern volatile far struct {
+ unsigned EID0:1;
+ unsigned EID1:1;
+ unsigned EID2:1;
+ unsigned EID3:1;
+ unsigned EID4:1;
+ unsigned EID5:1;
+ unsigned EID6:1;
+ unsigned EID7:1;
+} RXF0EIDLbits;
+extern volatile far unsigned char RXF1SIDH;
+extern volatile far struct {
+ unsigned SID3:1;
+ unsigned SID4:1;
+ unsigned SID5:1;
+ unsigned SID6:1;
+ unsigned SID7:1;
+ unsigned SID8:1;
+ unsigned SID9:1;
+ unsigned SID10:1;
+} RXF1SIDHbits;
+extern volatile far unsigned char RXF1SIDL;
+extern volatile far union {
+ struct {
+ unsigned EID16:1;
+ unsigned EID17:1;
+ unsigned :1;
+ unsigned EXIDE:1;
+ unsigned :1;
+ unsigned SID0:1;
+ unsigned SID1:1;
+ unsigned SID2:1;
+ };
+ struct {
+ unsigned :3;
+ unsigned EXIDEN:1;
+ };
+} RXF1SIDLbits;
+extern volatile far unsigned char RXF1EIDH;
+extern volatile far struct {
+ unsigned EID8:1;
+ unsigned EID9:1;
+ unsigned EID10:1;
+ unsigned EID11:1;
+ unsigned EID12:1;
+ unsigned EID13:1;
+ unsigned EID14:1;
+ unsigned EID15:1;
+} RXF1EIDHbits;
+extern volatile far unsigned char RXF1EIDL;
+extern volatile far struct {
+ unsigned EID0:1;
+ unsigned EID1:1;
+ unsigned EID2:1;
+ unsigned EID3:1;
+ unsigned EID4:1;
+ unsigned EID5:1;
+ unsigned EID6:1;
+ unsigned EID7:1;
+} RXF1EIDLbits;
+extern volatile far unsigned char RXF2SIDH;
+extern volatile far struct {
+ unsigned SID3:1;
+ unsigned SID4:1;
+ unsigned SID5:1;
+ unsigned SID6:1;
+ unsigned SID7:1;
+ unsigned SID8:1;
+ unsigned SID9:1;
+ unsigned SID10:1;
+} RXF2SIDHbits;
+extern volatile far unsigned char RXF2SIDL;
+extern volatile far union {
+ struct {
+ unsigned EID16:1;
+ unsigned EID17:1;
+ unsigned :1;
+ unsigned EXIDE:1;
+ unsigned :1;
+ unsigned SID0:1;
+ unsigned SID1:1;
+ unsigned SID2:1;
+ };
+ struct {
+ unsigned :3;
+ unsigned EXIDEN:1;
+ };
+} RXF2SIDLbits;
+extern volatile far unsigned char RXF2EIDH;
+extern volatile far struct {
+ unsigned EID8:1;
+ unsigned EID9:1;
+ unsigned EID10:1;
+ unsigned EID11:1;
+ unsigned EID12:1;
+ unsigned EID13:1;
+ unsigned EID14:1;
+ unsigned EID15:1;
+} RXF2EIDHbits;
+extern volatile far unsigned char RXF2EIDL;
+extern volatile far struct {
+ unsigned EID0:1;
+ unsigned EID1:1;
+ unsigned EID2:1;
+ unsigned EID3:1;
+ unsigned EID4:1;
+ unsigned EID5:1;
+ unsigned EID6:1;
+ unsigned EID7:1;
+} RXF2EIDLbits;
+extern volatile far unsigned char RXF3SIDH;
+extern volatile far struct {
+ unsigned SID3:1;
+ unsigned SID4:1;
+ unsigned SID5:1;
+ unsigned SID6:1;
+ unsigned SID7:1;
+ unsigned SID8:1;
+ unsigned SID9:1;
+ unsigned SID10:1;
+} RXF3SIDHbits;
+extern volatile far unsigned char RXF3SIDL;
+extern volatile far union {
+ struct {
+ unsigned EID16:1;
+ unsigned EID17:1;
+ unsigned :1;
+ unsigned EXIDE:1;
+ unsigned :1;
+ unsigned SID0:1;
+ unsigned SID1:1;
+ unsigned SID2:1;
+ };
+ struct {
+ unsigned :3;
+ unsigned EXIDEN:1;
+ };
+} RXF3SIDLbits;
+extern volatile far unsigned char RXF3EIDH;
+extern volatile far struct {
+ unsigned EID8:1;
+ unsigned EID9:1;
+ unsigned EID10:1;
+ unsigned EID11:1;
+ unsigned EID12:1;
+ unsigned EID13:1;
+ unsigned EID14:1;
+ unsigned EID15:1;
+} RXF3EIDHbits;
+extern volatile far unsigned char RXF3EIDL;
+extern volatile far struct {
+ unsigned EID0:1;
+ unsigned EID1:1;
+ unsigned EID2:1;
+ unsigned EID3:1;
+ unsigned EID4:1;
+ unsigned EID5:1;
+ unsigned EID6:1;
+ unsigned EID7:1;
+} RXF3EIDLbits;
+extern volatile far unsigned char RXF4SIDH;
+extern volatile far struct {
+ unsigned SID3:1;
+ unsigned SID4:1;
+ unsigned SID5:1;
+ unsigned SID6:1;
+ unsigned SID7:1;
+ unsigned SID8:1;
+ unsigned SID9:1;
+ unsigned SID10:1;
+} RXF4SIDHbits;
+extern volatile far unsigned char RXF4SIDL;
+extern volatile far union {
+ struct {
+ unsigned EID16:1;
+ unsigned EID17:1;
+ unsigned :1;
+ unsigned EXIDE:1;
+ unsigned :1;
+ unsigned SID0:1;
+ unsigned SID1:1;
+ unsigned SID2:1;
+ };
+ struct {
+ unsigned :3;
+ unsigned EXIDEN:1;
+ };
+} RXF4SIDLbits;
+extern volatile far unsigned char RXF4EIDH;
+extern volatile far struct {
+ unsigned EID8:1;
+ unsigned EID9:1;
+ unsigned EID10:1;
+ unsigned EID11:1;
+ unsigned EID12:1;
+ unsigned EID13:1;
+ unsigned EID14:1;
+ unsigned EID15:1;
+} RXF4EIDHbits;
+extern volatile far unsigned char RXF4EIDL;
+extern volatile far struct {
+ unsigned EID0:1;
+ unsigned EID1:1;
+ unsigned EID2:1;
+ unsigned EID3:1;
+ unsigned EID4:1;
+ unsigned EID5:1;
+ unsigned EID6:1;
+ unsigned EID7:1;
+} RXF4EIDLbits;
+extern volatile far unsigned char RXF5SIDH;
+extern volatile far struct {
+ unsigned SID3:1;
+ unsigned SID4:1;
+ unsigned SID5:1;
+ unsigned SID6:1;
+ unsigned SID7:1;
+ unsigned SID8:1;
+ unsigned SID9:1;
+ unsigned SID10:1;
+} RXF5SIDHbits;
+extern volatile far unsigned char RXF5SIDL;
+extern volatile far union {
+ struct {
+ unsigned EID16:1;
+ unsigned EID17:1;
+ unsigned :1;
+ unsigned EXIDE:1;
+ unsigned :1;
+ unsigned SID0:1;
+ unsigned SID1:1;
+ unsigned SID2:1;
+ };
+ struct {
+ unsigned :3;
+ unsigned EXIDEN:1;
+ };
+} RXF5SIDLbits;
+extern volatile far unsigned char RXF5EIDH;
+extern volatile far struct {
+ unsigned EID8:1;
+ unsigned EID9:1;
+ unsigned EID10:1;
+ unsigned EID11:1;
+ unsigned EID12:1;
+ unsigned EID13:1;
+ unsigned EID14:1;
+ unsigned EID15:1;
+} RXF5EIDHbits;
+extern volatile far unsigned char RXF5EIDL;
+extern volatile far struct {
+ unsigned EID0:1;
+ unsigned EID1:1;
+ unsigned EID2:1;
+ unsigned EID3:1;
+ unsigned EID4:1;
+ unsigned EID5:1;
+ unsigned EID6:1;
+ unsigned EID7:1;
+} RXF5EIDLbits;
+extern volatile far unsigned char RXM0SIDH;
+extern volatile far struct {
+ unsigned SID3:1;
+ unsigned SID4:1;
+ unsigned SID5:1;
+ unsigned SID6:1;
+ unsigned SID7:1;
+ unsigned SID8:1;
+ unsigned SID9:1;
+ unsigned SID10:1;
+} RXM0SIDHbits;
+extern volatile far unsigned char RXM0SIDL;
+extern volatile far struct {
+ unsigned EID16:1;
+ unsigned EID17:1;
+ unsigned :1;
+ unsigned EXIDEN:1;
+ unsigned :1;
+ unsigned SID0:1;
+ unsigned SID1:1;
+ unsigned SID2:1;
+} RXM0SIDLbits;
+extern volatile far unsigned char RXM0EIDH;
+extern volatile far struct {
+ unsigned EID8:1;
+ unsigned EID9:1;
+ unsigned EID10:1;
+ unsigned EID11:1;
+ unsigned EID12:1;
+ unsigned EID13:1;
+ unsigned EID14:1;
+ unsigned EID15:1;
+} RXM0EIDHbits;
+extern volatile far unsigned char RXM0EIDL;
+extern volatile far struct {
+ unsigned EID0:1;
+ unsigned EID1:1;
+ unsigned EID2:1;
+ unsigned EID3:1;
+ unsigned EID4:1;
+ unsigned EID5:1;
+ unsigned EID6:1;
+ unsigned EID7:1;
+} RXM0EIDLbits;
+extern volatile far unsigned char RXM1SIDH;
+extern volatile far struct {
+ unsigned SID3:1;
+ unsigned SID4:1;
+ unsigned SID5:1;
+ unsigned SID6:1;
+ unsigned SID7:1;
+ unsigned SID8:1;
+ unsigned SID9:1;
+ unsigned SID10:1;
+} RXM1SIDHbits;
+extern volatile far unsigned char RXM1SIDL;
+extern volatile far struct {
+ unsigned EID16:1;
+ unsigned EID17:1;
+ unsigned :1;
+ unsigned EXIDEN:1;
+ unsigned :1;
+ unsigned SID0:1;
+ unsigned SID1:1;
+ unsigned SID2:1;
+} RXM1SIDLbits;
+extern volatile far unsigned char RXM1EIDH;
+extern volatile far struct {
+ unsigned EID8:1;
+ unsigned EID9:1;
+ unsigned EID10:1;
+ unsigned EID11:1;
+ unsigned EID12:1;
+ unsigned EID13:1;
+ unsigned EID14:1;
+ unsigned EID15:1;
+} RXM1EIDHbits;
+extern volatile far unsigned char RXM1EIDL;
+extern volatile far struct {
+ unsigned EID0:1;
+ unsigned EID1:1;
+ unsigned EID2:1;
+ unsigned EID3:1;
+ unsigned EID4:1;
+ unsigned EID5:1;
+ unsigned EID6:1;
+ unsigned EID7:1;
+} RXM1EIDLbits;
+extern volatile far unsigned char TXB2CON;
+extern volatile far union {
+ struct {
+ unsigned TXPRI0:1;
+ unsigned TXPRI1:1;
+ unsigned :1;
+ unsigned TXREQ:1;
+ unsigned TXERR:1;
+ unsigned TXLARB:1;
+ unsigned TXABT:1;
+ unsigned TXBIFBXB2CON:1;
+ };
+ struct {
+ unsigned :7;
+ unsigned TXBIF:1;
+ };
+} TXB2CONbits;
+extern volatile far unsigned char TXB2SIDH;
+extern volatile far struct {
+ unsigned SID3:1;
+ unsigned SID4:1;
+ unsigned SID5:1;
+ unsigned SID6:1;
+ unsigned SID7:1;
+ unsigned SID8:1;
+ unsigned SID9:1;
+ unsigned SID10:1;
+} TXB2SIDHbits;
+extern volatile far unsigned char TXB2SIDL;
+extern volatile far struct {
+ unsigned EID16:1;
+ unsigned EID17:1;
+ unsigned :1;
+ unsigned EXIDE:1;
+ unsigned :1;
+ unsigned SID0:1;
+ unsigned SID1:1;
+ unsigned SID2:1;
+} TXB2SIDLbits;
+extern volatile far unsigned char TXB2EIDH;
+extern volatile far struct {
+ unsigned EID8:1;
+ unsigned EID9:1;
+ unsigned EID10:1;
+ unsigned EID11:1;
+ unsigned EID12:1;
+ unsigned EID13:1;
+ unsigned EID14:1;
+ unsigned EID15:1;
+} TXB2EIDHbits;
+extern volatile far unsigned char TXB2EIDL;
+extern volatile far struct {
+ unsigned EID0:1;
+ unsigned EID1:1;
+ unsigned EID2:1;
+ unsigned EID3:1;
+ unsigned EID4:1;
+ unsigned EID5:1;
+ unsigned EID6:1;
+ unsigned EID7:1;
+} TXB2EIDLbits;
+extern volatile far unsigned char TXB2DLC;
+extern volatile far struct {
+ unsigned DLC0:1;
+ unsigned DLC1:1;
+ unsigned DLC2:1;
+ unsigned DLC3:1;
+ unsigned :2;
+ unsigned TXRTR:1;
+} TXB2DLCbits;
+extern volatile far unsigned char TXB2D0;
+extern volatile far struct {
+ unsigned TXB2D00:1;
+ unsigned TXB2D01:1;
+ unsigned TXB2D02:1;
+ unsigned TXB2D03:1;
+ unsigned TXB2D04:1;
+ unsigned TXB2D05:1;
+ unsigned TXB2D06:1;
+ unsigned TXB2D07:1;
+} TXB2D0bits;
+extern volatile far unsigned char TXB2D1;
+extern volatile far struct {
+ unsigned TXB2D10:1;
+ unsigned TXB2D11:1;
+ unsigned TXB2D12:1;
+ unsigned TXB2D13:1;
+ unsigned TXB2D14:1;
+ unsigned TXB2D15:1;
+ unsigned TXB2D16:1;
+ unsigned TXB2D17:1;
+} TXB2D1bits;
+extern volatile far unsigned char TXB2D2;
+extern volatile far struct {
+ unsigned TXB2D20:1;
+ unsigned TXB2D21:1;
+ unsigned TXB2D22:1;
+ unsigned TXB2D23:1;
+ unsigned TXB2D24:1;
+ unsigned TXB2D25:1;
+ unsigned TXB2D26:1;
+ unsigned TXB2D27:1;
+} TXB2D2bits;
+extern volatile far unsigned char TXB2D3;
+extern volatile far struct {
+ unsigned TXB2D30:1;
+ unsigned TXB2D31:1;
+ unsigned TXB2D32:1;
+ unsigned TXB2D33:1;
+ unsigned TXB2D34:1;
+ unsigned TXB2D35:1;
+ unsigned TXB2D36:1;
+ unsigned TXB2D37:1;
+} TXB2D3bits;
+extern volatile far unsigned char TXB2D4;
+extern volatile far struct {
+ unsigned TXB2D40:1;
+ unsigned TXB2D41:1;
+ unsigned TXB2D42:1;
+ unsigned TXB2D43:1;
+ unsigned TXB2D44:1;
+ unsigned TXB2D45:1;
+ unsigned TXB2D46:1;
+ unsigned TXB2D47:1;
+} TXB2D4bits;
+extern volatile far unsigned char TXB2D5;
+extern volatile far struct {
+ unsigned TXB2D50:1;
+ unsigned TXB2D51:1;
+ unsigned TXB2D52:1;
+ unsigned TXB2D53:1;
+ unsigned TXB2D54:1;
+ unsigned TXB2D55:1;
+ unsigned TXB2D56:1;
+ unsigned TXB2D57:1;
+} TXB2D5bits;
+extern volatile far unsigned char TXB2D6;
+extern volatile far struct {
+ unsigned TXB2D60:1;
+ unsigned TXB2D61:1;
+ unsigned TXB2D62:1;
+ unsigned TXB2D63:1;
+ unsigned TXB2D64:1;
+ unsigned TXB2D65:1;
+ unsigned TXB2D66:1;
+ unsigned TXB2D67:1;
+} TXB2D6bits;
+extern volatile far unsigned char TXB2D7;
+extern volatile far struct {
+ unsigned TXB2D70:1;
+ unsigned TXB2D71:1;
+ unsigned TXB2D72:1;
+ unsigned TXB2D73:1;
+ unsigned TXB2D74:1;
+ unsigned TXB2D75:1;
+ unsigned TXB2D76:1;
+ unsigned TXB2D77:1;
+} TXB2D7bits;
+extern volatile far unsigned char CANSTAT_RO3;
+extern volatile far struct {
+ unsigned ICODE0:1;
+ unsigned ICODE1:1;
+ unsigned ICODE2:1;
+ unsigned ICODE3:1;
+ unsigned ICODE4:1;
+ unsigned OPMODE:1;
+ unsigned REQOP1:1;
+ unsigned REQOP2:1;
+} CANSTAT_RO3bits;
+extern volatile far unsigned char CANCON_RO3;
+extern volatile far struct {
+ unsigned :1;
+ unsigned WIN0:1;
+ unsigned WIN1:1;
+ unsigned WIN2:1;
+ unsigned ABAT:1;
+ unsigned REQOP0:1;
+ unsigned REQOP1:1;
+ unsigned REQOP2:1;
+} CANCON_RO3bits;
+extern volatile far unsigned char TXB1CON;
+extern volatile far union {
+ struct {
+ unsigned TXPRI0:1;
+ unsigned TXPRI1:1;
+ unsigned :1;
+ unsigned TXREQ:1;
+ unsigned TXERR:1;
+ unsigned TXLARB:1;
+ unsigned TXABT:1;
+ unsigned TXBIFTXB1CON:1;
+ };
+ struct {
+ unsigned :7;
+ unsigned TXBIF:1;
+ };
+} TXB1CONbits;
+extern volatile far unsigned char TXB1SIDH;
+extern volatile far struct {
+ unsigned SID3:1;
+ unsigned SID4:1;
+ unsigned SID5:1;
+ unsigned SID6:1;
+ unsigned SID7:1;
+ unsigned SID8:1;
+ unsigned SID9:1;
+ unsigned SID10:1;
+} TXB1SIDHbits;
+extern volatile far unsigned char TXB1SIDL;
+extern volatile far struct {
+ unsigned EID16:1;
+ unsigned EID17:1;
+ unsigned :1;
+ unsigned EXIDE:1;
+ unsigned :1;
+ unsigned SID0:1;
+ unsigned SID1:1;
+ unsigned SID2:1;
+} TXB1SIDLbits;
+extern volatile far unsigned char TXB1EIDH;
+extern volatile far struct {
+ unsigned EID8:1;
+ unsigned EID9:1;
+ unsigned EID10:1;
+ unsigned EID11:1;
+ unsigned EID12:1;
+ unsigned EID13:1;
+ unsigned EID14:1;
+ unsigned EID15:1;
+} TXB1EIDHbits;
+extern volatile far unsigned char TXB1EIDL;
+extern volatile far struct {
+ unsigned EID0:1;
+ unsigned EID1:1;
+ unsigned EID2:1;
+ unsigned EID3:1;
+ unsigned EID4:1;
+ unsigned EID5:1;
+ unsigned EID6:1;
+ unsigned EID7:1;
+} TXB1EIDLbits;
+extern volatile far unsigned char TXB1DLC;
+extern volatile far struct {
+ unsigned DLC0:1;
+ unsigned DLC1:1;
+ unsigned DLC2:1;
+ unsigned DLC3:1;
+ unsigned :2;
+ unsigned TXRTR:1;
+} TXB1DLCbits;
+extern volatile far unsigned char TXB1D0;
+extern volatile far struct {
+ unsigned TXB1D00:1;
+ unsigned TXB1D01:1;
+ unsigned TXB1D02:1;
+ unsigned TXB1D03:1;
+ unsigned TXB1D04:1;
+ unsigned TXB1D05:1;
+ unsigned TXB1D06:1;
+ unsigned TXB1D07:1;
+} TXB1D0bits;
+extern volatile far unsigned char TXB1D1;
+extern volatile far struct {
+ unsigned TXB1D10:1;
+ unsigned TXB1D11:1;
+ unsigned TXB1D12:1;
+ unsigned TXB1D13:1;
+ unsigned TXB1D14:1;
+ unsigned TXB1D15:1;
+ unsigned TXB1D16:1;
+ unsigned TXB1D17:1;
+} TXB1D1bits;
+extern volatile far unsigned char TXB1D2;
+extern volatile far struct {
+ unsigned TXB1D20:1;
+ unsigned TXB1D21:1;
+ unsigned TXB1D22:1;
+ unsigned TXB1D23:1;
+ unsigned TXB1D24:1;
+ unsigned TXB1D25:1;
+ unsigned TXB1D26:1;
+ unsigned TXB1D27:1;
+} TXB1D2bits;
+extern volatile far unsigned char TXB1D3;
+extern volatile far struct {
+ unsigned TXB1D30:1;
+ unsigned TXB1D31:1;
+ unsigned TXB1D32:1;
+ unsigned TXB1D33:1;
+ unsigned TXB1D34:1;
+ unsigned TXB1D35:1;
+ unsigned TXB1D36:1;
+ unsigned TXB1D37:1;
+} TXB1D3bits;
+extern volatile far unsigned char TXB1D4;
+extern volatile far struct {
+ unsigned TXB1D40:1;
+ unsigned TXB1D41:1;
+ unsigned TXB1D42:1;
+ unsigned TXB1D43:1;
+ unsigned TXB1D44:1;
+ unsigned TXB1D45:1;
+ unsigned TXB1D46:1;
+ unsigned TXB1D47:1;
+} TXB1D4bits;
+extern volatile far unsigned char TXB1D5;
+extern volatile far struct {
+ unsigned TXB1D50:1;
+ unsigned TXB1D51:1;
+ unsigned TXB1D52:1;
+ unsigned TXB1D53:1;
+ unsigned TXB1D54:1;
+ unsigned TXB1D55:1;
+ unsigned TXB1D56:1;
+ unsigned TXB1D57:1;
+} TXB1D5bits;
+extern volatile far unsigned char TXB1D6;
+extern volatile far struct {
+ unsigned TXB1D60:1;
+ unsigned TXB1D61:1;
+ unsigned TXB1D62:1;
+ unsigned TXB1D63:1;
+ unsigned TXB1D64:1;
+ unsigned TXB1D65:1;
+ unsigned TXB1D66:1;
+ unsigned TXB1D67:1;
+} TXB1D6bits;
+extern volatile far unsigned char TXB1D7;
+extern volatile far struct {
+ unsigned TXB1D70:1;
+ unsigned TXB1D71:1;
+ unsigned TXB1D72:1;
+ unsigned TXB1D73:1;
+ unsigned TXB1D74:1;
+ unsigned TXB1D75:1;
+ unsigned TXB1D76:1;
+ unsigned TXB1D77:1;
+} TXB1D7bits;
+extern volatile far unsigned char CANSTAT_RO2;
+extern volatile far struct {
+ unsigned ICODE0:1;
+ unsigned ICODE1:1;
+ unsigned ICODE2:1;
+ unsigned ICODE3:1;
+ unsigned ICODE4:1;
+ unsigned OPMODE:1;
+ unsigned REQOP1:1;
+ unsigned REQOP2:1;
+} CANSTAT_RO2bits;
+extern volatile far unsigned char CANCON_RO2;
+extern volatile far struct {
+ unsigned :1;
+ unsigned WIN0:1;
+ unsigned WIN1:1;
+ unsigned WIN2:1;
+ unsigned ABAT:1;
+ unsigned REQOP0:1;
+ unsigned REQOP1:1;
+ unsigned REQOP2:1;
+} CANCON_RO2bits;
+extern volatile far unsigned char TXB0CON;
+extern volatile far union {
+ struct {
+ unsigned TXPRI0:1;
+ unsigned TXPRI1:1;
+ unsigned :1;
+ unsigned TXREQ:1;
+ unsigned TXERR:1;
+ unsigned TXLARB:1;
+ unsigned TXABT:1;
+ };
+ struct {
+ unsigned :7;
+ unsigned TXBIF:1;
+ };
+} TXB0CONbits;
+extern volatile far unsigned char TXB0SIDH;
+extern volatile far struct {
+ unsigned SID3:1;
+ unsigned SID4:1;
+ unsigned SID5:1;
+ unsigned SID6:1;
+ unsigned SID7:1;
+ unsigned SID8:1;
+ unsigned SID9:1;
+ unsigned SID10:1;
+} TXB0SIDHbits;
+extern volatile far unsigned char TXB0SIDL;
+extern volatile far struct {
+ unsigned EID16:1;
+ unsigned EID17:1;
+ unsigned :1;
+ unsigned EXIDE:1;
+ unsigned :1;
+ unsigned SID0:1;
+ unsigned SID1:1;
+ unsigned SID2:1;
+} TXB0SIDLbits;
+extern volatile far unsigned char TXB0EIDH;
+extern volatile far struct {
+ unsigned EID8:1;
+ unsigned EID9:1;
+ unsigned EID10:1;
+ unsigned EID11:1;
+ unsigned EID12:1;
+ unsigned EID13:1;
+ unsigned EID14:1;
+ unsigned EID15:1;
+} TXB0EIDHbits;
+extern volatile far unsigned char TXB0EIDL;
+extern volatile far struct {
+ unsigned EID0:1;
+ unsigned EID1:1;
+ unsigned EID2:1;
+ unsigned EID3:1;
+ unsigned EID4:1;
+ unsigned EID5:1;
+ unsigned EID6:1;
+ unsigned EID7:1;
+} TXB0EIDLbits;
+extern volatile far unsigned char TXB0DLC;
+extern volatile far struct {
+ unsigned DLC0:1;
+ unsigned DLC1:1;
+ unsigned DLC2:1;
+ unsigned DLC3:1;
+ unsigned :2;
+ unsigned TXRTR:1;
+} TXB0DLCbits;
+extern volatile far unsigned char TXB0D0;
+extern volatile far struct {
+ unsigned TXB0D00:1;
+ unsigned TXB0D01:1;
+ unsigned TXB0D02:1;
+ unsigned TXB0D03:1;
+ unsigned TXB0D04:1;
+ unsigned TXB0D05:1;
+ unsigned TXB0D06:1;
+ unsigned TXB0D07:1;
+} TXB0D0bits;
+extern volatile far unsigned char TXB0D1;
+extern volatile far struct {
+ unsigned TXB0D10:1;
+ unsigned TXB0D11:1;
+ unsigned TXB0D12:1;
+ unsigned TXB0D13:1;
+ unsigned TXB0D14:1;
+ unsigned TXB0D15:1;
+ unsigned TXB0D16:1;
+ unsigned TXB0D17:1;
+} TXB0D1bits;
+extern volatile far unsigned char TXB0D2;
+extern volatile far struct {
+ unsigned TXB0D20:1;
+ unsigned TXB0D21:1;
+ unsigned TXB0D22:1;
+ unsigned TXB0D23:1;
+ unsigned TXB0D24:1;
+ unsigned TXB0D25:1;
+ unsigned TXB0D26:1;
+ unsigned TXB0D27:1;
+} TXB0D2bits;
+extern volatile far unsigned char TXB0D3;
+extern volatile far struct {
+ unsigned TXB0D30:1;
+ unsigned TXB0D31:1;
+ unsigned TXB0D32:1;
+ unsigned TXB0D33:1;
+ unsigned TXB0D34:1;
+ unsigned TXB0D35:1;
+ unsigned TXB0D36:1;
+ unsigned TXB0D37:1;
+} TXB0D3bits;
+extern volatile far unsigned char TXB0D4;
+extern volatile far struct {
+ unsigned TXB0D40:1;
+ unsigned TXB0D41:1;
+ unsigned TXB0D42:1;
+ unsigned TXB0D43:1;
+ unsigned TXB0D44:1;
+ unsigned TXB0D45:1;
+ unsigned TXB0D46:1;
+ unsigned TXB0D47:1;
+} TXB0D4bits;
+extern volatile far unsigned char TXB0D5;
+extern volatile far struct {
+ unsigned TXB0D50:1;
+ unsigned TXB0D51:1;
+ unsigned TXB0D52:1;
+ unsigned TXB0D53:1;
+ unsigned TXB0D54:1;
+ unsigned TXB0D55:1;
+ unsigned TXB0D56:1;
+ unsigned TXB0D57:1;
+} TXB0D5bits;
+extern volatile far unsigned char TXB0D6;
+extern volatile far struct {
+ unsigned TXB0D60:1;
+ unsigned TXB0D61:1;
+ unsigned TXB0D62:1;
+ unsigned TXB0D63:1;
+ unsigned TXB0D64:1;
+ unsigned TXB0D65:1;
+ unsigned TXB0D66:1;
+ unsigned TXB0D67:1;
+} TXB0D6bits;
+extern volatile far unsigned char TXB0D7;
+extern volatile far struct {
+ unsigned TXB0D70:1;
+ unsigned TXB0D71:1;
+ unsigned TXB0D72:1;
+ unsigned TXB0D73:1;
+ unsigned TXB0D74:1;
+ unsigned TXB0D75:1;
+ unsigned TXB0D76:1;
+ unsigned TXB0D77:1;
+} TXB0D7bits;
+extern volatile far unsigned char CANSTAT_RO1;
+extern volatile far struct {
+ unsigned ICODE0:1;
+ unsigned ICODE1:1;
+ unsigned ICODE2:1;
+ unsigned ICODE3:1;
+ unsigned ICODE4:1;
+ unsigned OPMODE:1;
+ unsigned REQOP1:1;
+ unsigned REQOP2:1;
+} CANSTAT_RO1bits;
+extern volatile far unsigned char CANCON_RO1;
+extern volatile far struct {
+ unsigned :1;
+ unsigned WIN0:1;
+ unsigned WIN1:1;
+ unsigned WIN2:1;
+ unsigned ABAT:1;
+ unsigned REQOP0:1;
+ unsigned REQOP1:1;
+ unsigned REQOP2:1;
+} CANCON_RO1bits;
+extern volatile far unsigned char RXB1CON;
+extern volatile far union {
+ struct {
+ unsigned FILHIT0:1;
+ unsigned FILHIT1:1;
+ unsigned FILHIT2:1;
+ unsigned RXRTRRO:1;
+ unsigned :1;
+ unsigned RXM0:1;
+ unsigned RXM1:1;
+ unsigned RXFUL:1;
+ };
+ struct {
+ unsigned :3;
+ unsigned FILHIT3:1;
+ unsigned FILHIT4:1;
+ unsigned RTRRO:1;
+ };
+} RXB1CONbits;
+extern volatile far unsigned char RXB1SIDH;
+extern volatile far struct {
+ unsigned SID3:1;
+ unsigned SID4:1;
+ unsigned SID5:1;
+ unsigned SID6:1;
+ unsigned SID7:1;
+ unsigned SID8:1;
+ unsigned SID9:1;
+ unsigned SID10:1;
+} RXB1SIDHbits;
+extern volatile far unsigned char RXB1SIDL;
+extern volatile far struct {
+ unsigned EID16:1;
+ unsigned EID17:1;
+ unsigned :1;
+ unsigned EXID:1;
+ unsigned SRR:1;
+ unsigned SID0:1;
+ unsigned SID1:1;
+ unsigned SID2:1;
+} RXB1SIDLbits;
+extern volatile far unsigned char RXB1EIDH;
+extern volatile far struct {
+ unsigned EID8:1;
+ unsigned EID9:1;
+ unsigned EID10:1;
+ unsigned EID11:1;
+ unsigned EID12:1;
+ unsigned EID13:1;
+ unsigned EID14:1;
+ unsigned EID15:1;
+} RXB1EIDHbits;
+extern volatile far unsigned char RXB1EIDL;
+extern volatile far struct {
+ unsigned EID0:1;
+ unsigned EID1:1;
+ unsigned EID2:1;
+ unsigned EID3:1;
+ unsigned EID4:1;
+ unsigned EID5:1;
+ unsigned EID6:1;
+ unsigned EID7:1;
+} RXB1EIDLbits;
+extern volatile far unsigned char RXB1DLC;
+extern volatile far union {
+ struct {
+ unsigned DLC0:1;
+ unsigned DLC1:1;
+ unsigned DLC2:1;
+ unsigned DLC3:1;
+ unsigned RESRB0:1;
+ unsigned RESRB1:1;
+ unsigned RXRTR:1;
+ };
+ struct {
+ unsigned :4;
+ unsigned RB0:1;
+ unsigned RB1:1;
+ };
+} RXB1DLCbits;
+extern volatile far unsigned char RXB1D0;
+extern volatile far struct {
+ unsigned RXB1D00:1;
+ unsigned RXB1D01:1;
+ unsigned RXB1D02:1;
+ unsigned RXB1D03:1;
+ unsigned RXB1D04:1;
+ unsigned RXB1D05:1;
+ unsigned RXB1D06:1;
+ unsigned RXB1D07:1;
+} RXB1D0bits;
+extern volatile far unsigned char RXB1D1;
+extern volatile far struct {
+ unsigned RXB1D10:1;
+ unsigned RXB1D11:1;
+ unsigned RXB1D12:1;
+ unsigned RXB1D13:1;
+ unsigned RXB1D14:1;
+ unsigned RXB1D15:1;
+ unsigned RXB1D16:1;
+ unsigned RXB1D17:1;
+} RXB1D1bits;
+extern volatile far unsigned char RXB1D2;
+extern volatile far struct {
+ unsigned RXB1D20:1;
+ unsigned RXB1D21:1;
+ unsigned RXB1D22:1;
+ unsigned RXB1D23:1;
+ unsigned RXB1D24:1;
+ unsigned RXB1D25:1;
+ unsigned RXB1D26:1;
+ unsigned RXB1D27:1;
+} RXB1D2bits;
+extern volatile far unsigned char RXB1D3;
+extern volatile far struct {
+ unsigned RXB1D30:1;
+ unsigned RXB1D31:1;
+ unsigned RXB1D32:1;
+ unsigned RXB1D33:1;
+ unsigned RXB1D34:1;
+ unsigned RXB1D35:1;
+ unsigned RXB1D36:1;
+ unsigned RXB1D37:1;
+} RXB1D3bits;
+extern volatile far unsigned char RXB1D4;
+extern volatile far struct {
+ unsigned RXB1D40:1;
+ unsigned RXB1D41:1;
+ unsigned RXB1D42:1;
+ unsigned RXB1D43:1;
+ unsigned RXB1D44:1;
+ unsigned RXB1D45:1;
+ unsigned RXB1D46:1;
+ unsigned RXB1D47:1;
+} RXB1D4bits;
+extern volatile far unsigned char RXB1D5;
+extern volatile far struct {
+ unsigned RXB1D50:1;
+ unsigned RXB1D51:1;
+ unsigned RXB1D52:1;
+ unsigned RXB1D53:1;
+ unsigned RXB1D54:1;
+ unsigned RXB1D55:1;
+ unsigned RXB1D56:1;
+ unsigned RXB1D57:1;
+} RXB1D5bits;
+extern volatile far unsigned char RXB1D6;
+extern volatile far struct {
+ unsigned RXB1D60:1;
+ unsigned RXB1D61:1;
+ unsigned RXB1D62:1;
+ unsigned RXB1D63:1;
+ unsigned RXB1D64:1;
+ unsigned RXB1D65:1;
+ unsigned RXB1D66:1;
+ unsigned RXB1D67:1;
+} RXB1D6bits;
+extern volatile far unsigned char RXB1D7;
+extern volatile far struct {
+ unsigned RXB1D70:1;
+ unsigned RXB1D71:1;
+ unsigned RXB1D72:1;
+ unsigned RXB1D73:1;
+ unsigned RXB1D74:1;
+ unsigned RXB1D75:1;
+ unsigned RXB1D76:1;
+ unsigned RXB1D77:1;
+} RXB1D7bits;
+extern volatile far unsigned char CANSTAT_RO0;
+extern volatile far struct {
+ unsigned ICODE0:1;
+ unsigned ICODE1:1;
+ unsigned ICODE2:1;
+ unsigned ICODE3:1;
+ unsigned ICODE4:1;
+ unsigned OPMODE:1;
+ unsigned REQOP1:1;
+ unsigned REQOP2:1;
+} CANSTAT_RO0bits;
+extern volatile far unsigned char CANCON_RO0;
+extern volatile far struct {
+ unsigned :1;
+ unsigned WIN0:1;
+ unsigned WIN1:1;
+ unsigned WIN2:1;
+ unsigned ABAT:1;
+ unsigned REQOP0:1;
+ unsigned REQOP1:1;
+ unsigned REQOP2:1;
+} CANCON_RO0bits;
+extern volatile near unsigned char RXB0CON;
+extern volatile near union {
+ struct {
+ unsigned FILHIT0:1;
+ unsigned JTOFF:1;
+ unsigned RXB0DBEN:1;
+ unsigned RXRTRRO:1;
+ unsigned :1;
+ unsigned RXM0:1;
+ unsigned RXM1:1;
+ unsigned RXFUL:1;
+ };
+ struct {
+ unsigned :1;
+ unsigned FILHIT1:1;
+ unsigned FILHIT2:1;
+ unsigned FILHIT3:1;
+ unsigned FILHIT4:1;
+ unsigned RTRRO:1;
+ };
+ struct {
+ unsigned :2;
+ unsigned RXBODBEN:1;
+ };
+} RXB0CONbits;
+extern volatile near unsigned char RXB0SIDH;
+extern volatile near struct {
+ unsigned SID3:1;
+ unsigned SID4:1;
+ unsigned SID5:1;
+ unsigned SID6:1;
+ unsigned SID7:1;
+ unsigned SID8:1;
+ unsigned SID9:1;
+ unsigned SID10:1;
+} RXB0SIDHbits;
+extern volatile near unsigned char RXB0SIDL;
+extern volatile near struct {
+ unsigned EID16:1;
+ unsigned EID17:1;
+ unsigned :1;
+ unsigned EXID:1;
+ unsigned SRR:1;
+ unsigned SID0:1;
+ unsigned SID1:1;
+ unsigned SID2:1;
+} RXB0SIDLbits;
+extern volatile near unsigned char RXB0EIDH;
+extern volatile near struct {
+ unsigned EID8:1;
+ unsigned EID9:1;
+ unsigned EID10:1;
+ unsigned EID11:1;
+ unsigned EID12:1;
+ unsigned EID13:1;
+ unsigned EID14:1;
+ unsigned EID15:1;
+} RXB0EIDHbits;
+extern volatile near unsigned char RXB0EIDL;
+extern volatile near struct {
+ unsigned EID0:1;
+ unsigned EID1:1;
+ unsigned EID2:1;
+ unsigned EID3:1;
+ unsigned EID4:1;
+ unsigned EID5:1;
+ unsigned EID6:1;
+ unsigned EID7:1;
+} RXB0EIDLbits;
+extern volatile near unsigned char RXB0DLC;
+extern volatile near union {
+ struct {
+ unsigned DLC0:1;
+ unsigned DLC1:1;
+ unsigned DLC2:1;
+ unsigned DLC3:1;
+ unsigned RESRB0:1;
+ unsigned RESRB1:1;
+ unsigned RXRTR:1;
+ };
+ struct {
+ unsigned :4;
+ unsigned RB0:1;
+ unsigned RB1:1;
+ };
+} RXB0DLCbits;
+extern volatile near unsigned char RXB0D0;
+extern volatile near struct {
+ unsigned RXB0D00:1;
+ unsigned RXB0D01:1;
+ unsigned RXB0D02:1;
+ unsigned RXB0D03:1;
+ unsigned RXB0D04:1;
+ unsigned RXB0D05:1;
+ unsigned RXB0D06:1;
+ unsigned RXB0D07:1;
+} RXB0D0bits;
+extern volatile near unsigned char RXB0D1;
+extern volatile near struct {
+ unsigned RXB0D10:1;
+ unsigned RXB0D11:1;
+ unsigned RXB0D12:1;
+ unsigned RXB0D13:1;
+ unsigned RXB0D14:1;
+ unsigned RXB0D15:1;
+ unsigned RXB0D16:1;
+ unsigned RXB0D17:1;
+} RXB0D1bits;
+extern volatile near unsigned char RXB0D2;
+extern volatile near struct {
+ unsigned RXB0D20:1;
+ unsigned RXB0D21:1;
+ unsigned RXB0D22:1;
+ unsigned RXB0D23:1;
+ unsigned RXB0D24:1;
+ unsigned RXB0D25:1;
+ unsigned RXB0D26:1;
+ unsigned RXB0D27:1;
+} RXB0D2bits;
+extern volatile near unsigned char RXB0D3;
+extern volatile near struct {
+ unsigned RXB0D30:1;
+ unsigned RXB0D31:1;
+ unsigned RXB0D32:1;
+ unsigned RXB0D33:1;
+ unsigned RXB0D34:1;
+ unsigned RXB0D35:1;
+ unsigned RXB0D36:1;
+ unsigned RXB0D37:1;
+} RXB0D3bits;
+extern volatile near unsigned char RXB0D4;
+extern volatile near struct {
+ unsigned RXB0D40:1;
+ unsigned RXB0D41:1;
+ unsigned RXB0D42:1;
+ unsigned RXB0D43:1;
+ unsigned RXB0D44:1;
+ unsigned RXB0D45:1;
+ unsigned RXB0D46:1;
+ unsigned RXB0D47:1;
+} RXB0D4bits;
+extern volatile near unsigned char RXB0D5;
+extern volatile near struct {
+ unsigned RXB0D50:1;
+ unsigned RXB0D51:1;
+ unsigned RXB0D52:1;
+ unsigned RXB0D53:1;
+ unsigned RXB0D54:1;
+ unsigned RXB0D55:1;
+ unsigned RXB0D56:1;
+ unsigned RXB0D57:1;
+} RXB0D5bits;
+extern volatile near unsigned char RXB0D6;
+extern volatile near struct {
+ unsigned RXB0D60:1;
+ unsigned RXB0D61:1;
+ unsigned RXB0D62:1;
+ unsigned RXB0D63:1;
+ unsigned RXB0D64:1;
+ unsigned RXB0D65:1;
+ unsigned RXB0D66:1;
+ unsigned RXB0D67:1;
+} RXB0D6bits;
+extern volatile near unsigned char RXB0D7;
+extern volatile near struct {
+ unsigned RXB0D70:1;
+ unsigned RXB0D71:1;
+ unsigned RXB0D72:1;
+ unsigned RXB0D73:1;
+ unsigned RXB0D74:1;
+ unsigned RXB0D75:1;
+ unsigned RXB0D76:1;
+ unsigned RXB0D77:1;
+} RXB0D7bits;
+extern volatile near unsigned char CANSTAT;
+extern volatile near union {
+ struct {
+ unsigned :1;
+ unsigned ICODE1:1;
+ unsigned ICODE2:1;
+ unsigned ICODE3:1;
+ unsigned :1;
+ unsigned OPMODE0:1;
+ unsigned OPMODE1:1;
+ unsigned OPMODE2:1;
+ };
+ struct {
+ unsigned EICODE0:1;
+ unsigned EICODE1:1;
+ unsigned EICODE2:1;
+ unsigned EICODE3:1;
+ unsigned EICODE4:1;
+ };
+} CANSTATbits;
+extern volatile near unsigned char CANCON;
+extern volatile near union {
+ struct {
+ unsigned :1;
+ unsigned WIN0:1;
+ unsigned WIN1:1;
+ unsigned WIN2:1;
+ unsigned ABAT:1;
+ unsigned REQOP0:1;
+ unsigned REQOP1:1;
+ unsigned REQOP2:1;
+ };
+ struct {
+ unsigned FP0:1;
+ unsigned FP1:1;
+ unsigned FP2:1;
+ unsigned FP3:1;
+ };
+} CANCONbits;
+extern volatile near unsigned char BRGCON1;
+extern volatile near struct {
+ unsigned BRP0:1;
+ unsigned BRP1:1;
+ unsigned BRP2:1;
+ unsigned BRP3:1;
+ unsigned BRP4:1;
+ unsigned BRP5:1;
+ unsigned SJW0:1;
+ unsigned SJW1:1;
+} BRGCON1bits;
+extern volatile near unsigned char BRGCON2;
+extern volatile near union {
+ struct {
+ unsigned PRSEG0:1;
+ unsigned PRSEG1:1;
+ unsigned PRSEG2:1;
+ unsigned SEG1PH0:1;
+ unsigned SEG1PH1:1;
+ unsigned SEG1PH2:1;
+ unsigned SAM:1;
+ unsigned SEG2PHTS:1;
+ };
+ struct {
+ unsigned :7;
+ unsigned SEG2PHT:1;
+ };
+} BRGCON2bits;
+extern volatile near unsigned char BRGCON3;
+extern volatile near struct {
+ unsigned SEG2PH0:1;
+ unsigned SEG2PH1:1;
+ unsigned SEG2PH2:1;
+ unsigned :3;
+ unsigned WAKFIL:1;
+ unsigned WAKDIS:1;
+} BRGCON3bits;
+extern volatile near unsigned char CIOCON;
+extern volatile near struct {
+ unsigned :4;
+ unsigned CANCAP:1;
+ unsigned ENDRHI:1;
+} CIOCONbits;
+extern volatile near unsigned char COMSTAT;
+extern volatile near union {
+ struct {
+ unsigned EWARN:1;
+ unsigned RXWARN:1;
+ unsigned TXWARN:1;
+ unsigned RXBP:1;
+ unsigned TXBP:1;
+ unsigned TXBO:1;
+ unsigned RXB1OVFL:1;
+ unsigned RXB0OVFL:1;
+ };
+ struct {
+ unsigned :6;
+ unsigned RXBnOVFL:1;
+ };
+ struct {
+ unsigned :7;
+ unsigned FIFOEMPTY:1;
+ };
+} COMSTATbits;
+extern volatile near unsigned char RXERRCNT;
+extern volatile near struct {
+ unsigned REC0:1;
+ unsigned REC1:1;
+ unsigned REC2:1;
+ unsigned REC3:1;
+ unsigned REC4:1;
+ unsigned REC5:1;
+ unsigned REC6:1;
+ unsigned REC7:1;
+} RXERRCNTbits;
+extern volatile near unsigned char TXERRCNT;
+extern volatile near struct {
+ unsigned TEC0:1;
+ unsigned TEC1:1;
+ unsigned TEC2:1;
+ unsigned TEC3:1;
+ unsigned TEC4:1;
+ unsigned TEC5:1;
+ unsigned TEC6:1;
+ unsigned TEC7:1;
+} TXERRCNTbits;
+extern volatile near unsigned char ECANCON;
+extern volatile near union {
+ struct {
+ unsigned EWIN0:1;
+ unsigned EWIN1:1;
+ unsigned EWIN2:1;
+ unsigned EWIN3:1;
+ unsigned EWIN4:1;
+ unsigned FIFOWM:1;
+ unsigned MDSEL0:1;
+ unsigned MDSEL1:1;
+ };
+ struct {
+ unsigned :5;
+ unsigned F:1;
+ };
+} ECANCONbits;
+extern volatile near unsigned char PORTA;
+extern volatile near union {
+ struct {
+ unsigned RA0:1;
+ unsigned RA1:1;
+ unsigned RA2:1;
+ unsigned RA3:1;
+ unsigned RA4:1;
+ unsigned RA5:1;
+ unsigned RA6:1;
+ unsigned RA7:1;
+ };
+ struct {
+ unsigned AN0:1;
+ unsigned AN1:1;
+ unsigned AN2:1;
+ unsigned AN3:1;
+ unsigned T0CKI:1;
+ unsigned AN4:1;
+ unsigned OSC2:1;
+ unsigned OSC1:1;
+ };
+ struct {
+ unsigned CVREF:1;
+ unsigned :1;
+ unsigned VREFM:1;
+ unsigned VREFP:1;
+ unsigned :1;
+ unsigned LVDIN:1;
+ unsigned CLKO:1;
+ unsigned CLKI:1;
+ };
+ struct {
+ unsigned :5;
+ unsigned SS:1;
+ };
+ struct {
+ unsigned :5;
+ unsigned NOT_SS:1;
+ };
+ struct {
+ unsigned :5;
+ unsigned HLVDIN:1;
+ };
+} PORTAbits;
+extern volatile near unsigned char PORTB;
+extern volatile near union {
+ struct {
+ unsigned RB0:1;
+ unsigned RB1:1;
+ unsigned RB2:1;
+ unsigned RB3:1;
+ unsigned RB4:1;
+ unsigned RB5:1;
+ unsigned RB6:1;
+ unsigned RB7:1;
+ };
+ struct {
+ unsigned INT0:1;
+ unsigned INT1:1;
+ unsigned INT2:1;
+ unsigned CANRX:1;
+ unsigned KBI0:1;
+ unsigned KBI1:1;
+ unsigned KBI2:1;
+ unsigned KBI3:1;
+ };
+ struct {
+ unsigned AN10:1;
+ };
+ struct {
+ unsigned FLT0:1;
+ unsigned AN8:1;
+ unsigned CANTX:1;
+ unsigned :1;
+ unsigned AN9:1;
+ unsigned PGM:1;
+ unsigned PGC:1;
+ unsigned PGD:1;
+ };
+} PORTBbits;
+extern volatile near unsigned char PORTC;
+extern volatile near union {
+ struct {
+ unsigned RC0:1;
+ unsigned RC1:1;
+ unsigned RC2:1;
+ unsigned RC3:1;
+ unsigned RC4:1;
+ unsigned RC5:1;
+ unsigned RC6:1;
+ unsigned RC7:1;
+ };
+ struct {
+ unsigned T1OSO:1;
+ unsigned T1OSI:1;
+ unsigned CCP1:1;
+ unsigned SCK:1;
+ unsigned SDI:1;
+ unsigned SDO:1;
+ unsigned TX:1;
+ unsigned RX:1;
+ };
+ struct {
+ unsigned T13CKI:1;
+ unsigned :2;
+ unsigned SCL:1;
+ unsigned SDA:1;
+ unsigned :1;
+ unsigned CK:1;
+ unsigned DT:1;
+ };
+} PORTCbits;
+extern volatile near unsigned char PORTD;
+extern volatile near union {
+ struct {
+ unsigned RD0:1;
+ unsigned RD1:1;
+ unsigned RD2:1;
+ unsigned RD3:1;
+ unsigned RD4:1;
+ unsigned RD5:1;
+ unsigned RD6:1;
+ unsigned RD7:1;
+ };
+ struct {
+ unsigned PSP0:1;
+ unsigned PSP1:1;
+ unsigned PSP2:1;
+ unsigned PSP3:1;
+ unsigned PSP4:1;
+ unsigned PSP5:1;
+ unsigned PSP6:1;
+ unsigned PSP7:1;
+ };
+ struct {
+ unsigned C1INB:1;
+ unsigned C1INA:1;
+ unsigned C2INB:1;
+ unsigned C2INA:1;
+ unsigned P1A:1;
+ unsigned P1B:1;
+ unsigned P1C:1;
+ unsigned P1D:1;
+ };
+ struct {
+ unsigned :4;
+ unsigned ECCP1:1;
+ };
+} PORTDbits;
+extern volatile near unsigned char PORTE;
+extern volatile near union {
+ struct {
+ unsigned RE0:1;
+ unsigned RE1:1;
+ unsigned RE2:1;
+ unsigned RE3:1;
+ };
+ struct {
+ unsigned AN5:1;
+ unsigned AN6:1;
+ unsigned AN7:1;
+ };
+ struct {
+ unsigned NOT_RD:1;
+ unsigned NOT_WR:1;
+ unsigned NOT_CS:1;
+ };
+ struct {
+ unsigned RD:1;
+ unsigned WR:1;
+ unsigned CS:1;
+ };
+} PORTEbits;
+extern volatile near unsigned char LATA;
+extern volatile near struct {
+ unsigned LATA0:1;
+ unsigned LATA1:1;
+ unsigned LATA2:1;
+ unsigned LATA3:1;
+ unsigned LATA4:1;
+ unsigned LATA5:1;
+ unsigned LATA6:1;
+ unsigned LATA7:1;
+} LATAbits;
+extern volatile near unsigned char LATB;
+extern volatile near struct {
+ unsigned LATB0:1;
+ unsigned LATB1:1;
+ unsigned LATB2:1;
+ unsigned LATB3:1;
+ unsigned LATB4:1;
+ unsigned LATB5:1;
+ unsigned LATB6:1;
+ unsigned LATB7:1;
+} LATBbits;
+extern volatile near unsigned char LATC;
+extern volatile near struct {
+ unsigned LATC0:1;
+ unsigned LATC1:1;
+ unsigned LATC2:1;
+ unsigned LATC3:1;
+ unsigned LATC4:1;
+ unsigned LATC5:1;
+ unsigned LATC6:1;
+ unsigned LATC7:1;
+} LATCbits;
+extern volatile near unsigned char LATD;
+extern volatile near struct {
+ unsigned LATD0:1;
+ unsigned LATD1:1;
+ unsigned LATD2:1;
+ unsigned LATD3:1;
+ unsigned LATD4:1;
+ unsigned LATD5:1;
+ unsigned LATD6:1;
+ unsigned LATD7:1;
+} LATDbits;
+extern volatile near unsigned char LATE;
+extern volatile near struct {
+ unsigned LATE0:1;
+ unsigned LATE1:1;
+ unsigned LATE2:1;
+} LATEbits;
+extern volatile near unsigned char DDRA;
+extern volatile near struct {
+ unsigned RA0:1;
+ unsigned RA1:1;
+ unsigned RA2:1;
+ unsigned RA3:1;
+ unsigned RA4:1;
+ unsigned RA5:1;
+ unsigned RA6:1;
+} DDRAbits;
+extern volatile near unsigned char TRISA;
+extern volatile near struct {
+ unsigned TRISA0:1;
+ unsigned TRISA1:1;
+ unsigned TRISA2:1;
+ unsigned TRISA3:1;
+ unsigned TRISA4:1;
+ unsigned TRISA5:1;
+ unsigned TRISA6:1;
+ unsigned TRISA7:1;
+} TRISAbits;
+extern volatile near unsigned char DDRB;
+extern volatile near struct {
+ unsigned RB0:1;
+ unsigned RB1:1;
+ unsigned RB2:1;
+ unsigned RB3:1;
+ unsigned RB4:1;
+ unsigned RB5:1;
+ unsigned RB6:1;
+ unsigned RB7:1;
+} DDRBbits;
+extern volatile near unsigned char TRISB;
+extern volatile near struct {
+ unsigned TRISB0:1;
+ unsigned TRISB1:1;
+ unsigned TRISB2:1;
+ unsigned TRISB3:1;
+ unsigned TRISB4:1;
+ unsigned TRISB5:1;
+ unsigned TRISB6:1;
+ unsigned TRISB7:1;
+} TRISBbits;
+extern volatile near unsigned char DDRC;
+extern volatile near struct {
+ unsigned RC0:1;
+ unsigned RC1:1;
+ unsigned RC2:1;
+ unsigned RC3:1;
+ unsigned RC4:1;
+ unsigned RC5:1;
+ unsigned RC6:1;
+ unsigned RC7:1;
+} DDRCbits;
+extern volatile near unsigned char TRISC;
+extern volatile near struct {
+ unsigned TRISC0:1;
+ unsigned TRISC1:1;
+ unsigned TRISC2:1;
+ unsigned TRISC3:1;
+ unsigned TRISC4:1;
+ unsigned TRISC5:1;
+ unsigned TRISC6:1;
+ unsigned TRISC7:1;
+} TRISCbits;
+extern volatile near unsigned char DDRD;
+extern volatile near struct {
+ unsigned RD0:1;
+ unsigned RD1:1;
+ unsigned RD2:1;
+ unsigned RD3:1;
+ unsigned RD4:1;
+ unsigned RD5:1;
+ unsigned RD6:1;
+ unsigned RD7:1;
+} DDRDbits;
+extern volatile near unsigned char TRISD;
+extern volatile near struct {
+ unsigned TRISD0:1;
+ unsigned TRISD1:1;
+ unsigned TRISD2:1;
+ unsigned TRISD3:1;
+ unsigned TRISD4:1;
+ unsigned TRISD5:1;
+ unsigned TRISD6:1;
+ unsigned TRISD7:1;
+} TRISDbits;
+extern volatile near unsigned char DDRE;
+extern volatile near struct {
+ unsigned RE0:1;
+ unsigned RE1:1;
+ unsigned RE2:1;
+ unsigned :1;
+ unsigned PSPMODE:1;
+ unsigned IBOV:1;
+ unsigned OBF:1;
+ unsigned IBF:1;
+} DDREbits;
+extern volatile near unsigned char TRISE;
+extern volatile near struct {
+ unsigned TRISE0:1;
+ unsigned TRISE1:1;
+ unsigned TRISE2:1;
+ unsigned :1;
+ unsigned PSPMODE:1;
+ unsigned IBOV:1;
+ unsigned OBF:1;
+ unsigned IBF:1;
+} TRISEbits;
+extern volatile near unsigned char OSCTUNE;
+extern volatile near union {
+ struct {
+ unsigned TUN0:1;
+ unsigned TUN1:1;
+ unsigned TUN2:1;
+ unsigned TUN3:1;
+ unsigned TUN4:1;
+ unsigned :1;
+ unsigned PLLEN:1;
+ unsigned INTSCR:1;
+ };
+ struct {
+ unsigned :7;
+ unsigned INTSRC:1;
+ };
+} OSCTUNEbits;
+extern volatile near unsigned char PIE1;
+extern volatile near struct {
+ unsigned TMR1IE:1;
+ unsigned TMR2IE:1;
+ unsigned CCP1IE:1;
+ unsigned SSPIE:1;
+ unsigned TXIE:1;
+ unsigned RCIE:1;
+ unsigned ADIE:1;
+ unsigned PSPIE:1;
+} PIE1bits;
+extern volatile near unsigned char PIR1;
+extern volatile near struct {
+ unsigned TMR1IF:1;
+ unsigned TMR2IF:1;
+ unsigned CCP1IF:1;
+ unsigned SSPIF:1;
+ unsigned TXIF:1;
+ unsigned RCIF:1;
+ unsigned ADIF:1;
+ unsigned PSPIF:1;
+} PIR1bits;
+extern volatile near unsigned char IPR1;
+extern volatile near union {
+ struct {
+ unsigned TMR1IP:1;
+ unsigned TMR2IP:1;
+ unsigned CCP1IP:1;
+ unsigned SSPIP:1;
+ unsigned TXBIP:1;
+ unsigned RCIP:1;
+ unsigned ADIP:1;
+ unsigned PSPIP:1;
+ };
+ struct {
+ unsigned :4;
+ unsigned TXIP:1;
+ };
+} IPR1bits;
+extern volatile near unsigned char PIE2;
+extern volatile near union {
+ struct {
+ unsigned ECCP1IE:1;
+ unsigned TMR3IE:1;
+ unsigned LVDIE:1;
+ unsigned BCLIE:1;
+ unsigned EEIE:1;
+ unsigned :1;
+ unsigned CMIE:1;
+ unsigned OSCFIE:1;
+ };
+ struct {
+ unsigned :2;
+ unsigned HLVDIE:1;
+ };
+} PIE2bits;
+extern volatile near unsigned char PIR2;
+extern volatile near union {
+ struct {
+ unsigned ECCP1IF:1;
+ unsigned TMR3IF:1;
+ unsigned LVDIF:1;
+ unsigned BCLIF:1;
+ unsigned EEIF:1;
+ unsigned :1;
+ unsigned CMIF:1;
+ unsigned OSCFIF:1;
+ };
+ struct {
+ unsigned :2;
+ unsigned HLVDIF:1;
+ };
+} PIR2bits;
+extern volatile near unsigned char IPR2;
+extern volatile near union {
+ struct {
+ unsigned ECCP1IP:1;
+ unsigned TMR3IP:1;
+ unsigned LVDIP:1;
+ unsigned BCLIP:1;
+ unsigned EEIP:1;
+ unsigned :1;
+ unsigned CMIP:1;
+ unsigned OSCFIP:1;
+ };
+ struct {
+ unsigned :2;
+ unsigned HLVDIP:1;
+ };
+} IPR2bits;
+extern volatile near unsigned char PIE3;
+extern volatile near union {
+ struct {
+ unsigned RXB0IE:1;
+ unsigned RXB1IE:1;
+ unsigned TXB0IE:1;
+ unsigned TXB1IE:1;
+ unsigned TXB2IE:1;
+ unsigned ERRIE:1;
+ unsigned WAKIE:1;
+ unsigned IRXIE:1;
+ };
+ struct {
+ unsigned FIFOWMIE:1;
+ unsigned RXBnIE:1;
+ unsigned :2;
+ unsigned TXBnIE:1;
+ };
+ struct {
+ unsigned FIFOMWIE:1;
+ };
+} PIE3bits;
+extern volatile near unsigned char PIR3;
+extern volatile near union {
+ struct {
+ unsigned RXB0IF:1;
+ unsigned RXB1IF:1;
+ unsigned TXB0IF:1;
+ unsigned TXB1IF:1;
+ unsigned TXB2IF:1;
+ unsigned ERRIF:1;
+ unsigned WAKIF:1;
+ unsigned IRXIF:1;
+ };
+ struct {
+ unsigned FIFOWMIF:1;
+ unsigned RXBnIF:1;
+ unsigned :2;
+ unsigned TXBnIF:1;
+ };
+} PIR3bits;
+extern volatile near unsigned char IPR3;
+extern volatile near union {
+ struct {
+ unsigned RXB0IP:1;
+ unsigned RXB1IP:1;
+ unsigned TXB0IP:1;
+ unsigned TXB1IP:1;
+ unsigned TXB2IP:1;
+ unsigned ERRIP:1;
+ unsigned WAKIP:1;
+ unsigned IRXIP:1;
+ };
+ struct {
+ unsigned FIFOWMIP:1;
+ unsigned RXBnIP:1;
+ unsigned :2;
+ unsigned TXBnIP:1;
+ };
+} IPR3bits;
+extern volatile near unsigned char EECON1;
+extern volatile near struct {
+ unsigned RD:1;
+ unsigned WR:1;
+ unsigned WREN:1;
+ unsigned WRERR:1;
+ unsigned FREE:1;
+ unsigned :1;
+ unsigned CFGS:1;
+ unsigned EEPGD:1;
+} EECON1bits;
+extern volatile near unsigned char EECON2;
+extern volatile near unsigned char EEDATA;
+extern volatile near unsigned char EEADR;
+extern volatile near unsigned char EEADRH;
+extern volatile near unsigned char RCSTA;
+extern volatile near union {
+ struct {
+ unsigned RX9D:1;
+ unsigned OERR:1;
+ unsigned FERR:1;
+ unsigned ADEN:1;
+ unsigned CREN:1;
+ unsigned SREN:1;
+ unsigned RX9:1;
+ unsigned SPEN:1;
+ };
+ struct {
+ unsigned :3;
+ unsigned ADDEN:1;
+ };
+} RCSTAbits;
+extern volatile near unsigned char TXSTA;
+extern volatile near struct {
+ unsigned TX9D:1;
+ unsigned TRMT:1;
+ unsigned BRGH:1;
+ unsigned SENDB:1;
+ unsigned SYNC:1;
+ unsigned TXEN:1;
+ unsigned TX9:1;
+ unsigned CSRC:1;
+} TXSTAbits;
+extern volatile near unsigned char TXREG;
+extern volatile near unsigned char RCREG;
+extern volatile near unsigned char SPBRG;
+extern volatile near unsigned char SPBRGH;
+extern volatile near unsigned char T3CON;
+extern volatile near union {
+ struct {
+ unsigned TMR3ON:1;
+ unsigned TMR3CS:1;
+ unsigned T3SYNC:1;
+ unsigned T3CCP1:1;
+ unsigned T3CKPS0:1;
+ unsigned T3CKPS1:1;
+ unsigned T3CCP2:1;
+ unsigned RD16:1;
+ };
+ struct {
+ unsigned :2;
+ unsigned T3NSYNC:1;
+ };
+ struct {
+ unsigned :6;
+ unsigned T3ECCP1:1;
+ };
+ struct {
+ unsigned :2;
+ unsigned NOT_T3SYNC:1;
+ };
+} T3CONbits;
+extern volatile near unsigned char TMR3L;
+extern volatile near unsigned char TMR3H;
+extern volatile near unsigned char CMCON;
+extern volatile near struct {
+ unsigned CM0:1;
+ unsigned CM1:1;
+ unsigned CM2:1;
+ unsigned CIS:1;
+ unsigned C1INV:1;
+ unsigned C2INV:1;
+ unsigned C1OUT:1;
+ unsigned C2OUT:1;
+} CMCONbits;
+extern volatile near unsigned char CVRCON;
+extern volatile near union {
+ struct {
+ unsigned CVR0:1;
+ unsigned CVR1:1;
+ unsigned CVR2:1;
+ unsigned CVR3:1;
+ unsigned CVREF:1;
+ unsigned CVRR:1;
+ unsigned CVROE:1;
+ unsigned CVREN:1;
+ };
+ struct {
+ unsigned :4;
+ unsigned CVRSS:1;
+ };
+} CVRCONbits;
+extern volatile near unsigned char ECCP1AS;
+extern volatile near struct {
+ unsigned PSSBD0:1;
+ unsigned PSSBD1:1;
+ unsigned PSSAC0:1;
+ unsigned PSSAC1:1;
+ unsigned ECCPAS0:1;
+ unsigned ECCPAS1:1;
+ unsigned ECCPAS2:1;
+ unsigned ECCPASE:1;
+} ECCP1ASbits;
+extern volatile near unsigned char ECCP1DEL;
+extern volatile near struct {
+ unsigned PDC0:1;
+ unsigned PDC1:1;
+ unsigned PDC2:1;
+ unsigned PDC3:1;
+ unsigned PDC4:1;
+ unsigned PDC5:1;
+ unsigned PDC6:1;
+ unsigned PRSEN:1;
+} ECCP1DELbits;
+extern volatile near unsigned char BAUDCON;
+extern volatile near struct {
+ unsigned ABDEN:1;
+ unsigned WUE:1;
+ unsigned :1;
+ unsigned BRG16:1;
+ unsigned SCKP:1;
+ unsigned :1;
+ unsigned RCIDL:1;
+ unsigned ABDOVF:1;
+} BAUDCONbits;
+extern volatile near unsigned char ECCP1CON;
+extern volatile near struct {
+ unsigned ECCP1M0:1;
+ unsigned ECCP1M1:1;
+ unsigned ECCP1M2:1;
+ unsigned ECCP1M3:1;
+ unsigned EDC1B0:1;
+ unsigned EDC1B1:1;
+ unsigned EPWM1M0:1;
+ unsigned EPWM1M1:1;
+} ECCP1CONbits;
+extern volatile near unsigned ECCPR1;
+extern volatile near unsigned char ECCPR1L;
+extern volatile near unsigned char ECCPR1H;
+extern volatile near unsigned char CCP1CON;
+extern volatile near struct {
+ unsigned CCP1M0:1;
+ unsigned CCP1M1:1;
+ unsigned CCP1M2:1;
+ unsigned CCP1M3:1;
+ unsigned DC1B0:1;
+ unsigned DC1B1:1;
+} CCP1CONbits;
+extern volatile near unsigned CCPR1;
+extern volatile near unsigned char CCPR1L;
+extern volatile near unsigned char CCPR1H;
+extern volatile near unsigned char ADCON2;
+extern volatile near struct {
+ unsigned ADCS0:1;
+ unsigned ADCS1:1;
+ unsigned ADCS2:1;
+ unsigned ACQT0:1;
+ unsigned ACQT1:1;
+ unsigned ACQT2:1;
+ unsigned :1;
+ unsigned ADFM:1;
+} ADCON2bits;
+extern volatile near unsigned char ADCON1;
+extern volatile near struct {
+ unsigned PCFG0:1;
+ unsigned PCFG1:1;
+ unsigned PCFG2:1;
+ unsigned PCFG3:1;
+ unsigned VCFG0:1;
+ unsigned VCFG1:1;
+} ADCON1bits;
+extern volatile near unsigned char ADCON0;
+extern volatile near union {
+ struct {
+ unsigned ADON:1;
+ unsigned GO_DONE:1;
+ unsigned CHS0:1;
+ unsigned CHS1:1;
+ unsigned CHS2:1;
+ unsigned CHS3:1;
+ };
+ struct {
+ unsigned :1;
+ unsigned DONE:1;
+ };
+ struct {
+ unsigned :1;
+ unsigned GO:1;
+ };
+ struct {
+ unsigned :1;
+ unsigned NOT_DONE:1;
+ };
+} ADCON0bits;
+extern volatile near unsigned ADRES;
+extern volatile near unsigned char ADRESL;
+extern volatile near unsigned char ADRESH;
+extern volatile near unsigned char SSPCON2;
+extern volatile near struct {
+ unsigned SEN:1;
+ unsigned RSEN:1;
+ unsigned PEN:1;
+ unsigned RCEN:1;
+ unsigned ACKEN:1;
+ unsigned ACKDT:1;
+ unsigned ACKSTAT:1;
+ unsigned GCEN:1;
+} SSPCON2bits;
+extern volatile near unsigned char SSPCON1;
+extern volatile near struct {
+ unsigned SSPM0:1;
+ unsigned SSPM1:1;
+ unsigned SSPM2:1;
+ unsigned SSPM3:1;
+ unsigned CKP:1;
+ unsigned SSPEN:1;
+ unsigned SSPOV:1;
+ unsigned WCOL:1;
+} SSPCON1bits;
+extern volatile near unsigned char SSPSTAT;
+extern volatile near union {
+ struct {
+ unsigned BF:1;
+ unsigned UA:1;
+ unsigned R_W:1;
+ unsigned S:1;
+ unsigned P:1;
+ unsigned D_A:1;
+ unsigned CKE:1;
+ unsigned SMP:1;
+ };
+ struct {
+ unsigned :2;
+ unsigned I2C_READ:1;
+ unsigned I2C_START:1;
+ unsigned I2C_STOP:1;
+ unsigned I2C_DAT:1;
+ };
+ struct {
+ unsigned :2;
+ unsigned NOT_W:1;
+ unsigned :2;
+ unsigned NOT_A:1;
+ };
+ struct {
+ unsigned :2;
+ unsigned NOT_WRITE:1;
+ unsigned :2;
+ unsigned NOT_ADDRESS:1;
+ };
+ struct {
+ unsigned :2;
+ unsigned READ_WRITE:1;
+ unsigned :2;
+ unsigned DATA_ADDRESS:1;
+ };
+ struct {
+ unsigned :2;
+ unsigned R:1;
+ unsigned :2;
+ unsigned D:1;
+ };
+} SSPSTATbits;
+extern volatile near unsigned char SSPADD;
+extern volatile near unsigned char SSPBUF;
+extern volatile near unsigned char T2CON;
+extern volatile near struct {
+ unsigned T2CKPS0:1;
+ unsigned T2CKPS1:1;
+ unsigned TMR2ON:1;
+ unsigned T2OUTPS0:1;
+ unsigned T2OUTPS1:1;
+ unsigned T2OUTPS2:1;
+ unsigned T2OUTPS3:1;
+} T2CONbits;
+extern volatile near unsigned char PR2;
+extern volatile near unsigned char TMR2;
+extern volatile near unsigned char T1CON;
+extern volatile near union {
+ struct {
+ unsigned TMR1ON:1;
+ unsigned TMR1CS:1;
+ unsigned T1SYNC:1;
+ unsigned T1OSCEN:1;
+ unsigned T1CKPS0:1;
+ unsigned T1CKPS1:1;
+ unsigned T1RUN:1;
+ unsigned RD16:1;
+ };
+ struct {
+ unsigned :2;
+ unsigned T1INSYNC:1;
+ };
+ struct {
+ unsigned :2;
+ unsigned NOT_T1SYNC:1;
+ };
+} T1CONbits;
+extern volatile near unsigned char TMR1L;
+extern volatile near unsigned char TMR1H;
+extern volatile near unsigned char RCON;
+extern volatile near union {
+ struct {
+ unsigned NOT_BOR:1;
+ unsigned NOT_POR:1;
+ unsigned NOT_PD:1;
+ unsigned NOT_TO:1;
+ unsigned NOT_RI:1;
+ unsigned :1;
+ unsigned SBOREN:1;
+ unsigned IPEN:1;
+ };
+ struct {
+ unsigned BOR:1;
+ unsigned POR:1;
+ unsigned PD:1;
+ unsigned TO:1;
+ unsigned RI:1;
+ };
+} RCONbits;
+extern volatile near unsigned char WDTCON;
+extern volatile near union {
+ struct {
+ unsigned SWDTEN:1;
+ };
+ struct {
+ unsigned SWDTE:1;
+ };
+} WDTCONbits;
+extern volatile near unsigned char HLVDCON;
+extern volatile near union {
+ struct {
+ unsigned LVDL0:1;
+ unsigned LVDL1:1;
+ unsigned LVDL2:1;
+ unsigned LVDL3:1;
+ unsigned LVDEN:1;
+ unsigned IRVST:1;
+ };
+ struct {
+ unsigned LVV0:1;
+ unsigned LVV1:1;
+ unsigned LVV2:1;
+ unsigned LVV3:1;
+ unsigned :1;
+ unsigned BGST:1;
+ };
+ struct {
+ unsigned HLVDL0:1;
+ unsigned HLVDL1:1;
+ unsigned HLVDL2:1;
+ unsigned HLVDL3:1;
+ unsigned HLVDEN:1;
+ unsigned :2;
+ unsigned VDIRMAG:1;
+ };
+ struct {
+ unsigned :5;
+ unsigned IVRST:1;
+ };
+} HLVDCONbits;
+extern volatile near unsigned char LVDCON;
+extern volatile near union {
+ struct {
+ unsigned LVDL0:1;
+ unsigned LVDL1:1;
+ unsigned LVDL2:1;
+ unsigned LVDL3:1;
+ unsigned LVDEN:1;
+ unsigned IRVST:1;
+ };
+ struct {
+ unsigned LVV0:1;
+ unsigned LVV1:1;
+ unsigned LVV2:1;
+ unsigned LVV3:1;
+ unsigned :1;
+ unsigned BGST:1;
+ };
+ struct {
+ unsigned HLVDL0:1;
+ unsigned HLVDL1:1;
+ unsigned HLVDL2:1;
+ unsigned HLVDL3:1;
+ unsigned HLVDEN:1;
+ unsigned :2;
+ unsigned VDIRMAG:1;
+ };
+ struct {
+ unsigned :5;
+ unsigned IVRST:1;
+ };
+} LVDCONbits;
+extern volatile near unsigned char OSCCON;
+extern volatile near struct {
+ unsigned SCS0:1;
+ unsigned SCS1:1;
+ unsigned IOFS:1;
+ unsigned OSTS:1;
+ unsigned IRCF0:1;
+ unsigned IRCF1:1;
+ unsigned IRCF2:1;
+ unsigned IDLEN:1;
+} OSCCONbits;
+extern volatile near unsigned char T0CON;
+extern volatile near union {
+ struct {
+ unsigned T0PS0:1;
+ unsigned T0PS1:1;
+ unsigned T0PS2:1;
+ unsigned PSA:1;
+ unsigned T0SE:1;
+ unsigned T0CS:1;
+ unsigned T08BIT:1;
+ unsigned TMR0ON:1;
+ };
+ struct {
+ unsigned :3;
+ unsigned T0PS3:1;
+ };
+} T0CONbits;
+extern volatile near unsigned char TMR0L;
+extern volatile near unsigned char TMR0H;
+extern near unsigned char STATUS;
+extern near struct {
+ unsigned C:1;
+ unsigned DC:1;
+ unsigned Z:1;
+ unsigned OV:1;
+ unsigned N:1;
+} STATUSbits;
+extern near unsigned FSR2;
+extern near unsigned char FSR2L;
+extern near unsigned char FSR2H;
+extern volatile near unsigned char PLUSW2;
+extern volatile near unsigned char PREINC2;
+extern volatile near unsigned char POSTDEC2;
+extern volatile near unsigned char POSTINC2;
+extern near unsigned char INDF2;
+extern near unsigned char BSR;
+extern near unsigned FSR1;
+extern near unsigned char FSR1L;
+extern near unsigned char FSR1H;
+extern volatile near unsigned char PLUSW1;
+extern volatile near unsigned char PREINC1;
+extern volatile near unsigned char POSTDEC1;
+extern volatile near unsigned char POSTINC1;
+extern near unsigned char INDF1;
+extern near unsigned char WREG;
+extern near unsigned FSR0;
+extern near unsigned char FSR0L;
+extern near unsigned char FSR0H;
+extern volatile near unsigned char PLUSW0;
+extern volatile near unsigned char PREINC0;
+extern volatile near unsigned char POSTDEC0;
+extern volatile near unsigned char POSTINC0;
+extern near unsigned char INDF0;
+extern volatile near unsigned char INTCON3;
+extern volatile near union {
+ struct {
+ unsigned INT1IF:1;
+ unsigned INT2IF:1;
+ unsigned :1;
+ unsigned INT1IE:1;
+ unsigned INT2IE:1;
+ unsigned :1;
+ unsigned INT1IP:1;
+ unsigned INT2IP:1;
+ };
+ struct {
+ unsigned INT1F:1;
+ unsigned INT2F:1;
+ unsigned :1;
+ unsigned INT1E:1;
+ unsigned INT2E:1;
+ unsigned :1;
+ unsigned INT1P:1;
+ unsigned INT2P:1;
+ };
+} INTCON3bits;
+extern volatile near unsigned char INTCON2;
+extern volatile near union {
+ struct {
+ unsigned RBIP:1;
+ unsigned :1;
+ unsigned TMR0IP:1;
+ unsigned :1;
+ unsigned INTEDG2:1;
+ unsigned INTEDG1:1;
+ unsigned INTEDG0:1;
+ unsigned NOT_RBPU:1;
+ };
+ struct {
+ unsigned :2;
+ unsigned T0IP:1;
+ unsigned :4;
+ unsigned RBPU:1;
+ };
+} INTCON2bits;
+extern volatile near unsigned char INTCON;
+extern volatile near union {
+ struct {
+ unsigned RBIF:1;
+ unsigned INT0IF:1;
+ unsigned TMR0IF:1;
+ unsigned RBIE:1;
+ unsigned INT0IE:1;
+ unsigned TMR0IE:1;
+ unsigned PEIE:1;
+ unsigned GIE:1;
+ };
+ struct {
+ unsigned :1;
+ unsigned INT0F:1;
+ unsigned T0IF:1;
+ unsigned :1;
+ unsigned INT0E:1;
+ unsigned T0IE:1;
+ unsigned GIEL:1;
+ unsigned GIEH:1;
+ };
+} INTCONbits;
+extern near unsigned PROD;
+extern near unsigned char PRODL;
+extern near unsigned char PRODH;
+extern volatile near unsigned char TABLAT;
+extern volatile near unsigned short long TBLPTR;
+extern volatile near unsigned char TBLPTRL;
+extern volatile near unsigned char TBLPTRH;
+extern volatile near unsigned char TBLPTRU;
+extern volatile near unsigned short long PC;
+extern volatile near unsigned char PCL;
+extern volatile near unsigned char PCLATH;
+extern volatile near unsigned char PCLATU;
+extern volatile near unsigned char STKPTR;
+extern volatile near union {
+ struct {
+ unsigned STKPTR0:1;
+ unsigned STKPTR1:1;
+ unsigned STKPTR2:1;
+ unsigned STKPTR3:1;
+ unsigned STKPTR4:1;
+ unsigned :1;
+ unsigned STKUNF:1;
+ unsigned STKOVF:1;
+ };
+ struct {
+ unsigned SP0:1;
+ unsigned SP1:1;
+ unsigned SP2:1;
+ unsigned SP3:1;
+ unsigned SP4:1;
+ unsigned :2;
+ unsigned STKFUL:1;
+ };
+} STKPTRbits;
+extern near unsigned short long TOS;
+extern near unsigned char TOSL;
+extern near unsigned char TOSH;
+extern near unsigned char TOSU;
+
+#pragma varlocate 13 RXF6SIDH
+#pragma varlocate 13 RXF6SIDHbits
+#pragma varlocate 13 RXF6SIDL
+#pragma varlocate 13 RXF6SIDLbits
+#pragma varlocate 13 RXF6EIDH
+#pragma varlocate 13 RXF6EIDHbits
+#pragma varlocate 13 RXF6EIDL
+#pragma varlocate 13 RXF6EIDLbits
+#pragma varlocate 13 RXF7SIDH
+#pragma varlocate 13 RXF7SIDHbits
+#pragma varlocate 13 RXF7SIDL
+#pragma varlocate 13 RXF7SIDLbits
+#pragma varlocate 13 RXF7EIDH
+#pragma varlocate 13 RXF7EIDHbits
+#pragma varlocate 13 RXF7EIDL
+#pragma varlocate 13 RXF7EIDLbits
+#pragma varlocate 13 RXF8SIDH
+#pragma varlocate 13 RXF8SIDHbits
+#pragma varlocate 13 RXF8SIDL
+#pragma varlocate 13 RXF8SIDLbits
+#pragma varlocate 13 RXF8EIDH
+#pragma varlocate 13 RXF8EIDHbits
+#pragma varlocate 13 RXF8EIDL
+#pragma varlocate 13 RXF8EIDLbits
+#pragma varlocate 13 RXF9SIDH
+#pragma varlocate 13 RXF9SIDHbits
+#pragma varlocate 13 RXF9SIDL
+#pragma varlocate 13 RXF9SIDLbits
+#pragma varlocate 13 RXF9EIDH
+#pragma varlocate 13 RXF9EIDHbits
+#pragma varlocate 13 RXF9EIDL
+#pragma varlocate 13 RXF9EIDLbits
+#pragma varlocate 13 RXF10SIDH
+#pragma varlocate 13 RXF10SIDHbits
+#pragma varlocate 13 RXF10SIDL
+#pragma varlocate 13 RXF10SIDLbits
+#pragma varlocate 13 RXF10EIDH
+#pragma varlocate 13 RXF10EIDHbits
+#pragma varlocate 13 RXF10EIDL
+#pragma varlocate 13 RXF10EIDLbits
+#pragma varlocate 13 RXF11SIDH
+#pragma varlocate 13 RXF11SIDHbits
+#pragma varlocate 13 RXF11SIDL
+#pragma varlocate 13 RXF11SIDLbits
+#pragma varlocate 13 RXF11EIDH
+#pragma varlocate 13 RXF11EIDHbits
+#pragma varlocate 13 RXF11EIDL
+#pragma varlocate 13 RXF11EIDLbits
+#pragma varlocate 13 RXF12SIDH
+#pragma varlocate 13 RXF12SIDHbits
+#pragma varlocate 13 RXF12SIDL
+#pragma varlocate 13 RXF12SIDLbits
+#pragma varlocate 13 RXF12EIDH
+#pragma varlocate 13 RXF12EIDHbits
+#pragma varlocate 13 RXF12EIDL
+#pragma varlocate 13 RXF12EIDLbits
+#pragma varlocate 13 RXF13SIDH
+#pragma varlocate 13 RXF13SIDHbits
+#pragma varlocate 13 RXF13SIDL
+#pragma varlocate 13 RXF13SIDLbits
+#pragma varlocate 13 RXF13EIDH
+#pragma varlocate 13 RXF13EIDHbits
+#pragma varlocate 13 RXF13EIDL
+#pragma varlocate 13 RXF13EIDLbits
+#pragma varlocate 13 RXF14SIDH
+#pragma varlocate 13 RXF14SIDHbits
+#pragma varlocate 13 RXF14SIDL
+#pragma varlocate 13 RXF14SIDLbits
+#pragma varlocate 13 RXF14EIDH
+#pragma varlocate 13 RXF14EIDHbits
+#pragma varlocate 13 RXF14EIDL
+#pragma varlocate 13 RXF14EIDLbits
+#pragma varlocate 13 RXF15SIDH
+#pragma varlocate 13 RXF15SIDHbits
+#pragma varlocate 13 RXF15SIDL
+#pragma varlocate 13 RXF15SIDLbits
+#pragma varlocate 13 RXF15EIDH
+#pragma varlocate 13 RXF15EIDHbits
+#pragma varlocate 13 RXF15EIDL
+#pragma varlocate 13 RXF15EIDLbits
+#pragma varlocate 13 RXFCON0
+#pragma varlocate 13 RXFCON0bits
+#pragma varlocate 13 RXFCON1
+#pragma varlocate 13 RXFCON1bits
+#pragma varlocate 13 SDFLC
+#pragma varlocate 13 SDFLCbits
+#pragma varlocate 13 RXFBCON0
+#pragma varlocate 13 RXFBCON0bits
+#pragma varlocate 13 RXFBCON1
+#pragma varlocate 13 RXFBCON1bits
+#pragma varlocate 13 RXFBCON2
+#pragma varlocate 13 RXFBCON2bits
+#pragma varlocate 13 RXFBCON3
+#pragma varlocate 13 RXFBCON3bits
+#pragma varlocate 13 RXFBCON4
+#pragma varlocate 13 RXFBCON4bits
+#pragma varlocate 13 RXFBCON5
+#pragma varlocate 13 RXFBCON5bits
+#pragma varlocate 13 RXFBCON6
+#pragma varlocate 13 RXFBCON6bits
+#pragma varlocate 13 RXFBCON7
+#pragma varlocate 13 RXFBCON7bits
+#pragma varlocate 13 MSEL0
+#pragma varlocate 13 MSEL0bits
+#pragma varlocate 13 MSEL1
+#pragma varlocate 13 MSEL1bits
+#pragma varlocate 13 MSEL2
+#pragma varlocate 13 MSEL2bits
+#pragma varlocate 13 MSEL3
+#pragma varlocate 13 MSEL3bits
+#pragma varlocate 13 BSEL0
+#pragma varlocate 13 BSEL0bits
+#pragma varlocate 13 BIE0
+#pragma varlocate 13 BIE0bits
+#pragma varlocate 13 TXBIE
+#pragma varlocate 13 TXBIEbits
+#pragma varlocate 14 B0CON
+#pragma varlocate 14 B0CONbits
+#pragma varlocate 14 B0SIDH
+#pragma varlocate 14 B0SIDHbits
+#pragma varlocate 14 B0SIDL
+#pragma varlocate 14 B0SIDLbits
+#pragma varlocate 14 B0EIDH
+#pragma varlocate 14 B0EIDHbits
+#pragma varlocate 14 B0EIDL
+#pragma varlocate 14 B0EIDLbits
+#pragma varlocate 14 B0DLC
+#pragma varlocate 14 B0DLCbits
+#pragma varlocate 14 B0D0
+#pragma varlocate 14 B0D0bits
+#pragma varlocate 14 B0D1
+#pragma varlocate 14 B0D1bits
+#pragma varlocate 14 B0D2
+#pragma varlocate 14 B0D2bits
+#pragma varlocate 14 B0D3
+#pragma varlocate 14 B0D3bits
+#pragma varlocate 14 B0D4
+#pragma varlocate 14 B0D4bits
+#pragma varlocate 14 B0D5
+#pragma varlocate 14 B0D5bits
+#pragma varlocate 14 B0D6
+#pragma varlocate 14 B0D6bits
+#pragma varlocate 14 B0D7
+#pragma varlocate 14 B0D7bits
+#pragma varlocate 14 CANSTAT_RO9
+#pragma varlocate 14 CANSTAT_RO9bits
+#pragma varlocate 14 CANCON_RO9
+#pragma varlocate 14 CANCON_RO9bits
+#pragma varlocate 14 B1CON
+#pragma varlocate 14 B1CONbits
+#pragma varlocate 14 B1SIDH
+#pragma varlocate 14 B1SIDHbits
+#pragma varlocate 14 B1SIDL
+#pragma varlocate 14 B1SIDLbits
+#pragma varlocate 14 B1EIDH
+#pragma varlocate 14 B1EIDHbits
+#pragma varlocate 14 B1EIDL
+#pragma varlocate 14 B1EIDLbits
+#pragma varlocate 14 B1DLC
+#pragma varlocate 14 B1DLCbits
+#pragma varlocate 14 B1D0
+#pragma varlocate 14 B1D0bits
+#pragma varlocate 14 B1D1
+#pragma varlocate 14 B1D1bits
+#pragma varlocate 14 B1D2
+#pragma varlocate 14 B1D2bits
+#pragma varlocate 14 B1D3
+#pragma varlocate 14 B1D3bits
+#pragma varlocate 14 B1D4
+#pragma varlocate 14 B1D4bits
+#pragma varlocate 14 B1D5
+#pragma varlocate 14 B1D5bits
+#pragma varlocate 14 B1D6
+#pragma varlocate 14 B1D6bits
+#pragma varlocate 14 B1D7
+#pragma varlocate 14 B1D7bits
+#pragma varlocate 14 CANSTAT_RO8
+#pragma varlocate 14 CANSTAT_RO8bits
+#pragma varlocate 14 CANCON_RO8
+#pragma varlocate 14 CANCON_RO8bits
+#pragma varlocate 14 B2CON
+#pragma varlocate 14 B2CONbits
+#pragma varlocate 14 B2SIDH
+#pragma varlocate 14 B2SIDHbits
+#pragma varlocate 14 B2SIDL
+#pragma varlocate 14 B2SIDLbits
+#pragma varlocate 14 B2EIDH
+#pragma varlocate 14 B2EIDHbits
+#pragma varlocate 14 B2EIDL
+#pragma varlocate 14 B2EIDLbits
+#pragma varlocate 14 B2DLC
+#pragma varlocate 14 B2DLCbits
+#pragma varlocate 14 B2D0
+#pragma varlocate 14 B2D0bits
+#pragma varlocate 14 B2D1
+#pragma varlocate 14 B2D1bits
+#pragma varlocate 14 B2D2
+#pragma varlocate 14 B2D2bits
+#pragma varlocate 14 B2D3
+#pragma varlocate 14 B2D3bits
+#pragma varlocate 14 B2D4
+#pragma varlocate 14 B2D4bits
+#pragma varlocate 14 B2D5
+#pragma varlocate 14 B2D5bits
+#pragma varlocate 14 B2D6
+#pragma varlocate 14 B2D6bits
+#pragma varlocate 14 B2D7
+#pragma varlocate 14 B2D7bits
+#pragma varlocate 14 CANSTAT_RO7
+#pragma varlocate 14 CANSTAT_RO7bits
+#pragma varlocate 14 CANCON_RO7
+#pragma varlocate 14 CANCON_RO7bits
+#pragma varlocate 14 B3CON
+#pragma varlocate 14 B3CONbits
+#pragma varlocate 14 B3SIDH
+#pragma varlocate 14 B3SIDHbits
+#pragma varlocate 14 B3SIDL
+#pragma varlocate 14 B3SIDLbits
+#pragma varlocate 14 B3EIDH
+#pragma varlocate 14 B3EIDHbits
+#pragma varlocate 14 B3EIDL
+#pragma varlocate 14 B3EIDLbits
+#pragma varlocate 14 B3DLC
+#pragma varlocate 14 B3DLCbits
+#pragma varlocate 14 B3D0
+#pragma varlocate 14 B3D0bits
+#pragma varlocate 14 B3D1
+#pragma varlocate 14 B3D1bits
+#pragma varlocate 14 B3D2
+#pragma varlocate 14 B3D2bits
+#pragma varlocate 14 B3D3
+#pragma varlocate 14 B3D3bits
+#pragma varlocate 14 B3D4
+#pragma varlocate 14 B3D4bits
+#pragma varlocate 14 B3D5
+#pragma varlocate 14 B3D5bits
+#pragma varlocate 14 B3D6
+#pragma varlocate 14 B3D6bits
+#pragma varlocate 14 B3D7
+#pragma varlocate 14 B3D7bits
+#pragma varlocate 14 CANSTAT_RO6
+#pragma varlocate 14 CANSTAT_RO6bits
+#pragma varlocate 14 CANCON_RO6
+#pragma varlocate 14 CANCON_RO6bits
+#pragma varlocate 14 B4CON
+#pragma varlocate 14 B4CONbits
+#pragma varlocate 14 B4SIDH
+#pragma varlocate 14 B4SIDHbits
+#pragma varlocate 14 B4SIDL
+#pragma varlocate 14 B4SIDLbits
+#pragma varlocate 14 B4EIDH
+#pragma varlocate 14 B4EIDHbits
+#pragma varlocate 14 B4EIDL
+#pragma varlocate 14 B4EIDLbits
+#pragma varlocate 14 B4DLC
+#pragma varlocate 14 B4DLCbits
+#pragma varlocate 14 B4D0
+#pragma varlocate 14 B4D0bits
+#pragma varlocate 14 B4D1
+#pragma varlocate 14 B4D1bits
+#pragma varlocate 14 B4D2
+#pragma varlocate 14 B4D2bits
+#pragma varlocate 14 B4D3
+#pragma varlocate 14 B4D3bits
+#pragma varlocate 14 B4D4
+#pragma varlocate 14 B4D4bits
+#pragma varlocate 14 B4D5
+#pragma varlocate 14 B4D5bits
+#pragma varlocate 14 B4D6
+#pragma varlocate 14 B4D6bits
+#pragma varlocate 14 B4D7
+#pragma varlocate 14 B4D7bits
+#pragma varlocate 14 CANSTAT_RO5
+#pragma varlocate 14 CANSTAT_RO5bits
+#pragma varlocate 14 CANCON_RO5
+#pragma varlocate 14 CANCON_RO5bits
+#pragma varlocate 14 B5CON
+#pragma varlocate 14 B5CONbits
+#pragma varlocate 14 B5SIDH
+#pragma varlocate 14 B5SIDHbits
+#pragma varlocate 14 B5SIDL
+#pragma varlocate 14 B5SIDLbits
+#pragma varlocate 14 B5EIDH
+#pragma varlocate 14 B5EIDHbits
+#pragma varlocate 14 B5EIDL
+#pragma varlocate 14 B5EIDLbits
+#pragma varlocate 14 B5DLC
+#pragma varlocate 14 B5DLCbits
+#pragma varlocate 14 B5D0
+#pragma varlocate 14 B5D0bits
+#pragma varlocate 14 B5D1
+#pragma varlocate 14 B5D1bits
+#pragma varlocate 14 B5D2
+#pragma varlocate 14 B5D2bits
+#pragma varlocate 14 B5D3
+#pragma varlocate 14 B5D3bits
+#pragma varlocate 14 B5D4
+#pragma varlocate 14 B5D4bits
+#pragma varlocate 14 B5D5
+#pragma varlocate 14 B5D5bits
+#pragma varlocate 14 B5D6
+#pragma varlocate 14 B5D6bits
+#pragma varlocate 14 B5D7
+#pragma varlocate 14 B5D7bits
+#pragma varlocate 14 CANSTAT_RO4
+#pragma varlocate 14 CANSTAT_RO4bits
+#pragma varlocate 14 CANCON_RO4
+#pragma varlocate 14 CANCON_RO4bits
+#pragma varlocate 15 RXF0SIDH
+#pragma varlocate 15 RXF0SIDHbits
+#pragma varlocate 15 RXF0SIDL
+#pragma varlocate 15 RXF0SIDLbits
+#pragma varlocate 15 RXF0EIDH
+#pragma varlocate 15 RXF0EIDHbits
+#pragma varlocate 15 RXF0EIDL
+#pragma varlocate 15 RXF0EIDLbits
+#pragma varlocate 15 RXF1SIDH
+#pragma varlocate 15 RXF1SIDHbits
+#pragma varlocate 15 RXF1SIDL
+#pragma varlocate 15 RXF1SIDLbits
+#pragma varlocate 15 RXF1EIDH
+#pragma varlocate 15 RXF1EIDHbits
+#pragma varlocate 15 RXF1EIDL
+#pragma varlocate 15 RXF1EIDLbits
+#pragma varlocate 15 RXF2SIDH
+#pragma varlocate 15 RXF2SIDHbits
+#pragma varlocate 15 RXF2SIDL
+#pragma varlocate 15 RXF2SIDLbits
+#pragma varlocate 15 RXF2EIDH
+#pragma varlocate 15 RXF2EIDHbits
+#pragma varlocate 15 RXF2EIDL
+#pragma varlocate 15 RXF2EIDLbits
+#pragma varlocate 15 RXF3SIDH
+#pragma varlocate 15 RXF3SIDHbits
+#pragma varlocate 15 RXF3SIDL
+#pragma varlocate 15 RXF3SIDLbits
+#pragma varlocate 15 RXF3EIDH
+#pragma varlocate 15 RXF3EIDHbits
+#pragma varlocate 15 RXF3EIDL
+#pragma varlocate 15 RXF3EIDLbits
+#pragma varlocate 15 RXF4SIDH
+#pragma varlocate 15 RXF4SIDHbits
+#pragma varlocate 15 RXF4SIDL
+#pragma varlocate 15 RXF4SIDLbits
+#pragma varlocate 15 RXF4EIDH
+#pragma varlocate 15 RXF4EIDHbits
+#pragma varlocate 15 RXF4EIDL
+#pragma varlocate 15 RXF4EIDLbits
+#pragma varlocate 15 RXF5SIDH
+#pragma varlocate 15 RXF5SIDHbits
+#pragma varlocate 15 RXF5SIDL
+#pragma varlocate 15 RXF5SIDLbits
+#pragma varlocate 15 RXF5EIDH
+#pragma varlocate 15 RXF5EIDHbits
+#pragma varlocate 15 RXF5EIDL
+#pragma varlocate 15 RXF5EIDLbits
+#pragma varlocate 15 RXM0SIDH
+#pragma varlocate 15 RXM0SIDHbits
+#pragma varlocate 15 RXM0SIDL
+#pragma varlocate 15 RXM0SIDLbits
+#pragma varlocate 15 RXM0EIDH
+#pragma varlocate 15 RXM0EIDHbits
+#pragma varlocate 15 RXM0EIDL
+#pragma varlocate 15 RXM0EIDLbits
+#pragma varlocate 15 RXM1SIDH
+#pragma varlocate 15 RXM1SIDHbits
+#pragma varlocate 15 RXM1SIDL
+#pragma varlocate 15 RXM1SIDLbits
+#pragma varlocate 15 RXM1EIDH
+#pragma varlocate 15 RXM1EIDHbits
+#pragma varlocate 15 RXM1EIDL
+#pragma varlocate 15 RXM1EIDLbits
+#pragma varlocate 15 TXB2CON
+#pragma varlocate 15 TXB2CONbits
+#pragma varlocate 15 TXB2SIDH
+#pragma varlocate 15 TXB2SIDHbits
+#pragma varlocate 15 TXB2SIDL
+#pragma varlocate 15 TXB2SIDLbits
+#pragma varlocate 15 TXB2EIDH
+#pragma varlocate 15 TXB2EIDHbits
+#pragma varlocate 15 TXB2EIDL
+#pragma varlocate 15 TXB2EIDLbits
+#pragma varlocate 15 TXB2DLC
+#pragma varlocate 15 TXB2DLCbits
+#pragma varlocate 15 TXB2D0
+#pragma varlocate 15 TXB2D0bits
+#pragma varlocate 15 TXB2D1
+#pragma varlocate 15 TXB2D1bits
+#pragma varlocate 15 TXB2D2
+#pragma varlocate 15 TXB2D2bits
+#pragma varlocate 15 TXB2D3
+#pragma varlocate 15 TXB2D3bits
+#pragma varlocate 15 TXB2D4
+#pragma varlocate 15 TXB2D4bits
+#pragma varlocate 15 TXB2D5
+#pragma varlocate 15 TXB2D5bits
+#pragma varlocate 15 TXB2D6
+#pragma varlocate 15 TXB2D6bits
+#pragma varlocate 15 TXB2D7
+#pragma varlocate 15 TXB2D7bits
+#pragma varlocate 15 CANSTAT_RO3
+#pragma varlocate 15 CANSTAT_RO3bits
+#pragma varlocate 15 CANCON_RO3
+#pragma varlocate 15 CANCON_RO3bits
+#pragma varlocate 15 TXB1CON
+#pragma varlocate 15 TXB1CONbits
+#pragma varlocate 15 TXB1SIDH
+#pragma varlocate 15 TXB1SIDHbits
+#pragma varlocate 15 TXB1SIDL
+#pragma varlocate 15 TXB1SIDLbits
+#pragma varlocate 15 TXB1EIDH
+#pragma varlocate 15 TXB1EIDHbits
+#pragma varlocate 15 TXB1EIDL
+#pragma varlocate 15 TXB1EIDLbits
+#pragma varlocate 15 TXB1DLC
+#pragma varlocate 15 TXB1DLCbits
+#pragma varlocate 15 TXB1D0
+#pragma varlocate 15 TXB1D0bits
+#pragma varlocate 15 TXB1D1
+#pragma varlocate 15 TXB1D1bits
+#pragma varlocate 15 TXB1D2
+#pragma varlocate 15 TXB1D2bits
+#pragma varlocate 15 TXB1D3
+#pragma varlocate 15 TXB1D3bits
+#pragma varlocate 15 TXB1D4
+#pragma varlocate 15 TXB1D4bits
+#pragma varlocate 15 TXB1D5
+#pragma varlocate 15 TXB1D5bits
+#pragma varlocate 15 TXB1D6
+#pragma varlocate 15 TXB1D6bits
+#pragma varlocate 15 TXB1D7
+#pragma varlocate 15 TXB1D7bits
+#pragma varlocate 15 CANSTAT_RO2
+#pragma varlocate 15 CANSTAT_RO2bits
+#pragma varlocate 15 CANCON_RO2
+#pragma varlocate 15 CANCON_RO2bits
+#pragma varlocate 15 TXB0CON
+#pragma varlocate 15 TXB0CONbits
+#pragma varlocate 15 TXB0SIDH
+#pragma varlocate 15 TXB0SIDHbits
+#pragma varlocate 15 TXB0SIDL
+#pragma varlocate 15 TXB0SIDLbits
+#pragma varlocate 15 TXB0EIDH
+#pragma varlocate 15 TXB0EIDHbits
+#pragma varlocate 15 TXB0EIDL
+#pragma varlocate 15 TXB0EIDLbits
+#pragma varlocate 15 TXB0DLC
+#pragma varlocate 15 TXB0DLCbits
+#pragma varlocate 15 TXB0D0
+#pragma varlocate 15 TXB0D0bits
+#pragma varlocate 15 TXB0D1
+#pragma varlocate 15 TXB0D1bits
+#pragma varlocate 15 TXB0D2
+#pragma varlocate 15 TXB0D2bits
+#pragma varlocate 15 TXB0D3
+#pragma varlocate 15 TXB0D3bits
+#pragma varlocate 15 TXB0D4
+#pragma varlocate 15 TXB0D4bits
+#pragma varlocate 15 TXB0D5
+#pragma varlocate 15 TXB0D5bits
+#pragma varlocate 15 TXB0D6
+#pragma varlocate 15 TXB0D6bits
+#pragma varlocate 15 TXB0D7
+#pragma varlocate 15 TXB0D7bits
+#pragma varlocate 15 CANSTAT_RO1
+#pragma varlocate 15 CANSTAT_RO1bits
+#pragma varlocate 15 CANCON_RO1
+#pragma varlocate 15 CANCON_RO1bits
+#pragma varlocate 15 RXB1CON
+#pragma varlocate 15 RXB1CONbits
+#pragma varlocate 15 RXB1SIDH
+#pragma varlocate 15 RXB1SIDHbits
+#pragma varlocate 15 RXB1SIDL
+#pragma varlocate 15 RXB1SIDLbits
+#pragma varlocate 15 RXB1EIDH
+#pragma varlocate 15 RXB1EIDHbits
+#pragma varlocate 15 RXB1EIDL
+#pragma varlocate 15 RXB1EIDLbits
+#pragma varlocate 15 RXB1DLC
+#pragma varlocate 15 RXB1DLCbits
+#pragma varlocate 15 RXB1D0
+#pragma varlocate 15 RXB1D0bits
+#pragma varlocate 15 RXB1D1
+#pragma varlocate 15 RXB1D1bits
+#pragma varlocate 15 RXB1D2
+#pragma varlocate 15 RXB1D2bits
+#pragma varlocate 15 RXB1D3
+#pragma varlocate 15 RXB1D3bits
+#pragma varlocate 15 RXB1D4
+#pragma varlocate 15 RXB1D4bits
+#pragma varlocate 15 RXB1D5
+#pragma varlocate 15 RXB1D5bits
+#pragma varlocate 15 RXB1D6
+#pragma varlocate 15 RXB1D6bits
+#pragma varlocate 15 RXB1D7
+#pragma varlocate 15 RXB1D7bits
+#pragma varlocate 15 CANSTAT_RO0
+#pragma varlocate 15 CANSTAT_RO0bits
+#pragma varlocate 15 CANCON_RO0
+#pragma varlocate 15 CANCON_RO0bits
+
+
+#line 4978 "C:/MCC18/h/p18f4685.h"
+
+#line 4980 "C:/MCC18/h/p18f4685.h"
+#line 4981 "C:/MCC18/h/p18f4685.h"
+
+
+#line 4984 "C:/MCC18/h/p18f4685.h"
+
+#line 4986 "C:/MCC18/h/p18f4685.h"
+#line 4987 "C:/MCC18/h/p18f4685.h"
+#line 4988 "C:/MCC18/h/p18f4685.h"
+#line 4989 "C:/MCC18/h/p18f4685.h"
+
+#line 4991 "C:/MCC18/h/p18f4685.h"
+#line 4992 "C:/MCC18/h/p18f4685.h"
+#line 4993 "C:/MCC18/h/p18f4685.h"
+#line 4994 "C:/MCC18/h/p18f4685.h"
+#line 4995 "C:/MCC18/h/p18f4685.h"
+
+
+#line 4999 "C:/MCC18/h/p18f4685.h"
+
+#line 5001 "C:/MCC18/h/p18f4685.h"
+
+
+#line 5004 "C:/MCC18/h/p18f4685.h"
+#line 80 "p2_deco_main - 090915b.c"
+
+#line 1 "C:/MCC18/h/math.h"
+
+
+#line 4 "C:/MCC18/h/math.h"
+
+typedef float float_t;
+typedef float double_t;
+
+#line 9 "C:/MCC18/h/math.h"
+#line 10 "C:/MCC18/h/math.h"
+#line 11 "C:/MCC18/h/math.h"
+
+float fabs (auto float x);
+float ldexp (auto float x, auto int n);
+float exp (auto float f);
+float sqrt (auto float x);
+float asin (auto float x);
+float acos (auto float x);
+float atan2 (auto float y, auto float x);
+float atan (auto float x);
+float sin (auto float x);
+float cos (auto float x);
+float tan (auto float x);
+float sinh (auto float x);
+float cosh (auto float x);
+float tanh (auto float x);
+float frexp (auto float x, auto int *pexp);
+float log10 (auto float x);
+float log (auto float x);
+float pow (auto float x, auto float y);
+float ceil (auto float x);
+float floor (auto float x);
+float modf (auto float x, auto float *ipart);
+float fmod (auto float x, auto float y);
+
+float mchptoieee (auto unsigned long v);
+unsigned long ieeetomchp (auto float v);
+
+#line 39 "C:/MCC18/h/math.h"
+#line 81 "p2_deco_main - 090915b.c"
+
+
+
+
+
+
+ #pragma config OSC = IRCIO67
+ #pragma config FCMEN = OFF
+ #pragma config IESO = OFF
+ #pragma config PWRT = ON
+ #pragma config BOREN = OFF
+ #pragma config WDT = OFF
+ #pragma config WDTPS = 128
+ #pragma config MCLRE = ON
+ #pragma config LPT1OSC = OFF
+ #pragma config PBADEN = OFF
+ #pragma config DEBUG = OFF
+ #pragma config XINST = OFF
+ #pragma config LVP = OFF
+ #pragma config STVREN = OFF
+
+
+
+
+
+#line 107 "p2_deco_main - 090915b.c"
+#line 108 "p2_deco_main - 090915b.c"
+#line 109 "p2_deco_main - 090915b.c"
+
+
+#line 112 "p2_deco_main - 090915b.c"
+#line 113 "p2_deco_main - 090915b.c"
+#line 114 "p2_deco_main - 090915b.c"
+#line 115 "p2_deco_main - 090915b.c"
+
+#line 117 "p2_deco_main - 090915b.c"
+#line 118 "p2_deco_main - 090915b.c"
+#line 119 "p2_deco_main - 090915b.c"
+#line 120 "p2_deco_main - 090915b.c"
+
+#line 122 "p2_deco_main - 090915b.c"
+#line 123 "p2_deco_main - 090915b.c"
+#line 124 "p2_deco_main - 090915b.c"
+#line 125 "p2_deco_main - 090915b.c"
+
+#line 127 "p2_deco_main - 090915b.c"
+#line 128 "p2_deco_main - 090915b.c"
+#line 129 "p2_deco_main - 090915b.c"
+#line 130 "p2_deco_main - 090915b.c"
+
+
+#line 133 "p2_deco_main - 090915b.c"
+#line 134 "p2_deco_main - 090915b.c"
+#line 135 "p2_deco_main - 090915b.c"
+#line 136 "p2_deco_main - 090915b.c"
+
+#line 138 "p2_deco_main - 090915b.c"
+#line 139 "p2_deco_main - 090915b.c"
+#line 140 "p2_deco_main - 090915b.c"
+#line 141 "p2_deco_main - 090915b.c"
+
+#line 143 "p2_deco_main - 090915b.c"
+#line 144 "p2_deco_main - 090915b.c"
+#line 145 "p2_deco_main - 090915b.c"
+#line 146 "p2_deco_main - 090915b.c"
+
+#line 148 "p2_deco_main - 090915b.c"
+#line 149 "p2_deco_main - 090915b.c"
+#line 150 "p2_deco_main - 090915b.c"
+#line 151 "p2_deco_main - 090915b.c"
+
+
+#line 154 "p2_deco_main - 090915b.c"
+#line 155 "p2_deco_main - 090915b.c"
+#line 156 "p2_deco_main - 090915b.c"
+#line 157 "p2_deco_main - 090915b.c"
+
+#line 159 "p2_deco_main - 090915b.c"
+#line 160 "p2_deco_main - 090915b.c"
+#line 161 "p2_deco_main - 090915b.c"
+#line 162 "p2_deco_main - 090915b.c"
+
+#line 164 "p2_deco_main - 090915b.c"
+#line 165 "p2_deco_main - 090915b.c"
+#line 166 "p2_deco_main - 090915b.c"
+#line 167 "p2_deco_main - 090915b.c"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#line 189 "p2_deco_main - 090915b.c"
+#line 190 "p2_deco_main - 090915b.c"
+#line 191 "p2_deco_main - 090915b.c"
+
+#line 193 "p2_deco_main - 090915b.c"
+#line 194 "p2_deco_main - 090915b.c"
+
+#line 196 "p2_deco_main - 090915b.c"
+#line 197 "p2_deco_main - 090915b.c"
+
+
+#pragma udata bank0a=0x060
+volatile unsigned char wp_stringstore[26];
+volatile unsigned char wp_color1;
+volatile unsigned char wp_color2;
+volatile unsigned char wp_top;
+volatile unsigned char wp_leftx2;
+volatile unsigned char wp_font;
+volatile unsigned char wp_invert;
+volatile unsigned char wp_temp_U8;
+
+#pragma udata bank0b=0x081
+volatile unsigned char wp_txtptr;
+volatile unsigned char wp_char;
+volatile unsigned char wp_command;
+volatile unsigned int wp_data_16bit;
+volatile unsigned char wp_data_8bit_one;
+volatile unsigned char wp_data_8bit_two;
+volatile unsigned int wp_start;
+volatile unsigned int wp_end;
+volatile unsigned int wp_i;
+volatile unsigned char wp_black;
+
+volatile unsigned char wp_debug_U8;
+
+
+#pragma udata bank0c=0x0D0
+#line 226 "p2_deco_main - 090915b.c"
+volatile unsigned char keep_free_bank0[48 ];
+
+
+#pragma udata bank1=0x100
+#line 231 "p2_deco_main - 090915b.c"
+volatile unsigned char keep_free_bank1[256 ];
+
+ #pragma udata bank2a=0x200
+
+ static unsigned int int_O_tissue_for_debug[32];
+ static unsigned int int_O_GF_spare____;
+ static unsigned int int_O_GF_step;
+ static unsigned int int_O_gtissue_limit;
+ static unsigned int int_O_gtissue_press;
+ static unsigned int int_O_limit_GF_low;
+ static unsigned int int_O_gtissue_press_at_GF_low;
+
+
+ #pragma udata bank2b=0x24E
+ static unsigned char char_O_GF_low_pointer;
+ static unsigned char char_O_actual_pointer;
+ #pragma udata bank2c=0x250
+ static unsigned char char_O_deco_table[32];
+ #pragma udata bank2d=0x270
+ static unsigned char char_I_table_deco_done[32];
+ #pragma udata bank2e=0x290
+ static unsigned int int_O_calc_tissue_call_counter;
+
+ unsigned char lock_GF_depth_list;
+ static float temp_limit;
+ static float GF_low;
+ static float GF_high;
+ static float GF_delta;
+ static float GF_temp;
+ static float GF_step;
+ static float GF_step2;
+ static float temp_pres_gtissue;
+ static float temp_pres_gtissue_diff;
+ static float temp_pres_gtissue_limit_GF_low;
+ static float temp_pres_gtissue_limit_GF_low_below_surface;
+ static unsigned int temp_depth_limit;
+ static unsigned char temp_decotime;
+ static unsigned char temp_gtissue_no;
+ static unsigned int temp_depth_last_deco;
+
+ static unsigned char temp_depth_GF_low_meter;
+ static unsigned char temp_depth_GF_low_number;
+ static unsigned char internal_deco_pointer;
+ static unsigned char internal_deco_table[32];
+ static float temp_pres_deco_GF_low;
+
+static unsigned int debug_temp;
+
+
+#pragma udata bank3a=0x300
+static char output[32];
+
+#pragma udata bank3b=0x380
+volatile float pres_tissue_vault[32];
+
+#pragma udata bank4a=0x400
+
+ unsigned char ci ;
+ unsigned char x;
+ unsigned int main_i;
+ unsigned int int_temp;
+ unsigned int int_temp_decostatus;
+ static float pres_respiration;
+ static float pres_surface;
+ static float temp1;
+ static float temp2;
+ static float temp3;
+ static float temp4;
+ static float temp_deco;
+ static float temp_atem;
+ static float temp2_atem;
+ static float temp_tissue;
+ static float temp_surface;
+ static float N2_ratio;
+ static float He_ratio;
+ static float temp_ratio;
+ static float var_a;
+ static float var2_a;
+ static float var_b;
+ static float var2_b;
+ static float var_t05nc;
+ static float var2_t05nc;
+ static float var_e2secs;
+ static float var2_e2secs;
+ static float var_e1min;
+ static float var2_e1min;
+ static float var_halftimes;
+ static float var2_halftimes;
+ static float pres_gtissue_limit;
+ static float temp_pres_gtissue_limit;
+ static float actual_ppO2;
+
+ #pragma udata bank4b=0x480
+ static float pres_tissue[32];
+
+ #pragma udata bank5=0x500
+
+
+ static unsigned int int_I_pres_respiration;
+ static unsigned int int_I_pres_surface;
+ static unsigned int int_I_temp;
+ static unsigned char char_I_temp;
+ static unsigned char char_I_actual_ppO2;
+ static unsigned int int_I_spare_3;
+ static unsigned int int_I_spare_4;
+ static unsigned int int_I_spare_5;
+ static unsigned int int_I_spare_6;
+ static unsigned char char_I_N2_ratio;
+ static unsigned char char_I_He_ratio;
+ static unsigned char char_I_saturation_multiplier;
+ static unsigned char char_I_desaturation_multiplier;
+ static unsigned char char_I_GF_High_percentage;
+ static unsigned char char_I_GF_Low_percentage;
+ static unsigned char char_I_spare;
+ static unsigned char char_I_deco_distance;
+ static unsigned char char_I_const_ppO2;
+ static unsigned char char_I_deco_ppO2_change;
+ static unsigned char char_I_deco_ppO2;
+ static unsigned char char_I_deco_gas_change;
+ static unsigned char char_I_deco_N2_ratio;
+ static unsigned char char_I_deco_He_ratio;
+ static unsigned char char_I_depth_last_deco;
+ static unsigned char char_I_deco_model;
+
+ static unsigned int int_O_desaturation_time;
+ static unsigned char char_O_nullzeit;
+ static unsigned char char_O_deco_status;
+ static unsigned char char_O_array_decotime[7];
+ static unsigned char char_O_array_decodepth[6];
+ static unsigned char char_O_ascenttime;
+ static unsigned char char_O_gradient_factor;
+ static unsigned char char_O_tissue_saturation[32];
+ static unsigned char char_O_array_gradient_weighted[16];
+ static unsigned char char_O_gtissue_no;
+ static unsigned char char_O_diluent;
+ static unsigned char char_O_CNS_fraction;
+ static unsigned char char_O_relative_gradient_GF;
+
+
+ static float pres_tissue_limit[16];
+ static float sim_pres_tissue_limit[16];
+ static float pres_diluent;
+ static float deco_diluent;
+ static float const_ppO2;
+ static float deco_ppO2_change;
+ static float deco_ppO2;
+
+ #pragma udata bank6=0x600
+
+ static float sim_pres_tissue[32];
+ static float sim_pres_tissue_backup[32];
+
+
+
+
+ #pragma udata bank8=0x800
+ static char md_pi_subst[256];
+
+ #pragma udata bank9a=0x900
+
+ static char md_state[48];
+ #pragma udata bank9b=0x930
+
+ static unsigned int int_O_DBS_bitfield;
+ static unsigned int int_O_DBS2_bitfield;
+ static unsigned int int_O_DBG_pre_bitfield;
+ static unsigned int int_O_DBG_post_bitfield;
+ static char char_O_NDL_at_20mtr;
+
+ static char md_t;
+ static char md_buffer[16];
+ static char md_cksum[16];
+ static char md_i;
+ static char md_j;
+ static char md_temp;
+ static unsigned int md_pointer;
+ static float deco_N2_ratio;
+ static float deco_He_ratio;
+ static float calc_N2_ratio;
+ static float calc_He_ratio;
+ static float deco_gas_change;
+ static float CNS_fraction;
+ static float float_saturation_multiplier;
+ static float float_desaturation_multiplier;
+ static float float_deco_distance;
+
+ static unsigned char DBG_char_I_deco_model;
+ static unsigned char DBG_char_I_depth_last_deco;
+ static float DBG_pres_surface;
+ static float DBG_GF_low;
+ static float DBG_GF_high;
+ static float DBG_const_ppO2;
+ static float DBG_deco_ppO2_change;
+ static float DBG_deco_ppO2;
+ static float DBG_deco_N2_ratio;
+ static float DBG_deco_He_ratio;
+ static float DBG_deco_gas_change;
+ static float DBG_float_saturation_multiplier;
+ static float DBG_float_desaturation_multiplier;
+ static float DBG_float_deco_distance;
+ static float DBG_deco_N2_ratio;
+ static float DBG_deco_He_ratio;
+ static float DBG_N2_ratio;
+ static float DBG_He_ratio;
+ static char flag_in_divemode;
+ static int int_dbg_i;
+ unsigned int temp_DBS;
+
+
+
+
+void main_calc_hauptroutine(void);
+void main_calc_without_deco(void);
+void main_clear_tissue(void);
+void main_calc_percentage(void);
+void main_calc_wo_deco_step_1_min(void);
+void main_debug(void);
+void main_gradient_array(void);
+void main_hash(void);
+
+void calc_hauptroutine(void);
+void calc_tissue(void);
+void calc_nullzeit(void);
+void backup_sim_pres_tissue(void);
+void restore_sim_pres_tissue(void);
+
+void calc_without_deco(void);
+void clear_tissue(void);
+void calc_ascenttime(void);
+void update_startvalues(void);
+void clear_decoarray(void);
+void update_decoarray(void);
+void sim_tissue_1min(void);
+void sim_tissue_10min(void);
+void calc_gradient_factor(void);
+void calc_gradient_array_only(void);
+void calc_desaturation_time(void);
+void calc_wo_deco_step_1_min(void);
+void calc_tissue_step_1_min(void);
+void hash(void);
+void clear_CNS_fraction(void);
+void calc_CNS_fraction(void);
+void calc_CNS_decrease_15min(void);
+void calc_percentage(void);
+void main(void);
+void calc_hauptroutine_data_input(void);
+void calc_hauptroutine_update_tissues(void);
+void calc_hauptroutine_calc_deco(void);
+void calc_hauptroutine_calc_ascend_to_deco(void);
+void calc_nextdecodepth_GF(void);
+void copy_deco_table_GF(void);
+void clear_internal_deco_table_GF(void);
+void update_internal_deco_table_GF(void);
+void push_tissues_to_vault(void);
+void pull_tissues_from_vault(void);
+void main_push_tissues_to_vault(void);
+void main_pull_tissues_from_vault(void);
+void wordprocessor(void);
+
+
+
+
+
+#pragma romdata der_code = 0x0000
+#pragma code der_start = 0x0000
+void der_start(void)
+{
+_asm
+ goto main
+_endasm
+}
+
+
+
+
+
+
+#pragma code main = 0x9000
+void main(void)
+{
+ for(wp_temp_U8=0;wp_temp_U8<48 - 1;wp_temp_U8++)
+ keep_free_bank0[wp_temp_U8] = 7;
+ keep_free_bank0[48 - 1] = 7;
+
+ for(wp_temp_U8=0;wp_temp_U8<256 - 1;wp_temp_U8++)
+ keep_free_bank1[wp_temp_U8] = 7;
+ keep_free_bank1[256 - 1] = 7;
+
+#line 520 "p2_deco_main - 090915b.c"
+
+
+wp_top = 10;
+wp_leftx2 = 10;
+wp_color1 = 255;
+wp_color2 = 255;
+wp_font = 0;
+wp_invert = 0;
+wp_stringstore[0] = ' ';
+wp_stringstore[1] = '!';
+wp_stringstore[2] = '"';
+wp_stringstore[3] = ':';
+wp_stringstore[4] = 0;
+wordprocessor();
+
+GF_low = 1.0;
+GF_high = 1.0;
+
+GF_temp = GF_low * GF_high;
+
+clear_CNS_fraction();
+
+
+
+
+
+
+
+
+
+int_I_pres_respiration = 1000;
+int_I_pres_surface = 1000;
+char_I_N2_ratio = 39;
+char_I_He_ratio = 40;
+char_I_deco_distance = 0;
+char_I_depth_last_deco = 3;
+
+char_I_const_ppO2 = 0;
+char_I_deco_ppO2_change = 0;
+char_I_deco_ppO2 = 0;
+
+char_I_deco_gas_change = 0;
+char_I_deco_N2_ratio = 0;
+char_I_deco_He_ratio = 0;
+
+
+char_I_GF_High_percentage = 100;
+char_I_GF_Low_percentage = 100;
+
+char_I_saturation_multiplier = 110;
+char_I_desaturation_multiplier = 90;
+
+char_I_deco_model = 0;
+
+main_clear_tissue();
+
+int_I_pres_respiration = 1000 + int_I_pres_surface;
+main_calc_wo_deco_step_1_min();
+int_I_pres_respiration = 3000 + int_I_pres_surface;
+main_calc_wo_deco_step_1_min();
+int_I_pres_respiration = 5000 + int_I_pres_surface;
+main_calc_wo_deco_step_1_min();
+
+
+#line 587 "p2_deco_main - 090915b.c"
+
+
+char_O_deco_status = 255;
+while (char_O_deco_status)
+ main_calc_hauptroutine();
+_asm
+nop
+_endasm
+
+for (main_i=0;main_i<50;main_i++)
+{
+main_calc_hauptroutine();
+}
+int_I_pres_respiration = 10000;
+for (main_i=0;main_i<1500;main_i++)
+{
+main_calc_hauptroutine();
+}
+
+_asm
+nop
+_endasm
+
+
+int_I_pres_respiration = 3000;
+for (main_i=0;main_i<150;main_i++)
+{
+ calc_hauptroutine_data_input();
+ calc_hauptroutine_update_tissues();
+}
+
+ update_startvalues();
+ clear_decoarray();
+ clear_internal_deco_table_GF();
+ calc_hauptroutine_calc_ascend_to_deco();
+ if (char_O_deco_status > 15)
+ {
+ char_O_deco_status = 2;
+
+ }
+ else
+ {
+
+ calc_hauptroutine_calc_deco();
+ }
+
+
+_asm
+nop
+_endasm
+while (char_O_deco_status == 1)
+{
+ char_O_deco_status = 0;
+
+ calc_hauptroutine_calc_deco();
+
+_asm
+nop
+_endasm
+};
+debug_temp = 60;
+int_I_pres_respiration = 9980;
+for (main_i=0;main_i 15)
+ {
+ char_O_deco_status = 2;
+
+ }
+ else
+ {
+
+ calc_hauptroutine_calc_deco();
+ }
+
+
+_asm
+nop
+_endasm
+while (char_O_deco_status == 1)
+{
+ char_O_deco_status = 0;
+
+ calc_hauptroutine_calc_deco();
+
+_asm
+nop
+_endasm
+};
+_asm
+nop
+_endasm
+debug_temp = 60;
+int_I_pres_respiration = 9980;
+debug_temp = debug_temp * 3;
+for (main_i=0;main_i 1.3)
+ int_O_DBS_bitfield |= 0b0000000000100000 ;
+ if(GF_low < 0.19)
+ int_O_DBS_bitfield |= 0b0000000001000000 ;
+ if(GF_low > 1.01)
+ int_O_DBS_bitfield |= 0b0000000010000000 ;
+ if(GF_high < 0.6)
+ int_O_DBS_bitfield |= 0b0000000100000000 ;
+ if(GF_high > 1.01)
+ int_O_DBS_bitfield |= 0b0000001000000000 ;
+ if((N2_ratio + He_ratio) > 0.95)
+ int_O_DBS_bitfield |= 0b0000010000000000 ;
+ if((N2_ratio + He_ratio) < 0.05)
+ int_O_DBS_bitfield |= 0b0000100000000000 ;
+ if(float_deco_distance > 0.25)
+ int_O_DBS_bitfield |= 0b0001000000000000 ;
+ if(char_I_depth_last_deco > 8)
+ int_O_DBS_bitfield |= 0b0010000000000000 ;
+ if(DBG_deco_gas_change && ((deco_N2_ratio + deco_He_ratio) > 0.95))
+ int_O_DBS_bitfield |= 0b0100000000000000 ;
+ if(DBG_deco_gas_change && ((deco_N2_ratio + deco_He_ratio) < 0.05))
+ int_O_DBS_bitfield |= 0b1000000000000000 ;
+ if(pres_respiration > 3.0)
+ int_O_DBS2_bitfield |= 0b0000000000000001 ;
+ if(pres_surface - pres_respiration > 0.2)
+ int_O_DBS2_bitfield |= 0b0000000000000010 ;
+ if(pres_surface < 0.75)
+ int_O_DBS2_bitfield |= 0b0000000000000100 ;
+ if(pres_surface > 1.11)
+ int_O_DBS2_bitfield |= 0b0000000000001000 ;
+ if(float_desaturation_multiplier < 0.70)
+ int_O_DBS2_bitfield |= 0b0000000000010000 ;
+ if(float_desaturation_multiplier > 1.01)
+ int_O_DBS2_bitfield |= 0b0000000000100000 ;
+ if(GF_low > GF_high)
+ int_O_DBS2_bitfield |= 0b0000000001000000 ;
+}
+
+
+
+
+void set_dbg_end_of_dive(void)
+{
+ int_O_DBG_pre_bitfield &= (~0b0000000000000100 );
+ int_O_DBG_post_bitfield &= (~0b0000000000000100 );
+}
+
+
+
+
+void check_ndl(void)
+{
+ if((char_O_NDL_at_20mtr == -1) && (int_I_pres_respiration > 3000))
+ {
+ char_O_NDL_at_20mtr = char_O_nullzeit;
+ if(char_O_NDL_at_20mtr == 255)
+ char_O_NDL_at_20mtr == 254;
+ }
+}
+
+
+
+
+void check_dbg(char is_post_check)
+{
+ temp_DBS = 0;
+ if( (DBG_N2_ratio != N2_ratio) || (DBG_He_ratio != He_ratio) )
+ temp_DBS |= 0b0000000000000001 ;
+ if(DBG_const_ppO2 != const_ppO2)
+ temp_DBS |= 0b0000000000000010 ;
+ if((DBG_float_saturation_multiplier != float_saturation_multiplier) || (DBG_float_desaturation_multiplier != float_desaturation_multiplier))
+ temp_DBS |= 0b0000000000010000 ;
+ if(DBG_char_I_deco_model != char_I_deco_model)
+ temp_DBS |= 0b0000000000100000 ;
+ if(DBG_pres_surface != pres_surface)
+ temp_DBS |= 0b0000000001000000 ;
+ if((!0b0000000000000100 ) && (!He_ratio))
+ for(int_dbg_i = 16; int_dbg_i < 32; int_dbg_i++)
+ if(pres_tissue[int_dbg_i])
+ temp_DBS |= 0b0000000010000000 ;
+ if(DBG_deco_ppO2 != deco_ppO2)
+ temp_DBS |= 0b0000000100000000 ;
+ if((DBG_deco_gas_change != deco_gas_change) || (DBG_deco_N2_ratio != deco_N2_ratio) || (DBG_deco_He_ratio != deco_He_ratio))
+ temp_DBS |= 0b0000001000000000 ;
+ if(DBG_float_deco_distance != float_deco_distance)
+ temp_DBS |= 0b0000010000000000 ;
+ if(DBG_char_I_depth_last_deco != char_I_depth_last_deco)
+ temp_DBS |= 0b0000100000000000 ;
+ if((DBG_GF_low != GF_low) || (DBG_GF_high != GF_high))
+ temp_DBS |= 0b0001000000000000 ;
+ if(pres_respiration > 13.0)
+ temp_DBS |= 0b0100000000000000 ;
+ if(pres_surface - pres_respiration > 0.2)
+ temp_DBS |= 0b1000000000000000 ;
+
+#line 914 "p2_deco_main - 090915b.c"
+
+ if(is_post_check)
+ int_O_DBG_post_bitfield |= temp_DBS;
+ else
+ int_O_DBG_pre_bitfield |= temp_DBS;
+}
+
+
+
+
+void check_pre_dbg(void)
+{
+ check_dbg(0);
+}
+
+
+
+
+void check_post_dbg(void)
+{
+ check_dbg(1);
+}
+
+
+
+
+
+
+
+void calc_nextdecodepth_GF(void)
+{
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ char_I_table_deco_done[0] = 0;
+ if (char_I_deco_model == 1)
+ {
+ if (lock_GF_depth_list == 0)
+ {
+ temp2 = temp_pres_gtissue_limit_GF_low_below_surface / 0.29985;
+ int_temp = (int) (temp2 + 0.99);
+ if (int_temp > 31)
+ int_temp = 31;
+ if (int_temp < 0)
+ int_temp = 0;
+ temp_depth_GF_low_number = int_temp;
+ temp_depth_GF_low_meter = 3 * temp_depth_GF_low_number;
+ temp2 = (float)temp_depth_GF_low_meter * 0.09995;
+ temp_pres_deco_GF_low = temp2 + float_deco_distance + pres_surface;
+ if (temp_depth_GF_low_number == 0)
+ GF_step = 0;
+ else
+ GF_step = GF_delta / (float)temp_depth_GF_low_number;
+ if (GF_step < 0)
+ GF_step = 0;
+ if (GF_step > GF_delta)
+ GF_step = GF_delta;
+ int_O_GF_step = (int)(GF_step * 10000);
+ int_O_limit_GF_low = (int)(temp_pres_deco_GF_low * 1000);
+ int_O_gtissue_press_at_GF_low = (int)(temp_pres_gtissue * 1000);
+ char_O_GF_low_pointer = temp_depth_GF_low_number;
+ lock_GF_depth_list = 1;
+ internal_deco_pointer = 0;
+ }
+ if (internal_deco_pointer == 0)
+ {
+ internal_deco_pointer = temp_depth_GF_low_number;
+ GF_temp = GF_high - ((float)internal_deco_pointer * GF_step);
+ int_temp = char_I_table_deco_done[internal_deco_pointer];
+ output[8] = int_temp;
+ output[9] = 33;
+ }
+ else
+ {
+ int_temp = 1;
+ }
+ while (int_temp == 1)
+ {
+ int_temp = internal_deco_pointer - 1;
+ if (int_temp == 1)
+ {
+ temp2 = (float)(temp_depth_last_deco * int_temp) * 0.09995;
+ GF_step2 = GF_step/3.0 * ((float)(6 - temp_depth_last_deco));
+ }
+ else
+ if (int_temp == 0)
+ {
+ temp2 = 0.0;
+ GF_step2 = GF_high - GF_temp;
+ }
+ else
+ {
+ temp2 = (float)(3 *int_temp) * 0.09995;
+ GF_step2 = GF_step;
+ }
+ temp2 = temp2 + pres_surface;
+ temp1 = ((GF_temp + GF_step2)* temp_pres_gtissue_diff) + temp_pres_gtissue;
+ if (temp1 > temp2)
+ {
+ int_temp = 0;
+ }
+ else
+ {
+ internal_deco_pointer = int_temp;
+ GF_temp = GF_temp + GF_step2;
+ int_temp = char_I_table_deco_done[internal_deco_pointer];
+ }
+ }
+ if (internal_deco_pointer > 0)
+ {
+ temp2 = (float)(0.29985 * internal_deco_pointer);
+ temp_deco = temp2 + float_deco_distance + pres_surface;
+ if (internal_deco_pointer == 1)
+ temp_depth_limit = temp_depth_last_deco;
+ else
+ temp_depth_limit = 3 * internal_deco_pointer;
+ if (output[9] == 33)
+ {
+ output[9] = internal_deco_pointer;
+ output[10] = char_I_table_deco_done[internal_deco_pointer];
+ output[12] = output[12] + 1;
+ if (output[12] == 100)
+ output[12] = 0;
+ }
+ }
+ else
+ {
+ temp_deco = pres_surface;
+ temp_depth_limit = 0;
+ }
+ }
+ else
+ {
+
+
+
+
+ temp1 = temp_pres_gtissue_limit - pres_surface;
+ if (temp1 >= 0)
+ {
+ temp1 = temp1 / 0.29985;
+ temp_depth_limit = (int) (temp1 + 0.99);
+ temp_depth_limit = 3 * temp_depth_limit;
+ if (temp_depth_limit == 0)
+ temp_deco = pres_surface;
+ else
+ {
+ if (temp_depth_limit < temp_depth_last_deco)
+ temp_depth_limit = temp_depth_last_deco;
+ temp1 = (float)temp_depth_limit * 0.09995;
+ temp_deco = temp1 + float_deco_distance + pres_surface;
+ }
+ }
+ else
+ {
+ temp_deco = pres_surface;
+ temp_depth_limit = 0;
+ }
+ }
+}
+
+
+#line 1100 "p2_deco_main - 090915b.c"
+#line 1116 "p2_deco_main - 090915b.c"
+
+
+
+
+
+void copy_deco_table_GF(void)
+{
+ if (char_I_deco_model == 1)
+ {
+ int_temp = 32;
+ for (ci=0;ci 15)
+ {
+ char_O_deco_status = 2;
+
+ }
+ else
+ {
+
+ calc_hauptroutine_calc_deco();
+ }
+
+ break;
+ }
+ calc_ascenttime();
+ check_post_dbg();
+}
+
+void calc_hauptroutine_data_input(void)
+{
+ pres_respiration = (float)int_I_pres_respiration / 1000.0;
+ pres_surface = (float)int_I_pres_surface / 1000.0;
+
+ N2_ratio = (float)char_I_N2_ratio / 100.0;;
+ He_ratio = (float)char_I_He_ratio / 100.0;;
+ deco_N2_ratio = (float)char_I_deco_N2_ratio / 100.0;
+ deco_He_ratio = (float)char_I_deco_He_ratio / 100.0;
+ float_deco_distance = (float)char_I_deco_distance / 100.0;
+ if(char_I_deco_gas_change)
+ {
+ deco_gas_change = (float)char_I_deco_gas_change / 9.995 + pres_surface;
+ deco_gas_change = deco_gas_change + float_deco_distance;
+ }
+ else
+ deco_gas_change = 0;
+ const_ppO2 = (float)char_I_const_ppO2 / 100.0;
+ deco_ppO2_change = (float)char_I_deco_ppO2_change / 99.95 + pres_surface;
+ deco_ppO2_change = deco_ppO2_change + float_deco_distance;
+ deco_ppO2 = (float)char_I_deco_ppO2 / 100.0;
+ float_desaturation_multiplier = char_I_desaturation_multiplier / 100.0;
+ float_saturation_multiplier = char_I_saturation_multiplier / 100.0;
+ GF_low = (float)char_I_GF_Low_percentage / 100.0;
+ GF_high = (float)char_I_GF_High_percentage / 100.0;
+ GF_delta = GF_high - GF_low;
+
+ temp2 = (pres_respiration - pres_surface) / 0.29985;
+ int_temp = (int)(temp2);
+ if (int_temp < 0)
+ int_temp = 0;
+ if (int_temp > 255)
+ int_temp = 255;
+ char_O_actual_pointer = int_temp;
+
+ temp_depth_last_deco = (int)char_I_depth_last_deco;
+}
+
+void calc_hauptroutine_update_tissues(void)
+{
+ int_O_calc_tissue_call_counter = int_O_calc_tissue_call_counter + 1;
+ if (char_I_const_ppO2 == 0)
+ pres_diluent = pres_respiration;
+ else
+ pres_diluent = ((pres_respiration - const_ppO2)/(N2_ratio + He_ratio));
+ if (pres_diluent > pres_respiration)
+ pres_diluent = pres_respiration;
+ if (pres_diluent > 0.0627)
+ {
+ temp_atem = N2_ratio * (pres_diluent - 0.0627);
+ temp2_atem = He_ratio * (pres_diluent - 0.0627);
+ char_O_diluent = (char)(pres_diluent/pres_respiration*100.0);
+ }
+ else
+ {
+ temp_atem = 0.0;
+ temp2_atem = 0.0;
+ char_O_diluent = 0;
+ }
+ temp_surface = pres_surface;
+ calc_tissue();
+ int_O_gtissue_limit = (int)(pres_tissue_limit[char_O_gtissue_no] * 1000);
+ int_O_gtissue_press = (int)((pres_tissue[char_O_gtissue_no] + pres_tissue[char_O_gtissue_no+16]) * 1000);
+ if (char_I_deco_model == 1)
+ {
+ temp1 = temp1 * GF_high;
+ }
+ else
+ {
+ temp1 = temp_surface;
+ }
+ if (pres_gtissue_limit > temp1 && char_O_deco_status == 0)
+ {
+ char_O_nullzeit = 0;
+ char_O_deco_status = 255;
+ }
+}
+void calc_hauptroutine_calc_deco(void)
+{
+ do
+ {
+ int_temp_decostatus = 0;
+ calc_nextdecodepth_GF();
+ if (temp_depth_limit > 0)
+ {
+ if (char_I_const_ppO2 == 0)
+ {
+ deco_diluent = temp_deco;
+ if (temp_deco > deco_gas_change)
+ {
+ calc_N2_ratio = N2_ratio;
+ calc_He_ratio = He_ratio;
+ }
+ else
+ {
+ calc_N2_ratio = deco_N2_ratio;
+ calc_He_ratio = deco_He_ratio;
+ }
+ }
+ else
+ {
+ calc_N2_ratio = N2_ratio;
+ calc_He_ratio = He_ratio;
+ if (temp_deco > deco_ppO2_change)
+ {
+ deco_diluent = ((temp_deco - const_ppO2)/(N2_ratio + He_ratio));
+ }
+ else
+ {
+ deco_diluent = ((temp_deco - deco_ppO2)/(N2_ratio + He_ratio));
+ }
+ }
+ if (deco_diluent > temp_deco)
+ deco_diluent = temp_deco;
+ if (deco_diluent > 0.0627)
+ {
+ temp_atem = calc_N2_ratio * (deco_diluent - 0.0627);
+ temp2_atem = calc_He_ratio * (deco_diluent - 0.0627);
+ }
+ else
+ {
+ temp_atem = 0.0;
+ temp2_atem = 0.0;
+ }
+ sim_tissue_1min();
+ update_internal_deco_table_GF();
+ temp_decotime = 1;
+ update_decoarray();
+ char_O_deco_status = char_O_deco_status + 1;
+ if (char_O_deco_status < 16)
+ int_temp_decostatus = 1;
+ }
+ else
+ {
+ char_O_deco_status = 0;
+ }
+ } while (int_temp_decostatus == 1);
+ if (char_O_deco_status > 15)
+ {
+ char_O_deco_status = 1;
+ }
+ else
+ {
+ copy_deco_table_GF();
+ char_O_deco_status = 0;
+ }
+}
+
+void calc_hauptroutine_calc_ascend_to_deco(void)
+{
+ update_startvalues();
+ char_O_deco_status = 0;
+ temp_deco = pres_respiration;
+ lock_GF_depth_list = 1;
+ do
+ {
+ int_temp_decostatus = 0;
+ temp_deco = temp_deco - 1.0;
+ if ( char_I_deco_model == 1)
+ temp_limit = temp_pres_gtissue_limit_GF_low;
+ else
+ temp_limit = temp_pres_gtissue_limit;
+ if ((temp_deco > temp_limit) && (temp_deco > pres_surface))
+ {
+ lock_GF_depth_list = 0;
+ output[6] = 0;
+ if (char_I_const_ppO2 == 0)
+ {
+ deco_diluent = temp_deco + 0.5;
+ if (temp_deco + 0.5 > deco_gas_change)
+ {
+ calc_N2_ratio = N2_ratio;
+ calc_He_ratio = He_ratio;
+ }
+ else
+ {
+ calc_N2_ratio = deco_N2_ratio;
+ calc_He_ratio = deco_He_ratio;
+ }
+ }
+ else
+ {
+ calc_N2_ratio = N2_ratio;
+ calc_He_ratio = He_ratio;
+ if (temp_deco + 0.5 > deco_ppO2_change)
+ deco_diluent = ((temp_deco + 0.5 - const_ppO2)/(N2_ratio + He_ratio));
+ else
+ deco_diluent = ((temp_deco + 0.5 - deco_ppO2)/(N2_ratio + He_ratio));
+ if (deco_diluent > (temp_deco +0.5))
+ deco_diluent = temp_deco + 0.5;
+ }
+ if (deco_diluent > 0.0627)
+ {
+ temp_atem = calc_N2_ratio * (deco_diluent - 0.0627);
+ temp2_atem = calc_He_ratio * (deco_diluent - 0.0627);
+ }
+ else
+ {
+ temp_atem = 0.0;
+ temp2_atem = 0.0;
+ }
+ sim_tissue_1min();
+ char_O_deco_status = char_O_deco_status + 1;
+ if (char_O_deco_status < 16)
+ int_temp_decostatus = 1;
+ }
+ } while (int_temp_decostatus == 1);
+}
+
+
+
+
+
+
+void calc_tissue(void)
+{
+_asm
+lfsr 1, 0x300
+movlw 0x01
+movwf TBLPTRU,0
+_endasm
+
+ char_O_gtissue_no = 255;
+ pres_gtissue_limit = 0.0;
+
+for (ci=0;ci<16;ci++)
+{
+_asm
+movlw 0x02
+movwf TBLPTRH,0
+movlb 4
+movf ci,0,1
+addwf ci,0,1
+addwf ci,0,1
+addwf ci,0,1
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var_e2secs+1
+TBLRDPOSTINC
+movff TABLAT,var_e2secs
+TBLRDPOSTINC
+movff TABLAT,var_e2secs+3
+TBLRD
+movff TABLAT,var_e2secs+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var2_e2secs+1
+TBLRDPOSTINC
+movff TABLAT,var2_e2secs
+TBLRDPOSTINC
+movff TABLAT,var2_e2secs+3
+TBLRD
+movff TABLAT,var2_e2secs+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var_a+1
+TBLRDPOSTINC
+movff TABLAT,var_a
+TBLRDPOSTINC
+movff TABLAT,var_a+3
+TBLRD
+movff TABLAT,var_a+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var2_a+1
+TBLRDPOSTINC
+movff TABLAT,var2_a
+TBLRDPOSTINC
+movff TABLAT,var2_a+3
+TBLRD
+movff TABLAT,var2_a+2
+addlw 0x40
+movwf TBLPTRL,0
+incf TBLPTRH,1,0
+TBLRDPOSTINC
+movff TABLAT,var_b+1
+TBLRDPOSTINC
+movff TABLAT,var_b
+TBLRDPOSTINC
+movff TABLAT,var_b+3
+TBLRD
+movff TABLAT,var_b+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var2_b+1
+TBLRDPOSTINC
+movff TABLAT,var2_b
+TBLRDPOSTINC
+movff TABLAT,var2_b+3
+TBLRD
+movff TABLAT,var2_b+2
+_endasm
+
+
+ if( (var_e2secs < 0.0000363)
+ || (var_e2secs > 0.00577)
+ || (var2_e2secs < 0.0000961)
+ || (var2_e2secs > 0.150)
+ || (var_a < 0.231)
+ || (var_a > 1.27)
+ || (var_b < 0.504)
+ || (var_b > 0.966)
+ || (var2_a < 0.510)
+ || (var2_a > 1.75)
+ || (var2_b < 0.423)
+ || (var2_b > 0.927)
+ )
+ int_O_DBG_pre_bitfield |= 0b0010000000000000 ;
+
+
+ temp_tissue = (temp_atem - pres_tissue[ci]) * var_e2secs;
+ temp_tissue_safety();
+ pres_tissue[ci] = pres_tissue[ci] + temp_tissue;
+
+
+ temp_tissue = (temp2_atem - pres_tissue[ci+16]) * var2_e2secs;
+ temp_tissue_safety();
+ pres_tissue[ci+16] = pres_tissue[ci+16] + temp_tissue;
+
+ temp_tissue = pres_tissue[ci] + pres_tissue[ci+16];
+
+ var_a = (var_a * pres_tissue[ci] + var2_a * pres_tissue[ci+16]) / temp_tissue;
+ var_b = (var_b * pres_tissue[ci] + var2_b * pres_tissue[ci+16]) / temp_tissue;
+ pres_tissue_limit[ci] = (temp_tissue - var_a) * var_b;
+ if (pres_tissue_limit[ci] < 0)
+ pres_tissue_limit[ci] = 0;
+ if (pres_tissue_limit[ci] > pres_gtissue_limit)
+ {
+ pres_gtissue_limit = pres_tissue_limit[ci];
+ char_O_gtissue_no = ci;
+ }
+}
+}
+
+
+
+
+
+
+
+
+void calc_nullzeit(void)
+{
+ char_O_nullzeit = 0;
+ int_temp = 1;
+ do
+ {
+ backup_sim_pres_tissue();
+ sim_tissue_10min();
+ char_O_nullzeit = char_O_nullzeit + 10;
+ int_temp = int_temp + 1;
+ if (char_I_deco_model == 1)
+ temp1 = GF_high * temp_pres_gtissue_diff + temp_pres_gtissue;
+ else
+ temp1 = temp_pres_gtissue_limit;
+ if (temp1 > temp_surface)
+ int_temp = 255;
+ } while (int_temp < 17);
+ if (int_temp == 255)
+ {
+ restore_sim_pres_tissue();
+ char_O_nullzeit = char_O_nullzeit - 10;
+ }
+ int_temp = 1;
+ if (char_O_nullzeit < 60)
+ {
+ do
+ {
+ sim_tissue_1min();
+ char_O_nullzeit = char_O_nullzeit + 1;
+ int_temp = int_temp + 1;
+ if (char_I_deco_model == 1)
+ temp1 = GF_high * temp_pres_gtissue_diff + temp_pres_gtissue;
+ else
+ temp1 = temp_pres_gtissue_limit;
+ if (temp1 > temp_surface)
+ int_temp = 255;
+ } while (int_temp < 10);
+ if (int_temp == 255)
+ char_O_nullzeit = char_O_nullzeit - 1;
+ }
+}
+
+
+
+
+void backup_sim_pres_tissue(void)
+{
+ for (x = 0;x<16;x++)
+ {
+ sim_pres_tissue_backup[x] = sim_pres_tissue[x];
+ sim_pres_tissue_backup[x+16] = sim_pres_tissue[x+16];
+ }
+}
+
+
+
+
+void restore_sim_pres_tissue(void)
+{
+ for (x = 0;x<16;x++)
+ {
+ sim_pres_tissue[x] = sim_pres_tissue_backup[x];
+ sim_pres_tissue[x+16] = sim_pres_tissue_backup[x+16];
+ }
+}
+
+
+
+
+
+void calc_ascenttime(void)
+{
+if (pres_respiration > pres_surface)
+ {
+ switch (char_O_deco_status)
+ {
+ case 2:
+ char_O_ascenttime = 255;
+ break;
+ case 1:
+ break;
+ default:
+ temp1 = pres_respiration - pres_surface + 0.6;
+ if (temp1 < 0)
+ temp1 = 0;
+ if (temp1 > 255)
+ temp1 = 255;
+ char_O_ascenttime = (char)temp1;
+
+ for(ci=0;ci<7;ci++)
+ {
+ x = char_O_ascenttime + char_O_array_decotime[ci];
+ if (x < char_O_ascenttime)
+ char_O_ascenttime = 255;
+ else
+ char_O_ascenttime = x;
+ }
+ }
+ }
+else
+ char_O_ascenttime = 0;
+}
+
+
+
+
+
+
+
+void update_startvalues(void)
+{
+ temp_pres_gtissue_limit = pres_gtissue_limit;
+ temp_pres_gtissue = pres_tissue[char_O_gtissue_no] + pres_tissue[char_O_gtissue_no+16];
+ temp_pres_gtissue_diff = temp_pres_gtissue_limit - temp_pres_gtissue;
+ temp_pres_gtissue_limit_GF_low = GF_low * temp_pres_gtissue_diff + temp_pres_gtissue;
+ temp_pres_gtissue_limit_GF_low_below_surface = temp_pres_gtissue_limit_GF_low - pres_surface;
+ if (temp_pres_gtissue_limit_GF_low_below_surface < 0)
+ temp_pres_gtissue_limit_GF_low_below_surface = 0;
+
+ temp_gtissue_no = char_O_gtissue_no;
+ for (x = 0;x<16;x++)
+ {
+ sim_pres_tissue[x] = pres_tissue[x];
+ sim_pres_tissue[x+16] = pres_tissue[x+16];
+ sim_pres_tissue_limit[x] = pres_tissue_limit[x];
+ }
+}
+
+
+
+
+
+
+
+void sim_tissue_1min(void)
+{
+temp_pres_gtissue_limit = 0.0;
+temp_gtissue_no = 255;
+
+_asm
+lfsr 1, 0x300
+movlw 0x01
+movwf TBLPTRU,0
+_endasm
+
+
+for (ci=0;ci<16;ci++)
+{
+_asm
+movlw 0x02
+movwf TBLPTRH,0
+movlb 4
+movf ci,0,1
+addwf ci,0,1
+addwf ci,0,1
+addwf ci,0,1
+addlw 0x80
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var_a+1
+TBLRDPOSTINC
+movff TABLAT,var_a
+TBLRDPOSTINC
+movff TABLAT,var_a+3
+TBLRD
+movff TABLAT,var_a+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var2_a+1
+TBLRDPOSTINC
+movff TABLAT,var2_a
+TBLRDPOSTINC
+movff TABLAT,var2_a+3
+TBLRD
+movff TABLAT,var2_a+2
+addlw 0x40
+movwf TBLPTRL,0
+incf TBLPTRH,1,0
+TBLRDPOSTINC
+movff TABLAT,var_b+1
+TBLRDPOSTINC
+movff TABLAT,var_b
+TBLRDPOSTINC
+movff TABLAT,var_b+3
+TBLRD
+movff TABLAT,var_b+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var2_b+1
+TBLRDPOSTINC
+movff TABLAT,var2_b
+TBLRDPOSTINC
+movff TABLAT,var2_b+3
+TBLRD
+movff TABLAT,var2_b+2
+addlw 0xC0
+movwf TBLPTRL,0
+incf TBLPTRH,1,0
+TBLRDPOSTINC
+movff TABLAT,var_e1min+1
+TBLRDPOSTINC
+movff TABLAT,var_e1min
+TBLRDPOSTINC
+movff TABLAT,var_e1min+3
+TBLRD
+movff TABLAT,var_e1min+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var2_e1min+1
+TBLRDPOSTINC
+movff TABLAT,var2_e1min
+TBLRDPOSTINC
+movff TABLAT,var2_e1min+3
+TBLRD
+movff TABLAT,var2_e1min+2
+_endasm
+
+ temp_tissue = (temp_atem - sim_pres_tissue[ci]) * var_e1min;
+ temp_tissue_safety();
+ sim_pres_tissue[ci] = sim_pres_tissue[ci] + temp_tissue;
+
+ temp_tissue = (temp2_atem - sim_pres_tissue[ci+16]) * var2_e1min;
+ temp_tissue_safety();
+ sim_pres_tissue[ci+16] = sim_pres_tissue[ci+16] + temp_tissue;
+
+ temp_tissue = sim_pres_tissue[ci] + sim_pres_tissue[ci+16];
+ var_a = (var_a * sim_pres_tissue[ci] + var2_a * sim_pres_tissue[ci+16]) / temp_tissue;
+ var_b = (var_b * sim_pres_tissue[ci] + var2_b * sim_pres_tissue[ci+16]) / temp_tissue;
+ sim_pres_tissue_limit[ci] = (temp_tissue - var_a) * var_b;
+
+ if (sim_pres_tissue_limit[ci] < 0)
+ sim_pres_tissue_limit[ci] = 0;
+ if (sim_pres_tissue_limit[ci] > temp_pres_gtissue_limit)
+ {
+ temp_pres_gtissue = temp_tissue;
+ temp_pres_gtissue_limit = sim_pres_tissue_limit[ci];
+ temp_gtissue_no = ci;
+ }
+}
+ temp_pres_gtissue_diff = temp_pres_gtissue_limit - temp_pres_gtissue;
+ temp_pres_gtissue_limit_GF_low = GF_low * temp_pres_gtissue_diff + temp_pres_gtissue;
+ temp_pres_gtissue_limit_GF_low_below_surface = temp_pres_gtissue_limit_GF_low - pres_surface;
+ if (temp_pres_gtissue_limit_GF_low_below_surface < 0)
+ temp_pres_gtissue_limit_GF_low_below_surface = 0;
+}
+
+
+
+
+
+
+
+
+
+
+void sim_tissue_10min(void)
+{
+temp_pres_gtissue_limit = 0.0;
+temp_gtissue_no = 255;
+
+_asm
+lfsr 1, 0x300
+movlw 0x01
+movwf TBLPTRU,0
+_endasm
+
+for (ci=0;ci<16;ci++)
+{
+_asm
+movlw 0x02
+movwf TBLPTRH,0
+movlb 4
+movf ci,0,1
+addwf ci,0,1
+addwf ci,0,1
+addwf ci,0,1
+addlw 0x80
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var_a+1
+TBLRDPOSTINC
+movff TABLAT,var_a
+TBLRDPOSTINC
+movff TABLAT,var_a+3
+TBLRD
+movff TABLAT,var_a+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var2_a+1
+TBLRDPOSTINC
+movff TABLAT,var2_a
+TBLRDPOSTINC
+movff TABLAT,var2_a+3
+TBLRD
+movff TABLAT,var2_a+2
+addlw 0x40
+movwf TBLPTRL,0
+incf TBLPTRH,1,0
+TBLRDPOSTINC
+movff TABLAT,var_b+1
+TBLRDPOSTINC
+movff TABLAT,var_b
+TBLRDPOSTINC
+movff TABLAT,var_b+3
+TBLRD
+movff TABLAT,var_b+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var2_b+1
+TBLRDPOSTINC
+movff TABLAT,var2_b
+TBLRDPOSTINC
+movff TABLAT,var2_b+3
+TBLRD
+movff TABLAT,var2_b+2
+addlw 0xC0
+movwf TBLPTRL,0
+incf TBLPTRH,1,0
+incf TBLPTRH,1,0
+TBLRDPOSTINC
+movff TABLAT,var_e1min+1
+TBLRDPOSTINC
+movff TABLAT,var_e1min
+TBLRDPOSTINC
+movff TABLAT,var_e1min+3
+TBLRD
+movff TABLAT,var_e1min+2
+addlw 0x40
+movwf TBLPTRL,0
+
+TBLRDPOSTINC
+movff TABLAT,var2_e1min+1
+TBLRDPOSTINC
+movff TABLAT,var2_e1min
+TBLRDPOSTINC
+movff TABLAT,var2_e1min+3
+TBLRD
+movff TABLAT,var2_e1min+2
+_endasm
+
+ temp_tissue = (temp_atem - sim_pres_tissue[ci]) * var_e1min;
+ temp_tissue_safety();
+ sim_pres_tissue[ci] = sim_pres_tissue[ci] + temp_tissue;
+
+ temp_tissue = (temp2_atem - sim_pres_tissue[ci+16]) * var2_e1min;
+ temp_tissue_safety();
+ sim_pres_tissue[ci+16] = sim_pres_tissue[ci+16] + temp_tissue;
+
+temp_tissue = sim_pres_tissue[ci] + sim_pres_tissue[ci+16];
+ var_a = (var_a * sim_pres_tissue[ci] + var2_a * sim_pres_tissue[ci+16]) / temp_tissue;
+ var_b = (var_b * sim_pres_tissue[ci] + var2_b * sim_pres_tissue[ci+16]) / temp_tissue;
+
+sim_pres_tissue_limit[ci] = (temp_tissue - var_a) * var_b;
+ if (sim_pres_tissue_limit[ci] < 0)
+ sim_pres_tissue_limit[ci] = 0;
+ if (sim_pres_tissue_limit[ci] > temp_pres_gtissue_limit)
+ {
+ temp_pres_gtissue = temp_tissue;
+ temp_pres_gtissue_limit = sim_pres_tissue_limit[ci];
+ temp_gtissue_no = ci;
+ }
+}
+ temp_pres_gtissue_diff = temp_pres_gtissue_limit - temp_pres_gtissue;
+ temp_pres_gtissue_limit_GF_low = GF_low * temp_pres_gtissue_diff + temp_pres_gtissue;
+ temp_pres_gtissue_limit_GF_low_below_surface = temp_pres_gtissue_limit_GF_low - pres_surface;
+ if (temp_pres_gtissue_limit_GF_low_below_surface < 0)
+ temp_pres_gtissue_limit_GF_low_below_surface = 0;
+}
+
+
+
+
+
+
+
+void clear_decoarray(void)
+{
+char_O_array_decodepth[0] = 0;
+char_O_array_decodepth[1] = 0;
+char_O_array_decodepth[2] = 0;
+char_O_array_decodepth[3] = 0;
+char_O_array_decodepth[4] = 0;
+char_O_array_decodepth[5] = 0;
+char_O_array_decotime[0] = 0;
+char_O_array_decotime[1] = 0;
+char_O_array_decotime[2] = 0;
+char_O_array_decotime[3] = 0;
+char_O_array_decotime[4] = 0;
+char_O_array_decotime[5] = 0;
+char_O_array_decotime[6] = 0;
+}
+
+
+
+
+
+
+
+void update_decoarray()
+{
+ x = 0;
+ do
+ {
+ if (char_O_array_decodepth[x] == temp_depth_limit)
+ {
+ int_temp = char_O_array_decotime[x] + temp_decotime;
+ if (int_temp < 0)
+ int_temp = 0;
+ if (int_temp > 240)
+ int_temp = 240;
+ char_O_array_decotime[x] = int_temp;
+ x = 10;
+ }
+ else
+ {
+ if (char_O_array_decodepth[x] == 0)
+ {
+ if (temp_depth_limit > 255)
+ char_O_array_decodepth[x] = 255;
+ else
+ char_O_array_decodepth[x] = (char)temp_depth_limit;
+ int_temp = char_O_array_decotime[x] + temp_decotime;
+ if (int_temp > 240)
+ char_O_array_decotime[x] = 240;
+ else
+ char_O_array_decotime[x] = (char)int_temp;
+ x = 10;
+ }
+ else
+ x++;
+ }
+ } while (x<6);
+ if (x == 6)
+ {
+ int_temp = char_O_array_decotime[6] + temp_decotime;
+ if (int_temp > 220)
+ char_O_array_decotime[6] = 220;
+ else
+ char_O_array_decotime[6] = (char)int_temp;
+ }
+}
+
+
+
+
+
+
+
+
+void calc_gradient_factor(void)
+{
+
+
+
+
+ temp_tissue = pres_tissue[char_O_gtissue_no] + pres_tissue[char_O_gtissue_no+16];
+ temp1 = temp_tissue - pres_respiration;
+ temp2 = temp_tissue - pres_tissue_limit[char_O_gtissue_no];
+ temp2 = temp1/temp2;
+ temp2 = temp2 * 100;
+ if (temp2 < 0)
+ temp2 = 0;
+ if (temp2 > 255)
+ temp2 = 255;
+ if (temp1 < 0)
+ char_O_gradient_factor = 0;
+ else
+ char_O_gradient_factor = (char)temp2;
+
+ temp3 = temp2;
+
+ if (char_I_deco_model == 1)
+ {
+ temp1 = (float)temp_depth_GF_low_meter * 0.09995;
+ temp2 = pres_respiration - pres_surface;
+ if (temp2 <= 0)
+ temp1 = GF_high;
+ else
+ if (temp2 >= temp1)
+ temp1 = GF_low;
+ else
+ temp1 = GF_low + (temp1 - temp2)/temp1*GF_delta;
+ if (temp_depth_GF_low_meter == 0)
+ temp1 = GF_high;
+ temp2 = temp3 / temp1;
+ if (temp2 < 0)
+ temp2 = 0;
+ if (temp2 > 255)
+ temp2 = 255;
+ char_O_relative_gradient_GF = (char)temp2;
+ }
+ else
+ {
+ char_O_relative_gradient_GF = char_O_gradient_factor;
+ }
+}
+
+
+
+
+
+
+
+void calc_gradient_array_only()
+{
+ pres_respiration = (float)int_I_pres_respiration / 1000.0;
+for (ci=0;ci<16;ci++)
+{
+ temp_tissue = pres_tissue[ci] + pres_tissue[ci+16];
+ temp1 = temp_tissue - pres_respiration;
+ temp2 = temp_tissue - pres_tissue_limit[ci];
+ temp2 = temp1/temp2;
+ temp2 = temp2 * 200;
+ if (temp2 < 0)
+ temp2 = 0;
+ if (temp2 > 255)
+ temp2 = 255;
+ if (temp1 < 0)
+ char_O_array_gradient_weighted[ci] = 0;
+ else
+ char_O_array_gradient_weighted[ci] = (char)temp2;
+}
+}
+
+
+
+
+
+
+
+
+void calc_desaturation_time(void)
+{
+_asm
+lfsr 1, 0x300
+movlw 0x01
+movwf TBLPTRU,0
+_endasm
+ N2_ratio = 0.7902;
+ pres_surface = (float)int_I_pres_surface / 1000.0;
+ temp_atem = N2_ratio * (pres_surface - 0.0627);
+ int_O_desaturation_time = 0;
+ float_desaturation_multiplier = char_I_desaturation_multiplier / 142.0;
+
+for (ci=0;ci<16;ci++)
+{
+_asm
+movlw 0x04
+movwf TBLPTRH,0
+movlb 4
+movf ci,0,1
+addwf ci,0,1
+addwf ci,0,1
+addwf ci,0,1
+addlw 0x80
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var_halftimes+1
+TBLRDPOSTINC
+movff TABLAT,var_halftimes
+TBLRDPOSTINC
+movff TABLAT,var_halftimes+3
+TBLRD
+movff TABLAT,var_halftimes+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var2_halftimes+1
+TBLRDPOSTINC
+movff TABLAT,var2_halftimes
+TBLRDPOSTINC
+movff TABLAT,var2_halftimes+3
+TBLRD
+movff TABLAT,var2_halftimes+2
+_endasm
+
+
+
+
+
+
+ temp1 = 1.05 * temp_atem;
+ temp1 = temp1 - pres_tissue[ci];
+ temp2 = temp_atem - pres_tissue[ci];
+ if (temp2 >= 0.0)
+ {
+ temp1 = 0;
+ temp2 = 0;
+ }
+ else
+ temp1 = temp1 / temp2;
+ if (temp1 > 0.0)
+ {
+ temp1 = log(1.0 - temp1);
+ temp1 = temp1 / -0.6931;
+
+
+ temp2 = var_halftimes * temp1 / float_desaturation_multiplier;
+ }
+ else
+ {
+ temp1 = 0;
+ temp2 = 0;
+ }
+
+
+ temp3 = 0.1 - pres_tissue[ci+16];
+if (temp3 >= 0.0)
+ {
+ temp3 = 0;
+ temp4 = 0;
+ }
+ else
+ temp3 = -1.0 * temp3 / pres_tissue[ci+16];
+ if (temp3 > 0.0)
+ {
+ temp3 = log(1.0 - temp3);
+ temp3 = temp3 / -0.6931;
+
+
+ temp4 = var2_halftimes * temp3 / float_desaturation_multiplier;
+ }
+ else
+ {
+ temp3 = 0;
+ temp4 = 0;
+ }
+
+
+ if (temp4 > temp2)
+ int_temp = (int)temp4;
+ else
+ int_temp = (int)temp2;
+ if(int_temp > int_O_desaturation_time)
+ int_O_desaturation_time = int_temp;
+
+
+ temp2 = temp1 * 20.0;
+ temp2 = temp2 + 80.0;
+ if (temp2 < 0.0)
+ temp2 = 0.0;
+ if (temp2 > 255.0)
+ temp2 = 255.0;
+ char_O_tissue_saturation[ci] = (char)temp2;
+
+ temp4 = temp3 * 20.0;
+ temp4 = temp4 + 80.0;
+ if (temp4 < 0.0)
+ temp4 = 0.0;
+ if (temp4 > 255.0)
+ temp4 = 255.0;
+ char_O_tissue_saturation[ci+16] = (char)temp4;
+}
+}
+
+
+
+
+
+
+
+
+
+void calc_wo_deco_step_1_min(void)
+{
+ if(flag_in_divemode)
+ {
+ flag_in_divemode = 0;
+ set_dbg_end_of_dive();
+ }
+_asm
+ lfsr 1, 0x300
+_endasm
+ N2_ratio = 0.7902;
+ pres_respiration = (float)int_I_pres_respiration / 1000.0;
+ pres_surface = (float)int_I_pres_surface / 1000.0;
+ temp_atem = N2_ratio * (pres_respiration - 0.0627);
+ temp2_atem = 0.0;
+ temp_surface = pres_surface;
+ float_desaturation_multiplier = char_I_desaturation_multiplier / 142.0;
+ float_saturation_multiplier = char_I_saturation_multiplier / 100.0;
+
+ calc_tissue_step_1_min();
+ clear_decoarray();
+ char_O_deco_status = 0;
+ char_O_nullzeit = 0;
+ char_O_ascenttime = 0;
+ calc_gradient_factor();
+
+}
+
+
+
+
+
+
+
+void calc_tissue_step_1_min(void)
+{
+_asm
+lfsr 1, 0x300
+movlw 0x01
+movwf TBLPTRU,0
+_endasm
+
+ char_O_gtissue_no = 255;
+ pres_gtissue_limit = 0.0;
+
+for (ci=0;ci<16;ci++)
+{
+_asm
+movlw 0x02
+movwf TBLPTRH,0
+movlb 4
+movf ci,0,1
+addwf ci,0,1
+addwf ci,0,1
+addwf ci,0,1
+addlw 0x80
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var_a+1
+TBLRDPOSTINC
+movff TABLAT,var_a
+TBLRDPOSTINC
+movff TABLAT,var_a+3
+TBLRD
+movff TABLAT,var_a+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var2_a+1
+TBLRDPOSTINC
+movff TABLAT,var2_a
+TBLRDPOSTINC
+movff TABLAT,var2_a+3
+TBLRD
+movff TABLAT,var2_a+2
+addlw 0x40
+movwf TBLPTRL,0
+incf TBLPTRH,1,0
+TBLRDPOSTINC
+movff TABLAT,var_b+1
+TBLRDPOSTINC
+movff TABLAT,var_b
+TBLRDPOSTINC
+movff TABLAT,var_b+3
+TBLRD
+movff TABLAT,var_b+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var2_b+1
+TBLRDPOSTINC
+movff TABLAT,var2_b
+TBLRDPOSTINC
+movff TABLAT,var2_b+3
+TBLRD
+movff TABLAT,var2_b+2
+addlw 0xC0
+movwf TBLPTRL,0
+incf TBLPTRH,1,0
+TBLRDPOSTINC
+movff TABLAT,var_e1min+1
+TBLRDPOSTINC
+movff TABLAT,var_e1min
+TBLRDPOSTINC
+movff TABLAT,var_e1min+3
+TBLRD
+movff TABLAT,var_e1min+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var2_e1min+1
+TBLRDPOSTINC
+movff TABLAT,var2_e1min
+TBLRDPOSTINC
+movff TABLAT,var2_e1min+3
+TBLRD
+movff TABLAT,var2_e1min+2
+_endasm
+
+
+ temp_tissue = (temp_atem - pres_tissue[ci]) * var_e1min;
+ temp_tissue_safety();
+ pres_tissue[ci] = pres_tissue[ci] + temp_tissue;
+
+
+ temp_tissue = (temp2_atem - pres_tissue[ci+16]) * var2_e1min;
+ temp_tissue_safety();
+ pres_tissue[ci+16] = pres_tissue[ci+16] + temp_tissue;
+
+ temp_tissue = pres_tissue[ci] + pres_tissue[ci+16];
+ var_a = (var_a * pres_tissue[ci] + var2_a * pres_tissue[ci+16]) / temp_tissue;
+ var_b = (var_b * pres_tissue[ci] + var2_b * pres_tissue[ci+16]) / temp_tissue;
+ pres_tissue_limit[ci] = (temp_tissue - var_a) * var_b;
+ if (pres_tissue_limit[ci] < 0)
+ pres_tissue_limit[ci] = 0;
+ if (pres_tissue_limit[ci] > pres_gtissue_limit)
+ {
+ pres_gtissue_limit = pres_tissue_limit[ci];
+ char_O_gtissue_no = ci;
+ }
+
+
+
+
+
+
+
+
+
+temp1 = temp_tissue - pres_respiration;
+temp2 = temp_tissue - pres_tissue_limit[ci];
+temp2 = temp1/temp2;
+temp2 = temp2 * 200;
+if (temp2 < 0)
+ temp2 = 0;
+if (temp2 > 255)
+ temp2 = 255;
+if (temp1 < 0)
+ char_O_array_gradient_weighted[ci] = 0;
+else
+ char_O_array_gradient_weighted[ci] = (char)temp2;
+
+}
+}
+
+#line 2689 "p2_deco_main - 090915b.c"
+#line 2700 "p2_deco_main - 090915b.c"
+
+
+
+
+void hash(void)
+{
+
+ for (md_i=0;md_i<16;md_i++)
+ {
+ md_state[md_i] = 0;
+ md_cksum[md_i] = 0;
+ }
+
+_asm
+ movlw 0x01
+ movwf TBLPTRU,0
+ movlw 0x06
+ movwf TBLPTRH,0
+ movlw 0x00
+ movwf TBLPTRL,0
+_endasm
+ for (md_i=0;md_i<127;md_i++)
+ {
+_asm
+ TBLRDPOSTINC
+ movff TABLAT,md_temp
+_endasm
+ md_pi_subst[md_i] = md_temp;
+ }
+_asm
+ TBLRDPOSTINC
+ movff TABLAT,md_temp
+_endasm
+ md_pi_subst[127] = md_temp;
+ for (md_i=0;md_i<127;md_i++)
+ {
+_asm
+ TBLRDPOSTINC
+ movff TABLAT,md_temp
+_endasm
+ md_pi_subst[md_i+128] = md_temp;
+ }
+_asm
+ TBLRD
+ movff TABLAT,md_temp
+_endasm
+ md_pi_subst[255] = md_temp;
+
+_asm
+ movlw 0x00
+ movwf TBLPTRU,0
+ movlw 0x00
+ movwf TBLPTRH,0
+ movlw 0x00
+ movwf TBLPTRL,0
+_endasm
+
+for (md_pointer=0x0000;md_pointer<0x17f3;md_pointer++)
+{
+ md_t = 0;
+ for (md_i=0;md_i<16;md_i++)
+ {
+ if(md_pointer == 9)
+ md_temp = md_cksum[md_i];
+ else
+ {
+_asm
+ TBLRDPOSTINC
+ movff TABLAT,md_temp
+_endasm
+ }
+ md_buffer[md_i] = md_temp;
+ md_state[md_i+16] = md_buffer[md_i];
+ md_state[md_i+32] = (unsigned char)(md_buffer[md_i] ^ md_state[md_i]);
+ }
+
+ for (md_i=0;md_i<18;md_i++)
+ {
+ for (md_j=0;md_j<48;md_j++)
+ {
+ md_state[md_j] = (unsigned char)(md_state[md_j] ^ md_pi_subst[md_t]);
+ md_t = md_state[md_j];
+ }
+ md_t = (unsigned char)(md_t+1);
+ }
+ md_t = md_cksum[15];
+
+ for (md_i=0;md_i<16;md_i++)
+ {
+ md_cksum[md_i] = (unsigned char)(md_cksum[md_i] ^ md_pi_subst[(md_buffer[md_i] ^ md_t)]);
+ md_t = md_cksum[md_i];
+ }
+}
+}
+
+
+
+
+
+
+void clear_CNS_fraction(void)
+{
+ CNS_fraction = 0.0;
+ char_O_CNS_fraction = 0;
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+void calc_CNS_fraction(void)
+{
+ actual_ppO2 = (float)char_I_actual_ppO2 / 100.0;
+
+ if (char_I_actual_ppO2 < 50)
+ CNS_fraction = CNS_fraction;
+ else if (char_I_actual_ppO2 < 60)
+ CNS_fraction = 1/(-54000.0 * actual_ppO2 + 54000.0) + CNS_fraction;
+ else if (char_I_actual_ppO2 < 70)
+ CNS_fraction = 1/(-45000.0 * actual_ppO2 + 48600.0) + CNS_fraction;
+ else if (char_I_actual_ppO2 < 80)
+ CNS_fraction = 1/(-36000.0 * actual_ppO2 + 42300.0) + CNS_fraction;
+ else if (char_I_actual_ppO2 < 90)
+ CNS_fraction = 1/(-27000.0 * actual_ppO2 + 35100.0) + CNS_fraction;
+ else if (char_I_actual_ppO2 < 110)
+ CNS_fraction = 1/(-18000.0 * actual_ppO2 + 27000.0) + CNS_fraction;
+ else if (char_I_actual_ppO2 < 150)
+ CNS_fraction = 1/(-9000.0 * actual_ppO2 + 17100.0) + CNS_fraction;
+ else if (char_I_actual_ppO2 < 160)
+ CNS_fraction = 1/(-22500.0 * actual_ppO2 + 37350.0) + CNS_fraction;
+ else if (char_I_actual_ppO2 < 165)
+ CNS_fraction = 0.000755 + CNS_fraction;
+ else if (char_I_actual_ppO2 < 170)
+ CNS_fraction = 0.00102 + CNS_fraction;
+ else if (char_I_actual_ppO2 < 175)
+ CNS_fraction = 0.00136 + CNS_fraction;
+ else if (char_I_actual_ppO2 < 180)
+ CNS_fraction = 0.00180 + CNS_fraction;
+ else if (char_I_actual_ppO2 < 185)
+ CNS_fraction = 0.00237 + CNS_fraction;
+ else if (char_I_actual_ppO2 < 190)
+ CNS_fraction = 0.00310 + CNS_fraction;
+ else if (char_I_actual_ppO2 < 195)
+ CNS_fraction = 0.00401 + CNS_fraction;
+ else if (char_I_actual_ppO2 < 200)
+ CNS_fraction = 0.00517 + CNS_fraction;
+ else if (char_I_actual_ppO2 < 230)
+ CNS_fraction = 0.0209 + CNS_fraction;
+ else
+ CNS_fraction = 0.0482 + CNS_fraction;
+
+ if (CNS_fraction > 2.5)
+ CNS_fraction = 2.5;
+ if (CNS_fraction < 0.0)
+ CNS_fraction = 0.0;
+ char_O_CNS_fraction = (char)((CNS_fraction + 0.005)* 100.0);
+}
+
+
+
+
+
+
+
+
+
+
+
+void calc_CNS_decrease_15min(void)
+{
+ CNS_fraction = 0.890899 * CNS_fraction;
+ char_O_CNS_fraction = (char)((CNS_fraction + 0.005)* 100.0);
+}
+
+
+
+
+
+
+
+
+
+
+void calc_percentage(void)
+{
+ temp1 = (float)int_I_temp;
+ temp2 = (float)char_I_temp / 100.0;
+ temp3 = temp1 * temp2;
+ int_I_temp = (int)temp3;
+}
+void push_tissues_to_vault(void)
+{
+ for (ci=0;ci<32;ci++)
+ pres_tissue_vault[ci] = pres_tissue[ci];
+}
+void pull_tissues_from_vault(void)
+{
+ for (ci=0;ci<32;ci++)
+ pres_tissue[ci] = pres_tissue_vault[ci];
+}
+
+void wp_write_command(void)
+{
+ _asm
+ bcf PORTE,0,0
+ movff wp_command,PORTD
+ bcf PORTA,2,0
+ bsf PORTA,2,0
+ _endasm
+}
+
+void wp_write_data(void)
+{
+ wp_data_8bit_one = wp_data_16bit >> 8;
+ wp_data_8bit_two = wp_data_16bit;
+_asm
+ bsf PORTE,0,0
+ movff wp_data_8bit_one,PORTD
+ bcf PORTA,2,0
+ bsf PORTA,2,0
+ movff wp_data_8bit_two,PORTD
+ bcf PORTA,2,0
+ bsf PORTA,2,0
+_endasm
+}
+
+void wp_write_black(void)
+{
+_asm
+ movff wp_black,PORTD
+ bcf PORTA,2,0
+ bsf PORTA,2,0
+ bcf PORTA,2,0
+ bsf PORTA,2,0
+_endasm
+}
+
+void wp_write_color(void)
+{
+_asm
+ movff wp_color1,PORTD
+ bcf PORTA,2,0
+ bsf PORTA,2,0
+ movff wp_color2,PORTD
+ bcf PORTA,2,0
+ bsf PORTA,2,0
+_endasm
+}
+
+void wp_set_window(void)
+{
+
+ wp_command = 0x35;
+ wp_write_command();
+ wp_data_16bit = ((unsigned int )wp_leftx2) << 1;
+ wp_write_data();
+
+ wp_command = 0x36;
+ wp_write_command();
+ wp_data_16bit = 319;
+ wp_write_data();
+
+ wp_command = 0x37;
+ wp_write_command();
+
+ wp_data_16bit = wp_top;
+ if(wp_font == 2)
+ wp_data_16bit += 58 ;
+ else if(wp_font == 1)
+ wp_data_16bit += 32 ;
+ else
+ wp_data_16bit += 24 ;
+ wp_data_16bit--;
+ if(wp_data_16bit > 239)
+ wp_data_16bit = 239;
+
+ wp_data_16bit |= ((unsigned int )wp_top) << 8;
+
+ wp_write_data();
+
+
+ wp_command = 0x20;
+ wp_write_command();
+ wp_data_16bit = wp_top;
+ wp_write_data();
+
+ wp_command = 0x21;
+ wp_write_command();
+ wp_data_16bit = ((unsigned int )wp_leftx2) << 1;
+ wp_write_data();
+}
+
+void wp_set_char_font_small(void)
+{
+ if (wp_char == ' ')
+ wp_char = 'ķ';
+
+ if((wp_char < '!') || (wp_char > 'ķ'))
+ wp_char = 'Ī';
+
+ if (wp_char > 0x7E)
+ wp_char -= 34;
+
+ wp_start = wp_small_table[wp_char - '!'];
+ wp_end = wp_small_table[1 + wp_char - '!'];
+}
+
+void wp_set_char_font_medium(void)
+{
+
+ if (wp_char == 0x27)
+ wp_char = 0x3B;
+ if (wp_char == '"')
+ wp_char = 0x3C;
+ if (wp_char == 'm')
+ wp_char = 0x3D;
+ if (wp_char == ' ')
+ wp_char = 0x3E;
+
+ if((wp_char < '.') || (wp_char > 0x3E))
+ wp_char = 0x3E;
+ wp_start = wp_medium_table[wp_char - '.'];
+ wp_end = wp_medium_table[1 + wp_char - '.'];
+}
+
+void wp_set_char_font_large(void)
+{
+
+ if (wp_char == ' ')
+ wp_char = 0x2F;
+
+ if((wp_char < '.') || (wp_char > '9'))
+ wp_char = 0x2F;
+ wp_start = wp_large_table[wp_char - '.'];
+ wp_end = wp_large_table[1 + wp_char - '.'];
+}
+
+void wordprocessor(void)
+{
+ wp_set_window();
+
+
+ wp_command = 0x22;
+ wp_write_command();
+ _asm
+ bsf PORTE,0,0
+ _endasm
+
+ wp_txtptr = 0;
+ wp_char = wp_stringstore[wp_txtptr];
+
+ while(wp_char)
+ {
+ if(wp_font == 2)
+ wp_set_char_font_large();
+ else if(wp_font == 1)
+ wp_set_char_font_medium();
+ else
+ wp_set_char_font_small();
+
+ wp_black = 0;
+
+ for(wp_i = wp_start; wp_i> 8;
+ if((wp_temp_U8 & 128))
+ {
+ wp_temp_U8 -= 127;
+ if(wp_invert)
+ {
+ while(wp_temp_U8 > 0)
+ {
+ wp_temp_U8--;
+ wp_write_color();
+ }
+ }
+ else
+ {
+ _asm
+ movff wp_black,PORTD
+ _endasm
+ while(wp_temp_U8 > 0)
+ {
+ wp_temp_U8--;
+ _asm
+ bcf PORTA,2,0
+ bsf PORTA,2,0
+ bcf PORTA,2,0
+ bsf PORTA,2,0
+ _endasm
+ }
+ }
+ }
+ else
+ {
+ wp_temp_U8++;
+ if(wp_invert)
+ {
+ _asm
+ movff wp_black,PORTD
+ _endasm
+ while(wp_temp_U8 > 0)
+ {
+ wp_temp_U8--;
+ _asm
+ bcf PORTA,2,0
+ bsf PORTA,2,0
+ bcf PORTA,2,0
+ bsf PORTA,2,0
+ _endasm
+ }
+ }
+ else
+ {
+ while(wp_temp_U8 > 0)
+ {
+ wp_temp_U8--;
+ wp_write_color();
+ }
+ }
+ }
+ }
+ wp_txtptr++;
+ wp_char = wp_stringstore[wp_txtptr];
+ }
+ wp_command = 0x00;
+ wp_write_command();
+}
diff -r 000000000000 -r 96a35aeda5f2 code_part1/OSTC_code_c_part2/p2_deco_main.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/code_part1/OSTC_code_c_part2/p2_deco_main.c Tue Jan 12 15:05:59 2010 +0100
@@ -0,0 +1,3211 @@
+/*
+ * p2_deco_main.c
+ *
+ * Created on: 31.08.2009
+ * Author: christian.w @ heinrichsweikamp.com
+ *
+ */
+
+//#include
+
+// OSTC - diving computer code
+// Copyright (C) 2009 HeinrichsWeikamp GbR
+
+// 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 3 of the License, or
+// (at your option) any later version.
+
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// 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, see .
+
+
+// *****************************
+// ** I N T R O D U C T I O N **
+// *****************************
+//
+// OSTC
+//
+// code:
+// p2_deco_main_c_v101.c
+// part2 of the OSTC code
+// code with constant O2 partial pressure routines
+// under construction !!
+//
+// summary:
+// decompression routines
+// for the OSTC experimental project
+// written by Christian Weikamp
+// last revision __________
+// comments added _________
+//
+// additional files:
+// p2_tables_v100.romdata (other files)
+// 18f4685_ostc_v100.lkr (linker script)
+//
+// history:
+// 01/03/08 v100: first release candidate
+// 03/13/08 v101: start of programming ppO2 code
+// 03/13/25 v101a: backup of interrim version with ppO2 calculation
+// 03/13/25 v101: open circuit gas change during deco
+// 03/13/25 v101: CNS_fraction calculation
+// 03/13/26 v101: optimization of tissue calc routines
+// 07/xx/08 v102a: debug of bottom time routine
+// 09/xx/08 v102d: Gradient Factor Model implemenation
+// 10/10/08 v104: renamed to build v103 for v118 stable
+// 10/14/08 v104: integration of temp_depth_last_deco for Gradient Model
+// 03/31/090 v107: integration of FONT Incon24
+
+//
+// literature:
+// B"uhlmann, Albert: Tauchmedizin; 4. Auflage;
+// Schr"oder, Kai & Reith, Steffen; 2000; S"attigungsvorg"ange beim Tauchen, das Modell ZH-L16, Funktionsweise von Tauchcomputern; http://www.achim-und-kai.de/kai/tausim/saett_faq
+// Morrison, Stuart; 2000; DIY DECOMPRESSION; http://www.lizardland.co.uk/DIYDeco.html
+// Balthasar, Steffen; Dekompressionstheorie I: Neo Haldane Modelle; http://www.txfreak.de/dekompressionstheorie_1.pdf
+// Baker, Erik C.; Clearing Up The Confusion About "Deep Stops"
+// Baker, Erik C.; Understanding M-values; http://www.txfreak.de/understanding_m-values.pdf
+
+
+// *********************
+// ** I N C L U D E S **
+// *********************
+ #include
+ #include
+
+// ********************************
+// ** C O N F I G U R A T I O N **
+// ** for simulation without asm **
+// ********************************
+ #pragma config OSC = IRCIO67
+ #pragma config FCMEN = OFF
+ #pragma config IESO = OFF
+ #pragma config PWRT = ON
+ #pragma config BOREN = OFF
+ #pragma config WDT = OFF
+ #pragma config WDTPS = 128
+ #pragma config MCLRE = ON
+ #pragma config LPT1OSC = OFF
+ #pragma config PBADEN = OFF
+ #pragma config DEBUG = OFF
+ #pragma config XINST = OFF
+ #pragma config LVP = OFF
+ #pragma config STVREN = OFF
+
+// ****************************
+// ** D E F I N E S **
+// ** missing in p18f4685.h **
+// ****************************
+/*
+#define INT0IF 1
+#define INT1IF 0
+#define TMR1IF 0
+*/
+
+# define DBG_c_gas 0b0000000000000001
+# define DBG_c_ppO2 0b0000000000000010
+# define DBG_RUN 0b0000000000000100
+# define DBG_RESTART 0b0000000000001000
+
+# define DBG_CdeSAT 0b0000000000010000
+# define DBG_C_MODE 0b0000000000100000
+# define DBG_C_SURF 0b0000000001000000
+# define DBG_HEwoHE 0b0000000010000000
+
+# define DBG_C_DPPO2 0b0000000100000000
+# define DBG_C_DGAS 0b0000001000000000
+# define DBG_C_DIST 0b0000010000000000
+# define DBG_C_LAST 0b0000100000000000
+
+# define DBG_C_GF 0b0001000000000000
+# define DBG_ZH16ERR 0b0010000000000000
+# define DBG_PHIGH 0b0100000000000000
+# define DBG_PLOW 0b1000000000000000
+
+
+# define DBS_mode 0b0000000000000001
+# define DBS_ppO2 0b0000000000000010
+# define DBS_HE_sat 0b0000000000000100
+# define DBS_ppO2chg 0b0000000000001000
+
+# define DBS_SAT2l 0b0000000000010000
+# define DBS_SAT2h 0b0000000000100000
+# define DBS_GFLOW2l 0b0000000001000000
+# define DBS_GFLOW2h 0b0000000010000000
+
+# define DBS_GFHGH2l 0b0000000100000000
+# define DBS_GFHGH2h 0b0000001000000000
+# define DBS_GASO22l 0b0000010000000000
+# define DBS_GASO22h 0b0000100000000000
+
+# define DBS_DIST2h 0b0001000000000000
+# define DBS_LAST2h 0b0010000000000000
+# define DBS_DECOO2l 0b0100000000000000
+# define DBS_DECOO2h 0b1000000000000000
+
+
+# define DBS2_PRES2h 0b0000000000000001
+# define DBS2_PRES2l 0b0000000000000010
+# define DBS2_SURF2l 0b0000000000000100
+# define DBS2_SURF2h 0b0000000000001000
+
+# define DBS2_DESAT2l 0b0000000000010000
+# define DBS2_DESAT2h 0b0000000000100000
+# define DBS2_GFDneg 0b0000000001000000
+# define DBS2_ 0b000000000000000
+
+# define DBS2_ 0b000000000000000
+# define DBS2_ 0b000000000000000
+# define DBS2_ 0b000000000000000
+# define DBS2_ 0b000000000000000
+
+// NDL_at_20mtr
+
+
+
+// ***********************
+// ** V A R I A B L E S **
+// ***********************
+// prefixes etc:
+// _O_ = output for use in the assembler code
+// _I_ = input from the assembler code for the c code
+// char_ and int_ = used to identify output and input size
+// var = variable (from b"uhlmann)
+// pres = pressure
+// gtissue = guiding tissue, the one limiting the ascent
+// e2secs = exp of the b"uhlmann formula precalculated for a 2 second step
+// e1min = same for 1 minute step
+// sim = used in simulating the ascent to the surface
+// nullzeit = remaining ground/bottom time for "no deco"
+// hauptroutine = main
+
+#define WP_FONT_SMALL_HEIGHT 24
+#define WP_FONT_MEDIUM_HEIGHT 32
+#define WP_FONT_LARGE_HEIGHT 58
+
+#define oled_rw PORTA,2,0
+#define oled_rs PORTE,0,0
+
+#define U8 unsigned char
+#define U16 unsigned int
+
+// IO assembler
+#pragma udata bank0a=0x060
+volatile unsigned char wp_stringstore[26];
+volatile U8 wp_color1;
+volatile U8 wp_color2;
+volatile U8 wp_top;
+volatile U8 wp_leftx2;
+volatile U8 wp_font;
+volatile U8 wp_invert;
+volatile U8 wp_temp_U8;
+// internal C
+#pragma udata bank0b=0x081
+volatile U8 wp_txtptr;
+volatile unsigned char wp_char;
+volatile U8 wp_command;
+volatile U16 wp_data_16bit;
+volatile U8 wp_data_8bit_one;
+volatile U8 wp_data_8bit_two;
+volatile U16 wp_start;
+volatile U16 wp_end;
+volatile U16 wp_i;
+volatile U8 wp_black;
+// some spare
+volatile U8 wp_debug_U8;
+
+// asm only
+#pragma udata bank0c=0x0D0
+#define LENGTH_kf_bank0 48
+volatile unsigned char keep_free_bank0[LENGTH_kf_bank0];
+
+
+#pragma udata bank1=0x100
+#define LENGTH_kf_bank1 256
+volatile unsigned char keep_free_bank1[LENGTH_kf_bank1]; // used by the assembler code
+
+ #pragma udata bank2a=0x200
+// output:
+ static unsigned int int_O_tissue_for_debug[32];
+ static unsigned int int_O_GF_spare____; // 0x240
+ static unsigned int int_O_GF_step; // 0x242
+ static unsigned int int_O_gtissue_limit; // 0x244
+ static unsigned int int_O_gtissue_press; // 0x246
+ static unsigned int int_O_limit_GF_low; // 0x248
+ static unsigned int int_O_gtissue_press_at_GF_low; // 0x24A
+// 0x24C + 0x24D noch unbenutzt
+
+ #pragma udata bank2b=0x24E
+ static unsigned char char_O_GF_low_pointer; // 0x24E
+ static unsigned char char_O_actual_pointer; // 0x24F
+ #pragma udata bank2c=0x250
+ static unsigned char char_O_deco_table[32]; // 0x250
+ #pragma udata bank2d=0x270
+ static unsigned char char_I_table_deco_done[32];
+ #pragma udata bank2e=0x290
+ static unsigned int int_O_calc_tissue_call_counter; // 0x290
+// internal:
+ unsigned char lock_GF_depth_list;
+ static float temp_limit;
+ static float GF_low;
+ static float GF_high;
+ static float GF_delta;
+ static float GF_temp;
+ static float GF_step;
+ static float GF_step2;
+ static float temp_pres_gtissue;
+ static float temp_pres_gtissue_diff;
+ static float temp_pres_gtissue_limit_GF_low;
+ static float temp_pres_gtissue_limit_GF_low_below_surface;
+ static unsigned int temp_depth_limit;
+ static unsigned char temp_decotime;
+ static unsigned char temp_gtissue_no;
+ static unsigned int temp_depth_last_deco; // new in v.101
+
+ static unsigned char temp_depth_GF_low_meter;
+ static unsigned char temp_depth_GF_low_number;
+ static unsigned char internal_deco_pointer;
+ static unsigned char internal_deco_table[32];
+ static float temp_pres_deco_GF_low;
+
+static unsigned int debug_temp;
+
+
+#pragma udata bank3a=0x300
+static char output[32];
+// used by the math routines
+#pragma udata bank3b=0x380
+volatile float pres_tissue_vault[32];
+ #pragma udata bank4a=0x400
+// internal:
+ unsigned char ci ; // don't move - used in _asm routines - if moved then modify movlb commands
+ unsigned char x;
+ unsigned int main_i;
+ unsigned int int_temp;
+ unsigned int int_temp_decostatus;
+ static float pres_respiration;
+ static float pres_surface;
+ static float temp1;
+ static float temp2;
+ static float temp3;
+ static float temp4;
+ static float temp_deco;
+ static float temp_atem;
+ static float temp2_atem;
+ static float temp_tissue;
+ static float temp_surface;
+ static float N2_ratio;
+ static float He_ratio;
+ static float temp_ratio;
+ static float var_a;
+ static float var2_a;
+ static float var_b;
+ static float var2_b;
+ static float var_t05nc;
+ static float var2_t05nc;
+ static float var_e2secs;
+ static float var2_e2secs;
+ static float var_e1min;
+ static float var2_e1min;
+ static float var_halftimes;
+ static float var2_halftimes;
+ static float pres_gtissue_limit;
+ static float temp_pres_gtissue_limit;
+ static float actual_ppO2; // new in v.102
+ #pragma udata bank4b=0x480
+ static float pres_tissue[32];
+
+ #pragma udata bank5=0x500
+// don't move positions in this bank, the registers are addressed directly from assembler code
+// input:
+ static unsigned int int_I_pres_respiration; // 0x500
+ static unsigned int int_I_pres_surface; // 0x502
+ static unsigned int int_I_temp; // 0x504 new in v101
+ static unsigned char char_I_temp; // 0x506 new in v101
+ static unsigned char char_I_actual_ppO2; // 0x507
+ static unsigned int int_I_spare_3;
+ static unsigned int int_I_spare_4;
+ static unsigned int int_I_spare_5;
+ static unsigned int int_I_spare_6;
+ static unsigned char char_I_N2_ratio; // 0x510
+ static unsigned char char_I_He_ratio; // 0x511
+ static unsigned char char_I_saturation_multiplier; // for conservatism/safety values 1.0 (no conservatism) to 1.5 (50% faster saturation
+ static unsigned char char_I_desaturation_multiplier; // for conservatism/safety values 0.66 (50% slower desaturation) to 1.0 (no conservatism)// consveratism used in calc_tissue(), calc_tissue_step_1_min() and sim_tissue_1min()
+ static unsigned char char_I_GF_High_percentage; // 0x514 new in v.102
+ static unsigned char char_I_GF_Low_percentage; // 0x515 new in v.102
+ static unsigned char char_I_spare; // 0x516
+ static unsigned char char_I_deco_distance; // 0x517
+ static unsigned char char_I_const_ppO2; // 0x518 new in v.101
+ static unsigned char char_I_deco_ppO2_change; // 0x519 new in v.101
+ static unsigned char char_I_deco_ppO2; // 0x51A new in v.101
+ static unsigned char char_I_deco_gas_change; // 0x51B new in v.101
+ static unsigned char char_I_deco_N2_ratio; // 0x51C new in v.101
+ static unsigned char char_I_deco_He_ratio; // 0x51D new in v.101
+ static unsigned char char_I_depth_last_deco; // 0x51E new in v.101 unit: [m]
+ static unsigned char char_I_deco_model; // 0x51F new in v.102 ( 1 = MultiGraF, sonst Std. mit (de-)saturation_multiplier)
+// output:
+ static unsigned int int_O_desaturation_time; // 0x520
+ static unsigned char char_O_nullzeit; // 0x522
+ static unsigned char char_O_deco_status; // 0x523
+ static unsigned char char_O_array_decotime[7]; // 0x524
+ static unsigned char char_O_array_decodepth[6]; // 0x52B
+ static unsigned char char_O_ascenttime; // 0x531
+ static unsigned char char_O_gradient_factor; // 0x532
+ static unsigned char char_O_tissue_saturation[32]; // 0x533
+ static unsigned char char_O_array_gradient_weighted[16]; // 0x553
+ static unsigned char char_O_gtissue_no; // 0x563
+ static unsigned char char_O_diluent; // 0x564 new in v.101
+ static unsigned char char_O_CNS_fraction; // 0x565 new in v.101
+ static unsigned char char_O_relative_gradient_GF; // 0x566 new in v.102
+
+// internal:
+ static float pres_tissue_limit[16];
+ static float sim_pres_tissue_limit[16];
+ static float pres_diluent; // new in v.101
+ static float deco_diluent; // new in v.101
+ static float const_ppO2; // new in v.101
+ static float deco_ppO2_change; // new in v.101
+ static float deco_ppO2; // new in v.101
+
+
+
+ #pragma udata bank6=0x600
+// internal:
+ static float sim_pres_tissue[32];
+ static float sim_pres_tissue_backup[32];
+
+ //#pragma udata bank7=0x700
+ //const unsigned char keep_free_bank7[256]; // used by the assembler code (DD font2display)
+
+ #pragma udata bank8=0x800
+ static char md_pi_subst[256];
+
+ #pragma udata bank9a=0x900
+// output:
+ static char md_state[48]; // DONT MOVE !! // has to be at the beginning of bank 9 for the asm code!!!
+ #pragma udata bank9b=0x930
+// output:
+ static unsigned int int_O_DBS_bitfield; // 0x930 new in v.108
+ static unsigned int int_O_DBS2_bitfield; // 0x932 new in v.108
+ static unsigned int int_O_DBG_pre_bitfield; // 0x934 new in v.108
+ static unsigned int int_O_DBG_post_bitfield; // 0x936 new in v.108
+ static char char_O_NDL_at_20mtr; // 0x938 new in v.108 // 0xFF == undefined, max. 254
+// internal:
+ static char md_t;
+ static char md_buffer[16];
+ static char md_cksum[16];
+ static char md_i;
+ static char md_j;
+ static char md_temp;
+ static unsigned int md_pointer;
+ static float deco_N2_ratio; // new in v.101
+ static float deco_He_ratio; // new in v.101
+ static float calc_N2_ratio; // new in v.101
+ static float calc_He_ratio; // new in v.101
+ static float deco_gas_change; // new in v.101
+ static float CNS_fraction; // new in v.101
+ static float float_saturation_multiplier; // new in v.101
+ static float float_desaturation_multiplier; // new in v.101
+ static float float_deco_distance; // new in v.101
+// internal, dbg:
+ static unsigned char DBG_char_I_deco_model; // new in v.108
+ static unsigned char DBG_char_I_depth_last_deco; // new in v.108
+ static float DBG_pres_surface; // new in v.108
+ static float DBG_GF_low; // new in v.108
+ static float DBG_GF_high; // new in v.108
+ static float DBG_const_ppO2; // new in v.108
+ static float DBG_deco_ppO2_change; // new in v.108
+ static float DBG_deco_ppO2; // new in v.108
+ static float DBG_deco_N2_ratio; // new in v.108
+ static float DBG_deco_He_ratio; // new in v.108
+ static float DBG_deco_gas_change; // new in v.108
+ static float DBG_float_saturation_multiplier; // new in v.108
+ static float DBG_float_desaturation_multiplier; // new in v.108
+ static float DBG_float_deco_distance; // new in v.108
+ static float DBG_deco_N2_ratio; // new in v.108
+ static float DBG_deco_He_ratio; // new in v.108
+ static float DBG_N2_ratio; // new in v.108
+ static float DBG_He_ratio; // new in v.108
+ static char flag_in_divemode; // new in v.108
+ static int int_dbg_i; // new in v.108
+ unsigned int temp_DBS;
+
+// *************************
+// ** P R O T O T Y P E S **
+// *************************
+void main_calc_hauptroutine(void);
+void main_calc_without_deco(void);
+void main_clear_tissue(void);
+void main_calc_percentage(void);
+void main_calc_wo_deco_step_1_min(void);
+void main_debug(void);
+void main_gradient_array(void);
+void main_hash(void);
+
+void calc_hauptroutine(void);
+void calc_tissue(void);
+void calc_nullzeit(void);
+void backup_sim_pres_tissue(void);
+void restore_sim_pres_tissue(void);
+
+void calc_without_deco(void);
+void clear_tissue(void);
+void calc_ascenttime(void);
+void update_startvalues(void);
+void clear_decoarray(void);
+void update_decoarray(void);
+void sim_tissue_1min(void);
+void sim_tissue_10min(void);
+void calc_gradient_factor(void);
+void calc_gradient_array_only(void);
+void calc_desaturation_time(void);
+void calc_wo_deco_step_1_min(void);
+void calc_tissue_step_1_min(void);
+void hash(void);
+void clear_CNS_fraction(void);
+void calc_CNS_fraction(void);
+void calc_CNS_decrease_15min(void);
+void calc_percentage(void);
+void main(void);
+void calc_hauptroutine_data_input(void);
+void calc_hauptroutine_update_tissues(void);
+void calc_hauptroutine_calc_deco(void);
+void calc_hauptroutine_calc_ascend_to_deco(void);
+void calc_nextdecodepth_GF(void);
+void copy_deco_table_GF(void);
+void clear_internal_deco_table_GF(void);
+void update_internal_deco_table_GF(void);
+void DD2_write(void);
+void DD2_write_incon42(void);
+void DD2_get_pointer_to_char(void);
+void DD2_set_column(void);
+void DD2_load_background(void);
+void DD2_build_one_line_of_char(void);
+void DD2_print_column(void);
+void DD2_CmdWrite(void);
+void DD2_DataWrite(void);
+void push_tissues_to_vault(void);
+void pull_tissues_from_vault(void);
+void main_push_tissues_to_vault(void);
+void main_pull_tissues_from_vault(void);
+void wordprocessor(void);
+
+// *******************************
+// ** start **
+// ** necessary for compilation **
+// *******************************
+#pragma romdata der_code = 0x0000
+#pragma code der_start = 0x0000
+void der_start(void)
+{
+_asm
+ goto main
+_endasm
+}
+
+// ***********************************
+// ** main code for simulation / **
+// ** tests without assembler code **
+// ** is NOT a part of the OSTC **
+// ***********************************
+#pragma code main = 0x9000
+void main(void)
+{
+ for(wp_temp_U8=0;wp_temp_U8 15) // can't go up to first deco, too deep to calculate in the given time slot
+ {
+ char_O_deco_status = 2;
+// char_O_lock_depth_list = 255;
+ }
+ else
+ {
+// char_O_lock_depth_list = lock_GF_depth_list;
+ calc_hauptroutine_calc_deco();
+ }
+// build_debug_output();
+
+_asm
+nop
+_endasm
+while (char_O_deco_status == 1)
+{
+ char_O_deco_status = 0;
+// char_O_lock_depth_list = 255;
+ calc_hauptroutine_calc_deco();
+// build_debug_output();
+_asm
+nop
+_endasm
+};
+debug_temp = 60; // [mtr Aufstieg in 10 mtr/min (30steps'2sec/min]
+int_I_pres_respiration = 9980;
+for (main_i=0;main_i 15) // can't go up to first deco, too deep to calculate in the given time slot
+ {
+ char_O_deco_status = 2;
+// char_O_lock_depth_list = 255;
+ }
+ else
+ {
+// char_O_lock_depth_list = lock_GF_depth_list;
+ calc_hauptroutine_calc_deco();
+ }
+// build_debug_output();
+
+_asm
+nop
+_endasm
+while (char_O_deco_status == 1)
+{
+ char_O_deco_status = 0;
+// char_O_lock_depth_list = 255;
+ calc_hauptroutine_calc_deco();
+// build_debug_output();
+_asm
+nop
+_endasm
+};
+_asm
+nop
+_endasm
+debug_temp = 60; // [mtr Aufstieg in 10 mtr/min (30steps'2sec/min]
+int_I_pres_respiration = 9980;
+debug_temp = debug_temp * 3;
+for (main_i=0;main_i 1.3)
+ int_O_DBS_bitfield |= DBS_SAT2h;
+ if(GF_low < 0.19)
+ int_O_DBS_bitfield |= DBS_GFLOW2l;
+ if(GF_low > 1.01)
+ int_O_DBS_bitfield |= DBS_GFLOW2h;
+ if(GF_high < 0.6)
+ int_O_DBS_bitfield |= DBS_GFHGH2l;
+ if(GF_high > 1.01)
+ int_O_DBS_bitfield |= DBS_GFHGH2h;
+ if((N2_ratio + He_ratio) > 0.95)
+ int_O_DBS_bitfield |= DBS_GASO22l;
+ if((N2_ratio + He_ratio) < 0.05)
+ int_O_DBS_bitfield |= DBS_GASO22h;
+ if(float_deco_distance > 0.25)
+ int_O_DBS_bitfield |= DBS_DIST2h;
+ if(char_I_depth_last_deco > 8)
+ int_O_DBS_bitfield |= DBS_LAST2h;
+ if(DBG_deco_gas_change && ((deco_N2_ratio + deco_He_ratio) > 0.95))
+ int_O_DBS_bitfield |= DBS_DECOO2l;
+ if(DBG_deco_gas_change && ((deco_N2_ratio + deco_He_ratio) < 0.05))
+ int_O_DBS_bitfield |= DBS_DECOO2h;
+ if(pres_respiration > 3.0)
+ int_O_DBS2_bitfield |= DBS2_PRES2h;
+ if(pres_surface - pres_respiration > 0.2)
+ int_O_DBS2_bitfield |= DBS2_PRES2l;
+ if(pres_surface < 0.75)
+ int_O_DBS2_bitfield |= DBS2_SURF2l;
+ if(pres_surface > 1.11)
+ int_O_DBS2_bitfield |= DBS2_SURF2h;
+ if(float_desaturation_multiplier < 0.70)
+ int_O_DBS2_bitfield |= DBS2_DESAT2l;
+ if(float_desaturation_multiplier > 1.01)
+ int_O_DBS2_bitfield |= DBS2_DESAT2h;
+ if(GF_low > GF_high)
+ int_O_DBS2_bitfield |= DBS2_GFDneg;
+}
+
+// -------------------------------
+// DBG - set DBG to end_of_dive //
+// -------------------------------
+void set_dbg_end_of_dive(void)
+{
+ int_O_DBG_pre_bitfield &= (~DBG_RUN);
+ int_O_DBG_post_bitfield &= (~DBG_RUN);
+}
+
+// -------------------------------
+// DBG - NDL at first 20 m. hit //
+// -------------------------------
+void check_ndl(void)
+{
+ if((char_O_NDL_at_20mtr == -1) && (int_I_pres_respiration > 3000))
+ {
+ char_O_NDL_at_20mtr = char_O_nullzeit;
+ if(char_O_NDL_at_20mtr == 255)
+ char_O_NDL_at_20mtr == 254;
+ }
+}
+
+// -------------------------------
+// DBG - multi main during dive //
+// -------------------------------
+void check_dbg(char is_post_check)
+{
+ temp_DBS = 0;
+ if( (DBG_N2_ratio != N2_ratio) || (DBG_He_ratio != He_ratio) )
+ temp_DBS |= DBG_c_gas;
+ if(DBG_const_ppO2 != const_ppO2)
+ temp_DBS |= DBG_c_ppO2;
+ if((DBG_float_saturation_multiplier != float_saturation_multiplier) || (DBG_float_desaturation_multiplier != float_desaturation_multiplier))
+ temp_DBS |= DBG_CdeSAT;
+ if(DBG_char_I_deco_model != char_I_deco_model)
+ temp_DBS |= DBG_C_MODE;
+ if(DBG_pres_surface != pres_surface)
+ temp_DBS |= DBG_C_SURF;
+ if((!DBS_HE_sat) && (!He_ratio))
+ for(int_dbg_i = 16; int_dbg_i < 32; int_dbg_i++)
+ if(pres_tissue[int_dbg_i])
+ temp_DBS |= DBG_HEwoHE;
+ if(DBG_deco_ppO2 != deco_ppO2)
+ temp_DBS |= DBG_C_DPPO2;
+ if((DBG_deco_gas_change != deco_gas_change) || (DBG_deco_N2_ratio != deco_N2_ratio) || (DBG_deco_He_ratio != deco_He_ratio))
+ temp_DBS |= DBG_C_DGAS;
+ if(DBG_float_deco_distance != float_deco_distance)
+ temp_DBS |= DBG_C_DIST;
+ if(DBG_char_I_depth_last_deco != char_I_depth_last_deco)
+ temp_DBS |= DBG_C_LAST;
+ if((DBG_GF_low != GF_low) || (DBG_GF_high != GF_high))
+ temp_DBS |= DBG_C_GF;
+ if(pres_respiration > 13.0)
+ temp_DBS |= DBG_PHIGH;
+ if(pres_surface - pres_respiration > 0.2)
+ temp_DBS |= DBG_PLOW;
+/*
+ if()
+ temp_DBS |= ;
+ if()
+ temp_DBS |= ;
+ */
+ if(is_post_check)
+ int_O_DBG_post_bitfield |= temp_DBS;
+ else
+ int_O_DBG_pre_bitfield |= temp_DBS;
+}
+
+// -------------------------------
+// DBG - prior to calc. of dive //
+// -------------------------------
+void check_pre_dbg(void)
+{
+ check_dbg(0);
+}
+
+// -------------------------------
+// DBG - after decocalc of dive //
+// -------------------------------
+void check_post_dbg(void)
+{
+ check_dbg(1);
+}
+
+
+
+// -------------------------
+// calc_next_decodepth_GF //
+// -------------------------
+// new in v.102
+void calc_nextdecodepth_GF(void)
+{
+// INPUT, changing during dive:
+// temp_pres_gtissue_limit_GF_low
+// temp_pres_gtissue_limit_GF_low_below_surface
+// temp_pres_gtissue
+// temp_pres_gtissue_diff
+// lock_GF_depth_list
+
+// INPUT, fixed during dive:
+// pres_surface
+// GF_delta
+// GF_high
+// GF_low
+// temp_depth_last_deco
+// float_deco_distance
+
+// OUTPUT
+// GF_step
+// temp_deco
+// temp_depth_limt
+// lock_GF_depth_list
+
+// USES
+// temp1
+// temp2
+// int_temp
+
+ char_I_table_deco_done[0] = 0; // safety if changed somewhere else. Needed for exit
+ if (char_I_deco_model == 1)
+ {
+ if (lock_GF_depth_list == 0)
+ {
+ temp2 = temp_pres_gtissue_limit_GF_low_below_surface / 0.29985; // = ... / 99.95 / 0.003;
+ int_temp = (int) (temp2 + 0.99);
+ if (int_temp > 31)
+ int_temp = 31; // deepest deco at 93 meter (31 deco stops)
+ if (int_temp < 0)
+ int_temp = 0;
+ temp_depth_GF_low_number = int_temp;
+ temp_depth_GF_low_meter = 3 * temp_depth_GF_low_number;
+ temp2 = (float)temp_depth_GF_low_meter * 0.09995;
+ temp_pres_deco_GF_low = temp2 + float_deco_distance + pres_surface;
+ if (temp_depth_GF_low_number == 0)
+ GF_step = 0;
+ else
+ GF_step = GF_delta / (float)temp_depth_GF_low_number;
+ if (GF_step < 0)
+ GF_step = 0;
+ if (GF_step > GF_delta)
+ GF_step = GF_delta;
+ int_O_GF_step = (int)(GF_step * 10000);
+ int_O_limit_GF_low = (int)(temp_pres_deco_GF_low * 1000);
+ int_O_gtissue_press_at_GF_low = (int)(temp_pres_gtissue * 1000);
+ char_O_GF_low_pointer = temp_depth_GF_low_number;
+ lock_GF_depth_list = 1;
+ internal_deco_pointer = 0;
+ }
+ if (internal_deco_pointer == 0) // new run
+ {
+ internal_deco_pointer = temp_depth_GF_low_number;
+ GF_temp = GF_high - ((float)internal_deco_pointer * GF_step);
+ int_temp = char_I_table_deco_done[internal_deco_pointer];
+ output[8] = int_temp;
+ output[9] = 33;
+ }
+ else
+ {
+ int_temp = 1;
+ }
+ while (int_temp == 1)
+ {
+ int_temp = internal_deco_pointer - 1;
+ if (int_temp == 1) // new in v104
+ {
+ temp2 = (float)(temp_depth_last_deco * int_temp) * 0.09995;
+ GF_step2 = GF_step/3.0 * ((float)(6 - temp_depth_last_deco));
+ }
+ else
+ if (int_temp == 0)
+ {
+ temp2 = 0.0;
+ GF_step2 = GF_high - GF_temp;
+ }
+ else
+ {
+ temp2 = (float)(3 *int_temp) * 0.09995;
+ GF_step2 = GF_step;
+ }
+ temp2 = temp2 + pres_surface; // next deco stop to be tested
+ temp1 = ((GF_temp + GF_step2)* temp_pres_gtissue_diff) + temp_pres_gtissue; // upper limit (lowest pressure allowed) // changes GF_step2 in v104
+ if (temp1 > temp2) // check if ascent to next deco stop is ok
+ {
+ int_temp = 0; // no
+ }
+ else
+ {
+ internal_deco_pointer = int_temp;
+ GF_temp = GF_temp + GF_step2; // changed in v104
+ int_temp = char_I_table_deco_done[internal_deco_pointer]; // yes and check for ascent to even next stop if deco_done is set
+ }
+ } // while
+ if (internal_deco_pointer > 0)
+ {
+ temp2 = (float)(0.29985 * internal_deco_pointer);
+ temp_deco = temp2 + float_deco_distance + pres_surface;
+ if (internal_deco_pointer == 1) // new in v104
+ temp_depth_limit = temp_depth_last_deco;
+ else
+ temp_depth_limit = 3 * internal_deco_pointer;
+ if (output[9] == 33)
+ {
+ output[9] = internal_deco_pointer;
+ output[10] = char_I_table_deco_done[internal_deco_pointer];
+ output[12] = output[12] + 1;
+ if (output[12] == 100)
+ output[12] = 0;
+ }
+ }
+ else // if (char_I_deco_model == 1)
+ {
+ temp_deco = pres_surface;
+ temp_depth_limit = 0;
+ }
+ }
+ else
+ {
+ // calc_nextdecodepth - original
+ // optimized in v.101
+ // depth_last_deco included in v.101
+
+ temp1 = temp_pres_gtissue_limit - pres_surface;
+ if (temp1 >= 0)
+ {
+ temp1 = temp1 / 0.29985; // = temp1 / 99.95 / 0.003;
+ temp_depth_limit = (int) (temp1 + 0.99);
+ temp_depth_limit = 3 * temp_depth_limit; // depth for deco [m]
+ if (temp_depth_limit == 0)
+ temp_deco = pres_surface;
+ else
+ {
+ if (temp_depth_limit < temp_depth_last_deco)
+ temp_depth_limit = temp_depth_last_deco;
+ temp1 = (float)temp_depth_limit * 0.09995;
+ temp_deco = temp1 + float_deco_distance + pres_surface; // depth for deco [bar]
+ } // if (temp_depth_limit == 0)
+ } // if (temp1 >= 0)
+ else
+ {
+ temp_deco = pres_surface;
+ temp_depth_limit = 0;
+ } // if (temp1 >= 0)
+ } // calc_nextdecodepth original
+} // calc_nextdecodepth_GF
+
+
+#if 0
+void build_debug_output(void)
+{
+output[0] = 0; // not used in asm PLED output
+output[1] = (int) (GF_low * 100);
+output[2] = (int) (GF_high * 100);
+output[3] = (int) (GF_step * 100);
+output[4] = (int) temp_depth_GF_low_number;
+output[5] = (int) temp_depth_GF_low_meter;
+//output[6]
+output[7] = (int) internal_deco_pointer;
+//output[8] = char_I_table_deco_done[temp_depth_GF_low_number]
+//output[9] = internal_deco_pointer @ new run
+//output[10] = char_I_table_deco_done[internal_deco_pointer] @ new run
+output [11] = (int) (temp_pres_deco_GF_low * 10);
+} // build_debug_output
+#endif
+
+// ---------------------
+// copy_deco_table_GF //
+// ---------------------
+// new in v.102
+void copy_deco_table_GF(void)
+{
+ if (char_I_deco_model == 1)
+ {
+ int_temp = 32;
+ for (ci=0;ci // new table for deco_main_v.101 (var_a modified)
+
+#pragma romdata tables2 = 0x10600
+rom const rom unsigned int md_pi[] =
+{
+ 0x292E, 0x43C9, 0xA2D8, 0x7C01, 0x3D36, 0x54A1, 0xECF0, 0x0613
+ , 0x62A7, 0x05F3, 0xC0C7, 0x738C, 0x9893, 0x2BD9, 0xBC4C, 0x82CA
+ , 0x1E9B, 0x573C, 0xFDD4, 0xE016, 0x6742, 0x6F18, 0x8A17, 0xE512
+ , 0xBE4E, 0xC4D6, 0xDA9E, 0xDE49, 0xA0FB, 0xF58E, 0xBB2F, 0xEE7A
+ , 0xA968, 0x7991, 0x15B2, 0x073F, 0x94C2, 0x1089, 0x0B22, 0x5F21
+ , 0x807F, 0x5D9A, 0x5A90, 0x3227, 0x353E, 0xCCE7, 0xBFF7, 0x9703
+ , 0xFF19, 0x30B3, 0x48A5, 0xB5D1, 0xD75E, 0x922A, 0xAC56, 0xAAC6
+ , 0x4FB8, 0x38D2, 0x96A4, 0x7DB6, 0x76FC, 0x6BE2, 0x9C74, 0x04F1
+ , 0x459D, 0x7059, 0x6471, 0x8720, 0x865B, 0xCF65, 0xE62D, 0xA802
+ , 0x1B60, 0x25AD, 0xAEB0, 0xB9F6, 0x1C46, 0x6169, 0x3440, 0x7E0F
+ , 0x5547, 0xA323, 0xDD51, 0xAF3A, 0xC35C, 0xF9CE, 0xBAC5, 0xEA26
+ , 0x2C53, 0x0D6E, 0x8528, 0x8409, 0xD3DF, 0xCDF4, 0x4181, 0x4D52
+ , 0x6ADC, 0x37C8, 0x6CC1, 0xABFA, 0x24E1, 0x7B08, 0x0CBD, 0xB14A
+ , 0x7888, 0x958B, 0xE363, 0xE86D, 0xE9CB, 0xD5FE, 0x3B00, 0x1D39
+ , 0xF2EF, 0xB70E, 0x6658, 0xD0E4, 0xA677, 0x72F8, 0xEB75, 0x4B0A
+ , 0x3144, 0x50B4, 0x8FED, 0x1F1A, 0xDB99, 0x8D33, 0x9F11, 0x8314
+};
+
+// *********************
+// *********************
+// ** THE SUBROUTINES **
+// *********************
+// *********************
+
+#pragma code subroutines = 0x10700 // can be adapted to fit the romdata tables ahead
+
+
+// ---------------
+// CLEAR tissue //
+// ---------------
+// optimized in v.101 (var_a)
+
+void clear_tissue(void) // preload tissues with standard pressure for the given ambient pressure
+{
+
+ flag_in_divemode = 0;
+ int_O_DBS_bitfield = 0;
+ int_O_DBS2_bitfield = 0;
+ int_O_DBG_pre_bitfield = 0;
+ int_O_DBG_post_bitfield = 0;
+ char_O_NDL_at_20mtr = 255;
+
+_asm
+lfsr 1, 0x300 // C math routines shall use this variable bank
+movlw 0x01
+movwf TBLPTRU,0
+_endasm
+
+// N2_ratio = (float)char_I_N2_ratio; // the 0.0002 of 0.7902 are missing with standard air
+ N2_ratio = 0.7902; // N2_ratio / 100.0;
+ pres_respiration = (float)int_I_pres_respiration / 1000.0;
+for (ci=0;ci<16;ci++) // cycle through the 16 b"uhlmann tissues
+{
+ pres_tissue[ci] = N2_ratio * (pres_respiration - 0.0627) ;
+_asm
+movlw 0x02
+movwf TBLPTRH,0
+movlb 4 // fuer ci
+movf ci,0,1
+addwf ci,0,1
+addwf ci,0,1
+addwf ci,0,1
+addlw 0x80
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var_a+1
+TBLRDPOSTINC
+movff TABLAT,var_a
+TBLRDPOSTINC
+movff TABLAT,var_a+3
+TBLRD
+movff TABLAT,var_a+2
+addlw 0x80
+movwf TBLPTRL,0
+incf TBLPTRH,1,0
+TBLRDPOSTINC
+movff TABLAT,var_b+1
+TBLRDPOSTINC
+movff TABLAT,var_b
+TBLRDPOSTINC
+movff TABLAT,var_b+3
+TBLRD
+movff TABLAT,var_b+2
+_endasm
+
+pres_tissue_limit[ci] = (pres_tissue[ci] - var_a) * var_b ;
+// now update the guiding tissue
+if (pres_tissue_limit[ci] < 0)
+pres_tissue_limit[ci] = 0;
+} // for 0 to 16
+
+for (ci=16;ci<32;ci++) // cycle through the 16 b"uhlmann tissues for Helium
+{
+ pres_tissue[ci] = 0.0;
+} // for
+
+ clear_decoarray();
+ char_O_deco_status = 0;
+ char_O_nullzeit = 0;
+ char_O_ascenttime = 0;
+ char_O_gradient_factor = 0;
+ char_O_relative_gradient_GF = 0;
+} // clear_tissue(void)
+
+
+// --------------------
+// calc_without_deco //
+// fixed N2_ratio ! //
+// --------------------
+// optimized in v.101 (float_..saturation_multiplier)
+
+void calc_without_deco(void)
+{
+_asm
+ lfsr 1, 0x300
+_endasm
+ N2_ratio = 0.7902; // FIXED RATIO !! sum as stated in b"uhlmann
+ pres_respiration = (float)int_I_pres_respiration / 1000.0; // assembler code uses different digit system
+ pres_surface = (float)int_I_pres_surface / 1000.0;
+ temp_atem = N2_ratio * (pres_respiration - 0.0627); // 0.0627 is the extra pressure in the body
+ temp2_atem = 0.0;
+ temp_surface = pres_surface; // the b"uhlmann formula using temp_surface does apply to the pressure without any inert ratio
+ float_desaturation_multiplier = char_I_desaturation_multiplier / 100.0;
+ float_saturation_multiplier = char_I_saturation_multiplier / 100.0;
+
+ calc_tissue(); // update the pressure in the 16 tissues in accordance with the new ambient pressure
+
+ clear_decoarray();
+ char_O_deco_status = 0;
+ char_O_nullzeit = 0;
+ char_O_ascenttime = 0;
+ calc_gradient_factor();
+
+} // calc_without_deco
+
+
+// --------------------
+// calc_hauptroutine //
+// --------------------
+// this is the major code in dive mode
+// calculates:
+// the tissues,
+// the bottom time
+// and simulates the ascend with all deco stops
+
+void calc_hauptroutine(void)
+{
+ calc_hauptroutine_data_input();
+
+ if(!flag_in_divemode)
+ {
+ flag_in_divemode = 1;
+ create_dbs_set_dbg_and_ndl20mtr();
+ }
+ else
+ check_pre_dbg();
+
+ calc_hauptroutine_update_tissues();
+ calc_gradient_factor();
+
+
+ switch (char_O_deco_status) // toggle between calculation for nullzeit (bottom time), deco stops and more deco stops (continue)
+ {
+ case 0:
+ update_startvalues();
+ calc_nullzeit();
+ check_ndl();
+ char_O_deco_status = 255; // calc deco next time
+ break;
+ case 1:
+ if (char_O_deco_status == 3)
+ break;
+ char_O_deco_status = 0;
+// char_O_lock_depth_list = 255;
+ calc_hauptroutine_calc_deco();
+// build_debug_output();
+ break;
+ case 3: // new dive
+ clear_decoarray();
+ clear_internal_deco_table_GF();
+ copy_deco_table_GF();
+ internal_deco_pointer = 0;
+ lock_GF_depth_list = 0;
+ update_startvalues();
+ calc_nextdecodepth_GF();
+ char_O_deco_status = 0;
+ break;
+ default:
+ update_startvalues();
+ clear_decoarray();
+ clear_internal_deco_table_GF();
+ output[6] = 1;
+ calc_hauptroutine_calc_ascend_to_deco();
+ if (char_O_deco_status > 15) // can't go up to first deco, too deep to calculate in the given time slot
+ {
+ char_O_deco_status = 2;
+// char_O_lock_depth_list = 255;
+ }
+ else
+ {
+// char_O_lock_depth_list = lock_GF_depth_list;
+ calc_hauptroutine_calc_deco();
+ }
+// build_debug_output();
+ break;
+ }
+ calc_ascenttime();
+ check_post_dbg();
+}
+
+void calc_hauptroutine_data_input(void)
+{
+ pres_respiration = (float)int_I_pres_respiration / 1000.0;
+ pres_surface = (float)int_I_pres_surface / 1000.0;
+
+ N2_ratio = (float)char_I_N2_ratio / 100.0;; // the 0.0002 of 0.7902 are missing with standard air
+ He_ratio = (float)char_I_He_ratio / 100.0;;
+ deco_N2_ratio = (float)char_I_deco_N2_ratio / 100.0;
+ deco_He_ratio = (float)char_I_deco_He_ratio / 100.0;
+ float_deco_distance = (float)char_I_deco_distance / 100.0;
+ if(char_I_deco_gas_change)
+ {
+ deco_gas_change = (float)char_I_deco_gas_change / 9.995 + pres_surface;
+ deco_gas_change = deco_gas_change + float_deco_distance;
+ }
+ else
+ deco_gas_change = 0;
+ const_ppO2 = (float)char_I_const_ppO2 / 100.0;
+ deco_ppO2_change = (float)char_I_deco_ppO2_change / 99.95 + pres_surface;
+ deco_ppO2_change = deco_ppO2_change + float_deco_distance;
+ deco_ppO2 = (float)char_I_deco_ppO2 / 100.0;
+ float_desaturation_multiplier = char_I_desaturation_multiplier / 100.0;
+ float_saturation_multiplier = char_I_saturation_multiplier / 100.0;
+ GF_low = (float)char_I_GF_Low_percentage / 100.0;
+ GF_high = (float)char_I_GF_High_percentage / 100.0;
+ GF_delta = GF_high - GF_low;
+
+ temp2 = (pres_respiration - pres_surface) / 0.29985;
+ int_temp = (int)(temp2);
+ if (int_temp < 0)
+ int_temp = 0;
+ if (int_temp > 255)
+ int_temp = 255;
+ char_O_actual_pointer = int_temp;
+
+ temp_depth_last_deco = (int)char_I_depth_last_deco;
+}
+
+void calc_hauptroutine_update_tissues(void)
+{
+ int_O_calc_tissue_call_counter = int_O_calc_tissue_call_counter + 1;
+ if (char_I_const_ppO2 == 0) // new in v.101
+ pres_diluent = pres_respiration; // new in v.101
+ else // new in v.101
+ pres_diluent = ((pres_respiration - const_ppO2)/(N2_ratio + He_ratio)); // new in v.101
+ if (pres_diluent > pres_respiration) // new in v.101
+ pres_diluent = pres_respiration; // new in v.101
+ if (pres_diluent > 0.0627) // new in v.101
+ {
+ temp_atem = N2_ratio * (pres_diluent - 0.0627); // changed in v.101
+ temp2_atem = He_ratio * (pres_diluent - 0.0627); // changed in v.101
+ char_O_diluent = (char)(pres_diluent/pres_respiration*100.0);
+ }
+ else // new in v.101
+ {
+ temp_atem = 0.0; // new in v.101
+ temp2_atem = 0.0; // new in v.101
+ char_O_diluent = 0;
+ }
+ temp_surface = pres_surface;
+ calc_tissue();
+ int_O_gtissue_limit = (int)(pres_tissue_limit[char_O_gtissue_no] * 1000);
+ int_O_gtissue_press = (int)((pres_tissue[char_O_gtissue_no] + pres_tissue[char_O_gtissue_no+16]) * 1000);
+ if (char_I_deco_model == 1)
+ {
+ temp1 = temp1 * GF_high;
+ }
+ else
+ {
+ temp1 = temp_surface;
+ }
+ if (pres_gtissue_limit > temp1 && char_O_deco_status == 0) // if guiding tissue can not be exposed to surface pressure immediately
+ {
+ char_O_nullzeit = 0; // deco necessary
+ char_O_deco_status = 255; // calculate deco skip nullzeit calculation
+ }
+} // calc_hauptroutine_update_tissues
+void calc_hauptroutine_calc_deco(void)
+{
+ do
+ {
+ int_temp_decostatus = 0;
+ calc_nextdecodepth_GF();
+ if (temp_depth_limit > 0)
+ {
+ if (char_I_const_ppO2 == 0) // new in v.101
+ {
+ deco_diluent = temp_deco; // new in v.101
+ if (temp_deco > deco_gas_change)
+ {
+ calc_N2_ratio = N2_ratio;
+ calc_He_ratio = He_ratio;
+ }
+ else
+ {
+ calc_N2_ratio = deco_N2_ratio;
+ calc_He_ratio = deco_He_ratio;
+ }
+ }
+ else // new in v.101
+ {
+ calc_N2_ratio = N2_ratio;
+ calc_He_ratio = He_ratio;
+ if (temp_deco > deco_ppO2_change)
+ {
+ deco_diluent = ((temp_deco - const_ppO2)/(N2_ratio + He_ratio)); // new in v.101
+ }
+ else
+ {
+ deco_diluent = ((temp_deco - deco_ppO2)/(N2_ratio + He_ratio)); // new in v.101
+ }
+ }
+ if (deco_diluent > temp_deco) // new in v.101
+ deco_diluent = temp_deco; // new in v.101
+ if (deco_diluent > 0.0627) // new in v.101
+ {
+ temp_atem = calc_N2_ratio * (deco_diluent - 0.0627); // changed in v.101
+ temp2_atem = calc_He_ratio * (deco_diluent - 0.0627); // changed in v.101
+ }
+ else // new in v.101
+ {
+ temp_atem = 0.0; // new in v.101
+ temp2_atem = 0.0; // new in v.101
+ }
+ sim_tissue_1min();
+ update_internal_deco_table_GF();
+ temp_decotime = 1;
+ update_decoarray();
+ char_O_deco_status = char_O_deco_status + 1;
+ if (char_O_deco_status < 16)
+ int_temp_decostatus = 1;
+ }
+ else // if (temp_depth_limit > 0)
+ {
+ char_O_deco_status = 0;
+ }
+ } while (int_temp_decostatus == 1);
+ if (char_O_deco_status > 15)
+ {
+ char_O_deco_status = 1;
+ }
+ else
+ {
+ copy_deco_table_GF();
+ char_O_deco_status = 0;
+ }
+}
+
+void calc_hauptroutine_calc_ascend_to_deco(void)
+{
+ update_startvalues();
+ char_O_deco_status = 0;
+ temp_deco = pres_respiration;
+ lock_GF_depth_list = 1; // new in v.102
+ do // go up to first deco
+ {
+ int_temp_decostatus = 0;
+ temp_deco = temp_deco - 1.0;
+ if ( char_I_deco_model == 1) // new in v.102 , 4 = deep stops
+ temp_limit = temp_pres_gtissue_limit_GF_low;
+ else
+ temp_limit = temp_pres_gtissue_limit;
+ if ((temp_deco > temp_limit) && (temp_deco > pres_surface)) // changes in v.102
+ {
+ lock_GF_depth_list = 0; // new in v.102, distance to first stop > 10 mtr.
+ output[6] = 0;
+ if (char_I_const_ppO2 == 0) // new in v.101 // calculate at half of the ascent
+ {
+ deco_diluent = temp_deco + 0.5; // new in v.101
+ if (temp_deco + 0.5 > deco_gas_change)
+ {
+ calc_N2_ratio = N2_ratio;
+ calc_He_ratio = He_ratio;
+ }
+ else
+ {
+ calc_N2_ratio = deco_N2_ratio;
+ calc_He_ratio = deco_He_ratio;
+ }
+ }
+ else // new in v.101
+ {
+ calc_N2_ratio = N2_ratio;
+ calc_He_ratio = He_ratio;
+ if (temp_deco + 0.5 > deco_ppO2_change)
+ deco_diluent = ((temp_deco + 0.5 - const_ppO2)/(N2_ratio + He_ratio)); // new in v.101 // calculate at half of the ascent
+ else
+ deco_diluent = ((temp_deco + 0.5 - deco_ppO2)/(N2_ratio + He_ratio)); // new in v.101 // calculate at half of the ascent
+ if (deco_diluent > (temp_deco +0.5)) // new in v.101
+ deco_diluent = temp_deco + 0.5; // new in v.101 // calculate at half of the ascent
+ }
+ if (deco_diluent > 0.0627) // new in v.101
+ {
+ temp_atem = calc_N2_ratio * (deco_diluent - 0.0627); // changed in v.101
+ temp2_atem = calc_He_ratio * (deco_diluent - 0.0627); // changed in v.101
+ }
+ else // new in v.101
+ {
+ temp_atem = 0.0; // new in v.101
+ temp2_atem = 0.0; // new in v.101
+ }
+ sim_tissue_1min();
+ char_O_deco_status = char_O_deco_status + 1;
+ if (char_O_deco_status < 16) // 16 is the limit of calculations for one time slot
+ int_temp_decostatus = 1;
+ }
+ } while (int_temp_decostatus == 1);
+} // calc_hauptroutine_calc_ascend_to_deco
+
+// --------------
+// calc_tissue //
+// --------------
+// optimized in v.101
+
+void calc_tissue(void)
+{
+_asm
+lfsr 1, 0x300
+movlw 0x01
+movwf TBLPTRU,0
+_endasm
+
+ char_O_gtissue_no = 255;
+ pres_gtissue_limit = 0.0;
+
+for (ci=0;ci<16;ci++)
+{
+_asm
+movlw 0x02
+movwf TBLPTRH,0
+movlb 4 // fuer ci
+movf ci,0,1
+addwf ci,0,1
+addwf ci,0,1
+addwf ci,0,1
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var_e2secs+1 // the order is confussing
+TBLRDPOSTINC
+movff TABLAT,var_e2secs // low byte first, high afterwards
+TBLRDPOSTINC
+movff TABLAT,var_e2secs+3
+TBLRD
+movff TABLAT,var_e2secs+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var2_e2secs+1
+TBLRDPOSTINC
+movff TABLAT,var2_e2secs
+TBLRDPOSTINC
+movff TABLAT,var2_e2secs+3
+TBLRD
+movff TABLAT,var2_e2secs+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var_a+1
+TBLRDPOSTINC
+movff TABLAT,var_a
+TBLRDPOSTINC
+movff TABLAT,var_a+3
+TBLRD
+movff TABLAT,var_a+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var2_a+1
+TBLRDPOSTINC
+movff TABLAT,var2_a
+TBLRDPOSTINC
+movff TABLAT,var2_a+3
+TBLRD
+movff TABLAT,var2_a+2
+addlw 0x40
+movwf TBLPTRL,0
+incf TBLPTRH,1,0
+TBLRDPOSTINC
+movff TABLAT,var_b+1
+TBLRDPOSTINC
+movff TABLAT,var_b
+TBLRDPOSTINC
+movff TABLAT,var_b+3
+TBLRD
+movff TABLAT,var_b+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var2_b+1
+TBLRDPOSTINC
+movff TABLAT,var2_b
+TBLRDPOSTINC
+movff TABLAT,var2_b+3
+TBLRD
+movff TABLAT,var2_b+2
+_endasm
+ // the start values are the previous end values // write new values in temp
+
+ if( (var_e2secs < 0.0000363)
+ || (var_e2secs > 0.00577)
+ || (var2_e2secs < 0.0000961)
+ || (var2_e2secs > 0.150)
+ || (var_a < 0.231)
+ || (var_a > 1.27)
+ || (var_b < 0.504)
+ || (var_b > 0.966)
+ || (var2_a < 0.510)
+ || (var2_a > 1.75)
+ || (var2_b < 0.423)
+ || (var2_b > 0.927)
+ )
+ int_O_DBG_pre_bitfield |= DBG_ZH16ERR;
+
+// N2
+ temp_tissue = (temp_atem - pres_tissue[ci]) * var_e2secs;
+ temp_tissue_safety();
+ pres_tissue[ci] = pres_tissue[ci] + temp_tissue;
+
+// He
+ temp_tissue = (temp2_atem - pres_tissue[ci+16]) * var2_e2secs;
+ temp_tissue_safety();
+ pres_tissue[ci+16] = pres_tissue[ci+16] + temp_tissue;
+
+ temp_tissue = pres_tissue[ci] + pres_tissue[ci+16];
+
+ var_a = (var_a * pres_tissue[ci] + var2_a * pres_tissue[ci+16]) / temp_tissue;
+ var_b = (var_b * pres_tissue[ci] + var2_b * pres_tissue[ci+16]) / temp_tissue;
+ pres_tissue_limit[ci] = (temp_tissue - var_a) * var_b;
+ if (pres_tissue_limit[ci] < 0)
+ pres_tissue_limit[ci] = 0;
+ if (pres_tissue_limit[ci] > pres_gtissue_limit)
+ {
+ pres_gtissue_limit = pres_tissue_limit[ci];
+ char_O_gtissue_no = ci;
+ }//if
+} // for
+}//calc_tissue(void)
+
+// ----------------
+// calc_nullzeit //
+// ----------------
+// calculates the remaining bottom time
+
+// unchanged in v.101
+
+void calc_nullzeit(void)
+{
+ char_O_nullzeit = 0;
+ int_temp = 1;
+ do
+ {
+ backup_sim_pres_tissue();
+ sim_tissue_10min();
+ char_O_nullzeit = char_O_nullzeit + 10;
+ int_temp = int_temp + 1;
+ if (char_I_deco_model == 1)
+ temp1 = GF_high * temp_pres_gtissue_diff + temp_pres_gtissue;
+ else
+ temp1 = temp_pres_gtissue_limit;
+ if (temp1 > temp_surface) // changed in v.102 , if guiding tissue can not be exposed to surface pressure immediately
+ int_temp = 255;
+ } while (int_temp < 17);
+ if (int_temp == 255)
+ {
+ restore_sim_pres_tissue();
+ char_O_nullzeit = char_O_nullzeit - 10;
+ } //if int_temp == 255]
+ int_temp = 1;
+ if (char_O_nullzeit < 60)
+ {
+ do
+ {
+ sim_tissue_1min();
+ char_O_nullzeit = char_O_nullzeit + 1;
+ int_temp = int_temp + 1; // new in v.102a
+ if (char_I_deco_model == 1)
+ temp1 = GF_high * temp_pres_gtissue_diff + temp_pres_gtissue;
+ else
+ temp1 = temp_pres_gtissue_limit;
+ if (temp1 > temp_surface) // changed in v.102 , if guiding tissue can not be exposed to surface pressure immediately
+ int_temp = 255;
+ } while (int_temp < 10);
+ if (int_temp == 255)
+ char_O_nullzeit = char_O_nullzeit - 1;
+ } // if char_O_nullzeit < 60
+} //calc_nullzeit
+
+// -------------------------
+// backup_sim_pres_tissue //
+// -------------------------
+void backup_sim_pres_tissue(void)
+{
+ for (x = 0;x<16;x++)
+ {
+ sim_pres_tissue_backup[x] = sim_pres_tissue[x];
+ sim_pres_tissue_backup[x+16] = sim_pres_tissue[x+16];
+ }
+} // backup_sim
+
+// --------------------------
+// restore_sim_pres_tissue //
+// --------------------------
+void restore_sim_pres_tissue(void)
+{
+ for (x = 0;x<16;x++)
+ {
+ sim_pres_tissue[x] = sim_pres_tissue_backup[x];
+ sim_pres_tissue[x+16] = sim_pres_tissue_backup[x+16];
+ }
+} // restore_sim
+
+// ------------------
+// calc_ascenttime //
+// ------------------
+
+void calc_ascenttime(void)
+{
+if (pres_respiration > pres_surface)
+ {
+ switch (char_O_deco_status)
+ {
+ case 2:
+ char_O_ascenttime = 255;
+ break;
+ case 1:
+ break;
+ default:
+ temp1 = pres_respiration - pres_surface + 0.6; // + 0.6 hence 1 minute ascent time from a depth of 4 meter on
+ if (temp1 < 0)
+ temp1 = 0;
+ if (temp1 > 255)
+ temp1 = 255;
+ char_O_ascenttime = (char)temp1;
+
+ for(ci=0;ci<7;ci++)
+ {
+ x = char_O_ascenttime + char_O_array_decotime[ci];
+ if (x < char_O_ascenttime)
+ char_O_ascenttime = 255;
+ else
+ char_O_ascenttime = x;
+ }
+ }
+ }
+else
+ char_O_ascenttime = 0;
+} // calc_ascenttime()
+
+
+// ---------------------
+// update_startvalues //
+// ---------------------
+// updated in v.102
+
+void update_startvalues(void)
+{
+ temp_pres_gtissue_limit = pres_gtissue_limit;
+ temp_pres_gtissue = pres_tissue[char_O_gtissue_no] + pres_tissue[char_O_gtissue_no+16];
+ temp_pres_gtissue_diff = temp_pres_gtissue_limit - temp_pres_gtissue; // negative number
+ temp_pres_gtissue_limit_GF_low = GF_low * temp_pres_gtissue_diff + temp_pres_gtissue;
+ temp_pres_gtissue_limit_GF_low_below_surface = temp_pres_gtissue_limit_GF_low - pres_surface;
+ if (temp_pres_gtissue_limit_GF_low_below_surface < 0)
+ temp_pres_gtissue_limit_GF_low_below_surface = 0;
+
+ temp_gtissue_no = char_O_gtissue_no;
+ for (x = 0;x<16;x++)
+ {
+ sim_pres_tissue[x] = pres_tissue[x];
+ sim_pres_tissue[x+16] = pres_tissue[x+16];
+ sim_pres_tissue_limit[x] = pres_tissue_limit[x];
+ }
+} // update_startvalues
+
+
+// ------------------
+// sim_tissue_1min //
+// ------------------
+// optimized in v.101
+
+void sim_tissue_1min(void)
+{
+temp_pres_gtissue_limit = 0.0;
+temp_gtissue_no = 255;
+
+_asm
+lfsr 1, 0x300
+movlw 0x01
+movwf TBLPTRU,0
+_endasm
+
+
+for (ci=0;ci<16;ci++)
+{
+_asm
+movlw 0x02
+movwf TBLPTRH,0
+movlb 4 // fuer ci
+movf ci,0,1
+addwf ci,0,1
+addwf ci,0,1
+addwf ci,0,1
+addlw 0x80
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var_a+1
+TBLRDPOSTINC
+movff TABLAT,var_a
+TBLRDPOSTINC
+movff TABLAT,var_a+3
+TBLRD
+movff TABLAT,var_a+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var2_a+1
+TBLRDPOSTINC
+movff TABLAT,var2_a
+TBLRDPOSTINC
+movff TABLAT,var2_a+3
+TBLRD
+movff TABLAT,var2_a+2
+addlw 0x40
+movwf TBLPTRL,0
+incf TBLPTRH,1,0
+TBLRDPOSTINC
+movff TABLAT,var_b+1
+TBLRDPOSTINC
+movff TABLAT,var_b
+TBLRDPOSTINC
+movff TABLAT,var_b+3
+TBLRD
+movff TABLAT,var_b+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var2_b+1
+TBLRDPOSTINC
+movff TABLAT,var2_b
+TBLRDPOSTINC
+movff TABLAT,var2_b+3
+TBLRD
+movff TABLAT,var2_b+2
+addlw 0xC0
+movwf TBLPTRL,0
+incf TBLPTRH,1,0
+TBLRDPOSTINC
+movff TABLAT,var_e1min+1
+TBLRDPOSTINC
+movff TABLAT,var_e1min
+TBLRDPOSTINC
+movff TABLAT,var_e1min+3
+TBLRD
+movff TABLAT,var_e1min+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var2_e1min+1
+TBLRDPOSTINC
+movff TABLAT,var2_e1min
+TBLRDPOSTINC
+movff TABLAT,var2_e1min+3
+TBLRD
+movff TABLAT,var2_e1min+2
+_endasm
+// N2
+ temp_tissue = (temp_atem - sim_pres_tissue[ci]) * var_e1min;
+ temp_tissue_safety();
+ sim_pres_tissue[ci] = sim_pres_tissue[ci] + temp_tissue;
+// He
+ temp_tissue = (temp2_atem - sim_pres_tissue[ci+16]) * var2_e1min;
+ temp_tissue_safety();
+ sim_pres_tissue[ci+16] = sim_pres_tissue[ci+16] + temp_tissue;
+// pressure limit
+ temp_tissue = sim_pres_tissue[ci] + sim_pres_tissue[ci+16];
+ var_a = (var_a * sim_pres_tissue[ci] + var2_a * sim_pres_tissue[ci+16]) / temp_tissue;
+ var_b = (var_b * sim_pres_tissue[ci] + var2_b * sim_pres_tissue[ci+16]) / temp_tissue;
+ sim_pres_tissue_limit[ci] = (temp_tissue - var_a) * var_b;
+
+ if (sim_pres_tissue_limit[ci] < 0)
+ sim_pres_tissue_limit[ci] = 0;
+ if (sim_pres_tissue_limit[ci] > temp_pres_gtissue_limit)
+ {
+ temp_pres_gtissue = temp_tissue;
+ temp_pres_gtissue_limit = sim_pres_tissue_limit[ci];
+ temp_gtissue_no = ci;
+ }
+} // for
+ temp_pres_gtissue_diff = temp_pres_gtissue_limit - temp_pres_gtissue;
+ temp_pres_gtissue_limit_GF_low = GF_low * temp_pres_gtissue_diff + temp_pres_gtissue;
+ temp_pres_gtissue_limit_GF_low_below_surface = temp_pres_gtissue_limit_GF_low - pres_surface;
+ if (temp_pres_gtissue_limit_GF_low_below_surface < 0)
+ temp_pres_gtissue_limit_GF_low_below_surface = 0;
+} //sim_tissue_1min()
+
+//--------------------
+// sim_tissue_10min //
+//--------------------
+
+// Attention!! uses var_e1min und var2_e1min to load 10min data !!!
+// is identical to sim_tissue_1min routine except for the different load of those variables
+
+// optimized in v.101
+
+void sim_tissue_10min(void)
+{
+temp_pres_gtissue_limit = 0.0;
+temp_gtissue_no = 255;
+
+_asm
+lfsr 1, 0x300
+movlw 0x01
+movwf TBLPTRU,0
+_endasm
+
+for (ci=0;ci<16;ci++)
+{
+_asm
+movlw 0x02
+movwf TBLPTRH,0
+movlb 4 // fuer ci
+movf ci,0,1
+addwf ci,0,1
+addwf ci,0,1
+addwf ci,0,1
+addlw 0x80
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var_a+1
+TBLRDPOSTINC
+movff TABLAT,var_a
+TBLRDPOSTINC
+movff TABLAT,var_a+3
+TBLRD
+movff TABLAT,var_a+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var2_a+1
+TBLRDPOSTINC
+movff TABLAT,var2_a
+TBLRDPOSTINC
+movff TABLAT,var2_a+3
+TBLRD
+movff TABLAT,var2_a+2
+addlw 0x40
+movwf TBLPTRL,0
+incf TBLPTRH,1,0
+TBLRDPOSTINC
+movff TABLAT,var_b+1
+TBLRDPOSTINC
+movff TABLAT,var_b
+TBLRDPOSTINC
+movff TABLAT,var_b+3
+TBLRD
+movff TABLAT,var_b+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var2_b+1
+TBLRDPOSTINC
+movff TABLAT,var2_b
+TBLRDPOSTINC
+movff TABLAT,var2_b+3
+TBLRD
+movff TABLAT,var2_b+2
+addlw 0xC0 // different to 1 min
+movwf TBLPTRL,0
+incf TBLPTRH,1,0
+incf TBLPTRH,1,0 // different to 1 min
+TBLRDPOSTINC
+movff TABLAT,var_e1min+1
+TBLRDPOSTINC
+movff TABLAT,var_e1min
+TBLRDPOSTINC
+movff TABLAT,var_e1min+3
+TBLRD
+movff TABLAT,var_e1min+2
+addlw 0x40
+movwf TBLPTRL,0
+//incf TBLPTRH,1,0 // different to 1 min
+TBLRDPOSTINC
+movff TABLAT,var2_e1min+1
+TBLRDPOSTINC
+movff TABLAT,var2_e1min
+TBLRDPOSTINC
+movff TABLAT,var2_e1min+3
+TBLRD
+movff TABLAT,var2_e1min+2
+_endasm
+// N2
+ temp_tissue = (temp_atem - sim_pres_tissue[ci]) * var_e1min;
+ temp_tissue_safety();
+ sim_pres_tissue[ci] = sim_pres_tissue[ci] + temp_tissue;
+// He
+ temp_tissue = (temp2_atem - sim_pres_tissue[ci+16]) * var2_e1min;
+ temp_tissue_safety();
+ sim_pres_tissue[ci+16] = sim_pres_tissue[ci+16] + temp_tissue;
+// pressure limit
+temp_tissue = sim_pres_tissue[ci] + sim_pres_tissue[ci+16];
+ var_a = (var_a * sim_pres_tissue[ci] + var2_a * sim_pres_tissue[ci+16]) / temp_tissue;
+ var_b = (var_b * sim_pres_tissue[ci] + var2_b * sim_pres_tissue[ci+16]) / temp_tissue;
+
+sim_pres_tissue_limit[ci] = (temp_tissue - var_a) * var_b;
+ if (sim_pres_tissue_limit[ci] < 0)
+ sim_pres_tissue_limit[ci] = 0;
+ if (sim_pres_tissue_limit[ci] > temp_pres_gtissue_limit)
+ {
+ temp_pres_gtissue = temp_tissue;
+ temp_pres_gtissue_limit = sim_pres_tissue_limit[ci];
+ temp_gtissue_no = ci;
+ }
+} // for
+ temp_pres_gtissue_diff = temp_pres_gtissue_limit - temp_pres_gtissue; // negative number
+ temp_pres_gtissue_limit_GF_low = GF_low * temp_pres_gtissue_diff + temp_pres_gtissue;
+ temp_pres_gtissue_limit_GF_low_below_surface = temp_pres_gtissue_limit_GF_low - pres_surface;
+ if (temp_pres_gtissue_limit_GF_low_below_surface < 0)
+ temp_pres_gtissue_limit_GF_low_below_surface = 0;
+} //sim_tissue_10min()
+
+
+// ------------------
+// clear_decoarray //
+// ------------------
+// unchanged in v.101
+
+void clear_decoarray(void)
+{
+char_O_array_decodepth[0] = 0;
+char_O_array_decodepth[1] = 0;
+char_O_array_decodepth[2] = 0;
+char_O_array_decodepth[3] = 0;
+char_O_array_decodepth[4] = 0;
+char_O_array_decodepth[5] = 0;
+char_O_array_decotime[0] = 0;
+char_O_array_decotime[1] = 0;
+char_O_array_decotime[2] = 0;
+char_O_array_decotime[3] = 0;
+char_O_array_decotime[4] = 0;
+char_O_array_decotime[5] = 0;
+char_O_array_decotime[6] = 0;
+} // clear_decoarray
+
+
+// -------------------
+// update_decoarray //
+// -------------------
+// unchanged in v.101
+
+void update_decoarray()
+{
+ x = 0;
+ do
+ {
+ if (char_O_array_decodepth[x] == temp_depth_limit)
+ {
+ int_temp = char_O_array_decotime[x] + temp_decotime;
+ if (int_temp < 0)
+ int_temp = 0;
+ if (int_temp > 240)
+ int_temp = 240;
+ char_O_array_decotime[x] = int_temp;
+ x = 10; // exit
+ } // if
+ else
+ {
+ if (char_O_array_decodepth[x] == 0)
+ {
+ if (temp_depth_limit > 255)
+ char_O_array_decodepth[x] = 255;
+ else
+ char_O_array_decodepth[x] = (char)temp_depth_limit;
+ int_temp = char_O_array_decotime[x] + temp_decotime;
+ if (int_temp > 240)
+ char_O_array_decotime[x] = 240;
+ else
+ char_O_array_decotime[x] = (char)int_temp;
+ x = 10; // exit
+ } // if
+ else
+ x++;
+ } // else
+ } while (x<6);
+ if (x == 6)
+ {
+ int_temp = char_O_array_decotime[6] + temp_decotime;
+ if (int_temp > 220)
+ char_O_array_decotime[6] = 220;
+ else
+ char_O_array_decotime[6] = (char)int_temp;
+ } // if x == 6
+} // update_decoarray
+
+
+// -----------------------
+// calc_gradient_factor //
+// -----------------------
+// optimized in v.101 (var_a)
+// new code in v.102
+
+void calc_gradient_factor(void)
+{
+ // tissue > respiration (entsaettigungsvorgang)
+ // gradient ist wieviel prozent an limit mit basis tissue
+ // dh. 0% = respiration == tissue
+ // dh. 100% = respiration == limit
+ temp_tissue = pres_tissue[char_O_gtissue_no] + pres_tissue[char_O_gtissue_no+16];
+ temp1 = temp_tissue - pres_respiration;
+ temp2 = temp_tissue - pres_tissue_limit[char_O_gtissue_no]; // changed in v.102
+ temp2 = temp1/temp2;
+ temp2 = temp2 * 100; // displayed in percent
+ if (temp2 < 0)
+ temp2 = 0;
+ if (temp2 > 255)
+ temp2 = 255;
+ if (temp1 < 0)
+ char_O_gradient_factor = 0;
+ else
+ char_O_gradient_factor = (char)temp2;
+
+ temp3 = temp2;
+
+ if (char_I_deco_model == 1) // calculate relative gradient factor
+ {
+ temp1 = (float)temp_depth_GF_low_meter * 0.09995;
+ temp2 = pres_respiration - pres_surface;
+ if (temp2 <= 0)
+ temp1 = GF_high;
+ else
+ if (temp2 >= temp1)
+ temp1 = GF_low;
+ else
+ temp1 = GF_low + (temp1 - temp2)/temp1*GF_delta;
+ if (temp_depth_GF_low_meter == 0)
+ temp1 = GF_high;
+ temp2 = temp3 / temp1; // temp3 is already in percent
+ if (temp2 < 0)
+ temp2 = 0;
+ if (temp2 > 255)
+ temp2 = 255;
+ char_O_relative_gradient_GF = (char)temp2;
+ } // calc relative gradient factor
+ else
+ {
+ char_O_relative_gradient_GF = char_O_gradient_factor;
+ }
+} // calc_gradient
+
+// ---------------------------
+// calc_gradient_array_only //
+// ---------------------------
+// optimized in v.101 (var_a)
+// new code in v.102
+
+void calc_gradient_array_only()
+{
+ pres_respiration = (float)int_I_pres_respiration / 1000.0; // assembler code uses different digit system
+for (ci=0;ci<16;ci++)
+{
+ temp_tissue = pres_tissue[ci] + pres_tissue[ci+16];
+ temp1 = temp_tissue - pres_respiration;
+ temp2 = temp_tissue - pres_tissue_limit[ci];
+ temp2 = temp1/temp2;
+ temp2 = temp2 * 200; // because of output in (Double-)percentage
+ if (temp2 < 0)
+ temp2 = 0;
+ if (temp2 > 255)
+ temp2 = 255;
+ if (temp1 < 0)
+ char_O_array_gradient_weighted[ci] = 0;
+ else
+ char_O_array_gradient_weighted[ci] = (char)temp2;
+} // for
+} // calc_gradient_array_only
+
+
+// -------------------------
+// calc_desaturation_time //
+// -------------------------
+// FIXED N2_ratio
+// unchanged in v.101
+
+void calc_desaturation_time(void)
+{
+_asm
+lfsr 1, 0x300
+movlw 0x01
+movwf TBLPTRU,0
+_endasm
+ N2_ratio = 0.7902; // FIXED sum as stated in b"uhlmann
+ pres_surface = (float)int_I_pres_surface / 1000.0;
+ temp_atem = N2_ratio * (pres_surface - 0.0627);
+ int_O_desaturation_time = 0;
+ float_desaturation_multiplier = char_I_desaturation_multiplier / 142.0; // new in v.101 (70,42%/100.=142)
+
+for (ci=0;ci<16;ci++)
+{
+_asm
+movlw 0x04
+movwf TBLPTRH,0
+movlb 4 // fuer ci
+movf ci,0,1
+addwf ci,0,1
+addwf ci,0,1
+addwf ci,0,1
+addlw 0x80
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var_halftimes+1
+TBLRDPOSTINC
+movff TABLAT,var_halftimes
+TBLRDPOSTINC
+movff TABLAT,var_halftimes+3
+TBLRD
+movff TABLAT,var_halftimes+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var2_halftimes+1
+TBLRDPOSTINC
+movff TABLAT,var2_halftimes
+TBLRDPOSTINC
+movff TABLAT,var2_halftimes+3
+TBLRD
+movff TABLAT,var2_halftimes+2
+_endasm
+
+// saturation_time (for flight) and N2_saturation in multiples of halftime
+// version v.100: 1.1 = 10 percent distance to totally clean (totally clean is not possible, would take infinite time )
+// new in version v.101: 1.07 = 7 percent distance to totally clean (totally clean is not possible, would take infinite time )
+// changes in v.101: 1.05 = 5 percent dist to totally clean is new desaturation point for display and noFly calculations
+// N2
+ temp1 = 1.05 * temp_atem;
+ temp1 = temp1 - pres_tissue[ci];
+ temp2 = temp_atem - pres_tissue[ci];
+ if (temp2 >= 0.0)
+ {
+ temp1 = 0;
+ temp2 = 0;
+ }
+ else
+ temp1 = temp1 / temp2;
+ if (temp1 > 0.0)
+ {
+ temp1 = log(1.0 - temp1);
+ temp1 = temp1 / -0.6931; // temp1 is the multiples of half times necessary.
+ // 0.6931 is ln(2), because the math function log() calculates with a base of e not 2 as requested.
+ // minus because log is negative
+ temp2 = var_halftimes * temp1 / float_desaturation_multiplier; // time necessary (in minutes ) for complete desaturation (see comment about 10 percent) , new in v.101: float_desaturation_multiplier
+ }
+ else
+ {
+ temp1 = 0;
+ temp2 = 0;
+ }
+
+// He
+ temp3 = 0.1 - pres_tissue[ci+16];
+if (temp3 >= 0.0)
+ {
+ temp3 = 0;
+ temp4 = 0;
+ }
+ else
+ temp3 = -1.0 * temp3 / pres_tissue[ci+16];
+ if (temp3 > 0.0)
+ {
+ temp3 = log(1.0 - temp3);
+ temp3 = temp3 / -0.6931; // temp1 is the multiples of half times necessary.
+ // 0.6931 is ln(2), because the math function log() calculates with a base of e not 2 as requested.
+ // minus because log is negative
+ temp4 = var2_halftimes * temp3 / float_desaturation_multiplier; // time necessary (in minutes ) for "complete" desaturation, new in v.101 float_desaturation_multiplier
+ }
+ else
+ {
+ temp3 = 0;
+ temp4 = 0;
+ }
+
+// saturation_time (for flight)
+ if (temp4 > temp2)
+ int_temp = (int)temp4;
+ else
+ int_temp = (int)temp2;
+ if(int_temp > int_O_desaturation_time)
+ int_O_desaturation_time = int_temp;
+
+// N2 saturation in multiples of halftime for display purposes
+ temp2 = temp1 * 20.0; // 0 = 1/8, 120 = 0, 249 = 8
+ temp2 = temp2 + 80.0; // set center
+ if (temp2 < 0.0)
+ temp2 = 0.0;
+ if (temp2 > 255.0)
+ temp2 = 255.0;
+ char_O_tissue_saturation[ci] = (char)temp2;
+// He saturation in multiples of halftime for display purposes
+ temp4 = temp3 * 20.0; // 0 = 1/8, 120 = 0, 249 = 8
+ temp4 = temp4 + 80.0; // set center
+ if (temp4 < 0.0)
+ temp4 = 0.0;
+ if (temp4 > 255.0)
+ temp4 = 255.0;
+ char_O_tissue_saturation[ci+16] = (char)temp4;
+} // for
+} // calc_desaturation_time
+
+
+// --------------------------
+// calc_wo_deco_step_1_min //
+// --------------------------
+// FIXED N2 Ratio
+// optimized in v.101 (...saturation_multiplier)
+// desaturation slowed down to 70,42%
+
+void calc_wo_deco_step_1_min(void)
+{
+ if(flag_in_divemode)
+ {
+ flag_in_divemode = 0;
+ set_dbg_end_of_dive();
+ }
+_asm
+ lfsr 1, 0x300
+_endasm
+ N2_ratio = 0.7902; // FIXED, sum lt. buehlmann
+ pres_respiration = (float)int_I_pres_respiration / 1000.0; // assembler code uses different digit system
+ pres_surface = (float)int_I_pres_surface / 1000.0;
+ temp_atem = N2_ratio * (pres_respiration - 0.0627); // 0.0627 is the extra pressure in the body
+ temp2_atem = 0.0;
+ temp_surface = pres_surface; // the b"uhlmann formula using temp_surface does not use the N2_ratio
+ float_desaturation_multiplier = char_I_desaturation_multiplier / 142.0; // new in v.101 (70,42%/100.=142)
+ float_saturation_multiplier = char_I_saturation_multiplier / 100.0;
+
+ calc_tissue_step_1_min(); // update the pressure in the 16 tissues in accordance with the new ambient pressure
+ clear_decoarray();
+ char_O_deco_status = 0;
+ char_O_nullzeit = 0;
+ char_O_ascenttime = 0;
+ calc_gradient_factor();
+
+} // calc_wo_deco_step_1_min(void)
+
+
+// -------------------------
+// calc_tissue_step_1_min //
+// -------------------------
+// optimized in v.101
+
+void calc_tissue_step_1_min(void)
+{
+_asm
+lfsr 1, 0x300
+movlw 0x01
+movwf TBLPTRU,0
+_endasm
+
+ char_O_gtissue_no = 255;
+ pres_gtissue_limit = 0.0;
+
+for (ci=0;ci<16;ci++)
+{
+_asm
+movlw 0x02
+movwf TBLPTRH,0
+movlb 4 // fuer ci
+movf ci,0,1
+addwf ci,0,1
+addwf ci,0,1
+addwf ci,0,1
+addlw 0x80
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var_a+1
+TBLRDPOSTINC
+movff TABLAT,var_a
+TBLRDPOSTINC
+movff TABLAT,var_a+3
+TBLRD
+movff TABLAT,var_a+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var2_a+1
+TBLRDPOSTINC
+movff TABLAT,var2_a
+TBLRDPOSTINC
+movff TABLAT,var2_a+3
+TBLRD
+movff TABLAT,var2_a+2
+addlw 0x40
+movwf TBLPTRL,0
+incf TBLPTRH,1,0
+TBLRDPOSTINC
+movff TABLAT,var_b+1
+TBLRDPOSTINC
+movff TABLAT,var_b
+TBLRDPOSTINC
+movff TABLAT,var_b+3
+TBLRD
+movff TABLAT,var_b+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var2_b+1
+TBLRDPOSTINC
+movff TABLAT,var2_b
+TBLRDPOSTINC
+movff TABLAT,var2_b+3
+TBLRD
+movff TABLAT,var2_b+2
+addlw 0xC0
+movwf TBLPTRL,0
+incf TBLPTRH,1,0
+TBLRDPOSTINC
+movff TABLAT,var_e1min+1
+TBLRDPOSTINC
+movff TABLAT,var_e1min
+TBLRDPOSTINC
+movff TABLAT,var_e1min+3
+TBLRD
+movff TABLAT,var_e1min+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var2_e1min+1
+TBLRDPOSTINC
+movff TABLAT,var2_e1min
+TBLRDPOSTINC
+movff TABLAT,var2_e1min+3
+TBLRD
+movff TABLAT,var2_e1min+2
+_endasm
+
+// N2 1 min
+ temp_tissue = (temp_atem - pres_tissue[ci]) * var_e1min;
+ temp_tissue_safety();
+ pres_tissue[ci] = pres_tissue[ci] + temp_tissue;
+
+// He 1 min
+ temp_tissue = (temp2_atem - pres_tissue[ci+16]) * var2_e1min;
+ temp_tissue_safety();
+ pres_tissue[ci+16] = pres_tissue[ci+16] + temp_tissue;
+
+ temp_tissue = pres_tissue[ci] + pres_tissue[ci+16];
+ var_a = (var_a * pres_tissue[ci] + var2_a * pres_tissue[ci+16]) / temp_tissue;
+ var_b = (var_b * pres_tissue[ci] + var2_b * pres_tissue[ci+16]) / temp_tissue;
+ pres_tissue_limit[ci] = (temp_tissue - var_a) * var_b;
+ if (pres_tissue_limit[ci] < 0)
+ pres_tissue_limit[ci] = 0;
+ if (pres_tissue_limit[ci] > pres_gtissue_limit)
+ {
+ pres_gtissue_limit = pres_tissue_limit[ci];
+ char_O_gtissue_no = ci;
+ }//if
+
+// gradient factor array for graphical display
+// display range is 0 to 250! in steps of 5 for 1 pixel
+// the display is divided in 6 blocks
+// -> double the gradient 100% = 200
+// tissue > respiration (entsaettigungsvorgang)
+// gradient ist wieviel prozent an limit von tissue aus
+// dh. 0% = respiration == tissue
+// dh. 100% = respiration == limit
+temp1 = temp_tissue - pres_respiration;
+temp2 = temp_tissue - pres_tissue_limit[ci]; // changed in v.102
+temp2 = temp1/temp2;
+temp2 = temp2 * 200; // because of output in (Double-)percentage
+if (temp2 < 0)
+ temp2 = 0;
+if (temp2 > 255)
+ temp2 = 255;
+if (temp1 < 0)
+ char_O_array_gradient_weighted[ci] = 0;
+else
+ char_O_array_gradient_weighted[ci] = (char)temp2;
+
+} // for
+} // calc wo deco 1min
+
+#if 0
+// --------
+// debug //
+// --------
+void debug(void)
+{
+for (ci=0;ci<32;ci++)
+{
+ int_O_tissue_for_debug[ci] = (unsigned int)(pres_tissue[ci] *1000);
+}
+} // void debug(void)
+#endif
+
+// ----------
+// md hash //
+// ----------
+void hash(void)
+{
+// init
+ for (md_i=0;md_i<16;md_i++)
+ {
+ md_state[md_i] = 0;
+ md_cksum[md_i] = 0;
+ } // for md_i 16
+
+_asm
+ movlw 0x01
+ movwf TBLPTRU,0
+ movlw 0x06
+ movwf TBLPTRH,0
+ movlw 0x00
+ movwf TBLPTRL,0
+_endasm
+ for (md_i=0;md_i<127;md_i++)
+ {
+_asm
+ TBLRDPOSTINC
+ movff TABLAT,md_temp
+_endasm
+ md_pi_subst[md_i] = md_temp;
+ } // for md_i 256
+_asm
+ TBLRDPOSTINC
+ movff TABLAT,md_temp
+_endasm
+ md_pi_subst[127] = md_temp;
+ for (md_i=0;md_i<127;md_i++)
+ {
+_asm
+ TBLRDPOSTINC
+ movff TABLAT,md_temp
+_endasm
+ md_pi_subst[md_i+128] = md_temp;
+ } // for md_i 256
+_asm
+ TBLRD
+ movff TABLAT,md_temp
+_endasm
+ md_pi_subst[255] = md_temp;
+
+_asm
+ movlw 0x00
+ movwf TBLPTRU,0
+ movlw 0x00
+ movwf TBLPTRH,0
+ movlw 0x00
+ movwf TBLPTRL,0
+_endasm
+// cycle buffers
+for (md_pointer=0x0000;md_pointer<0x17f3;md_pointer++)
+{
+ md_t = 0;
+ for (md_i=0;md_i<16;md_i++)
+ {
+ if(md_pointer == 9)
+ md_temp = md_cksum[md_i];
+ else
+ {
+_asm
+ TBLRDPOSTINC
+ movff TABLAT,md_temp
+_endasm
+ } // else
+ md_buffer[md_i] = md_temp;
+ md_state[md_i+16] = md_buffer[md_i];
+ md_state[md_i+32] = (unsigned char)(md_buffer[md_i] ^ md_state[md_i]);
+ } // for md_i 16
+
+ for (md_i=0;md_i<18;md_i++)
+ {
+ for (md_j=0;md_j<48;md_j++)
+ {
+ md_state[md_j] = (unsigned char)(md_state[md_j] ^ md_pi_subst[md_t]);
+ md_t = md_state[md_j];
+ } // for md_j 48
+ md_t = (unsigned char)(md_t+1);
+ } // for md_i 18
+ md_t = md_cksum[15];
+
+ for (md_i=0;md_i<16;md_i++)
+ {
+ md_cksum[md_i] = (unsigned char)(md_cksum[md_i] ^ md_pi_subst[(md_buffer[md_i] ^ md_t)]);
+ md_t = md_cksum[md_i];
+ } // for md_i 16
+} // for md_pointer
+} // void hash(void)
+
+// ---------------------
+// clear_CNS_fraction //
+// ---------------------
+// new in v.101
+
+void clear_CNS_fraction(void)
+{
+ CNS_fraction = 0.0;
+ char_O_CNS_fraction = 0;
+} // void clear_CNS_fraction(void)
+
+
+// --------------------
+// calc_CNS_fraction //
+// --------------------
+// new in v.101
+// optimized in v.102 : with new variables char_I_actual_ppO2 and actual_ppO2
+
+// Input: char_I_actual_ppO2
+// Output: char_O_CNS_fraction
+// Uses and Updates: CNS_fraction
+// Uses: acutal_ppO2
+
+void calc_CNS_fraction(void)
+{
+ actual_ppO2 = (float)char_I_actual_ppO2 / 100.0;
+
+ if (char_I_actual_ppO2 < 50)
+ CNS_fraction = CNS_fraction;// no changes
+ else if (char_I_actual_ppO2 < 60)
+ CNS_fraction = 1/(-54000.0 * actual_ppO2 + 54000.0) + CNS_fraction;
+ else if (char_I_actual_ppO2 < 70)
+ CNS_fraction = 1/(-45000.0 * actual_ppO2 + 48600.0) + CNS_fraction;
+ else if (char_I_actual_ppO2 < 80)
+ CNS_fraction = 1/(-36000.0 * actual_ppO2 + 42300.0) + CNS_fraction;
+ else if (char_I_actual_ppO2 < 90)
+ CNS_fraction = 1/(-27000.0 * actual_ppO2 + 35100.0) + CNS_fraction;
+ else if (char_I_actual_ppO2 < 110)
+ CNS_fraction = 1/(-18000.0 * actual_ppO2 + 27000.0) + CNS_fraction;
+ else if (char_I_actual_ppO2 < 150)
+ CNS_fraction = 1/(-9000.0 * actual_ppO2 + 17100.0) + CNS_fraction;
+ else if (char_I_actual_ppO2 < 160)
+ CNS_fraction = 1/(-22500.0 * actual_ppO2 + 37350.0) + CNS_fraction;
+ else if (char_I_actual_ppO2 < 165)
+ CNS_fraction = 0.000755 + CNS_fraction; // Arieli et all.(2002): Modeling pulmonary and CNS O2 toxicity... Formula (A1) based on value for 1.55 and c=20
+ else if (char_I_actual_ppO2 < 170)
+ CNS_fraction = 0.00102 + CNS_fraction; // example calculation: Sqrt((1.7/1.55)^20)*0.000404
+ else if (char_I_actual_ppO2 < 175)
+ CNS_fraction = 0.00136 + CNS_fraction;
+ else if (char_I_actual_ppO2 < 180)
+ CNS_fraction = 0.00180 + CNS_fraction;
+ else if (char_I_actual_ppO2 < 185)
+ CNS_fraction = 0.00237 + CNS_fraction;
+ else if (char_I_actual_ppO2 < 190)
+ CNS_fraction = 0.00310 + CNS_fraction;
+ else if (char_I_actual_ppO2 < 195)
+ CNS_fraction = 0.00401 + CNS_fraction;
+ else if (char_I_actual_ppO2 < 200)
+ CNS_fraction = 0.00517 + CNS_fraction;
+ else if (char_I_actual_ppO2 < 230)
+ CNS_fraction = 0.0209 + CNS_fraction;
+ else
+ CNS_fraction = 0.0482 + CNS_fraction; // value for 2.5
+
+ if (CNS_fraction > 2.5)
+ CNS_fraction = 2.5;
+ if (CNS_fraction < 0.0)
+ CNS_fraction = 0.0;
+ char_O_CNS_fraction = (char)((CNS_fraction + 0.005)* 100.0);
+} // void calc_CNS_fraction(void)
+
+// --------------------------
+// calc_CNS_decrease_15min //
+// --------------------------
+// new in v.101
+
+// calculates the half time of 90 minutes in 6 steps of 15 min
+
+// Output: char_O_CNS_fraction
+// Uses and Updates: CNS_fraction
+
+void calc_CNS_decrease_15min(void)
+{
+ CNS_fraction = 0.890899 * CNS_fraction;
+ char_O_CNS_fraction = (char)((CNS_fraction + 0.005)* 100.0);
+}// calc_CNS_decrease_15min(void)
+
+
+// ------------------
+// calc_percentage //
+// ------------------
+// new in v.101
+
+// calculates int_I_temp * char_I_temp / 100
+// output is int_I_temp
+
+void calc_percentage(void)
+{
+ temp1 = (float)int_I_temp;
+ temp2 = (float)char_I_temp / 100.0;
+ temp3 = temp1 * temp2;
+ int_I_temp = (int)temp3;
+}
+void push_tissues_to_vault(void)
+{
+ for (ci=0;ci<32;ci++)
+ pres_tissue_vault[ci] = pres_tissue[ci];
+}
+void pull_tissues_from_vault(void)
+{
+ for (ci=0;ci<32;ci++)
+ pres_tissue[ci] = pres_tissue_vault[ci];
+}
+
+void wp_write_command(void)
+{
+_asm
+ bcf oled_rs
+ nop
+ movff wp_command,PORTD
+ bcf oled_rw
+ nop
+ bsf oled_rw
+_endasm
+}
+
+void wp_write_data(void)
+{
+ wp_data_8bit_one = wp_data_16bit >> 8;
+ wp_data_8bit_two = wp_data_16bit;
+_asm
+ bsf oled_rs
+ nop
+ movff wp_data_8bit_one,PORTD
+ bcf oled_rw
+ nop
+ bsf oled_rw
+ nop
+ movff wp_data_8bit_two,PORTD
+ nop
+ bcf oled_rw
+ nop
+ bsf oled_rw
+_endasm
+}
+
+void wp_write_black(void)
+{
+_asm
+ movff wp_black,PORTD
+ bcf oled_rw
+ nop
+ bsf oled_rw
+ nop
+ bcf oled_rw
+ nop
+ bsf oled_rw
+_endasm
+}
+
+void wp_write_color(void)
+{
+_asm
+ movff wp_color1,PORTD
+ bcf oled_rw
+ nop
+ bsf oled_rw
+ nop
+ movff wp_color2,PORTD
+ bcf oled_rw
+ nop
+ bsf oled_rw
+_endasm
+}
+
+void wp_set_window(void)
+{
+ // x axis start ( 0 - 319)
+ wp_command = 0x35;
+ wp_write_command();
+ wp_data_16bit = ((U16)wp_leftx2) << 1;
+ wp_write_data();
+ // x axis end ( 0 - 319)
+ wp_command = 0x36;
+ wp_write_command();
+ wp_data_16bit = 319;
+ wp_write_data();
+ // y axis start + end ( 0 - 239 )
+ wp_command = 0x37;
+ wp_write_command();
+ // the bottom part
+ wp_data_16bit = wp_top;
+ if(wp_font == 2)
+ wp_data_16bit += WP_FONT_LARGE_HEIGHT;
+ else if(wp_font == 1)
+ wp_data_16bit += WP_FONT_MEDIUM_HEIGHT;
+ else
+ wp_data_16bit += WP_FONT_SMALL_HEIGHT;
+ wp_data_16bit--;
+ if(wp_data_16bit > 239)
+ wp_data_16bit = 239;
+ // the top part
+ wp_data_16bit |= ((U16)wp_top) << 8;
+ // all together in one 16bit transfer
+ wp_write_data();
+
+ // start
+ wp_command = 0x20;
+ wp_write_command();
+ wp_data_16bit = wp_top;
+ wp_write_data();
+
+ wp_command = 0x21;
+ wp_write_command();
+ wp_data_16bit = ((U16)wp_leftx2) << 1;
+ wp_write_data();
+}
+
+void wp_set_char_font_small(void)
+{
+ if(wp_char == ' ')
+ wp_char = 'ķ';
+
+ if (wp_char > 0x7E) // skip space between ~ and Ą
+ wp_char -= 34;
+
+ if((wp_char < '!') || (wp_char > 0xA1)) // font has 34 chars after ~ // ū + 4 chars limit to end of battery at the moment
+ wp_char = 0x82; // Ī
+
+ wp_start = wp_small_table[wp_char - '!'];
+ wp_end = wp_small_table[1 + wp_char - '!'];
+}
+
+void wp_set_char_font_medium(void)
+{
+ // space is 3E
+ if (wp_char == 0x27) // 0x27 == '
+ wp_char = 0x3B;
+ if (wp_char == '"')
+ wp_char = 0x3C;
+ if (wp_char == 'm')
+ wp_char = 0x3D;
+ if (wp_char == ' ')
+ wp_char = 0x3E;
+
+ if((wp_char < '.') || (wp_char > 0x3E))
+ wp_char = 0x3E;
+ wp_start = wp_medium_table[wp_char - '.'];
+ wp_end = wp_medium_table[1 + wp_char - '.'];
+}
+
+void wp_set_char_font_large(void)
+{
+ // space is / = 0x2F
+ if (wp_char == ' ')
+ wp_char = 0x2F;
+
+ if((wp_char < '.') || (wp_char > '9'))
+ wp_char = 0x2F;
+ wp_start = wp_large_table[wp_char - '.'];
+ wp_end = wp_large_table[1 + wp_char - '.'];
+}
+
+void wordprocessor(void)
+{
+ wp_set_window();
+
+ // access to GRAM
+ wp_command = 0x22;
+ wp_write_command();
+ _asm
+ bsf oled_rs
+ nop
+ _endasm
+
+ wp_txtptr = 0;
+ wp_char = wp_stringstore[wp_txtptr];
+
+ while(wp_char)
+ {
+ if(wp_font == 2)
+ wp_set_char_font_large();
+ else if(wp_font == 1)
+ wp_set_char_font_medium();
+ else
+ wp_set_char_font_small();
+
+ wp_black = 0;
+
+ for(wp_i = wp_start; wp_i> 8;
+ if((wp_temp_U8 & 128))
+ {
+ wp_temp_U8 -= 127;
+ if(wp_invert)
+ {
+ while(wp_temp_U8 > 0)
+ {
+ wp_temp_U8--;
+ wp_write_color();
+ }
+ }
+ else
+ {
+ _asm
+ movff wp_black,PORTD
+ _endasm
+ while(wp_temp_U8 > 0)
+ {
+ wp_temp_U8--;
+ _asm
+ bcf oled_rw
+ nop
+ bsf oled_rw
+ nop
+ bcf oled_rw
+ nop
+ bsf oled_rw
+ _endasm
+ }
+ }
+ }
+ else
+ {
+ wp_temp_U8++;
+ if(wp_invert)
+ {
+ _asm
+ movff wp_black,PORTD
+ _endasm
+ while(wp_temp_U8 > 0)
+ {
+ wp_temp_U8--;
+ _asm
+ bcf oled_rw
+ nop
+ bsf oled_rw
+ nop
+ bcf oled_rw
+ nop
+ bsf oled_rw
+ _endasm
+ }
+ }
+ else
+ {
+ while(wp_temp_U8 > 0)
+ {
+ wp_temp_U8--;
+ wp_write_color();
+ }
+ }
+ }
+ }
+ wp_txtptr++;
+ wp_char = wp_stringstore[wp_txtptr];
+ }
+ wp_command = 0x00;
+ wp_write_command();
+}
+
diff -r 000000000000 -r 96a35aeda5f2 code_part1/OSTC_code_c_part2/p2_deco_main_old_v107.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/code_part1/OSTC_code_c_part2/p2_deco_main_old_v107.c Tue Jan 12 15:05:59 2010 +0100
@@ -0,0 +1,3453 @@
+/*
+ * p2_deco_main_c_v107.c
+ *
+ * Created on: 31.03.2009
+ * Author: chsw
+ */
+
+//#include
+
+
+// OSTC - diving computer code
+// Copyright (C) 2008 HeinrichsWeikamp GbR
+
+// 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 3 of the License, or
+// (at your option) any later version.
+
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// 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, see .
+
+
+// *****************************
+// ** I N T R O D U C T I O N **
+// *****************************
+//
+// OSTC
+//
+// code:
+// p2_deco_main_c_v101.c
+// part2 of the OSTC code
+// code with constant O2 partial pressure routines
+// under construction !!
+//
+// summary:
+// decompression routines
+// for the OSTC experimental project
+// written by Christian Weikamp
+// last revision __________
+// comments added _________
+//
+// additional files:
+// p2_tables_v100.romdata (other files)
+// 18f4685_ostc_v100.lkr (linker script)
+//
+// history:
+// 01/03/08 v100: first release candidate
+// 03/13/08 v101: start of programming ppO2 code
+// 03/13/25 v101a: backup of interrim version with ppO2 calculation
+// 03/13/25 v101: open circuit gas change during deco
+// 03/13/25 v101: CNS_fraction calculation
+// 03/13/26 v101: optimization of tissue calc routines
+// 07/xx/08 v102a: debug of bottom time routine
+// 09/xx/08 v102d: Gradient Factor Model implemenation
+// 10/10/08 v104: renamed to build v103 for v118 stable
+// 10/14/08 v104: integration of temp_depth_last_deco for Gradient Model
+// 03/31/090 v107: integration of FONT Incon24
+
+//
+// literature:
+// B"uhlmann, Albert: Tauchmedizin; 4. Auflage;
+// Schr"oder, Kai & Reith, Steffen; 2000; S"attigungsvorg"ange beim Tauchen, das Modell ZH-L16, Funktionsweise von Tauchcomputern; http://www.achim-und-kai.de/kai/tausim/saett_faq
+// Morrison, Stuart; 2000; DIY DECOMPRESSION; http://www.lizardland.co.uk/DIYDeco.html
+// Balthasar, Steffen; Dekompressionstheorie I: Neo Haldane Modelle; http://www.txfreak.de/dekompressionstheorie_1.pdf
+// Baker, Erik C.; Clearing Up The Confusion About "Deep Stops"
+// Baker, Erik C.; Understanding M-values; http://www.txfreak.de/understanding_m-values.pdf
+
+
+// *********************
+// ** I N C L U D E S **
+// *********************
+ #include
+ #include
+
+// ********************************
+// ** C O N F I G U R A T I O N **
+// ** for simulation without asm **
+// ********************************
+ #pragma config OSC = IRCIO67
+ #pragma config FCMEN = OFF
+ #pragma config IESO = OFF
+ #pragma config PWRT = ON
+ #pragma config BOREN = OFF
+ #pragma config WDT = OFF
+ #pragma config WDTPS = 128
+ #pragma config MCLRE = ON
+ #pragma config LPT1OSC = OFF
+ #pragma config PBADEN = OFF
+ #pragma config DEBUG = OFF
+ #pragma config XINST = OFF
+ #pragma config LVP = OFF
+ #pragma config STVREN = OFF
+
+// ****************************
+// ** D E F I N E S **
+// ** missing in p18f4685.h **
+// ****************************
+#define INT0IF 1
+#define INT1IF 0
+#define TMR1IF 0
+
+#define oled_clk PORTD, 0,0
+#define oled_data PORTD, 1,0
+#define oled_en PORTE, 0,0
+#define oled_rs PORTE, 1,0
+#define flag5 0x29 // in Bank1
+//#define no_sensor_int flag5,7,1 // ; block any further access to pressure sensor
+
+// ***********************
+// ** V A R I A B L E S **
+// ***********************
+// prefixes etc:
+// _O_ = output for use in the assembler code
+// _I_ = input from the assembler code for the c code
+// char_ and int_ = used to identify output and input size
+// var = variable (from b"uhlmann)
+// pres = pressure
+// gtissue = guiding tissue, the one limiting the ascent
+// e2secs = exp of the b"uhlmann formula precalculated for a 2 second step
+// e1min = same for 1 minute step
+// sim = used in simulating the ascent to the surface
+// nullzeit = remaining ground/bottom time for "no deco"
+// hauptroutine = main
+
+#pragma udata bank0a=0x060
+volatile unsigned char dd2_stringstore[17];
+#pragma udata bank0b=0x071
+volatile unsigned char keep_free_bank0[21];
+
+#pragma udata bank0c=0x086
+volatile unsigned char dd2_left; // 1 - 64
+volatile unsigned char dd2_top; // 1 - 64
+volatile unsigned char dd2_heightmax; // 1 - 37
+volatile unsigned char dd2_oled_brightness_offset; // 0 - 15 (15 is pitch black always)
+volatile unsigned char dd2_fontwidth; // 8, 12, 21 for Incon16, Incon24, Incon42
+volatile unsigned char dd2_fontheight; // 14, 21, 37 for "
+volatile unsigned long dd2_pointer; // for font lut
+volatile unsigned char dd2_i;
+volatile unsigned char dd2_j;
+volatile unsigned char dd2_k;
+volatile unsigned char dd2_char;
+volatile unsigned char dd2_lowbyte;
+volatile unsigned char dd2_temp;
+volatile unsigned char dd2_data;
+volatile unsigned long dd2_base; // for font lut
+volatile unsigned char dd2_start; // for font lut
+volatile unsigned char dd2_end; // for font lut
+
+
+ #pragma udata bank1=0x100
+ const unsigned char keep_free_bank1[256]; // used by the assembler code
+
+ #pragma udata bank2a=0x200
+// output:
+ static unsigned int int_O_tissue_for_debug[32];
+ static unsigned int int_O_GF_spare____; // 0x240
+ static unsigned int int_O_GF_step; // 0x242
+ static unsigned int int_O_gtissue_limit; // 0x244
+ static unsigned int int_O_gtissue_press; // 0x246
+ static unsigned int int_O_limit_GF_low; // 0x248
+ static unsigned int int_O_gtissue_press_at_GF_low; // 0x24A
+// ...
+ #pragma udata bank2b=0x24E
+ static unsigned char char_O_GF_low_pointer; // 0x24E
+ static unsigned char char_O_actual_pointer; // 0x24F
+ #pragma udata bank2c=0x250
+ static unsigned char char_O_deco_table[32]; // 0x250
+ #pragma udata bank2d=0x270
+ static unsigned char char_I_table_deco_done[32];
+ #pragma udata bank2e=0x290
+ static unsigned int int_O_calc_tissue_call_counter; // 0x290
+
+
+
+// internal:
+ unsigned char lock_GF_depth_list;
+ static float temp_limit;
+ static float GF_low;
+ static float GF_high;
+ static float GF_delta;
+ static float GF_temp;
+ static float GF_step;
+ static float GF_step2;
+ static float temp_pres_gtissue;
+ static float temp_pres_gtissue_diff;
+ static float temp_pres_gtissue_limit_GF_low;
+ static float temp_pres_gtissue_limit_GF_low_below_surface;
+ static unsigned int temp_depth_limit;
+ static unsigned char temp_decotime;
+ static unsigned char temp_gtissue_no;
+ static unsigned int temp_depth_last_deco; // new in v.101
+
+ static unsigned char temp_depth_GF_low_meter;
+ static unsigned char temp_depth_GF_low_number;
+ static unsigned char internal_deco_pointer;
+ static unsigned char internal_deco_table[32];
+ static float temp_pres_deco_GF_low;
+
+static unsigned int debug_temp;
+
+
+#pragma udata bank3a=0x300
+static char output[32];
+// used by the math routines
+#pragma udata bank3b=0x380
+volatile float pres_tissue_vault[32];
+ #pragma udata bank4a=0x400
+// internal:
+ unsigned char ci ; // don't move - used in _asm routines - if moved then modify movlb commands
+ unsigned char x;
+ unsigned int main_i;
+ unsigned int int_temp;
+ unsigned int int_temp_decostatus;
+ static float pres_respiration;
+ static float pres_surface;
+ static float temp1;
+ static float temp2;
+ static float temp3;
+ static float temp4;
+ static float temp_deco;
+ static float temp_atem;
+ static float temp2_atem;
+ static float temp_tissue;
+ static float temp_surface;
+ static float N2_ratio;
+ static float He_ratio;
+ static float temp_ratio;
+ static float var_a;
+ static float var2_a;
+ static float var_b;
+ static float var2_b;
+ static float var_t05nc;
+ static float var2_t05nc;
+ static float var_e2secs;
+ static float var2_e2secs;
+ static float var_e1min;
+ static float var2_e1min;
+ static float var_halftimes;
+ static float var2_halftimes;
+ static float pres_gtissue_limit;
+ static float temp_pres_gtissue_limit;
+ static float actual_ppO2; // new in v.102
+ #pragma udata bank4b=0x480
+ static float pres_tissue[32];
+
+ #pragma udata bank5=0x500
+// don't move positions in this bank, the registers are addressed directly from assembler code
+// input:
+ static unsigned int int_I_pres_respiration; // 0x500
+ static unsigned int int_I_pres_surface; // 0x502
+ static unsigned int int_I_temp; // 0x504 new in v101
+ static unsigned char char_I_temp; // 0x506 new in v101
+ static unsigned char char_I_actual_ppO2; // 0x507
+ static unsigned int int_I_spare_3;
+ static unsigned int int_I_spare_4;
+ static unsigned int int_I_spare_5;
+ static unsigned int int_I_spare_6;
+ static unsigned char char_I_N2_ratio; // 0x510
+ static unsigned char char_I_He_ratio; // 0x511
+ static unsigned char char_I_saturation_multiplier; // for conservatism/safety values 1.0 (no conservatism) to 1.5 (50% faster saturation
+ static unsigned char char_I_desaturation_multiplier; // for conservatism/safety values 0.66 (50% slower desaturation) to 1.0 (no conservatism)// consveratism used in calc_tissue(), calc_tissue_step_1_min() and sim_tissue_1min()
+ static unsigned char char_I_GF_High_percentage; // 0x514 new in v.102
+ static unsigned char char_I_GF_Low_percentage; // 0x515 new in v.102
+ static unsigned char char_I_spare; // 0x516
+ static unsigned char char_I_deco_distance; // 0x517
+ static unsigned char char_I_const_ppO2; // 0x518 new in v.101
+ static unsigned char char_I_deco_ppO2_change; // 0x519 new in v.101
+ static unsigned char char_I_deco_ppO2; // 0x51A new in v.101
+ static unsigned char char_I_deco_gas_change; // 0x51B new in v.101
+ static unsigned char char_I_deco_N2_ratio; // 0x51C new in v.101
+ static unsigned char char_I_deco_He_ratio; // 0x51D new in v.101
+ static unsigned char char_I_depth_last_deco; // 0x51E new in v.101 unit: [m]
+ static unsigned char char_I_deco_model; // 0x51F new in v.102 ( 1 = MultiGraF, sonst Std. mit (de-)saturation_multiplier)
+// output:
+ static unsigned int int_O_desaturation_time; // 0x520
+ static unsigned char char_O_nullzeit; // 0x522
+ static unsigned char char_O_deco_status; // 0x523
+ static unsigned char char_O_array_decotime[7]; // 0x524
+ static unsigned char char_O_array_decodepth[6]; // 0x52B
+ static unsigned char char_O_ascenttime; // 0x531
+ static unsigned char char_O_gradient_factor; // 0x532
+ static unsigned char char_O_tissue_saturation[32]; // 0x533
+ static unsigned char char_O_array_gradient_weighted[16]; // 0x553
+ static unsigned char char_O_gtissue_no; // 0x563
+ static unsigned char char_O_diluent; // 0x564 new in v.101
+ static unsigned char char_O_CNS_fraction; // 0x565 new in v.101
+ static unsigned char char_O_relative_gradient_GF; // 0x566 new in v.102
+// internal:
+ static float pres_tissue_limit[16];
+ static float sim_pres_tissue_limit[16];
+ static float pres_diluent; // new in v.101
+ static float deco_diluent; // new in v.101
+ static float const_ppO2; // new in v.101
+ static float deco_ppO2_change; // new in v.101
+ static float deco_ppO2; // new in v.101
+
+
+
+ #pragma udata bank6=0x600
+// internal:
+ static float sim_pres_tissue[32];
+ static float sim_pres_tissue_backup[32];
+
+ #pragma udata bank7=0x700
+ const unsigned char keep_free_bank7[256]; // used by the assembler code (DD font2display)
+
+ #pragma udata bank8=0x800
+ static char md_pi_subst[256];
+
+ #pragma udata bank9=0x900
+// output:
+ static char md_state[48]; // DONT MOVE !! has to be at the beginning of bank 9 for the asm code!!!
+// internal:
+ static char md_t;
+ static char md_buffer[16];
+ static char md_cksum[16];
+ static char md_i;
+ static char md_j;
+ static char md_temp;
+ static unsigned int md_pointer;
+ static float deco_N2_ratio; // new in v.101
+ static float deco_He_ratio; // new in v.101
+ static float calc_N2_ratio; // new in v.101
+ static float calc_He_ratio; // new in v.101
+ static float deco_gas_change; // new in v.101
+ static float CNS_fraction; // new in v.101
+ static float float_saturation_multiplier; // new in v.101
+ static float float_desaturation_multiplier; // new in v.101
+ static float float_deco_distance; // new in v.101
+
+
+
+// *************************
+// ** P R O T O T Y P E S **
+// *************************
+void main_calc_hauptroutine(void);
+void main_calc_without_deco(void);
+void main_clear_tissue(void);
+void main_calc_percentage(void);
+void main_calc_wo_deco_step_1_min(void);
+void main_debug(void);
+void main_gradient_array(void);
+void main_hash(void);
+
+void calc_hauptroutine(void);
+void calc_tissue(void);
+void calc_nullzeit(void);
+void backup_sim_pres_tissue(void);
+void restore_sim_pres_tissue(void);
+
+void calc_without_deco(void);
+void clear_tissue(void);
+void calc_ascenttime(void);
+void update_startvalues(void);
+void clear_decoarray(void);
+void update_decoarray(void);
+void sim_tissue_1min(void);
+void sim_tissue_10min(void);
+void calc_gradient_factor(void);
+void calc_gradient_array_only(void);
+void calc_desaturation_time(void);
+void calc_wo_deco_step_1_min(void);
+void calc_tissue_step_1_min(void);
+//void debug(void);
+void hash(void);
+void clear_CNS_fraction(void);
+void calc_CNS_fraction(void);
+void calc_CNS_decrease_15min(void);
+void calc_percentage(void);
+void main(void);
+void calc_hauptroutine_data_input(void);
+void calc_hauptroutine_update_tissues(void);
+void calc_hauptroutine_calc_deco(void);
+void calc_hauptroutine_calc_ascend_to_deco(void);
+//void build_debug_output(void);
+void calc_nextdecodepth_GF(void);
+void copy_deco_table_GF(void);
+void clear_internal_deco_table_GF(void);
+void update_internal_deco_table_GF(void);
+void DD2_write(void);
+void DD2_write_incon42(void);
+void DD2_get_pointer_to_char(void);//dd2_char, &dd2_pointer);
+void DD2_set_column(void);//top, dd2_k);void DD2_load_background(void);//&dd2_columnstore, &dd2_background, dd2_top, dd2_left, dd2_heightmax);
+void DD2_load_background(void);
+void DD2_build_one_line_of_char(void);//&dd2_columnstore, &dd2_pointer, dd2_fontheight, dd2_lowbyte);
+void DD2_print_column(void);//&dd2_columnstore, dd2_heightmax);
+void DD2_CmdWrite(void);
+void DD2_DataWrite(void);
+void push_tissues_to_vault(void);
+void pull_tissues_from_vault(void);
+void main_push_tissues_to_vault(void);
+void main_pull_tissues_from_vault(void);
+
+// *******************************
+// ** start **
+// ** necessary for compilation **
+// *******************************
+#pragma romdata der_code = 0x0000
+#pragma code der_start = 0x0000
+void der_start(void)
+{
+_asm
+ goto main
+_endasm
+}
+
+// ***********************************
+// ** main code for simulation / **
+// ** tests without assembler code **
+// ** is NOT a part of the OSTC **
+// ***********************************
+#pragma code main = 0x9000
+void main(void)
+{
+#if 1
+// new main to test DR-5
+
+GF_low = 1.0;
+GF_high = 1.0;
+
+GF_temp = GF_low * GF_high;
+
+clear_CNS_fraction();
+//char_I_const_ppO2 = 100;
+//for (main_i=0;main_i<255;main_i++)
+//{
+//calc_CNS_fraction();
+//} //for
+
+
+
+
+int_I_pres_respiration = 1000;//980;
+int_I_pres_surface = 1000;//980;
+char_I_N2_ratio = 39; //38;
+char_I_He_ratio = 40; //50;
+char_I_deco_distance = 0; // 10 = 1 meter
+char_I_depth_last_deco = 3; // values below 3 (meter) are ignored
+
+char_I_const_ppO2 = 0;
+char_I_deco_ppO2_change = 0; // [dm] 10 = 1 meter
+char_I_deco_ppO2 = 0;
+
+char_I_deco_gas_change = 0; // [m] 1 = 1 meter
+char_I_deco_N2_ratio = 0;
+char_I_deco_He_ratio = 0;
+
+//char_I_actual_ppO2; // 0x507
+char_I_GF_High_percentage = 100; // 0x514 new in v.102
+char_I_GF_Low_percentage = 100; // 0x515 new in v.102
+
+char_I_saturation_multiplier = 110;
+char_I_desaturation_multiplier = 90;
+
+char_I_deco_model = 0;
+
+main_clear_tissue();
+
+int_I_pres_respiration = 1000 + int_I_pres_surface;
+main_calc_wo_deco_step_1_min();
+int_I_pres_respiration = 3000 + int_I_pres_surface;
+main_calc_wo_deco_step_1_min();
+int_I_pres_respiration = 5000 + int_I_pres_surface;
+main_calc_wo_deco_step_1_min();
+
+
+int_I_pres_respiration = 6000 + int_I_pres_surface;
+for (main_i=0;main_i<27;main_i++)
+ main_calc_wo_deco_step_1_min();
+
+char_O_deco_status = 255;
+while (char_O_deco_status)
+ main_calc_hauptroutine();
+_asm
+nop
+_endasm
+
+for (main_i=0;main_i<50;main_i++)
+{
+main_calc_hauptroutine();
+}
+int_I_pres_respiration = 10000;
+for (main_i=0;main_i<1500;main_i++)
+{
+main_calc_hauptroutine();
+}
+
+_asm
+nop
+_endasm
+
+
+int_I_pres_respiration = 3000;
+for (main_i=0;main_i<150;main_i++)
+{
+ calc_hauptroutine_data_input();
+ calc_hauptroutine_update_tissues();
+} //for
+
+ update_startvalues();
+ clear_decoarray();
+ clear_internal_deco_table_GF();
+ calc_hauptroutine_calc_ascend_to_deco();
+ if (char_O_deco_status > 15) // can't go up to first deco, too deep to calculate in the given time slot
+ {
+ char_O_deco_status = 2;
+// char_O_lock_depth_list = 255;
+ }
+ else
+ {
+// char_O_lock_depth_list = lock_GF_depth_list;
+ calc_hauptroutine_calc_deco();
+ }
+// build_debug_output();
+
+_asm
+nop
+_endasm
+while (char_O_deco_status == 1)
+{
+ char_O_deco_status = 0;
+// char_O_lock_depth_list = 255;
+ calc_hauptroutine_calc_deco();
+// build_debug_output();
+_asm
+nop
+_endasm
+};
+debug_temp = 60; // [mtr Aufstieg in 10 mtr/min (30steps'2sec/min]
+int_I_pres_respiration = 9980;
+for (main_i=0;main_i 15) // can't go up to first deco, too deep to calculate in the given time slot
+ {
+ char_O_deco_status = 2;
+// char_O_lock_depth_list = 255;
+ }
+ else
+ {
+// char_O_lock_depth_list = lock_GF_depth_list;
+ calc_hauptroutine_calc_deco();
+ }
+// build_debug_output();
+
+_asm
+nop
+_endasm
+while (char_O_deco_status == 1)
+{
+ char_O_deco_status = 0;
+// char_O_lock_depth_list = 255;
+ calc_hauptroutine_calc_deco();
+// build_debug_output();
+_asm
+nop
+_endasm
+};
+_asm
+nop
+_endasm
+debug_temp = 60; // [mtr Aufstieg in 10 mtr/min (30steps'2sec/min]
+int_I_pres_respiration = 9980;
+debug_temp = debug_temp * 3;
+for (main_i=0;main_i 31)
+ int_temp = 31; // deepest deco at 93 meter (31 deco stops)
+ if (int_temp < 0)
+ int_temp = 0;
+ temp_depth_GF_low_number = int_temp;
+ temp_depth_GF_low_meter = 3 * temp_depth_GF_low_number;
+ temp2 = (float)temp_depth_GF_low_meter * 0.09995;
+ temp_pres_deco_GF_low = temp2 + float_deco_distance + pres_surface;
+ if (temp_depth_GF_low_number == 0)
+ GF_step = 0;
+ else
+ GF_step = GF_delta / (float)temp_depth_GF_low_number;
+ if (GF_step < 0)
+ GF_step = 0;
+ if (GF_step > GF_delta)
+ GF_step = GF_delta;
+ int_O_GF_step = (int)(GF_step * 10000);
+ int_O_limit_GF_low = (int)(temp_pres_deco_GF_low * 1000);
+ int_O_gtissue_press_at_GF_low = (int)(temp_pres_gtissue * 1000);
+ char_O_GF_low_pointer = temp_depth_GF_low_number;
+ lock_GF_depth_list = 1;
+ internal_deco_pointer = 0;
+ }
+ if (internal_deco_pointer == 0) // new run
+ {
+ internal_deco_pointer = temp_depth_GF_low_number;
+ GF_temp = GF_high - ((float)internal_deco_pointer * GF_step);
+ int_temp = char_I_table_deco_done[internal_deco_pointer];
+ output[8] = int_temp;
+ output[9] = 33;
+ }
+ else
+ {
+ int_temp = 1;
+ }
+ while (int_temp == 1)
+ {
+ int_temp = internal_deco_pointer - 1;
+ if (int_temp == 1) // new in v104
+ {
+ temp2 = (float)(temp_depth_last_deco * int_temp) * 0.09995;
+ GF_step2 = GF_step/3.0 * ((float)(6 - temp_depth_last_deco));
+ }
+ else
+ if (int_temp == 0)
+ {
+ temp2 = 0.0;
+ GF_step2 = GF_high - GF_temp;
+ }
+ else
+ {
+ temp2 = (float)(3 *int_temp) * 0.09995;
+ GF_step2 = GF_step;
+ }
+ temp2 = temp2 + pres_surface; // next deco stop to be tested
+ temp1 = ((GF_temp + GF_step2)* temp_pres_gtissue_diff) + temp_pres_gtissue; // upper limit (lowest pressure allowed) // changes GF_step2 in v104
+ if (temp1 > temp2) // check if ascent to next deco stop is ok
+ {
+ int_temp = 0; // no
+ }
+ else
+ {
+ internal_deco_pointer = int_temp;
+ GF_temp = GF_temp + GF_step2; // changed in v104
+ int_temp = char_I_table_deco_done[internal_deco_pointer]; // yes and check for ascent to even next stop if deco_done is set
+ }
+ } // while
+ if (internal_deco_pointer > 0)
+ {
+ temp2 = (float)(0.29985 * internal_deco_pointer);
+ temp_deco = temp2 + float_deco_distance + pres_surface;
+ if (internal_deco_pointer == 1) // new in v104
+ temp_depth_limit = temp_depth_last_deco;
+ else
+ temp_depth_limit = 3 * internal_deco_pointer;
+ if (output[9] == 33)
+ {
+ output[9] = internal_deco_pointer;
+ output[10] = char_I_table_deco_done[internal_deco_pointer];
+ output[12] = output[12] + 1;
+ if (output[12] == 100)
+ output[12] = 0;
+ }
+ }
+ else // if (char_I_deco_model == 1)
+ {
+ temp_deco = pres_surface;
+ temp_depth_limit = 0;
+ }
+ }
+ else
+ {
+ // calc_nextdecodepth - original
+ // optimized in v.101
+ // depth_last_deco included in v.101
+
+ temp1 = temp_pres_gtissue_limit - pres_surface;
+ if (temp1 >= 0)
+ {
+ temp1 = temp1 / 0.29985; // = temp1 / 99.95 / 0.003;
+ temp_depth_limit = (int) (temp1 + 0.99);
+ temp_depth_limit = 3 * temp_depth_limit; // depth for deco [m]
+ if (temp_depth_limit == 0)
+ temp_deco = pres_surface;
+ else
+ {
+ if (temp_depth_limit < temp_depth_last_deco)
+ temp_depth_limit = temp_depth_last_deco;
+ temp1 = (float)temp_depth_limit * 0.09995;
+ temp_deco = temp1 + float_deco_distance + pres_surface; // depth for deco [bar]
+ } // if (temp_depth_limit == 0)
+ } // if (temp1 >= 0)
+ else
+ {
+ temp_deco = pres_surface;
+ temp_depth_limit = 0;
+ } // if (temp1 >= 0)
+ } // calc_nextdecodepth original
+} // calc_nextdecodepth_GF
+
+
+#if 0
+void build_debug_output(void)
+{
+output[0] = 0; // not used in asm PLED output
+output[1] = (int) (GF_low * 100);
+output[2] = (int) (GF_high * 100);
+output[3] = (int) (GF_step * 100);
+output[4] = (int) temp_depth_GF_low_number;
+output[5] = (int) temp_depth_GF_low_meter;
+//output[6]
+output[7] = (int) internal_deco_pointer;
+//output[8] = char_I_table_deco_done[temp_depth_GF_low_number]
+//output[9] = internal_deco_pointer @ new run
+//output[10] = char_I_table_deco_done[internal_deco_pointer] @ new run
+output [11] = (int) (temp_pres_deco_GF_low * 10);
+} // build_debug_output
+#endif
+
+// ---------------------
+// copy_deco_table_GF //
+// ---------------------
+// new in v.102
+void copy_deco_table_GF(void)
+{
+ if (char_I_deco_model == 1)
+ {
+ int_temp = 32;
+ for (ci=0;ci dd2_fontheight) dd2_heightmax = dd2_fontheight;
+ if ((dd2_top + dd2_heightmax) > 65) dd2_heightmax = 65 - dd2_top;
+
+ dd2_k = dd2_left;
+ dd2_j = 0;
+ dd2_char = dd2_stringstore[dd2_j++];
+ DD2_get_pointer_to_char();//dd2_char, &dd2_pointer);
+ dd2_i = 0;
+ dd2_lowbyte = 1;
+
+while (dd2_char != 0)
+{
+ if (dd2_lowbyte == 1) DD2_load_background();//&dd2_columnstore, &dd2_background, dd2_top, dd2_left, dd2_heightmax);
+ DD2_build_one_line_of_char(); //&dd2_columnstore, &dd2_pointer, dd2_fontheight, dd2_lowbyte); // dd2_heightmax
+ dd2_lowbyte = dd2_lowbyte ^ 1;
+ if (dd2_lowbyte == 1)
+ {
+ DD2_set_column();//top, dd2_k); //
+ if(dd2_k < 64) dd2_k++;
+ DD2_print_column();//&dd2_columnstore, dd2_heightmax); // dd2_column_store, dd2_heightmax
+ }
+ dd2_i++;
+ if ((dd2_i >= dd2_fontwidth) | (((dd2_char == '.') |(dd2_char == ':') | (dd2_char == '<')) & (dd2_i >= 4)))
+ {
+ dd2_char = dd2_stringstore[dd2_j++];
+ DD2_get_pointer_to_char();//dd2_char, &dd2_pointer);
+ dd2_i = 0;
+ }
+}
+} // void dd2_write(void)
+
+void DD2_get_pointer_to_char(void)//dd2_char, &dd2_pointer);
+{
+ if((dd2_char < dd2_start) | (dd2_char > dd2_end))
+ {
+ dd2_pointer = 0;
+ dd2_temp = 0;
+ }
+ else
+ {
+ dd2_pointer = dd2_char - dd2_start;
+ dd2_pointer = dd2_pointer * ((dd2_fontheight+1)/2);
+ dd2_pointer = dd2_pointer * dd2_fontwidth;
+ dd2_pointer += dd2_base;
+ if((dd2_char == '.') | (dd2_char == ':') | (dd2_char == '<'))
+ {
+ dd2_pointer += 2 * dd2_fontheight;
+ }
+
+ }
+} // void DD2_get_pointer_to_char(void)
+
+void DD2_set_column(void)//top, dd2_k);
+{
+ dd2_data = 0x75;
+ DD2_CmdWrite();
+ dd2_data = dd2_top - 1;
+ DD2_CmdWrite();
+ dd2_data = 0x3f;
+ DD2_CmdWrite();
+
+ dd2_data = 0x15;
+ DD2_CmdWrite();
+ dd2_data = dd2_k - 1;
+ DD2_CmdWrite();
+ dd2_data = dd2_k - 1;
+ DD2_CmdWrite();
+} // DD2_set_column()
+
+void DD2_load_background(void)//&dd2_columnstore, &dd2_background, dd2_top, dd2_left, dd2_heightmax);
+{
+ for(dd2_temp = 0; dd2_temp < dd2_heightmax; dd2_temp++)
+ md_pi_subst[dd2_temp] = 0x00;
+} // void DD2_load_background()
+
+void DD2_build_one_line_of_char(void)//&dd2_columnstore, &dd2_pointer, dd2_fontheight, dd2_lowbyte);
+{
+ if (dd2_pointer != 0)
+ {
+ dd2_temp = (char)(dd2_pointer & 255);
+_asm
+ movff dd2_temp,TBLPTRL
+_endasm
+ dd2_temp = (char)((dd2_pointer >> 8) & 255);
+_asm
+ movff dd2_temp,TBLPTRH
+_endasm
+ dd2_temp = (char)((dd2_pointer >> 16)& 255);
+_asm
+ movff dd2_temp,TBLPTRU
+_endasm
+
+ for(dd2_temp = 0; dd2_temp < dd2_heightmax; dd2_temp += 2)
+ {
+_asm
+ TBLRDPOSTINC
+ movff TABLAT,dd2_data
+_endasm
+ if (dd2_oled_brightness_offset != 0)
+ {
+ if ((dd2_oled_brightness_offset << 4) < (dd2_data & 0xF0))
+ dd2_data = dd2_data - (dd2_oled_brightness_offset << 4);
+ if ((dd2_oled_brightness_offset) < (dd2_data & 0x0F))
+ dd2_data = dd2_data - dd2_oled_brightness_offset;
+ }
+ if (dd2_lowbyte == 1)
+ {
+ md_pi_subst[dd2_temp] = dd2_data & 0xF0;
+ md_pi_subst[dd2_temp+1] = (dd2_data << 4) & 0xF0;
+ }
+ else
+ {
+ md_pi_subst[dd2_temp] = (md_pi_subst[dd2_temp] & 0xF0) | ((dd2_data >> 4) & 0x0F);
+ md_pi_subst[dd2_temp+1] = (md_pi_subst[dd2_temp+1] & 0xF0) | (dd2_data & 0x0F);
+ }
+ }//for
+ dd2_pointer += (dd2_fontheight+1)/2;
+ }//if
+} //
+
+void DD2_print_column(void)//&dd2_columnstore, dd2_heightmax);
+{
+_asm
+ bsf oled_rs
+_endasm
+ for(dd2_temp = 0; dd2_temp < dd2_heightmax; dd2_temp++)
+ {
+ dd2_data = md_pi_subst[dd2_temp];
+ DD2_DataWrite();
+ }
+} // void DD2_print_column(void)
+
+//; -----------------------------
+//; DD Write Cmd via W
+//; two jump_ins:
+//; DD_CmdWrite and DD_CmdWrite2
+//; -----------------------------
+void DD2_CmdWrite(void)
+{
+_asm
+ bcf oled_rs
+_endasm
+ DD2_DataWrite();
+}
+
+void DD2_DataWrite(void)
+{
+_asm
+ movlb 1
+// bsf no_sensor_int // flag5, no_sensor_int
+ bcf oled_en
+ movlb 0
+ bcf oled_clk //; CLK=0
+ btfsc dd2_data,7,1 //; Bit
+ bsf oled_data
+ bcf oled_clk //; CLK=0
+ btfss dd2_data,7,1
+ bcf oled_data
+ bsf oled_clk //; CLK=1
+ btfsc dd2_data,6,1 //; Bit
+ bsf oled_data
+ bcf oled_clk //; CLK=0
+ btfss dd2_data,6,1
+ bcf oled_data
+ bsf oled_clk //; CLK=1
+ btfsc dd2_data,5,1 //; Bit
+ bsf oled_data
+ bcf oled_clk //; CLK=0
+ btfss dd2_data,5,1
+ bcf oled_data //;
+ bsf oled_clk //; CLK=1
+ btfsc dd2_data,4,1 //; Bit
+ bsf oled_data
+ bcf oled_clk //; CLK=0
+ btfss dd2_data,4,1
+ bcf oled_data
+ bsf oled_clk //; CLK=1
+ btfsc dd2_data,3,1 //; Bit
+ bsf oled_data
+ bcf oled_clk //; CLK=0
+ btfss dd2_data,3,1
+ bcf oled_data
+ bsf oled_clk //; CLK=1
+ btfsc dd2_data,2,1 //; Bit
+ bsf oled_data
+ bcf oled_clk //; CLK=0
+ btfss dd2_data,2,1
+ bcf oled_data
+ bsf oled_clk //; CLK=1
+ btfsc dd2_data,1,1 //; Bit
+ bsf oled_data
+ bcf oled_clk //; CLK=0
+ btfss dd2_data,1,1
+ bcf oled_data
+ bsf oled_clk //; CLK=1
+ btfsc dd2_data,0,1 //; Bit
+ bsf oled_data
+ bcf oled_clk //; CLK=0
+ btfss dd2_data,0,1
+ bcf oled_data
+ bsf oled_clk //; CLK=1
+ bsf oled_en //; CS#=1
+ movlb 1
+// bcf no_sensor_int // flag5, no_sensor_int
+ movlb 0
+_endasm
+ dd2_data = 0; // to be sure that C knows we are in Bank0
+}
+#pragma romdata font_incon_24h15 = 0x0E100
+ rom const rom unsigned char incon24h15[] =
+ {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x80
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6f, 0xf0
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xe0
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3a, 0xf0
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x4b, 0xff, 0xa0
+ ,0x00, 0x00, 0x00, 0x00, 0x5c, 0xff, 0x91, 0x00
+ ,0x00, 0x00, 0x00, 0x6d, 0xfe, 0x71, 0x00, 0x00
+ ,0x00, 0x01, 0x7e, 0xfd, 0x60, 0x00, 0x00, 0x00
+ ,0x01, 0x8f, 0xfd, 0x50, 0x00, 0x00, 0x00, 0x00
+ ,0x9f, 0xfb, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0xfa, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x01, 0x69, 0xbc, 0xca, 0x72, 0x00, 0x00
+ ,0x00, 0x9f, 0xfe, 0xdc, 0xdf, 0xff, 0xb2, 0x00
+ ,0x1d, 0xf8, 0x20, 0x00, 0x05, 0xfd, 0xff, 0x30
+ ,0xaf, 0x30, 0x00, 0x00, 0x9f, 0x90, 0x2e, 0xd0
+ ,0xf8, 0x00, 0x00, 0x2c, 0xf5, 0x00, 0x06, 0xf0
+ ,0xf8, 0x00, 0x04, 0xed, 0x30, 0x00, 0x05, 0xf0
+ ,0xaf, 0x30, 0x8f, 0xb1, 0x00, 0x00, 0x0c, 0xe0
+ ,0x1d, 0xfd, 0xf8, 0x00, 0x00, 0x16, 0xdf, 0x40
+ ,0x00, 0x9f, 0xff, 0xdc, 0xde, 0xff, 0xc3, 0x00
+ ,0x00, 0x01, 0x69, 0xbc, 0xca, 0x73, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x02, 0x90, 0x00, 0x00, 0x00, 0x00, 0x01, 0x30
+ ,0x0a, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x04, 0xf0
+ ,0x2f, 0x60, 0x00, 0x00, 0x00, 0x00, 0x04, 0xf0
+ ,0xaf, 0x97, 0x77, 0x77, 0x77, 0x77, 0x79, 0xf0
+ ,0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0
+ ,0x12, 0x22, 0x22, 0x22, 0x22, 0x22, 0x26, 0xf0
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xf0
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xd0
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x40
+ ,0x07, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xf0
+ ,0x4f, 0x80, 0x00, 0x00, 0x00, 0x1c, 0xfe, 0xf0
+ ,0xcc, 0x00, 0x00, 0x00, 0x02, 0xef, 0x57, 0xf0
+ ,0xf7, 0x00, 0x00, 0x00, 0x2e, 0xe2, 0x07, 0xf0
+ ,0xf8, 0x00, 0x00, 0x01, 0xde, 0x20, 0x07, 0xf0
+ ,0xce, 0x10, 0x00, 0x2d, 0xe2, 0x00, 0x07, 0xf0
+ ,0x4f, 0xd6, 0x58, 0xfe, 0x30, 0x00, 0x07, 0xf0
+ ,0x06, 0xff, 0xff, 0xb1, 0x00, 0x00, 0x07, 0xf0
+ ,0x00, 0x14, 0x52, 0x00, 0x00, 0x00, 0x05, 0x80
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00
+ ,0x09, 0x20, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x50
+ ,0x6f, 0x40, 0x00, 0x00, 0x00, 0x00, 0x2e, 0xd0
+ ,0xdb, 0x00, 0x00, 0x59, 0x00, 0x00, 0x07, 0xf0
+ ,0xf8, 0x00, 0x00, 0x8e, 0x00, 0x00, 0x04, 0xf0
+ ,0xea, 0x00, 0x00, 0xcf, 0x10, 0x00, 0x06, 0xf0
+ ,0x9f, 0x30, 0x07, 0xff, 0x90, 0x00, 0x1e, 0xe0
+ ,0x1e, 0xfc, 0xdf, 0x87, 0xfb, 0x79, 0xef, 0x50
+ ,0x01, 0x9d, 0xc6, 0x00, 0x7e, 0xff, 0xd5, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x2b, 0xb0, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x06, 0xff, 0xe0, 0x00, 0x00
+ ,0x00, 0x00, 0x02, 0xcf, 0x69, 0xe0, 0x00, 0x00
+ ,0x00, 0x00, 0x7f, 0xb1, 0x09, 0xe0, 0x00, 0x00
+ ,0x00, 0x2c, 0xe6, 0x00, 0x09, 0xe0, 0x00, 0x00
+ ,0x07, 0xfb, 0x10, 0x00, 0x09, 0xe0, 0x00, 0x00
+ ,0xcf, 0xfc, 0xcc, 0xcc, 0xce, 0xfd, 0xdd, 0xd0
+ ,0xde, 0xee, 0xee, 0xee, 0xef, 0xfe, 0xee, 0xe0
+ ,0x00, 0x00, 0x00, 0x00, 0x09, 0xe0, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x08, 0xc0, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00
+ ,0x78, 0xab, 0xcd, 0xed, 0x00, 0x00, 0xce, 0x20
+ ,0xff, 0xed, 0xcc, 0xfa, 0x00, 0x00, 0x5f, 0xb0
+ ,0xf9, 0x00, 0x06, 0xf0, 0x00, 0x00, 0x08, 0xf0
+ ,0xf9, 0x00, 0x0a, 0xb0, 0x00, 0x00, 0x04, 0xf0
+ ,0xf9, 0x00, 0x0a, 0xc0, 0x00, 0x00, 0x04, 0xf0
+ ,0xf9, 0x00, 0x08, 0xf3, 0x00, 0x00, 0x0b, 0xf0
+ ,0xf9, 0x00, 0x01, 0xfe, 0x62, 0x13, 0xbf, 0x90
+ ,0xf9, 0x00, 0x00, 0x4e, 0xff, 0xff, 0xfb, 0x00
+ ,0x11, 0x00, 0x00, 0x01, 0x6a, 0xa9, 0x40, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x03, 0x56, 0x65, 0x30, 0x00, 0x00
+ ,0x00, 0x4b, 0xff, 0xff, 0xff, 0xff, 0xa2, 0x00
+ ,0x08, 0xfe, 0x96, 0x8f, 0x95, 0x6a, 0xff, 0x30
+ ,0x6f, 0x90, 0x01, 0xf8, 0x00, 0x00, 0x3e, 0xd0
+ ,0xec, 0x00, 0x08, 0xf0, 0x00, 0x00, 0x06, 0xf0
+ ,0xf6, 0x00, 0x0a, 0xe0, 0x00, 0x00, 0x04, 0xf0
+ ,0xf7, 0x00, 0x07, 0xf3, 0x00, 0x00, 0x09, 0xf0
+ ,0xcd, 0x10, 0x01, 0xef, 0x72, 0x13, 0xaf, 0x90
+ ,0x4d, 0x20, 0x00, 0x2d, 0xff, 0xff, 0xf9, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x47, 0x86, 0x10, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x90
+ ,0xfa, 0x00, 0x00, 0x00, 0x00, 0x39, 0xef, 0xf0
+ ,0xfa, 0x00, 0x00, 0x01, 0x7d, 0xff, 0xe9, 0x40
+ ,0xfa, 0x00, 0x05, 0xbf, 0xff, 0x94, 0x00, 0x00
+ ,0xfa, 0x18, 0xef, 0xfb, 0x50, 0x00, 0x00, 0x00
+ ,0xfe, 0xff, 0xd7, 0x10, 0x00, 0x00, 0x00, 0x00
+ ,0xff, 0xb4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x02, 0x78, 0x50, 0x00
+ ,0x03, 0xad, 0xb4, 0x00, 0x7f, 0xff, 0xfc, 0x00
+ ,0x3f, 0xfc, 0xff, 0x66, 0xfa, 0x43, 0xaf, 0xa0
+ ,0xcd, 0x10, 0x1c, 0xfe, 0x70, 0x00, 0x0b, 0xf0
+ ,0xf5, 0x00, 0x01, 0xfe, 0x00, 0x00, 0x05, 0xf0
+ ,0xf5, 0x00, 0x00, 0xbf, 0x10, 0x00, 0x04, 0xf0
+ ,0xec, 0x00, 0x07, 0xff, 0xb0, 0x00, 0x0a, 0xf0
+ ,0x6f, 0xd9, 0xcf, 0x78, 0xfb, 0x32, 0x9f, 0x90
+ ,0x07, 0xef, 0xe6, 0x00, 0x9f, 0xff, 0xfb, 0x00
+ ,0x00, 0x01, 0x00, 0x00, 0x03, 0x88, 0x50, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x03, 0x55, 0x20, 0x00, 0x00, 0x00, 0x00
+ ,0x04, 0xdf, 0xff, 0xfb, 0x10, 0x00, 0x0b, 0x60
+ ,0x4f, 0xd7, 0x45, 0x9f, 0xd0, 0x00, 0x1c, 0xe0
+ ,0xdd, 0x00, 0x00, 0x05, 0xf5, 0x00, 0x05, 0xf0
+ ,0xf7, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x04, 0xf0
+ ,0xf8, 0x00, 0x00, 0x00, 0xf7, 0x00, 0x08, 0xf0
+ ,0xbe, 0x20, 0x00, 0x06, 0xf2, 0x00, 0x5f, 0xa0
+ ,0x2e, 0xf9, 0x54, 0x7f, 0x94, 0x7c, 0xfc, 0x00
+ ,0x02, 0xaf, 0xff, 0xff, 0xff, 0xfe, 0x70, 0x00
+ ,0x00, 0x01, 0x46, 0x77, 0x75, 0x30, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x06, 0xa1, 0x00, 0x00, 0x09, 0x80
+ ,0x00, 0x00, 0x1f, 0xf9, 0x00, 0x00, 0x6f, 0xf0
+ ,0x00, 0x00, 0x0d, 0xf5, 0x00, 0x00, 0x3f, 0xe0
+ ,0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0xba, 0xae, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0xff, 0xe9, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x53, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x97, 0x8c, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0xff, 0xfb, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x75, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x75, 0x6a, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0xff, 0xfd, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0xa8, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x2c, 0xff, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0xdd, 0x78, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0xf2, 0x00, 0x5f, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0xf0, 0x00, 0x4f, 0x10, 0x00, 0x00, 0x00, 0x00
+ ,0xea, 0x23, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x4f, 0xff, 0xe2, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x01, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x11, 0x11, 0x11, 0x11, 0x11, 0x10
+ ,0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0
+ ,0x00, 0x00, 0x9f, 0xa7, 0x77, 0x77, 0x77, 0x70
+ ,0x00, 0x00, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x02, 0xf3, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x01, 0xff, 0xcb, 0xbb, 0xbb, 0xbb, 0xb0
+ ,0x00, 0x00, 0x4f, 0xfe, 0xee, 0xee, 0xee, 0xe0
+ ,0x00, 0x00, 0xab, 0x20, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x01, 0xf1, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x02, 0xfa, 0x55, 0x55, 0x55, 0x55, 0x50
+ ,0x00, 0x00, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xf0
+ ,0x00, 0x00, 0x02, 0x44, 0x44, 0x44, 0x44, 0x40
+ };
+
+#pragma romdata font_incon_42 = 0x0F500
+ rom const rom unsigned char incon42[] =
+ {
+ // 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x03, 0x7a, 0xcd, 0xee, 0xdc, 0xa8, 0x40, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x18, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x92, 0x00, 0x00, 0x00
+ ,0x00, 0x07, 0xef, 0xff, 0xff, 0xdc, 0xbb, 0xce, 0xff, 0xff, 0xff, 0x91, 0x00, 0x00
+ ,0x00, 0xbf, 0xff, 0xc7, 0x65, 0x43, 0x22, 0x33, 0x57, 0xbf, 0xff, 0xfd, 0x20, 0x00
+ ,0x0b, 0xff, 0xc4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x6e, 0xff, 0xd1, 0x00
+ ,0x7f, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xbf, 0xfa, 0x00
+ ,0xef, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0xff, 0x20
+ ,0xff, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xff, 0x60
+ ,0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0x70
+ ,0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0x50
+ ,0xcf, 0xf3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1d, 0xff, 0x10
+ ,0x4f, 0xfe, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xcf, 0xf8, 0x00
+ ,0x07, 0xff, 0xd7, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x7e, 0xff, 0xb0, 0x00
+ ,0x00, 0x5e, 0xff, 0xfb, 0x98, 0x54, 0x33, 0x34, 0x58, 0xbf, 0xff, 0xfa, 0x00, 0x00
+ ,0x00, 0x01, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x50, 0x00, 0x00
+ ,0x00, 0x00, 0x01, 0x7b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe9, 0x40, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x02, 0x46, 0x77, 0x65, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ // ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+
+#if 0
+// 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x03, 0x7a, 0xcd, 0xee, 0xdc, 0xa8, 0x40, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x18, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x92, 0x00, 0x00, 0x00
+ ,0x00, 0x07, 0xef, 0xff, 0xff, 0xdc, 0xbb, 0xce, 0xff, 0xff, 0xff, 0x91, 0x00, 0x00
+ ,0x00, 0xbf, 0xff, 0xc7, 0x20, 0x00, 0x00, 0x00, 0x1c, 0xff, 0xff, 0xfd, 0x20, 0x00
+ ,0x0b, 0xff, 0xc4, 0x00, 0x00, 0x00, 0x00, 0x02, 0xcf, 0xfc, 0x6e, 0xff, 0xd1, 0x00
+ ,0x7f, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5e, 0xff, 0x90, 0x01, 0xbf, 0xfa, 0x00
+ ,0xef, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x09, 0xff, 0xe5, 0x00, 0x00, 0x0d, 0xff, 0x20
+ ,0xff, 0x60, 0x00, 0x00, 0x00, 0x02, 0xcf, 0xfc, 0x20, 0x00, 0x00, 0x05, 0xff, 0x60
+ ,0xff, 0x40, 0x00, 0x00, 0x00, 0x5e, 0xff, 0x90, 0x00, 0x00, 0x00, 0x03, 0xff, 0x70
+ ,0xff, 0x80, 0x00, 0x00, 0x08, 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0x50
+ ,0xcf, 0xf3, 0x00, 0x01, 0xcf, 0xfd, 0x30, 0x00, 0x00, 0x00, 0x00, 0x1d, 0xff, 0x10
+ ,0x4f, 0xfe, 0x50, 0x4e, 0xff, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x01, 0xcf, 0xf8, 0x00
+ ,0x07, 0xff, 0xfd, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x01, 0x7e, 0xff, 0xb0, 0x00
+ ,0x00, 0x5e, 0xff, 0xff, 0xd8, 0x54, 0x33, 0x34, 0x58, 0xbf, 0xff, 0xfa, 0x00, 0x00
+ ,0x00, 0x01, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x50, 0x00, 0x00
+ ,0x00, 0x00, 0x01, 0x7b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe9, 0x40, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x02, 0x46, 0x77, 0x65, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+// ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+#endif
+//
+// ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x1f, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x44, 0x00
+ ,0x00, 0x9f, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0x00
+ ,0x02, 0xff, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0x00
+ ,0x0a, 0xff, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0x00
+ ,0x3f, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0x00
+ ,0xbf, 0xfc, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x79, 0xff, 0x00
+ ,0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00
+ ,0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00
+ ,0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x36, 0xff, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xcc, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+// ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ //
+// ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x08, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0xff, 0x00
+ ,0x00, 0xbf, 0xd1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xff, 0x00
+ ,0x0a, 0xff, 0xb3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xdf, 0xff, 0xff, 0x00
+ ,0x4f, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6f, 0xff, 0xdb, 0xff, 0x00
+ ,0xcf, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xf8, 0x08, 0xff, 0x00
+ ,0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9f, 0xfe, 0x40, 0x08, 0xff, 0x00
+ ,0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0xff, 0xd2, 0x00, 0x08, 0xff, 0x00
+ ,0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9f, 0xfd, 0x10, 0x00, 0x08, 0xff, 0x00
+ ,0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xd1, 0x00, 0x00, 0x08, 0xff, 0x00
+ ,0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x8f, 0xfe, 0x20, 0x00, 0x00, 0x08, 0xff, 0x00
+ ,0x9f, 0xfa, 0x00, 0x00, 0x00, 0x1a, 0xff, 0xe2, 0x00, 0x00, 0x00, 0x08, 0xff, 0x00
+ ,0x2e, 0xff, 0xd6, 0x21, 0x38, 0xef, 0xfd, 0x20, 0x00, 0x00, 0x00, 0x08, 0xff, 0x00
+ ,0x04, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0x00
+ ,0x00, 0x3d, 0xff, 0xff, 0xff, 0xe7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0x00
+ ,0x00, 0x00, 0x59, 0xbb, 0x95, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ //,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ //
+// ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5e, 0x30, 0x00
+ ,0x04, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xd0, 0x00
+ ,0x1e, 0xfe, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xdf, 0xf8, 0x00
+ ,0x7f, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xfe, 0x00
+ ,0xdf, 0xc0, 0x00, 0x00, 0x00, 0x07, 0x95, 0x00, 0x00, 0x00, 0x00, 0x09, 0xff, 0x30
+ ,0xff, 0x70, 0x00, 0x00, 0x00, 0x0c, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0x60
+ ,0xff, 0x50, 0x00, 0x00, 0x00, 0x0e, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0x70
+ ,0xff, 0x60, 0x00, 0x00, 0x00, 0x2f, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0x60
+ ,0xff, 0xb0, 0x00, 0x00, 0x00, 0x7f, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x09, 0xff, 0x30
+ ,0xbf, 0xf4, 0x00, 0x00, 0x02, 0xef, 0xff, 0x70, 0x00, 0x00, 0x00, 0x2f, 0xfe, 0x00
+ ,0x4f, 0xfe, 0x60, 0x00, 0x5e, 0xfd, 0xbf, 0xf5, 0x00, 0x00, 0x03, 0xef, 0xf7, 0x00
+ ,0x09, 0xff, 0xff, 0xdf, 0xff, 0xf3, 0x2f, 0xff, 0xb6, 0x56, 0xbf, 0xff, 0xc0, 0x00
+ ,0x00, 0x8f, 0xff, 0xff, 0xfe, 0x40, 0x04, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x00
+ ,0x00, 0x02, 0x8c, 0xdb, 0x71, 0x00, 0x00, 0x2b, 0xff, 0xff, 0xfe, 0x80, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x66, 0x30, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ //,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ //
+// ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xef, 0xc0, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xaf, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5e, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0xff, 0xd4, 0xcf, 0xc0, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x06, 0xef, 0xf8, 0x00, 0xcf, 0xc0, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x02, 0xbf, 0xfc, 0x30, 0x00, 0xcf, 0xc0, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x7f, 0xff, 0x70, 0x00, 0x00, 0xcf, 0xc0, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x2c, 0xff, 0xb2, 0x00, 0x00, 0x00, 0xcf, 0xc0, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x07, 0xff, 0xe6, 0x00, 0x00, 0x00, 0x00, 0xcf, 0xc0, 0x00, 0x00, 0x00, 0x00
+ ,0x03, 0xcf, 0xfa, 0x10, 0x00, 0x00, 0x00, 0x00, 0xcf, 0xc0, 0x00, 0x00, 0x00, 0x00
+ ,0x8f, 0xff, 0xea, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xef, 0xea, 0xaa, 0xaa, 0xaa, 0x00
+ ,0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00
+ ,0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00
+ ,0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0xdf, 0xd4, 0x44, 0x44, 0x44, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcf, 0xc0, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcf, 0xc0, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79, 0x70, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ //,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ //
+// ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x12, 0x34, 0x56, 0x72, 0x00, 0x00, 0x00, 0x03, 0xf8, 0x00, 0x00
+ ,0xab, 0xcd, 0xef, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x1e, 0xff, 0x80, 0x00
+ ,0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x00, 0x00, 0x00, 0x28, 0xff, 0xf3, 0x00
+ ,0xff, 0xda, 0xa9, 0x87, 0x67, 0xff, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xfb, 0x00
+ ,0xff, 0x70, 0x00, 0x00, 0x06, 0xff, 0x10, 0x00, 0x00, 0x00, 0x00, 0x0c, 0xff, 0x10
+ ,0xff, 0x70, 0x00, 0x00, 0x0b, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xff, 0x50
+ ,0xff, 0x70, 0x00, 0x00, 0x0d, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x70
+ ,0xff, 0x70, 0x00, 0x00, 0x0e, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x70
+ ,0xff, 0x70, 0x00, 0x00, 0x0e, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0x60
+ ,0xff, 0x70, 0x00, 0x00, 0x0b, 0xfe, 0x10, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xff, 0x30
+ ,0xff, 0x70, 0x00, 0x00, 0x06, 0xff, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x6f, 0xfd, 0x00
+ ,0xff, 0x70, 0x00, 0x00, 0x00, 0xdf, 0xfd, 0x40, 0x00, 0x00, 0x29, 0xff, 0xf5, 0x00
+ ,0xff, 0x70, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xfe, 0xba, 0xbd, 0xff, 0xff, 0x90, 0x00
+ ,0xff, 0x70, 0x00, 0x00, 0x00, 0x03, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00
+ ,0x55, 0x20, 0x00, 0x00, 0x00, 0x00, 0x07, 0xdf, 0xff, 0xff, 0xea, 0x30, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x34, 0x42, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ //,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ //
+// ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x33, 0x33, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x49, 0xce, 0xff, 0xff, 0xff, 0xff, 0xeb, 0x71, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x00, 0x00
+ ,0x00, 0x3d, 0xff, 0xff, 0xfc, 0xba, 0xff, 0xfb, 0xab, 0xef, 0xff, 0xfd, 0x20, 0x00
+ ,0x04, 0xff, 0xfe, 0x83, 0x00, 0x1c, 0xfd, 0x20, 0x00, 0x02, 0x8e, 0xff, 0xd1, 0x00
+ ,0x1e, 0xff, 0x90, 0x00, 0x00, 0xbf, 0xe1, 0x00, 0x00, 0x00, 0x01, 0xcf, 0xf9, 0x00
+ ,0xaf, 0xf7, 0x00, 0x00, 0x05, 0xff, 0x50, 0x00, 0x00, 0x00, 0x00, 0x1d, 0xff, 0x10
+ ,0xff, 0xb0, 0x00, 0x00, 0x0a, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0x50
+ ,0xff, 0x50, 0x00, 0x00, 0x0d, 0xfb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x70
+ ,0xff, 0x20, 0x00, 0x00, 0x0d, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0x60
+ ,0xff, 0x30, 0x00, 0x00, 0x0a, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0x30
+ ,0xff, 0x70, 0x00, 0x00, 0x05, 0xff, 0xc1, 0x00, 0x00, 0x00, 0x00, 0x4f, 0xfd, 0x00
+ ,0xef, 0xe1, 0x00, 0x00, 0x00, 0xcf, 0xfd, 0x50, 0x00, 0x00, 0x28, 0xff, 0xf4, 0x00
+ ,0x7f, 0xfd, 0x00, 0x00, 0x00, 0x2d, 0xff, 0xff, 0xdb, 0xcd, 0xff, 0xff, 0x70, 0x00
+ ,0x0c, 0xd2, 0x00, 0x00, 0x00, 0x01, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xe5, 0x00, 0x00
+ ,0x01, 0x10, 0x00, 0x00, 0x00, 0x00, 0x03, 0x9d, 0xff, 0xfe, 0xb6, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ //,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ //
+// ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0xcc, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00
+ ,0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0xef, 0x00
+ ,0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x9e, 0xff, 0xff, 0x00
+ ,0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0xdf, 0xff, 0xff, 0xfe, 0x00
+ ,0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x01, 0x7d, 0xff, 0xff, 0xff, 0xd9, 0x40, 0x00
+ ,0xff, 0x90, 0x00, 0x00, 0x00, 0x05, 0xbf, 0xff, 0xff, 0xfd, 0x83, 0x00, 0x00, 0x00
+ ,0xff, 0x90, 0x00, 0x00, 0x39, 0xef, 0xff, 0xff, 0xe8, 0x30, 0x00, 0x00, 0x00, 0x00
+ ,0xff, 0x90, 0x00, 0x6c, 0xff, 0xff, 0xfe, 0x94, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0xff, 0x92, 0x8e, 0xff, 0xff, 0xfb, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0xff, 0xef, 0xff, 0xff, 0xd7, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0xff, 0xff, 0xff, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0xff, 0xfd, 0x71, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0xba, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ //,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ //
+// ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x67, 0x62, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x24, 0x42, 0x00, 0x00, 0x00, 0x04, 0xdf, 0xff, 0xff, 0xb2, 0x00, 0x00
+ ,0x00, 0x3c, 0xff, 0xff, 0xc4, 0x00, 0x00, 0x8f, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x00
+ ,0x05, 0xff, 0xff, 0xff, 0xff, 0x70, 0x08, 0xff, 0xfb, 0x77, 0xaf, 0xff, 0xe1, 0x00
+ ,0x3f, 0xff, 0xa7, 0x8d, 0xff, 0xf6, 0x4f, 0xfc, 0x20, 0x00, 0x02, 0xdf, 0xf9, 0x00
+ ,0xbf, 0xe3, 0x00, 0x00, 0x8f, 0xfe, 0xdf, 0xb0, 0x00, 0x00, 0x00, 0x2e, 0xff, 0x00
+ ,0xff, 0x60, 0x00, 0x00, 0x08, 0xff, 0xfe, 0x10, 0x00, 0x00, 0x00, 0x08, 0xff, 0x40
+ ,0xff, 0x10, 0x00, 0x00, 0x00, 0xcf, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0x60
+ ,0xff, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0x60
+ ,0xff, 0x20, 0x00, 0x00, 0x00, 0x5f, 0xff, 0x10, 0x00, 0x00, 0x00, 0x05, 0xff, 0x50
+ ,0xff, 0x80, 0x00, 0x00, 0x03, 0xef, 0xff, 0xa0, 0x00, 0x00, 0x00, 0x0a, 0xff, 0x20
+ ,0xdf, 0xf6, 0x00, 0x00, 0x5e, 0xfc, 0xcf, 0xf8, 0x00, 0x00, 0x00, 0x4f, 0xfd, 0x00
+ ,0x4f, 0xff, 0xc8, 0x9d, 0xff, 0xf3, 0x3f, 0xff, 0xa2, 0x00, 0x06, 0xff, 0xf5, 0x00
+ ,0x07, 0xff, 0xff, 0xff, 0xfe, 0x40, 0x06, 0xff, 0xff, 0xdc, 0xef, 0xff, 0xa0, 0x00
+ ,0x00, 0x4c, 0xff, 0xff, 0x91, 0x00, 0x00, 0x5e, 0xff, 0xff, 0xff, 0xfa, 0x00, 0x00
+ ,0x00, 0x00, 0x24, 0x30, 0x00, 0x00, 0x00, 0x01, 0x8e, 0xff, 0xfb, 0x40, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ //,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ //
+// ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x02, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x01, 0x7d, 0xff, 0xff, 0xea, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x40, 0x00
+ ,0x00, 0x6e, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x6f, 0xe2, 0x00
+ ,0x08, 0xff, 0xff, 0xb9, 0x9b, 0xef, 0xff, 0xc0, 0x00, 0x00, 0x00, 0xbf, 0xfa, 0x00
+ ,0x4f, 0xff, 0x70, 0x00, 0x00, 0x05, 0xef, 0xf8, 0x00, 0x00, 0x00, 0x0c, 0xff, 0x10
+ ,0xdf, 0xf3, 0x00, 0x00, 0x00, 0x00, 0x1e, 0xff, 0x10, 0x00, 0x00, 0x06, 0xff, 0x50
+ ,0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0x50, 0x00, 0x00, 0x04, 0xff, 0x60
+ ,0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0x70, 0x00, 0x00, 0x04, 0xff, 0x60
+ ,0xff, 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0x70, 0x00, 0x00, 0x07, 0xff, 0x40
+ ,0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0x40, 0x00, 0x00, 0x0d, 0xfe, 0x00
+ ,0xef, 0xe2, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xfd, 0x00, 0x00, 0x00, 0x9f, 0xf8, 0x00
+ ,0x7f, 0xfd, 0x30, 0x00, 0x00, 0x00, 0x7f, 0xf4, 0x00, 0x00, 0x1a, 0xff, 0xd1, 0x00
+ ,0x0b, 0xff, 0xfb, 0x52, 0x00, 0x08, 0xff, 0x60, 0x13, 0x6a, 0xff, 0xfe, 0x20, 0x00
+ ,0x00, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xc2, 0x00, 0x00
+ ,0x00, 0x04, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc5, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x02, 0x69, 0xcd, 0xef, 0xff, 0xed, 0xb9, 0x62, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+// ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ };
+
+#if 0
+#pragma romdata font_incon_42 = 0x0E000
+ rom const rom unsigned char incon42[] =
+ {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x03, 0x7a, 0xcd, 0xee, 0xdc, 0xa8, 0x40, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x18, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x92, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x07, 0xef, 0xff, 0xff, 0xdc, 0xbb, 0xce, 0xff, 0xff, 0xff, 0x91, 0x00, 0x00
+ ,0x00, 0x00, 0xbf, 0xff, 0xc7, 0x20, 0x00, 0x00, 0x00, 0x1c, 0xff, 0xff, 0xfd, 0x20, 0x00
+ ,0x00, 0x0b, 0xff, 0xc4, 0x00, 0x00, 0x00, 0x00, 0x02, 0xcf, 0xfc, 0x6e, 0xff, 0xd1, 0x00
+ ,0x00, 0x7f, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5e, 0xff, 0x90, 0x01, 0xbf, 0xfa, 0x00
+ ,0x00, 0xef, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x09, 0xff, 0xe5, 0x00, 0x00, 0x0d, 0xff, 0x20
+ ,0x03, 0xff, 0x60, 0x00, 0x00, 0x00, 0x02, 0xcf, 0xfc, 0x20, 0x00, 0x00, 0x05, 0xff, 0x60
+ ,0x04, 0xff, 0x40, 0x00, 0x00, 0x00, 0x5e, 0xff, 0x90, 0x00, 0x00, 0x00, 0x03, 0xff, 0x70
+ ,0x02, 0xff, 0x80, 0x00, 0x00, 0x08, 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0x50
+ ,0x00, 0xcf, 0xf3, 0x00, 0x01, 0xcf, 0xfd, 0x30, 0x00, 0x00, 0x00, 0x00, 0x1d, 0xff, 0x10
+ ,0x00, 0x4f, 0xfe, 0x50, 0x4e, 0xff, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x01, 0xcf, 0xf8, 0x00
+ ,0x00, 0x07, 0xff, 0xfd, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x01, 0x7e, 0xff, 0xb0, 0x00
+ ,0x00, 0x00, 0x5e, 0xff, 0xff, 0xd8, 0x54, 0x33, 0x34, 0x58, 0xbf, 0xff, 0xfa, 0x00, 0x00
+ ,0x00, 0x00, 0x01, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x50, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x01, 0x7b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe9, 0x40, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x46, 0x77, 0x65, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x1f, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x44, 0x00
+ ,0x00, 0x00, 0x9f, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0x00
+ ,0x00, 0x02, 0xff, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0x00
+ ,0x00, 0x0a, 0xff, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0x00
+ ,0x00, 0x3f, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0x00
+ ,0x00, 0xbf, 0xfc, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x79, 0xff, 0x00
+ ,0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00
+ ,0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00
+ ,0x00, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x36, 0xff, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xcc, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x08, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0xff, 0x00
+ ,0x00, 0x00, 0xbf, 0xd1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xff, 0x00
+ ,0x00, 0x0a, 0xff, 0xb3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xdf, 0xff, 0xff, 0x00
+ ,0x00, 0x4f, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6f, 0xff, 0xdb, 0xff, 0x00
+ ,0x00, 0xcf, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xf8, 0x08, 0xff, 0x00
+ ,0x01, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9f, 0xfe, 0x40, 0x08, 0xff, 0x00
+ ,0x04, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0xff, 0xd2, 0x00, 0x08, 0xff, 0x00
+ ,0x04, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9f, 0xfd, 0x10, 0x00, 0x08, 0xff, 0x00
+ ,0x03, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xd1, 0x00, 0x00, 0x08, 0xff, 0x00
+ ,0x00, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x8f, 0xfe, 0x20, 0x00, 0x00, 0x08, 0xff, 0x00
+ ,0x00, 0x9f, 0xfa, 0x00, 0x00, 0x00, 0x1a, 0xff, 0xe2, 0x00, 0x00, 0x00, 0x08, 0xff, 0x00
+ ,0x00, 0x2e, 0xff, 0xd6, 0x21, 0x38, 0xef, 0xfd, 0x20, 0x00, 0x00, 0x00, 0x08, 0xff, 0x00
+ ,0x00, 0x04, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0x00
+ ,0x00, 0x00, 0x3d, 0xff, 0xff, 0xff, 0xe7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0x00
+ ,0x00, 0x00, 0x00, 0x59, 0xbb, 0x95, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5e, 0x30, 0x00
+ ,0x00, 0x04, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xd0, 0x00
+ ,0x00, 0x1e, 0xfe, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xdf, 0xf8, 0x00
+ ,0x00, 0x7f, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xfe, 0x00
+ ,0x00, 0xdf, 0xc0, 0x00, 0x00, 0x00, 0x07, 0x95, 0x00, 0x00, 0x00, 0x00, 0x09, 0xff, 0x30
+ ,0x01, 0xff, 0x70, 0x00, 0x00, 0x00, 0x0c, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0x60
+ ,0x03, 0xff, 0x50, 0x00, 0x00, 0x00, 0x0e, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0x70
+ ,0x03, 0xff, 0x60, 0x00, 0x00, 0x00, 0x2f, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0x60
+ ,0x01, 0xff, 0xb0, 0x00, 0x00, 0x00, 0x7f, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x09, 0xff, 0x30
+ ,0x00, 0xbf, 0xf4, 0x00, 0x00, 0x02, 0xef, 0xff, 0x70, 0x00, 0x00, 0x00, 0x2f, 0xfe, 0x00
+ ,0x00, 0x4f, 0xfe, 0x60, 0x00, 0x5e, 0xfd, 0xbf, 0xf5, 0x00, 0x00, 0x03, 0xef, 0xf7, 0x00
+ ,0x00, 0x09, 0xff, 0xff, 0xdf, 0xff, 0xf3, 0x2f, 0xff, 0xb6, 0x56, 0xbf, 0xff, 0xc0, 0x00
+ ,0x00, 0x00, 0x8f, 0xff, 0xff, 0xfe, 0x40, 0x04, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x00
+ ,0x00, 0x00, 0x02, 0x8c, 0xdb, 0x71, 0x00, 0x00, 0x2b, 0xff, 0xff, 0xfe, 0x80, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x66, 0x30, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xef, 0xc0, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xaf, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5e, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0xff, 0xd4, 0xcf, 0xc0, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xef, 0xf8, 0x00, 0xcf, 0xc0, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x02, 0xbf, 0xfc, 0x30, 0x00, 0xcf, 0xc0, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0x70, 0x00, 0x00, 0xcf, 0xc0, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x2c, 0xff, 0xb2, 0x00, 0x00, 0x00, 0xcf, 0xc0, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x07, 0xff, 0xe6, 0x00, 0x00, 0x00, 0x00, 0xcf, 0xc0, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x03, 0xcf, 0xfa, 0x10, 0x00, 0x00, 0x00, 0x00, 0xcf, 0xc0, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x8f, 0xff, 0xea, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xef, 0xea, 0xaa, 0xaa, 0xaa, 0x00
+ ,0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00
+ ,0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00
+ ,0x00, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0xdf, 0xd4, 0x44, 0x44, 0x44, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcf, 0xc0, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcf, 0xc0, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79, 0x70, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x12, 0x34, 0x56, 0x72, 0x00, 0x00, 0x00, 0x03, 0xf8, 0x00, 0x00
+ ,0x01, 0xab, 0xcd, 0xef, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x1e, 0xff, 0x80, 0x00
+ ,0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x00, 0x00, 0x00, 0x28, 0xff, 0xf3, 0x00
+ ,0x02, 0xff, 0xda, 0xa9, 0x87, 0x67, 0xff, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xfb, 0x00
+ ,0x02, 0xff, 0x70, 0x00, 0x00, 0x06, 0xff, 0x10, 0x00, 0x00, 0x00, 0x00, 0x0c, 0xff, 0x10
+ ,0x02, 0xff, 0x70, 0x00, 0x00, 0x0b, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xff, 0x50
+ ,0x02, 0xff, 0x70, 0x00, 0x00, 0x0d, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x70
+ ,0x02, 0xff, 0x70, 0x00, 0x00, 0x0e, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x70
+ ,0x02, 0xff, 0x70, 0x00, 0x00, 0x0e, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0x60
+ ,0x02, 0xff, 0x70, 0x00, 0x00, 0x0b, 0xfe, 0x10, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xff, 0x30
+ ,0x02, 0xff, 0x70, 0x00, 0x00, 0x06, 0xff, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x6f, 0xfd, 0x00
+ ,0x02, 0xff, 0x70, 0x00, 0x00, 0x00, 0xdf, 0xfd, 0x40, 0x00, 0x00, 0x29, 0xff, 0xf5, 0x00
+ ,0x02, 0xff, 0x70, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xfe, 0xba, 0xbd, 0xff, 0xff, 0x90, 0x00
+ ,0x02, 0xff, 0x70, 0x00, 0x00, 0x00, 0x03, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00
+ ,0x01, 0x55, 0x20, 0x00, 0x00, 0x00, 0x00, 0x07, 0xdf, 0xff, 0xff, 0xea, 0x30, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x34, 0x42, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x33, 0x33, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x49, 0xce, 0xff, 0xff, 0xff, 0xff, 0xeb, 0x71, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x00, 0x00
+ ,0x00, 0x00, 0x3d, 0xff, 0xff, 0xfc, 0xba, 0xff, 0xfb, 0xab, 0xef, 0xff, 0xfd, 0x20, 0x00
+ ,0x00, 0x04, 0xff, 0xfe, 0x83, 0x00, 0x1c, 0xfd, 0x20, 0x00, 0x02, 0x8e, 0xff, 0xd1, 0x00
+ ,0x00, 0x1e, 0xff, 0x90, 0x00, 0x00, 0xbf, 0xe1, 0x00, 0x00, 0x00, 0x01, 0xcf, 0xf9, 0x00
+ ,0x00, 0xaf, 0xf7, 0x00, 0x00, 0x05, 0xff, 0x50, 0x00, 0x00, 0x00, 0x00, 0x1d, 0xff, 0x10
+ ,0x01, 0xff, 0xb0, 0x00, 0x00, 0x0a, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0x50
+ ,0x04, 0xff, 0x50, 0x00, 0x00, 0x0d, 0xfb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x70
+ ,0x06, 0xff, 0x20, 0x00, 0x00, 0x0d, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0x60
+ ,0x06, 0xff, 0x30, 0x00, 0x00, 0x0a, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0x30
+ ,0x03, 0xff, 0x70, 0x00, 0x00, 0x05, 0xff, 0xc1, 0x00, 0x00, 0x00, 0x00, 0x4f, 0xfd, 0x00
+ ,0x00, 0xef, 0xe1, 0x00, 0x00, 0x00, 0xcf, 0xfd, 0x50, 0x00, 0x00, 0x28, 0xff, 0xf4, 0x00
+ ,0x00, 0x7f, 0xfd, 0x00, 0x00, 0x00, 0x2d, 0xff, 0xff, 0xdb, 0xcd, 0xff, 0xff, 0x70, 0x00
+ ,0x00, 0x0c, 0xd2, 0x00, 0x00, 0x00, 0x01, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xe5, 0x00, 0x00
+ ,0x00, 0x01, 0x10, 0x00, 0x00, 0x00, 0x00, 0x03, 0x9d, 0xff, 0xfe, 0xb6, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x02, 0xcc, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x02, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x02, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00
+ ,0x02, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0xef, 0x00
+ ,0x02, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x9e, 0xff, 0xff, 0x00
+ ,0x02, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0xdf, 0xff, 0xff, 0xfe, 0x00
+ ,0x02, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x01, 0x7d, 0xff, 0xff, 0xff, 0xd9, 0x40, 0x00
+ ,0x02, 0xff, 0x90, 0x00, 0x00, 0x00, 0x05, 0xbf, 0xff, 0xff, 0xfd, 0x83, 0x00, 0x00, 0x00
+ ,0x02, 0xff, 0x90, 0x00, 0x00, 0x39, 0xef, 0xff, 0xff, 0xe8, 0x30, 0x00, 0x00, 0x00, 0x00
+ ,0x02, 0xff, 0x90, 0x00, 0x6c, 0xff, 0xff, 0xfe, 0x94, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x02, 0xff, 0x92, 0x8e, 0xff, 0xff, 0xfb, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x02, 0xff, 0xef, 0xff, 0xff, 0xd7, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x02, 0xff, 0xff, 0xff, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x02, 0xff, 0xfd, 0x71, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x02, 0xba, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x67, 0x62, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x24, 0x42, 0x00, 0x00, 0x00, 0x04, 0xdf, 0xff, 0xff, 0xb2, 0x00, 0x00
+ ,0x00, 0x00, 0x3c, 0xff, 0xff, 0xc4, 0x00, 0x00, 0x8f, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x00
+ ,0x00, 0x05, 0xff, 0xff, 0xff, 0xff, 0x70, 0x08, 0xff, 0xfb, 0x77, 0xaf, 0xff, 0xe1, 0x00
+ ,0x00, 0x3f, 0xff, 0xa7, 0x8d, 0xff, 0xf6, 0x4f, 0xfc, 0x20, 0x00, 0x02, 0xdf, 0xf9, 0x00
+ ,0x00, 0xbf, 0xe3, 0x00, 0x00, 0x8f, 0xfe, 0xdf, 0xb0, 0x00, 0x00, 0x00, 0x2e, 0xff, 0x00
+ ,0x01, 0xff, 0x60, 0x00, 0x00, 0x08, 0xff, 0xfe, 0x10, 0x00, 0x00, 0x00, 0x08, 0xff, 0x40
+ ,0x05, 0xff, 0x10, 0x00, 0x00, 0x00, 0xcf, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0x60
+ ,0x06, 0xff, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0x60
+ ,0x06, 0xff, 0x20, 0x00, 0x00, 0x00, 0x5f, 0xff, 0x10, 0x00, 0x00, 0x00, 0x05, 0xff, 0x50
+ ,0x03, 0xff, 0x80, 0x00, 0x00, 0x03, 0xef, 0xff, 0xa0, 0x00, 0x00, 0x00, 0x0a, 0xff, 0x20
+ ,0x00, 0xdf, 0xf6, 0x00, 0x00, 0x5e, 0xfc, 0xcf, 0xf8, 0x00, 0x00, 0x00, 0x4f, 0xfd, 0x00
+ ,0x00, 0x4f, 0xff, 0xc8, 0x9d, 0xff, 0xf3, 0x3f, 0xff, 0xa2, 0x00, 0x06, 0xff, 0xf5, 0x00
+ ,0x00, 0x07, 0xff, 0xff, 0xff, 0xfe, 0x40, 0x06, 0xff, 0xff, 0xdc, 0xef, 0xff, 0xa0, 0x00
+ ,0x00, 0x00, 0x4c, 0xff, 0xff, 0x91, 0x00, 0x00, 0x5e, 0xff, 0xff, 0xff, 0xfa, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x24, 0x30, 0x00, 0x00, 0x00, 0x01, 0x8e, 0xff, 0xfb, 0x40, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x02, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x01, 0x7d, 0xff, 0xff, 0xea, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x40, 0x00
+ ,0x00, 0x00, 0x6e, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x6f, 0xe2, 0x00
+ ,0x00, 0x08, 0xff, 0xff, 0xb9, 0x9b, 0xef, 0xff, 0xc0, 0x00, 0x00, 0x00, 0xbf, 0xfa, 0x00
+ ,0x00, 0x4f, 0xff, 0x70, 0x00, 0x00, 0x05, 0xef, 0xf8, 0x00, 0x00, 0x00, 0x0c, 0xff, 0x10
+ ,0x00, 0xdf, 0xf3, 0x00, 0x00, 0x00, 0x00, 0x1e, 0xff, 0x10, 0x00, 0x00, 0x06, 0xff, 0x50
+ ,0x03, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0x50, 0x00, 0x00, 0x04, 0xff, 0x60
+ ,0x05, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0x70, 0x00, 0x00, 0x04, 0xff, 0x60
+ ,0x06, 0xff, 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0x70, 0x00, 0x00, 0x07, 0xff, 0x40
+ ,0x04, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0x40, 0x00, 0x00, 0x0d, 0xfe, 0x00
+ ,0x00, 0xef, 0xe2, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xfd, 0x00, 0x00, 0x00, 0x9f, 0xf8, 0x00
+ ,0x00, 0x7f, 0xfd, 0x30, 0x00, 0x00, 0x00, 0x7f, 0xf4, 0x00, 0x00, 0x1a, 0xff, 0xd1, 0x00
+ ,0x00, 0x0b, 0xff, 0xfb, 0x52, 0x00, 0x08, 0xff, 0x60, 0x13, 0x6a, 0xff, 0xfe, 0x20, 0x00
+ ,0x00, 0x00, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xc2, 0x00, 0x00
+ ,0x00, 0x00, 0x04, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc5, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x02, 0x69, 0xcd, 0xef, 0xff, 0xed, 0xb9, 0x62, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ };
+#endif
+
+// **********************
+// **********************
+// ** THE JUMP-IN CODE **
+// ** for the asm code **
+// **********************
+// **********************
+#pragma code main_calc_hauptroutine = 0x10000
+void main_calc_hauptroutine(void)
+{
+calc_hauptroutine();
+int_O_desaturation_time = 65535;
+} // divemode
+#pragma code main_without_deco = 0x10020
+void main_calc_without_deco(void)
+{
+calc_without_deco();
+calc_desaturation_time();
+}
+
+#pragma code main_clear_CNS_fraction = 0x10030
+void main_clear_CNS_fraction(void)
+{
+clear_CNS_fraction();
+}
+
+#pragma code main_calc_CNS_decrease_15min = 0x10034
+void main_calc_CNS_decrease_15min(void)
+{
+calc_CNS_decrease_15min();
+}
+
+#pragma code main_calc_percentage = 0x10038
+void main_calc_percentage (void)
+{
+calc_percentage();
+}
+
+#pragma code main_clear_tissue = 0x10040
+void main_clear_tissue(void)
+{
+clear_tissue();
+char_I_depth_last_deco = 0; // for compatibility with v.101pre_no_last_deco
+}
+
+#pragma code main_calc_CNS_fraction = 0x10050
+void main_calc_CNS_fraction(void)
+{
+calc_CNS_fraction();
+}
+
+#pragma code main_calc_desaturation_time = 0x10060
+void main_calc_desaturation_time(void)
+{
+calc_desaturation_time();
+}
+
+#pragma code main_calc_wo_deco_step_1_min = 0x10080
+void main_calc_wo_deco_step_1_min(void)
+{
+calc_wo_deco_step_1_min();
+char_O_deco_status = 3; // surface new in v.102 overwrites value of calc_wo_deco_step_1_min
+calc_desaturation_time();
+} // surface mode
+
+#pragma code main_debug = 0x100A0
+void main_debug(void)
+{
+//debug();
+}
+
+#pragma code main_DD2_write_incon42 = 0x100B0
+void main_DD2_write_incon42(void)
+{
+ DD2_write_incon42();
+}
+
+#pragma code main_DD2_write_incon24 = 0x100B4
+void main_DD2_write_incon24(void)
+{
+ DD2_write_incon24();
+}
+
+#pragma code main_gradient_array = 0x100C0
+void main_gradient_array(void)
+{
+calc_gradient_array_only();
+}
+#pragma code main_push_tissues = 0x100C4
+void main_push_tissues_to_vault(void)
+{
+ push_tissues_to_vault();
+}
+#pragma code main_pull_tissues = 0x100C8
+void main_pull_tissues_from_vault(void)
+{
+ pull_tissues_from_vault();
+}
+
+#pragma code main_hash = 0x100E0
+void main_hash(void)
+{
+hash();
+}
+
+// ***********************
+// ***********************
+// ** THE LOOKUP TABLES **
+// ***********************
+// ***********************
+
+#pragma romdata tables = 0x10200
+#include // new table for deco_main_v.101 (var_a modified)
+
+#pragma romdata tables2 = 0x10600
+rom const rom unsigned int md_pi[] =
+{
+ 0x292E, 0x43C9, 0xA2D8, 0x7C01, 0x3D36, 0x54A1, 0xECF0, 0x0613
+ , 0x62A7, 0x05F3, 0xC0C7, 0x738C, 0x9893, 0x2BD9, 0xBC4C, 0x82CA
+ , 0x1E9B, 0x573C, 0xFDD4, 0xE016, 0x6742, 0x6F18, 0x8A17, 0xE512
+ , 0xBE4E, 0xC4D6, 0xDA9E, 0xDE49, 0xA0FB, 0xF58E, 0xBB2F, 0xEE7A
+ , 0xA968, 0x7991, 0x15B2, 0x073F, 0x94C2, 0x1089, 0x0B22, 0x5F21
+ , 0x807F, 0x5D9A, 0x5A90, 0x3227, 0x353E, 0xCCE7, 0xBFF7, 0x9703
+ , 0xFF19, 0x30B3, 0x48A5, 0xB5D1, 0xD75E, 0x922A, 0xAC56, 0xAAC6
+ , 0x4FB8, 0x38D2, 0x96A4, 0x7DB6, 0x76FC, 0x6BE2, 0x9C74, 0x04F1
+ , 0x459D, 0x7059, 0x6471, 0x8720, 0x865B, 0xCF65, 0xE62D, 0xA802
+ , 0x1B60, 0x25AD, 0xAEB0, 0xB9F6, 0x1C46, 0x6169, 0x3440, 0x7E0F
+ , 0x5547, 0xA323, 0xDD51, 0xAF3A, 0xC35C, 0xF9CE, 0xBAC5, 0xEA26
+ , 0x2C53, 0x0D6E, 0x8528, 0x8409, 0xD3DF, 0xCDF4, 0x4181, 0x4D52
+ , 0x6ADC, 0x37C8, 0x6CC1, 0xABFA, 0x24E1, 0x7B08, 0x0CBD, 0xB14A
+ , 0x7888, 0x958B, 0xE363, 0xE86D, 0xE9CB, 0xD5FE, 0x3B00, 0x1D39
+ , 0xF2EF, 0xB70E, 0x6658, 0xD0E4, 0xA677, 0x72F8, 0xEB75, 0x4B0A
+ , 0x3144, 0x50B4, 0x8FED, 0x1F1A, 0xDB99, 0x8D33, 0x9F11, 0x8314
+};
+
+// *********************
+// *********************
+// ** THE SUBROUTINES **
+// *********************
+// *********************
+
+#pragma code subroutines = 0x10700 // can be adapted to fit the romdata tables ahead
+
+
+// ---------------
+// CLEAR tissue //
+// ---------------
+// optimized in v.101 (var_a)
+
+void clear_tissue(void) // preload tissues with standard pressure for the given ambient pressure
+{
+_asm
+lfsr 1, 0x300 // C math routines shall use this variable bank
+movlw 0x01
+movwf TBLPTRU,0
+_endasm
+
+// N2_ratio = (float)char_I_N2_ratio; // the 0.0002 of 0.7902 are missing with standard air
+ N2_ratio = 0.7902; // N2_ratio / 100.0;
+ pres_respiration = (float)int_I_pres_respiration / 1000.0;
+for (ci=0;ci<16;ci++) // cycle through the 16 b"uhlmann tissues
+{
+ pres_tissue[ci] = N2_ratio * (pres_respiration - 0.0627) ;
+_asm
+movlw 0x02
+movwf TBLPTRH,0
+movlb 4 // fuer ci
+movf ci,0,1
+addwf ci,0,1
+addwf ci,0,1
+addwf ci,0,1
+addlw 0x80
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var_a+1
+TBLRDPOSTINC
+movff TABLAT,var_a
+TBLRDPOSTINC
+movff TABLAT,var_a+3
+TBLRD
+movff TABLAT,var_a+2
+addlw 0x80
+movwf TBLPTRL,0
+incf TBLPTRH,1,0
+TBLRDPOSTINC
+movff TABLAT,var_b+1
+TBLRDPOSTINC
+movff TABLAT,var_b
+TBLRDPOSTINC
+movff TABLAT,var_b+3
+TBLRD
+movff TABLAT,var_b+2
+_endasm
+
+pres_tissue_limit[ci] = (pres_tissue[ci] - var_a) * var_b ;
+// now update the guiding tissue
+if (pres_tissue_limit[ci] < 0)
+pres_tissue_limit[ci] = 0;
+} // for 0 to 16
+
+for (ci=16;ci<32;ci++) // cycle through the 16 b"uhlmann tissues for Helium
+{
+ pres_tissue[ci] = 0.0;
+} // for
+
+ clear_decoarray();
+ char_O_deco_status = 0;
+ char_O_nullzeit = 0;
+ char_O_ascenttime = 0;
+ char_O_gradient_factor = 0;
+ char_O_relative_gradient_GF = 0;
+} // clear_tissue(void)
+
+
+// --------------------
+// calc_without_deco //
+// fixed N2_ratio ! //
+// --------------------
+// optimized in v.101 (float_..saturation_multiplier)
+
+void calc_without_deco(void)
+{
+_asm
+ lfsr 1, 0x300
+_endasm
+ N2_ratio = 0.7902; // FIXED RATIO !! sum as stated in b"uhlmann
+ pres_respiration = (float)int_I_pres_respiration / 1000.0; // assembler code uses different digit system
+ pres_surface = (float)int_I_pres_surface / 1000.0;
+ temp_atem = N2_ratio * (pres_respiration - 0.0627); // 0.0627 is the extra pressure in the body
+ temp2_atem = 0.0;
+ temp_surface = pres_surface; // the b"uhlmann formula using temp_surface does apply to the pressure without any inert ratio
+ float_desaturation_multiplier = char_I_desaturation_multiplier / 100.0;
+ float_saturation_multiplier = char_I_saturation_multiplier / 100.0;
+
+ calc_tissue(); // update the pressure in the 16 tissues in accordance with the new ambient pressure
+
+ clear_decoarray();
+ char_O_deco_status = 0;
+ char_O_nullzeit = 0;
+ char_O_ascenttime = 0;
+ calc_gradient_factor();
+
+} // calc_without_deco
+
+
+// --------------------
+// calc_hauptroutine //
+// --------------------
+// this is the major code in dive mode
+// calculates:
+// the tissues,
+// the bottom time
+// and simulates the ascend with all deco stops
+
+void calc_hauptroutine(void)
+{
+ calc_hauptroutine_data_input();
+ calc_hauptroutine_update_tissues();
+ calc_gradient_factor();
+
+
+ switch (char_O_deco_status) // toggle between calculation for nullzeit (bottom time), deco stops and more deco stops (continue)
+ {
+ case 0:
+ update_startvalues();
+ calc_nullzeit();
+ char_O_deco_status = 255; // calc deco next time
+ break;
+ case 1:
+ if (char_O_deco_status == 3)
+ break;
+ char_O_deco_status = 0;
+// char_O_lock_depth_list = 255;
+ calc_hauptroutine_calc_deco();
+// build_debug_output();
+ break;
+ case 3: // new dive
+ clear_decoarray();
+ clear_internal_deco_table_GF();
+ copy_deco_table_GF();
+ internal_deco_pointer = 0;
+ lock_GF_depth_list = 0;
+ update_startvalues();
+ calc_nextdecodepth_GF();
+ char_O_deco_status = 0;
+ break;
+ default:
+ update_startvalues();
+ clear_decoarray();
+ clear_internal_deco_table_GF();
+ output[6] = 1;
+ calc_hauptroutine_calc_ascend_to_deco();
+ if (char_O_deco_status > 15) // can't go up to first deco, too deep to calculate in the given time slot
+ {
+ char_O_deco_status = 2;
+// char_O_lock_depth_list = 255;
+ }
+ else
+ {
+// char_O_lock_depth_list = lock_GF_depth_list;
+ calc_hauptroutine_calc_deco();
+ }
+// build_debug_output();
+ break;
+ }
+ calc_ascenttime();
+}
+
+void calc_hauptroutine_data_input(void)
+{
+ pres_respiration = (float)int_I_pres_respiration / 1000.0;
+ pres_surface = (float)int_I_pres_surface / 1000.0;
+
+ N2_ratio = (float)char_I_N2_ratio / 100.0;; // the 0.0002 of 0.7902 are missing with standard air
+ He_ratio = (float)char_I_He_ratio / 100.0;;
+ deco_N2_ratio = (float)char_I_deco_N2_ratio / 100.0;
+ deco_He_ratio = (float)char_I_deco_He_ratio / 100.0;
+ float_deco_distance = (float)char_I_deco_distance / 100.0;
+ deco_gas_change = (float)char_I_deco_gas_change / 9.995 + pres_surface;
+ deco_gas_change = deco_gas_change + float_deco_distance;
+ const_ppO2 = (float)char_I_const_ppO2 / 100.0;
+ deco_ppO2_change = (float)char_I_deco_ppO2_change / 99.95 + pres_surface;
+ deco_ppO2_change = deco_ppO2_change + float_deco_distance;
+ deco_ppO2 = (float)char_I_deco_ppO2 / 100.0;
+ float_desaturation_multiplier = (float)char_I_desaturation_multiplier / 100.0;
+ float_saturation_multiplier = (float)char_I_saturation_multiplier / 100.0;
+ GF_low = (float)char_I_GF_Low_percentage / 100.0;
+ GF_high = (float)char_I_GF_High_percentage / 100.0;
+ GF_delta = GF_high - GF_low;
+
+ temp2 = (pres_respiration - pres_surface) / 0.29985;
+ int_temp = (int)(temp2);
+ if (int_temp < 0)
+ int_temp = 0;
+ if (int_temp > 255)
+ int_temp = 255;
+ char_O_actual_pointer = int_temp;
+
+ temp_depth_last_deco = (int)char_I_depth_last_deco;
+}
+
+void calc_hauptroutine_update_tissues(void)
+{
+ int_O_calc_tissue_call_counter = int_O_calc_tissue_call_counter + 1;
+ if (char_I_const_ppO2 == 0) // new in v.101
+ pres_diluent = pres_respiration; // new in v.101
+ else // new in v.101
+ pres_diluent = ((pres_respiration - const_ppO2)/(N2_ratio + He_ratio)); // new in v.101
+ if (pres_diluent > pres_respiration) // new in v.101
+ pres_diluent = pres_respiration; // new in v.101
+ if (pres_diluent > 0.0627) // new in v.101
+ {
+ temp_atem = N2_ratio * (pres_diluent - 0.0627); // changed in v.101
+ temp2_atem = He_ratio * (pres_diluent - 0.0627); // changed in v.101
+ char_O_diluent = (char)(pres_diluent/pres_respiration*100.0);
+ }
+ else // new in v.101
+ {
+ temp_atem = 0.0; // new in v.101
+ temp2_atem = 0.0; // new in v.101
+ char_O_diluent = 0;
+ }
+ temp_surface = pres_surface;
+ calc_tissue();
+ int_O_gtissue_limit = (int)(pres_tissue_limit[char_O_gtissue_no] * 1000);
+ int_O_gtissue_press = (int)((pres_tissue[char_O_gtissue_no] + pres_tissue[char_O_gtissue_no+16]) * 1000);
+ if (char_I_deco_model == 1)
+ {
+ temp1 = temp1 * GF_high;
+ }
+ else
+ {
+ temp1 = temp_surface;
+ }
+ if (pres_gtissue_limit > temp1 && char_O_deco_status == 0) // if guiding tissue can not be exposed to surface pressure immediately
+ {
+ char_O_nullzeit = 0; // deco necessary
+ char_O_deco_status = 255; // calculate deco skip nullzeit calculation
+ }
+} // calc_hauptroutine_update_tissues
+void calc_hauptroutine_calc_deco(void)
+{
+ do
+ {
+ int_temp_decostatus = 0;
+ calc_nextdecodepth_GF();
+ if (temp_depth_limit > 0)
+ {
+ if (char_I_const_ppO2 == 0) // new in v.101
+ {
+ deco_diluent = temp_deco; // new in v.101
+ if (temp_deco > deco_gas_change)
+ {
+ calc_N2_ratio = N2_ratio;
+ calc_He_ratio = He_ratio;
+ }
+ else
+ {
+ calc_N2_ratio = deco_N2_ratio;
+ calc_He_ratio = deco_He_ratio;
+ }
+ }
+ else // new in v.101
+ {
+ calc_N2_ratio = N2_ratio;
+ calc_He_ratio = He_ratio;
+ if (temp_deco > deco_ppO2_change)
+ {
+ deco_diluent = ((temp_deco - const_ppO2)/(N2_ratio + He_ratio)); // new in v.101
+ }
+ else
+ {
+ deco_diluent = ((temp_deco - deco_ppO2)/(N2_ratio + He_ratio)); // new in v.101
+ }
+ }
+ if (deco_diluent > temp_deco) // new in v.101
+ deco_diluent = temp_deco; // new in v.101
+ if (deco_diluent > 0.0627) // new in v.101
+ {
+ temp_atem = calc_N2_ratio * (deco_diluent - 0.0627); // changed in v.101
+ temp2_atem = calc_He_ratio * (deco_diluent - 0.0627); // changed in v.101
+ }
+ else // new in v.101
+ {
+ temp_atem = 0.0; // new in v.101
+ temp2_atem = 0.0; // new in v.101
+ }
+ sim_tissue_1min();
+ update_internal_deco_table_GF();
+ temp_decotime = 1;
+ update_decoarray();
+ char_O_deco_status = char_O_deco_status + 1;
+ if (char_O_deco_status < 16)
+ int_temp_decostatus = 1;
+ }
+ else // if (temp_depth_limit > 0)
+ {
+ char_O_deco_status = 0;
+ }
+ } while (int_temp_decostatus == 1);
+ if (char_O_deco_status > 15)
+ {
+ char_O_deco_status = 1;
+ }
+ else
+ {
+ copy_deco_table_GF();
+ char_O_deco_status = 0;
+ }
+}
+
+void calc_hauptroutine_calc_ascend_to_deco(void)
+{
+ update_startvalues();
+ char_O_deco_status = 0;
+ temp_deco = pres_respiration;
+ lock_GF_depth_list = 1; // new in v.102
+ do // go up to first deco
+ {
+ int_temp_decostatus = 0;
+ temp_deco = temp_deco - 1.0;
+ if ( char_I_deco_model == 1) // new in v.102 , 4 = deep stops
+ temp_limit = temp_pres_gtissue_limit_GF_low;
+ else
+ temp_limit = temp_pres_gtissue_limit;
+ if ((temp_deco > temp_limit) && (temp_deco > pres_surface)) // changes in v.102
+ {
+ lock_GF_depth_list = 0; // new in v.102, distance to first stop > 10 mtr.
+ output[6] = 0;
+ if (char_I_const_ppO2 == 0) // new in v.101 // calculate at half of the ascent
+ {
+ deco_diluent = temp_deco + 0.5; // new in v.101
+ if (temp_deco + 0.5 > deco_gas_change)
+ {
+ calc_N2_ratio = N2_ratio;
+ calc_He_ratio = He_ratio;
+ }
+ else
+ {
+ calc_N2_ratio = deco_N2_ratio;
+ calc_He_ratio = deco_He_ratio;
+ }
+ }
+ else // new in v.101
+ {
+ calc_N2_ratio = N2_ratio;
+ calc_He_ratio = He_ratio;
+ if (temp_deco + 0.5 > deco_ppO2_change)
+ deco_diluent = ((temp_deco + 0.5 - const_ppO2)/(N2_ratio + He_ratio)); // new in v.101 // calculate at half of the ascent
+ else
+ deco_diluent = ((temp_deco + 0.5 - deco_ppO2)/(N2_ratio + He_ratio)); // new in v.101 // calculate at half of the ascent
+ if (deco_diluent > (temp_deco +0.5)) // new in v.101
+ deco_diluent = temp_deco + 0.5; // new in v.101 // calculate at half of the ascent
+ }
+ if (deco_diluent > 0.0627) // new in v.101
+ {
+ temp_atem = calc_N2_ratio * (deco_diluent - 0.0627); // changed in v.101
+ temp2_atem = calc_He_ratio * (deco_diluent - 0.0627); // changed in v.101
+ }
+ else // new in v.101
+ {
+ temp_atem = 0.0; // new in v.101
+ temp2_atem = 0.0; // new in v.101
+ }
+ sim_tissue_1min();
+ char_O_deco_status = char_O_deco_status + 1;
+ if (char_O_deco_status < 16) // 16 is the limit of calculations for one time slot
+ int_temp_decostatus = 1;
+ }
+ } while (int_temp_decostatus == 1);
+} // calc_hauptroutine_calc_ascend_to_deco
+
+// --------------
+// calc_tissue //
+// --------------
+// optimized in v.101
+
+void calc_tissue(void)
+{
+_asm
+lfsr 1, 0x300
+movlw 0x01
+movwf TBLPTRU,0
+_endasm
+
+ char_O_gtissue_no = 255;
+ pres_gtissue_limit = 0.0;
+
+for (ci=0;ci<16;ci++)
+{
+_asm
+movlw 0x02
+movwf TBLPTRH,0
+movlb 4 // fuer ci
+movf ci,0,1
+addwf ci,0,1
+addwf ci,0,1
+addwf ci,0,1
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var_e2secs+1 // the order is confussing
+TBLRDPOSTINC
+movff TABLAT,var_e2secs // low byte first, high afterwards
+TBLRDPOSTINC
+movff TABLAT,var_e2secs+3
+TBLRD
+movff TABLAT,var_e2secs+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var2_e2secs+1
+TBLRDPOSTINC
+movff TABLAT,var2_e2secs
+TBLRDPOSTINC
+movff TABLAT,var2_e2secs+3
+TBLRD
+movff TABLAT,var2_e2secs+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var_a+1
+TBLRDPOSTINC
+movff TABLAT,var_a
+TBLRDPOSTINC
+movff TABLAT,var_a+3
+TBLRD
+movff TABLAT,var_a+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var2_a+1
+TBLRDPOSTINC
+movff TABLAT,var2_a
+TBLRDPOSTINC
+movff TABLAT,var2_a+3
+TBLRD
+movff TABLAT,var2_a+2
+addlw 0x40
+movwf TBLPTRL,0
+incf TBLPTRH,1,0
+TBLRDPOSTINC
+movff TABLAT,var_b+1
+TBLRDPOSTINC
+movff TABLAT,var_b
+TBLRDPOSTINC
+movff TABLAT,var_b+3
+TBLRD
+movff TABLAT,var_b+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var2_b+1
+TBLRDPOSTINC
+movff TABLAT,var2_b
+TBLRDPOSTINC
+movff TABLAT,var2_b+3
+TBLRD
+movff TABLAT,var2_b+2
+_endasm
+ // the start values are the previous end values // write new values in temp
+
+// N2
+ temp_tissue = (temp_atem - pres_tissue[ci]) * var_e2secs;
+ temp_tissue_safety();
+ pres_tissue[ci] = pres_tissue[ci] + temp_tissue;
+
+// He
+ temp_tissue = (temp2_atem - pres_tissue[ci+16]) * var2_e2secs;
+ temp_tissue_safety();
+ pres_tissue[ci+16] = pres_tissue[ci+16] + temp_tissue;
+
+ temp_tissue = pres_tissue[ci] + pres_tissue[ci+16];
+
+ var_a = (var_a * pres_tissue[ci] + var2_a * pres_tissue[ci+16]) / temp_tissue;
+ var_b = (var_b * pres_tissue[ci] + var2_b * pres_tissue[ci+16]) / temp_tissue;
+ pres_tissue_limit[ci] = (temp_tissue - var_a) * var_b;
+ if (pres_tissue_limit[ci] < 0)
+ pres_tissue_limit[ci] = 0;
+ if (pres_tissue_limit[ci] > pres_gtissue_limit)
+ {
+ pres_gtissue_limit = pres_tissue_limit[ci];
+ char_O_gtissue_no = ci;
+ }//if
+} // for
+}//calc_tissue(void)
+
+// ----------------
+// calc_nullzeit //
+// ----------------
+// calculates the remaining bottom time
+
+// unchanged in v.101
+
+void calc_nullzeit(void)
+{
+ char_O_nullzeit = 0;
+ int_temp = 1;
+ do
+ {
+ backup_sim_pres_tissue();
+ sim_tissue_10min();
+ char_O_nullzeit = char_O_nullzeit + 10;
+ int_temp = int_temp + 1;
+ if (char_I_deco_model == 1)
+ temp1 = GF_high * temp_pres_gtissue_diff + temp_pres_gtissue;
+ else
+ temp1 = temp_pres_gtissue_limit;
+ if (temp1 > temp_surface) // changed in v.102 , if guiding tissue can not be exposed to surface pressure immediately
+ int_temp = 255;
+ } while (int_temp < 17);
+ if (int_temp == 255)
+ {
+ restore_sim_pres_tissue();
+ char_O_nullzeit = char_O_nullzeit - 10;
+ } //if int_temp == 255]
+ int_temp = 1;
+ if (char_O_nullzeit < 60)
+ {
+ do
+ {
+ sim_tissue_1min();
+ char_O_nullzeit = char_O_nullzeit + 1;
+ int_temp = int_temp + 1; // new in v.102a
+ if (char_I_deco_model == 1)
+ temp1 = GF_high * temp_pres_gtissue_diff + temp_pres_gtissue;
+ else
+ temp1 = temp_pres_gtissue_limit;
+ if (temp1 > temp_surface) // changed in v.102 , if guiding tissue can not be exposed to surface pressure immediately
+ int_temp = 255;
+ } while (int_temp < 10);
+ if (int_temp == 255)
+ char_O_nullzeit = char_O_nullzeit - 1;
+ } // if char_O_nullzeit < 60
+} //calc_nullzeit
+
+// -------------------------
+// backup_sim_pres_tissue //
+// -------------------------
+void backup_sim_pres_tissue(void)
+{
+ for (x = 0;x<16;x++)
+ {
+ sim_pres_tissue_backup[x] = sim_pres_tissue[x];
+ sim_pres_tissue_backup[x+16] = sim_pres_tissue[x+16];
+ }
+} // backup_sim
+
+// --------------------------
+// restore_sim_pres_tissue //
+// --------------------------
+void restore_sim_pres_tissue(void)
+{
+ for (x = 0;x<16;x++)
+ {
+ sim_pres_tissue[x] = sim_pres_tissue_backup[x];
+ sim_pres_tissue[x+16] = sim_pres_tissue_backup[x+16];
+ }
+} // restore_sim
+
+// ------------------
+// calc_ascenttime //
+// ------------------
+
+void calc_ascenttime(void)
+{
+if (pres_respiration > pres_surface)
+ {
+ switch (char_O_deco_status)
+ {
+ case 2:
+ char_O_ascenttime = 255;
+ break;
+ case 1:
+ break;
+ default:
+ temp1 = pres_respiration - pres_surface + 0.6; // + 0.6 hence 1 minute ascent time from a depth of 4 meter on
+ if (temp1 < 0)
+ temp1 = 0;
+ if (temp1 > 255)
+ temp1 = 255;
+ char_O_ascenttime = (char)temp1;
+
+ for(ci=0;ci<7;ci++)
+ {
+ x = char_O_ascenttime + char_O_array_decotime[ci];
+ if (x < char_O_ascenttime)
+ char_O_ascenttime = 255;
+ else
+ char_O_ascenttime = x;
+ }
+ }
+ }
+else
+ char_O_ascenttime = 0;
+} // calc_ascenttime()
+
+
+// ---------------------
+// update_startvalues //
+// ---------------------
+// updated in v.102
+
+void update_startvalues(void)
+{
+ temp_pres_gtissue_limit = pres_gtissue_limit;
+ temp_pres_gtissue = pres_tissue[char_O_gtissue_no] + pres_tissue[char_O_gtissue_no+16];
+ temp_pres_gtissue_diff = temp_pres_gtissue_limit - temp_pres_gtissue; // negative number
+ temp_pres_gtissue_limit_GF_low = GF_low * temp_pres_gtissue_diff + temp_pres_gtissue;
+ temp_pres_gtissue_limit_GF_low_below_surface = temp_pres_gtissue_limit_GF_low - pres_surface;
+ if (temp_pres_gtissue_limit_GF_low_below_surface < 0)
+ temp_pres_gtissue_limit_GF_low_below_surface = 0;
+
+ temp_gtissue_no = char_O_gtissue_no;
+ for (x = 0;x<16;x++)
+ {
+ sim_pres_tissue[x] = pres_tissue[x];
+ sim_pres_tissue[x+16] = pres_tissue[x+16];
+ sim_pres_tissue_limit[x] = pres_tissue_limit[x];
+ }
+} // update_startvalues
+
+
+// ------------------
+// sim_tissue_1min //
+// ------------------
+// optimized in v.101
+
+void sim_tissue_1min(void)
+{
+temp_pres_gtissue_limit = 0.0;
+temp_gtissue_no = 255;
+
+_asm
+lfsr 1, 0x300
+movlw 0x01
+movwf TBLPTRU,0
+_endasm
+
+
+for (ci=0;ci<16;ci++)
+{
+_asm
+movlw 0x02
+movwf TBLPTRH,0
+movlb 4 // fuer ci
+movf ci,0,1
+addwf ci,0,1
+addwf ci,0,1
+addwf ci,0,1
+addlw 0x80
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var_a+1
+TBLRDPOSTINC
+movff TABLAT,var_a
+TBLRDPOSTINC
+movff TABLAT,var_a+3
+TBLRD
+movff TABLAT,var_a+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var2_a+1
+TBLRDPOSTINC
+movff TABLAT,var2_a
+TBLRDPOSTINC
+movff TABLAT,var2_a+3
+TBLRD
+movff TABLAT,var2_a+2
+addlw 0x40
+movwf TBLPTRL,0
+incf TBLPTRH,1,0
+TBLRDPOSTINC
+movff TABLAT,var_b+1
+TBLRDPOSTINC
+movff TABLAT,var_b
+TBLRDPOSTINC
+movff TABLAT,var_b+3
+TBLRD
+movff TABLAT,var_b+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var2_b+1
+TBLRDPOSTINC
+movff TABLAT,var2_b
+TBLRDPOSTINC
+movff TABLAT,var2_b+3
+TBLRD
+movff TABLAT,var2_b+2
+addlw 0xC0
+movwf TBLPTRL,0
+incf TBLPTRH,1,0
+TBLRDPOSTINC
+movff TABLAT,var_e1min+1
+TBLRDPOSTINC
+movff TABLAT,var_e1min
+TBLRDPOSTINC
+movff TABLAT,var_e1min+3
+TBLRD
+movff TABLAT,var_e1min+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var2_e1min+1
+TBLRDPOSTINC
+movff TABLAT,var2_e1min
+TBLRDPOSTINC
+movff TABLAT,var2_e1min+3
+TBLRD
+movff TABLAT,var2_e1min+2
+_endasm
+// N2
+ temp_tissue = (temp_atem - sim_pres_tissue[ci]) * var_e1min;
+ temp_tissue_safety();
+ sim_pres_tissue[ci] = sim_pres_tissue[ci] + temp_tissue;
+// He
+ temp_tissue = (temp2_atem - sim_pres_tissue[ci+16]) * var2_e1min;
+ temp_tissue_safety();
+ sim_pres_tissue[ci+16] = sim_pres_tissue[ci+16] + temp_tissue;
+// pressure limit
+ temp_tissue = sim_pres_tissue[ci] + sim_pres_tissue[ci+16];
+ var_a = (var_a * sim_pres_tissue[ci] + var2_a * sim_pres_tissue[ci+16]) / temp_tissue;
+ var_b = (var_b * sim_pres_tissue[ci] + var2_b * sim_pres_tissue[ci+16]) / temp_tissue;
+ sim_pres_tissue_limit[ci] = (temp_tissue - var_a) * var_b;
+
+ if (sim_pres_tissue_limit[ci] < 0)
+ sim_pres_tissue_limit[ci] = 0;
+ if (sim_pres_tissue_limit[ci] > temp_pres_gtissue_limit)
+ {
+ temp_pres_gtissue = temp_tissue;
+ temp_pres_gtissue_limit = sim_pres_tissue_limit[ci];
+ temp_gtissue_no = ci;
+ }
+} // for
+ temp_pres_gtissue_diff = temp_pres_gtissue_limit - temp_pres_gtissue;
+ temp_pres_gtissue_limit_GF_low = GF_low * temp_pres_gtissue_diff + temp_pres_gtissue;
+ temp_pres_gtissue_limit_GF_low_below_surface = temp_pres_gtissue_limit_GF_low - pres_surface;
+ if (temp_pres_gtissue_limit_GF_low_below_surface < 0)
+ temp_pres_gtissue_limit_GF_low_below_surface = 0;
+} //sim_tissue_1min()
+
+//--------------------
+// sim_tissue_10min //
+//--------------------
+
+// Attention!! uses var_e1min und var2_e1min to load 10min data !!!
+// is identical to sim_tissue_1min routine except for the different load of those variables
+
+// optimized in v.101
+
+void sim_tissue_10min(void)
+{
+temp_pres_gtissue_limit = 0.0;
+temp_gtissue_no = 255;
+
+_asm
+lfsr 1, 0x300
+movlw 0x01
+movwf TBLPTRU,0
+_endasm
+
+for (ci=0;ci<16;ci++)
+{
+_asm
+movlw 0x02
+movwf TBLPTRH,0
+movlb 4 // fuer ci
+movf ci,0,1
+addwf ci,0,1
+addwf ci,0,1
+addwf ci,0,1
+addlw 0x80
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var_a+1
+TBLRDPOSTINC
+movff TABLAT,var_a
+TBLRDPOSTINC
+movff TABLAT,var_a+3
+TBLRD
+movff TABLAT,var_a+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var2_a+1
+TBLRDPOSTINC
+movff TABLAT,var2_a
+TBLRDPOSTINC
+movff TABLAT,var2_a+3
+TBLRD
+movff TABLAT,var2_a+2
+addlw 0x40
+movwf TBLPTRL,0
+incf TBLPTRH,1,0
+TBLRDPOSTINC
+movff TABLAT,var_b+1
+TBLRDPOSTINC
+movff TABLAT,var_b
+TBLRDPOSTINC
+movff TABLAT,var_b+3
+TBLRD
+movff TABLAT,var_b+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var2_b+1
+TBLRDPOSTINC
+movff TABLAT,var2_b
+TBLRDPOSTINC
+movff TABLAT,var2_b+3
+TBLRD
+movff TABLAT,var2_b+2
+addlw 0xC0 // different to 1 min
+movwf TBLPTRL,0
+incf TBLPTRH,1,0
+incf TBLPTRH,1,0 // different to 1 min
+TBLRDPOSTINC
+movff TABLAT,var_e1min+1
+TBLRDPOSTINC
+movff TABLAT,var_e1min
+TBLRDPOSTINC
+movff TABLAT,var_e1min+3
+TBLRD
+movff TABLAT,var_e1min+2
+addlw 0x40
+movwf TBLPTRL,0
+//incf TBLPTRH,1,0 // different to 1 min
+TBLRDPOSTINC
+movff TABLAT,var2_e1min+1
+TBLRDPOSTINC
+movff TABLAT,var2_e1min
+TBLRDPOSTINC
+movff TABLAT,var2_e1min+3
+TBLRD
+movff TABLAT,var2_e1min+2
+_endasm
+// N2
+ temp_tissue = (temp_atem - sim_pres_tissue[ci]) * var_e1min;
+ temp_tissue_safety();
+ sim_pres_tissue[ci] = sim_pres_tissue[ci] + temp_tissue;
+// He
+ temp_tissue = (temp2_atem - sim_pres_tissue[ci+16]) * var2_e1min;
+ temp_tissue_safety();
+ sim_pres_tissue[ci+16] = sim_pres_tissue[ci+16] + temp_tissue;
+// pressure limit
+temp_tissue = sim_pres_tissue[ci] + sim_pres_tissue[ci+16];
+ var_a = (var_a * sim_pres_tissue[ci] + var2_a * sim_pres_tissue[ci+16]) / temp_tissue;
+ var_b = (var_b * sim_pres_tissue[ci] + var2_b * sim_pres_tissue[ci+16]) / temp_tissue;
+
+sim_pres_tissue_limit[ci] = (temp_tissue - var_a) * var_b;
+ if (sim_pres_tissue_limit[ci] < 0)
+ sim_pres_tissue_limit[ci] = 0;
+ if (sim_pres_tissue_limit[ci] > temp_pres_gtissue_limit)
+ {
+ temp_pres_gtissue = temp_tissue;
+ temp_pres_gtissue_limit = sim_pres_tissue_limit[ci];
+ temp_gtissue_no = ci;
+ }
+} // for
+ temp_pres_gtissue_diff = temp_pres_gtissue_limit - temp_pres_gtissue; // negative number
+ temp_pres_gtissue_limit_GF_low = GF_low * temp_pres_gtissue_diff + temp_pres_gtissue;
+ temp_pres_gtissue_limit_GF_low_below_surface = temp_pres_gtissue_limit_GF_low - pres_surface;
+ if (temp_pres_gtissue_limit_GF_low_below_surface < 0)
+ temp_pres_gtissue_limit_GF_low_below_surface = 0;
+} //sim_tissue_10min()
+
+
+// ------------------
+// clear_decoarray //
+// ------------------
+// unchanged in v.101
+
+void clear_decoarray(void)
+{
+char_O_array_decodepth[0] = 0;
+char_O_array_decodepth[1] = 0;
+char_O_array_decodepth[2] = 0;
+char_O_array_decodepth[3] = 0;
+char_O_array_decodepth[4] = 0;
+char_O_array_decodepth[5] = 0;
+char_O_array_decotime[0] = 0;
+char_O_array_decotime[1] = 0;
+char_O_array_decotime[2] = 0;
+char_O_array_decotime[3] = 0;
+char_O_array_decotime[4] = 0;
+char_O_array_decotime[5] = 0;
+char_O_array_decotime[6] = 0;
+} // clear_decoarray
+
+
+// -------------------
+// update_decoarray //
+// -------------------
+// unchanged in v.101
+
+void update_decoarray()
+{
+ x = 0;
+ do
+ {
+ if (char_O_array_decodepth[x] == temp_depth_limit)
+ {
+ int_temp = char_O_array_decotime[x] + temp_decotime;
+ if (int_temp < 0)
+ int_temp = 0;
+ if (int_temp > 240)
+ int_temp = 240;
+ char_O_array_decotime[x] = int_temp;
+ x = 10; // exit
+ } // if
+ else
+ {
+ if (char_O_array_decodepth[x] == 0)
+ {
+ if (temp_depth_limit > 255)
+ char_O_array_decodepth[x] = 255;
+ else
+ char_O_array_decodepth[x] = (char)temp_depth_limit;
+ int_temp = char_O_array_decotime[x] + temp_decotime;
+ if (int_temp > 240)
+ char_O_array_decotime[x] = 240;
+ else
+ char_O_array_decotime[x] = (char)int_temp;
+ x = 10; // exit
+ } // if
+ else
+ x++;
+ } // else
+ } while (x<6);
+ if (x == 6)
+ {
+ int_temp = char_O_array_decotime[6] + temp_decotime;
+ if (int_temp > 220)
+ char_O_array_decotime[6] = 220;
+ else
+ char_O_array_decotime[6] = (char)int_temp;
+ } // if x == 6
+} // update_decoarray
+
+
+// -----------------------
+// calc_gradient_factor //
+// -----------------------
+// optimized in v.101 (var_a)
+// new code in v.102
+
+void calc_gradient_factor(void)
+{
+ // tissue > respiration (entsaettigungsvorgang)
+ // gradient ist wieviel prozent an limit mit basis tissue
+ // dh. 0% = respiration == tissue
+ // dh. 100% = respiration == limit
+ temp_tissue = pres_tissue[char_O_gtissue_no] + pres_tissue[char_O_gtissue_no+16];
+ temp1 = temp_tissue - pres_respiration;
+ temp2 = temp_tissue - pres_tissue_limit[char_O_gtissue_no]; // changed in v.102
+ temp2 = temp1/temp2;
+ temp2 = temp2 * 100; // displayed in percent
+ if (temp2 < 0)
+ temp2 = 0;
+ if (temp2 > 255)
+ temp2 = 255;
+ if (temp1 < 0)
+ char_O_gradient_factor = 0;
+ else
+ char_O_gradient_factor = (char)temp2;
+
+ temp3 = temp2;
+
+ if (char_I_deco_model == 1) // calculate relative gradient factor
+ {
+ temp1 = (float)temp_depth_GF_low_meter * 0.09995;
+ temp2 = pres_respiration - pres_surface;
+ if (temp2 <= 0)
+ temp1 = GF_high;
+ else
+ if (temp2 >= temp1)
+ temp1 = GF_low;
+ else
+ temp1 = GF_low + (temp1 - temp2)/temp1*GF_delta;
+ if (temp_depth_GF_low_meter == 0)
+ temp1 = GF_high;
+ temp2 = temp3 / temp1; // temp3 is already in percent
+ if (temp2 < 0)
+ temp2 = 0;
+ if (temp2 > 255)
+ temp2 = 255;
+ char_O_relative_gradient_GF = (char)temp2;
+ } // calc relative gradient factor
+ else
+ {
+ char_O_relative_gradient_GF = char_O_gradient_factor;
+ }
+} // calc_gradient
+
+// ---------------------------
+// calc_gradient_array_only //
+// ---------------------------
+// optimized in v.101 (var_a)
+// new code in v.102
+
+void calc_gradient_array_only()
+{
+ pres_respiration = (float)int_I_pres_respiration / 1000.0; // assembler code uses different digit system
+for (ci=0;ci<16;ci++)
+{
+ temp_tissue = pres_tissue[ci] + pres_tissue[ci+16];
+ temp1 = temp_tissue - pres_respiration;
+ temp2 = temp_tissue - pres_tissue_limit[ci];
+ temp2 = temp1/temp2;
+ temp2 = temp2 * 200; // because of output in (Double-)percentage
+ if (temp2 < 0)
+ temp2 = 0;
+ if (temp2 > 255)
+ temp2 = 255;
+ if (temp1 < 0)
+ char_O_array_gradient_weighted[ci] = 0;
+ else
+ char_O_array_gradient_weighted[ci] = (char)temp2;
+} // for
+} // calc_gradient_array_only
+
+
+// -------------------------
+// calc_desaturation_time //
+// -------------------------
+// FIXED N2_ratio
+// unchanged in v.101
+
+void calc_desaturation_time(void)
+{
+_asm
+lfsr 1, 0x300
+movlw 0x01
+movwf TBLPTRU,0
+_endasm
+ N2_ratio = 0.7902; // FIXED sum as stated in b"uhlmann
+ pres_surface = (float)int_I_pres_surface / 1000.0;
+ temp_atem = N2_ratio * (pres_surface - 0.0627);
+ int_O_desaturation_time = 0;
+ float_desaturation_multiplier = char_I_desaturation_multiplier / 142.0; // new in v.101 (70,42%/100.=142)
+
+for (ci=0;ci<16;ci++)
+{
+_asm
+movlw 0x04
+movwf TBLPTRH,0
+movlb 4 // fuer ci
+movf ci,0,1
+addwf ci,0,1
+addwf ci,0,1
+addwf ci,0,1
+addlw 0x80
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var_halftimes+1
+TBLRDPOSTINC
+movff TABLAT,var_halftimes
+TBLRDPOSTINC
+movff TABLAT,var_halftimes+3
+TBLRD
+movff TABLAT,var_halftimes+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var2_halftimes+1
+TBLRDPOSTINC
+movff TABLAT,var2_halftimes
+TBLRDPOSTINC
+movff TABLAT,var2_halftimes+3
+TBLRD
+movff TABLAT,var2_halftimes+2
+_endasm
+
+// saturation_time (for flight) and N2_saturation in multiples of halftime
+// version v.100: 1.1 = 10 percent distance to totally clean (totally clean is not possible, would take infinite time )
+// new in version v.101: 1.07 = 7 percent distance to totally clean (totally clean is not possible, would take infinite time )
+// changes in v.101: 1.05 = 5 percent dist to totally clean is new desaturation point for display and noFly calculations
+// N2
+ temp1 = 1.05 * temp_atem;
+ temp1 = temp1 - pres_tissue[ci];
+ temp2 = temp_atem - pres_tissue[ci];
+ if (temp2 >= 0.0)
+ {
+ temp1 = 0;
+ temp2 = 0;
+ }
+ else
+ temp1 = temp1 / temp2;
+ if (temp1 > 0.0)
+ {
+ temp1 = log(1.0 - temp1);
+ temp1 = temp1 / -0.6931; // temp1 is the multiples of half times necessary.
+ // 0.6931 is ln(2), because the math function log() calculates with a base of e not 2 as requested.
+ // minus because log is negative
+ temp2 = var_halftimes * temp1 / float_desaturation_multiplier; // time necessary (in minutes ) for complete desaturation (see comment about 10 percent) , new in v.101: float_desaturation_multiplier
+ }
+ else
+ {
+ temp1 = 0;
+ temp2 = 0;
+ }
+
+// He
+ temp3 = 0.1 - pres_tissue[ci+16];
+if (temp3 >= 0.0)
+ {
+ temp3 = 0;
+ temp4 = 0;
+ }
+ else
+ temp3 = -1.0 * temp3 / pres_tissue[ci+16];
+ if (temp3 > 0.0)
+ {
+ temp3 = log(1.0 - temp3);
+ temp3 = temp3 / -0.6931; // temp1 is the multiples of half times necessary.
+ // 0.6931 is ln(2), because the math function log() calculates with a base of e not 2 as requested.
+ // minus because log is negative
+ temp4 = var2_halftimes * temp3 / float_desaturation_multiplier; // time necessary (in minutes ) for "complete" desaturation, new in v.101 float_desaturation_multiplier
+ }
+ else
+ {
+ temp3 = 0;
+ temp4 = 0;
+ }
+
+// saturation_time (for flight)
+ if (temp4 > temp2)
+ int_temp = (int)temp4;
+ else
+ int_temp = (int)temp2;
+ if(int_temp > int_O_desaturation_time)
+ int_O_desaturation_time = int_temp;
+
+// N2 saturation in multiples of halftime for display purposes
+ temp2 = temp1 * 20.0; // 0 = 1/8, 120 = 0, 249 = 8
+ temp2 = temp2 + 80.0; // set center
+ if (temp2 < 0.0)
+ temp2 = 0.0;
+ if (temp2 > 255.0)
+ temp2 = 255.0;
+ char_O_tissue_saturation[ci] = (char)temp2;
+// He saturation in multiples of halftime for display purposes
+ temp4 = temp3 * 20.0; // 0 = 1/8, 120 = 0, 249 = 8
+ temp4 = temp4 + 80.0; // set center
+ if (temp4 < 0.0)
+ temp4 = 0.0;
+ if (temp4 > 255.0)
+ temp4 = 255.0;
+ char_O_tissue_saturation[ci+16] = (char)temp4;
+} // for
+} // calc_desaturation_time
+
+
+// --------------------------
+// calc_wo_deco_step_1_min //
+// --------------------------
+// FIXED N2 Ratio
+// optimized in v.101 (...saturation_multiplier)
+// desaturation slowed down to 70,42%
+
+void calc_wo_deco_step_1_min(void)
+{
+_asm
+ lfsr 1, 0x300
+_endasm
+ N2_ratio = 0.7902; // FIXED, sum lt. buehlmann
+ pres_respiration = (float)int_I_pres_respiration / 1000.0; // assembler code uses different digit system
+ pres_surface = (float)int_I_pres_surface / 1000.0;
+ temp_atem = N2_ratio * (pres_respiration - 0.0627); // 0.0627 is the extra pressure in the body
+ temp2_atem = 0.0;
+ temp_surface = pres_surface; // the b"uhlmann formula using temp_surface does not use the N2_ratio
+ float_desaturation_multiplier = char_I_desaturation_multiplier / 142.0; // new in v.101 (70,42%/100.=142)
+ float_saturation_multiplier = char_I_saturation_multiplier / 100.0;
+
+ calc_tissue_step_1_min(); // update the pressure in the 16 tissues in accordance with the new ambient pressure
+ clear_decoarray();
+ char_O_deco_status = 0;
+ char_O_nullzeit = 0;
+ char_O_ascenttime = 0;
+ calc_gradient_factor();
+
+} // calc_wo_deco_step_1_min(void)
+
+
+// -------------------------
+// calc_tissue_step_1_min //
+// -------------------------
+// optimized in v.101
+
+void calc_tissue_step_1_min(void)
+{
+_asm
+lfsr 1, 0x300
+movlw 0x01
+movwf TBLPTRU,0
+_endasm
+
+ char_O_gtissue_no = 255;
+ pres_gtissue_limit = 0.0;
+
+for (ci=0;ci<16;ci++)
+{
+_asm
+movlw 0x02
+movwf TBLPTRH,0
+movlb 4 // fuer ci
+movf ci,0,1
+addwf ci,0,1
+addwf ci,0,1
+addwf ci,0,1
+addlw 0x80
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var_a+1
+TBLRDPOSTINC
+movff TABLAT,var_a
+TBLRDPOSTINC
+movff TABLAT,var_a+3
+TBLRD
+movff TABLAT,var_a+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var2_a+1
+TBLRDPOSTINC
+movff TABLAT,var2_a
+TBLRDPOSTINC
+movff TABLAT,var2_a+3
+TBLRD
+movff TABLAT,var2_a+2
+addlw 0x40
+movwf TBLPTRL,0
+incf TBLPTRH,1,0
+TBLRDPOSTINC
+movff TABLAT,var_b+1
+TBLRDPOSTINC
+movff TABLAT,var_b
+TBLRDPOSTINC
+movff TABLAT,var_b+3
+TBLRD
+movff TABLAT,var_b+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var2_b+1
+TBLRDPOSTINC
+movff TABLAT,var2_b
+TBLRDPOSTINC
+movff TABLAT,var2_b+3
+TBLRD
+movff TABLAT,var2_b+2
+addlw 0xC0
+movwf TBLPTRL,0
+incf TBLPTRH,1,0
+TBLRDPOSTINC
+movff TABLAT,var_e1min+1
+TBLRDPOSTINC
+movff TABLAT,var_e1min
+TBLRDPOSTINC
+movff TABLAT,var_e1min+3
+TBLRD
+movff TABLAT,var_e1min+2
+addlw 0x40
+movwf TBLPTRL,0
+TBLRDPOSTINC
+movff TABLAT,var2_e1min+1
+TBLRDPOSTINC
+movff TABLAT,var2_e1min
+TBLRDPOSTINC
+movff TABLAT,var2_e1min+3
+TBLRD
+movff TABLAT,var2_e1min+2
+_endasm
+
+// N2 1 min
+ temp_tissue = (temp_atem - pres_tissue[ci]) * var_e1min;
+ temp_tissue_safety();
+ pres_tissue[ci] = pres_tissue[ci] + temp_tissue;
+
+// He 1 min
+ temp_tissue = (temp2_atem - pres_tissue[ci+16]) * var2_e1min;
+ temp_tissue_safety();
+ pres_tissue[ci+16] = pres_tissue[ci+16] + temp_tissue;
+
+ temp_tissue = pres_tissue[ci] + pres_tissue[ci+16];
+ var_a = (var_a * pres_tissue[ci] + var2_a * pres_tissue[ci+16]) / temp_tissue;
+ var_b = (var_b * pres_tissue[ci] + var2_b * pres_tissue[ci+16]) / temp_tissue;
+ pres_tissue_limit[ci] = (temp_tissue - var_a) * var_b;
+ if (pres_tissue_limit[ci] < 0)
+ pres_tissue_limit[ci] = 0;
+ if (pres_tissue_limit[ci] > pres_gtissue_limit)
+ {
+ pres_gtissue_limit = pres_tissue_limit[ci];
+ char_O_gtissue_no = ci;
+ }//if
+
+// gradient factor array for graphical display
+// display range is 0 to 250! in steps of 5 for 1 pixel
+// the display is divided in 6 blocks
+// -> double the gradient 100% = 200
+// tissue > respiration (entsaettigungsvorgang)
+// gradient ist wieviel prozent an limit von tissue aus
+// dh. 0% = respiration == tissue
+// dh. 100% = respiration == limit
+temp1 = temp_tissue - pres_respiration;
+temp2 = temp_tissue - pres_tissue_limit[ci]; // changed in v.102
+temp2 = temp1/temp2;
+temp2 = temp2 * 200; // because of output in (Double-)percentage
+if (temp2 < 0)
+ temp2 = 0;
+if (temp2 > 255)
+ temp2 = 255;
+if (temp1 < 0)
+ char_O_array_gradient_weighted[ci] = 0;
+else
+ char_O_array_gradient_weighted[ci] = (char)temp2;
+
+} // for
+} // calc wo deco 1min
+
+#if 0
+// --------
+// debug //
+// --------
+void debug(void)
+{
+for (ci=0;ci<32;ci++)
+{
+ int_O_tissue_for_debug[ci] = (unsigned int)(pres_tissue[ci] *1000);
+}
+} // void debug(void)
+#endif
+
+// ----------
+// md hash //
+// ----------
+void hash(void)
+{
+// init
+ for (md_i=0;md_i<16;md_i++)
+ {
+ md_state[md_i] = 0;
+ md_cksum[md_i] = 0;
+ } // for md_i 16
+
+_asm
+ movlw 0x01
+ movwf TBLPTRU,0
+ movlw 0x06
+ movwf TBLPTRH,0
+ movlw 0x00
+ movwf TBLPTRL,0
+_endasm
+ for (md_i=0;md_i<127;md_i++)
+ {
+_asm
+ TBLRDPOSTINC
+ movff TABLAT,md_temp
+_endasm
+ md_pi_subst[md_i] = md_temp;
+ } // for md_i 256
+_asm
+ TBLRDPOSTINC
+ movff TABLAT,md_temp
+_endasm
+ md_pi_subst[127] = md_temp;
+ for (md_i=0;md_i<127;md_i++)
+ {
+_asm
+ TBLRDPOSTINC
+ movff TABLAT,md_temp
+_endasm
+ md_pi_subst[md_i+128] = md_temp;
+ } // for md_i 256
+_asm
+ TBLRD
+ movff TABLAT,md_temp
+_endasm
+ md_pi_subst[255] = md_temp;
+
+_asm
+ movlw 0x00
+ movwf TBLPTRU,0
+ movlw 0x00
+ movwf TBLPTRH,0
+ movlw 0x00
+ movwf TBLPTRL,0
+_endasm
+// cycle buffers
+for (md_pointer=0x0000;md_pointer<0x17f3;md_pointer++)
+{
+ md_t = 0;
+ for (md_i=0;md_i<16;md_i++)
+ {
+ if(md_pointer == 9)
+ md_temp = md_cksum[md_i];
+ else
+ {
+_asm
+ TBLRDPOSTINC
+ movff TABLAT,md_temp
+_endasm
+ } // else
+ md_buffer[md_i] = md_temp;
+ md_state[md_i+16] = md_buffer[md_i];
+ md_state[md_i+32] = (unsigned char)(md_buffer[md_i] ^ md_state[md_i]);
+ } // for md_i 16
+
+ for (md_i=0;md_i<18;md_i++)
+ {
+ for (md_j=0;md_j<48;md_j++)
+ {
+ md_state[md_j] = (unsigned char)(md_state[md_j] ^ md_pi_subst[md_t]);
+ md_t = md_state[md_j];
+ } // for md_j 48
+ md_t = (unsigned char)(md_t+1);
+ } // for md_i 18
+ md_t = md_cksum[15];
+
+ for (md_i=0;md_i<16;md_i++)
+ {
+ md_cksum[md_i] = (unsigned char)(md_cksum[md_i] ^ md_pi_subst[(md_buffer[md_i] ^ md_t)]);
+ md_t = md_cksum[md_i];
+ } // for md_i 16
+} // for md_pointer
+} // void hash(void)
+
+// ---------------------
+// clear_CNS_fraction //
+// ---------------------
+// new in v.101
+
+void clear_CNS_fraction(void)
+{
+ CNS_fraction = 0.0;
+ char_O_CNS_fraction = 0;
+} // void clear_CNS_fraction(void)
+
+
+// --------------------
+// calc_CNS_fraction //
+// --------------------
+// new in v.101
+// optimized in v.102 : with new variables char_I_actual_ppO2 and actual_ppO2
+
+// Input: char_I_actual_ppO2
+// Output: char_O_CNS_fraction
+// Uses and Updates: CNS_fraction
+// Uses: acutal_ppO2
+
+void calc_CNS_fraction(void)
+{
+ actual_ppO2 = (float)char_I_actual_ppO2 / 100.0;
+
+ if (char_I_actual_ppO2 < 50)
+ CNS_fraction = CNS_fraction;// no changes
+ else if (char_I_actual_ppO2 < 60)
+ CNS_fraction = 1/(-54000.0 * actual_ppO2 + 54000.0) + CNS_fraction;
+ else if (char_I_actual_ppO2 < 70)
+ CNS_fraction = 1/(-45000.0 * actual_ppO2 + 48600.0) + CNS_fraction;
+ else if (char_I_actual_ppO2 < 80)
+ CNS_fraction = 1/(-36000.0 * actual_ppO2 + 42300.0) + CNS_fraction;
+ else if (char_I_actual_ppO2 < 90)
+ CNS_fraction = 1/(-27000.0 * actual_ppO2 + 35100.0) + CNS_fraction;
+ else if (char_I_actual_ppO2 < 110)
+ CNS_fraction = 1/(-18000.0 * actual_ppO2 + 27000.0) + CNS_fraction;
+ else if (char_I_actual_ppO2 < 150)
+ CNS_fraction = 1/(-9000.0 * actual_ppO2 + 17100.0) + CNS_fraction;
+ else if (char_I_actual_ppO2 < 160)
+ CNS_fraction = 1/(-22500.0 * actual_ppO2 + 37350.0) + CNS_fraction;
+ else if (char_I_actual_ppO2 < 165)
+ CNS_fraction = 0.000755 + CNS_fraction; // Arieli et all.(2002): Modeling pulmonary and CNS O2 toxicity... Formula (A1) based on value for 1.55 and c=20
+ else if (char_I_actual_ppO2 < 170)
+ CNS_fraction = 0.00102 + CNS_fraction; // example calculation: Sqrt((1.7/1.55)^20)*0.000404
+ else if (char_I_actual_ppO2 < 175)
+ CNS_fraction = 0.00136 + CNS_fraction;
+ else if (char_I_actual_ppO2 < 180)
+ CNS_fraction = 0.00180 + CNS_fraction;
+ else if (char_I_actual_ppO2 < 185)
+ CNS_fraction = 0.00237 + CNS_fraction;
+ else if (char_I_actual_ppO2 < 190)
+ CNS_fraction = 0.00310 + CNS_fraction;
+ else if (char_I_actual_ppO2 < 195)
+ CNS_fraction = 0.00401 + CNS_fraction;
+ else if (char_I_actual_ppO2 < 200)
+ CNS_fraction = 0.00517 + CNS_fraction;
+ else if (char_I_actual_ppO2 < 230)
+ CNS_fraction = 0.0209 + CNS_fraction;
+ else
+ CNS_fraction = 0.0482 + CNS_fraction; // value for 2.5
+
+ if (CNS_fraction > 2.5)
+ CNS_fraction = 2.5;
+ if (CNS_fraction < 0.0)
+ CNS_fraction = 0.0;
+ char_O_CNS_fraction = (char)((CNS_fraction + 0.005)* 100.0);
+} // void calc_CNS_fraction(void)
+
+// --------------------------
+// calc_CNS_decrease_15min //
+// --------------------------
+// new in v.101
+
+// calculates the half time of 90 minutes in 6 steps of 15 min
+
+// Output: char_O_CNS_fraction
+// Uses and Updates: CNS_fraction
+
+void calc_CNS_decrease_15min(void)
+{
+ CNS_fraction = 0.890899 * CNS_fraction;
+ char_O_CNS_fraction = (char)((CNS_fraction + 0.005)* 100.0);
+}// calc_CNS_decrease_15min(void)
+
+
+// ------------------
+// calc_percentage //
+// ------------------
+// new in v.101
+
+// calculates int_I_temp * char_I_temp / 100
+// output is int_I_temp
+
+void calc_percentage(void)
+{
+ temp1 = (float)int_I_temp;
+ temp2 = (float)char_I_temp / 100.0;
+ temp3 = temp1 * temp2;
+ int_I_temp = (int)temp3;
+}
+void push_tissues_to_vault(void)
+{
+ for (ci=0;ci<32;ci++)
+ pres_tissue_vault[ci] = pres_tissue[ci];
+}
+void pull_tissues_from_vault(void)
+{
+ for (ci=0;ci<32;ci++)
+ pres_tissue[ci] = pres_tissue_vault[ci];
+}
diff -r 000000000000 -r 96a35aeda5f2 code_part1/OSTC_code_c_part2/p2_tables.romdata
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/code_part1/OSTC_code_c_part2/p2_tables.romdata Tue Jan 12 15:05:59 2010 +0100
@@ -0,0 +1,363 @@
+
+// OSTC - diving computer code
+// Copyright (C) 2008 HeinrichsWeikamp GbR
+
+// 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 3 of the License, or
+// (at your option) any later version.
+
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// 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, see .
+
+
+/*
+INHALT
+------
+{ unsigned int *rom e2secs[];
+{ unsigned int *rom a_N2[];
+{ unsigned int *rom b_N2[];
+{ unsigned int *rom t05[]; formated: und zwar t05 * -1.0 / ln(2)
+{ unsigned int *rom e1min[];
+{ unsigned int *rom ht[]; t05 unmodified
+*/
+
+
+rom const unsigned int e2secs[] =
+{
+// N2
+ 0x07BB, 0xBC3B, 0xD0FF, 0x3C3B, 0xF80C, 0xF23A, 0x4997, 0xA33A
+, 0xE93A, 0x603A, 0x0418, 0x1E3A, 0x9009, 0xDF39, 0x014C, 0x9D39
+, 0xE53E, 0x5E39, 0x3AED, 0x2539, 0x338D, 0x0139, 0xC6BA, 0xCA38
+, 0x82DC, 0x9E38, 0x844D, 0x7838, 0x9F9D, 0x4238, 0x34AC, 0x1838
+// He
+, 0xA3C9, 0x783C, 0x45BD, 0xF93B, 0xCC02, 0xA03B, 0x3E44, 0x583B
+, 0x6223, 0x143B, 0x31FA, 0xD03A, 0xA46D, 0x933A, 0xDDFB, 0x4F3A
+, 0x03F8, 0x123A, 0x8D71, 0xDB39, 0xAB55, 0xAB39, 0x7712, 0x8639
+, 0xEA1E, 0x5239, 0x2C54, 0x2439, 0x37B2, 0x0039, 0xDADB, 0xC938
+/*
+Die e2secs Werte in float Notation:
+5.7596E-03, und zwar 1 - 2^(-2sec/t05)
+2.8839E-03,
+1.8467e-03,
+1.2481e-03,
+8.5537E-04,
+6.0308E-04,
+4.2541E-04,
+3.0002E-04,
+2.1195E-04,
+1.5824E-04,
+1.2355E-04,
+9.6669E-05,
+7.5751E-05,
+5.92E-05,
+4.64E-05,
+3.64E-05
+// e 2 sec He
+sim_pres_tissue_limit[0] = 0.01518479275;
+sim_pres_tissue_limit[1] = 0.007621439546;
+sim_pres_tissue_limit[2] = 0.004883145696;
+sim_pres_tissue_limit[3] = 0.003299965996;
+sim_pres_tissue_limit[4] = 0.002260409686;
+sim_pres_tissue_limit[5] = 0.00159437032;
+sim_pres_tissue_limit[6] = 0.001124788578;
+sim_pres_tissue_limit[7] = 0.0007933953673;
+sim_pres_tissue_limit[8] = 0.0005606414716;
+sim_pres_tissue_limit[9] = 0.0004185553604;
+sim_pres_tissue_limit[10] =0.0003267948866;
+sim_pres_tissue_limit[11] =0.0002557222899;
+sim_pres_tissue_limit[12] =0.0002003867723;
+sim_pres_tissue_limit[13] =0.0001567161546;
+sim_pres_tissue_limit[14] =0.0001227342122;
+sim_pres_tissue_limit[15] =9.625377675E-5
+*/
+};
+
+rom const unsigned int a_N2[] =
+{
+// N2
+ 0x6744, 0xA13F, 0x0000, 0x803F, 0xED9E, 0x5C3F, 0x5396, 0x413F
+ , 0x52B8, 0x1E3F, 0xCE19, 0x013F, 0xC1CA, 0xE13E, 0xCDCC, 0xCC3E
+ , 0x0000, 0xC03E, 0x3333, 0xB33E, 0x39B4, 0xA83E, 0x91ED, 0x9C3E
+ , 0xE926, 0x913E, 0xCBA1, 0x853E, 0xB6F3, 0x7D3E, 0xE948, 0x6E3E
+// He
+ , 0xF706, 0xDF3F, 0x2506, 0xB13F, 0x2E90, 0x983F, 0xC7DC, 0x853F
+ , 0x3108, 0x6C3F, 0x4A0C, 0x523F, 0x0C02, 0x3B3F, 0x8273, 0x263F
+ , 0xEC51, 0x183F, 0xB6F3, 0x0D3F, 0x5986, 0x083F, 0xA1D6, 0x043F
+ , 0x34A2, 0x043F, 0x6F81, 0x043F, 0x3867, 0x043F, 0xE10B, 0x033F
+
+/*
+// a of N2
+sim_pres_tissue[0] = 1.2599;
+sim_pres_tissue[1] = 1.0;
+sim_pres_tissue[2] = 0.8618;
+sim_pres_tissue[3] = 0.7562;
+sim_pres_tissue[4] = 0.6200;
+sim_pres_tissue[5] = 0.5043;
+sim_pres_tissue[6] = 0.4410;
+sim_pres_tissue[7] = 0.4000;
+sim_pres_tissue[8] = 0.3750;
+sim_pres_tissue[9] = 0.3500;
+sim_pres_tissue[10] = 0.3295;
+sim_pres_tissue[11] = 0.3065;
+sim_pres_tissue[12] = 0.2835;
+sim_pres_tissue[13] = 0.2610;
+sim_pres_tissue[14] = 0.2480;
+sim_pres_tissue[15] = 0.2327;
+// a of He
+sim_pres_tissue[16] = 1742.4 / 1000.0;
+sim_pres_tissue[17] = 1383.0 / 1000.0;
+sim_pres_tissue[18] = 1191.9 / 1000.0;
+sim_pres_tissue[19] = 1045.8 / 1000.0;
+sim_pres_tissue[20] = 9220. / 10000.0;
+sim_pres_tissue[21] = 8205. / 10000.0;
+sim_pres_tissue[22] = 7305. / 10000.0;
+sim_pres_tissue[23] = 6502. / 10000.0;
+sim_pres_tissue[24] = 5950. / 10000.0;
+sim_pres_tissue[25] = 5545. / 10000.0;
+sim_pres_tissue[26] = 5333. / 10000.0;
+sim_pres_tissue[27] = 5189. / 10000.0;
+sim_pres_tissue[28] = 5181. / 10000.0;
+sim_pres_tissue[29] = 5176. / 10000.0;
+sim_pres_tissue[30] = 5172. / 10000.0;
+sim_pres_tissue[31] = 5119. / 10000.0;
+*/
+};
+
+rom const unsigned int b_N2[] =
+{
+// N2
+0xAE47, 0x013F, 0x27C2, 0x263F, 0x19E2, 0x383F, 0xEC51, 0x483F,
+0x8E06, 0x503F, 0x10E9, 0x573F, 0x728A, 0x5E3F, 0x9318, 0x643F,
+0x55C1, 0x683F, 0x4D15, 0x6C3F, 0x0091, 0x6E3F, 0x80B7, 0x703F,
+0x789C, 0x723F, 0x8F53, 0x743F, 0xABCF, 0x753F, 0xE71D, 0x773F
+// He
+, 0x1058, 0xD93E, 0x8A1F, 0x133F, 0x5917, 0x273F, 0xA7E8, 0x383F
+, 0x6519, 0x423F, 0xFFB2, 0x4B3F, 0x41F1, 0x533F, 0xF1F4, 0x5A3F
+, 0xE02D, 0x603F, 0xB3EA, 0x633F, 0xBD52, 0x663F, 0xD044, 0x683F
+, 0xF085, 0x693F, 0x11C7, 0x6A3F, 0x88F4, 0x6B3F, 0x363C, 0x6D3F
+
+/*
+ 5050, Werte sind Einheitslos. 5050 ist in float als 0.5050
+ 6514,
+ 7222,
+ 7825,
+ 8126,
+ 8434,
+ 8693,
+ 8910,
+ 9092,
+ 9222,
+ 9319,
+ 9403,
+ 9477,
+ 9544,
+ 9602,
+ 9653
+// b
+sim_pres_tissue[16] = 0.4245;
+sim_pres_tissue[17] = 0.5747;
+sim_pres_tissue[18] = 0.6527;
+sim_pres_tissue[19] = 0.7223;
+sim_pres_tissue[20] = 0.7582;
+sim_pres_tissue[21] = 0.7957;
+sim_pres_tissue[22] = 0.8279;
+sim_pres_tissue[23] = 0.8553;
+sim_pres_tissue[24] = 0.8757;
+sim_pres_tissue[25] = 0.8903;
+sim_pres_tissue[26] = 0.8997;
+sim_pres_tissue[27] = 0.9073;
+sim_pres_tissue[28] = 0.9122;
+sim_pres_tissue[29] = 0.9171;
+sim_pres_tissue[30] = 0.9217;
+sim_pres_tissue[31] = 0.9267;
+*/
+};
+
+rom const unsigned int t05[] =
+{
+// N2
+ 0x3BAA, 0xB8C0, 0x3BAA, 0x38C1, 0xFE44, 0x90C1, 0xD484, 0xD5C1
+, 0xA2CF, 0x1BC2, 0x5805, 0x5DC2, 0x3BAD, 0x9CC2, 0xCF2C, 0xDEC2
+, 0xF640, 0x1DC3, 0x2BA2, 0x52C3, 0x59E4, 0x86C3, 0xED66, 0xACC3
+, 0xD002, 0xDCC3, 0xABA9, 0x0CC4, 0x939D, 0x33C4, 0x2007, 0x65C4
+// He
+, 0x0B6C, 0x0BC0, 0x0B6C, 0x8BC0, 0x98E7, 0xD9C0, 0xDC59, 0x21C1
+, 0xBDAD, 0x6BC1, 0x2E1F, 0xA7C1, 0xBFF2, 0xECC1, 0xC7FC, 0x27C2
+, 0x93C1, 0x6DC2, 0xA33E, 0x9FC2, 0xDEF7, 0xCBC2, 0x4455, 0x02C3
+, 0x0C54, 0x26C3, 0x9EAE, 0x54C3, 0x55C9, 0x87C3, 0x2225, 0xADC3
+/*
+4, und zwar 4.0 * -1.0 / ln(2) ...
+8,
+12,
+18,
+27,
+39,
+55,
+77,
+109,
+146,
+187,
+239,
+305,
+390,
+498,
+635
+// He; t05 * -1 /ln(2)
+pres_tissue[16] = -2.178469512;
+pres_tissue[17] = -4.356939024;
+pres_tissue[18] = -6.809520594;
+pres_tissue[19] = -10.08443834;
+pres_tissue[20] = -14.72991637;
+pres_tissue[21] = -20.89022419;
+pres_tissue[22] = -29.61852919;
+pres_tissue[23] = -41.99685264;
+pres_tissue[24] = -59.43903569;
+pres_tissue[25] = -79.62233931;
+pres_tissue[26] = -101.9841124;
+pres_tissue[27] = -130.33307;
+pres_tissue[28] = -166.3283113;
+pres_tissue[29] = -212.6821029;
+pres_tissue[30] = -271.5729145;
+pres_tissue[31] = -346.2900907;
+*/
+};
+
+// ab hier bei Speicher 0x4100
+rom const unsigned int e1min[] =
+{ // N2
+0x0EEC, 0x223E, 0xC9F9, 0xA93D, 0xA8F2, 0x5C3D, 0x8AA0, 0x163D
+, 0x23A1, 0xCF3C, 0x89EC, 0x923C, 0x9AD0, 0x4F3C, 0x52D3, 0x123C
+, 0x26B7, 0xCF3B, 0x3A33, 0x9B3B, 0x7B78, 0x723B, 0xC0CA, 0x3D3B
+, 0xD7C4, 0x143B, 0x58BF, 0xE83A, 0xA54E, 0xB63A, 0x0AFF, 0x8E3A
+// He
+, 0xBE78, 0xBC3E, 0x9001, 0x523E, 0x71DB, 0x0B3E, 0x3757, 0xC13D
+, 0x186C, 0x863D, 0x2274, 0x3F3D, 0xBAFB, 0x073D, 0x1AC2, 0xC03C
+, 0x44AB, 0x883C, 0x107C, 0x4C3C, 0x0EDE, 0x1F3C, 0x9174, 0xFA3B
+, 0xBB6A, 0xC43B, 0x6CB5, 0x993B, 0x57E0, 0x703B, 0x8FFA, 0x3C3B
+/*
+Die e1min Werte in float Notation:
+ und zwar 1 - 2^(-1/t05)
+c_2[0] = 0.1591036;
+c_2[1] = 0.08299596;
+c_2[2] = 0.053942353;
+c_2[3] = 0.036774196;
+c_2[4] = 0.02534539;
+c_2[5] = 0.017935055;
+c_2[6] = 0.012684012;
+c_2[7] = 8.961515534E-3;
+c_2[8] = 6.338971845E-3;
+c_2[9] = 4.73633146E-3;
+c_2[10] = 3.699808187E-3;
+c_2[11] = 2.89599589E-3;
+c_2[12] = 2.270033275E-3;
+c_2[13] = 1.775722E-3;
+c_2[14] = 1.390893611E-3;
+c_2[15] = 1.090974815E-3;
+// e 1 īmin He
+pres_tissue[0] = 0.368108684;
+pres_tissue[1] = 0.2050840824;
+pres_tissue[2] = 0.1365792957;
+pres_tissue[3] = 0.09440463235;
+pres_tissue[4] = 0.06563586265;
+pres_tissue[5] = 0.04674161154;
+pres_tissue[6] = 0.03319905126;
+pres_tissue[7] = 0.02353005571;
+pres_tissue[8] = 0.0166832282;
+pres_tissue[9] = 0.01248075064;
+pres_tissue[10] = 0.009757532198;
+pres_tissue[11] = 0.007643290133;
+pres_tissue[12] = 0.005994168431;
+pres_tissue[13] = 0.004690816669;
+pres_tissue[14] = 0.003675481163;
+pres_tissue[15] = 0.002883586737;
+*/
+};
+
+rom const unsigned int ht[] =
+{
+// N2
+0x0000, 0x8040, 0x0000, 0x0041, 0x0000, 0x4841, 0x0000, 0x9441
+, 0x0000, 0xD841, 0x3333, 0x1942, 0x3333, 0x5942, 0x0000, 0x9A42
+, 0x0000, 0xDA42, 0x0000, 0x1243, 0x0000, 0x3B43, 0x0000, 0x6F43
+, 0x0080, 0x9843, 0x0000, 0xC343, 0x0000, 0xF943, 0x00C0, 0x1E44
+// He
+, 0xAE47, 0xC13F, 0xAE47, 0x4140, 0x3D0A, 0x9740, 0x14AE, 0xDF40
+, 0x295C, 0x2341, 0x14AE, 0x6741, 0x713D, 0xA441, 0x48E1, 0xE841
+, 0xCDCC, 0x2442, 0x8FC2, 0x5C42, 0x4861, 0x8D42, 0x14AE, 0xB442
+, 0x7B94, 0xE642, 0x856B, 0x1343, 0x713D, 0x3C43, 0xAE07, 0x7043
+/*
+He:
+sim_pres_tissue[0] = 1.51;
+sim_pres_tissue[1] = 3.02;
+sim_pres_tissue[2] = 4.72;
+sim_pres_tissue[3] = 6.99;
+sim_pres_tissue[4] =10.21;
+sim_pres_tissue[5] =14.48;
+sim_pres_tissue[6] =20.53;
+sim_pres_tissue[7] =29.11;
+sim_pres_tissue[8] =41.20;
+sim_pres_tissue[9] =55.19;
+sim_pres_tissue[10] =70.69;
+sim_pres_tissue[11] =90.34;
+sim_pres_tissue[12] =115.29;
+sim_pres_tissue[13] =147.42;
+sim_pres_tissue[14] =188.24;
+sim_pres_tissue[15] =240.03;
+*/
+};
+
+rom const unsigned int e10min[] =
+{
+// N2
+ 0xBEBE, 0x523F, 0x855D, 0x143F, 0xEEEE, 0xD93E, 0x4CFE, 0x9F3E
+, 0x99D9, 0x673E, 0x2785, 0x293E, 0xAD6E, 0xF53D, 0x044E, 0xB03D
+, 0x8D5C, 0x7C3D, 0xCDEA, 0x3D3D, 0xB00B, 0x153D, 0x232C, 0xEA3C
+, 0x9612, 0xB83C, 0x6E4F, 0x903C, 0x8276, 0x623C, 0x9FDE, 0x313C
+// He
+, 0xE066, 0x7D3F, 0xC635, 0x663F, 0x7C0D, 0x453F, 0xEA07, 0x213F
+, 0x0953, 0xFC3E, 0xB5C4, 0xC23E, 0x1CB5, 0x923E, 0xA5F8, 0x583E
+, 0xBC90, 0x1E3E, 0x9EB7, 0xF13D, 0xC348, 0xBF3D, 0x4942, 0x973D
+, 0xD400, 0x6F3D, 0x6921, 0x3C3D, 0xF514, 0x143D, 0x982E, 0xE93C
+/*
+He: 10 min
+sim_pres_tissue[0] = 0.989851;
+sim_pres_tissue[1] = 0.899258;
+sim_pres_tissue[2] = 0.769737;
+sim_pres_tissue[3] = 0.629027;
+sim_pres_tissue[4] = 0.492821;
+sim_pres_tissue[5] = 0.380407;
+sim_pres_tissue[6] = 0.286538;
+sim_pres_tissue[7] = 0.211886;
+sim_pres_tissue[8] = 0.154849;
+sim_pres_tissue[9] = 0.118026;
+sim_pres_tissue[10] =0.0934005;
+sim_pres_tissue[11] =0.0738569;
+sim_pres_tissue[12] =0.0583504;
+sim_pres_tissue[13] =0.0459303;
+sim_pres_tissue[14] =0.0361528;
+sim_pres_tissue[15] =0.0284646;
+N2: 10 min
+sim_pres_tissue[16] = 0.823223;
+sim_pres_tissue[17] = 0.579552;
+sim_pres_tissue[18] = 0.425651;
+sim_pres_tissue[19] = 0.312487;
+sim_pres_tissue[20] = 0.226416;
+sim_pres_tissue[21] = 0.165547;
+sim_pres_tissue[22] = 0.11984;
+sim_pres_tissue[23] = 0.0860863;
+sim_pres_tissue[24] = 0.0616117;
+sim_pres_tissue[25] = 0.0463665;
+sim_pres_tissue[26] = 0.0363881;
+sim_pres_tissue[27] = 0.0285855;
+sim_pres_tissue[28] = 0.0224698;
+sim_pres_tissue[29] = 0.017616;
+sim_pres_tissue[30] = 0.0138222;
+sim_pres_tissue[31] = 0.0108563;
+*/
+};
diff -r 000000000000 -r 96a35aeda5f2 code_part1/OSTC_code_c_part2/p3_wordprocessor.o
Binary file code_part1/OSTC_code_c_part2/p3_wordprocessor.o has changed