# 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