diff --git a/LICENSE b/LICENSE
deleted file mode 100644
index 94a9ed0..0000000
--- a/LICENSE
+++ /dev/null
@@ -1,674 +0,0 @@
- 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
-.
diff --git a/README.md b/README.md
deleted file mode 100644
index 53e543b..0000000
--- a/README.md
+++ /dev/null
@@ -1,2 +0,0 @@
-# XB360ChatpadOpenKeyboard
-OpenKeyboard031 sources for the Xbox360 Chatpad MCU (PIC16F883)
diff --git a/openKeyboard031/LICENSE b/openKeyboard031/LICENSE
new file mode 100644
index 0000000..bbc0de4
--- /dev/null
+++ b/openKeyboard031/LICENSE
@@ -0,0 +1,7 @@
+Copyright 2008, 2018 OpenKeyboard Developers, Neo-Desktop, et. al
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/openKeyboard031/README.md b/openKeyboard031/README.md
new file mode 100644
index 0000000..916ccf5
--- /dev/null
+++ b/openKeyboard031/README.md
@@ -0,0 +1,12 @@
+# OpenKeyboard for the Xbox360 Chatpad
+
+This repository contains the OpenKeyboard031 sources for the Xbox360 Chatpad's processor (PIC16F883)
+
+These files were obtained while looking through a mailing list archive from 2008. They appear to be the only surviving copy of this project.
+
+The OpenKeyboard031 folder can be found in Ben Heck's video on the video titled "[Build a Retro Computer: BASIC 80's Pocket Computer](https://youtu.be/Hjdj14C_jAI?t=212)"
+
+I'm currently in the process of hacking my own chatpads and therefore the code here hasn't been tested yet.
+
+
+Feel free to open an issue if anything comes up
\ No newline at end of file
diff --git a/openKeyboard031/openKeyboard.asm b/openKeyboard031/openKeyboard.asm
new file mode 100644
index 0000000..75ff073
--- /dev/null
+++ b/openKeyboard031/openKeyboard.asm
@@ -0,0 +1,2508 @@
+; ASM code generated by mikroVirtualMachine for PIC - V. 8.0.0.0
+; Date/Time: 23/08/2008 13.42.24
+; Info: http://www.mikroe.com
+
+
+; ADDRESS OPCODE ASM
+; ----------------------------------------------
+$0000 $158A BSF PCLATH, 3
+$0001 $286B GOTO _main
+$0020 $ _exitPowerSave:
+;openKeyboard.c,123 :: void exitPowerSave(){
+;openKeyboard.c,124 :: INTCON.RBIE = 0; // disables PORTB on-change interrupt
+$0020 $118B BCF INTCON, 3
+;openKeyboard.c,125 :: }
+$0021 $0008 RETURN
+$0004 $ _interrupt:
+$0004 $00FF MOVWF STACK_15
+$0005 $0E03 SWAPF STATUS, 0
+$0006 $0183 CLRF STATUS
+$0007 $00D9 MOVWF ?saveSTATUS
+$0008 $0804 MOVF FSR, 0
+$0009 $00D8 MOVWF ?saveFSR
+$000A $080A MOVF PCLATH, 0
+$000B $00DA MOVWF ?savePCLATH
+$000C $018A CLRF PCLATH
+$000D $0870 MOVF STACK_0, 0
+$000E $00E5 MOVWF STSAVED_0
+;openKeyboard.c,442 :: void interrupt() {
+;openKeyboard.c,443 :: if (INTCON.RBIF) { // SOMETHING CHANGED ON PORTB...
+$000F $1C0B BTFSS INTCON, 0
+$0010 $2813 GOTO L_interrupt_85
+;openKeyboard.c,444 :: exitPowerSave(); // just wakeup and so some scanning...
+$0011 $2020 CALL _exitPowerSave
+;openKeyboard.c,445 :: INTCON.RBIF = 0; // clear intr flag
+$0012 $100B BCF INTCON, 0
+;openKeyboard.c,446 :: }
+$0013 $ L_interrupt_85:
+;openKeyboard.c,451 :: }
+$0013 $ L_Interrupt_end:
+$0013 $1303 BCF STATUS, RP1
+$0014 $1283 BCF STATUS, RP0
+$0015 $0865 MOVF STSAVED_0, 0
+$0016 $00F0 MOVWF STACK_0
+$0017 $085A MOVF ?savePCLATH, 0
+$0018 $008A MOVWF PCLATH
+$0019 $0858 MOVF ?saveFSR, 0
+$001A $0084 MOVWF FSR
+$001B $0E59 SWAPF ?saveSTATUS, 0
+$001C $0083 MOVWF STATUS
+$001D $0EFF SWAPF STACK_15, 1
+$001E $0E7F SWAPF STACK_15, 0
+$001F $0009 RETFIE
+$0022 $ _Mul_16x16_S:
+$0022 $1303 BCF STATUS, RP1
+$0023 $1283 BCF STATUS, RP0
+$0024 $01FB CLRF STACK_11
+$0025 $01FA CLRF STACK_10
+$0026 $01F9 CLRF STACK_9
+$0027 $3080 MOVLW 128
+$0028 $00F8 MOVWF STACK_8
+$0029 $01FD CLRF STACK_13
+$002A $1FF1 BTFSS STACK_1, 7
+$002B $2832 GOTO $+7
+$002C $09F1 COMF STACK_1, F
+$002D $09F0 COMF STACK_0, F
+$002E $0AF0 INCF STACK_0, F
+$002F $1903 BTFSC STATUS, Z
+$0030 $0AF1 INCF STACK_1, F
+$0031 $0AFD INCF STACK_13, F
+$0032 $1FF5 BTFSS STACK_5, 7
+$0033 $283A GOTO $+7
+$0034 $09F5 COMF STACK_5, F
+$0035 $09F4 COMF STACK_4, F
+$0036 $0AF4 INCF STACK_4, F
+$0037 $1903 BTFSC STATUS, Z
+$0038 $0AF5 INCF STACK_5, F
+$0039 $0AFD INCF STACK_13, F
+$003A $0CF1 RRF STACK_1, F
+$003B $0CF0 RRF STACK_0, F
+$003C $1C03 BTFSS STATUS, C
+$003D $2847 GOTO $+10
+$003E $0874 MOVF STACK_4, W
+$003F $07F9 ADDWF STACK_9, F
+$0040 $0875 MOVF STACK_5, W
+$0041 $1803 BTFSC STATUS, C
+$0042 $0F75 INCFSZ STACK_5, W
+$0043 $07FA ADDWF STACK_10, F
+$0044 $1803 BTFSC STATUS, C
+$0045 $0AFB INCF STACK_11, F
+$0046 $1003 BCF STATUS, C
+$0047 $1FF0 BTFSS STACK_0, 7
+$0048 $284F GOTO $+7
+$0049 $0874 MOVF STACK_4, W
+$004A $07FA ADDWF STACK_10, F
+$004B $1803 BTFSC STATUS, C
+$004C $0AFB INCF STACK_11, F
+$004D $0875 MOVF STACK_5, W
+$004E $07FB ADDWF STACK_11, F
+$004F $0CFB RRF STACK_11, F
+$0050 $0CFA RRF STACK_10, F
+$0051 $0CF9 RRF STACK_9, F
+$0052 $0CF8 RRF STACK_8, F
+$0053 $1C03 BTFSS STATUS, C
+$0054 $283A GOTO $-26
+$0055 $1C7D BTFSS STACK_13, 0
+$0056 $2862 GOTO $+12
+$0057 $09FB COMF STACK_11, F
+$0058 $09FA COMF STACK_10, F
+$0059 $09F9 COMF STACK_9, F
+$005A $09F8 COMF STACK_8, F
+$005B $0AF8 INCF STACK_8, F
+$005C $1903 BTFSC STATUS, Z
+$005D $0AF9 INCF STACK_9, F
+$005E $1903 BTFSC STATUS, Z
+$005F $0AFA INCF STACK_10, F
+$0060 $1903 BTFSC STATUS, Z
+$0061 $0AFB INCF STACK_11, F
+$0062 $087B MOVF STACK_11, W
+$0063 $00F3 MOVWF STACK_3
+$0064 $087A MOVF STACK_10, W
+$0065 $00F2 MOVWF STACK_2
+$0066 $0879 MOVF STACK_9, W
+$0067 $00F1 MOVWF STACK_1
+$0068 $0878 MOVF STACK_8, W
+$0069 $00F0 MOVWF STACK_0
+$006A $0000 NOP
+$006B $0008 RETURN
+$006C $ _PWM1_Start:
+$006C $1303 BCF STATUS, RP1
+$006D $1683 BSF STATUS, RP0
+$006E $1107 BCF TRISC, 2
+$006F $1283 BCF STATUS, RP0
+$0070 $1512 BSF T2CON, 2
+$0071 $300C MOVLW 12
+$0072 $0497 IORWF CCP1CON, 1
+$0073 $0008 RETURN
+$0074 $ _PWM2_Start:
+$0074 $1303 BCF STATUS, RP1
+$0075 $1683 BSF STATUS, RP0
+$0076 $1087 BCF TRISC, 1
+$0077 $1283 BCF STATUS, RP0
+$0078 $1512 BSF T2CON, 2
+$0079 $300C MOVLW 12
+$007A $049D IORWF CCP2CON, 1
+$007B $0008 RETURN
+$007C $ _PWM1_Change_Duty:
+$007C $1303 BCF STATUS, RP1
+$007D $1683 BSF STATUS, RP0
+$007E $0812 MOVF PR2, 0
+$007F $3F01 ADDLW 1
+$0080 $00F0 MOVWF STACK_0
+$0081 $01F1 CLRF STACK_0+1
+$0082 $1803 BTFSC STATUS, C
+$0083 $0AF1 INCF STACK_0+1, 1
+$0084 $1283 BCF STATUS, RP0
+$0085 $0864 MOVF FARG_PWM1_Change_Duty+0, 0
+$0086 $00F4 MOVWF STACK_4
+$0087 $01F5 CLRF STACK_4+1
+$0088 $2022 CALL _mul_16x16_s
+$0089 $3006 MOVLW 6
+$008A $00F2 MOVWF STACK_2
+$008B $0870 MOVF STACK_0, 0
+$008C $00F4 MOVWF STACK_4
+$008D $0871 MOVF STACK_0+1, 0
+$008E $00F5 MOVWF STACK_4+1
+$008F $0872 MOVF STACK_2, 0
+$0090 $ L_PWM1_Change_Duty_2:
+$0090 $1903 BTFSC STATUS, Z
+$0091 $2899 GOTO L_PWM1_Change_Duty_3
+$0092 $1303 BCF STATUS, RP1
+$0093 $1283 BCF STATUS, RP0
+$0094 $0CF5 RRF STACK_4+1, 1
+$0095 $0CF4 RRF STACK_4, 1
+$0096 $13F5 BCF STACK_4+1, 7
+$0097 $3FFF ADDLW 255
+$0098 $2890 GOTO L_PWM1_Change_Duty_2
+$0099 $ L_PWM1_Change_Duty_3:
+$0099 $1303 BCF STATUS, RP1
+$009A $1283 BCF STATUS, RP0
+$009B $0874 MOVF STACK_4, 0
+$009C $00F0 MOVWF STACK_0
+$009D $0DF0 RLF STACK_0, 1
+$009E $1070 BCF STACK_0, 0
+$009F $0DF0 RLF STACK_0, 1
+$00A0 $1070 BCF STACK_0, 0
+$00A1 $0DF0 RLF STACK_0, 1
+$00A2 $1070 BCF STACK_0, 0
+$00A3 $0DF0 RLF STACK_0, 1
+$00A4 $1070 BCF STACK_0, 0
+$00A5 $3030 MOVLW 48
+$00A6 $0570 ANDWF STACK_0, 0
+$00A7 $00F3 MOVWF STACK_3
+$00A8 $0874 MOVF STACK_4, 0
+$00A9 $00F0 MOVWF STACK_0
+$00AA $0875 MOVF STACK_4+1, 0
+$00AB $00F1 MOVWF STACK_0+1
+$00AC $0CF1 RRF STACK_0+1, 1
+$00AD $0CF0 RRF STACK_0, 1
+$00AE $13F1 BCF STACK_0+1, 7
+$00AF $0CF1 RRF STACK_0+1, 1
+$00B0 $0CF0 RRF STACK_0, 1
+$00B1 $13F1 BCF STACK_0+1, 7
+$00B2 $0870 MOVF STACK_0, 0
+$00B3 $0095 MOVWF CCPR1L
+$00B4 $300F MOVLW 15
+$00B5 $0597 ANDWF CCP1CON, 1
+$00B6 $0873 MOVF STACK_3, 0
+$00B7 $0497 IORWF CCP1CON, 1
+$00B8 $0008 RETURN
+$00B9 $ _PWM2_Change_Duty:
+$00B9 $1303 BCF STATUS, RP1
+$00BA $1683 BSF STATUS, RP0
+$00BB $0812 MOVF PR2, 0
+$00BC $3F01 ADDLW 1
+$00BD $00F0 MOVWF STACK_0
+$00BE $01F1 CLRF STACK_0+1
+$00BF $1803 BTFSC STATUS, C
+$00C0 $0AF1 INCF STACK_0+1, 1
+$00C1 $1283 BCF STATUS, RP0
+$00C2 $0864 MOVF FARG_PWM2_Change_Duty+0, 0
+$00C3 $00F4 MOVWF STACK_4
+$00C4 $01F5 CLRF STACK_4+1
+$00C5 $2022 CALL _mul_16x16_s
+$00C6 $3006 MOVLW 6
+$00C7 $00F2 MOVWF STACK_2
+$00C8 $0870 MOVF STACK_0, 0
+$00C9 $00F4 MOVWF STACK_4
+$00CA $0871 MOVF STACK_0+1, 0
+$00CB $00F5 MOVWF STACK_4+1
+$00CC $0872 MOVF STACK_2, 0
+$00CD $ L_PWM2_Change_Duty_0:
+$00CD $1903 BTFSC STATUS, Z
+$00CE $28D6 GOTO L_PWM2_Change_Duty_1
+$00CF $1303 BCF STATUS, RP1
+$00D0 $1283 BCF STATUS, RP0
+$00D1 $0CF5 RRF STACK_4+1, 1
+$00D2 $0CF4 RRF STACK_4, 1
+$00D3 $13F5 BCF STACK_4+1, 7
+$00D4 $3FFF ADDLW 255
+$00D5 $28CD GOTO L_PWM2_Change_Duty_0
+$00D6 $ L_PWM2_Change_Duty_1:
+$00D6 $1303 BCF STATUS, RP1
+$00D7 $1283 BCF STATUS, RP0
+$00D8 $0874 MOVF STACK_4, 0
+$00D9 $00F0 MOVWF STACK_0
+$00DA $0DF0 RLF STACK_0, 1
+$00DB $1070 BCF STACK_0, 0
+$00DC $0DF0 RLF STACK_0, 1
+$00DD $1070 BCF STACK_0, 0
+$00DE $0DF0 RLF STACK_0, 1
+$00DF $1070 BCF STACK_0, 0
+$00E0 $0DF0 RLF STACK_0, 1
+$00E1 $1070 BCF STACK_0, 0
+$00E2 $3030 MOVLW 48
+$00E3 $0570 ANDWF STACK_0, 0
+$00E4 $00F3 MOVWF STACK_3
+$00E5 $0874 MOVF STACK_4, 0
+$00E6 $00F0 MOVWF STACK_0
+$00E7 $0875 MOVF STACK_4+1, 0
+$00E8 $00F1 MOVWF STACK_0+1
+$00E9 $0CF1 RRF STACK_0+1, 1
+$00EA $0CF0 RRF STACK_0, 1
+$00EB $13F1 BCF STACK_0+1, 7
+$00EC $0CF1 RRF STACK_0+1, 1
+$00ED $0CF0 RRF STACK_0, 1
+$00EE $13F1 BCF STACK_0+1, 7
+$00EF $0870 MOVF STACK_0, 0
+$00F0 $009B MOVWF CCPR2L
+$00F1 $300F MOVLW 15
+$00F2 $059D ANDWF CCP2CON, 1
+$00F3 $0873 MOVF STACK_3, 0
+$00F4 $049D IORWF CCP2CON, 1
+$00F5 $0008 RETURN
+$00F6 $ _PWM1_Stop:
+$00F6 $1303 BCF STATUS, RP1
+$00F7 $1683 BSF STATUS, RP0
+$00F8 $1507 BSF TRISC, 2
+$00F9 $1283 BCF STATUS, RP0
+$00FA $1112 BCF T2CON, 2
+$00FB $30F0 MOVLW 240
+$00FC $0597 ANDWF CCP1CON, 1
+$00FD $0008 RETURN
+$00FE $ _PWM2_Stop:
+$00FE $1303 BCF STATUS, RP1
+$00FF $1683 BSF STATUS, RP0
+$0100 $1487 BSF TRISC, 1
+$0101 $1283 BCF STATUS, RP0
+$0102 $1112 BCF T2CON, 2
+$0103 $30F0 MOVLW 240
+$0104 $059D ANDWF CCP2CON, 1
+$0105 $0008 RETURN
+$0106 $ _turnBacklightOn:
+;openKeyboard.c,154 :: void turnBacklightOn(){
+;openKeyboard.c,155 :: timer = lightFadeOffTime;
+$0106 $1303 BCF STATUS, RP1
+$0107 $1283 BCF STATUS, RP0
+$0108 $0824 MOVF _lightFadeOffTime, 0
+$0109 $00A0 MOVWF _timer
+$010A $0825 MOVF _lightFadeOffTime+1, 0
+$010B $00A1 MOVWF _timer+1
+$010C $0826 MOVF _lightFadeOffTime+2, 0
+$010D $00A2 MOVWF _timer+2
+$010E $0827 MOVF _lightFadeOffTime+3, 0
+$010F $00A3 MOVWF _timer+3
+;openKeyboard.c,156 :: if (!pwmRunning) {
+$0110 $0828 MOVF _pwmRunning, 0
+$0111 $1D03 BTFSS STATUS, Z
+$0112 $2917 GOTO L_turnBacklightOn_12
+;openKeyboard.c,157 :: PWM1_Start();
+$0113 $206C CALL _PWM1_Start
+;openKeyboard.c,158 :: PWM2_Start();
+$0114 $2074 CALL _PWM2_Start
+;openKeyboard.c,159 :: pwmRunning = 1;
+$0115 $3001 MOVLW 1
+$0116 $00A8 MOVWF _pwmRunning
+;openKeyboard.c,160 :: }
+$0117 $ L_turnBacklightOn_12:
+;openKeyboard.c,161 :: PWM1_Change_Duty(lightStrenght);
+$0117 $1303 BCF STATUS, RP1
+$0118 $1283 BCF STATUS, RP0
+$0119 $0829 MOVF _lightStrenght, 0
+$011A $00E4 MOVWF FARG_PWM1_Change_Duty+0
+$011B $207C CALL _PWM1_Change_Duty
+;openKeyboard.c,162 :: PWM2_Change_Duty(lightStrenght);
+$011C $0829 MOVF _lightStrenght, 0
+$011D $00E4 MOVWF FARG_PWM2_Change_Duty+0
+$011E $20B9 CALL _PWM2_Change_Duty
+;openKeyboard.c,163 :: }
+$011F $0008 RETURN
+$0120 $ _EEprom_write:
+$0120 $0000 NOP
+$0121 $ L_EEprom_write_0:
+$0121 $1703 BSF STATUS, RP1
+$0122 $1683 BSF STATUS, RP0
+$0123 $1C8C BTFSS EECON1, 1
+$0124 $2927 GOTO L_EEprom_write_1
+$0125 $0000 NOP
+$0126 $2921 GOTO L_EEprom_write_0
+$0127 $ L_EEprom_write_1:
+$0127 $1303 BCF STATUS, RP1
+$0128 $1283 BCF STATUS, RP0
+$0129 $085F MOVF FARG_EEprom_write+0, 0
+$012A $1703 BSF STATUS, RP1
+$012B $008D MOVWF EEADR
+$012C $1303 BCF STATUS, RP1
+$012D $0860 MOVF FARG_EEprom_write+1, 0
+$012E $1703 BSF STATUS, RP1
+$012F $008C MOVWF EEDATA
+$0130 $1683 BSF STATUS, RP0
+$0131 $138C BCF EECON1, 7
+$0132 $150C BSF EECON1, 2
+$0133 $138B BCF INTCON, 7
+$0134 $3055 MOVLW 85
+$0135 $008D MOVWF EECON2
+$0136 $30AA MOVLW 170
+$0137 $008D MOVWF EECON2
+$0138 $148C BSF EECON1, 1
+$0139 $178B BSF INTCON, 7
+$013A $110C BCF EECON1, 2
+$013B $0008 RETURN
+$013C $ _PWM1_Init:
+$013C $1303 BCF STATUS, RP1
+$013D $1283 BCF STATUS, RP0
+$013E $0195 CLRF CCPR1L, 1
+$013F $1217 BCF CCP1CON, 4
+$0140 $1297 BCF CCP1CON, 5
+$0141 $0008 RETURN
+$0142 $ _PWM2_Init:
+$0142 $1303 BCF STATUS, RP1
+$0143 $1283 BCF STATUS, RP0
+$0144 $019B CLRF CCPR2L, 1
+$0145 $121D BCF CCP2CON, 4
+$0146 $129D BCF CCP2CON, 5
+$0147 $0008 RETURN
+$0148 $ _Usart_Init:
+$0148 $1303 BCF STATUS, RP1
+$0149 $1683 BSF STATUS, RP0
+$014A $1698 BSF TXSTA, 5
+$014B $3090 MOVLW 144
+$014C $1283 BCF STATUS, RP0
+$014D $0098 MOVWF RCSTA
+$014E $1683 BSF STATUS, RP0
+$014F $1787 BSF TRISC, 7
+$0150 $1307 BCF TRISC, 6
+$0151 $ L_Usart_Init_0:
+$0151 $1303 BCF STATUS, RP1
+$0152 $1283 BCF STATUS, RP0
+$0153 $1E8C BTFSS PIR1, 5
+$0154 $2958 GOTO L_Usart_Init_1
+$0155 $081A MOVF RCREG, 0
+$0156 $00E3 MOVWF Usart_Init_tmp_L0
+$0157 $2951 GOTO L_Usart_Init_0
+$0158 $ L_Usart_Init_1:
+$0158 $0008 RETURN
+$0159 $ _setupLightMode:
+;openKeyboard.c,192 :: void setupLightMode(unsigned char lm){
+;openKeyboard.c,194 :: if (pwmRunning){
+$0159 $1303 BCF STATUS, RP1
+$015A $1283 BCF STATUS, RP0
+$015B $0828 MOVF _pwmRunning, 0
+$015C $1903 BTFSC STATUS, Z
+$015D $2960 GOTO L_setupLightMode_17
+;openKeyboard.c,195 :: PWM1_Stop();
+$015E $20F6 CALL _PWM1_Stop
+;openKeyboard.c,196 :: PWM2_Stop();
+$015F $20FE CALL _PWM2_Stop
+;openKeyboard.c,197 :: }
+$0160 $ L_setupLightMode_17:
+;openKeyboard.c,199 :: switch (lm){
+$0160 $299D GOTO L_setupLightMode_18
+;openKeyboard.c,200 :: case LIGHTMODE_ALWAYSOFF: lightHandler = &nop;
+$0161 $ L_setupLightMode_20:
+$0161 $307D MOVLW #_nop
+$0162 $1303 BCF STATUS, RP1
+$0163 $1283 BCF STATUS, RP0
+$0164 $00AA MOVWF _lightHandler
+$0165 $3005 MOVLW @#_nop
+$0166 $00AB MOVWF _lightHandler+1
+$0167 $3000 MOVLW 0
+$0168 $00AC MOVWF _lightHandler+2
+$0169 $3000 MOVLW 0
+;openKeyboard.c,201 :: lightStrenght = 0xFF;
+$016A $30FF MOVLW 255
+$016B $00A9 MOVWF _lightStrenght
+;openKeyboard.c,202 :: lightMode = LIGHTMODE_ALWAYSOFF;
+$016C $01AD CLRF _lightMode, 1
+;openKeyboard.c,203 :: break;
+$016D $29AC GOTO L_setupLightMode_19
+;openKeyboard.c,205 :: case LIGHTMODE_ALWAYSON: lightHandler = &nop;
+$016E $ L_setupLightMode_21:
+$016E $307D MOVLW #_nop
+$016F $1303 BCF STATUS, RP1
+$0170 $1283 BCF STATUS, RP0
+$0171 $00AA MOVWF _lightHandler
+$0172 $3005 MOVLW @#_nop
+$0173 $00AB MOVWF _lightHandler+1
+$0174 $3000 MOVLW 0
+$0175 $00AC MOVWF _lightHandler+2
+$0176 $3000 MOVLW 0
+;openKeyboard.c,206 :: turnBacklightOn();
+$0177 $2106 CALL _turnBacklightOn
+;openKeyboard.c,207 :: lightMode = LIGHTMODE_ALWAYSON;
+$0178 $3001 MOVLW 1
+$0179 $00AD MOVWF _lightMode
+;openKeyboard.c,208 :: break;
+$017A $29AC GOTO L_setupLightMode_19
+;openKeyboard.c,210 :: case LIGHTMODE_FADE: lightHandler = &lightFade;
+$017B $ L_setupLightMode_22:
+$017B $307E MOVLW #_lightFade
+$017C $1303 BCF STATUS, RP1
+$017D $1283 BCF STATUS, RP0
+$017E $00AA MOVWF _lightHandler
+$017F $3005 MOVLW @#_lightFade
+$0180 $00AB MOVWF _lightHandler+1
+$0181 $3000 MOVLW 0
+$0182 $00AC MOVWF _lightHandler+2
+$0183 $3000 MOVLW 0
+;openKeyboard.c,211 :: turnBacklightOn();
+$0184 $2106 CALL _turnBacklightOn
+;openKeyboard.c,212 :: lightStrenght = 0x80; // restore middle luminosity
+$0185 $3080 MOVLW 128
+$0186 $00A9 MOVWF _lightStrenght
+;openKeyboard.c,213 :: lightMode = LIGHTMODE_FADE;
+$0187 $3002 MOVLW 2
+$0188 $00AD MOVWF _lightMode
+;openKeyboard.c,214 :: break;
+$0189 $29AC GOTO L_setupLightMode_19
+;openKeyboard.c,216 :: default : EEprom_write(CONFIG_LIGHTMODE, LIGHTMODE_ALWAYSOFF);
+$018A $ L_setupLightMode_23:
+$018A $3003 MOVLW 3
+$018B $1303 BCF STATUS, RP1
+$018C $1283 BCF STATUS, RP0
+$018D $00DF MOVWF FARG_EEprom_write+0
+$018E $01E0 CLRF FARG_EEprom_write+1, 1
+$018F $2120 CALL _EEprom_write
+;openKeyboard.c,217 :: lightMode = LIGHTMODE_ALWAYSOFF;
+$0190 $1303 BCF STATUS, RP1
+$0191 $1283 BCF STATUS, RP0
+$0192 $01AD CLRF _lightMode, 1
+;openKeyboard.c,218 :: lightHandler = &nop;
+$0193 $307D MOVLW #_nop
+$0194 $00AA MOVWF _lightHandler
+$0195 $3005 MOVLW @#_nop
+$0196 $00AB MOVWF _lightHandler+1
+$0197 $3000 MOVLW 0
+$0198 $00AC MOVWF _lightHandler+2
+$0199 $3000 MOVLW 0
+;openKeyboard.c,219 :: lightStrenght = 0xFF;
+$019A $30FF MOVLW 255
+$019B $00A9 MOVWF _lightStrenght
+;openKeyboard.c,220 :: }
+$019C $29AC GOTO L_setupLightMode_19
+$019D $ L_setupLightMode_18:
+$019D $1303 BCF STATUS, RP1
+$019E $1283 BCF STATUS, RP0
+$019F $085E MOVF FARG_setupLightMode+0, 0
+$01A0 $3A00 XORLW 0
+$01A1 $1903 BTFSC STATUS, Z
+$01A2 $2961 GOTO L_setupLightMode_20
+$01A3 $085E MOVF FARG_setupLightMode+0, 0
+$01A4 $3A01 XORLW 1
+$01A5 $1903 BTFSC STATUS, Z
+$01A6 $296E GOTO L_setupLightMode_21
+$01A7 $085E MOVF FARG_setupLightMode+0, 0
+$01A8 $3A02 XORLW 2
+$01A9 $1903 BTFSC STATUS, Z
+$01AA $297B GOTO L_setupLightMode_22
+$01AB $298A GOTO L_setupLightMode_23
+$01AC $ L_setupLightMode_19:
+;openKeyboard.c,222 :: PORTC = 255;
+$01AC $30FF MOVLW 255
+$01AD $1303 BCF STATUS, RP1
+$01AE $1283 BCF STATUS, RP0
+$01AF $0087 MOVWF PORTC
+;openKeyboard.c,225 :: if (lightMode != LIGHTMODE_ALWAYSOFF) {
+$01B0 $082D MOVF _lightMode, 0
+$01B1 $3A00 XORLW 0
+$01B2 $1903 BTFSC STATUS, Z
+$01B3 $29C6 GOTO L_setupLightMode_24
+;openKeyboard.c,226 :: PWM1_Init(40000);
+$01B4 $3018 MOVLW 24
+$01B5 $1683 BSF STATUS, RP0
+$01B6 $0092 MOVWF PR2
+$01B7 $213C CALL _PWM1_Init
+;openKeyboard.c,227 :: PWM1_Change_Duty(lightStrenght);
+$01B8 $0829 MOVF _lightStrenght, 0
+$01B9 $00E4 MOVWF FARG_PWM1_Change_Duty+0
+$01BA $207C CALL _PWM1_Change_Duty
+;openKeyboard.c,228 :: PWM1_Start();
+$01BB $206C CALL _PWM1_Start
+;openKeyboard.c,230 :: PWM2_Init(40000);
+$01BC $3018 MOVLW 24
+$01BD $1683 BSF STATUS, RP0
+$01BE $0092 MOVWF PR2
+$01BF $2142 CALL _PWM2_Init
+;openKeyboard.c,231 :: PWM2_Change_Duty(lightStrenght);
+$01C0 $0829 MOVF _lightStrenght, 0
+$01C1 $00E4 MOVWF FARG_PWM2_Change_Duty+0
+$01C2 $20B9 CALL _PWM2_Change_Duty
+;openKeyboard.c,232 :: PWM2_Start();
+$01C3 $2074 CALL _PWM2_Start
+;openKeyboard.c,234 :: pwmRunning = 1;
+$01C4 $3001 MOVLW 1
+$01C5 $00A8 MOVWF _pwmRunning
+;openKeyboard.c,235 :: }
+$01C6 $ L_setupLightMode_24:
+;openKeyboard.c,236 :: }
+$01C6 $0008 RETURN
+$01C7 $ _setupUsart:
+;openKeyboard.c,127 :: void setupUsart(unsigned char br){
+;openKeyboard.c,128 :: switch(br){ // done so, because you can't call USART_Init(variable); but only USART_Init(literal);
+$01C7 $2A1A GOTO L_setupUsart_0
+;openKeyboard.c,129 :: case BAUDRATE_300: USART_Init(300);
+$01C8 $ L_setupUsart_2:
+$01C8 $1303 BCF STATUS, RP1
+$01C9 $1683 BSF STATUS, RP0
+$01CA $30CF MOVLW 207
+$01CB $1303 BCF STATUS, RP1
+$01CC $1683 BSF STATUS, RP0
+$01CD $0099 MOVWF SPBRG
+$01CE $1118 BCF TXSTA, BRGH
+$01CF $2148 CALL _Usart_Init
+;openKeyboard.c,130 :: break;
+$01D0 $2A43 GOTO L_setupUsart_1
+;openKeyboard.c,131 :: case BAUDRATE_1200: USART_Init(1200);
+$01D1 $ L_setupUsart_3:
+$01D1 $30CF MOVLW 207
+$01D2 $1303 BCF STATUS, RP1
+$01D3 $1683 BSF STATUS, RP0
+$01D4 $0099 MOVWF SPBRG
+$01D5 $1518 BSF TXSTA, BRGH
+$01D6 $2148 CALL _Usart_Init
+;openKeyboard.c,132 :: break;
+$01D7 $2A43 GOTO L_setupUsart_1
+;openKeyboard.c,133 :: case BAUDRATE_2400: USART_Init(2400);
+$01D8 $ L_setupUsart_4:
+$01D8 $3067 MOVLW 103
+$01D9 $1303 BCF STATUS, RP1
+$01DA $1683 BSF STATUS, RP0
+$01DB $0099 MOVWF SPBRG
+$01DC $1518 BSF TXSTA, BRGH
+$01DD $2148 CALL _Usart_Init
+;openKeyboard.c,134 :: break;
+$01DE $2A43 GOTO L_setupUsart_1
+;openKeyboard.c,135 :: case BAUDRATE_4800: USART_Init(4800);
+$01DF $ L_setupUsart_5:
+$01DF $3033 MOVLW 51
+$01E0 $1303 BCF STATUS, RP1
+$01E1 $1683 BSF STATUS, RP0
+$01E2 $0099 MOVWF SPBRG
+$01E3 $1518 BSF TXSTA, BRGH
+$01E4 $2148 CALL _Usart_Init
+;openKeyboard.c,136 :: break;
+$01E5 $2A43 GOTO L_setupUsart_1
+;openKeyboard.c,137 :: case BAUDRATE_9600: USART_Init(9600);
+$01E6 $ L_setupUsart_6:
+$01E6 $3019 MOVLW 25
+$01E7 $1303 BCF STATUS, RP1
+$01E8 $1683 BSF STATUS, RP0
+$01E9 $0099 MOVWF SPBRG
+$01EA $1518 BSF TXSTA, BRGH
+$01EB $2148 CALL _Usart_Init
+;openKeyboard.c,138 :: break;
+$01EC $2A43 GOTO L_setupUsart_1
+;openKeyboard.c,139 :: case BAUDRATE_19200: USART_Init(19200);
+$01ED $ L_setupUsart_7:
+$01ED $300C MOVLW 12
+$01EE $1303 BCF STATUS, RP1
+$01EF $1683 BSF STATUS, RP0
+$01F0 $0099 MOVWF SPBRG
+$01F1 $1518 BSF TXSTA, BRGH
+$01F2 $2148 CALL _Usart_Init
+;openKeyboard.c,140 :: break;
+$01F3 $2A43 GOTO L_setupUsart_1
+;openKeyboard.c,141 :: case BAUDRATE_38400: USART_Init(38400);
+$01F4 $ L_setupUsart_8:
+$01F4 $3006 MOVLW 6
+$01F5 $1303 BCF STATUS, RP1
+$01F6 $1683 BSF STATUS, RP0
+$01F7 $0099 MOVWF SPBRG
+$01F8 $1518 BSF TXSTA, BRGH
+$01F9 $2148 CALL _Usart_Init
+;openKeyboard.c,142 :: break;
+$01FA $2A43 GOTO L_setupUsart_1
+;openKeyboard.c,143 :: case BAUDRATE_57600: USART_Init(57600);
+$01FB $ L_setupUsart_9:
+$01FB $3003 MOVLW 3
+$01FC $1303 BCF STATUS, RP1
+$01FD $1683 BSF STATUS, RP0
+$01FE $0099 MOVWF SPBRG
+$01FF $1518 BSF TXSTA, BRGH
+$0200 $2148 CALL _Usart_Init
+;openKeyboard.c,144 :: break;
+$0201 $2A43 GOTO L_setupUsart_1
+;openKeyboard.c,145 :: case BAUDRATE_115200: USART_Init(115200);
+$0202 $ L_setupUsart_10:
+$0202 $3001 MOVLW 1
+$0203 $1303 BCF STATUS, RP1
+$0204 $1683 BSF STATUS, RP0
+$0205 $0099 MOVWF SPBRG
+$0206 $1518 BSF TXSTA, BRGH
+$0207 $2148 CALL _Usart_Init
+;openKeyboard.c,146 :: break;
+$0208 $2A43 GOTO L_setupUsart_1
+;openKeyboard.c,147 :: default: EEprom_write(CONFIG_BAUDRATE, BAUDRATE_4800); // if no config found, set a default 4800
+$0209 $ L_setupUsart_11:
+$0209 $3001 MOVLW 1
+$020A $1303 BCF STATUS, RP1
+$020B $1283 BCF STATUS, RP0
+$020C $00DF MOVWF FARG_EEprom_write+0
+$020D $3004 MOVLW 4
+$020E $00E0 MOVWF FARG_EEprom_write+1
+$020F $2120 CALL _EEprom_write
+;openKeyboard.c,148 :: br = BAUDRATE_4800;
+$0210 $3004 MOVLW 4
+$0211 $1303 BCF STATUS, RP1
+$0212 $1283 BCF STATUS, RP0
+$0213 $00DE MOVWF FARG_setupUsart+0
+;openKeyboard.c,149 :: USART_Init(4800);
+$0214 $3033 MOVLW 51
+$0215 $1683 BSF STATUS, RP0
+$0216 $0099 MOVWF SPBRG
+$0217 $1518 BSF TXSTA, BRGH
+$0218 $2148 CALL _Usart_Init
+;openKeyboard.c,150 :: }
+$0219 $2A43 GOTO L_setupUsart_1
+$021A $ L_setupUsart_0:
+$021A $1303 BCF STATUS, RP1
+$021B $1283 BCF STATUS, RP0
+$021C $1303 BCF STATUS, RP1
+$021D $1283 BCF STATUS, RP0
+$021E $085E MOVF FARG_setupUsart+0, 0
+$021F $3A01 XORLW 1
+$0220 $1903 BTFSC STATUS, Z
+$0221 $29C8 GOTO L_setupUsart_2
+$0222 $085E MOVF FARG_setupUsart+0, 0
+$0223 $3A02 XORLW 2
+$0224 $1903 BTFSC STATUS, Z
+$0225 $29D1 GOTO L_setupUsart_3
+$0226 $085E MOVF FARG_setupUsart+0, 0
+$0227 $3A03 XORLW 3
+$0228 $1903 BTFSC STATUS, Z
+$0229 $29D8 GOTO L_setupUsart_4
+$022A $085E MOVF FARG_setupUsart+0, 0
+$022B $3A04 XORLW 4
+$022C $1903 BTFSC STATUS, Z
+$022D $29DF GOTO L_setupUsart_5
+$022E $085E MOVF FARG_setupUsart+0, 0
+$022F $3A05 XORLW 5
+$0230 $1903 BTFSC STATUS, Z
+$0231 $29E6 GOTO L_setupUsart_6
+$0232 $085E MOVF FARG_setupUsart+0, 0
+$0233 $3A06 XORLW 6
+$0234 $1903 BTFSC STATUS, Z
+$0235 $29ED GOTO L_setupUsart_7
+$0236 $085E MOVF FARG_setupUsart+0, 0
+$0237 $3A07 XORLW 7
+$0238 $1903 BTFSC STATUS, Z
+$0239 $29F4 GOTO L_setupUsart_8
+$023A $085E MOVF FARG_setupUsart+0, 0
+$023B $3A08 XORLW 8
+$023C $1903 BTFSC STATUS, Z
+$023D $29FB GOTO L_setupUsart_9
+$023E $085E MOVF FARG_setupUsart+0, 0
+$023F $3A09 XORLW 9
+$0240 $1903 BTFSC STATUS, Z
+$0241 $2A02 GOTO L_setupUsart_10
+$0242 $2A09 GOTO L_setupUsart_11
+$0243 $ L_setupUsart_1:
+;openKeyboard.c,151 :: baudrate = br;
+$0243 $1303 BCF STATUS, RP1
+$0244 $1283 BCF STATUS, RP0
+$0245 $085E MOVF FARG_setupUsart+0, 0
+$0246 $00AE MOVWF _baudrate
+;openKeyboard.c,152 :: }
+$0247 $0008 RETURN
+$0248 $ _setupSendMode:
+;openKeyboard.c,298 :: void setupSendMode(unsigned char sm){
+;openKeyboard.c,299 :: switch (sm){
+$0248 $2A71 GOTO L_setupSendMode_42
+;openKeyboard.c,300 :: case SENDMODE_SCAN : send = &scanSend;
+$0249 $ L_setupSendMode_44:
+$0249 $30C5 MOVLW #_scanSend
+$024A $1303 BCF STATUS, RP1
+$024B $1283 BCF STATUS, RP0
+$024C $00AF MOVWF _send
+$024D $3005 MOVLW @#_scanSend
+$024E $00B0 MOVWF _send+1
+$024F $3000 MOVLW 0
+$0250 $00B1 MOVWF _send+2
+$0251 $3000 MOVLW 0
+;openKeyboard.c,301 :: sendMode = SENDMODE_SCAN;
+$0252 $3001 MOVLW 1
+$0253 $00B2 MOVWF _sendMode
+;openKeyboard.c,302 :: break;
+$0254 $2A7E GOTO L_setupSendMode_43
+;openKeyboard.c,304 :: case SENDMODE_SERIAL: send = &serialSend;
+$0255 $ L_setupSendMode_45:
+$0255 $3038 MOVLW #_serialSend
+$0256 $1303 BCF STATUS, RP1
+$0257 $1283 BCF STATUS, RP0
+$0258 $00AF MOVWF _send
+$0259 $3006 MOVLW @#_serialSend
+$025A $00B0 MOVWF _send+1
+$025B $3000 MOVLW 0
+$025C $00B1 MOVWF _send+2
+$025D $3000 MOVLW 0
+;openKeyboard.c,305 :: sendMode = SENDMODE_SERIAL;
+$025E $01B2 CLRF _sendMode, 1
+;openKeyboard.c,306 :: break;
+$025F $2A7E GOTO L_setupSendMode_43
+;openKeyboard.c,312 :: default : send = &serialSend;
+$0260 $ L_setupSendMode_46:
+$0260 $3038 MOVLW #_serialSend
+$0261 $1303 BCF STATUS, RP1
+$0262 $1283 BCF STATUS, RP0
+$0263 $00AF MOVWF _send
+$0264 $3006 MOVLW @#_serialSend
+$0265 $00B0 MOVWF _send+1
+$0266 $3000 MOVLW 0
+$0267 $00B1 MOVWF _send+2
+$0268 $3000 MOVLW 0
+;openKeyboard.c,313 :: EEprom_write(CONFIG_SENDMODE, SENDMODE_SERIAL);
+$0269 $3002 MOVLW 2
+$026A $00DF MOVWF FARG_EEprom_write+0
+$026B $01E0 CLRF FARG_EEprom_write+1, 1
+$026C $2120 CALL _EEprom_write
+;openKeyboard.c,314 :: sendMode = SENDMODE_SERIAL;
+$026D $1303 BCF STATUS, RP1
+$026E $1283 BCF STATUS, RP0
+$026F $01B2 CLRF _sendMode, 1
+;openKeyboard.c,315 :: }
+$0270 $2A7E GOTO L_setupSendMode_43
+$0271 $ L_setupSendMode_42:
+$0271 $1303 BCF STATUS, RP1
+$0272 $1283 BCF STATUS, RP0
+$0273 $1303 BCF STATUS, RP1
+$0274 $1283 BCF STATUS, RP0
+$0275 $085E MOVF FARG_setupSendMode+0, 0
+$0276 $3A01 XORLW 1
+$0277 $1903 BTFSC STATUS, Z
+$0278 $2A49 GOTO L_setupSendMode_44
+$0279 $085E MOVF FARG_setupSendMode+0, 0
+$027A $3A00 XORLW 0
+$027B $1903 BTFSC STATUS, Z
+$027C $2A55 GOTO L_setupSendMode_45
+$027D $2A60 GOTO L_setupSendMode_46
+$027E $ L_setupSendMode_43:
+;openKeyboard.c,316 :: }
+$027E $0008 RETURN
+$027F $ _Delay_5ms:
+;delays.c,39 :: void Delay_5ms() {
+;delays.c,40 :: Delay_ms(5);
+$027F $3007 MOVLW 7
+$0280 $1303 BCF STATUS, RP1
+$0281 $1283 BCF STATUS, RP0
+$0282 $00FB MOVWF STACK_11
+$0283 $30FF MOVLW 255
+$0284 $00FA MOVWF STACK_10
+$0285 $0BFB DECFSZ STACK_11, F
+$0286 $2A88 GOTO $+2
+$0287 $2A8B GOTO $+4
+$0288 $0BFA DECFSZ STACK_10, F
+$0289 $2A88 GOTO $-1
+$028A $2A85 GOTO $-5
+$028B $3078 MOVLW 120
+$028C $00FA MOVWF STACK_10
+$028D $0BFA DECFSZ STACK_10, F
+$028E $2A8D GOTO $-1
+$028F $0000 NOP
+$0290 $0000 NOP
+;delays.c,41 :: }
+$0291 $0008 RETURN
+$0292 $ _enterPowerSave:
+;openKeyboard.c,115 :: void enterPowerSave(){
+;openKeyboard.c,116 :: PORTA = 0;
+$0292 $1303 BCF STATUS, RP1
+$0293 $1283 BCF STATUS, RP0
+$0294 $0185 CLRF PORTA, 1
+;openKeyboard.c,117 :: INTCON.RBIE = 1; // enables PORTB on-change interrupt
+$0295 $158B BSF INTCON, 3
+;openKeyboard.c,119 :: sleep;
+$0296 $0063 SLEEP
+;openKeyboard.c,121 :: }
+$0297 $0008 RETURN
+$0298 $ _Usart_Write:
+$0298 $ L_Usart_Write_3:
+$0298 $3000 MOVLW 0
+$0299 $1303 BCF STATUS, RP1
+$029A $1683 BSF STATUS, RP0
+$029B $1898 BTFSC TXSTA, 1
+$029C $3001 MOVLW 1
+$029D $00F1 MOVWF STACK_1
+$029E $0871 MOVF STACK_1, 0
+$029F $3A00 XORLW 0
+$02A0 $1D03 BTFSS STATUS, Z
+$02A1 $2AA4 GOTO L_Usart_Write_4
+$02A2 $0000 NOP
+$02A3 $2A98 GOTO L_Usart_Write_3
+$02A4 $ L_Usart_Write_4:
+$02A4 $1303 BCF STATUS, RP1
+$02A5 $1283 BCF STATUS, RP0
+$02A6 $085E MOVF FARG_Usart_Write+0, 0
+$02A7 $0099 MOVWF TXREG
+$02A8 $0008 RETURN
+$02A9 $ table___scanMap:
+;openKeyboard.c,39 :: const char scanMap[50] = { // i could output directly idx,
+$02A9 $3408 RETLW 8
+$02AA $3409 RETLW 9
+$02AB $340A RETLW 10
+$02AC $3428 RETLW 40
+$02AD $3414 RETLW 20
+$02AE $341E RETLW 30
+$02AF $342F RETLW 47
+$02B0 $3429 RETLW 41
+$02B1 $342A RETLW 42
+$02B2 $342B RETLW 43
+$02B3 $3427 RETLW 39
+$02B4 $342C RETLW 44
+$02B5 $3426 RETLW 38
+$02B6 $342D RETLW 45
+$02B7 $341F RETLW 31
+$02B8 $3420 RETLW 32
+$02B9 $3421 RETLW 33
+$02BA $3423 RETLW 35
+$02BB $3422 RETLW 34
+$02BC $3424 RETLW 36
+$02BD $3425 RETLW 37
+$02BE $3415 RETLW 21
+$02BF $3416 RETLW 22
+$02C0 $3417 RETLW 23
+$02C1 $3419 RETLW 25
+$02C2 $3418 RETLW 24
+$02C3 $341A RETLW 26
+$02C4 $341B RETLW 27
+$02C5 $340B RETLW 11
+$02C6 $340C RETLW 12
+$02C7 $340D RETLW 13
+$02C8 $340F RETLW 15
+$02C9 $340E RETLW 14
+$02CA $3410 RETLW 16
+$02CB $3411 RETLW 17
+$02CC $3401 RETLW 1
+$02CD $3402 RETLW 2
+$02CE $3403 RETLW 3
+$02CF $3405 RETLW 5
+$02D0 $3404 RETLW 4
+$02D1 $3406 RETLW 6
+$02D2 $3407 RETLW 7
+$02D3 $341C RETLW 28
+$02D4 $3412 RETLW 18
+$02D5 $3413 RETLW 19
+$02D6 $3400 RETLW 0
+$02D7 $3400 RETLW 0
+$02D8 $341D RETLW 29
+$02D9 $342E RETLW 46
+$02DA $3400 RETLW 0
+$02DB $0008 RETURN
+$02DC $ _____DoICP:
+$02DC $1303 BCF STATUS, RP1
+$02DD $1283 BCF STATUS, RP0
+$02DE $0834 MOVF ___DoICPHiAddr, 0
+$02DF $008A MOVWF PCLATH
+$02E0 $0835 MOVF ___DoICPLoAddr, 0
+$02E1 $0082 MOVWF PCL
+$02E2 $0008 RETURN
+$02E3 $ table___serialMap:
+;openKeyboard.c,48 :: const char serialMap[4][49] = { // CHARACTER MAPPING MATRIX for "pure serial mode"
+$02E3 $3438 RETLW 56
+$02E4 $3439 RETLW 57
+$02E5 $3430 RETLW 48
+$02E6 $340D RETLW 13
+$02E7 $3470 RETLW 112
+$02E8 $342C RETLW 44
+$02E9 $3400 RETLW 0
+$02EA $3400 RETLW 0
+$02EB $3400 RETLW 0
+$02EC $3400 RETLW 0
+$02ED $342E RETLW 46
+$02EE $3420 RETLW 32
+$02EF $346D RETLW 109
+$02F0 $3400 RETLW 0
+$02F1 $3400 RETLW 0
+$02F2 $347A RETLW 122
+$02F3 $3478 RETLW 120
+$02F4 $3476 RETLW 118
+$02F5 $3463 RETLW 99
+$02F6 $3462 RETLW 98
+$02F7 $346E RETLW 110
+$02F8 $3461 RETLW 97
+$02F9 $3473 RETLW 115
+$02FA $3464 RETLW 100
+$02FB $3467 RETLW 103
+$02FC $3466 RETLW 102
+$02FD $3468 RETLW 104
+$02FE $346A RETLW 106
+$02FF $3471 RETLW 113
+$0300 $3477 RETLW 119
+$0301 $3465 RETLW 101
+$0302 $3474 RETLW 116
+$0303 $3472 RETLW 114
+$0304 $3479 RETLW 121
+$0305 $3475 RETLW 117
+$0306 $3431 RETLW 49
+$0307 $3432 RETLW 50
+$0308 $3433 RETLW 51
+$0309 $3435 RETLW 53
+$030A $3434 RETLW 52
+$030B $3436 RETLW 54
+$030C $3437 RETLW 55
+$030D $346B RETLW 107
+$030E $3469 RETLW 105
+$030F $346F RETLW 111
+$0310 $3400 RETLW 0
+$0311 $3400 RETLW 0
+$0312 $346C RETLW 108
+$0313 $3408 RETLW 8
+$0314 $3438 RETLW 56
+$0315 $3439 RETLW 57
+$0316 $3430 RETLW 48
+$0317 $340D RETLW 13
+$0318 $3450 RETLW 80
+$0319 $342C RETLW 44
+$031A $3400 RETLW 0
+$031B $3400 RETLW 0
+$031C $3400 RETLW 0
+$031D $3400 RETLW 0
+$031E $342E RETLW 46
+$031F $3420 RETLW 32
+$0320 $344D RETLW 77
+$0321 $3400 RETLW 0
+$0322 $3400 RETLW 0
+$0323 $345A RETLW 90
+$0324 $3458 RETLW 88
+$0325 $3456 RETLW 86
+$0326 $3443 RETLW 67
+$0327 $3442 RETLW 66
+$0328 $344E RETLW 78
+$0329 $3441 RETLW 65
+$032A $3453 RETLW 83
+$032B $3444 RETLW 68
+$032C $3447 RETLW 71
+$032D $3446 RETLW 70
+$032E $3448 RETLW 72
+$032F $344A RETLW 74
+$0330 $3451 RETLW 81
+$0331 $3457 RETLW 87
+$0332 $3445 RETLW 69
+$0333 $3454 RETLW 84
+$0334 $3452 RETLW 82
+$0335 $3459 RETLW 89
+$0336 $3455 RETLW 85
+$0337 $3431 RETLW 49
+$0338 $3432 RETLW 50
+$0339 $3433 RETLW 51
+$033A $3435 RETLW 53
+$033B $3434 RETLW 52
+$033C $3436 RETLW 54
+$033D $3437 RETLW 55
+$033E $344B RETLW 75
+$033F $3449 RETLW 73
+$0340 $344F RETLW 79
+$0341 $3400 RETLW 0
+$0342 $3400 RETLW 0
+$0343 $344C RETLW 76
+$0344 $3408 RETLW 8
+$0345 $3438 RETLW 56
+$0346 $3439 RETLW 57
+$0347 $3430 RETLW 48
+$0348 $340D RETLW 13
+$0349 $3429 RETLW 41
+$034A $343A RETLW 58
+$034B $3400 RETLW 0
+$034C $3400 RETLW 0
+$034D $3400 RETLW 0
+$034E $3400 RETLW 0
+$034F $343F RETLW 63
+$0350 $3420 RETLW 32
+$0351 $343E RETLW 62
+$0352 $3400 RETLW 0
+$0353 $3400 RETLW 0
+$0354 $3460 RETLW 96
+$0355 $3427 RETLW 39
+$0356 $342D RETLW 45
+$0357 $34BB RETLW 187
+$0358 $347C RETLW 124
+$0359 $343C RETLW 60
+$035A $347E RETLW 126
+$035B $349A RETLW 154
+$035C $347B RETLW 123
+$035D $34A8 RETLW 168
+$035E $347D RETLW 125
+$035F $342F RETLW 47
+$0360 $3427 RETLW 39
+$0361 $3421 RETLW 33
+$0362 $3440 RETLW 64
+$0363 $3480 RETLW 128
+$0364 $3425 RETLW 37
+$0365 $3423 RETLW 35
+$0366 $345E RETLW 94
+$0367 $3426 RETLW 38
+$0368 $3431 RETLW 49
+$0369 $3432 RETLW 50
+$036A $3433 RETLW 51
+$036B $3435 RETLW 53
+$036C $3434 RETLW 52
+$036D $3436 RETLW 54
+$036E $3437 RETLW 55
+$036F $345B RETLW 91
+$0370 $342A RETLW 42
+$0371 $3428 RETLW 40
+$0372 $3400 RETLW 0
+$0373 $3400 RETLW 0
+$0374 $345D RETLW 93
+$0375 $3408 RETLW 8
+$0376 $3438 RETLW 56
+$0377 $3439 RETLW 57
+$0378 $3430 RETLW 48
+$0379 $340D RETLW 13
+$037A $343D RETLW 61
+$037B $343B RETLW 59
+$037C $3400 RETLW 0
+$037D $3400 RETLW 0
+$037E $3400 RETLW 0
+$037F $3400 RETLW 0
+$0380 $34BF RETLW 191
+$0381 $3420 RETLW 32
+$0382 $34B5 RETLW 181
+$0383 $3400 RETLW 0
+$0384 $3400 RETLW 0
+$0385 $34E6 RETLW 230
+$0386 $349C RETLW 156
+$0387 $345F RETLW 95
+$0388 $34E7 RETLW 231
+$0389 $342B RETLW 43
+$038A $34F1 RETLW 241
+$038B $34E1 RETLW 225
+$038C $34DF RETLW 223
+$038D $34F0 RETLW 240
+$038E $34A5 RETLW 165
+$038F $34A3 RETLW 163
+$0390 $345C RETLW 92
+$0391 $3422 RETLW 34
+$0392 $34A1 RETLW 161
+$0393 $34E5 RETLW 229
+$0394 $34E8 RETLW 232
+$0395 $34FE RETLW 254
+$0396 $3424 RETLW 36
+$0397 $34FD RETLW 253
+$0398 $34F9 RETLW 249
+$0399 $3431 RETLW 49
+$039A $3432 RETLW 50
+$039B $3433 RETLW 51
+$039C $3435 RETLW 53
+$039D $3434 RETLW 52
+$039E $3436 RETLW 54
+$039F $3437 RETLW 55
+$03A0 $34A9 RETLW 169
+$03A1 $34EC RETLW 236
+$03A2 $34F2 RETLW 242
+$03A3 $3400 RETLW 0
+$03A4 $3400 RETLW 0
+$03A5 $34F8 RETLW 248
+$03A6 $3408 RETLW 8
+$03A7 $0008 RETURN
+$03A8 $ _Mul_16x16_U:
+$03A8 $1303 BCF STATUS, RP1
+$03A9 $1283 BCF STATUS, RP0
+$03AA $01FB CLRF STACK_11
+$03AB $01FA CLRF STACK_10
+$03AC $01F9 CLRF STACK_9
+$03AD $3080 MOVLW 128
+$03AE $00F8 MOVWF STACK_8
+$03AF $0CF1 RRF STACK_1, F
+$03B0 $0CF0 RRF STACK_0, F
+$03B1 $1C03 BTFSS STATUS, C
+$03B2 $2BBC GOTO $+10
+$03B3 $0874 MOVF STACK_4, W
+$03B4 $07F9 ADDWF STACK_9, F
+$03B5 $0875 MOVF STACK_5, W
+$03B6 $1803 BTFSC STATUS, C
+$03B7 $0F75 INCFSZ STACK_5, W
+$03B8 $07FA ADDWF STACK_10, F
+$03B9 $1803 BTFSC STATUS, C
+$03BA $0AFB INCF STACK_11, F
+$03BB $1003 BCF STATUS, C
+$03BC $1FF0 BTFSS STACK_0, 7
+$03BD $2BC4 GOTO $+7
+$03BE $0874 MOVF STACK_4, W
+$03BF $07FA ADDWF STACK_10, F
+$03C0 $0875 MOVF STACK_5, W
+$03C1 $1803 BTFSC STATUS, C
+$03C2 $0F75 INCFSZ STACK_5, W
+$03C3 $07FB ADDWF STACK_11, F
+$03C4 $0CFB RRF STACK_11, F
+$03C5 $0CFA RRF STACK_10, F
+$03C6 $0CF9 RRF STACK_9, F
+$03C7 $0CF8 RRF STACK_8, F
+$03C8 $1C03 BTFSS STATUS, C
+$03C9 $2BAF GOTO $-26
+$03CA $087B MOVF STACK_11, W
+$03CB $00F3 MOVWF STACK_3
+$03CC $087A MOVF STACK_10, W
+$03CD $00F2 MOVWF STACK_2
+$03CE $0879 MOVF STACK_9, W
+$03CF $00F1 MOVWF STACK_1
+$03D0 $0878 MOVF STACK_8, W
+$03D1 $00F0 MOVWF STACK_0
+$03D2 $0008 RETURN
+$03D3 $ _EEprom_read:
+$03D3 $1303 BCF STATUS, RP1
+$03D4 $1283 BCF STATUS, RP0
+$03D5 $085B MOVF FARG_EEprom_read+0, 0
+$03D6 $1703 BSF STATUS, RP1
+$03D7 $008D MOVWF EEADR
+$03D8 $1683 BSF STATUS, RP0
+$03D9 $138C BCF EECON1, 7
+$03DA $140C BSF EECON1, 0
+$03DB $1283 BCF STATUS, RP0
+$03DC $080C MOVF EEDATA, 0
+$03DD $00F0 MOVWF STACK_0
+$03DE $0008 RETURN
+$03DF $ _doScan:
+;openKeyboard.c,238 :: void doScan(){
+;openKeyboard.c,239 :: unsigned char sc = 0;
+$03DF $1303 BCF STATUS, RP1
+$03E0 $1283 BCF STATUS, RP0
+$03E1 $01DB CLRF doScan_sc_L0, 1
+;openKeyboard.c,241 :: newlyPressd = 0;
+$03E2 $01B6 CLRF _newlyPressd, 1
+;openKeyboard.c,243 :: for (AMask=1; AMask<128; AMask<<=1){
+$03E3 $3001 MOVLW 1
+$03E4 $00B7 MOVWF _AMask
+$03E5 $ L_doScan_25:
+$03E5 $3080 MOVLW 128
+$03E6 $1303 BCF STATUS, RP1
+$03E7 $1283 BCF STATUS, RP0
+$03E8 $0237 SUBWF _AMask, 0
+$03E9 $1803 BTFSC STATUS, C
+$03EA $2C47 GOTO L_doScan_26
+;openKeyboard.c,245 :: oldData[sc] = data[sc]; // save old data
+$03EB $085B MOVF doScan_sc_L0, 0
+$03EC $3F38 ADDLW _oldData
+$03ED $00F1 MOVWF STACK_1
+$03EE $085B MOVF doScan_sc_L0, 0
+$03EF $3F3F ADDLW _data
+$03F0 $0084 MOVWF FSR
+$03F1 $0800 MOVF INDF, 0
+$03F2 $00F0 MOVWF STACK_0
+$03F3 $0871 MOVF STACK_1, 0
+$03F4 $0084 MOVWF FSR
+$03F5 $0870 MOVF STACK_0, 0
+$03F6 $0080 MOVWF INDF
+;openKeyboard.c,247 :: PORTA = ~AMask; // put a 0 on the line we want to inspect
+$03F7 $0937 COMF _AMask, W
+$03F8 $0085 MOVWF PORTA
+;openKeyboard.c,248 :: data[sc] = PORTB; // read PORTB (pulled up)...if a line goes to 0, bingo!
+$03F9 $085B MOVF doScan_sc_L0, 0
+$03FA $3F3F ADDLW _data
+$03FB $00F0 MOVWF STACK_0
+$03FC $0870 MOVF STACK_0, 0
+$03FD $0084 MOVWF FSR
+$03FE $0806 MOVF PORTB, 0
+$03FF $0080 MOVWF INDF
+;openKeyboard.c,249 :: data[sc] = data[sc] | PORTB; // antibounce
+$0400 $085B MOVF doScan_sc_L0, 0
+$0401 $3F3F ADDLW _data
+$0402 $00F1 MOVWF STACK_1
+$0403 $0871 MOVF STACK_1, 0
+$0404 $0084 MOVWF FSR
+$0405 $0800 MOVF INDF, 0
+$0406 $00F0 MOVWF STACK_0
+$0407 $0806 MOVF PORTB, 0
+$0408 $04F0 IORWF STACK_0, 1
+$0409 $0871 MOVF STACK_1, 0
+$040A $0084 MOVWF FSR
+$040B $0870 MOVF STACK_0, 0
+$040C $0080 MOVWF INDF
+;openKeyboard.c,250 :: data[sc] = data[sc] | PORTB; // antibounce
+$040D $085B MOVF doScan_sc_L0, 0
+$040E $3F3F ADDLW _data
+$040F $00F1 MOVWF STACK_1
+$0410 $0871 MOVF STACK_1, 0
+$0411 $0084 MOVWF FSR
+$0412 $0800 MOVF INDF, 0
+$0413 $00F0 MOVWF STACK_0
+$0414 $0806 MOVF PORTB, 0
+$0415 $04F0 IORWF STACK_0, 1
+$0416 $0871 MOVF STACK_1, 0
+$0417 $0084 MOVWF FSR
+$0418 $0870 MOVF STACK_0, 0
+$0419 $0080 MOVWF INDF
+;openKeyboard.c,251 :: data[sc] = ~data[sc]; // return to positive logic
+$041A $085B MOVF doScan_sc_L0, 0
+$041B $3F3F ADDLW _data
+$041C $00F1 MOVWF STACK_1
+$041D $0871 MOVF STACK_1, 0
+$041E $0084 MOVWF FSR
+$041F $0800 MOVF INDF, 0
+$0420 $00F0 MOVWF STACK_0
+$0421 $09F0 COMF STACK_0, F
+$0422 $0871 MOVF STACK_1, 0
+$0423 $0084 MOVWF FSR
+$0424 $0870 MOVF STACK_0, 0
+$0425 $0080 MOVWF INDF
+;openKeyboard.c,253 :: justPressed[sc] = data[sc]&(~oldData[sc]);
+$0426 $085B MOVF doScan_sc_L0, 0
+$0427 $3F46 ADDLW _justPressed
+$0428 $00F2 MOVWF STACK_2
+$0429 $085B MOVF doScan_sc_L0, 0
+$042A $3F3F ADDLW _data
+$042B $0084 MOVWF FSR
+$042C $0800 MOVF INDF, 0
+$042D $00F1 MOVWF STACK_1
+$042E $085B MOVF doScan_sc_L0, 0
+$042F $3F38 ADDLW _oldData
+$0430 $0084 MOVWF FSR
+$0431 $0800 MOVF INDF, 0
+$0432 $00F0 MOVWF STACK_0
+$0433 $09F0 COMF STACK_0, F
+$0434 $0871 MOVF STACK_1, 0
+$0435 $05F0 ANDWF STACK_0, 1
+$0436 $0872 MOVF STACK_2, 0
+$0437 $0084 MOVWF FSR
+$0438 $0870 MOVF STACK_0, 0
+$0439 $0080 MOVWF INDF
+;openKeyboard.c,255 :: newlyPressd = newlyPressd | justPressed[sc];
+$043A $085B MOVF doScan_sc_L0, 0
+$043B $3F46 ADDLW _justPressed
+$043C $0084 MOVWF FSR
+$043D $0800 MOVF INDF, 0
+$043E $00F0 MOVWF STACK_0
+$043F $0870 MOVF STACK_0, 0
+$0440 $04B6 IORWF _newlyPressd, 1
+;openKeyboard.c,257 :: sc++;
+$0441 $0ADB INCF doScan_sc_L0, 1
+;openKeyboard.c,258 :: }
+$0442 $ L_doScan_27:
+;openKeyboard.c,243 :: for (AMask=1; AMask<128; AMask<<=1){
+$0442 $1303 BCF STATUS, RP1
+$0443 $1283 BCF STATUS, RP0
+$0444 $0DB7 RLF _AMask, 1
+$0445 $1037 BCF _AMask, 0
+;openKeyboard.c,258 :: }
+$0446 $2BE5 GOTO L_doScan_25
+$0447 $ L_doScan_26:
+;openKeyboard.c,259 :: }
+$0447 $0008 RETURN
+$0448 $ _config:
+;openKeyboard.c,318 :: void config(){
+;openKeyboard.c,319 :: timer = lightFadeOffTime;
+$0448 $1303 BCF STATUS, RP1
+$0449 $1283 BCF STATUS, RP0
+$044A $0824 MOVF _lightFadeOffTime, 0
+$044B $00A0 MOVWF _timer
+$044C $0825 MOVF _lightFadeOffTime+1, 0
+$044D $00A1 MOVWF _timer+1
+$044E $0826 MOVF _lightFadeOffTime+2, 0
+$044F $00A2 MOVWF _timer+2
+$0450 $0827 MOVF _lightFadeOffTime+3, 0
+$0451 $00A3 MOVWF _timer+3
+;openKeyboard.c,321 :: if ((data[1]&4)&&(lightStrenght<0xff)) { // <
+$0452 $1D40 BTFSS _data+1, 2
+$0453 $2C67 GOTO L_config_49
+$0454 $30FF MOVLW 255
+$0455 $0229 SUBWF _lightStrenght, 0
+$0456 $1803 BTFSC STATUS, C
+$0457 $2C67 GOTO L_config_49
+$0458 $ L352_ex_L_config_49:
+;openKeyboard.c,322 :: lightStrenght++;
+$0458 $1303 BCF STATUS, RP1
+$0459 $1283 BCF STATUS, RP0
+$045A $0AA9 INCF _lightStrenght, 1
+;openKeyboard.c,323 :: PWM1_Change_Duty(lightStrenght);
+$045B $0829 MOVF _lightStrenght, 0
+$045C $00E4 MOVWF FARG_PWM1_Change_Duty+0
+$045D $207C CALL _PWM1_Change_Duty
+;openKeyboard.c,324 :: PWM2_Change_Duty(lightStrenght);
+$045E $0829 MOVF _lightStrenght, 0
+$045F $00E4 MOVWF FARG_PWM2_Change_Duty+0
+$0460 $20B9 CALL _PWM2_Change_Duty
+;openKeyboard.c,325 :: if (lightMode==LIGHTMODE_ALWAYSOFF) lightMode = LIGHTMODE_FADE;
+$0461 $082D MOVF _lightMode, 0
+$0462 $3A00 XORLW 0
+$0463 $1D03 BTFSS STATUS, Z
+$0464 $2C67 GOTO L_config_50
+$0465 $3002 MOVLW 2
+$0466 $00AD MOVWF _lightMode
+$0467 $ L_config_50:
+;openKeyboard.c,326 :: } // decrease light strenght
+$0467 $ L_config_49:
+;openKeyboard.c,328 :: if ((data[1]&64)&&(lightStrenght>0)) { // >
+$0467 $1303 BCF STATUS, RP1
+$0468 $1283 BCF STATUS, RP0
+$0469 $1F40 BTFSS _data+1, 6
+$046A $2C7E GOTO L_config_53
+$046B $0829 MOVF _lightStrenght, 0
+$046C $3C00 SUBLW 0
+$046D $1803 BTFSC STATUS, C
+$046E $2C7E GOTO L_config_53
+$046F $ L374_ex_L_config_53:
+;openKeyboard.c,329 :: lightStrenght--;
+$046F $1303 BCF STATUS, RP1
+$0470 $1283 BCF STATUS, RP0
+$0471 $03A9 DECF _lightStrenght, 1
+;openKeyboard.c,330 :: PWM1_Change_Duty(lightStrenght);
+$0472 $0829 MOVF _lightStrenght, 0
+$0473 $00E4 MOVWF FARG_PWM1_Change_Duty+0
+$0474 $207C CALL _PWM1_Change_Duty
+;openKeyboard.c,331 :: PWM2_Change_Duty(lightStrenght);
+$0475 $0829 MOVF _lightStrenght, 0
+$0476 $00E4 MOVWF FARG_PWM2_Change_Duty+0
+$0477 $20B9 CALL _PWM2_Change_Duty
+;openKeyboard.c,332 :: if (lightMode==LIGHTMODE_ALWAYSOFF) lightMode = LIGHTMODE_FADE;
+$0478 $082D MOVF _lightMode, 0
+$0479 $3A00 XORLW 0
+$047A $1D03 BTFSS STATUS, Z
+$047B $2C7E GOTO L_config_54
+$047C $3002 MOVLW 2
+$047D $00AD MOVWF _lightMode
+$047E $ L_config_54:
+;openKeyboard.c,333 :: } // increase light strenght
+$047E $ L_config_53:
+;openKeyboard.c,336 :: if (justPressed[5]&1){ // 1
+$047E $3001 MOVLW 1
+$047F $1303 BCF STATUS, RP1
+$0480 $1283 BCF STATUS, RP0
+$0481 $054B ANDWF _justPressed+5, 0
+$0482 $00F0 MOVWF STACK_0
+$0483 $1903 BTFSC STATUS, Z
+$0484 $2C8E GOTO L_config_55
+;openKeyboard.c,340 :: setupLightMode(LIGHTMODE_FADE);
+$0485 $3002 MOVLW 2
+$0486 $00DE MOVWF FARG_setupLightMode+0
+$0487 $2159 CALL _setupLightMode
+;openKeyboard.c,341 :: lightFadeOffTime = 2<<8;
+$0488 $3000 MOVLW 0
+$0489 $00A4 MOVWF _lightFadeOffTime
+$048A $3002 MOVLW 2
+$048B $00A5 MOVWF _lightFadeOffTime+1
+$048C $01A6 CLRF _lightFadeOffTime+2
+$048D $01A7 CLRF _lightFadeOffTime+3
+;openKeyboard.c,343 :: }
+$048E $ L_config_55:
+;openKeyboard.c,345 :: if (justPressed[5]&2){ // 2
+$048E $1303 BCF STATUS, RP1
+$048F $1283 BCF STATUS, RP0
+$0490 $1CCB BTFSS _justPressed+5, 1
+$0491 $2CA2 GOTO L_config_56
+;openKeyboard.c,346 :: if (data[1]&1)
+$0492 $3001 MOVLW 1
+$0493 $0540 ANDWF _data+1, 0
+$0494 $00F0 MOVWF STACK_0
+$0495 $1D03 BTFSS STATUS, Z
+$0496 $2CA2 GOTO L_config_58
+;openKeyboard.c,347 :: ;//setupUsart(BAUDRATE_300); //all setupUsart commented out are to save code words space...otherwise i'm running into demo limit
+$0497 $ L_config_57:
+;openKeyboard.c,349 :: setupLightMode(LIGHTMODE_FADE);
+$0497 $3002 MOVLW 2
+$0498 $1303 BCF STATUS, RP1
+$0499 $1283 BCF STATUS, RP0
+$049A $00DE MOVWF FARG_setupLightMode+0
+$049B $2159 CALL _setupLightMode
+;openKeyboard.c,350 :: lightFadeOffTime = 4<<8; // more or less 5 sec
+$049C $3000 MOVLW 0
+$049D $00A4 MOVWF _lightFadeOffTime
+$049E $3004 MOVLW 4
+$049F $00A5 MOVWF _lightFadeOffTime+1
+$04A0 $01A6 CLRF _lightFadeOffTime+2
+$04A1 $01A7 CLRF _lightFadeOffTime+3
+;openKeyboard.c,351 :: }
+$04A2 $ L_config_58:
+;openKeyboard.c,352 :: }
+$04A2 $ L_config_56:
+;openKeyboard.c,354 :: if (justPressed[5]&4){ // 3
+$04A2 $1303 BCF STATUS, RP1
+$04A3 $1283 BCF STATUS, RP0
+$04A4 $1D4B BTFSS _justPressed+5, 2
+$04A5 $2CB6 GOTO L_config_59
+;openKeyboard.c,355 :: if (data[1]&1)
+$04A6 $3001 MOVLW 1
+$04A7 $0540 ANDWF _data+1, 0
+$04A8 $00F0 MOVWF STACK_0
+$04A9 $1D03 BTFSS STATUS, Z
+$04AA $2CB6 GOTO L_config_61
+;openKeyboard.c,356 :: ;//setupUsart(BAUDRATE_1200);
+$04AB $ L_config_60:
+;openKeyboard.c,358 :: setupLightMode(LIGHTMODE_FADE);
+$04AB $3002 MOVLW 2
+$04AC $1303 BCF STATUS, RP1
+$04AD $1283 BCF STATUS, RP0
+$04AE $00DE MOVWF FARG_setupLightMode+0
+$04AF $2159 CALL _setupLightMode
+;openKeyboard.c,359 :: lightFadeOffTime = 8<<8;
+$04B0 $3000 MOVLW 0
+$04B1 $00A4 MOVWF _lightFadeOffTime
+$04B2 $3008 MOVLW 8
+$04B3 $00A5 MOVWF _lightFadeOffTime+1
+$04B4 $01A6 CLRF _lightFadeOffTime+2
+$04B5 $01A7 CLRF _lightFadeOffTime+3
+;openKeyboard.c,360 :: }
+$04B6 $ L_config_61:
+;openKeyboard.c,361 :: }
+$04B6 $ L_config_59:
+;openKeyboard.c,363 :: if (justPressed[5]&16){ // 4
+$04B6 $1303 BCF STATUS, RP1
+$04B7 $1283 BCF STATUS, RP0
+$04B8 $1E4B BTFSS _justPressed+5, 4
+$04B9 $2CCA GOTO L_config_62
+;openKeyboard.c,364 :: if (data[1]&1)
+$04BA $3001 MOVLW 1
+$04BB $0540 ANDWF _data+1, 0
+$04BC $00F0 MOVWF STACK_0
+$04BD $1D03 BTFSS STATUS, Z
+$04BE $2CCA GOTO L_config_64
+;openKeyboard.c,365 :: ;//setupUsart(BAUDRATE_2400);
+$04BF $ L_config_63:
+;openKeyboard.c,367 :: setupLightMode(LIGHTMODE_FADE);
+$04BF $3002 MOVLW 2
+$04C0 $1303 BCF STATUS, RP1
+$04C1 $1283 BCF STATUS, RP0
+$04C2 $00DE MOVWF FARG_setupLightMode+0
+$04C3 $2159 CALL _setupLightMode
+;openKeyboard.c,368 :: lightFadeOffTime = 16<<8;
+$04C4 $3000 MOVLW 0
+$04C5 $00A4 MOVWF _lightFadeOffTime
+$04C6 $3010 MOVLW 16
+$04C7 $00A5 MOVWF _lightFadeOffTime+1
+$04C8 $01A6 CLRF _lightFadeOffTime+2
+$04C9 $01A7 CLRF _lightFadeOffTime+3
+;openKeyboard.c,369 :: }
+$04CA $ L_config_64:
+;openKeyboard.c,370 :: }
+$04CA $ L_config_62:
+;openKeyboard.c,372 :: if (justPressed[5]&8){ // 5
+$04CA $1303 BCF STATUS, RP1
+$04CB $1283 BCF STATUS, RP0
+$04CC $1DCB BTFSS _justPressed+5, 3
+$04CD $2CE2 GOTO L_config_65
+;openKeyboard.c,373 :: if (data[1]&1)
+$04CE $3001 MOVLW 1
+$04CF $0540 ANDWF _data+1, 0
+$04D0 $00F0 MOVWF STACK_0
+$04D1 $1903 BTFSC STATUS, Z
+$04D2 $2CD7 GOTO L_config_66
+;openKeyboard.c,374 :: setupUsart(BAUDRATE_4800);
+$04D3 $3004 MOVLW 4
+$04D4 $00DE MOVWF FARG_setupUsart+0
+$04D5 $21C7 CALL _setupUsart
+$04D6 $2CE2 GOTO L_config_67
+$04D7 $ L_config_66:
+;openKeyboard.c,376 :: setupLightMode(LIGHTMODE_FADE);
+$04D7 $3002 MOVLW 2
+$04D8 $1303 BCF STATUS, RP1
+$04D9 $1283 BCF STATUS, RP0
+$04DA $00DE MOVWF FARG_setupLightMode+0
+$04DB $2159 CALL _setupLightMode
+;openKeyboard.c,377 :: lightFadeOffTime = 32<<8;
+$04DC $3000 MOVLW 0
+$04DD $00A4 MOVWF _lightFadeOffTime
+$04DE $3020 MOVLW 32
+$04DF $00A5 MOVWF _lightFadeOffTime+1
+$04E0 $01A6 CLRF _lightFadeOffTime+2
+$04E1 $01A7 CLRF _lightFadeOffTime+3
+;openKeyboard.c,378 :: }
+$04E2 $ L_config_67:
+;openKeyboard.c,379 :: }
+$04E2 $ L_config_65:
+;openKeyboard.c,381 :: if (justPressed[5]&32){ // 6
+$04E2 $1303 BCF STATUS, RP1
+$04E3 $1283 BCF STATUS, RP0
+$04E4 $1ECB BTFSS _justPressed+5, 5
+$04E5 $2CFA GOTO L_config_68
+;openKeyboard.c,382 :: if (data[1]&1)
+$04E6 $3001 MOVLW 1
+$04E7 $0540 ANDWF _data+1, 0
+$04E8 $00F0 MOVWF STACK_0
+$04E9 $1903 BTFSC STATUS, Z
+$04EA $2CEF GOTO L_config_69
+;openKeyboard.c,383 :: setupUsart(BAUDRATE_9600);
+$04EB $3005 MOVLW 5
+$04EC $00DE MOVWF FARG_setupUsart+0
+$04ED $21C7 CALL _setupUsart
+$04EE $2CFA GOTO L_config_70
+$04EF $ L_config_69:
+;openKeyboard.c,385 :: setupLightMode(LIGHTMODE_FADE);
+$04EF $3002 MOVLW 2
+$04F0 $1303 BCF STATUS, RP1
+$04F1 $1283 BCF STATUS, RP0
+$04F2 $00DE MOVWF FARG_setupLightMode+0
+$04F3 $2159 CALL _setupLightMode
+;openKeyboard.c,386 :: lightFadeOffTime = 64<<8;
+$04F4 $3000 MOVLW 0
+$04F5 $00A4 MOVWF _lightFadeOffTime
+$04F6 $3040 MOVLW 64
+$04F7 $00A5 MOVWF _lightFadeOffTime+1
+$04F8 $01A6 CLRF _lightFadeOffTime+2
+$04F9 $01A7 CLRF _lightFadeOffTime+3
+;openKeyboard.c,387 :: }
+$04FA $ L_config_70:
+;openKeyboard.c,388 :: }
+$04FA $ L_config_68:
+;openKeyboard.c,390 :: if (justPressed[5]&64){ // 7
+$04FA $1303 BCF STATUS, RP1
+$04FB $1283 BCF STATUS, RP0
+$04FC $1F4B BTFSS _justPressed+5, 6
+$04FD $2D0E GOTO L_config_71
+;openKeyboard.c,391 :: if (data[1]&1)
+$04FE $3001 MOVLW 1
+$04FF $0540 ANDWF _data+1, 0
+$0500 $00F0 MOVWF STACK_0
+$0501 $1D03 BTFSS STATUS, Z
+$0502 $2D0E GOTO L_config_73
+;openKeyboard.c,392 :: ;//setupUsart(BAUDRATE_19200);
+$0503 $ L_config_72:
+;openKeyboard.c,394 :: setupLightMode(LIGHTMODE_FADE);
+$0503 $3002 MOVLW 2
+$0504 $1303 BCF STATUS, RP1
+$0505 $1283 BCF STATUS, RP0
+$0506 $00DE MOVWF FARG_setupLightMode+0
+$0507 $2159 CALL _setupLightMode
+;openKeyboard.c,395 :: lightFadeOffTime = 128<<8;
+$0508 $3000 MOVLW 0
+$0509 $00A4 MOVWF _lightFadeOffTime
+$050A $3080 MOVLW 128
+$050B $00A5 MOVWF _lightFadeOffTime+1
+$050C $01A6 CLRF _lightFadeOffTime+2
+$050D $01A7 CLRF _lightFadeOffTime+3
+;openKeyboard.c,396 :: }
+$050E $ L_config_73:
+;openKeyboard.c,397 :: }
+$050E $ L_config_71:
+;openKeyboard.c,399 :: if (justPressed[0]&1){ // 8
+$050E $3001 MOVLW 1
+$050F $1303 BCF STATUS, RP1
+$0510 $1283 BCF STATUS, RP0
+$0511 $0546 ANDWF _justPressed, 0
+$0512 $00F0 MOVWF STACK_0
+$0513 $1903 BTFSC STATUS, Z
+$0514 $2D25 GOTO L_config_74
+;openKeyboard.c,400 :: if (data[1]&1)
+$0515 $3001 MOVLW 1
+$0516 $0540 ANDWF _data+1, 0
+$0517 $00F0 MOVWF STACK_0
+$0518 $1D03 BTFSS STATUS, Z
+$0519 $2D25 GOTO L_config_76
+;openKeyboard.c,401 :: ;//setupUsart(BAUDRATE_38400);
+$051A $ L_config_75:
+;openKeyboard.c,403 :: setupLightMode(LIGHTMODE_FADE);
+$051A $3002 MOVLW 2
+$051B $1303 BCF STATUS, RP1
+$051C $1283 BCF STATUS, RP0
+$051D $00DE MOVWF FARG_setupLightMode+0
+$051E $2159 CALL _setupLightMode
+;openKeyboard.c,404 :: lightFadeOffTime = 255<<8;
+$051F $3000 MOVLW 0
+$0520 $00A4 MOVWF _lightFadeOffTime
+$0521 $30FF MOVLW 255
+$0522 $00A5 MOVWF _lightFadeOffTime+1
+$0523 $01A6 CLRF _lightFadeOffTime+2
+$0524 $01A7 CLRF _lightFadeOffTime+3
+;openKeyboard.c,405 :: }
+$0525 $ L_config_76:
+;openKeyboard.c,406 :: }
+$0525 $ L_config_74:
+;openKeyboard.c,408 :: if (justPressed[0]&2){ // 9
+$0525 $1303 BCF STATUS, RP1
+$0526 $1283 BCF STATUS, RP0
+$0527 $1CC6 BTFSS _justPressed, 1
+$0528 $2D33 GOTO L_config_77
+;openKeyboard.c,409 :: if (data[1]&1)
+$0529 $3001 MOVLW 1
+$052A $0540 ANDWF _data+1, 0
+$052B $00F0 MOVWF STACK_0
+$052C $1D03 BTFSS STATUS, Z
+$052D $2D33 GOTO L_config_79
+;openKeyboard.c,410 :: ;//setupUsart(BAUDRATE_57600);
+$052E $ L_config_78:
+;openKeyboard.c,412 :: setupLightMode(LIGHTMODE_ALWAYSON);
+$052E $3001 MOVLW 1
+$052F $1303 BCF STATUS, RP1
+$0530 $1283 BCF STATUS, RP0
+$0531 $00DE MOVWF FARG_setupLightMode+0
+$0532 $2159 CALL _setupLightMode
+$0533 $ L_config_79:
+;openKeyboard.c,413 :: }
+$0533 $ L_config_77:
+;openKeyboard.c,415 :: if (justPressed[0]&4){ // 0
+$0533 $1303 BCF STATUS, RP1
+$0534 $1283 BCF STATUS, RP0
+$0535 $1D46 BTFSS _justPressed, 2
+$0536 $2D40 GOTO L_config_80
+;openKeyboard.c,416 :: if (data[1]&1)
+$0537 $3001 MOVLW 1
+$0538 $0540 ANDWF _data+1, 0
+$0539 $00F0 MOVWF STACK_0
+$053A $1D03 BTFSS STATUS, Z
+$053B $2D40 GOTO L_config_82
+;openKeyboard.c,417 :: ;//setupUsart(BAUDRATE_115200);
+$053C $ L_config_81:
+;openKeyboard.c,419 :: setupLightMode(LIGHTMODE_ALWAYSOFF);
+$053C $1303 BCF STATUS, RP1
+$053D $1283 BCF STATUS, RP0
+$053E $01DE CLRF FARG_setupLightMode+0, 1
+$053F $2159 CALL _setupLightMode
+$0540 $ L_config_82:
+;openKeyboard.c,420 :: }
+$0540 $ L_config_80:
+;openKeyboard.c,422 :: if (justPressed[3]&1){ // A
+$0540 $3001 MOVLW 1
+$0541 $1303 BCF STATUS, RP1
+$0542 $1283 BCF STATUS, RP0
+$0543 $0549 ANDWF _justPressed+3, 0
+$0544 $00F0 MOVWF STACK_0
+$0545 $1903 BTFSC STATUS, Z
+$0546 $2D4A GOTO L_config_83
+;openKeyboard.c,423 :: setupSendMode(SENDMODE_SCAN);
+$0547 $3001 MOVLW 1
+$0548 $00DE MOVWF FARG_setupSendMode+0
+$0549 $2248 CALL _setupSendMode
+;openKeyboard.c,424 :: }
+$054A $ L_config_83:
+;openKeyboard.c,426 :: if (justPressed[3]&2){ // S
+$054A $1303 BCF STATUS, RP1
+$054B $1283 BCF STATUS, RP0
+$054C $1CC9 BTFSS _justPressed+3, 1
+$054D $2D50 GOTO L_config_84
+;openKeyboard.c,427 :: setupSendMode(SENDMODE_SERIAL);
+$054E $01DE CLRF FARG_setupSendMode+0, 1
+$054F $2248 CALL _setupSendMode
+;openKeyboard.c,428 :: }
+$0550 $ L_config_84:
+;openKeyboard.c,430 :: Delay_5ms();
+$0550 $227F CALL _Delay_5ms
+;openKeyboard.c,432 :: }
+$0551 $0008 RETURN
+$0552 $ _saveConfig:
+;openKeyboard.c,434 :: void saveConfig(){
+;openKeyboard.c,435 :: EEprom_write(CONFIG_BAUDRATE, baudrate);
+$0552 $3001 MOVLW 1
+$0553 $1303 BCF STATUS, RP1
+$0554 $1283 BCF STATUS, RP0
+$0555 $00DF MOVWF FARG_EEprom_write+0
+$0556 $082E MOVF _baudrate, 0
+$0557 $00E0 MOVWF FARG_EEprom_write+1
+$0558 $2120 CALL _EEprom_write
+;openKeyboard.c,436 :: EEprom_write(CONFIG_SENDMODE, sendMode);
+$0559 $3002 MOVLW 2
+$055A $1303 BCF STATUS, RP1
+$055B $1283 BCF STATUS, RP0
+$055C $00DF MOVWF FARG_EEprom_write+0
+$055D $0832 MOVF _sendMode, 0
+$055E $00E0 MOVWF FARG_EEprom_write+1
+$055F $2120 CALL _EEprom_write
+;openKeyboard.c,437 :: EEprom_write(CONFIG_LIGHTMODE, lightMode);
+$0560 $3003 MOVLW 3
+$0561 $1303 BCF STATUS, RP1
+$0562 $1283 BCF STATUS, RP0
+$0563 $00DF MOVWF FARG_EEprom_write+0
+$0564 $082D MOVF _lightMode, 0
+$0565 $00E0 MOVWF FARG_EEprom_write+1
+$0566 $2120 CALL _EEprom_write
+;openKeyboard.c,438 :: EEprom_write(CONFIG_LIGHTSTRENGTH, lightStrenght);
+$0567 $3004 MOVLW 4
+$0568 $1303 BCF STATUS, RP1
+$0569 $1283 BCF STATUS, RP0
+$056A $00DF MOVWF FARG_EEprom_write+0
+$056B $0829 MOVF _lightStrenght, 0
+$056C $00E0 MOVWF FARG_EEprom_write+1
+$056D $2120 CALL _EEprom_write
+;openKeyboard.c,439 :: EEprom_write(CONFIG_LIGHTFADEOFFTIME, lightFadeOffTime>>8);
+$056E $3005 MOVLW 5
+$056F $1303 BCF STATUS, RP1
+$0570 $1283 BCF STATUS, RP0
+$0571 $00DF MOVWF FARG_EEprom_write+0
+$0572 $0825 MOVF _lightFadeOffTime+1, 0
+$0573 $00F0 MOVWF STACK_0
+$0574 $0826 MOVF _lightFadeOffTime+2, 0
+$0575 $00F1 MOVWF STACK_0+1
+$0576 $0827 MOVF _lightFadeOffTime+3, 0
+$0577 $00F2 MOVWF STACK_0+2
+$0578 $01F3 CLRF STACK_0+3
+$0579 $0870 MOVF STACK_0, 0
+$057A $00E0 MOVWF FARG_EEprom_write+1
+$057B $2120 CALL _EEprom_write
+;openKeyboard.c,440 :: }
+$057C $0008 RETURN
+$057D $ _nop:
+;openKeyboard.c,165 :: void nop(){
+;openKeyboard.c,167 :: }
+$057D $0008 RETURN
+$057E $ _lightFade:
+;openKeyboard.c,169 :: void lightFade(){
+;openKeyboard.c,171 :: if (newlyPressd) {
+$057E $1303 BCF STATUS, RP1
+$057F $1283 BCF STATUS, RP0
+$0580 $0836 MOVF _newlyPressd, 0
+$0581 $1903 BTFSC STATUS, Z
+$0582 $2D85 GOTO L_lightFade_13
+;openKeyboard.c,172 :: turnBacklightOn();
+$0583 $2106 CALL _turnBacklightOn
+;openKeyboard.c,173 :: return;
+$0584 $0008 RETURN
+;openKeyboard.c,174 :: }
+$0585 $ L_lightFade_13:
+;openKeyboard.c,176 :: if (timer>0) timer --;
+$0585 $1303 BCF STATUS, RP1
+$0586 $1283 BCF STATUS, RP0
+$0587 $0823 MOVF _timer+3, 0
+$0588 $3C00 SUBLW 0
+$0589 $1D03 BTFSS STATUS, Z
+$058A $2D95 GOTO L_lightFade_91
+$058B $0822 MOVF _timer+2, 0
+$058C $3C00 SUBLW 0
+$058D $1D03 BTFSS STATUS, Z
+$058E $2D95 GOTO L_lightFade_91
+$058F $0821 MOVF _timer+1, 0
+$0590 $3C00 SUBLW 0
+$0591 $1D03 BTFSS STATUS, Z
+$0592 $2D95 GOTO L_lightFade_91
+$0593 $0820 MOVF _timer, 0
+$0594 $3C00 SUBLW 0
+$0595 $ L_lightFade_91:
+$0595 $1803 BTFSC STATUS, C
+$0596 $2DA2 GOTO L_lightFade_14
+$0597 $3001 MOVLW 1
+$0598 $1303 BCF STATUS, RP1
+$0599 $1283 BCF STATUS, RP0
+$059A $02A0 SUBWF _timer, 1
+$059B $1C03 BTFSS STATUS, C
+$059C $02A1 SUBWF _timer+1, 1
+$059D $1C03 BTFSS STATUS, C
+$059E $02A2 SUBWF _timer+2, 1
+$059F $1C03 BTFSS STATUS, C
+$05A0 $02A3 SUBWF _timer+3, 1
+$05A1 $2DA8 GOTO L_lightFade_15
+$05A2 $ L_lightFade_14:
+;openKeyboard.c,180 :: PORTC = 255;
+$05A2 $30FF MOVLW 255
+$05A3 $1303 BCF STATUS, RP1
+$05A4 $1283 BCF STATUS, RP0
+$05A5 $0087 MOVWF PORTC
+;openKeyboard.c,181 :: pwmRunning = 0;
+$05A6 $01A8 CLRF _pwmRunning, 1
+;openKeyboard.c,182 :: enterPowerSave();
+$05A7 $2292 CALL _enterPowerSave
+;openKeyboard.c,183 :: }
+$05A8 $ L_lightFade_15:
+;openKeyboard.c,185 :: if (timer<(~lightStrenght)){
+$05A8 $1303 BCF STATUS, RP1
+$05A9 $1283 BCF STATUS, RP0
+$05AA $0929 COMF _lightStrenght, W
+$05AB $00F1 MOVWF STACK_1
+$05AC $3000 MOVLW 0
+$05AD $0223 SUBWF _timer+3, 0
+$05AE $1D03 BTFSS STATUS, Z
+$05AF $2DBA GOTO L_lightFade_92
+$05B0 $3000 MOVLW 0
+$05B1 $0222 SUBWF _timer+2, 0
+$05B2 $1D03 BTFSS STATUS, Z
+$05B3 $2DBA GOTO L_lightFade_92
+$05B4 $3000 MOVLW 0
+$05B5 $0221 SUBWF _timer+1, 0
+$05B6 $1D03 BTFSS STATUS, Z
+$05B7 $2DBA GOTO L_lightFade_92
+$05B8 $0871 MOVF STACK_1, 0
+$05B9 $0220 SUBWF _timer, 0
+$05BA $ L_lightFade_92:
+$05BA $1803 BTFSC STATUS, C
+$05BB $2DC4 GOTO L_lightFade_16
+;openKeyboard.c,186 :: PWM1_Change_Duty(~((unsigned char)timer));
+$05BC $1303 BCF STATUS, RP1
+$05BD $1283 BCF STATUS, RP0
+$05BE $0920 COMF _timer, W
+$05BF $00E4 MOVWF FARG_PWM1_Change_Duty+0
+$05C0 $207C CALL _PWM1_Change_Duty
+;openKeyboard.c,187 :: PWM2_Change_Duty(~((unsigned char)timer));
+$05C1 $0920 COMF _timer, W
+$05C2 $00E4 MOVWF FARG_PWM2_Change_Duty+0
+$05C3 $20B9 CALL _PWM2_Change_Duty
+;openKeyboard.c,188 :: }
+$05C4 $ L_lightFade_16:
+;openKeyboard.c,190 :: }
+$05C4 $0008 RETURN
+$05C5 $ _scanSend:
+;openKeyboard.c,276 :: void scanSend(){
+;openKeyboard.c,277 :: unsigned char idx = 0;
+$05C5 $1303 BCF STATUS, RP1
+$05C6 $1283 BCF STATUS, RP0
+$05C7 $01DB CLRF scanSend_idx_L0, 1
+;openKeyboard.c,278 :: unsigned char sc = 0;
+$05C8 $01DC CLRF scanSend_sc_L0, 1
+;openKeyboard.c,279 :: unsigned char bs = 0;
+$05C9 $01DD CLRF scanSend_bs_L0, 1
+;openKeyboard.c,281 :: for (AMask=1; AMask<128; AMask<<=1){
+$05CA $3001 MOVLW 1
+$05CB $00B7 MOVWF _AMask
+$05CC $ L_scanSend_35:
+$05CC $3080 MOVLW 128
+$05CD $1303 BCF STATUS, RP1
+$05CE $1283 BCF STATUS, RP0
+$05CF $0237 SUBWF _AMask, 0
+$05D0 $1803 BTFSC STATUS, C
+$05D1 $2E37 GOTO L_scanSend_36
+;openKeyboard.c,282 :: somethingChanged = data[sc] ^ oldData[sc];
+$05D2 $085C MOVF scanSend_sc_L0, 0
+$05D3 $3F3F ADDLW _data
+$05D4 $0084 MOVWF FSR
+$05D5 $0800 MOVF INDF, 0
+$05D6 $00CD MOVWF _somethingChanged
+$05D7 $085C MOVF scanSend_sc_L0, 0
+$05D8 $3F38 ADDLW _oldData
+$05D9 $0084 MOVWF FSR
+$05DA $0800 MOVF INDF, 0
+$05DB $00F0 MOVWF STACK_0
+$05DC $0870 MOVF STACK_0, 0
+$05DD $06CD XORWF _somethingChanged, 1
+;openKeyboard.c,283 :: bs = 0;
+$05DE $01DD CLRF scanSend_bs_L0, 1
+;openKeyboard.c,284 :: for (BMask=1; BMask<128; BMask<<=1){
+$05DF $3001 MOVLW 1
+$05E0 $00CE MOVWF _BMask
+$05E1 $ L_scanSend_38:
+$05E1 $3080 MOVLW 128
+$05E2 $1303 BCF STATUS, RP1
+$05E3 $1283 BCF STATUS, RP0
+$05E4 $024E SUBWF _BMask, 0
+$05E5 $1803 BTFSC STATUS, C
+$05E6 $2E2F GOTO L_scanSend_39
+;openKeyboard.c,285 :: if (someThingChanged & BMask)
+$05E7 $084E MOVF _BMask, 0
+$05E8 $054D ANDWF _somethingChanged, 0
+$05E9 $00F0 MOVWF STACK_0
+$05EA $1903 BTFSC STATUS, Z
+$05EB $2E26 GOTO L_scanSend_41
+;openKeyboard.c,286 :: USART_Write(scanMap[idx] | (((data[sc]&BMask)>>bs)<<6)); // | 64 if pressed
+$05EC $085B MOVF scanSend_idx_L0, 0
+$05ED $3FA9 ADDLW #_scanMap
+$05EE $00F0 MOVWF STACK_0
+$05EF $3002 MOVLW @#_scanMap
+$05F0 $1803 BTFSC STATUS, C
+$05F1 $3F01 ADDLW 1
+$05F2 $00F1 MOVWF STACK_0+1
+$05F3 $0870 MOVF STACK_0, 0
+$05F4 $00B5 MOVWF ___DoICPLoAddr
+$05F5 $0871 MOVF STACK_0+1, 0
+$05F6 $00B4 MOVWF ___DoICPHiAddr
+$05F7 $080A MOVF PCLATH, 0
+$05F8 $00B3 MOVWF ___DoICPSavePCLATH
+$05F9 $22DC CALL _____DoICP
+$05FA $00DE MOVWF FARG_Usart_Write+0
+$05FB $0833 MOVF ___DoICPSavePCLATH, 0
+$05FC $008A MOVWF PCLATH
+$05FD $085C MOVF scanSend_sc_L0, 0
+$05FE $3F3F ADDLW _data
+$05FF $0084 MOVWF FSR
+$0600 $0800 MOVF INDF, 0
+$0601 $00F0 MOVWF STACK_0
+$0602 $084E MOVF _BMask, 0
+$0603 $0570 ANDWF STACK_0, 0
+$0604 $00F2 MOVWF STACK_2
+$0605 $085D MOVF scanSend_bs_L0, 0
+$0606 $00F0 MOVWF STACK_0
+$0607 $0872 MOVF STACK_2, 0
+$0608 $00F3 MOVWF STACK_3
+$0609 $0870 MOVF STACK_0, 0
+$060A $ L_scanSend_93:
+$060A $1903 BTFSC STATUS, Z
+$060B $2E12 GOTO L_scanSend_94
+$060C $1303 BCF STATUS, RP1
+$060D $1283 BCF STATUS, RP0
+$060E $0CF3 RRF STACK_3, 1
+$060F $13F3 BCF STACK_3, 7
+$0610 $3FFF ADDLW 255
+$0611 $2E0A GOTO L_scanSend_93
+$0612 $ L_scanSend_94:
+$0612 $3006 MOVLW 6
+$0613 $1303 BCF STATUS, RP1
+$0614 $1283 BCF STATUS, RP0
+$0615 $00F2 MOVWF STACK_2
+$0616 $0873 MOVF STACK_3, 0
+$0617 $00F0 MOVWF STACK_0
+$0618 $0872 MOVF STACK_2, 0
+$0619 $ L_scanSend_95:
+$0619 $1903 BTFSC STATUS, Z
+$061A $2E21 GOTO L_scanSend_96
+$061B $1303 BCF STATUS, RP1
+$061C $1283 BCF STATUS, RP0
+$061D $0DF0 RLF STACK_0, 1
+$061E $1070 BCF STACK_0, 0
+$061F $3FFF ADDLW 255
+$0620 $2E19 GOTO L_scanSend_95
+$0621 $ L_scanSend_96:
+$0621 $1303 BCF STATUS, RP1
+$0622 $1283 BCF STATUS, RP0
+$0623 $0870 MOVF STACK_0, 0
+$0624 $04DE IORWF FARG_Usart_Write+0, 1
+$0625 $2298 CALL _Usart_Write
+$0626 $ L_scanSend_41:
+;openKeyboard.c,287 :: bs++;
+$0626 $1303 BCF STATUS, RP1
+$0627 $1283 BCF STATUS, RP0
+$0628 $0ADD INCF scanSend_bs_L0, 1
+;openKeyboard.c,288 :: idx++;
+$0629 $0ADB INCF scanSend_idx_L0, 1
+;openKeyboard.c,289 :: }
+$062A $ L_scanSend_40:
+;openKeyboard.c,284 :: for (BMask=1; BMask<128; BMask<<=1){
+$062A $1303 BCF STATUS, RP1
+$062B $1283 BCF STATUS, RP0
+$062C $0DCE RLF _BMask, 1
+$062D $104E BCF _BMask, 0
+;openKeyboard.c,289 :: }
+$062E $2DE1 GOTO L_scanSend_38
+$062F $ L_scanSend_39:
+;openKeyboard.c,290 :: sc++;
+$062F $1303 BCF STATUS, RP1
+$0630 $1283 BCF STATUS, RP0
+$0631 $0ADC INCF scanSend_sc_L0, 1
+;openKeyboard.c,291 :: }
+$0632 $ L_scanSend_37:
+;openKeyboard.c,281 :: for (AMask=1; AMask<128; AMask<<=1){
+$0632 $1303 BCF STATUS, RP1
+$0633 $1283 BCF STATUS, RP0
+$0634 $0DB7 RLF _AMask, 1
+$0635 $1037 BCF _AMask, 0
+;openKeyboard.c,291 :: }
+$0636 $2DCC GOTO L_scanSend_35
+$0637 $ L_scanSend_36:
+;openKeyboard.c,292 :: }
+$0637 $0008 RETURN
+$0638 $ _serialSend:
+;openKeyboard.c,262 :: void serialSend(){
+;openKeyboard.c,263 :: unsigned char idx = 0;
+$0638 $1303 BCF STATUS, RP1
+$0639 $1283 BCF STATUS, RP0
+$063A $01DB CLRF serialSend_idx_L0, 1
+;openKeyboard.c,264 :: unsigned char sc = 0;
+$063B $01DC CLRF serialSend_sc_L0, 1
+;openKeyboard.c,266 :: for (AMask=1; AMask<128; AMask<<=1){
+$063C $3001 MOVLW 1
+$063D $00B7 MOVWF _AMask
+$063E $ L_serialSend_28:
+$063E $3080 MOVLW 128
+$063F $1303 BCF STATUS, RP1
+$0640 $1283 BCF STATUS, RP0
+$0641 $0237 SUBWF _AMask, 0
+$0642 $1803 BTFSC STATUS, C
+$0643 $2E82 GOTO L_serialSend_29
+;openKeyboard.c,267 :: for (BMask=1; BMask<128; BMask<<=1){
+$0644 $3001 MOVLW 1
+$0645 $00CE MOVWF _BMask
+$0646 $ L_serialSend_31:
+$0646 $3080 MOVLW 128
+$0647 $1303 BCF STATUS, RP1
+$0648 $1283 BCF STATUS, RP0
+$0649 $024E SUBWF _BMask, 0
+$064A $1803 BTFSC STATUS, C
+$064B $2E7A GOTO L_serialSend_32
+;openKeyboard.c,268 :: if (justPressed[sc] & BMask) USART_Write(serialMap[alt][idx]);
+$064C $085C MOVF serialSend_sc_L0, 0
+$064D $3F46 ADDLW _justPressed
+$064E $0084 MOVWF FSR
+$064F $0800 MOVF INDF, 0
+$0650 $00F0 MOVWF STACK_0
+$0651 $084E MOVF _BMask, 0
+$0652 $05F0 ANDWF STACK_0, 1
+$0653 $1903 BTFSC STATUS, Z
+$0654 $2E72 GOTO L_serialSend_34
+$0655 $084F MOVF _alt, 0
+$0656 $00F0 MOVWF STACK_0
+$0657 $01F1 CLRF STACK_0+1
+$0658 $3031 MOVLW 49
+$0659 $00F4 MOVWF STACK_4
+$065A $3000 MOVLW 0
+$065B $00F5 MOVWF STACK_4+1
+$065C $23A8 CALL _mul_16x16_u
+$065D $30E3 MOVLW #_serialMap
+$065E $07F0 ADDWF STACK_0, 1
+$065F $3002 MOVLW @#_serialMap
+$0660 $1803 BTFSC STATUS, C
+$0661 $3F01 ADDLW 1
+$0662 $07F1 ADDWF STACK_0+1, 1
+$0663 $085B MOVF serialSend_idx_L0, 0
+$0664 $07F0 ADDWF STACK_0, 1
+$0665 $1803 BTFSC STATUS, C
+$0666 $0AF1 INCF STACK_0+1, 1
+$0667 $0870 MOVF STACK_0, 0
+$0668 $00B5 MOVWF ___DoICPLoAddr
+$0669 $0871 MOVF STACK_0+1, 0
+$066A $00B4 MOVWF ___DoICPHiAddr
+$066B $080A MOVF PCLATH, 0
+$066C $00B3 MOVWF ___DoICPSavePCLATH
+$066D $22DC CALL _____DoICP
+$066E $00DE MOVWF FARG_Usart_Write+0
+$066F $0833 MOVF ___DoICPSavePCLATH, 0
+$0670 $008A MOVWF PCLATH
+$0671 $2298 CALL _Usart_Write
+$0672 $ L_serialSend_34:
+;openKeyboard.c,269 :: idx++;
+$0672 $1303 BCF STATUS, RP1
+$0673 $1283 BCF STATUS, RP0
+$0674 $0ADB INCF serialSend_idx_L0, 1
+;openKeyboard.c,270 :: }
+$0675 $ L_serialSend_33:
+;openKeyboard.c,267 :: for (BMask=1; BMask<128; BMask<<=1){
+$0675 $1303 BCF STATUS, RP1
+$0676 $1283 BCF STATUS, RP0
+$0677 $0DCE RLF _BMask, 1
+$0678 $104E BCF _BMask, 0
+;openKeyboard.c,270 :: }
+$0679 $2E46 GOTO L_serialSend_31
+$067A $ L_serialSend_32:
+;openKeyboard.c,271 :: sc++;
+$067A $1303 BCF STATUS, RP1
+$067B $1283 BCF STATUS, RP0
+$067C $0ADC INCF serialSend_sc_L0, 1
+;openKeyboard.c,272 :: }
+$067D $ L_serialSend_30:
+;openKeyboard.c,266 :: for (AMask=1; AMask<128; AMask<<=1){
+$067D $1303 BCF STATUS, RP1
+$067E $1283 BCF STATUS, RP0
+$067F $0DB7 RLF _AMask, 1
+$0680 $1037 BCF _AMask, 0
+;openKeyboard.c,272 :: }
+$0681 $2E3E GOTO L_serialSend_28
+$0682 $ L_serialSend_29:
+;openKeyboard.c,273 :: alt = alts[data[2]&1|((data[1]&1)<<1)|((data[0]&64)>>4)]; // next scan can use alt retrieved here
+$0682 $3001 MOVLW 1
+$0683 $1303 BCF STATUS, RP1
+$0684 $1283 BCF STATUS, RP0
+$0685 $0541 ANDWF _data+2, 0
+$0686 $00F4 MOVWF STACK_4
+$0687 $3001 MOVLW 1
+$0688 $0540 ANDWF _data+1, 0
+$0689 $00F3 MOVWF STACK_3
+$068A $0873 MOVF STACK_3, 0
+$068B $00F0 MOVWF STACK_0
+$068C $01F1 CLRF STACK_0+1
+$068D $0DF0 RLF STACK_0, 1
+$068E $0DF1 RLF STACK_0+1, 1
+$068F $1070 BCF STACK_0, 0
+$0690 $3000 MOVLW 0
+$0691 $00F5 MOVWF STACK_4+1
+$0692 $0870 MOVF STACK_0, 0
+$0693 $04F4 IORWF STACK_4, 1
+$0694 $0871 MOVF STACK_0+1, 0
+$0695 $04F5 IORWF STACK_4+1, 1
+$0696 $3040 MOVLW 64
+$0697 $053F ANDWF _data, 0
+$0698 $00F3 MOVWF STACK_3
+$0699 $0873 MOVF STACK_3, 0
+$069A $00F0 MOVWF STACK_0
+$069B $0CF0 RRF STACK_0, 1
+$069C $13F0 BCF STACK_0, 7
+$069D $0CF0 RRF STACK_0, 1
+$069E $13F0 BCF STACK_0, 7
+$069F $0CF0 RRF STACK_0, 1
+$06A0 $13F0 BCF STACK_0, 7
+$06A1 $0CF0 RRF STACK_0, 1
+$06A2 $13F0 BCF STACK_0, 7
+$06A3 $3000 MOVLW 0
+$06A4 $00F1 MOVWF STACK_0+1
+$06A5 $0874 MOVF STACK_4, 0
+$06A6 $04F0 IORWF STACK_0, 1
+$06A7 $0875 MOVF STACK_4+1, 0
+$06A8 $04F1 IORWF STACK_0+1, 1
+$06A9 $0870 MOVF STACK_0, 0
+$06AA $3F50 ADDLW _alts
+$06AB $0084 MOVWF FSR
+$06AC $0800 MOVF INDF, 0
+$06AD $00CF MOVWF _alt
+;openKeyboard.c,274 :: }
+$06AE $0008 RETURN
+$06AF $ _Delay_80us:
+;delays.c,23 :: void Delay_80us() {
+;delays.c,24 :: Delay_us(78);
+$06AF $3019 MOVLW 25
+$06B0 $1303 BCF STATUS, RP1
+$06B1 $1283 BCF STATUS, RP0
+$06B2 $00FA MOVWF STACK_10
+$06B3 $0BFA DECFSZ STACK_10, F
+$06B4 $2EB3 GOTO $-1
+$06B5 $0000 NOP
+$06B6 $0000 NOP
+;delays.c,25 :: }
+$06B7 $0008 RETURN
+$0800 $ GlobalIniopenKeyboard:
+$0800 $3000 MOVLW 0
+$0801 $1303 BCF STATUS, RP1
+$0802 $1283 BCF STATUS, RP0
+$0803 $00BF MOVWF _data+0
+$0804 $3000 MOVLW 0
+$0805 $00C0 MOVWF _data+1
+$0806 $3000 MOVLW 0
+$0807 $00C1 MOVWF _data+2
+$0808 $3000 MOVLW 0
+$0809 $00C2 MOVWF _data+3
+$080A $3000 MOVLW 0
+$080B $00C3 MOVWF _data+4
+$080C $3000 MOVLW 0
+$080D $00C4 MOVWF _data+5
+$080E $3000 MOVLW 0
+$080F $00C5 MOVWF _data+6
+$0810 $3000 MOVLW 0
+$0811 $00B8 MOVWF _oldData+0
+$0812 $3000 MOVLW 0
+$0813 $00B9 MOVWF _oldData+1
+$0814 $3000 MOVLW 0
+$0815 $00BA MOVWF _oldData+2
+$0816 $3000 MOVLW 0
+$0817 $00BB MOVWF _oldData+3
+$0818 $3000 MOVLW 0
+$0819 $00BC MOVWF _oldData+4
+$081A $3000 MOVLW 0
+$081B $00BD MOVWF _oldData+5
+$081C $3000 MOVLW 0
+$081D $00BE MOVWF _oldData+6
+$081E $3000 MOVLW 0
+$081F $00C6 MOVWF _justPressed+0
+$0820 $3000 MOVLW 0
+$0821 $00C7 MOVWF _justPressed+1
+$0822 $3000 MOVLW 0
+$0823 $00C8 MOVWF _justPressed+2
+$0824 $3000 MOVLW 0
+$0825 $00C9 MOVWF _justPressed+3
+$0826 $3000 MOVLW 0
+$0827 $00CA MOVWF _justPressed+4
+$0828 $3000 MOVLW 0
+$0829 $00CB MOVWF _justPressed+5
+$082A $3000 MOVLW 0
+$082B $00CC MOVWF _justPressed+6
+$082C $3000 MOVLW 0
+$082D $00B6 MOVWF _newlyPressd+0
+$082E $3000 MOVLW 0
+$082F $00B7 MOVWF _AMask+0
+$0830 $3000 MOVLW 0
+$0831 $00CE MOVWF _BMask+0
+$0832 $3000 MOVLW 0
+$0833 $00CD MOVWF _somethingChanged+0
+$0834 $30FF MOVLW 255
+$0835 $00A0 MOVWF _timer+0
+$0836 $30FF MOVLW 255
+$0837 $00A1 MOVWF _timer+1
+$0838 $3000 MOVLW 0
+$0839 $00A2 MOVWF _timer+2
+$083A $3000 MOVLW 0
+$083B $00A3 MOVWF _timer+3
+$083C $3000 MOVLW 0
+$083D $00A4 MOVWF _lightFadeOffTime+0
+$083E $3080 MOVLW 128
+$083F $00A5 MOVWF _lightFadeOffTime+1
+$0840 $3000 MOVLW 0
+$0841 $00A6 MOVWF _lightFadeOffTime+2
+$0842 $3000 MOVLW 0
+$0843 $00A7 MOVWF _lightFadeOffTime+3
+$0844 $3000 MOVLW 0
+$0845 $00D0 MOVWF _alts+0
+$0846 $3001 MOVLW 1
+$0847 $00D1 MOVWF _alts+1
+$0848 $3002 MOVLW 2
+$0849 $00D2 MOVWF _alts+2
+$084A $3002 MOVLW 2
+$084B $00D3 MOVWF _alts+3
+$084C $3003 MOVLW 3
+$084D $00D4 MOVWF _alts+4
+$084E $3003 MOVLW 3
+$084F $00D5 MOVWF _alts+5
+$0850 $3003 MOVLW 3
+$0851 $00D6 MOVWF _alts+6
+$0852 $3003 MOVLW 3
+$0853 $00D7 MOVWF _alts+7
+$0854 $3000 MOVLW 0
+$0855 $00AF MOVWF _send+0
+$0856 $3000 MOVLW 0
+$0857 $00B0 MOVWF _send+1
+$0858 $3000 MOVLW 0
+$0859 $00B1 MOVWF _send+2
+$085A $3000 MOVLW 0
+$085B $00AA MOVWF _lightHandler+0
+$085C $3000 MOVLW 0
+$085D $00AB MOVWF _lightHandler+1
+$085E $3000 MOVLW 0
+$085F $00AC MOVWF _lightHandler+2
+$0860 $3000 MOVLW 0
+$0861 $00AE MOVWF _baudrate+0
+$0862 $3000 MOVLW 0
+$0863 $00B2 MOVWF _sendMode+0
+$0864 $3000 MOVLW 0
+$0865 $00AD MOVWF _lightMode+0
+$0866 $3000 MOVLW 0
+$0867 $00A9 MOVWF _lightStrenght+0
+$0868 $3000 MOVLW 0
+$0869 $00A8 MOVWF _pwmRunning+0
+;openKeyboard.c,517 :: }
+$086A $0008 RETURN
+$06B8 $ _____DoICF:
+$06B8 $1303 BCF STATUS, RP1
+$06B9 $1283 BCF STATUS, RP0
+$06BA $0834 MOVF ___DoICPHiAddr, 0
+$06BB $008A MOVWF PCLATH
+$06BC $0835 MOVF ___DoICPLoAddr, 0
+$06BD $0082 MOVWF PCL
+$06BE $0008 RETURN
+$086B $ _main:
+;openKeyboard.c,453 :: void main() {
+;openKeyboard.c,455 :: OSCCON = 0x67; // 01100111 - 0110 stands for 4Mhz internal clock
+$086B $2000 CALL GlobalIniopenKeyboard
+$086C $3067 MOVLW 103
+$086D $1303 BCF STATUS, RP1
+$086E $1683 BSF STATUS, RP0
+$086F $008F MOVWF OSCCON
+;openKeyboard.c,457 :: ANSEL = 0; // Configure AN pins as digital I/O
+$0870 $1703 BSF STATUS, RP1
+$0871 $0188 CLRF ANSEL, 1
+;openKeyboard.c,458 :: ANSELH = 0;
+$0872 $0189 CLRF ANSELH, 1
+;openKeyboard.c,460 :: PORTA = 0; // init port A
+$0873 $1303 BCF STATUS, RP1
+$0874 $1283 BCF STATUS, RP0
+$0875 $0185 CLRF PORTA, 1
+;openKeyboard.c,461 :: TRISA = 0; // 1 = input
+$0876 $1683 BSF STATUS, RP0
+$0877 $0185 CLRF TRISA, 1
+;openKeyboard.c,463 :: PORTB = 0; // initialize PORTB
+$0878 $1283 BCF STATUS, RP0
+$0879 $0186 CLRF PORTB, 1
+;openKeyboard.c,464 :: TRISB = 255; // designate PORTB as all input
+$087A $30FF MOVLW 255
+$087B $1683 BSF STATUS, RP0
+$087C $0086 MOVWF TRISB
+;openKeyboard.c,466 :: PORTC = 0; // initialize PORTC
+$087D $1283 BCF STATUS, RP0
+$087E $0187 CLRF PORTC, 1
+;openKeyboard.c,467 :: TRISC = 0; // designate PORTB 0-7 as output
+$087F $1683 BSF STATUS, RP0
+$0880 $0187 CLRF TRISC, 1
+;openKeyboard.c,469 :: OPTION_REG = 0; // pull-ups enabled on PORTB....no external pull-downs
+$0881 $0181 CLRF OPTION_REG, 1
+;openKeyboard.c,474 :: INTCON.RBIE = 0; // disables PORTB on-change interrupt
+$0882 $118B BCF INTCON, 3
+;openKeyboard.c,475 :: INTCON.RBIF = 0; // clear PORTB mismatch values
+$0883 $100B BCF INTCON, 0
+;openKeyboard.c,477 :: IOCB = 127; // pin 0-6 of PORTB configured to raise interrupt when changed
+$0884 $307F MOVLW 127
+$0885 $0096 MOVWF IOCB
+;openKeyboard.c,479 :: PIE1 = 32; // RCIE = 1; enables EUSART on-receive interrupt
+$0886 $3020 MOVLW 32
+$0887 $008C MOVWF PIE1
+;openKeyboard.c,481 :: INTCON.GIE = 1; // Global Interrupt Enable/disable
+$0888 $178B BSF INTCON, 7
+;openKeyboard.c,484 :: Delay_ms(20); // required for eeprom_read to work correctly
+$0889 $301A MOVLW 26
+$088A $00FB MOVWF STACK_11
+$088B $30FF MOVLW 255
+$088C $00FA MOVWF STACK_10
+$088D $0BFB DECFSZ STACK_11, F
+$088E $2890 GOTO $+2
+$088F $2893 GOTO $+4
+$0890 $0BFA DECFSZ STACK_10, F
+$0891 $2890 GOTO $-1
+$0892 $288D GOTO $-5
+$0893 $30E7 MOVLW 231
+$0894 $00FA MOVWF STACK_10
+$0895 $0BFA DECFSZ STACK_10, F
+$0896 $2895 GOTO $-1
+$0897 $0000 NOP
+;openKeyboard.c,485 :: sendMode = EEprom_read(CONFIG_SENDMODE);
+$0898 $3002 MOVLW 2
+$0899 $1283 BCF STATUS, RP0
+$089A $00DB MOVWF FARG_EEprom_read+0
+$089B $118A BCF PCLATH, 3
+$089C $23D3 CALL _EEprom_read
+$089D $158A BSF PCLATH, 3
+$089E $0870 MOVF STACK_0, 0
+$089F $1303 BCF STATUS, RP1
+$08A0 $00B2 MOVWF _sendMode
+;openKeyboard.c,486 :: setupSendMode(sendMode);
+$08A1 $0870 MOVF STACK_0, 0
+$08A2 $00DE MOVWF FARG_setupSendMode+0
+$08A3 $118A BCF PCLATH, 3
+$08A4 $2248 CALL _setupSendMode
+$08A5 $158A BSF PCLATH, 3
+;openKeyboard.c,490 :: Delay_ms(20); // required for eeprom_read to work correctly
+$08A6 $301A MOVLW 26
+$08A7 $00FB MOVWF STACK_11
+$08A8 $30FF MOVLW 255
+$08A9 $00FA MOVWF STACK_10
+$08AA $0BFB DECFSZ STACK_11, F
+$08AB $28AD GOTO $+2
+$08AC $28B0 GOTO $+4
+$08AD $0BFA DECFSZ STACK_10, F
+$08AE $28AD GOTO $-1
+$08AF $28AA GOTO $-5
+$08B0 $30E7 MOVLW 231
+$08B1 $00FA MOVWF STACK_10
+$08B2 $0BFA DECFSZ STACK_10, F
+$08B3 $28B2 GOTO $-1
+$08B4 $0000 NOP
+;openKeyboard.c,491 :: baudrate = EEprom_read(CONFIG_BAUDRATE);
+$08B5 $3001 MOVLW 1
+$08B6 $00DB MOVWF FARG_EEprom_read+0
+$08B7 $118A BCF PCLATH, 3
+$08B8 $23D3 CALL _EEprom_read
+$08B9 $158A BSF PCLATH, 3
+$08BA $0870 MOVF STACK_0, 0
+$08BB $1303 BCF STATUS, RP1
+$08BC $00AE MOVWF _baudrate
+;openKeyboard.c,492 :: setupUsart(baudrate); // Initalize USART (xxxx baud rate, 1 stop bit, no parity...)
+$08BD $0870 MOVF STACK_0, 0
+$08BE $00DE MOVWF FARG_setupUsart+0
+$08BF $118A BCF PCLATH, 3
+$08C0 $21C7 CALL _setupUsart
+$08C1 $158A BSF PCLATH, 3
+;openKeyboard.c,495 :: Delay_ms(20); // required for eeprom_read to work correctly
+$08C2 $301A MOVLW 26
+$08C3 $00FB MOVWF STACK_11
+$08C4 $30FF MOVLW 255
+$08C5 $00FA MOVWF STACK_10
+$08C6 $0BFB DECFSZ STACK_11, F
+$08C7 $28C9 GOTO $+2
+$08C8 $28CC GOTO $+4
+$08C9 $0BFA DECFSZ STACK_10, F
+$08CA $28C9 GOTO $-1
+$08CB $28C6 GOTO $-5
+$08CC $30E7 MOVLW 231
+$08CD $00FA MOVWF STACK_10
+$08CE $0BFA DECFSZ STACK_10, F
+$08CF $28CE GOTO $-1
+$08D0 $0000 NOP
+;openKeyboard.c,496 :: lightFadeOffTime = EEprom_read(CONFIG_LIGHTFADEOFFTIME) << 8;
+$08D1 $3005 MOVLW 5
+$08D2 $00DB MOVWF FARG_EEprom_read+0
+$08D3 $118A BCF PCLATH, 3
+$08D4 $23D3 CALL _EEprom_read
+$08D5 $158A BSF PCLATH, 3
+$08D6 $3008 MOVLW 8
+$08D7 $00F1 MOVWF STACK_1
+$08D8 $0870 MOVF STACK_0, 0
+$08D9 $1303 BCF STATUS, RP1
+$08DA $00A4 MOVWF _lightFadeOffTime
+$08DB $01A5 CLRF _lightFadeOffTime+1
+$08DC $0871 MOVF STACK_1, 0
+$08DD $ L_main_97:
+$08DD $1903 BTFSC STATUS, Z
+$08DE $28E6 GOTO L_main_98
+$08DF $1303 BCF STATUS, RP1
+$08E0 $1283 BCF STATUS, RP0
+$08E1 $0DA4 RLF _lightFadeOffTime, 1
+$08E2 $0DA5 RLF _lightFadeOffTime+1, 1
+$08E3 $1024 BCF _lightFadeOffTime, 0
+$08E4 $3FFF ADDLW 255
+$08E5 $28DD GOTO L_main_97
+$08E6 $ L_main_98:
+$08E6 $3000 MOVLW 0
+$08E7 $1303 BCF STATUS, RP1
+$08E8 $1283 BCF STATUS, RP0
+$08E9 $00A6 MOVWF _lightFadeOffTime+2
+$08EA $00A7 MOVWF _lightFadeOffTime+3
+;openKeyboard.c,497 :: lightStrenght = EEprom_read(CONFIG_LIGHTSTRENGTH);
+$08EB $3004 MOVLW 4
+$08EC $00DB MOVWF FARG_EEprom_read+0
+$08ED $118A BCF PCLATH, 3
+$08EE $23D3 CALL _EEprom_read
+$08EF $158A BSF PCLATH, 3
+$08F0 $0870 MOVF STACK_0, 0
+$08F1 $1303 BCF STATUS, RP1
+$08F2 $00A9 MOVWF _lightStrenght
+;openKeyboard.c,499 :: Delay_ms(20); // required for eeprom_read to work correctly
+$08F3 $301A MOVLW 26
+$08F4 $00FB MOVWF STACK_11
+$08F5 $30FF MOVLW 255
+$08F6 $00FA MOVWF STACK_10
+$08F7 $0BFB DECFSZ STACK_11, F
+$08F8 $28FA GOTO $+2
+$08F9 $28FD GOTO $+4
+$08FA $0BFA DECFSZ STACK_10, F
+$08FB $28FA GOTO $-1
+$08FC $28F7 GOTO $-5
+$08FD $30E7 MOVLW 231
+$08FE $00FA MOVWF STACK_10
+$08FF $0BFA DECFSZ STACK_10, F
+$0900 $28FF GOTO $-1
+$0901 $0000 NOP
+;openKeyboard.c,500 :: lightMode = EEprom_read(CONFIG_LIGHTMODE);
+$0902 $3003 MOVLW 3
+$0903 $00DB MOVWF FARG_EEprom_read+0
+$0904 $118A BCF PCLATH, 3
+$0905 $23D3 CALL _EEprom_read
+$0906 $158A BSF PCLATH, 3
+$0907 $0870 MOVF STACK_0, 0
+$0908 $1303 BCF STATUS, RP1
+$0909 $00AD MOVWF _lightMode
+;openKeyboard.c,501 :: setUpLightMode(lightMode);
+$090A $0870 MOVF STACK_0, 0
+$090B $00DE MOVWF FARG_setupLightMode+0
+$090C $118A BCF PCLATH, 3
+$090D $2159 CALL _setupLightMode
+$090E $158A BSF PCLATH, 3
+;openKeyboard.c,503 :: do {
+$090F $ L_main_86:
+;openKeyboard.c,505 :: doScan();
+$090F $118A BCF PCLATH, 3
+$0910 $23DF CALL _doScan
+$0911 $158A BSF PCLATH, 3
+;openKeyboard.c,507 :: if (data[1]&2) {
+$0912 $1303 BCF STATUS, RP1
+$0913 $1283 BCF STATUS, RP0
+$0914 $1CC0 BTFSS _data+1, 1
+$0915 $291A GOTO L_main_88
+;openKeyboard.c,508 :: config(); // people button pressed -> config mode
+$0916 $118A BCF PCLATH, 3
+$0917 $2448 CALL _config
+$0918 $158A BSF PCLATH, 3
+;openKeyboard.c,509 :: }else{
+$0919 $2930 GOTO L_main_89
+$091A $ L_main_88:
+;openKeyboard.c,510 :: if (oldData[1]&2) saveConfig(); // ppl btn just released... save config
+$091A $1303 BCF STATUS, RP1
+$091B $1283 BCF STATUS, RP0
+$091C $1CB9 BTFSS _oldData+1, 1
+$091D $2921 GOTO L_main_90
+$091E $118A BCF PCLATH, 3
+$091F $2552 CALL _saveConfig
+$0920 $158A BSF PCLATH, 3
+$0921 $ L_main_90:
+;openKeyboard.c,511 :: send();
+$0921 $1303 BCF STATUS, RP1
+$0922 $1283 BCF STATUS, RP0
+$0923 $082F MOVF _send, 0
+$0924 $00B5 MOVWF ___DoICPLoAddr
+$0925 $0830 MOVF _send+1, 0
+$0926 $00B4 MOVWF ___DoICPHiAddr
+$0927 $080A MOVF PCLATH, 0
+$0928 $00B3 MOVWF ___DoICPSavePCLATH
+$0929 $118A BCF PCLATH, 3
+$092A $26B8 CALL _____DoICF
+$092B $158A BSF PCLATH, 3
+$092C $1303 BCF STATUS, RP1
+$092D $1283 BCF STATUS, RP0
+$092E $0833 MOVF ___DoICPSavePCLATH, 0
+$092F $008A MOVWF PCLATH
+;openKeyboard.c,512 :: }
+$0930 $ L_main_89:
+;openKeyboard.c,513 :: lightHandler();
+$0930 $1303 BCF STATUS, RP1
+$0931 $1283 BCF STATUS, RP0
+$0932 $082A MOVF _lightHandler, 0
+$0933 $00B5 MOVWF ___DoICPLoAddr
+$0934 $082B MOVF _lightHandler+1, 0
+$0935 $00B4 MOVWF ___DoICPHiAddr
+$0936 $080A MOVF PCLATH, 0
+$0937 $00B3 MOVWF ___DoICPSavePCLATH
+$0938 $118A BCF PCLATH, 3
+$0939 $26B8 CALL _____DoICF
+$093A $158A BSF PCLATH, 3
+$093B $1303 BCF STATUS, RP1
+$093C $1283 BCF STATUS, RP0
+$093D $0833 MOVF ___DoICPSavePCLATH, 0
+$093E $008A MOVWF PCLATH
+;openKeyboard.c,514 :: Delay_80us(); // without this delay, pic hangs on sleep...
+$093F $118A BCF PCLATH, 3
+$0940 $26AF CALL _Delay_80us
+$0941 $158A BSF PCLATH, 3
+;openKeyboard.c,515 :: } while (1); // endless loop
+$0942 $290F GOTO L_main_86
+;openKeyboard.c,517 :: }
+$0943 $2943 GOTO $
diff --git a/openKeyboard031/openKeyboard.c b/openKeyboard031/openKeyboard.c
new file mode 100644
index 0000000..32f02f9
--- /dev/null
+++ b/openKeyboard031/openKeyboard.c
@@ -0,0 +1,518 @@
+// FIRMWARE REPLACEMENT FOR CHATPAD's pic16f883
+// see attached documents to learn more
+// release 0.3.1 from jean : giancarlotodone at yahoo dot it
+// for the Open Keyboard Project
+// thanks alot to Gidi (who owns an half of my chatpad, call him "sponsor")
+// and my sweethart piceta; they helped me handling
+// cable knots while reversing and testing.
+// Thanks as well to all people who demonstrated interest in this project!
+
+#define CONFIG_BAUDRATE 1
+#define CONFIG_SENDMODE 2
+#define CONFIG_LIGHTMODE 3
+#define CONFIG_LIGHTSTRENGTH 4
+#define CONFIG_LIGHTFADEOFFTIME 5
+#define CONFIG_REPEAT 6 // not used yet
+#define CONFIG_ACCEPTCOMMANDS 7 // not used yet
+#define CONFIG_MACROS 8 // not used yet
+
+#define SENDMODE_SERIAL 0
+#define SENDMODE_SCAN 1
+#define SENDMODE_PS2 2 // not used yet
+
+#define LIGHTMODE_ALWAYSOFF 0
+#define LIGHTMODE_ALWAYSON 1
+#define LIGHTMODE_FADE 2
+#define LIGHTMODE_LASTMODE 2
+
+#define BAUDRATE_300 1
+#define BAUDRATE_1200 2
+#define BAUDRATE_2400 3
+#define BAUDRATE_4800 4
+#define BAUDRATE_9600 5
+#define BAUDRATE_19200 6
+#define BAUDRATE_38400 7
+#define BAUDRATE_57600 8
+#define BAUDRATE_115200 9
+
+
+const char scanMap[50] = { // i could output directly idx,
+ 8, 9, 10, 40, 20, 30, 47, // but maybe a translation map
+ 41, 42, 43, 39, 44, 38, 45, // can prove useful in future.
+ 31, 32, 33, 35, 34, 36, 37, // starts from 1...think 0
+ 21, 22, 23, 25, 24, 26, 27, // should be reserved for
+ 11, 12, 13, 15, 14, 16, 17, // future use
+ 1, 2, 3, 5, 4, 6, 7,
+ 28, 18, 19, 0, 0, 29, 46 };
+
+const char serialMap[4][49] = { // CHARACTER MAPPING MATRIX for "pure serial mode"
+// normal char press
+{56, 57, 48, 13, 112, 44, 0,
+ 0, 0, 0, 46, 32, 109, 0,
+ 0, 122, 120, 118, 99, 98, 110,
+ 97, 115, 100, 103, 102, 104, 106,
+113, 119, 101, 116, 114, 121, 117,
+ 49, 50, 51, 53, 52, 54, 55,
+107, 105, 111, 0, 0, 108, 8},
+
+// shifted
+{56, 57, 48, 13, 80, 44, 0,
+ 0, 0, 0, 46, 32, 77, 0,
+ 0, 90, 88, 86, 67, 66, 78,
+ 65, 83, 68, 71, 70, 72, 74,
+ 81, 87, 69, 84, 82, 89, 85,
+ 49, 50, 51, 53, 52, 54, 55,
+ 75, 73, 79, 0, 0, 76, 8},
+
+// green alt
+{56, 57, 48, 13, 41, 58, 0,
+ 0, 0, 0, 63, 32, 62, 0,
+ 0, 96, 39, 45, 187, 124, 60,
+126, 154, 123, 168, 125, 47, 39,
+ 33, 64, 128, 37, 35, 94, 38,
+ 49, 50, 51, 53, 52, 54, 55,
+ 91, 42, 40, 0, 0, 93, 8},
+
+// red alt
+{56, 57, 48, 13, 61, 59, 0,
+ 0, 0, 0, 191, 32, 181, 0,
+ 0, 230, 156, 95, 231, 43, 241,
+225, 223, 240, 165, 163, 92, 34,
+161, 229, 232, 254, 36, 253, 249,
+ 49, 50, 51, 53, 52, 54, 55,
+169, 236, 242, 0, 0, 248, 8}
+}; ////////// END OF MAPPING MATRIX
+
+ unsigned char data[7] = {0,0,0,0,0,0,0};
+ unsigned char oldData[7] = {0,0,0,0,0,0,0};
+ unsigned char justPressed[7] = {0,0,0,0,0,0,0};
+
+ unsigned char newlyPressd = 0;
+
+ unsigned char AMask = 0;
+ unsigned char BMask = 0;
+
+ unsigned char somethingChanged = 0;
+
+ unsigned long int timer = 0xFFFF;
+ unsigned long int lightFadeOffTime = 0x8000;
+
+ // alternates (shift,green,red) mapping to translation map
+ // 0 1 2 3 4 5 6 7
+ unsigned char alts [] = {0, 1, 2, 2, 3, 3, 3, 3};
+ unsigned char alt;
+
+ void (*send)() = 0;
+ void (*lightHandler)() = 0;
+
+ unsigned char baudrate = 0;
+ unsigned char sendMode = 0;
+ unsigned char lightMode = 0;
+ unsigned char lightStrenght = 0;
+
+ unsigned char pwmRunning = 0;
+
+ void enterPowerSave(){
+ PORTA = 0;
+ INTCON.RBIE = 1; // enables PORTB on-change interrupt
+ asm{
+ sleep;
+ }
+ }
+
+ void exitPowerSave(){
+ INTCON.RBIE = 0; // disables PORTB on-change interrupt
+ }
+
+ void setupUsart(unsigned char br){
+ switch(br){ // done so, because you can't call USART_Init(variable); but only USART_Init(literal);
+ case BAUDRATE_300: USART_Init(300);
+ break;
+ case BAUDRATE_1200: USART_Init(1200);
+ break;
+ case BAUDRATE_2400: USART_Init(2400);
+ break;
+ case BAUDRATE_4800: USART_Init(4800);
+ break;
+ case BAUDRATE_9600: USART_Init(9600);
+ break;
+ case BAUDRATE_19200: USART_Init(19200);
+ break;
+ case BAUDRATE_38400: USART_Init(38400);
+ break;
+ case BAUDRATE_57600: USART_Init(57600);
+ break;
+ case BAUDRATE_115200: USART_Init(115200);
+ break;
+ default: EEprom_write(CONFIG_BAUDRATE, BAUDRATE_4800); // if no config found, set a default 4800
+ br = BAUDRATE_4800;
+ USART_Init(4800);
+ }
+ baudrate = br;
+ }
+
+ void turnBacklightOn(){
+ timer = lightFadeOffTime;
+ if (!pwmRunning) {
+ PWM1_Start();
+ PWM2_Start();
+ pwmRunning = 1;
+ }
+ PWM1_Change_Duty(lightStrenght);
+ PWM2_Change_Duty(lightStrenght);
+ }
+
+ void nop(){
+
+ }
+
+ void lightFade(){
+ unsigned char s;
+ if (newlyPressd) {
+ turnBacklightOn();
+ return;
+ }
+
+ if (timer>0) timer --;
+ else {
+ PWM1_Stop;
+ PWM2_Stop;
+ PORTC = 255;
+ pwmRunning = 0;
+ enterPowerSave();
+ }
+
+ if (timer<(~lightStrenght)){
+ PWM1_Change_Duty(~((unsigned char)timer));
+ PWM2_Change_Duty(~((unsigned char)timer));
+ }
+
+ }
+
+ void setupLightMode(unsigned char lm){
+
+ if (pwmRunning){
+ PWM1_Stop();
+ PWM2_Stop();
+ }
+
+ switch (lm){
+ case LIGHTMODE_ALWAYSOFF: lightHandler = &nop;
+ lightStrenght = 0xFF;
+ lightMode = LIGHTMODE_ALWAYSOFF;
+ break;
+
+ case LIGHTMODE_ALWAYSON: lightHandler = &nop;
+ turnBacklightOn();
+ lightMode = LIGHTMODE_ALWAYSON;
+ break;
+
+ case LIGHTMODE_FADE: lightHandler = &lightFade;
+ turnBacklightOn();
+ lightStrenght = 0x80; // restore middle luminosity
+ lightMode = LIGHTMODE_FADE;
+ break;
+
+ default : EEprom_write(CONFIG_LIGHTMODE, LIGHTMODE_ALWAYSOFF);
+ lightMode = LIGHTMODE_ALWAYSOFF;
+ lightHandler = &nop;
+ lightStrenght = 0xFF;
+ }
+
+ PORTC = 255;
+
+ // PWM init
+ if (lightMode != LIGHTMODE_ALWAYSOFF) {
+ PWM1_Init(40000);
+ PWM1_Change_Duty(lightStrenght);
+ PWM1_Start();
+
+ PWM2_Init(40000);
+ PWM2_Change_Duty(lightStrenght);
+ PWM2_Start();
+
+ pwmRunning = 1;
+ }
+ }
+
+ void doScan(){
+ unsigned char sc = 0;
+
+ newlyPressd = 0;
+
+ for (AMask=1; AMask<128; AMask<<=1){
+
+ oldData[sc] = data[sc]; // save old data
+
+ PORTA = ~AMask; // put a 0 on the line we want to inspect
+ data[sc] = PORTB; // read PORTB (pulled up)...if a line goes to 0, bingo!
+ data[sc] = data[sc] | PORTB; // antibounce
+ data[sc] = data[sc] | PORTB; // antibounce
+ data[sc] = ~data[sc]; // return to positive logic
+
+ justPressed[sc] = data[sc]&(~oldData[sc]);
+
+ newlyPressd = newlyPressd | justPressed[sc];
+
+ sc++;
+ }
+ }
+
+
+ void serialSend(){
+ unsigned char idx = 0;
+ unsigned char sc = 0;
+
+ for (AMask=1; AMask<128; AMask<<=1){
+ for (BMask=1; BMask<128; BMask<<=1){
+ if (justPressed[sc] & BMask) USART_Write(serialMap[alt][idx]);
+ idx++;
+ }
+ sc++;
+ }
+ alt = alts[data[2]&1|((data[1]&1)<<1)|((data[0]&64)>>4)]; // next scan can use alt retrieved here
+ }
+
+ void scanSend(){
+ unsigned char idx = 0;
+ unsigned char sc = 0;
+ unsigned char bs = 0;
+
+ for (AMask=1; AMask<128; AMask<<=1){
+ somethingChanged = data[sc] ^ oldData[sc];
+ bs = 0;
+ for (BMask=1; BMask<128; BMask<<=1){
+ if (someThingChanged & BMask)
+ USART_Write(scanMap[idx] | (((data[sc]&BMask)>>bs)<<6)); // | 64 if pressed
+ bs++;
+ idx++;
+ }
+ sc++;
+ }
+ }
+
+ void ps2Send(){
+ // not implemented yet
+ }
+
+ void setupSendMode(unsigned char sm){
+ switch (sm){
+ case SENDMODE_SCAN : send = &scanSend;
+ sendMode = SENDMODE_SCAN;
+ break;
+
+ case SENDMODE_SERIAL: send = &serialSend;
+ sendMode = SENDMODE_SERIAL;
+ break;
+
+// case SENDMODE_PS2: send = &ps2send;
+// sendMode = SENDMODE_PS2;
+// break;
+
+ default : send = &serialSend;
+ EEprom_write(CONFIG_SENDMODE, SENDMODE_SERIAL);
+ sendMode = SENDMODE_SERIAL;
+ }
+ }
+
+ void config(){
+ timer = lightFadeOffTime;
+
+ if ((data[1]&4)&&(lightStrenght<0xff)) { // <
+ lightStrenght++;
+ PWM1_Change_Duty(lightStrenght);
+ PWM2_Change_Duty(lightStrenght);
+ if (lightMode==LIGHTMODE_ALWAYSOFF) lightMode = LIGHTMODE_FADE;
+ } // decrease light strenght
+
+ if ((data[1]&64)&&(lightStrenght>0)) { // >
+ lightStrenght--;
+ PWM1_Change_Duty(lightStrenght);
+ PWM2_Change_Duty(lightStrenght);
+ if (lightMode==LIGHTMODE_ALWAYSOFF) lightMode = LIGHTMODE_FADE;
+ } // increase light strenght
+
+
+ if (justPressed[5]&1){ // 1
+// if (data[1]&1) // this buttion combination just doesn't work...think that's because of the buttons staying on the same matrix line.
+// setupUsart(BAUDRATE_4800);
+// else {
+ setupLightMode(LIGHTMODE_FADE);
+ lightFadeOffTime = 2<<8;
+// }
+ }
+
+ if (justPressed[5]&2){ // 2
+ if (data[1]&1)
+ ;//setupUsart(BAUDRATE_300); //all setupUsart commented out are to save code words space...otherwise i'm running into demo limit
+ else { //consider donating some money to me to purchase a full version of mikroC and continue development
+ setupLightMode(LIGHTMODE_FADE);
+ lightFadeOffTime = 4<<8; // more or less 5 sec
+ }
+ }
+
+ if (justPressed[5]&4){ // 3
+ if (data[1]&1)
+ ;//setupUsart(BAUDRATE_1200);
+ else {
+ setupLightMode(LIGHTMODE_FADE);
+ lightFadeOffTime = 8<<8;
+ }
+ }
+
+ if (justPressed[5]&16){ // 4
+ if (data[1]&1)
+ ;//setupUsart(BAUDRATE_2400);
+ else {
+ setupLightMode(LIGHTMODE_FADE);
+ lightFadeOffTime = 16<<8;
+ }
+ }
+
+ if (justPressed[5]&8){ // 5
+ if (data[1]&1)
+ setupUsart(BAUDRATE_4800);
+ else {
+ setupLightMode(LIGHTMODE_FADE);
+ lightFadeOffTime = 32<<8;
+ }
+ }
+
+ if (justPressed[5]&32){ // 6
+ if (data[1]&1)
+ setupUsart(BAUDRATE_9600);
+ else {
+ setupLightMode(LIGHTMODE_FADE);
+ lightFadeOffTime = 64<<8;
+ }
+ }
+
+ if (justPressed[5]&64){ // 7
+ if (data[1]&1)
+ ;//setupUsart(BAUDRATE_19200);
+ else {
+ setupLightMode(LIGHTMODE_FADE);
+ lightFadeOffTime = 128<<8;
+ }
+ }
+
+ if (justPressed[0]&1){ // 8
+ if (data[1]&1)
+ ;//setupUsart(BAUDRATE_38400);
+ else {
+ setupLightMode(LIGHTMODE_FADE);
+ lightFadeOffTime = 255<<8;
+ }
+ }
+
+ if (justPressed[0]&2){ // 9
+ if (data[1]&1)
+ ;//setupUsart(BAUDRATE_57600);
+ else
+ setupLightMode(LIGHTMODE_ALWAYSON);
+ }
+
+ if (justPressed[0]&4){ // 0
+ if (data[1]&1)
+ ;//setupUsart(BAUDRATE_115200);
+ else
+ setupLightMode(LIGHTMODE_ALWAYSOFF);
+ }
+
+ if (justPressed[3]&1){ // A
+ setupSendMode(SENDMODE_SCAN);
+ }
+
+ if (justPressed[3]&2){ // S
+ setupSendMode(SENDMODE_SERIAL);
+ }
+
+ Delay_5ms();
+
+ }
+
+ void saveConfig(){
+ EEprom_write(CONFIG_BAUDRATE, baudrate);
+ EEprom_write(CONFIG_SENDMODE, sendMode);
+ EEprom_write(CONFIG_LIGHTMODE, lightMode);
+ EEprom_write(CONFIG_LIGHTSTRENGTH, lightStrenght);
+ EEprom_write(CONFIG_LIGHTFADEOFFTIME, lightFadeOffTime>>8);
+ }
+
+ void interrupt() {
+ if (INTCON.RBIF) { // SOMETHING CHANGED ON PORTB...
+ exitPowerSave(); // just wakeup and so some scanning...
+ INTCON.RBIF = 0; // clear intr flag
+ }
+
+// if (PIR1.RCIF) { // USART RECEIVE BUFFER () FULL...
+//
+// }
+ }
+
+void main() {
+
+ OSCCON = 0x67; // 01100111 - 0110 stands for 4Mhz internal clock
+
+ ANSEL = 0; // Configure AN pins as digital I/O
+ ANSELH = 0;
+
+ PORTA = 0; // init port A
+ TRISA = 0; // 1 = input
+
+ PORTB = 0; // initialize PORTB
+ TRISB = 255; // designate PORTB as all input
+
+ PORTC = 0; // initialize PORTC
+ TRISC = 0; // designate PORTB 0-7 as output
+
+ OPTION_REG = 0; // pull-ups enabled on PORTB....no external pull-downs
+ // present, so we have to run negative logic...
+
+ //WPUB = 127; // weak pull-ups enabled on PORTB 0-6 // AAARGH!! this caused random Light-On
+
+ INTCON.RBIE = 0; // disables PORTB on-change interrupt
+ INTCON.RBIF = 0; // clear PORTB mismatch values
+
+ IOCB = 127; // pin 0-6 of PORTB configured to raise interrupt when changed
+
+ PIE1 = 32; // RCIE = 1; enables EUSART on-receive interrupt
+
+ INTCON.GIE = 1; // Global Interrupt Enable/disable
+
+ // SEND MODE ------------------
+ Delay_ms(20); // required for eeprom_read to work correctly
+ sendMode = EEprom_read(CONFIG_SENDMODE);
+ setupSendMode(sendMode);
+ // TODO: if in PS2 mode don't initialize usart
+
+ // USART ---------------
+ Delay_ms(20); // required for eeprom_read to work correctly
+ baudrate = EEprom_read(CONFIG_BAUDRATE);
+ setupUsart(baudrate); // Initalize USART (xxxx baud rate, 1 stop bit, no parity...)
+
+ // LIGHTS ----------------
+ Delay_ms(20); // required for eeprom_read to work correctly
+ lightFadeOffTime = EEprom_read(CONFIG_LIGHTFADEOFFTIME) << 8;
+ lightStrenght = EEprom_read(CONFIG_LIGHTSTRENGTH);
+
+ Delay_ms(20); // required for eeprom_read to work correctly
+ lightMode = EEprom_read(CONFIG_LIGHTMODE);
+ setUpLightMode(lightMode);
+
+ do {
+
+ doScan();
+
+ if (data[1]&2) {
+ config(); // people button pressed -> config mode
+ }else{
+ if (oldData[1]&2) saveConfig(); // ppl btn just released... save config
+ send();
+ }
+ lightHandler();
+ Delay_80us(); // without this delay, pic hangs on sleep...
+ } while (1); // endless loop
+
+}
+
diff --git a/openKeyboard031/openKeyboard.cp b/openKeyboard031/openKeyboard.cp
new file mode 100644
index 0000000..935ab56
--- /dev/null
+++ b/openKeyboard031/openKeyboard.cp
@@ -0,0 +1,481 @@
+#line 1 "E:/Acer_D_Backup/DEVELOPMENT/PROJECTS/micros/openKeyboard03/openKeyboard.c"
+#line 39 "E:/Acer_D_Backup/DEVELOPMENT/PROJECTS/micros/openKeyboard03/openKeyboard.c"
+const char scanMap[50] = {
+ 8, 9, 10, 40, 20, 30, 47,
+ 41, 42, 43, 39, 44, 38, 45,
+ 31, 32, 33, 35, 34, 36, 37,
+ 21, 22, 23, 25, 24, 26, 27,
+ 11, 12, 13, 15, 14, 16, 17,
+ 1, 2, 3, 5, 4, 6, 7,
+ 28, 18, 19, 0, 0, 29, 46 };
+
+const char serialMap[4][49] = {
+
+{56, 57, 48, 13, 112, 44, 0,
+ 0, 0, 0, 46, 32, 109, 0,
+ 0, 122, 120, 118, 99, 98, 110,
+ 97, 115, 100, 103, 102, 104, 106,
+113, 119, 101, 116, 114, 121, 117,
+ 49, 50, 51, 53, 52, 54, 55,
+107, 105, 111, 0, 0, 108, 8},
+
+
+{56, 57, 48, 13, 80, 44, 0,
+ 0, 0, 0, 46, 32, 77, 0,
+ 0, 90, 88, 86, 67, 66, 78,
+ 65, 83, 68, 71, 70, 72, 74,
+ 81, 87, 69, 84, 82, 89, 85,
+ 49, 50, 51, 53, 52, 54, 55,
+ 75, 73, 79, 0, 0, 76, 8},
+
+
+{56, 57, 48, 13, 41, 58, 0,
+ 0, 0, 0, 63, 32, 62, 0,
+ 0, 96, 39, 45, 187, 124, 60,
+126, 154, 123, 168, 125, 47, 39,
+ 33, 64, 128, 37, 35, 94, 38,
+ 49, 50, 51, 53, 52, 54, 55,
+ 91, 42, 40, 0, 0, 93, 8},
+
+
+{56, 57, 48, 13, 61, 59, 0,
+ 0, 0, 0, 191, 32, 181, 0,
+ 0, 230, 156, 95, 231, 43, 241,
+225, 223, 240, 165, 163, 92, 34,
+161, 229, 232, 254, 36, 253, 249,
+ 49, 50, 51, 53, 52, 54, 55,
+169, 236, 242, 0, 0, 248, 8}
+};
+
+ unsigned char data[7] = {0,0,0,0,0,0,0};
+ unsigned char oldData[7] = {0,0,0,0,0,0,0};
+ unsigned char justPressed[7] = {0,0,0,0,0,0,0};
+
+ unsigned char newlyPressd = 0;
+
+ unsigned char AMask = 0;
+ unsigned char BMask = 0;
+
+ unsigned char somethingChanged = 0;
+
+ unsigned long int timer = 0xFFFF;
+ unsigned long int lightFadeOffTime = 0x8000;
+
+
+
+ unsigned char alts [] = {0, 1, 2, 2, 3, 3, 3, 3};
+ unsigned char alt;
+
+ void (*send)() = 0;
+ void (*lightHandler)() = 0;
+
+ unsigned char baudrate = 0;
+ unsigned char sendMode = 0;
+ unsigned char lightMode = 0;
+ unsigned char lightStrenght = 0;
+
+ unsigned char pwmRunning = 0;
+
+ void enterPowerSave(){
+ PORTA = 0;
+ INTCON.RBIE = 1;
+ asm{
+ sleep;
+ }
+ }
+
+ void exitPowerSave(){
+ INTCON.RBIE = 0;
+ }
+
+ void setupUsart(unsigned char br){
+ switch(br){
+ case 1 : USART_Init(300);
+ break;
+ case 2 : USART_Init(1200);
+ break;
+ case 3 : USART_Init(2400);
+ break;
+ case 4 : USART_Init(4800);
+ break;
+ case 5 : USART_Init(9600);
+ break;
+ case 6 : USART_Init(19200);
+ break;
+ case 7 : USART_Init(38400);
+ break;
+ case 8 : USART_Init(57600);
+ break;
+ case 9 : USART_Init(115200);
+ break;
+ default: EEprom_write( 1 , 4 );
+ br = 4 ;
+ USART_Init(4800);
+ }
+ baudrate = br;
+ }
+
+ void turnBacklightOn(){
+ timer = lightFadeOffTime;
+ if (!pwmRunning) {
+ PWM1_Start();
+ PWM2_Start();
+ pwmRunning = 1;
+ }
+ PWM1_Change_Duty(lightStrenght);
+ PWM2_Change_Duty(lightStrenght);
+ }
+
+ void nop(){
+
+ }
+
+ void lightFade(){
+ unsigned char s;
+ if (newlyPressd) {
+ turnBacklightOn();
+ return;
+ }
+
+ if (timer>0) timer --;
+ else {
+ PWM1_Stop;
+ PWM2_Stop;
+ PORTC = 255;
+ pwmRunning = 0;
+ enterPowerSave();
+ }
+
+ if (timer<(~lightStrenght)){
+ PWM1_Change_Duty(~((unsigned char)timer));
+ PWM2_Change_Duty(~((unsigned char)timer));
+ }
+
+ }
+
+ void setupLightMode(unsigned char lm){
+
+ if (pwmRunning){
+ PWM1_Stop();
+ PWM2_Stop();
+ }
+
+ switch (lm){
+ case 0 : lightHandler = &nop;
+ lightStrenght = 0xFF;
+ lightMode = 0 ;
+ break;
+
+ case 1 : lightHandler = &nop;
+ turnBacklightOn();
+ lightMode = 1 ;
+ break;
+
+ case 2 : lightHandler = &lightFade;
+ turnBacklightOn();
+ lightStrenght = 0x80;
+ lightMode = 2 ;
+ break;
+
+ default : EEprom_write( 3 , 0 );
+ lightMode = 0 ;
+ lightHandler = &nop;
+ lightStrenght = 0xFF;
+ }
+
+ PORTC = 255;
+
+
+ if (lightMode != 0 ) {
+ PWM1_Init(40000);
+ PWM1_Change_Duty(lightStrenght);
+ PWM1_Start();
+
+ PWM2_Init(40000);
+ PWM2_Change_Duty(lightStrenght);
+ PWM2_Start();
+
+ pwmRunning = 1;
+ }
+ }
+
+ void doScan(){
+ unsigned char sc = 0;
+
+ newlyPressd = 0;
+
+ for (AMask=1; AMask<128; AMask<<=1){
+
+ oldData[sc] = data[sc];
+
+ PORTA = ~AMask;
+ data[sc] = PORTB;
+ data[sc] = data[sc] | PORTB;
+ data[sc] = data[sc] | PORTB;
+ data[sc] = ~data[sc];
+
+ justPressed[sc] = data[sc]&(~oldData[sc]);
+
+ newlyPressd = newlyPressd | justPressed[sc];
+
+ sc++;
+ }
+ }
+
+
+ void serialSend(){
+ unsigned char idx = 0;
+ unsigned char sc = 0;
+
+ for (AMask=1; AMask<128; AMask<<=1){
+ for (BMask=1; BMask<128; BMask<<=1){
+ if (justPressed[sc] & BMask) USART_Write(serialMap[alt][idx]);
+ idx++;
+ }
+ sc++;
+ }
+ alt = alts[data[2]&1|((data[1]&1)<<1)|((data[0]&64)>>4)];
+ }
+
+ void scanSend(){
+ unsigned char idx = 0;
+ unsigned char sc = 0;
+ unsigned char bs = 0;
+
+ for (AMask=1; AMask<128; AMask<<=1){
+ somethingChanged = data[sc] ^ oldData[sc];
+ bs = 0;
+ for (BMask=1; BMask<128; BMask<<=1){
+ if (someThingChanged & BMask)
+ USART_Write(scanMap[idx] | (((data[sc]&BMask)>>bs)<<6));
+ bs++;
+ idx++;
+ }
+ sc++;
+ }
+ }
+
+ void ps2Send(){
+
+ }
+
+ void setupSendMode(unsigned char sm){
+ switch (sm){
+ case 1 : send = &scanSend;
+ sendMode = 1 ;
+ break;
+
+ case 0 : send = &serialSend;
+ sendMode = 0 ;
+ break;
+
+
+
+
+
+ default : send = &serialSend;
+ EEprom_write( 2 , 0 );
+ sendMode = 0 ;
+ }
+ }
+
+ void config(){
+ timer = lightFadeOffTime;
+
+ if ((data[1]&4)&&(lightStrenght<0xff)) {
+ lightStrenght++;
+ PWM1_Change_Duty(lightStrenght);
+ PWM2_Change_Duty(lightStrenght);
+ if (lightMode== 0 ) lightMode = 2 ;
+ }
+
+ if ((data[1]&64)&&(lightStrenght>0)) {
+ lightStrenght--;
+ PWM1_Change_Duty(lightStrenght);
+ PWM2_Change_Duty(lightStrenght);
+ if (lightMode== 0 ) lightMode = 2 ;
+ }
+
+
+ if (justPressed[5]&1){
+
+
+
+ setupLightMode( 2 );
+ lightFadeOffTime = 2<<8;
+
+ }
+
+ if (justPressed[5]&2){
+ if (data[1]&1)
+ ;
+ else {
+ setupLightMode( 2 );
+ lightFadeOffTime = 4<<8;
+ }
+ }
+
+ if (justPressed[5]&4){
+ if (data[1]&1)
+ ;
+ else {
+ setupLightMode( 2 );
+ lightFadeOffTime = 8<<8;
+ }
+ }
+
+ if (justPressed[5]&16){
+ if (data[1]&1)
+ ;
+ else {
+ setupLightMode( 2 );
+ lightFadeOffTime = 16<<8;
+ }
+ }
+
+ if (justPressed[5]&8){
+ if (data[1]&1)
+ setupUsart( 4 );
+ else {
+ setupLightMode( 2 );
+ lightFadeOffTime = 32<<8;
+ }
+ }
+
+ if (justPressed[5]&32){
+ if (data[1]&1)
+ setupUsart( 5 );
+ else {
+ setupLightMode( 2 );
+ lightFadeOffTime = 64<<8;
+ }
+ }
+
+ if (justPressed[5]&64){
+ if (data[1]&1)
+ ;
+ else {
+ setupLightMode( 2 );
+ lightFadeOffTime = 128<<8;
+ }
+ }
+
+ if (justPressed[0]&1){
+ if (data[1]&1)
+ ;
+ else {
+ setupLightMode( 2 );
+ lightFadeOffTime = 255<<8;
+ }
+ }
+
+ if (justPressed[0]&2){
+ if (data[1]&1)
+ ;
+ else
+ setupLightMode( 1 );
+ }
+
+ if (justPressed[0]&4){
+ if (data[1]&1)
+ ;
+ else
+ setupLightMode( 0 );
+ }
+
+ if (justPressed[3]&1){
+ setupSendMode( 1 );
+ }
+
+ if (justPressed[3]&2){
+ setupSendMode( 0 );
+ }
+
+ Delay_5ms();
+
+ }
+
+ void saveConfig(){
+ EEprom_write( 1 , baudrate);
+ EEprom_write( 2 , sendMode);
+ EEprom_write( 3 , lightMode);
+ EEprom_write( 4 , lightStrenght);
+ EEprom_write( 5 , lightFadeOffTime>>8);
+ }
+
+ void interrupt() {
+ if (INTCON.RBIF) {
+ exitPowerSave();
+ INTCON.RBIF = 0;
+ }
+
+
+
+
+ }
+
+void main() {
+
+ OSCCON = 0x67;
+
+ ANSEL = 0;
+ ANSELH = 0;
+
+ PORTA = 0;
+ TRISA = 0;
+
+ PORTB = 0;
+ TRISB = 255;
+
+ PORTC = 0;
+ TRISC = 0;
+
+ OPTION_REG = 0;
+
+
+
+
+ INTCON.RBIE = 0;
+ INTCON.RBIF = 0;
+
+ IOCB = 127;
+
+ PIE1 = 32;
+
+ INTCON.GIE = 1;
+
+
+ Delay_ms(20);
+ sendMode = EEprom_read( 2 );
+ setupSendMode(sendMode);
+
+
+
+ Delay_ms(20);
+ baudrate = EEprom_read( 1 );
+ setupUsart(baudrate);
+
+
+ Delay_ms(20);
+ lightFadeOffTime = EEprom_read( 5 ) << 8;
+ lightStrenght = EEprom_read( 4 );
+
+ Delay_ms(20);
+ lightMode = EEprom_read( 3 );
+ setUpLightMode(lightMode);
+
+ do {
+
+ doScan();
+
+ if (data[1]&2) {
+ config();
+ }else{
+ if (oldData[1]&2) saveConfig();
+ send();
+ }
+ lightHandler();
+ Delay_80us();
+ } while (1);
+
+}
diff --git a/openKeyboard031/openKeyboard.dbg b/openKeyboard031/openKeyboard.dbg
new file mode 100644
index 0000000..163a2f9
Binary files /dev/null and b/openKeyboard031/openKeyboard.dbg differ
diff --git a/openKeyboard031/openKeyboard.dlt b/openKeyboard031/openKeyboard.dlt
new file mode 100644
index 0000000..e21748f
Binary files /dev/null and b/openKeyboard031/openKeyboard.dlt differ
diff --git a/openKeyboard031/openKeyboard.hex b/openKeyboard031/openKeyboard.hex
new file mode 100644
index 0000000..8beba1e
--- /dev/null
+++ b/openKeyboard031/openKeyboard.hex
@@ -0,0 +1,299 @@
+:100000008A156B28FF3FFF3FFF00030E8301D900D5
+:100010000408D8000A08DA008A017008E5000B1C01
+:10002000132820200B10031383126508F0005A08D0
+:100030008A0058088400590E8300FF0E7F0E0900C5
+:100040008B11080003138312FB01FA01F9018030C0
+:10005000F800FD01F11F3228F109F009F00A031937
+:10006000F10AFD0AF51F3A28F509F409F40A031903
+:10007000F50AFD0AF10CF00C031C47287408F90777
+:1000800075080318750FFA070318FB0A0310F01F11
+:100090004F287408FA070318FB0A7508FB07FB0CC6
+:1000A000FA0CF90CF80C031C3A287D1C6228FB0999
+:1000B000FA09F909F809F80A0319F90A0319FA0AF9
+:1000C0000319FB0A7B08F3007A08F2007908F100B3
+:1000D0007808F0000000080003138316071183124C
+:1000E00012150C309704080003138316871083122F
+:1000F00012150C309D040800031383161208013FEB
+:10010000F000F1010318F10A83126408F400F5010C
+:1001100022200630F2007008F4007108F500720821
+:100120000319992803138312F50CF40CF513FF3F00
+:100130009028031383127408F000F00D7010F00D76
+:100140007010F00D7010F00D701030307005F3006D
+:100150007408F0007508F100F10CF00CF113F10CCB
+:10016000F00CF113700895000F3097057308970491
+:100170000800031383161208013FF000F101031871
+:10018000F10A83126408F400F50122200630F2001F
+:100190007008F4007108F50072080319D6280313DB
+:1001A0008312F50CF40CF513FF3FCD2803138312D3
+:1001B0007408F000F00D7010F00D7010F00D70105C
+:1001C000F00D701030307005F3007408F000750801
+:1001D000F100F10CF00CF113F10CF00CF1137008BC
+:1001E0009B000F309D0573089D04080003138316C0
+:1001F000071583121211F0309705080003138316B8
+:10020000871483121211F0309D0508000313831226
+:100210002408A0002508A1002608A2002708A300A2
+:100220002808031D17296C2074200130A80003132F
+:1002300083122908E4007C202908E400B920080082
+:100240000000031783168C1C2729000021290313A3
+:1002500083125F0803178D000313600803178C00D7
+:1002600083168C130C158B1355308D00AA308D001E
+:100270008C148B170C1108000313831295011712AD
+:1002800097120800031383129B011D129D12080090
+:1002900003138316981690308312980083168717DD
+:1002A0000713031383128C1E58291A08E3005129DF
+:1002B000080003138312280803196029F620FE2082
+:1002C0009D297D3003138312AA000530AB00003056
+:1002D000AC000030FF30A900AD01AC297D30031324
+:1002E0008312AA000530AB000030AC0000300621BC
+:1002F0000130AD00AC297E3003138312AA00053013
+:10030000AB000030AC00003006218030A900023084
+:10031000AD00AC29033003138312DF00E00120217C
+:1003200003138312AD017D30AA000530AB0000300D
+:10033000AC000030FF30A900AC29031383125E0823
+:10034000003A031961295E08013A03196E295E0813
+:10035000023A03197B298A29FF300313831287008D
+:100360002D08003A0319C6291830831692003C2143
+:100370002908E4007C206C2018308316920042216A
+:100380002908E400B92074200130A80008001A2AC6
+:1003900003138316CF3003138316990018114821D5
+:1003A000432ACF3003138316990018154821432A96
+:1003B000673003138316990018154821432A3330F8
+:1003C00003138316990018154821432A1930031383
+:1003D0008316990018154821432A0C3003138316FD
+:1003E000990018154821432A0630031383169900F3
+:1003F00018154821432A0330031383169900181552
+:100400004821432A01300313831699001815482107
+:10041000432A013003138312DF000430E00020215F
+:10042000043003138312DE0033308316990018154D
+:100430004821432A03138312031383125E08013AEF
+:100440000319C8295E08023A0319D1295E08033A44
+:100450000319D8295E08043A0319DF295E08053A12
+:100460000319E6295E08063A0319ED295E08073AE2
+:100470000319F4295E08083A0319FB295E08093AB2
+:100480000319022A092A031383125E08AE0008002A
+:10049000712AC53003138312AF000530B00000305D
+:1004A000B10000300130B2007E2A383003138312CD
+:1004B000AF000630B0000030B1000030B2017E2A3B
+:1004C000383003138312AF000630B0000030B100A3
+:1004D00000300230DF00E001202103138312B2015B
+:1004E0007E2A03138312031383125E08013A031951
+:1004F000492A5E08003A0319552A602A0800073085
+:1005000003138312FB00FF30FA00FB0B882A8B2AAF
+:10051000FA0B882A852A7830FA00FA0B8D2A000017
+:10052000000008000313831285018B156300080087
+:1005300000300313831698180130F1007108003A57
+:10054000031DA42A0000982A031383125E08990051
+:100550000800083409340A34283414341E342F3483
+:1005600029342A342B3427342C3426342D341F34A8
+:1005700020342134233422342434253415341634E1
+:100580001734193418341A341B340B340C340D342A
+:100590000F340E3410341134013402340334053472
+:1005A0000434063407341C34123413340034003459
+:1005B0001D342E34003408000313831234088A00DB
+:1005C0003508820008003834393430340D34703442
+:1005D0002C3400340034003400342E3420346D3494
+:1005E000003400347A3478347634633462346E34D0
+:1005F0006134733464346734663468346A34713413
+:100600007734653474347234793475343134323437
+:10061000333435343434363437346B3469346F34EE
+:10062000003400346C3408343834393430340D3408
+:1006300050342C3400340034003400342E34203450
+:100640004D34003400345A34583456344334423430
+:100650004E344134533444344734463448344A34B5
+:100660005134573445345434523459345534313478
+:100670003234333435343434363437344B3449340B
+:100680004F34003400344C34083438343934303486
+:100690000D3429343A3400340034003400343F340B
+:1006A00020343E3400340034603427342D34BB34DD
+:1006B0007C343C347E349A347B34A8347D342F34FB
+:1006C0002734213440348034253423345E342634B6
+:1006D00031343234333435343434363437345B34B3
+:1006E0002A342834003400345D3408343834393442
+:1006F00030340D343D343B340034003400340034A5
+:10070000BF342034B53400340034E6349C345F34D4
+:10071000E7342B34F134E134DF34F034A534A3343E
+:100720005C342234A134E534E834FE342434FD341E
+:10073000F9343134323433343534343436343734B4
+:10074000A934EC34F23400340034F83408340800AE
+:1007500003138312FB01FA01F9018030F800F10C58
+:10076000F00C031CBC2B7408F90775080318750FEF
+:10077000FA070318FB0A0310F01FC42B7408FA07CA
+:1007800075080318750FFB07FB0CFA0CF90CF80C35
+:10079000031CAF2B7B08F3007A08F2007908F10004
+:1007A0007808F0000800031383125B0803178D001C
+:1007B00083168C130C1483120C08F000080003132A
+:1007C0008312DB01B6010130B700803003138312BE
+:1007D00037020318472C5B08383FF1005B083F3FA6
+:1007E00084000008F0007108840070088000370958
+:1007F00085005B083F3FF000700884000608800019
+:100800005B083F3FF100710884000008F000060813
+:10081000F00471088400700880005B083F3FF1001D
+:10082000710884000008F0000608F00471088400D4
+:10083000700880005B083F3FF100710884000008E9
+:10084000F000F00971088400700880005B08463FE2
+:10085000F2005B083F3F84000008F1005B08383F6E
+:1008600084000008F000F0097108F00572088400A7
+:10087000700880005B08463F84000008F0007008A4
+:10088000B604DB0A03138312B70D3710E52B0800FB
+:10089000031383122408A0002508A1002608A20043
+:1008A0002708A300401D672CFF3029020318672C7E
+:1008B00003138312A90A2908E4007C202908E40014
+:1008C000B9202D08003A031D672C0230AD00031338
+:1008D0008312401F7E2C2908003C03187E2C031332
+:1008E0008312A9032908E4007C202908E400B92028
+:1008F0002D08003A031D7E2C0230AD000130031399
+:1009000083124B05F00003198E2C0230DE005921B2
+:100910000030A4000230A500A601A7010313831232
+:10092000CB1CA22C01304005F000031DA22C02308C
+:1009300003138312DE0059210030A4000430A50007
+:10094000A601A701031383124B1DB62C01304005ED
+:10095000F000031DB62C023003138312DE00592170
+:100960000030A4000830A500A601A70103138312DC
+:100970004B1ECA2C01304005F000031DCA2C02306A
+:1009800003138312DE0059210030A4001030A500AB
+:10099000A601A70103138312CB1DE22C01304005F1
+:1009A000F0000319D72C0430DE00C721E22C0230FE
+:1009B00003138312DE0059210030A4002030A5006B
+:1009C000A601A70103138312CB1EFA2C01304005A8
+:1009D000F0000319EF2C0530DE00C721FA2C02309D
+:1009E00003138312DE0059210030A4004030A5001B
+:1009F000A601A701031383124B1F0E2D01304005E2
+:100A0000F000031D0E2D023003138312DE00592166
+:100A10000030A4008030A500A601A7010130031317
+:100A200083124605F0000319252D01304005F00022
+:100A3000031D252D023003138312DE0059210030DF
+:100A4000A400FF30A500A601A70103138312C61C52
+:100A5000332D01304005F000031D332D0130031309
+:100A60008312DE00592103138312461D402D0130ED
+:100A70004005F000031D402D03138312DE015921B0
+:100A80000130031383124905F00003194A2D013088
+:100A9000DE00482203138312C91C502DDE014822B8
+:100AA0007F220800013003138312DF002E08E000CC
+:100AB0002021023003138312DF003208E0002021DE
+:100AC000033003138312DF002D08E00020210430DF
+:100AD00003138312DF002908E000202105300313EF
+:100AE0008312DF002508F0002608F1002708F20035
+:100AF000F3017008E00020210800080003138312AE
+:100B000036080319852D06210800031383122308D4
+:100B1000003C031D952D2208003C031D952D210846
+:100B2000003C031D952D2008003C0318A22D013028
+:100B300003138312A002031CA102031CA202031CC4
+:100B4000A302A82DFF30031383128700A80192226D
+:100B5000031383122909F10000302302031DBA2D6B
+:100B600000302202031DBA2D00302102031DBA2DD0
+:100B7000710820020318C42D031383122009E40016
+:100B80007C202009E400B920080003138312DB0154
+:100B9000DC01DD010130B70080300313831237021E
+:100BA0000318372E5C083F3F84000008CD005C0826
+:100BB000383F84000008F0007008CD06DD010130E8
+:100BC000CE008030031383124E0203182F2E4E08DE
+:100BD0004D05F0000319262E5B08A93FF0000230F6
+:100BE0000318013FF1007008B5007108B4000A084D
+:100BF000B300DC22DE0033088A005C083F3F84003B
+:100C00000008F0004E087005F2005D08F000720860
+:100C1000F30070080319122E03138312F30CF3135D
+:100C2000FF3F0A2E063003138312F2007308F00010
+:100C300072080319212E03138312F00D7010FF3F69
+:100C4000192E031383127008DE04982203138312F3
+:100C5000DD0ADB0A03138312CE0D4E10E12D0313C0
+:100C60008312DC0A03138312B70D3710CC2D080052
+:100C700003138312DB01DC010130B7008030031362
+:100C8000831237020318822E0130CE008030031306
+:100C900083124E0203187A2E5C08463F8400000837
+:100CA000F0004E08F0050319722E4F08F000F10114
+:100CB0003130F4000030F500A823E330F0070230B3
+:100CC0000318013FF1075B08F0070318F10A7008E9
+:100CD000B5007108B4000A08B300DC22DE00330856
+:100CE0008A00982203138312DB0A03138312CE0DAA
+:100CF0004E10462E03138312DC0A03138312B70D22
+:100D000037103E2E0130031383124105F4000130E9
+:100D10004005F3007308F000F101F00DF10D7010C3
+:100D20000030F5007008F4047108F50440303F0508
+:100D3000F3007308F000F00CF013F00CF013F00C5B
+:100D4000F013F00CF0130030F1007408F004750893
+:100D5000F1047008503F84000008CF0008001930EB
+:100D600003138312FA00FA0BB32E000000000800F0
+:100D70000313831234088A00350882000800FF3FFD
+:100D8000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F73
+:100D9000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F63
+:100DA000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F53
+:100DB000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F43
+:100DC000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F33
+:100DD000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F23
+:100DE000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F13
+:100DF000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F03
+:100E0000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FF2
+:100E1000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FE2
+:100E2000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FD2
+:100E3000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FC2
+:100E4000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FB2
+:100E5000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FA2
+:100E6000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F92
+:100E7000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F82
+:100E8000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F72
+:100E9000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F62
+:100EA000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F52
+:100EB000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F42
+:100EC000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F32
+:100ED000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F22
+:100EE000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F12
+:100EF000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F02
+:100F0000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FF1
+:100F1000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FE1
+:100F2000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FD1
+:100F3000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FC1
+:100F4000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FB1
+:100F5000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FA1
+:100F6000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F91
+:100F7000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F81
+:100F8000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F71
+:100F9000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F61
+:100FA000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F51
+:100FB000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F41
+:100FC000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F31
+:100FD000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F21
+:100FE000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F11
+:100FF000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F01
+:10100000003003138312BF000030C0000030C10065
+:101010000030C2000030C3000030C4000030C50002
+:101020000030B8000030B9000030BA000030BB001A
+:101030000030BC000030BD000030BE000030C600F3
+:101040000030C7000030C8000030C9000030CA00BE
+:101050000030CB000030CC000030B6000030B700CC
+:101060000030CE000030CD00FF30A000FF30A100E6
+:101070000030A2000030A3000030A4008030A500A2
+:101080000030A6000030A7000030D0000130D100B1
+:101090000230D2000230D3000330D4000330D50038
+:1010A0000330D6000330D7000030AF000030B0006E
+:1010B0000030B1000030AA000030AB000030AC00BE
+:1010C0000030AE000030B2000030AD000030A900AA
+:1010D0000030A800080000206730031383168F003B
+:1010E0000317880189010313831285018316850183
+:1010F00083128601FF3083168600831287018316D0
+:10110000870181018B110B107F30960020308C00FD
+:101110008B171A30FB00FF30FA00FB0B9028932846
+:10112000FA0B90288D28E730FA00FA0B952800007A
+:1011300002308312DB008A11D3238A15700803134F
+:10114000B2007008DE008A1148228A151A30FB00AE
+:10115000FF30FA00FB0BAD28B028FA0BAD28AA2807
+:10116000E730FA00FA0BB22800000130DB008A11E8
+:10117000D3238A1570080313AE007008DE008A11AD
+:10118000C7218A151A30FB00FF30FA00FB0BC92873
+:10119000CC28FA0BC928C628E730FA00FA0BCE286B
+:1011A00000000530DB008A11D3238A150830F100D6
+:1011B00070080313A400A50171080319E62803139E
+:1011C0008312A40DA50D2410FF3FDD28003003136A
+:1011D0008312A600A7000430DB008A11D3238A15EE
+:1011E00070080313A9001A30FB00FF30FA00FB0B54
+:1011F000FA28FD28FA0BFA28F728E730FA00FA0B4C
+:10120000FF2800000330DB008A11D3238A15700801
+:101210000313AD007008DE008A1159218A158A1166
+:10122000DF238A1503138312C01C1A298A1148244C
+:101230008A15302903138312B91C21298A115225DA
+:101240008A15031383122F08B5003008B4000A086A
+:10125000B3008A11B8268A150313831233088A0053
+:10126000031383122A08B5002B08B4000A08B30040
+:101270008A11B8268A150313831233088A008A114B
+:10128000AF268A150F294329FF3FFF3FFF3FFF3F4E
+:04400E00C420FF3F8C
+:00000001FF
diff --git a/openKeyboard031/openKeyboard.lst b/openKeyboard031/openKeyboard.lst
new file mode 100644
index 0000000..82a9bd7
--- /dev/null
+++ b/openKeyboard031/openKeyboard.lst
@@ -0,0 +1,2797 @@
+; ASM code generated by mikroVirtualMachine for PIC - V. 8.0.0.0
+; Date/Time: 23/08/2008 13.42.24
+; Info: http://www.mikroe.com
+
+
+; ADDRESS OPCODE ASM
+; ----------------------------------------------
+$0000 $158A BSF PCLATH, 3
+$0001 $286B GOTO _main
+$0020 $ _exitPowerSave:
+;openKeyboard.c,123 :: void exitPowerSave(){
+;openKeyboard.c,124 :: INTCON.RBIE = 0; // disables PORTB on-change interrupt
+$0020 $118B BCF INTCON, 3
+;openKeyboard.c,125 :: }
+$0021 $0008 RETURN
+$0004 $ _interrupt:
+$0004 $00FF MOVWF STACK_15
+$0005 $0E03 SWAPF STATUS, 0
+$0006 $0183 CLRF STATUS
+$0007 $00D9 MOVWF ?saveSTATUS
+$0008 $0804 MOVF FSR, 0
+$0009 $00D8 MOVWF ?saveFSR
+$000A $080A MOVF PCLATH, 0
+$000B $00DA MOVWF ?savePCLATH
+$000C $018A CLRF PCLATH
+$000D $0870 MOVF STACK_0, 0
+$000E $00E5 MOVWF STSAVED_0
+;openKeyboard.c,442 :: void interrupt() {
+;openKeyboard.c,443 :: if (INTCON.RBIF) { // SOMETHING CHANGED ON PORTB...
+$000F $1C0B BTFSS INTCON, 0
+$0010 $2813 GOTO L_interrupt_85
+;openKeyboard.c,444 :: exitPowerSave(); // just wakeup and so some scanning...
+$0011 $2020 CALL _exitPowerSave
+;openKeyboard.c,445 :: INTCON.RBIF = 0; // clear intr flag
+$0012 $100B BCF INTCON, 0
+;openKeyboard.c,446 :: }
+$0013 $ L_interrupt_85:
+;openKeyboard.c,451 :: }
+$0013 $ L_Interrupt_end:
+$0013 $1303 BCF STATUS, RP1
+$0014 $1283 BCF STATUS, RP0
+$0015 $0865 MOVF STSAVED_0, 0
+$0016 $00F0 MOVWF STACK_0
+$0017 $085A MOVF ?savePCLATH, 0
+$0018 $008A MOVWF PCLATH
+$0019 $0858 MOVF ?saveFSR, 0
+$001A $0084 MOVWF FSR
+$001B $0E59 SWAPF ?saveSTATUS, 0
+$001C $0083 MOVWF STATUS
+$001D $0EFF SWAPF STACK_15, 1
+$001E $0E7F SWAPF STACK_15, 0
+$001F $0009 RETFIE
+$0022 $ _Mul_16x16_S:
+$0022 $1303 BCF STATUS, RP1
+$0023 $1283 BCF STATUS, RP0
+$0024 $01FB CLRF STACK_11
+$0025 $01FA CLRF STACK_10
+$0026 $01F9 CLRF STACK_9
+$0027 $3080 MOVLW 128
+$0028 $00F8 MOVWF STACK_8
+$0029 $01FD CLRF STACK_13
+$002A $1FF1 BTFSS STACK_1, 7
+$002B $2832 GOTO $+7
+$002C $09F1 COMF STACK_1, F
+$002D $09F0 COMF STACK_0, F
+$002E $0AF0 INCF STACK_0, F
+$002F $1903 BTFSC STATUS, Z
+$0030 $0AF1 INCF STACK_1, F
+$0031 $0AFD INCF STACK_13, F
+$0032 $1FF5 BTFSS STACK_5, 7
+$0033 $283A GOTO $+7
+$0034 $09F5 COMF STACK_5, F
+$0035 $09F4 COMF STACK_4, F
+$0036 $0AF4 INCF STACK_4, F
+$0037 $1903 BTFSC STATUS, Z
+$0038 $0AF5 INCF STACK_5, F
+$0039 $0AFD INCF STACK_13, F
+$003A $0CF1 RRF STACK_1, F
+$003B $0CF0 RRF STACK_0, F
+$003C $1C03 BTFSS STATUS, C
+$003D $2847 GOTO $+10
+$003E $0874 MOVF STACK_4, W
+$003F $07F9 ADDWF STACK_9, F
+$0040 $0875 MOVF STACK_5, W
+$0041 $1803 BTFSC STATUS, C
+$0042 $0F75 INCFSZ STACK_5, W
+$0043 $07FA ADDWF STACK_10, F
+$0044 $1803 BTFSC STATUS, C
+$0045 $0AFB INCF STACK_11, F
+$0046 $1003 BCF STATUS, C
+$0047 $1FF0 BTFSS STACK_0, 7
+$0048 $284F GOTO $+7
+$0049 $0874 MOVF STACK_4, W
+$004A $07FA ADDWF STACK_10, F
+$004B $1803 BTFSC STATUS, C
+$004C $0AFB INCF STACK_11, F
+$004D $0875 MOVF STACK_5, W
+$004E $07FB ADDWF STACK_11, F
+$004F $0CFB RRF STACK_11, F
+$0050 $0CFA RRF STACK_10, F
+$0051 $0CF9 RRF STACK_9, F
+$0052 $0CF8 RRF STACK_8, F
+$0053 $1C03 BTFSS STATUS, C
+$0054 $283A GOTO $-26
+$0055 $1C7D BTFSS STACK_13, 0
+$0056 $2862 GOTO $+12
+$0057 $09FB COMF STACK_11, F
+$0058 $09FA COMF STACK_10, F
+$0059 $09F9 COMF STACK_9, F
+$005A $09F8 COMF STACK_8, F
+$005B $0AF8 INCF STACK_8, F
+$005C $1903 BTFSC STATUS, Z
+$005D $0AF9 INCF STACK_9, F
+$005E $1903 BTFSC STATUS, Z
+$005F $0AFA INCF STACK_10, F
+$0060 $1903 BTFSC STATUS, Z
+$0061 $0AFB INCF STACK_11, F
+$0062 $087B MOVF STACK_11, W
+$0063 $00F3 MOVWF STACK_3
+$0064 $087A MOVF STACK_10, W
+$0065 $00F2 MOVWF STACK_2
+$0066 $0879 MOVF STACK_9, W
+$0067 $00F1 MOVWF STACK_1
+$0068 $0878 MOVF STACK_8, W
+$0069 $00F0 MOVWF STACK_0
+$006A $0000 NOP
+$006B $0008 RETURN
+$006C $ _PWM1_Start:
+$006C $1303 BCF STATUS, RP1
+$006D $1683 BSF STATUS, RP0
+$006E $1107 BCF TRISC, 2
+$006F $1283 BCF STATUS, RP0
+$0070 $1512 BSF T2CON, 2
+$0071 $300C MOVLW 12
+$0072 $0497 IORWF CCP1CON, 1
+$0073 $0008 RETURN
+$0074 $ _PWM2_Start:
+$0074 $1303 BCF STATUS, RP1
+$0075 $1683 BSF STATUS, RP0
+$0076 $1087 BCF TRISC, 1
+$0077 $1283 BCF STATUS, RP0
+$0078 $1512 BSF T2CON, 2
+$0079 $300C MOVLW 12
+$007A $049D IORWF CCP2CON, 1
+$007B $0008 RETURN
+$007C $ _PWM1_Change_Duty:
+$007C $1303 BCF STATUS, RP1
+$007D $1683 BSF STATUS, RP0
+$007E $0812 MOVF PR2, 0
+$007F $3F01 ADDLW 1
+$0080 $00F0 MOVWF STACK_0
+$0081 $01F1 CLRF STACK_0+1
+$0082 $1803 BTFSC STATUS, C
+$0083 $0AF1 INCF STACK_0+1, 1
+$0084 $1283 BCF STATUS, RP0
+$0085 $0864 MOVF FARG_PWM1_Change_Duty+0, 0
+$0086 $00F4 MOVWF STACK_4
+$0087 $01F5 CLRF STACK_4+1
+$0088 $2022 CALL _mul_16x16_s
+$0089 $3006 MOVLW 6
+$008A $00F2 MOVWF STACK_2
+$008B $0870 MOVF STACK_0, 0
+$008C $00F4 MOVWF STACK_4
+$008D $0871 MOVF STACK_0+1, 0
+$008E $00F5 MOVWF STACK_4+1
+$008F $0872 MOVF STACK_2, 0
+$0090 $ L_PWM1_Change_Duty_2:
+$0090 $1903 BTFSC STATUS, Z
+$0091 $2899 GOTO L_PWM1_Change_Duty_3
+$0092 $1303 BCF STATUS, RP1
+$0093 $1283 BCF STATUS, RP0
+$0094 $0CF5 RRF STACK_4+1, 1
+$0095 $0CF4 RRF STACK_4, 1
+$0096 $13F5 BCF STACK_4+1, 7
+$0097 $3FFF ADDLW 255
+$0098 $2890 GOTO L_PWM1_Change_Duty_2
+$0099 $ L_PWM1_Change_Duty_3:
+$0099 $1303 BCF STATUS, RP1
+$009A $1283 BCF STATUS, RP0
+$009B $0874 MOVF STACK_4, 0
+$009C $00F0 MOVWF STACK_0
+$009D $0DF0 RLF STACK_0, 1
+$009E $1070 BCF STACK_0, 0
+$009F $0DF0 RLF STACK_0, 1
+$00A0 $1070 BCF STACK_0, 0
+$00A1 $0DF0 RLF STACK_0, 1
+$00A2 $1070 BCF STACK_0, 0
+$00A3 $0DF0 RLF STACK_0, 1
+$00A4 $1070 BCF STACK_0, 0
+$00A5 $3030 MOVLW 48
+$00A6 $0570 ANDWF STACK_0, 0
+$00A7 $00F3 MOVWF STACK_3
+$00A8 $0874 MOVF STACK_4, 0
+$00A9 $00F0 MOVWF STACK_0
+$00AA $0875 MOVF STACK_4+1, 0
+$00AB $00F1 MOVWF STACK_0+1
+$00AC $0CF1 RRF STACK_0+1, 1
+$00AD $0CF0 RRF STACK_0, 1
+$00AE $13F1 BCF STACK_0+1, 7
+$00AF $0CF1 RRF STACK_0+1, 1
+$00B0 $0CF0 RRF STACK_0, 1
+$00B1 $13F1 BCF STACK_0+1, 7
+$00B2 $0870 MOVF STACK_0, 0
+$00B3 $0095 MOVWF CCPR1L
+$00B4 $300F MOVLW 15
+$00B5 $0597 ANDWF CCP1CON, 1
+$00B6 $0873 MOVF STACK_3, 0
+$00B7 $0497 IORWF CCP1CON, 1
+$00B8 $0008 RETURN
+$00B9 $ _PWM2_Change_Duty:
+$00B9 $1303 BCF STATUS, RP1
+$00BA $1683 BSF STATUS, RP0
+$00BB $0812 MOVF PR2, 0
+$00BC $3F01 ADDLW 1
+$00BD $00F0 MOVWF STACK_0
+$00BE $01F1 CLRF STACK_0+1
+$00BF $1803 BTFSC STATUS, C
+$00C0 $0AF1 INCF STACK_0+1, 1
+$00C1 $1283 BCF STATUS, RP0
+$00C2 $0864 MOVF FARG_PWM2_Change_Duty+0, 0
+$00C3 $00F4 MOVWF STACK_4
+$00C4 $01F5 CLRF STACK_4+1
+$00C5 $2022 CALL _mul_16x16_s
+$00C6 $3006 MOVLW 6
+$00C7 $00F2 MOVWF STACK_2
+$00C8 $0870 MOVF STACK_0, 0
+$00C9 $00F4 MOVWF STACK_4
+$00CA $0871 MOVF STACK_0+1, 0
+$00CB $00F5 MOVWF STACK_4+1
+$00CC $0872 MOVF STACK_2, 0
+$00CD $ L_PWM2_Change_Duty_0:
+$00CD $1903 BTFSC STATUS, Z
+$00CE $28D6 GOTO L_PWM2_Change_Duty_1
+$00CF $1303 BCF STATUS, RP1
+$00D0 $1283 BCF STATUS, RP0
+$00D1 $0CF5 RRF STACK_4+1, 1
+$00D2 $0CF4 RRF STACK_4, 1
+$00D3 $13F5 BCF STACK_4+1, 7
+$00D4 $3FFF ADDLW 255
+$00D5 $28CD GOTO L_PWM2_Change_Duty_0
+$00D6 $ L_PWM2_Change_Duty_1:
+$00D6 $1303 BCF STATUS, RP1
+$00D7 $1283 BCF STATUS, RP0
+$00D8 $0874 MOVF STACK_4, 0
+$00D9 $00F0 MOVWF STACK_0
+$00DA $0DF0 RLF STACK_0, 1
+$00DB $1070 BCF STACK_0, 0
+$00DC $0DF0 RLF STACK_0, 1
+$00DD $1070 BCF STACK_0, 0
+$00DE $0DF0 RLF STACK_0, 1
+$00DF $1070 BCF STACK_0, 0
+$00E0 $0DF0 RLF STACK_0, 1
+$00E1 $1070 BCF STACK_0, 0
+$00E2 $3030 MOVLW 48
+$00E3 $0570 ANDWF STACK_0, 0
+$00E4 $00F3 MOVWF STACK_3
+$00E5 $0874 MOVF STACK_4, 0
+$00E6 $00F0 MOVWF STACK_0
+$00E7 $0875 MOVF STACK_4+1, 0
+$00E8 $00F1 MOVWF STACK_0+1
+$00E9 $0CF1 RRF STACK_0+1, 1
+$00EA $0CF0 RRF STACK_0, 1
+$00EB $13F1 BCF STACK_0+1, 7
+$00EC $0CF1 RRF STACK_0+1, 1
+$00ED $0CF0 RRF STACK_0, 1
+$00EE $13F1 BCF STACK_0+1, 7
+$00EF $0870 MOVF STACK_0, 0
+$00F0 $009B MOVWF CCPR2L
+$00F1 $300F MOVLW 15
+$00F2 $059D ANDWF CCP2CON, 1
+$00F3 $0873 MOVF STACK_3, 0
+$00F4 $049D IORWF CCP2CON, 1
+$00F5 $0008 RETURN
+$00F6 $ _PWM1_Stop:
+$00F6 $1303 BCF STATUS, RP1
+$00F7 $1683 BSF STATUS, RP0
+$00F8 $1507 BSF TRISC, 2
+$00F9 $1283 BCF STATUS, RP0
+$00FA $1112 BCF T2CON, 2
+$00FB $30F0 MOVLW 240
+$00FC $0597 ANDWF CCP1CON, 1
+$00FD $0008 RETURN
+$00FE $ _PWM2_Stop:
+$00FE $1303 BCF STATUS, RP1
+$00FF $1683 BSF STATUS, RP0
+$0100 $1487 BSF TRISC, 1
+$0101 $1283 BCF STATUS, RP0
+$0102 $1112 BCF T2CON, 2
+$0103 $30F0 MOVLW 240
+$0104 $059D ANDWF CCP2CON, 1
+$0105 $0008 RETURN
+$0106 $ _turnBacklightOn:
+;openKeyboard.c,154 :: void turnBacklightOn(){
+;openKeyboard.c,155 :: timer = lightFadeOffTime;
+$0106 $1303 BCF STATUS, RP1
+$0107 $1283 BCF STATUS, RP0
+$0108 $0824 MOVF _lightFadeOffTime, 0
+$0109 $00A0 MOVWF _timer
+$010A $0825 MOVF _lightFadeOffTime+1, 0
+$010B $00A1 MOVWF _timer+1
+$010C $0826 MOVF _lightFadeOffTime+2, 0
+$010D $00A2 MOVWF _timer+2
+$010E $0827 MOVF _lightFadeOffTime+3, 0
+$010F $00A3 MOVWF _timer+3
+;openKeyboard.c,156 :: if (!pwmRunning) {
+$0110 $0828 MOVF _pwmRunning, 0
+$0111 $1D03 BTFSS STATUS, Z
+$0112 $2917 GOTO L_turnBacklightOn_12
+;openKeyboard.c,157 :: PWM1_Start();
+$0113 $206C CALL _PWM1_Start
+;openKeyboard.c,158 :: PWM2_Start();
+$0114 $2074 CALL _PWM2_Start
+;openKeyboard.c,159 :: pwmRunning = 1;
+$0115 $3001 MOVLW 1
+$0116 $00A8 MOVWF _pwmRunning
+;openKeyboard.c,160 :: }
+$0117 $ L_turnBacklightOn_12:
+;openKeyboard.c,161 :: PWM1_Change_Duty(lightStrenght);
+$0117 $1303 BCF STATUS, RP1
+$0118 $1283 BCF STATUS, RP0
+$0119 $0829 MOVF _lightStrenght, 0
+$011A $00E4 MOVWF FARG_PWM1_Change_Duty+0
+$011B $207C CALL _PWM1_Change_Duty
+;openKeyboard.c,162 :: PWM2_Change_Duty(lightStrenght);
+$011C $0829 MOVF _lightStrenght, 0
+$011D $00E4 MOVWF FARG_PWM2_Change_Duty+0
+$011E $20B9 CALL _PWM2_Change_Duty
+;openKeyboard.c,163 :: }
+$011F $0008 RETURN
+$0120 $ _EEprom_write:
+$0120 $0000 NOP
+$0121 $ L_EEprom_write_0:
+$0121 $1703 BSF STATUS, RP1
+$0122 $1683 BSF STATUS, RP0
+$0123 $1C8C BTFSS EECON1, 1
+$0124 $2927 GOTO L_EEprom_write_1
+$0125 $0000 NOP
+$0126 $2921 GOTO L_EEprom_write_0
+$0127 $ L_EEprom_write_1:
+$0127 $1303 BCF STATUS, RP1
+$0128 $1283 BCF STATUS, RP0
+$0129 $085F MOVF FARG_EEprom_write+0, 0
+$012A $1703 BSF STATUS, RP1
+$012B $008D MOVWF EEADR
+$012C $1303 BCF STATUS, RP1
+$012D $0860 MOVF FARG_EEprom_write+1, 0
+$012E $1703 BSF STATUS, RP1
+$012F $008C MOVWF EEDATA
+$0130 $1683 BSF STATUS, RP0
+$0131 $138C BCF EECON1, 7
+$0132 $150C BSF EECON1, 2
+$0133 $138B BCF INTCON, 7
+$0134 $3055 MOVLW 85
+$0135 $008D MOVWF EECON2
+$0136 $30AA MOVLW 170
+$0137 $008D MOVWF EECON2
+$0138 $148C BSF EECON1, 1
+$0139 $178B BSF INTCON, 7
+$013A $110C BCF EECON1, 2
+$013B $0008 RETURN
+$013C $ _PWM1_Init:
+$013C $1303 BCF STATUS, RP1
+$013D $1283 BCF STATUS, RP0
+$013E $0195 CLRF CCPR1L, 1
+$013F $1217 BCF CCP1CON, 4
+$0140 $1297 BCF CCP1CON, 5
+$0141 $0008 RETURN
+$0142 $ _PWM2_Init:
+$0142 $1303 BCF STATUS, RP1
+$0143 $1283 BCF STATUS, RP0
+$0144 $019B CLRF CCPR2L, 1
+$0145 $121D BCF CCP2CON, 4
+$0146 $129D BCF CCP2CON, 5
+$0147 $0008 RETURN
+$0148 $ _Usart_Init:
+$0148 $1303 BCF STATUS, RP1
+$0149 $1683 BSF STATUS, RP0
+$014A $1698 BSF TXSTA, 5
+$014B $3090 MOVLW 144
+$014C $1283 BCF STATUS, RP0
+$014D $0098 MOVWF RCSTA
+$014E $1683 BSF STATUS, RP0
+$014F $1787 BSF TRISC, 7
+$0150 $1307 BCF TRISC, 6
+$0151 $ L_Usart_Init_0:
+$0151 $1303 BCF STATUS, RP1
+$0152 $1283 BCF STATUS, RP0
+$0153 $1E8C BTFSS PIR1, 5
+$0154 $2958 GOTO L_Usart_Init_1
+$0155 $081A MOVF RCREG, 0
+$0156 $00E3 MOVWF Usart_Init_tmp_L0
+$0157 $2951 GOTO L_Usart_Init_0
+$0158 $ L_Usart_Init_1:
+$0158 $0008 RETURN
+$0159 $ _setupLightMode:
+;openKeyboard.c,192 :: void setupLightMode(unsigned char lm){
+;openKeyboard.c,194 :: if (pwmRunning){
+$0159 $1303 BCF STATUS, RP1
+$015A $1283 BCF STATUS, RP0
+$015B $0828 MOVF _pwmRunning, 0
+$015C $1903 BTFSC STATUS, Z
+$015D $2960 GOTO L_setupLightMode_17
+;openKeyboard.c,195 :: PWM1_Stop();
+$015E $20F6 CALL _PWM1_Stop
+;openKeyboard.c,196 :: PWM2_Stop();
+$015F $20FE CALL _PWM2_Stop
+;openKeyboard.c,197 :: }
+$0160 $ L_setupLightMode_17:
+;openKeyboard.c,199 :: switch (lm){
+$0160 $299D GOTO L_setupLightMode_18
+;openKeyboard.c,200 :: case LIGHTMODE_ALWAYSOFF: lightHandler = &nop;
+$0161 $ L_setupLightMode_20:
+$0161 $307D MOVLW #_nop
+$0162 $1303 BCF STATUS, RP1
+$0163 $1283 BCF STATUS, RP0
+$0164 $00AA MOVWF _lightHandler
+$0165 $3005 MOVLW @#_nop
+$0166 $00AB MOVWF _lightHandler+1
+$0167 $3000 MOVLW 0
+$0168 $00AC MOVWF _lightHandler+2
+$0169 $3000 MOVLW 0
+;openKeyboard.c,201 :: lightStrenght = 0xFF;
+$016A $30FF MOVLW 255
+$016B $00A9 MOVWF _lightStrenght
+;openKeyboard.c,202 :: lightMode = LIGHTMODE_ALWAYSOFF;
+$016C $01AD CLRF _lightMode, 1
+;openKeyboard.c,203 :: break;
+$016D $29AC GOTO L_setupLightMode_19
+;openKeyboard.c,205 :: case LIGHTMODE_ALWAYSON: lightHandler = &nop;
+$016E $ L_setupLightMode_21:
+$016E $307D MOVLW #_nop
+$016F $1303 BCF STATUS, RP1
+$0170 $1283 BCF STATUS, RP0
+$0171 $00AA MOVWF _lightHandler
+$0172 $3005 MOVLW @#_nop
+$0173 $00AB MOVWF _lightHandler+1
+$0174 $3000 MOVLW 0
+$0175 $00AC MOVWF _lightHandler+2
+$0176 $3000 MOVLW 0
+;openKeyboard.c,206 :: turnBacklightOn();
+$0177 $2106 CALL _turnBacklightOn
+;openKeyboard.c,207 :: lightMode = LIGHTMODE_ALWAYSON;
+$0178 $3001 MOVLW 1
+$0179 $00AD MOVWF _lightMode
+;openKeyboard.c,208 :: break;
+$017A $29AC GOTO L_setupLightMode_19
+;openKeyboard.c,210 :: case LIGHTMODE_FADE: lightHandler = &lightFade;
+$017B $ L_setupLightMode_22:
+$017B $307E MOVLW #_lightFade
+$017C $1303 BCF STATUS, RP1
+$017D $1283 BCF STATUS, RP0
+$017E $00AA MOVWF _lightHandler
+$017F $3005 MOVLW @#_lightFade
+$0180 $00AB MOVWF _lightHandler+1
+$0181 $3000 MOVLW 0
+$0182 $00AC MOVWF _lightHandler+2
+$0183 $3000 MOVLW 0
+;openKeyboard.c,211 :: turnBacklightOn();
+$0184 $2106 CALL _turnBacklightOn
+;openKeyboard.c,212 :: lightStrenght = 0x80; // restore middle luminosity
+$0185 $3080 MOVLW 128
+$0186 $00A9 MOVWF _lightStrenght
+;openKeyboard.c,213 :: lightMode = LIGHTMODE_FADE;
+$0187 $3002 MOVLW 2
+$0188 $00AD MOVWF _lightMode
+;openKeyboard.c,214 :: break;
+$0189 $29AC GOTO L_setupLightMode_19
+;openKeyboard.c,216 :: default : EEprom_write(CONFIG_LIGHTMODE, LIGHTMODE_ALWAYSOFF);
+$018A $ L_setupLightMode_23:
+$018A $3003 MOVLW 3
+$018B $1303 BCF STATUS, RP1
+$018C $1283 BCF STATUS, RP0
+$018D $00DF MOVWF FARG_EEprom_write+0
+$018E $01E0 CLRF FARG_EEprom_write+1, 1
+$018F $2120 CALL _EEprom_write
+;openKeyboard.c,217 :: lightMode = LIGHTMODE_ALWAYSOFF;
+$0190 $1303 BCF STATUS, RP1
+$0191 $1283 BCF STATUS, RP0
+$0192 $01AD CLRF _lightMode, 1
+;openKeyboard.c,218 :: lightHandler = &nop;
+$0193 $307D MOVLW #_nop
+$0194 $00AA MOVWF _lightHandler
+$0195 $3005 MOVLW @#_nop
+$0196 $00AB MOVWF _lightHandler+1
+$0197 $3000 MOVLW 0
+$0198 $00AC MOVWF _lightHandler+2
+$0199 $3000 MOVLW 0
+;openKeyboard.c,219 :: lightStrenght = 0xFF;
+$019A $30FF MOVLW 255
+$019B $00A9 MOVWF _lightStrenght
+;openKeyboard.c,220 :: }
+$019C $29AC GOTO L_setupLightMode_19
+$019D $ L_setupLightMode_18:
+$019D $1303 BCF STATUS, RP1
+$019E $1283 BCF STATUS, RP0
+$019F $085E MOVF FARG_setupLightMode+0, 0
+$01A0 $3A00 XORLW 0
+$01A1 $1903 BTFSC STATUS, Z
+$01A2 $2961 GOTO L_setupLightMode_20
+$01A3 $085E MOVF FARG_setupLightMode+0, 0
+$01A4 $3A01 XORLW 1
+$01A5 $1903 BTFSC STATUS, Z
+$01A6 $296E GOTO L_setupLightMode_21
+$01A7 $085E MOVF FARG_setupLightMode+0, 0
+$01A8 $3A02 XORLW 2
+$01A9 $1903 BTFSC STATUS, Z
+$01AA $297B GOTO L_setupLightMode_22
+$01AB $298A GOTO L_setupLightMode_23
+$01AC $ L_setupLightMode_19:
+;openKeyboard.c,222 :: PORTC = 255;
+$01AC $30FF MOVLW 255
+$01AD $1303 BCF STATUS, RP1
+$01AE $1283 BCF STATUS, RP0
+$01AF $0087 MOVWF PORTC
+;openKeyboard.c,225 :: if (lightMode != LIGHTMODE_ALWAYSOFF) {
+$01B0 $082D MOVF _lightMode, 0
+$01B1 $3A00 XORLW 0
+$01B2 $1903 BTFSC STATUS, Z
+$01B3 $29C6 GOTO L_setupLightMode_24
+;openKeyboard.c,226 :: PWM1_Init(40000);
+$01B4 $3018 MOVLW 24
+$01B5 $1683 BSF STATUS, RP0
+$01B6 $0092 MOVWF PR2
+$01B7 $213C CALL _PWM1_Init
+;openKeyboard.c,227 :: PWM1_Change_Duty(lightStrenght);
+$01B8 $0829 MOVF _lightStrenght, 0
+$01B9 $00E4 MOVWF FARG_PWM1_Change_Duty+0
+$01BA $207C CALL _PWM1_Change_Duty
+;openKeyboard.c,228 :: PWM1_Start();
+$01BB $206C CALL _PWM1_Start
+;openKeyboard.c,230 :: PWM2_Init(40000);
+$01BC $3018 MOVLW 24
+$01BD $1683 BSF STATUS, RP0
+$01BE $0092 MOVWF PR2
+$01BF $2142 CALL _PWM2_Init
+;openKeyboard.c,231 :: PWM2_Change_Duty(lightStrenght);
+$01C0 $0829 MOVF _lightStrenght, 0
+$01C1 $00E4 MOVWF FARG_PWM2_Change_Duty+0
+$01C2 $20B9 CALL _PWM2_Change_Duty
+;openKeyboard.c,232 :: PWM2_Start();
+$01C3 $2074 CALL _PWM2_Start
+;openKeyboard.c,234 :: pwmRunning = 1;
+$01C4 $3001 MOVLW 1
+$01C5 $00A8 MOVWF _pwmRunning
+;openKeyboard.c,235 :: }
+$01C6 $ L_setupLightMode_24:
+;openKeyboard.c,236 :: }
+$01C6 $0008 RETURN
+$01C7 $ _setupUsart:
+;openKeyboard.c,127 :: void setupUsart(unsigned char br){
+;openKeyboard.c,128 :: switch(br){ // done so, because you can't call USART_Init(variable); but only USART_Init(literal);
+$01C7 $2A1A GOTO L_setupUsart_0
+;openKeyboard.c,129 :: case BAUDRATE_300: USART_Init(300);
+$01C8 $ L_setupUsart_2:
+$01C8 $1303 BCF STATUS, RP1
+$01C9 $1683 BSF STATUS, RP0
+$01CA $30CF MOVLW 207
+$01CB $1303 BCF STATUS, RP1
+$01CC $1683 BSF STATUS, RP0
+$01CD $0099 MOVWF SPBRG
+$01CE $1118 BCF TXSTA, BRGH
+$01CF $2148 CALL _Usart_Init
+;openKeyboard.c,130 :: break;
+$01D0 $2A43 GOTO L_setupUsart_1
+;openKeyboard.c,131 :: case BAUDRATE_1200: USART_Init(1200);
+$01D1 $ L_setupUsart_3:
+$01D1 $30CF MOVLW 207
+$01D2 $1303 BCF STATUS, RP1
+$01D3 $1683 BSF STATUS, RP0
+$01D4 $0099 MOVWF SPBRG
+$01D5 $1518 BSF TXSTA, BRGH
+$01D6 $2148 CALL _Usart_Init
+;openKeyboard.c,132 :: break;
+$01D7 $2A43 GOTO L_setupUsart_1
+;openKeyboard.c,133 :: case BAUDRATE_2400: USART_Init(2400);
+$01D8 $ L_setupUsart_4:
+$01D8 $3067 MOVLW 103
+$01D9 $1303 BCF STATUS, RP1
+$01DA $1683 BSF STATUS, RP0
+$01DB $0099 MOVWF SPBRG
+$01DC $1518 BSF TXSTA, BRGH
+$01DD $2148 CALL _Usart_Init
+;openKeyboard.c,134 :: break;
+$01DE $2A43 GOTO L_setupUsart_1
+;openKeyboard.c,135 :: case BAUDRATE_4800: USART_Init(4800);
+$01DF $ L_setupUsart_5:
+$01DF $3033 MOVLW 51
+$01E0 $1303 BCF STATUS, RP1
+$01E1 $1683 BSF STATUS, RP0
+$01E2 $0099 MOVWF SPBRG
+$01E3 $1518 BSF TXSTA, BRGH
+$01E4 $2148 CALL _Usart_Init
+;openKeyboard.c,136 :: break;
+$01E5 $2A43 GOTO L_setupUsart_1
+;openKeyboard.c,137 :: case BAUDRATE_9600: USART_Init(9600);
+$01E6 $ L_setupUsart_6:
+$01E6 $3019 MOVLW 25
+$01E7 $1303 BCF STATUS, RP1
+$01E8 $1683 BSF STATUS, RP0
+$01E9 $0099 MOVWF SPBRG
+$01EA $1518 BSF TXSTA, BRGH
+$01EB $2148 CALL _Usart_Init
+;openKeyboard.c,138 :: break;
+$01EC $2A43 GOTO L_setupUsart_1
+;openKeyboard.c,139 :: case BAUDRATE_19200: USART_Init(19200);
+$01ED $ L_setupUsart_7:
+$01ED $300C MOVLW 12
+$01EE $1303 BCF STATUS, RP1
+$01EF $1683 BSF STATUS, RP0
+$01F0 $0099 MOVWF SPBRG
+$01F1 $1518 BSF TXSTA, BRGH
+$01F2 $2148 CALL _Usart_Init
+;openKeyboard.c,140 :: break;
+$01F3 $2A43 GOTO L_setupUsart_1
+;openKeyboard.c,141 :: case BAUDRATE_38400: USART_Init(38400);
+$01F4 $ L_setupUsart_8:
+$01F4 $3006 MOVLW 6
+$01F5 $1303 BCF STATUS, RP1
+$01F6 $1683 BSF STATUS, RP0
+$01F7 $0099 MOVWF SPBRG
+$01F8 $1518 BSF TXSTA, BRGH
+$01F9 $2148 CALL _Usart_Init
+;openKeyboard.c,142 :: break;
+$01FA $2A43 GOTO L_setupUsart_1
+;openKeyboard.c,143 :: case BAUDRATE_57600: USART_Init(57600);
+$01FB $ L_setupUsart_9:
+$01FB $3003 MOVLW 3
+$01FC $1303 BCF STATUS, RP1
+$01FD $1683 BSF STATUS, RP0
+$01FE $0099 MOVWF SPBRG
+$01FF $1518 BSF TXSTA, BRGH
+$0200 $2148 CALL _Usart_Init
+;openKeyboard.c,144 :: break;
+$0201 $2A43 GOTO L_setupUsart_1
+;openKeyboard.c,145 :: case BAUDRATE_115200: USART_Init(115200);
+$0202 $ L_setupUsart_10:
+$0202 $3001 MOVLW 1
+$0203 $1303 BCF STATUS, RP1
+$0204 $1683 BSF STATUS, RP0
+$0205 $0099 MOVWF SPBRG
+$0206 $1518 BSF TXSTA, BRGH
+$0207 $2148 CALL _Usart_Init
+;openKeyboard.c,146 :: break;
+$0208 $2A43 GOTO L_setupUsart_1
+;openKeyboard.c,147 :: default: EEprom_write(CONFIG_BAUDRATE, BAUDRATE_4800); // if no config found, set a default 4800
+$0209 $ L_setupUsart_11:
+$0209 $3001 MOVLW 1
+$020A $1303 BCF STATUS, RP1
+$020B $1283 BCF STATUS, RP0
+$020C $00DF MOVWF FARG_EEprom_write+0
+$020D $3004 MOVLW 4
+$020E $00E0 MOVWF FARG_EEprom_write+1
+$020F $2120 CALL _EEprom_write
+;openKeyboard.c,148 :: br = BAUDRATE_4800;
+$0210 $3004 MOVLW 4
+$0211 $1303 BCF STATUS, RP1
+$0212 $1283 BCF STATUS, RP0
+$0213 $00DE MOVWF FARG_setupUsart+0
+;openKeyboard.c,149 :: USART_Init(4800);
+$0214 $3033 MOVLW 51
+$0215 $1683 BSF STATUS, RP0
+$0216 $0099 MOVWF SPBRG
+$0217 $1518 BSF TXSTA, BRGH
+$0218 $2148 CALL _Usart_Init
+;openKeyboard.c,150 :: }
+$0219 $2A43 GOTO L_setupUsart_1
+$021A $ L_setupUsart_0:
+$021A $1303 BCF STATUS, RP1
+$021B $1283 BCF STATUS, RP0
+$021C $1303 BCF STATUS, RP1
+$021D $1283 BCF STATUS, RP0
+$021E $085E MOVF FARG_setupUsart+0, 0
+$021F $3A01 XORLW 1
+$0220 $1903 BTFSC STATUS, Z
+$0221 $29C8 GOTO L_setupUsart_2
+$0222 $085E MOVF FARG_setupUsart+0, 0
+$0223 $3A02 XORLW 2
+$0224 $1903 BTFSC STATUS, Z
+$0225 $29D1 GOTO L_setupUsart_3
+$0226 $085E MOVF FARG_setupUsart+0, 0
+$0227 $3A03 XORLW 3
+$0228 $1903 BTFSC STATUS, Z
+$0229 $29D8 GOTO L_setupUsart_4
+$022A $085E MOVF FARG_setupUsart+0, 0
+$022B $3A04 XORLW 4
+$022C $1903 BTFSC STATUS, Z
+$022D $29DF GOTO L_setupUsart_5
+$022E $085E MOVF FARG_setupUsart+0, 0
+$022F $3A05 XORLW 5
+$0230 $1903 BTFSC STATUS, Z
+$0231 $29E6 GOTO L_setupUsart_6
+$0232 $085E MOVF FARG_setupUsart+0, 0
+$0233 $3A06 XORLW 6
+$0234 $1903 BTFSC STATUS, Z
+$0235 $29ED GOTO L_setupUsart_7
+$0236 $085E MOVF FARG_setupUsart+0, 0
+$0237 $3A07 XORLW 7
+$0238 $1903 BTFSC STATUS, Z
+$0239 $29F4 GOTO L_setupUsart_8
+$023A $085E MOVF FARG_setupUsart+0, 0
+$023B $3A08 XORLW 8
+$023C $1903 BTFSC STATUS, Z
+$023D $29FB GOTO L_setupUsart_9
+$023E $085E MOVF FARG_setupUsart+0, 0
+$023F $3A09 XORLW 9
+$0240 $1903 BTFSC STATUS, Z
+$0241 $2A02 GOTO L_setupUsart_10
+$0242 $2A09 GOTO L_setupUsart_11
+$0243 $ L_setupUsart_1:
+;openKeyboard.c,151 :: baudrate = br;
+$0243 $1303 BCF STATUS, RP1
+$0244 $1283 BCF STATUS, RP0
+$0245 $085E MOVF FARG_setupUsart+0, 0
+$0246 $00AE MOVWF _baudrate
+;openKeyboard.c,152 :: }
+$0247 $0008 RETURN
+$0248 $ _setupSendMode:
+;openKeyboard.c,298 :: void setupSendMode(unsigned char sm){
+;openKeyboard.c,299 :: switch (sm){
+$0248 $2A71 GOTO L_setupSendMode_42
+;openKeyboard.c,300 :: case SENDMODE_SCAN : send = &scanSend;
+$0249 $ L_setupSendMode_44:
+$0249 $30C5 MOVLW #_scanSend
+$024A $1303 BCF STATUS, RP1
+$024B $1283 BCF STATUS, RP0
+$024C $00AF MOVWF _send
+$024D $3005 MOVLW @#_scanSend
+$024E $00B0 MOVWF _send+1
+$024F $3000 MOVLW 0
+$0250 $00B1 MOVWF _send+2
+$0251 $3000 MOVLW 0
+;openKeyboard.c,301 :: sendMode = SENDMODE_SCAN;
+$0252 $3001 MOVLW 1
+$0253 $00B2 MOVWF _sendMode
+;openKeyboard.c,302 :: break;
+$0254 $2A7E GOTO L_setupSendMode_43
+;openKeyboard.c,304 :: case SENDMODE_SERIAL: send = &serialSend;
+$0255 $ L_setupSendMode_45:
+$0255 $3038 MOVLW #_serialSend
+$0256 $1303 BCF STATUS, RP1
+$0257 $1283 BCF STATUS, RP0
+$0258 $00AF MOVWF _send
+$0259 $3006 MOVLW @#_serialSend
+$025A $00B0 MOVWF _send+1
+$025B $3000 MOVLW 0
+$025C $00B1 MOVWF _send+2
+$025D $3000 MOVLW 0
+;openKeyboard.c,305 :: sendMode = SENDMODE_SERIAL;
+$025E $01B2 CLRF _sendMode, 1
+;openKeyboard.c,306 :: break;
+$025F $2A7E GOTO L_setupSendMode_43
+;openKeyboard.c,312 :: default : send = &serialSend;
+$0260 $ L_setupSendMode_46:
+$0260 $3038 MOVLW #_serialSend
+$0261 $1303 BCF STATUS, RP1
+$0262 $1283 BCF STATUS, RP0
+$0263 $00AF MOVWF _send
+$0264 $3006 MOVLW @#_serialSend
+$0265 $00B0 MOVWF _send+1
+$0266 $3000 MOVLW 0
+$0267 $00B1 MOVWF _send+2
+$0268 $3000 MOVLW 0
+;openKeyboard.c,313 :: EEprom_write(CONFIG_SENDMODE, SENDMODE_SERIAL);
+$0269 $3002 MOVLW 2
+$026A $00DF MOVWF FARG_EEprom_write+0
+$026B $01E0 CLRF FARG_EEprom_write+1, 1
+$026C $2120 CALL _EEprom_write
+;openKeyboard.c,314 :: sendMode = SENDMODE_SERIAL;
+$026D $1303 BCF STATUS, RP1
+$026E $1283 BCF STATUS, RP0
+$026F $01B2 CLRF _sendMode, 1
+;openKeyboard.c,315 :: }
+$0270 $2A7E GOTO L_setupSendMode_43
+$0271 $ L_setupSendMode_42:
+$0271 $1303 BCF STATUS, RP1
+$0272 $1283 BCF STATUS, RP0
+$0273 $1303 BCF STATUS, RP1
+$0274 $1283 BCF STATUS, RP0
+$0275 $085E MOVF FARG_setupSendMode+0, 0
+$0276 $3A01 XORLW 1
+$0277 $1903 BTFSC STATUS, Z
+$0278 $2A49 GOTO L_setupSendMode_44
+$0279 $085E MOVF FARG_setupSendMode+0, 0
+$027A $3A00 XORLW 0
+$027B $1903 BTFSC STATUS, Z
+$027C $2A55 GOTO L_setupSendMode_45
+$027D $2A60 GOTO L_setupSendMode_46
+$027E $ L_setupSendMode_43:
+;openKeyboard.c,316 :: }
+$027E $0008 RETURN
+$027F $ _Delay_5ms:
+;delays.c,39 :: void Delay_5ms() {
+;delays.c,40 :: Delay_ms(5);
+$027F $3007 MOVLW 7
+$0280 $1303 BCF STATUS, RP1
+$0281 $1283 BCF STATUS, RP0
+$0282 $00FB MOVWF STACK_11
+$0283 $30FF MOVLW 255
+$0284 $00FA MOVWF STACK_10
+$0285 $0BFB DECFSZ STACK_11, F
+$0286 $2A88 GOTO $+2
+$0287 $2A8B GOTO $+4
+$0288 $0BFA DECFSZ STACK_10, F
+$0289 $2A88 GOTO $-1
+$028A $2A85 GOTO $-5
+$028B $3078 MOVLW 120
+$028C $00FA MOVWF STACK_10
+$028D $0BFA DECFSZ STACK_10, F
+$028E $2A8D GOTO $-1
+$028F $0000 NOP
+$0290 $0000 NOP
+;delays.c,41 :: }
+$0291 $0008 RETURN
+$0292 $ _enterPowerSave:
+;openKeyboard.c,115 :: void enterPowerSave(){
+;openKeyboard.c,116 :: PORTA = 0;
+$0292 $1303 BCF STATUS, RP1
+$0293 $1283 BCF STATUS, RP0
+$0294 $0185 CLRF PORTA, 1
+;openKeyboard.c,117 :: INTCON.RBIE = 1; // enables PORTB on-change interrupt
+$0295 $158B BSF INTCON, 3
+;openKeyboard.c,119 :: sleep;
+$0296 $0063 SLEEP
+;openKeyboard.c,121 :: }
+$0297 $0008 RETURN
+$0298 $ _Usart_Write:
+$0298 $ L_Usart_Write_3:
+$0298 $3000 MOVLW 0
+$0299 $1303 BCF STATUS, RP1
+$029A $1683 BSF STATUS, RP0
+$029B $1898 BTFSC TXSTA, 1
+$029C $3001 MOVLW 1
+$029D $00F1 MOVWF STACK_1
+$029E $0871 MOVF STACK_1, 0
+$029F $3A00 XORLW 0
+$02A0 $1D03 BTFSS STATUS, Z
+$02A1 $2AA4 GOTO L_Usart_Write_4
+$02A2 $0000 NOP
+$02A3 $2A98 GOTO L_Usart_Write_3
+$02A4 $ L_Usart_Write_4:
+$02A4 $1303 BCF STATUS, RP1
+$02A5 $1283 BCF STATUS, RP0
+$02A6 $085E MOVF FARG_Usart_Write+0, 0
+$02A7 $0099 MOVWF TXREG
+$02A8 $0008 RETURN
+$02A9 $ table___scanMap:
+;openKeyboard.c,39 :: const char scanMap[50] = { // i could output directly idx,
+$02A9 $3408 RETLW 8
+$02AA $3409 RETLW 9
+$02AB $340A RETLW 10
+$02AC $3428 RETLW 40
+$02AD $3414 RETLW 20
+$02AE $341E RETLW 30
+$02AF $342F RETLW 47
+$02B0 $3429 RETLW 41
+$02B1 $342A RETLW 42
+$02B2 $342B RETLW 43
+$02B3 $3427 RETLW 39
+$02B4 $342C RETLW 44
+$02B5 $3426 RETLW 38
+$02B6 $342D RETLW 45
+$02B7 $341F RETLW 31
+$02B8 $3420 RETLW 32
+$02B9 $3421 RETLW 33
+$02BA $3423 RETLW 35
+$02BB $3422 RETLW 34
+$02BC $3424 RETLW 36
+$02BD $3425 RETLW 37
+$02BE $3415 RETLW 21
+$02BF $3416 RETLW 22
+$02C0 $3417 RETLW 23
+$02C1 $3419 RETLW 25
+$02C2 $3418 RETLW 24
+$02C3 $341A RETLW 26
+$02C4 $341B RETLW 27
+$02C5 $340B RETLW 11
+$02C6 $340C RETLW 12
+$02C7 $340D RETLW 13
+$02C8 $340F RETLW 15
+$02C9 $340E RETLW 14
+$02CA $3410 RETLW 16
+$02CB $3411 RETLW 17
+$02CC $3401 RETLW 1
+$02CD $3402 RETLW 2
+$02CE $3403 RETLW 3
+$02CF $3405 RETLW 5
+$02D0 $3404 RETLW 4
+$02D1 $3406 RETLW 6
+$02D2 $3407 RETLW 7
+$02D3 $341C RETLW 28
+$02D4 $3412 RETLW 18
+$02D5 $3413 RETLW 19
+$02D6 $3400 RETLW 0
+$02D7 $3400 RETLW 0
+$02D8 $341D RETLW 29
+$02D9 $342E RETLW 46
+$02DA $3400 RETLW 0
+$02DB $0008 RETURN
+$02DC $ _____DoICP:
+$02DC $1303 BCF STATUS, RP1
+$02DD $1283 BCF STATUS, RP0
+$02DE $0834 MOVF ___DoICPHiAddr, 0
+$02DF $008A MOVWF PCLATH
+$02E0 $0835 MOVF ___DoICPLoAddr, 0
+$02E1 $0082 MOVWF PCL
+$02E2 $0008 RETURN
+$02E3 $ table___serialMap:
+;openKeyboard.c,48 :: const char serialMap[4][49] = { // CHARACTER MAPPING MATRIX for "pure serial mode"
+$02E3 $3438 RETLW 56
+$02E4 $3439 RETLW 57
+$02E5 $3430 RETLW 48
+$02E6 $340D RETLW 13
+$02E7 $3470 RETLW 112
+$02E8 $342C RETLW 44
+$02E9 $3400 RETLW 0
+$02EA $3400 RETLW 0
+$02EB $3400 RETLW 0
+$02EC $3400 RETLW 0
+$02ED $342E RETLW 46
+$02EE $3420 RETLW 32
+$02EF $346D RETLW 109
+$02F0 $3400 RETLW 0
+$02F1 $3400 RETLW 0
+$02F2 $347A RETLW 122
+$02F3 $3478 RETLW 120
+$02F4 $3476 RETLW 118
+$02F5 $3463 RETLW 99
+$02F6 $3462 RETLW 98
+$02F7 $346E RETLW 110
+$02F8 $3461 RETLW 97
+$02F9 $3473 RETLW 115
+$02FA $3464 RETLW 100
+$02FB $3467 RETLW 103
+$02FC $3466 RETLW 102
+$02FD $3468 RETLW 104
+$02FE $346A RETLW 106
+$02FF $3471 RETLW 113
+$0300 $3477 RETLW 119
+$0301 $3465 RETLW 101
+$0302 $3474 RETLW 116
+$0303 $3472 RETLW 114
+$0304 $3479 RETLW 121
+$0305 $3475 RETLW 117
+$0306 $3431 RETLW 49
+$0307 $3432 RETLW 50
+$0308 $3433 RETLW 51
+$0309 $3435 RETLW 53
+$030A $3434 RETLW 52
+$030B $3436 RETLW 54
+$030C $3437 RETLW 55
+$030D $346B RETLW 107
+$030E $3469 RETLW 105
+$030F $346F RETLW 111
+$0310 $3400 RETLW 0
+$0311 $3400 RETLW 0
+$0312 $346C RETLW 108
+$0313 $3408 RETLW 8
+$0314 $3438 RETLW 56
+$0315 $3439 RETLW 57
+$0316 $3430 RETLW 48
+$0317 $340D RETLW 13
+$0318 $3450 RETLW 80
+$0319 $342C RETLW 44
+$031A $3400 RETLW 0
+$031B $3400 RETLW 0
+$031C $3400 RETLW 0
+$031D $3400 RETLW 0
+$031E $342E RETLW 46
+$031F $3420 RETLW 32
+$0320 $344D RETLW 77
+$0321 $3400 RETLW 0
+$0322 $3400 RETLW 0
+$0323 $345A RETLW 90
+$0324 $3458 RETLW 88
+$0325 $3456 RETLW 86
+$0326 $3443 RETLW 67
+$0327 $3442 RETLW 66
+$0328 $344E RETLW 78
+$0329 $3441 RETLW 65
+$032A $3453 RETLW 83
+$032B $3444 RETLW 68
+$032C $3447 RETLW 71
+$032D $3446 RETLW 70
+$032E $3448 RETLW 72
+$032F $344A RETLW 74
+$0330 $3451 RETLW 81
+$0331 $3457 RETLW 87
+$0332 $3445 RETLW 69
+$0333 $3454 RETLW 84
+$0334 $3452 RETLW 82
+$0335 $3459 RETLW 89
+$0336 $3455 RETLW 85
+$0337 $3431 RETLW 49
+$0338 $3432 RETLW 50
+$0339 $3433 RETLW 51
+$033A $3435 RETLW 53
+$033B $3434 RETLW 52
+$033C $3436 RETLW 54
+$033D $3437 RETLW 55
+$033E $344B RETLW 75
+$033F $3449 RETLW 73
+$0340 $344F RETLW 79
+$0341 $3400 RETLW 0
+$0342 $3400 RETLW 0
+$0343 $344C RETLW 76
+$0344 $3408 RETLW 8
+$0345 $3438 RETLW 56
+$0346 $3439 RETLW 57
+$0347 $3430 RETLW 48
+$0348 $340D RETLW 13
+$0349 $3429 RETLW 41
+$034A $343A RETLW 58
+$034B $3400 RETLW 0
+$034C $3400 RETLW 0
+$034D $3400 RETLW 0
+$034E $3400 RETLW 0
+$034F $343F RETLW 63
+$0350 $3420 RETLW 32
+$0351 $343E RETLW 62
+$0352 $3400 RETLW 0
+$0353 $3400 RETLW 0
+$0354 $3460 RETLW 96
+$0355 $3427 RETLW 39
+$0356 $342D RETLW 45
+$0357 $34BB RETLW 187
+$0358 $347C RETLW 124
+$0359 $343C RETLW 60
+$035A $347E RETLW 126
+$035B $349A RETLW 154
+$035C $347B RETLW 123
+$035D $34A8 RETLW 168
+$035E $347D RETLW 125
+$035F $342F RETLW 47
+$0360 $3427 RETLW 39
+$0361 $3421 RETLW 33
+$0362 $3440 RETLW 64
+$0363 $3480 RETLW 128
+$0364 $3425 RETLW 37
+$0365 $3423 RETLW 35
+$0366 $345E RETLW 94
+$0367 $3426 RETLW 38
+$0368 $3431 RETLW 49
+$0369 $3432 RETLW 50
+$036A $3433 RETLW 51
+$036B $3435 RETLW 53
+$036C $3434 RETLW 52
+$036D $3436 RETLW 54
+$036E $3437 RETLW 55
+$036F $345B RETLW 91
+$0370 $342A RETLW 42
+$0371 $3428 RETLW 40
+$0372 $3400 RETLW 0
+$0373 $3400 RETLW 0
+$0374 $345D RETLW 93
+$0375 $3408 RETLW 8
+$0376 $3438 RETLW 56
+$0377 $3439 RETLW 57
+$0378 $3430 RETLW 48
+$0379 $340D RETLW 13
+$037A $343D RETLW 61
+$037B $343B RETLW 59
+$037C $3400 RETLW 0
+$037D $3400 RETLW 0
+$037E $3400 RETLW 0
+$037F $3400 RETLW 0
+$0380 $34BF RETLW 191
+$0381 $3420 RETLW 32
+$0382 $34B5 RETLW 181
+$0383 $3400 RETLW 0
+$0384 $3400 RETLW 0
+$0385 $34E6 RETLW 230
+$0386 $349C RETLW 156
+$0387 $345F RETLW 95
+$0388 $34E7 RETLW 231
+$0389 $342B RETLW 43
+$038A $34F1 RETLW 241
+$038B $34E1 RETLW 225
+$038C $34DF RETLW 223
+$038D $34F0 RETLW 240
+$038E $34A5 RETLW 165
+$038F $34A3 RETLW 163
+$0390 $345C RETLW 92
+$0391 $3422 RETLW 34
+$0392 $34A1 RETLW 161
+$0393 $34E5 RETLW 229
+$0394 $34E8 RETLW 232
+$0395 $34FE RETLW 254
+$0396 $3424 RETLW 36
+$0397 $34FD RETLW 253
+$0398 $34F9 RETLW 249
+$0399 $3431 RETLW 49
+$039A $3432 RETLW 50
+$039B $3433 RETLW 51
+$039C $3435 RETLW 53
+$039D $3434 RETLW 52
+$039E $3436 RETLW 54
+$039F $3437 RETLW 55
+$03A0 $34A9 RETLW 169
+$03A1 $34EC RETLW 236
+$03A2 $34F2 RETLW 242
+$03A3 $3400 RETLW 0
+$03A4 $3400 RETLW 0
+$03A5 $34F8 RETLW 248
+$03A6 $3408 RETLW 8
+$03A7 $0008 RETURN
+$03A8 $ _Mul_16x16_U:
+$03A8 $1303 BCF STATUS, RP1
+$03A9 $1283 BCF STATUS, RP0
+$03AA $01FB CLRF STACK_11
+$03AB $01FA CLRF STACK_10
+$03AC $01F9 CLRF STACK_9
+$03AD $3080 MOVLW 128
+$03AE $00F8 MOVWF STACK_8
+$03AF $0CF1 RRF STACK_1, F
+$03B0 $0CF0 RRF STACK_0, F
+$03B1 $1C03 BTFSS STATUS, C
+$03B2 $2BBC GOTO $+10
+$03B3 $0874 MOVF STACK_4, W
+$03B4 $07F9 ADDWF STACK_9, F
+$03B5 $0875 MOVF STACK_5, W
+$03B6 $1803 BTFSC STATUS, C
+$03B7 $0F75 INCFSZ STACK_5, W
+$03B8 $07FA ADDWF STACK_10, F
+$03B9 $1803 BTFSC STATUS, C
+$03BA $0AFB INCF STACK_11, F
+$03BB $1003 BCF STATUS, C
+$03BC $1FF0 BTFSS STACK_0, 7
+$03BD $2BC4 GOTO $+7
+$03BE $0874 MOVF STACK_4, W
+$03BF $07FA ADDWF STACK_10, F
+$03C0 $0875 MOVF STACK_5, W
+$03C1 $1803 BTFSC STATUS, C
+$03C2 $0F75 INCFSZ STACK_5, W
+$03C3 $07FB ADDWF STACK_11, F
+$03C4 $0CFB RRF STACK_11, F
+$03C5 $0CFA RRF STACK_10, F
+$03C6 $0CF9 RRF STACK_9, F
+$03C7 $0CF8 RRF STACK_8, F
+$03C8 $1C03 BTFSS STATUS, C
+$03C9 $2BAF GOTO $-26
+$03CA $087B MOVF STACK_11, W
+$03CB $00F3 MOVWF STACK_3
+$03CC $087A MOVF STACK_10, W
+$03CD $00F2 MOVWF STACK_2
+$03CE $0879 MOVF STACK_9, W
+$03CF $00F1 MOVWF STACK_1
+$03D0 $0878 MOVF STACK_8, W
+$03D1 $00F0 MOVWF STACK_0
+$03D2 $0008 RETURN
+$03D3 $ _EEprom_read:
+$03D3 $1303 BCF STATUS, RP1
+$03D4 $1283 BCF STATUS, RP0
+$03D5 $085B MOVF FARG_EEprom_read+0, 0
+$03D6 $1703 BSF STATUS, RP1
+$03D7 $008D MOVWF EEADR
+$03D8 $1683 BSF STATUS, RP0
+$03D9 $138C BCF EECON1, 7
+$03DA $140C BSF EECON1, 0
+$03DB $1283 BCF STATUS, RP0
+$03DC $080C MOVF EEDATA, 0
+$03DD $00F0 MOVWF STACK_0
+$03DE $0008 RETURN
+$03DF $ _doScan:
+;openKeyboard.c,238 :: void doScan(){
+;openKeyboard.c,239 :: unsigned char sc = 0;
+$03DF $1303 BCF STATUS, RP1
+$03E0 $1283 BCF STATUS, RP0
+$03E1 $01DB CLRF doScan_sc_L0, 1
+;openKeyboard.c,241 :: newlyPressd = 0;
+$03E2 $01B6 CLRF _newlyPressd, 1
+;openKeyboard.c,243 :: for (AMask=1; AMask<128; AMask<<=1){
+$03E3 $3001 MOVLW 1
+$03E4 $00B7 MOVWF _AMask
+$03E5 $ L_doScan_25:
+$03E5 $3080 MOVLW 128
+$03E6 $1303 BCF STATUS, RP1
+$03E7 $1283 BCF STATUS, RP0
+$03E8 $0237 SUBWF _AMask, 0
+$03E9 $1803 BTFSC STATUS, C
+$03EA $2C47 GOTO L_doScan_26
+;openKeyboard.c,245 :: oldData[sc] = data[sc]; // save old data
+$03EB $085B MOVF doScan_sc_L0, 0
+$03EC $3F38 ADDLW _oldData
+$03ED $00F1 MOVWF STACK_1
+$03EE $085B MOVF doScan_sc_L0, 0
+$03EF $3F3F ADDLW _data
+$03F0 $0084 MOVWF FSR
+$03F1 $0800 MOVF INDF, 0
+$03F2 $00F0 MOVWF STACK_0
+$03F3 $0871 MOVF STACK_1, 0
+$03F4 $0084 MOVWF FSR
+$03F5 $0870 MOVF STACK_0, 0
+$03F6 $0080 MOVWF INDF
+;openKeyboard.c,247 :: PORTA = ~AMask; // put a 0 on the line we want to inspect
+$03F7 $0937 COMF _AMask, W
+$03F8 $0085 MOVWF PORTA
+;openKeyboard.c,248 :: data[sc] = PORTB; // read PORTB (pulled up)...if a line goes to 0, bingo!
+$03F9 $085B MOVF doScan_sc_L0, 0
+$03FA $3F3F ADDLW _data
+$03FB $00F0 MOVWF STACK_0
+$03FC $0870 MOVF STACK_0, 0
+$03FD $0084 MOVWF FSR
+$03FE $0806 MOVF PORTB, 0
+$03FF $0080 MOVWF INDF
+;openKeyboard.c,249 :: data[sc] = data[sc] | PORTB; // antibounce
+$0400 $085B MOVF doScan_sc_L0, 0
+$0401 $3F3F ADDLW _data
+$0402 $00F1 MOVWF STACK_1
+$0403 $0871 MOVF STACK_1, 0
+$0404 $0084 MOVWF FSR
+$0405 $0800 MOVF INDF, 0
+$0406 $00F0 MOVWF STACK_0
+$0407 $0806 MOVF PORTB, 0
+$0408 $04F0 IORWF STACK_0, 1
+$0409 $0871 MOVF STACK_1, 0
+$040A $0084 MOVWF FSR
+$040B $0870 MOVF STACK_0, 0
+$040C $0080 MOVWF INDF
+;openKeyboard.c,250 :: data[sc] = data[sc] | PORTB; // antibounce
+$040D $085B MOVF doScan_sc_L0, 0
+$040E $3F3F ADDLW _data
+$040F $00F1 MOVWF STACK_1
+$0410 $0871 MOVF STACK_1, 0
+$0411 $0084 MOVWF FSR
+$0412 $0800 MOVF INDF, 0
+$0413 $00F0 MOVWF STACK_0
+$0414 $0806 MOVF PORTB, 0
+$0415 $04F0 IORWF STACK_0, 1
+$0416 $0871 MOVF STACK_1, 0
+$0417 $0084 MOVWF FSR
+$0418 $0870 MOVF STACK_0, 0
+$0419 $0080 MOVWF INDF
+;openKeyboard.c,251 :: data[sc] = ~data[sc]; // return to positive logic
+$041A $085B MOVF doScan_sc_L0, 0
+$041B $3F3F ADDLW _data
+$041C $00F1 MOVWF STACK_1
+$041D $0871 MOVF STACK_1, 0
+$041E $0084 MOVWF FSR
+$041F $0800 MOVF INDF, 0
+$0420 $00F0 MOVWF STACK_0
+$0421 $09F0 COMF STACK_0, F
+$0422 $0871 MOVF STACK_1, 0
+$0423 $0084 MOVWF FSR
+$0424 $0870 MOVF STACK_0, 0
+$0425 $0080 MOVWF INDF
+;openKeyboard.c,253 :: justPressed[sc] = data[sc]&(~oldData[sc]);
+$0426 $085B MOVF doScan_sc_L0, 0
+$0427 $3F46 ADDLW _justPressed
+$0428 $00F2 MOVWF STACK_2
+$0429 $085B MOVF doScan_sc_L0, 0
+$042A $3F3F ADDLW _data
+$042B $0084 MOVWF FSR
+$042C $0800 MOVF INDF, 0
+$042D $00F1 MOVWF STACK_1
+$042E $085B MOVF doScan_sc_L0, 0
+$042F $3F38 ADDLW _oldData
+$0430 $0084 MOVWF FSR
+$0431 $0800 MOVF INDF, 0
+$0432 $00F0 MOVWF STACK_0
+$0433 $09F0 COMF STACK_0, F
+$0434 $0871 MOVF STACK_1, 0
+$0435 $05F0 ANDWF STACK_0, 1
+$0436 $0872 MOVF STACK_2, 0
+$0437 $0084 MOVWF FSR
+$0438 $0870 MOVF STACK_0, 0
+$0439 $0080 MOVWF INDF
+;openKeyboard.c,255 :: newlyPressd = newlyPressd | justPressed[sc];
+$043A $085B MOVF doScan_sc_L0, 0
+$043B $3F46 ADDLW _justPressed
+$043C $0084 MOVWF FSR
+$043D $0800 MOVF INDF, 0
+$043E $00F0 MOVWF STACK_0
+$043F $0870 MOVF STACK_0, 0
+$0440 $04B6 IORWF _newlyPressd, 1
+;openKeyboard.c,257 :: sc++;
+$0441 $0ADB INCF doScan_sc_L0, 1
+;openKeyboard.c,258 :: }
+$0442 $ L_doScan_27:
+;openKeyboard.c,243 :: for (AMask=1; AMask<128; AMask<<=1){
+$0442 $1303 BCF STATUS, RP1
+$0443 $1283 BCF STATUS, RP0
+$0444 $0DB7 RLF _AMask, 1
+$0445 $1037 BCF _AMask, 0
+;openKeyboard.c,258 :: }
+$0446 $2BE5 GOTO L_doScan_25
+$0447 $ L_doScan_26:
+;openKeyboard.c,259 :: }
+$0447 $0008 RETURN
+$0448 $ _config:
+;openKeyboard.c,318 :: void config(){
+;openKeyboard.c,319 :: timer = lightFadeOffTime;
+$0448 $1303 BCF STATUS, RP1
+$0449 $1283 BCF STATUS, RP0
+$044A $0824 MOVF _lightFadeOffTime, 0
+$044B $00A0 MOVWF _timer
+$044C $0825 MOVF _lightFadeOffTime+1, 0
+$044D $00A1 MOVWF _timer+1
+$044E $0826 MOVF _lightFadeOffTime+2, 0
+$044F $00A2 MOVWF _timer+2
+$0450 $0827 MOVF _lightFadeOffTime+3, 0
+$0451 $00A3 MOVWF _timer+3
+;openKeyboard.c,321 :: if ((data[1]&4)&&(lightStrenght<0xff)) { // <
+$0452 $1D40 BTFSS _data+1, 2
+$0453 $2C67 GOTO L_config_49
+$0454 $30FF MOVLW 255
+$0455 $0229 SUBWF _lightStrenght, 0
+$0456 $1803 BTFSC STATUS, C
+$0457 $2C67 GOTO L_config_49
+$0458 $ L352_ex_L_config_49:
+;openKeyboard.c,322 :: lightStrenght++;
+$0458 $1303 BCF STATUS, RP1
+$0459 $1283 BCF STATUS, RP0
+$045A $0AA9 INCF _lightStrenght, 1
+;openKeyboard.c,323 :: PWM1_Change_Duty(lightStrenght);
+$045B $0829 MOVF _lightStrenght, 0
+$045C $00E4 MOVWF FARG_PWM1_Change_Duty+0
+$045D $207C CALL _PWM1_Change_Duty
+;openKeyboard.c,324 :: PWM2_Change_Duty(lightStrenght);
+$045E $0829 MOVF _lightStrenght, 0
+$045F $00E4 MOVWF FARG_PWM2_Change_Duty+0
+$0460 $20B9 CALL _PWM2_Change_Duty
+;openKeyboard.c,325 :: if (lightMode==LIGHTMODE_ALWAYSOFF) lightMode = LIGHTMODE_FADE;
+$0461 $082D MOVF _lightMode, 0
+$0462 $3A00 XORLW 0
+$0463 $1D03 BTFSS STATUS, Z
+$0464 $2C67 GOTO L_config_50
+$0465 $3002 MOVLW 2
+$0466 $00AD MOVWF _lightMode
+$0467 $ L_config_50:
+;openKeyboard.c,326 :: } // decrease light strenght
+$0467 $ L_config_49:
+;openKeyboard.c,328 :: if ((data[1]&64)&&(lightStrenght>0)) { // >
+$0467 $1303 BCF STATUS, RP1
+$0468 $1283 BCF STATUS, RP0
+$0469 $1F40 BTFSS _data+1, 6
+$046A $2C7E GOTO L_config_53
+$046B $0829 MOVF _lightStrenght, 0
+$046C $3C00 SUBLW 0
+$046D $1803 BTFSC STATUS, C
+$046E $2C7E GOTO L_config_53
+$046F $ L374_ex_L_config_53:
+;openKeyboard.c,329 :: lightStrenght--;
+$046F $1303 BCF STATUS, RP1
+$0470 $1283 BCF STATUS, RP0
+$0471 $03A9 DECF _lightStrenght, 1
+;openKeyboard.c,330 :: PWM1_Change_Duty(lightStrenght);
+$0472 $0829 MOVF _lightStrenght, 0
+$0473 $00E4 MOVWF FARG_PWM1_Change_Duty+0
+$0474 $207C CALL _PWM1_Change_Duty
+;openKeyboard.c,331 :: PWM2_Change_Duty(lightStrenght);
+$0475 $0829 MOVF _lightStrenght, 0
+$0476 $00E4 MOVWF FARG_PWM2_Change_Duty+0
+$0477 $20B9 CALL _PWM2_Change_Duty
+;openKeyboard.c,332 :: if (lightMode==LIGHTMODE_ALWAYSOFF) lightMode = LIGHTMODE_FADE;
+$0478 $082D MOVF _lightMode, 0
+$0479 $3A00 XORLW 0
+$047A $1D03 BTFSS STATUS, Z
+$047B $2C7E GOTO L_config_54
+$047C $3002 MOVLW 2
+$047D $00AD MOVWF _lightMode
+$047E $ L_config_54:
+;openKeyboard.c,333 :: } // increase light strenght
+$047E $ L_config_53:
+;openKeyboard.c,336 :: if (justPressed[5]&1){ // 1
+$047E $3001 MOVLW 1
+$047F $1303 BCF STATUS, RP1
+$0480 $1283 BCF STATUS, RP0
+$0481 $054B ANDWF _justPressed+5, 0
+$0482 $00F0 MOVWF STACK_0
+$0483 $1903 BTFSC STATUS, Z
+$0484 $2C8E GOTO L_config_55
+;openKeyboard.c,340 :: setupLightMode(LIGHTMODE_FADE);
+$0485 $3002 MOVLW 2
+$0486 $00DE MOVWF FARG_setupLightMode+0
+$0487 $2159 CALL _setupLightMode
+;openKeyboard.c,341 :: lightFadeOffTime = 2<<8;
+$0488 $3000 MOVLW 0
+$0489 $00A4 MOVWF _lightFadeOffTime
+$048A $3002 MOVLW 2
+$048B $00A5 MOVWF _lightFadeOffTime+1
+$048C $01A6 CLRF _lightFadeOffTime+2
+$048D $01A7 CLRF _lightFadeOffTime+3
+;openKeyboard.c,343 :: }
+$048E $ L_config_55:
+;openKeyboard.c,345 :: if (justPressed[5]&2){ // 2
+$048E $1303 BCF STATUS, RP1
+$048F $1283 BCF STATUS, RP0
+$0490 $1CCB BTFSS _justPressed+5, 1
+$0491 $2CA2 GOTO L_config_56
+;openKeyboard.c,346 :: if (data[1]&1)
+$0492 $3001 MOVLW 1
+$0493 $0540 ANDWF _data+1, 0
+$0494 $00F0 MOVWF STACK_0
+$0495 $1D03 BTFSS STATUS, Z
+$0496 $2CA2 GOTO L_config_58
+;openKeyboard.c,347 :: ;//setupUsart(BAUDRATE_300); //all setupUsart commented out are to save code words space...otherwise i'm running into demo limit
+$0497 $ L_config_57:
+;openKeyboard.c,349 :: setupLightMode(LIGHTMODE_FADE);
+$0497 $3002 MOVLW 2
+$0498 $1303 BCF STATUS, RP1
+$0499 $1283 BCF STATUS, RP0
+$049A $00DE MOVWF FARG_setupLightMode+0
+$049B $2159 CALL _setupLightMode
+;openKeyboard.c,350 :: lightFadeOffTime = 4<<8; // more or less 5 sec
+$049C $3000 MOVLW 0
+$049D $00A4 MOVWF _lightFadeOffTime
+$049E $3004 MOVLW 4
+$049F $00A5 MOVWF _lightFadeOffTime+1
+$04A0 $01A6 CLRF _lightFadeOffTime+2
+$04A1 $01A7 CLRF _lightFadeOffTime+3
+;openKeyboard.c,351 :: }
+$04A2 $ L_config_58:
+;openKeyboard.c,352 :: }
+$04A2 $ L_config_56:
+;openKeyboard.c,354 :: if (justPressed[5]&4){ // 3
+$04A2 $1303 BCF STATUS, RP1
+$04A3 $1283 BCF STATUS, RP0
+$04A4 $1D4B BTFSS _justPressed+5, 2
+$04A5 $2CB6 GOTO L_config_59
+;openKeyboard.c,355 :: if (data[1]&1)
+$04A6 $3001 MOVLW 1
+$04A7 $0540 ANDWF _data+1, 0
+$04A8 $00F0 MOVWF STACK_0
+$04A9 $1D03 BTFSS STATUS, Z
+$04AA $2CB6 GOTO L_config_61
+;openKeyboard.c,356 :: ;//setupUsart(BAUDRATE_1200);
+$04AB $ L_config_60:
+;openKeyboard.c,358 :: setupLightMode(LIGHTMODE_FADE);
+$04AB $3002 MOVLW 2
+$04AC $1303 BCF STATUS, RP1
+$04AD $1283 BCF STATUS, RP0
+$04AE $00DE MOVWF FARG_setupLightMode+0
+$04AF $2159 CALL _setupLightMode
+;openKeyboard.c,359 :: lightFadeOffTime = 8<<8;
+$04B0 $3000 MOVLW 0
+$04B1 $00A4 MOVWF _lightFadeOffTime
+$04B2 $3008 MOVLW 8
+$04B3 $00A5 MOVWF _lightFadeOffTime+1
+$04B4 $01A6 CLRF _lightFadeOffTime+2
+$04B5 $01A7 CLRF _lightFadeOffTime+3
+;openKeyboard.c,360 :: }
+$04B6 $ L_config_61:
+;openKeyboard.c,361 :: }
+$04B6 $ L_config_59:
+;openKeyboard.c,363 :: if (justPressed[5]&16){ // 4
+$04B6 $1303 BCF STATUS, RP1
+$04B7 $1283 BCF STATUS, RP0
+$04B8 $1E4B BTFSS _justPressed+5, 4
+$04B9 $2CCA GOTO L_config_62
+;openKeyboard.c,364 :: if (data[1]&1)
+$04BA $3001 MOVLW 1
+$04BB $0540 ANDWF _data+1, 0
+$04BC $00F0 MOVWF STACK_0
+$04BD $1D03 BTFSS STATUS, Z
+$04BE $2CCA GOTO L_config_64
+;openKeyboard.c,365 :: ;//setupUsart(BAUDRATE_2400);
+$04BF $ L_config_63:
+;openKeyboard.c,367 :: setupLightMode(LIGHTMODE_FADE);
+$04BF $3002 MOVLW 2
+$04C0 $1303 BCF STATUS, RP1
+$04C1 $1283 BCF STATUS, RP0
+$04C2 $00DE MOVWF FARG_setupLightMode+0
+$04C3 $2159 CALL _setupLightMode
+;openKeyboard.c,368 :: lightFadeOffTime = 16<<8;
+$04C4 $3000 MOVLW 0
+$04C5 $00A4 MOVWF _lightFadeOffTime
+$04C6 $3010 MOVLW 16
+$04C7 $00A5 MOVWF _lightFadeOffTime+1
+$04C8 $01A6 CLRF _lightFadeOffTime+2
+$04C9 $01A7 CLRF _lightFadeOffTime+3
+;openKeyboard.c,369 :: }
+$04CA $ L_config_64:
+;openKeyboard.c,370 :: }
+$04CA $ L_config_62:
+;openKeyboard.c,372 :: if (justPressed[5]&8){ // 5
+$04CA $1303 BCF STATUS, RP1
+$04CB $1283 BCF STATUS, RP0
+$04CC $1DCB BTFSS _justPressed+5, 3
+$04CD $2CE2 GOTO L_config_65
+;openKeyboard.c,373 :: if (data[1]&1)
+$04CE $3001 MOVLW 1
+$04CF $0540 ANDWF _data+1, 0
+$04D0 $00F0 MOVWF STACK_0
+$04D1 $1903 BTFSC STATUS, Z
+$04D2 $2CD7 GOTO L_config_66
+;openKeyboard.c,374 :: setupUsart(BAUDRATE_4800);
+$04D3 $3004 MOVLW 4
+$04D4 $00DE MOVWF FARG_setupUsart+0
+$04D5 $21C7 CALL _setupUsart
+$04D6 $2CE2 GOTO L_config_67
+$04D7 $ L_config_66:
+;openKeyboard.c,376 :: setupLightMode(LIGHTMODE_FADE);
+$04D7 $3002 MOVLW 2
+$04D8 $1303 BCF STATUS, RP1
+$04D9 $1283 BCF STATUS, RP0
+$04DA $00DE MOVWF FARG_setupLightMode+0
+$04DB $2159 CALL _setupLightMode
+;openKeyboard.c,377 :: lightFadeOffTime = 32<<8;
+$04DC $3000 MOVLW 0
+$04DD $00A4 MOVWF _lightFadeOffTime
+$04DE $3020 MOVLW 32
+$04DF $00A5 MOVWF _lightFadeOffTime+1
+$04E0 $01A6 CLRF _lightFadeOffTime+2
+$04E1 $01A7 CLRF _lightFadeOffTime+3
+;openKeyboard.c,378 :: }
+$04E2 $ L_config_67:
+;openKeyboard.c,379 :: }
+$04E2 $ L_config_65:
+;openKeyboard.c,381 :: if (justPressed[5]&32){ // 6
+$04E2 $1303 BCF STATUS, RP1
+$04E3 $1283 BCF STATUS, RP0
+$04E4 $1ECB BTFSS _justPressed+5, 5
+$04E5 $2CFA GOTO L_config_68
+;openKeyboard.c,382 :: if (data[1]&1)
+$04E6 $3001 MOVLW 1
+$04E7 $0540 ANDWF _data+1, 0
+$04E8 $00F0 MOVWF STACK_0
+$04E9 $1903 BTFSC STATUS, Z
+$04EA $2CEF GOTO L_config_69
+;openKeyboard.c,383 :: setupUsart(BAUDRATE_9600);
+$04EB $3005 MOVLW 5
+$04EC $00DE MOVWF FARG_setupUsart+0
+$04ED $21C7 CALL _setupUsart
+$04EE $2CFA GOTO L_config_70
+$04EF $ L_config_69:
+;openKeyboard.c,385 :: setupLightMode(LIGHTMODE_FADE);
+$04EF $3002 MOVLW 2
+$04F0 $1303 BCF STATUS, RP1
+$04F1 $1283 BCF STATUS, RP0
+$04F2 $00DE MOVWF FARG_setupLightMode+0
+$04F3 $2159 CALL _setupLightMode
+;openKeyboard.c,386 :: lightFadeOffTime = 64<<8;
+$04F4 $3000 MOVLW 0
+$04F5 $00A4 MOVWF _lightFadeOffTime
+$04F6 $3040 MOVLW 64
+$04F7 $00A5 MOVWF _lightFadeOffTime+1
+$04F8 $01A6 CLRF _lightFadeOffTime+2
+$04F9 $01A7 CLRF _lightFadeOffTime+3
+;openKeyboard.c,387 :: }
+$04FA $ L_config_70:
+;openKeyboard.c,388 :: }
+$04FA $ L_config_68:
+;openKeyboard.c,390 :: if (justPressed[5]&64){ // 7
+$04FA $1303 BCF STATUS, RP1
+$04FB $1283 BCF STATUS, RP0
+$04FC $1F4B BTFSS _justPressed+5, 6
+$04FD $2D0E GOTO L_config_71
+;openKeyboard.c,391 :: if (data[1]&1)
+$04FE $3001 MOVLW 1
+$04FF $0540 ANDWF _data+1, 0
+$0500 $00F0 MOVWF STACK_0
+$0501 $1D03 BTFSS STATUS, Z
+$0502 $2D0E GOTO L_config_73
+;openKeyboard.c,392 :: ;//setupUsart(BAUDRATE_19200);
+$0503 $ L_config_72:
+;openKeyboard.c,394 :: setupLightMode(LIGHTMODE_FADE);
+$0503 $3002 MOVLW 2
+$0504 $1303 BCF STATUS, RP1
+$0505 $1283 BCF STATUS, RP0
+$0506 $00DE MOVWF FARG_setupLightMode+0
+$0507 $2159 CALL _setupLightMode
+;openKeyboard.c,395 :: lightFadeOffTime = 128<<8;
+$0508 $3000 MOVLW 0
+$0509 $00A4 MOVWF _lightFadeOffTime
+$050A $3080 MOVLW 128
+$050B $00A5 MOVWF _lightFadeOffTime+1
+$050C $01A6 CLRF _lightFadeOffTime+2
+$050D $01A7 CLRF _lightFadeOffTime+3
+;openKeyboard.c,396 :: }
+$050E $ L_config_73:
+;openKeyboard.c,397 :: }
+$050E $ L_config_71:
+;openKeyboard.c,399 :: if (justPressed[0]&1){ // 8
+$050E $3001 MOVLW 1
+$050F $1303 BCF STATUS, RP1
+$0510 $1283 BCF STATUS, RP0
+$0511 $0546 ANDWF _justPressed, 0
+$0512 $00F0 MOVWF STACK_0
+$0513 $1903 BTFSC STATUS, Z
+$0514 $2D25 GOTO L_config_74
+;openKeyboard.c,400 :: if (data[1]&1)
+$0515 $3001 MOVLW 1
+$0516 $0540 ANDWF _data+1, 0
+$0517 $00F0 MOVWF STACK_0
+$0518 $1D03 BTFSS STATUS, Z
+$0519 $2D25 GOTO L_config_76
+;openKeyboard.c,401 :: ;//setupUsart(BAUDRATE_38400);
+$051A $ L_config_75:
+;openKeyboard.c,403 :: setupLightMode(LIGHTMODE_FADE);
+$051A $3002 MOVLW 2
+$051B $1303 BCF STATUS, RP1
+$051C $1283 BCF STATUS, RP0
+$051D $00DE MOVWF FARG_setupLightMode+0
+$051E $2159 CALL _setupLightMode
+;openKeyboard.c,404 :: lightFadeOffTime = 255<<8;
+$051F $3000 MOVLW 0
+$0520 $00A4 MOVWF _lightFadeOffTime
+$0521 $30FF MOVLW 255
+$0522 $00A5 MOVWF _lightFadeOffTime+1
+$0523 $01A6 CLRF _lightFadeOffTime+2
+$0524 $01A7 CLRF _lightFadeOffTime+3
+;openKeyboard.c,405 :: }
+$0525 $ L_config_76:
+;openKeyboard.c,406 :: }
+$0525 $ L_config_74:
+;openKeyboard.c,408 :: if (justPressed[0]&2){ // 9
+$0525 $1303 BCF STATUS, RP1
+$0526 $1283 BCF STATUS, RP0
+$0527 $1CC6 BTFSS _justPressed, 1
+$0528 $2D33 GOTO L_config_77
+;openKeyboard.c,409 :: if (data[1]&1)
+$0529 $3001 MOVLW 1
+$052A $0540 ANDWF _data+1, 0
+$052B $00F0 MOVWF STACK_0
+$052C $1D03 BTFSS STATUS, Z
+$052D $2D33 GOTO L_config_79
+;openKeyboard.c,410 :: ;//setupUsart(BAUDRATE_57600);
+$052E $ L_config_78:
+;openKeyboard.c,412 :: setupLightMode(LIGHTMODE_ALWAYSON);
+$052E $3001 MOVLW 1
+$052F $1303 BCF STATUS, RP1
+$0530 $1283 BCF STATUS, RP0
+$0531 $00DE MOVWF FARG_setupLightMode+0
+$0532 $2159 CALL _setupLightMode
+$0533 $ L_config_79:
+;openKeyboard.c,413 :: }
+$0533 $ L_config_77:
+;openKeyboard.c,415 :: if (justPressed[0]&4){ // 0
+$0533 $1303 BCF STATUS, RP1
+$0534 $1283 BCF STATUS, RP0
+$0535 $1D46 BTFSS _justPressed, 2
+$0536 $2D40 GOTO L_config_80
+;openKeyboard.c,416 :: if (data[1]&1)
+$0537 $3001 MOVLW 1
+$0538 $0540 ANDWF _data+1, 0
+$0539 $00F0 MOVWF STACK_0
+$053A $1D03 BTFSS STATUS, Z
+$053B $2D40 GOTO L_config_82
+;openKeyboard.c,417 :: ;//setupUsart(BAUDRATE_115200);
+$053C $ L_config_81:
+;openKeyboard.c,419 :: setupLightMode(LIGHTMODE_ALWAYSOFF);
+$053C $1303 BCF STATUS, RP1
+$053D $1283 BCF STATUS, RP0
+$053E $01DE CLRF FARG_setupLightMode+0, 1
+$053F $2159 CALL _setupLightMode
+$0540 $ L_config_82:
+;openKeyboard.c,420 :: }
+$0540 $ L_config_80:
+;openKeyboard.c,422 :: if (justPressed[3]&1){ // A
+$0540 $3001 MOVLW 1
+$0541 $1303 BCF STATUS, RP1
+$0542 $1283 BCF STATUS, RP0
+$0543 $0549 ANDWF _justPressed+3, 0
+$0544 $00F0 MOVWF STACK_0
+$0545 $1903 BTFSC STATUS, Z
+$0546 $2D4A GOTO L_config_83
+;openKeyboard.c,423 :: setupSendMode(SENDMODE_SCAN);
+$0547 $3001 MOVLW 1
+$0548 $00DE MOVWF FARG_setupSendMode+0
+$0549 $2248 CALL _setupSendMode
+;openKeyboard.c,424 :: }
+$054A $ L_config_83:
+;openKeyboard.c,426 :: if (justPressed[3]&2){ // S
+$054A $1303 BCF STATUS, RP1
+$054B $1283 BCF STATUS, RP0
+$054C $1CC9 BTFSS _justPressed+3, 1
+$054D $2D50 GOTO L_config_84
+;openKeyboard.c,427 :: setupSendMode(SENDMODE_SERIAL);
+$054E $01DE CLRF FARG_setupSendMode+0, 1
+$054F $2248 CALL _setupSendMode
+;openKeyboard.c,428 :: }
+$0550 $ L_config_84:
+;openKeyboard.c,430 :: Delay_5ms();
+$0550 $227F CALL _Delay_5ms
+;openKeyboard.c,432 :: }
+$0551 $0008 RETURN
+$0552 $ _saveConfig:
+;openKeyboard.c,434 :: void saveConfig(){
+;openKeyboard.c,435 :: EEprom_write(CONFIG_BAUDRATE, baudrate);
+$0552 $3001 MOVLW 1
+$0553 $1303 BCF STATUS, RP1
+$0554 $1283 BCF STATUS, RP0
+$0555 $00DF MOVWF FARG_EEprom_write+0
+$0556 $082E MOVF _baudrate, 0
+$0557 $00E0 MOVWF FARG_EEprom_write+1
+$0558 $2120 CALL _EEprom_write
+;openKeyboard.c,436 :: EEprom_write(CONFIG_SENDMODE, sendMode);
+$0559 $3002 MOVLW 2
+$055A $1303 BCF STATUS, RP1
+$055B $1283 BCF STATUS, RP0
+$055C $00DF MOVWF FARG_EEprom_write+0
+$055D $0832 MOVF _sendMode, 0
+$055E $00E0 MOVWF FARG_EEprom_write+1
+$055F $2120 CALL _EEprom_write
+;openKeyboard.c,437 :: EEprom_write(CONFIG_LIGHTMODE, lightMode);
+$0560 $3003 MOVLW 3
+$0561 $1303 BCF STATUS, RP1
+$0562 $1283 BCF STATUS, RP0
+$0563 $00DF MOVWF FARG_EEprom_write+0
+$0564 $082D MOVF _lightMode, 0
+$0565 $00E0 MOVWF FARG_EEprom_write+1
+$0566 $2120 CALL _EEprom_write
+;openKeyboard.c,438 :: EEprom_write(CONFIG_LIGHTSTRENGTH, lightStrenght);
+$0567 $3004 MOVLW 4
+$0568 $1303 BCF STATUS, RP1
+$0569 $1283 BCF STATUS, RP0
+$056A $00DF MOVWF FARG_EEprom_write+0
+$056B $0829 MOVF _lightStrenght, 0
+$056C $00E0 MOVWF FARG_EEprom_write+1
+$056D $2120 CALL _EEprom_write
+;openKeyboard.c,439 :: EEprom_write(CONFIG_LIGHTFADEOFFTIME, lightFadeOffTime>>8);
+$056E $3005 MOVLW 5
+$056F $1303 BCF STATUS, RP1
+$0570 $1283 BCF STATUS, RP0
+$0571 $00DF MOVWF FARG_EEprom_write+0
+$0572 $0825 MOVF _lightFadeOffTime+1, 0
+$0573 $00F0 MOVWF STACK_0
+$0574 $0826 MOVF _lightFadeOffTime+2, 0
+$0575 $00F1 MOVWF STACK_0+1
+$0576 $0827 MOVF _lightFadeOffTime+3, 0
+$0577 $00F2 MOVWF STACK_0+2
+$0578 $01F3 CLRF STACK_0+3
+$0579 $0870 MOVF STACK_0, 0
+$057A $00E0 MOVWF FARG_EEprom_write+1
+$057B $2120 CALL _EEprom_write
+;openKeyboard.c,440 :: }
+$057C $0008 RETURN
+$057D $ _nop:
+;openKeyboard.c,165 :: void nop(){
+;openKeyboard.c,167 :: }
+$057D $0008 RETURN
+$057E $ _lightFade:
+;openKeyboard.c,169 :: void lightFade(){
+;openKeyboard.c,171 :: if (newlyPressd) {
+$057E $1303 BCF STATUS, RP1
+$057F $1283 BCF STATUS, RP0
+$0580 $0836 MOVF _newlyPressd, 0
+$0581 $1903 BTFSC STATUS, Z
+$0582 $2D85 GOTO L_lightFade_13
+;openKeyboard.c,172 :: turnBacklightOn();
+$0583 $2106 CALL _turnBacklightOn
+;openKeyboard.c,173 :: return;
+$0584 $0008 RETURN
+;openKeyboard.c,174 :: }
+$0585 $ L_lightFade_13:
+;openKeyboard.c,176 :: if (timer>0) timer --;
+$0585 $1303 BCF STATUS, RP1
+$0586 $1283 BCF STATUS, RP0
+$0587 $0823 MOVF _timer+3, 0
+$0588 $3C00 SUBLW 0
+$0589 $1D03 BTFSS STATUS, Z
+$058A $2D95 GOTO L_lightFade_91
+$058B $0822 MOVF _timer+2, 0
+$058C $3C00 SUBLW 0
+$058D $1D03 BTFSS STATUS, Z
+$058E $2D95 GOTO L_lightFade_91
+$058F $0821 MOVF _timer+1, 0
+$0590 $3C00 SUBLW 0
+$0591 $1D03 BTFSS STATUS, Z
+$0592 $2D95 GOTO L_lightFade_91
+$0593 $0820 MOVF _timer, 0
+$0594 $3C00 SUBLW 0
+$0595 $ L_lightFade_91:
+$0595 $1803 BTFSC STATUS, C
+$0596 $2DA2 GOTO L_lightFade_14
+$0597 $3001 MOVLW 1
+$0598 $1303 BCF STATUS, RP1
+$0599 $1283 BCF STATUS, RP0
+$059A $02A0 SUBWF _timer, 1
+$059B $1C03 BTFSS STATUS, C
+$059C $02A1 SUBWF _timer+1, 1
+$059D $1C03 BTFSS STATUS, C
+$059E $02A2 SUBWF _timer+2, 1
+$059F $1C03 BTFSS STATUS, C
+$05A0 $02A3 SUBWF _timer+3, 1
+$05A1 $2DA8 GOTO L_lightFade_15
+$05A2 $ L_lightFade_14:
+;openKeyboard.c,180 :: PORTC = 255;
+$05A2 $30FF MOVLW 255
+$05A3 $1303 BCF STATUS, RP1
+$05A4 $1283 BCF STATUS, RP0
+$05A5 $0087 MOVWF PORTC
+;openKeyboard.c,181 :: pwmRunning = 0;
+$05A6 $01A8 CLRF _pwmRunning, 1
+;openKeyboard.c,182 :: enterPowerSave();
+$05A7 $2292 CALL _enterPowerSave
+;openKeyboard.c,183 :: }
+$05A8 $ L_lightFade_15:
+;openKeyboard.c,185 :: if (timer<(~lightStrenght)){
+$05A8 $1303 BCF STATUS, RP1
+$05A9 $1283 BCF STATUS, RP0
+$05AA $0929 COMF _lightStrenght, W
+$05AB $00F1 MOVWF STACK_1
+$05AC $3000 MOVLW 0
+$05AD $0223 SUBWF _timer+3, 0
+$05AE $1D03 BTFSS STATUS, Z
+$05AF $2DBA GOTO L_lightFade_92
+$05B0 $3000 MOVLW 0
+$05B1 $0222 SUBWF _timer+2, 0
+$05B2 $1D03 BTFSS STATUS, Z
+$05B3 $2DBA GOTO L_lightFade_92
+$05B4 $3000 MOVLW 0
+$05B5 $0221 SUBWF _timer+1, 0
+$05B6 $1D03 BTFSS STATUS, Z
+$05B7 $2DBA GOTO L_lightFade_92
+$05B8 $0871 MOVF STACK_1, 0
+$05B9 $0220 SUBWF _timer, 0
+$05BA $ L_lightFade_92:
+$05BA $1803 BTFSC STATUS, C
+$05BB $2DC4 GOTO L_lightFade_16
+;openKeyboard.c,186 :: PWM1_Change_Duty(~((unsigned char)timer));
+$05BC $1303 BCF STATUS, RP1
+$05BD $1283 BCF STATUS, RP0
+$05BE $0920 COMF _timer, W
+$05BF $00E4 MOVWF FARG_PWM1_Change_Duty+0
+$05C0 $207C CALL _PWM1_Change_Duty
+;openKeyboard.c,187 :: PWM2_Change_Duty(~((unsigned char)timer));
+$05C1 $0920 COMF _timer, W
+$05C2 $00E4 MOVWF FARG_PWM2_Change_Duty+0
+$05C3 $20B9 CALL _PWM2_Change_Duty
+;openKeyboard.c,188 :: }
+$05C4 $ L_lightFade_16:
+;openKeyboard.c,190 :: }
+$05C4 $0008 RETURN
+$05C5 $ _scanSend:
+;openKeyboard.c,276 :: void scanSend(){
+;openKeyboard.c,277 :: unsigned char idx = 0;
+$05C5 $1303 BCF STATUS, RP1
+$05C6 $1283 BCF STATUS, RP0
+$05C7 $01DB CLRF scanSend_idx_L0, 1
+;openKeyboard.c,278 :: unsigned char sc = 0;
+$05C8 $01DC CLRF scanSend_sc_L0, 1
+;openKeyboard.c,279 :: unsigned char bs = 0;
+$05C9 $01DD CLRF scanSend_bs_L0, 1
+;openKeyboard.c,281 :: for (AMask=1; AMask<128; AMask<<=1){
+$05CA $3001 MOVLW 1
+$05CB $00B7 MOVWF _AMask
+$05CC $ L_scanSend_35:
+$05CC $3080 MOVLW 128
+$05CD $1303 BCF STATUS, RP1
+$05CE $1283 BCF STATUS, RP0
+$05CF $0237 SUBWF _AMask, 0
+$05D0 $1803 BTFSC STATUS, C
+$05D1 $2E37 GOTO L_scanSend_36
+;openKeyboard.c,282 :: somethingChanged = data[sc] ^ oldData[sc];
+$05D2 $085C MOVF scanSend_sc_L0, 0
+$05D3 $3F3F ADDLW _data
+$05D4 $0084 MOVWF FSR
+$05D5 $0800 MOVF INDF, 0
+$05D6 $00CD MOVWF _somethingChanged
+$05D7 $085C MOVF scanSend_sc_L0, 0
+$05D8 $3F38 ADDLW _oldData
+$05D9 $0084 MOVWF FSR
+$05DA $0800 MOVF INDF, 0
+$05DB $00F0 MOVWF STACK_0
+$05DC $0870 MOVF STACK_0, 0
+$05DD $06CD XORWF _somethingChanged, 1
+;openKeyboard.c,283 :: bs = 0;
+$05DE $01DD CLRF scanSend_bs_L0, 1
+;openKeyboard.c,284 :: for (BMask=1; BMask<128; BMask<<=1){
+$05DF $3001 MOVLW 1
+$05E0 $00CE MOVWF _BMask
+$05E1 $ L_scanSend_38:
+$05E1 $3080 MOVLW 128
+$05E2 $1303 BCF STATUS, RP1
+$05E3 $1283 BCF STATUS, RP0
+$05E4 $024E SUBWF _BMask, 0
+$05E5 $1803 BTFSC STATUS, C
+$05E6 $2E2F GOTO L_scanSend_39
+;openKeyboard.c,285 :: if (someThingChanged & BMask)
+$05E7 $084E MOVF _BMask, 0
+$05E8 $054D ANDWF _somethingChanged, 0
+$05E9 $00F0 MOVWF STACK_0
+$05EA $1903 BTFSC STATUS, Z
+$05EB $2E26 GOTO L_scanSend_41
+;openKeyboard.c,286 :: USART_Write(scanMap[idx] | (((data[sc]&BMask)>>bs)<<6)); // | 64 if pressed
+$05EC $085B MOVF scanSend_idx_L0, 0
+$05ED $3FA9 ADDLW #_scanMap
+$05EE $00F0 MOVWF STACK_0
+$05EF $3002 MOVLW @#_scanMap
+$05F0 $1803 BTFSC STATUS, C
+$05F1 $3F01 ADDLW 1
+$05F2 $00F1 MOVWF STACK_0+1
+$05F3 $0870 MOVF STACK_0, 0
+$05F4 $00B5 MOVWF ___DoICPLoAddr
+$05F5 $0871 MOVF STACK_0+1, 0
+$05F6 $00B4 MOVWF ___DoICPHiAddr
+$05F7 $080A MOVF PCLATH, 0
+$05F8 $00B3 MOVWF ___DoICPSavePCLATH
+$05F9 $22DC CALL _____DoICP
+$05FA $00DE MOVWF FARG_Usart_Write+0
+$05FB $0833 MOVF ___DoICPSavePCLATH, 0
+$05FC $008A MOVWF PCLATH
+$05FD $085C MOVF scanSend_sc_L0, 0
+$05FE $3F3F ADDLW _data
+$05FF $0084 MOVWF FSR
+$0600 $0800 MOVF INDF, 0
+$0601 $00F0 MOVWF STACK_0
+$0602 $084E MOVF _BMask, 0
+$0603 $0570 ANDWF STACK_0, 0
+$0604 $00F2 MOVWF STACK_2
+$0605 $085D MOVF scanSend_bs_L0, 0
+$0606 $00F0 MOVWF STACK_0
+$0607 $0872 MOVF STACK_2, 0
+$0608 $00F3 MOVWF STACK_3
+$0609 $0870 MOVF STACK_0, 0
+$060A $ L_scanSend_93:
+$060A $1903 BTFSC STATUS, Z
+$060B $2E12 GOTO L_scanSend_94
+$060C $1303 BCF STATUS, RP1
+$060D $1283 BCF STATUS, RP0
+$060E $0CF3 RRF STACK_3, 1
+$060F $13F3 BCF STACK_3, 7
+$0610 $3FFF ADDLW 255
+$0611 $2E0A GOTO L_scanSend_93
+$0612 $ L_scanSend_94:
+$0612 $3006 MOVLW 6
+$0613 $1303 BCF STATUS, RP1
+$0614 $1283 BCF STATUS, RP0
+$0615 $00F2 MOVWF STACK_2
+$0616 $0873 MOVF STACK_3, 0
+$0617 $00F0 MOVWF STACK_0
+$0618 $0872 MOVF STACK_2, 0
+$0619 $ L_scanSend_95:
+$0619 $1903 BTFSC STATUS, Z
+$061A $2E21 GOTO L_scanSend_96
+$061B $1303 BCF STATUS, RP1
+$061C $1283 BCF STATUS, RP0
+$061D $0DF0 RLF STACK_0, 1
+$061E $1070 BCF STACK_0, 0
+$061F $3FFF ADDLW 255
+$0620 $2E19 GOTO L_scanSend_95
+$0621 $ L_scanSend_96:
+$0621 $1303 BCF STATUS, RP1
+$0622 $1283 BCF STATUS, RP0
+$0623 $0870 MOVF STACK_0, 0
+$0624 $04DE IORWF FARG_Usart_Write+0, 1
+$0625 $2298 CALL _Usart_Write
+$0626 $ L_scanSend_41:
+;openKeyboard.c,287 :: bs++;
+$0626 $1303 BCF STATUS, RP1
+$0627 $1283 BCF STATUS, RP0
+$0628 $0ADD INCF scanSend_bs_L0, 1
+;openKeyboard.c,288 :: idx++;
+$0629 $0ADB INCF scanSend_idx_L0, 1
+;openKeyboard.c,289 :: }
+$062A $ L_scanSend_40:
+;openKeyboard.c,284 :: for (BMask=1; BMask<128; BMask<<=1){
+$062A $1303 BCF STATUS, RP1
+$062B $1283 BCF STATUS, RP0
+$062C $0DCE RLF _BMask, 1
+$062D $104E BCF _BMask, 0
+;openKeyboard.c,289 :: }
+$062E $2DE1 GOTO L_scanSend_38
+$062F $ L_scanSend_39:
+;openKeyboard.c,290 :: sc++;
+$062F $1303 BCF STATUS, RP1
+$0630 $1283 BCF STATUS, RP0
+$0631 $0ADC INCF scanSend_sc_L0, 1
+;openKeyboard.c,291 :: }
+$0632 $ L_scanSend_37:
+;openKeyboard.c,281 :: for (AMask=1; AMask<128; AMask<<=1){
+$0632 $1303 BCF STATUS, RP1
+$0633 $1283 BCF STATUS, RP0
+$0634 $0DB7 RLF _AMask, 1
+$0635 $1037 BCF _AMask, 0
+;openKeyboard.c,291 :: }
+$0636 $2DCC GOTO L_scanSend_35
+$0637 $ L_scanSend_36:
+;openKeyboard.c,292 :: }
+$0637 $0008 RETURN
+$0638 $ _serialSend:
+;openKeyboard.c,262 :: void serialSend(){
+;openKeyboard.c,263 :: unsigned char idx = 0;
+$0638 $1303 BCF STATUS, RP1
+$0639 $1283 BCF STATUS, RP0
+$063A $01DB CLRF serialSend_idx_L0, 1
+;openKeyboard.c,264 :: unsigned char sc = 0;
+$063B $01DC CLRF serialSend_sc_L0, 1
+;openKeyboard.c,266 :: for (AMask=1; AMask<128; AMask<<=1){
+$063C $3001 MOVLW 1
+$063D $00B7 MOVWF _AMask
+$063E $ L_serialSend_28:
+$063E $3080 MOVLW 128
+$063F $1303 BCF STATUS, RP1
+$0640 $1283 BCF STATUS, RP0
+$0641 $0237 SUBWF _AMask, 0
+$0642 $1803 BTFSC STATUS, C
+$0643 $2E82 GOTO L_serialSend_29
+;openKeyboard.c,267 :: for (BMask=1; BMask<128; BMask<<=1){
+$0644 $3001 MOVLW 1
+$0645 $00CE MOVWF _BMask
+$0646 $ L_serialSend_31:
+$0646 $3080 MOVLW 128
+$0647 $1303 BCF STATUS, RP1
+$0648 $1283 BCF STATUS, RP0
+$0649 $024E SUBWF _BMask, 0
+$064A $1803 BTFSC STATUS, C
+$064B $2E7A GOTO L_serialSend_32
+;openKeyboard.c,268 :: if (justPressed[sc] & BMask) USART_Write(serialMap[alt][idx]);
+$064C $085C MOVF serialSend_sc_L0, 0
+$064D $3F46 ADDLW _justPressed
+$064E $0084 MOVWF FSR
+$064F $0800 MOVF INDF, 0
+$0650 $00F0 MOVWF STACK_0
+$0651 $084E MOVF _BMask, 0
+$0652 $05F0 ANDWF STACK_0, 1
+$0653 $1903 BTFSC STATUS, Z
+$0654 $2E72 GOTO L_serialSend_34
+$0655 $084F MOVF _alt, 0
+$0656 $00F0 MOVWF STACK_0
+$0657 $01F1 CLRF STACK_0+1
+$0658 $3031 MOVLW 49
+$0659 $00F4 MOVWF STACK_4
+$065A $3000 MOVLW 0
+$065B $00F5 MOVWF STACK_4+1
+$065C $23A8 CALL _mul_16x16_u
+$065D $30E3 MOVLW #_serialMap
+$065E $07F0 ADDWF STACK_0, 1
+$065F $3002 MOVLW @#_serialMap
+$0660 $1803 BTFSC STATUS, C
+$0661 $3F01 ADDLW 1
+$0662 $07F1 ADDWF STACK_0+1, 1
+$0663 $085B MOVF serialSend_idx_L0, 0
+$0664 $07F0 ADDWF STACK_0, 1
+$0665 $1803 BTFSC STATUS, C
+$0666 $0AF1 INCF STACK_0+1, 1
+$0667 $0870 MOVF STACK_0, 0
+$0668 $00B5 MOVWF ___DoICPLoAddr
+$0669 $0871 MOVF STACK_0+1, 0
+$066A $00B4 MOVWF ___DoICPHiAddr
+$066B $080A MOVF PCLATH, 0
+$066C $00B3 MOVWF ___DoICPSavePCLATH
+$066D $22DC CALL _____DoICP
+$066E $00DE MOVWF FARG_Usart_Write+0
+$066F $0833 MOVF ___DoICPSavePCLATH, 0
+$0670 $008A MOVWF PCLATH
+$0671 $2298 CALL _Usart_Write
+$0672 $ L_serialSend_34:
+;openKeyboard.c,269 :: idx++;
+$0672 $1303 BCF STATUS, RP1
+$0673 $1283 BCF STATUS, RP0
+$0674 $0ADB INCF serialSend_idx_L0, 1
+;openKeyboard.c,270 :: }
+$0675 $ L_serialSend_33:
+;openKeyboard.c,267 :: for (BMask=1; BMask<128; BMask<<=1){
+$0675 $1303 BCF STATUS, RP1
+$0676 $1283 BCF STATUS, RP0
+$0677 $0DCE RLF _BMask, 1
+$0678 $104E BCF _BMask, 0
+;openKeyboard.c,270 :: }
+$0679 $2E46 GOTO L_serialSend_31
+$067A $ L_serialSend_32:
+;openKeyboard.c,271 :: sc++;
+$067A $1303 BCF STATUS, RP1
+$067B $1283 BCF STATUS, RP0
+$067C $0ADC INCF serialSend_sc_L0, 1
+;openKeyboard.c,272 :: }
+$067D $ L_serialSend_30:
+;openKeyboard.c,266 :: for (AMask=1; AMask<128; AMask<<=1){
+$067D $1303 BCF STATUS, RP1
+$067E $1283 BCF STATUS, RP0
+$067F $0DB7 RLF _AMask, 1
+$0680 $1037 BCF _AMask, 0
+;openKeyboard.c,272 :: }
+$0681 $2E3E GOTO L_serialSend_28
+$0682 $ L_serialSend_29:
+;openKeyboard.c,273 :: alt = alts[data[2]&1|((data[1]&1)<<1)|((data[0]&64)>>4)]; // next scan can use alt retrieved here
+$0682 $3001 MOVLW 1
+$0683 $1303 BCF STATUS, RP1
+$0684 $1283 BCF STATUS, RP0
+$0685 $0541 ANDWF _data+2, 0
+$0686 $00F4 MOVWF STACK_4
+$0687 $3001 MOVLW 1
+$0688 $0540 ANDWF _data+1, 0
+$0689 $00F3 MOVWF STACK_3
+$068A $0873 MOVF STACK_3, 0
+$068B $00F0 MOVWF STACK_0
+$068C $01F1 CLRF STACK_0+1
+$068D $0DF0 RLF STACK_0, 1
+$068E $0DF1 RLF STACK_0+1, 1
+$068F $1070 BCF STACK_0, 0
+$0690 $3000 MOVLW 0
+$0691 $00F5 MOVWF STACK_4+1
+$0692 $0870 MOVF STACK_0, 0
+$0693 $04F4 IORWF STACK_4, 1
+$0694 $0871 MOVF STACK_0+1, 0
+$0695 $04F5 IORWF STACK_4+1, 1
+$0696 $3040 MOVLW 64
+$0697 $053F ANDWF _data, 0
+$0698 $00F3 MOVWF STACK_3
+$0699 $0873 MOVF STACK_3, 0
+$069A $00F0 MOVWF STACK_0
+$069B $0CF0 RRF STACK_0, 1
+$069C $13F0 BCF STACK_0, 7
+$069D $0CF0 RRF STACK_0, 1
+$069E $13F0 BCF STACK_0, 7
+$069F $0CF0 RRF STACK_0, 1
+$06A0 $13F0 BCF STACK_0, 7
+$06A1 $0CF0 RRF STACK_0, 1
+$06A2 $13F0 BCF STACK_0, 7
+$06A3 $3000 MOVLW 0
+$06A4 $00F1 MOVWF STACK_0+1
+$06A5 $0874 MOVF STACK_4, 0
+$06A6 $04F0 IORWF STACK_0, 1
+$06A7 $0875 MOVF STACK_4+1, 0
+$06A8 $04F1 IORWF STACK_0+1, 1
+$06A9 $0870 MOVF STACK_0, 0
+$06AA $3F50 ADDLW _alts
+$06AB $0084 MOVWF FSR
+$06AC $0800 MOVF INDF, 0
+$06AD $00CF MOVWF _alt
+;openKeyboard.c,274 :: }
+$06AE $0008 RETURN
+$06AF $ _Delay_80us:
+;delays.c,23 :: void Delay_80us() {
+;delays.c,24 :: Delay_us(78);
+$06AF $3019 MOVLW 25
+$06B0 $1303 BCF STATUS, RP1
+$06B1 $1283 BCF STATUS, RP0
+$06B2 $00FA MOVWF STACK_10
+$06B3 $0BFA DECFSZ STACK_10, F
+$06B4 $2EB3 GOTO $-1
+$06B5 $0000 NOP
+$06B6 $0000 NOP
+;delays.c,25 :: }
+$06B7 $0008 RETURN
+$0800 $ GlobalIniopenKeyboard:
+$0800 $3000 MOVLW 0
+$0801 $1303 BCF STATUS, RP1
+$0802 $1283 BCF STATUS, RP0
+$0803 $00BF MOVWF _data+0
+$0804 $3000 MOVLW 0
+$0805 $00C0 MOVWF _data+1
+$0806 $3000 MOVLW 0
+$0807 $00C1 MOVWF _data+2
+$0808 $3000 MOVLW 0
+$0809 $00C2 MOVWF _data+3
+$080A $3000 MOVLW 0
+$080B $00C3 MOVWF _data+4
+$080C $3000 MOVLW 0
+$080D $00C4 MOVWF _data+5
+$080E $3000 MOVLW 0
+$080F $00C5 MOVWF _data+6
+$0810 $3000 MOVLW 0
+$0811 $00B8 MOVWF _oldData+0
+$0812 $3000 MOVLW 0
+$0813 $00B9 MOVWF _oldData+1
+$0814 $3000 MOVLW 0
+$0815 $00BA MOVWF _oldData+2
+$0816 $3000 MOVLW 0
+$0817 $00BB MOVWF _oldData+3
+$0818 $3000 MOVLW 0
+$0819 $00BC MOVWF _oldData+4
+$081A $3000 MOVLW 0
+$081B $00BD MOVWF _oldData+5
+$081C $3000 MOVLW 0
+$081D $00BE MOVWF _oldData+6
+$081E $3000 MOVLW 0
+$081F $00C6 MOVWF _justPressed+0
+$0820 $3000 MOVLW 0
+$0821 $00C7 MOVWF _justPressed+1
+$0822 $3000 MOVLW 0
+$0823 $00C8 MOVWF _justPressed+2
+$0824 $3000 MOVLW 0
+$0825 $00C9 MOVWF _justPressed+3
+$0826 $3000 MOVLW 0
+$0827 $00CA MOVWF _justPressed+4
+$0828 $3000 MOVLW 0
+$0829 $00CB MOVWF _justPressed+5
+$082A $3000 MOVLW 0
+$082B $00CC MOVWF _justPressed+6
+$082C $3000 MOVLW 0
+$082D $00B6 MOVWF _newlyPressd+0
+$082E $3000 MOVLW 0
+$082F $00B7 MOVWF _AMask+0
+$0830 $3000 MOVLW 0
+$0831 $00CE MOVWF _BMask+0
+$0832 $3000 MOVLW 0
+$0833 $00CD MOVWF _somethingChanged+0
+$0834 $30FF MOVLW 255
+$0835 $00A0 MOVWF _timer+0
+$0836 $30FF MOVLW 255
+$0837 $00A1 MOVWF _timer+1
+$0838 $3000 MOVLW 0
+$0839 $00A2 MOVWF _timer+2
+$083A $3000 MOVLW 0
+$083B $00A3 MOVWF _timer+3
+$083C $3000 MOVLW 0
+$083D $00A4 MOVWF _lightFadeOffTime+0
+$083E $3080 MOVLW 128
+$083F $00A5 MOVWF _lightFadeOffTime+1
+$0840 $3000 MOVLW 0
+$0841 $00A6 MOVWF _lightFadeOffTime+2
+$0842 $3000 MOVLW 0
+$0843 $00A7 MOVWF _lightFadeOffTime+3
+$0844 $3000 MOVLW 0
+$0845 $00D0 MOVWF _alts+0
+$0846 $3001 MOVLW 1
+$0847 $00D1 MOVWF _alts+1
+$0848 $3002 MOVLW 2
+$0849 $00D2 MOVWF _alts+2
+$084A $3002 MOVLW 2
+$084B $00D3 MOVWF _alts+3
+$084C $3003 MOVLW 3
+$084D $00D4 MOVWF _alts+4
+$084E $3003 MOVLW 3
+$084F $00D5 MOVWF _alts+5
+$0850 $3003 MOVLW 3
+$0851 $00D6 MOVWF _alts+6
+$0852 $3003 MOVLW 3
+$0853 $00D7 MOVWF _alts+7
+$0854 $3000 MOVLW 0
+$0855 $00AF MOVWF _send+0
+$0856 $3000 MOVLW 0
+$0857 $00B0 MOVWF _send+1
+$0858 $3000 MOVLW 0
+$0859 $00B1 MOVWF _send+2
+$085A $3000 MOVLW 0
+$085B $00AA MOVWF _lightHandler+0
+$085C $3000 MOVLW 0
+$085D $00AB MOVWF _lightHandler+1
+$085E $3000 MOVLW 0
+$085F $00AC MOVWF _lightHandler+2
+$0860 $3000 MOVLW 0
+$0861 $00AE MOVWF _baudrate+0
+$0862 $3000 MOVLW 0
+$0863 $00B2 MOVWF _sendMode+0
+$0864 $3000 MOVLW 0
+$0865 $00AD MOVWF _lightMode+0
+$0866 $3000 MOVLW 0
+$0867 $00A9 MOVWF _lightStrenght+0
+$0868 $3000 MOVLW 0
+$0869 $00A8 MOVWF _pwmRunning+0
+;openKeyboard.c,517 :: }
+$086A $0008 RETURN
+$06B8 $ _____DoICF:
+$06B8 $1303 BCF STATUS, RP1
+$06B9 $1283 BCF STATUS, RP0
+$06BA $0834 MOVF ___DoICPHiAddr, 0
+$06BB $008A MOVWF PCLATH
+$06BC $0835 MOVF ___DoICPLoAddr, 0
+$06BD $0082 MOVWF PCL
+$06BE $0008 RETURN
+$086B $ _main:
+;openKeyboard.c,453 :: void main() {
+;openKeyboard.c,455 :: OSCCON = 0x67; // 01100111 - 0110 stands for 4Mhz internal clock
+$086B $2000 CALL GlobalIniopenKeyboard
+$086C $3067 MOVLW 103
+$086D $1303 BCF STATUS, RP1
+$086E $1683 BSF STATUS, RP0
+$086F $008F MOVWF OSCCON
+;openKeyboard.c,457 :: ANSEL = 0; // Configure AN pins as digital I/O
+$0870 $1703 BSF STATUS, RP1
+$0871 $0188 CLRF ANSEL, 1
+;openKeyboard.c,458 :: ANSELH = 0;
+$0872 $0189 CLRF ANSELH, 1
+;openKeyboard.c,460 :: PORTA = 0; // init port A
+$0873 $1303 BCF STATUS, RP1
+$0874 $1283 BCF STATUS, RP0
+$0875 $0185 CLRF PORTA, 1
+;openKeyboard.c,461 :: TRISA = 0; // 1 = input
+$0876 $1683 BSF STATUS, RP0
+$0877 $0185 CLRF TRISA, 1
+;openKeyboard.c,463 :: PORTB = 0; // initialize PORTB
+$0878 $1283 BCF STATUS, RP0
+$0879 $0186 CLRF PORTB, 1
+;openKeyboard.c,464 :: TRISB = 255; // designate PORTB as all input
+$087A $30FF MOVLW 255
+$087B $1683 BSF STATUS, RP0
+$087C $0086 MOVWF TRISB
+;openKeyboard.c,466 :: PORTC = 0; // initialize PORTC
+$087D $1283 BCF STATUS, RP0
+$087E $0187 CLRF PORTC, 1
+;openKeyboard.c,467 :: TRISC = 0; // designate PORTB 0-7 as output
+$087F $1683 BSF STATUS, RP0
+$0880 $0187 CLRF TRISC, 1
+;openKeyboard.c,469 :: OPTION_REG = 0; // pull-ups enabled on PORTB....no external pull-downs
+$0881 $0181 CLRF OPTION_REG, 1
+;openKeyboard.c,474 :: INTCON.RBIE = 0; // disables PORTB on-change interrupt
+$0882 $118B BCF INTCON, 3
+;openKeyboard.c,475 :: INTCON.RBIF = 0; // clear PORTB mismatch values
+$0883 $100B BCF INTCON, 0
+;openKeyboard.c,477 :: IOCB = 127; // pin 0-6 of PORTB configured to raise interrupt when changed
+$0884 $307F MOVLW 127
+$0885 $0096 MOVWF IOCB
+;openKeyboard.c,479 :: PIE1 = 32; // RCIE = 1; enables EUSART on-receive interrupt
+$0886 $3020 MOVLW 32
+$0887 $008C MOVWF PIE1
+;openKeyboard.c,481 :: INTCON.GIE = 1; // Global Interrupt Enable/disable
+$0888 $178B BSF INTCON, 7
+;openKeyboard.c,484 :: Delay_ms(20); // required for eeprom_read to work correctly
+$0889 $301A MOVLW 26
+$088A $00FB MOVWF STACK_11
+$088B $30FF MOVLW 255
+$088C $00FA MOVWF STACK_10
+$088D $0BFB DECFSZ STACK_11, F
+$088E $2890 GOTO $+2
+$088F $2893 GOTO $+4
+$0890 $0BFA DECFSZ STACK_10, F
+$0891 $2890 GOTO $-1
+$0892 $288D GOTO $-5
+$0893 $30E7 MOVLW 231
+$0894 $00FA MOVWF STACK_10
+$0895 $0BFA DECFSZ STACK_10, F
+$0896 $2895 GOTO $-1
+$0897 $0000 NOP
+;openKeyboard.c,485 :: sendMode = EEprom_read(CONFIG_SENDMODE);
+$0898 $3002 MOVLW 2
+$0899 $1283 BCF STATUS, RP0
+$089A $00DB MOVWF FARG_EEprom_read+0
+$089B $118A BCF PCLATH, 3
+$089C $23D3 CALL _EEprom_read
+$089D $158A BSF PCLATH, 3
+$089E $0870 MOVF STACK_0, 0
+$089F $1303 BCF STATUS, RP1
+$08A0 $00B2 MOVWF _sendMode
+;openKeyboard.c,486 :: setupSendMode(sendMode);
+$08A1 $0870 MOVF STACK_0, 0
+$08A2 $00DE MOVWF FARG_setupSendMode+0
+$08A3 $118A BCF PCLATH, 3
+$08A4 $2248 CALL _setupSendMode
+$08A5 $158A BSF PCLATH, 3
+;openKeyboard.c,490 :: Delay_ms(20); // required for eeprom_read to work correctly
+$08A6 $301A MOVLW 26
+$08A7 $00FB MOVWF STACK_11
+$08A8 $30FF MOVLW 255
+$08A9 $00FA MOVWF STACK_10
+$08AA $0BFB DECFSZ STACK_11, F
+$08AB $28AD GOTO $+2
+$08AC $28B0 GOTO $+4
+$08AD $0BFA DECFSZ STACK_10, F
+$08AE $28AD GOTO $-1
+$08AF $28AA GOTO $-5
+$08B0 $30E7 MOVLW 231
+$08B1 $00FA MOVWF STACK_10
+$08B2 $0BFA DECFSZ STACK_10, F
+$08B3 $28B2 GOTO $-1
+$08B4 $0000 NOP
+;openKeyboard.c,491 :: baudrate = EEprom_read(CONFIG_BAUDRATE);
+$08B5 $3001 MOVLW 1
+$08B6 $00DB MOVWF FARG_EEprom_read+0
+$08B7 $118A BCF PCLATH, 3
+$08B8 $23D3 CALL _EEprom_read
+$08B9 $158A BSF PCLATH, 3
+$08BA $0870 MOVF STACK_0, 0
+$08BB $1303 BCF STATUS, RP1
+$08BC $00AE MOVWF _baudrate
+;openKeyboard.c,492 :: setupUsart(baudrate); // Initalize USART (xxxx baud rate, 1 stop bit, no parity...)
+$08BD $0870 MOVF STACK_0, 0
+$08BE $00DE MOVWF FARG_setupUsart+0
+$08BF $118A BCF PCLATH, 3
+$08C0 $21C7 CALL _setupUsart
+$08C1 $158A BSF PCLATH, 3
+;openKeyboard.c,495 :: Delay_ms(20); // required for eeprom_read to work correctly
+$08C2 $301A MOVLW 26
+$08C3 $00FB MOVWF STACK_11
+$08C4 $30FF MOVLW 255
+$08C5 $00FA MOVWF STACK_10
+$08C6 $0BFB DECFSZ STACK_11, F
+$08C7 $28C9 GOTO $+2
+$08C8 $28CC GOTO $+4
+$08C9 $0BFA DECFSZ STACK_10, F
+$08CA $28C9 GOTO $-1
+$08CB $28C6 GOTO $-5
+$08CC $30E7 MOVLW 231
+$08CD $00FA MOVWF STACK_10
+$08CE $0BFA DECFSZ STACK_10, F
+$08CF $28CE GOTO $-1
+$08D0 $0000 NOP
+;openKeyboard.c,496 :: lightFadeOffTime = EEprom_read(CONFIG_LIGHTFADEOFFTIME) << 8;
+$08D1 $3005 MOVLW 5
+$08D2 $00DB MOVWF FARG_EEprom_read+0
+$08D3 $118A BCF PCLATH, 3
+$08D4 $23D3 CALL _EEprom_read
+$08D5 $158A BSF PCLATH, 3
+$08D6 $3008 MOVLW 8
+$08D7 $00F1 MOVWF STACK_1
+$08D8 $0870 MOVF STACK_0, 0
+$08D9 $1303 BCF STATUS, RP1
+$08DA $00A4 MOVWF _lightFadeOffTime
+$08DB $01A5 CLRF _lightFadeOffTime+1
+$08DC $0871 MOVF STACK_1, 0
+$08DD $ L_main_97:
+$08DD $1903 BTFSC STATUS, Z
+$08DE $28E6 GOTO L_main_98
+$08DF $1303 BCF STATUS, RP1
+$08E0 $1283 BCF STATUS, RP0
+$08E1 $0DA4 RLF _lightFadeOffTime, 1
+$08E2 $0DA5 RLF _lightFadeOffTime+1, 1
+$08E3 $1024 BCF _lightFadeOffTime, 0
+$08E4 $3FFF ADDLW 255
+$08E5 $28DD GOTO L_main_97
+$08E6 $ L_main_98:
+$08E6 $3000 MOVLW 0
+$08E7 $1303 BCF STATUS, RP1
+$08E8 $1283 BCF STATUS, RP0
+$08E9 $00A6 MOVWF _lightFadeOffTime+2
+$08EA $00A7 MOVWF _lightFadeOffTime+3
+;openKeyboard.c,497 :: lightStrenght = EEprom_read(CONFIG_LIGHTSTRENGTH);
+$08EB $3004 MOVLW 4
+$08EC $00DB MOVWF FARG_EEprom_read+0
+$08ED $118A BCF PCLATH, 3
+$08EE $23D3 CALL _EEprom_read
+$08EF $158A BSF PCLATH, 3
+$08F0 $0870 MOVF STACK_0, 0
+$08F1 $1303 BCF STATUS, RP1
+$08F2 $00A9 MOVWF _lightStrenght
+;openKeyboard.c,499 :: Delay_ms(20); // required for eeprom_read to work correctly
+$08F3 $301A MOVLW 26
+$08F4 $00FB MOVWF STACK_11
+$08F5 $30FF MOVLW 255
+$08F6 $00FA MOVWF STACK_10
+$08F7 $0BFB DECFSZ STACK_11, F
+$08F8 $28FA GOTO $+2
+$08F9 $28FD GOTO $+4
+$08FA $0BFA DECFSZ STACK_10, F
+$08FB $28FA GOTO $-1
+$08FC $28F7 GOTO $-5
+$08FD $30E7 MOVLW 231
+$08FE $00FA MOVWF STACK_10
+$08FF $0BFA DECFSZ STACK_10, F
+$0900 $28FF GOTO $-1
+$0901 $0000 NOP
+;openKeyboard.c,500 :: lightMode = EEprom_read(CONFIG_LIGHTMODE);
+$0902 $3003 MOVLW 3
+$0903 $00DB MOVWF FARG_EEprom_read+0
+$0904 $118A BCF PCLATH, 3
+$0905 $23D3 CALL _EEprom_read
+$0906 $158A BSF PCLATH, 3
+$0907 $0870 MOVF STACK_0, 0
+$0908 $1303 BCF STATUS, RP1
+$0909 $00AD MOVWF _lightMode
+;openKeyboard.c,501 :: setUpLightMode(lightMode);
+$090A $0870 MOVF STACK_0, 0
+$090B $00DE MOVWF FARG_setupLightMode+0
+$090C $118A BCF PCLATH, 3
+$090D $2159 CALL _setupLightMode
+$090E $158A BSF PCLATH, 3
+;openKeyboard.c,503 :: do {
+$090F $ L_main_86:
+;openKeyboard.c,505 :: doScan();
+$090F $118A BCF PCLATH, 3
+$0910 $23DF CALL _doScan
+$0911 $158A BSF PCLATH, 3
+;openKeyboard.c,507 :: if (data[1]&2) {
+$0912 $1303 BCF STATUS, RP1
+$0913 $1283 BCF STATUS, RP0
+$0914 $1CC0 BTFSS _data+1, 1
+$0915 $291A GOTO L_main_88
+;openKeyboard.c,508 :: config(); // people button pressed -> config mode
+$0916 $118A BCF PCLATH, 3
+$0917 $2448 CALL _config
+$0918 $158A BSF PCLATH, 3
+;openKeyboard.c,509 :: }else{
+$0919 $2930 GOTO L_main_89
+$091A $ L_main_88:
+;openKeyboard.c,510 :: if (oldData[1]&2) saveConfig(); // ppl btn just released... save config
+$091A $1303 BCF STATUS, RP1
+$091B $1283 BCF STATUS, RP0
+$091C $1CB9 BTFSS _oldData+1, 1
+$091D $2921 GOTO L_main_90
+$091E $118A BCF PCLATH, 3
+$091F $2552 CALL _saveConfig
+$0920 $158A BSF PCLATH, 3
+$0921 $ L_main_90:
+;openKeyboard.c,511 :: send();
+$0921 $1303 BCF STATUS, RP1
+$0922 $1283 BCF STATUS, RP0
+$0923 $082F MOVF _send, 0
+$0924 $00B5 MOVWF ___DoICPLoAddr
+$0925 $0830 MOVF _send+1, 0
+$0926 $00B4 MOVWF ___DoICPHiAddr
+$0927 $080A MOVF PCLATH, 0
+$0928 $00B3 MOVWF ___DoICPSavePCLATH
+$0929 $118A BCF PCLATH, 3
+$092A $26B8 CALL _____DoICF
+$092B $158A BSF PCLATH, 3
+$092C $1303 BCF STATUS, RP1
+$092D $1283 BCF STATUS, RP0
+$092E $0833 MOVF ___DoICPSavePCLATH, 0
+$092F $008A MOVWF PCLATH
+;openKeyboard.c,512 :: }
+$0930 $ L_main_89:
+;openKeyboard.c,513 :: lightHandler();
+$0930 $1303 BCF STATUS, RP1
+$0931 $1283 BCF STATUS, RP0
+$0932 $082A MOVF _lightHandler, 0
+$0933 $00B5 MOVWF ___DoICPLoAddr
+$0934 $082B MOVF _lightHandler+1, 0
+$0935 $00B4 MOVWF ___DoICPHiAddr
+$0936 $080A MOVF PCLATH, 0
+$0937 $00B3 MOVWF ___DoICPSavePCLATH
+$0938 $118A BCF PCLATH, 3
+$0939 $26B8 CALL _____DoICF
+$093A $158A BSF PCLATH, 3
+$093B $1303 BCF STATUS, RP1
+$093C $1283 BCF STATUS, RP0
+$093D $0833 MOVF ___DoICPSavePCLATH, 0
+$093E $008A MOVWF PCLATH
+;openKeyboard.c,514 :: Delay_80us(); // without this delay, pic hangs on sleep...
+$093F $118A BCF PCLATH, 3
+$0940 $26AF CALL _Delay_80us
+$0941 $158A BSF PCLATH, 3
+;openKeyboard.c,515 :: } while (1); // endless loop
+$0942 $290F GOTO L_main_86
+;openKeyboard.c,517 :: }
+$0943 $2943 GOTO $
+
+
+//** Procedures locations **
+//ADDRESS PROCEDURE
+//----------------------------------------------
+$0004 interrupt
+$0020 exitPowerSave
+$0022 Mul_16x16_S
+$006C PWM1_Start
+$0074 PWM2_Start
+$007C PWM1_Change_Duty
+$00B9 PWM2_Change_Duty
+$00F6 PWM1_Stop
+$00FE PWM2_Stop
+$0106 turnBacklightOn
+$0120 EEprom_write
+$013C PWM1_Init
+$0142 PWM2_Init
+$0148 Usart_Init
+$0159 setupLightMode
+$01C7 setupUsart
+$0248 setupSendMode
+$027F Delay_5ms
+$0292 enterPowerSave
+$0298 Usart_Write
+$02A9 ?table___scanMap
+$02DC ____DoICP
+$02E3 ?table___serialMap
+$03A8 Mul_16x16_U
+$03D3 EEprom_read
+$03DF doScan
+$0448 config
+$0552 saveConfig
+$057D nop
+$057E lightFade
+$05C5 scanSend
+$0638 serialSend
+$06AF Delay_80us
+$06B8 ____DoICF
+$0800 GlobalIniopenKeyboard
+$086B main
+
+
+//** Labels locations **
+//ADDRESS LABEL
+//----------------------------------------------
+$0004 _interrupt:
+$0013 L_interrupt_85:
+$0013 L_Interrupt_end:
+$0020 _exitPowerSave:
+$0022 _Mul_16x16_S:
+$006C _PWM1_Start:
+$0074 _PWM2_Start:
+$007C _PWM1_Change_Duty:
+$0090 L_PWM1_Change_Duty_2:
+$0099 L_PWM1_Change_Duty_3:
+$00B9 _PWM2_Change_Duty:
+$00CD L_PWM2_Change_Duty_0:
+$00D6 L_PWM2_Change_Duty_1:
+$00F6 _PWM1_Stop:
+$00FE _PWM2_Stop:
+$0106 _turnBacklightOn:
+$0117 L_turnBacklightOn_12:
+$0120 _EEprom_write:
+$0121 L_EEprom_write_0:
+$0127 L_EEprom_write_1:
+$013C _PWM1_Init:
+$0142 _PWM2_Init:
+$0148 _Usart_Init:
+$0151 L_Usart_Init_0:
+$0158 L_Usart_Init_1:
+$0159 _setupLightMode:
+$0160 L_setupLightMode_17:
+$0161 L_setupLightMode_20:
+$016E L_setupLightMode_21:
+$017B L_setupLightMode_22:
+$018A L_setupLightMode_23:
+$019D L_setupLightMode_18:
+$01AC L_setupLightMode_19:
+$01C6 L_setupLightMode_24:
+$01C7 _setupUsart:
+$01C8 L_setupUsart_2:
+$01D1 L_setupUsart_3:
+$01D8 L_setupUsart_4:
+$01DF L_setupUsart_5:
+$01E6 L_setupUsart_6:
+$01ED L_setupUsart_7:
+$01F4 L_setupUsart_8:
+$01FB L_setupUsart_9:
+$0202 L_setupUsart_10:
+$0209 L_setupUsart_11:
+$021A L_setupUsart_0:
+$0243 L_setupUsart_1:
+$0248 _setupSendMode:
+$0249 L_setupSendMode_44:
+$0255 L_setupSendMode_45:
+$0260 L_setupSendMode_46:
+$0271 L_setupSendMode_42:
+$027E L_setupSendMode_43:
+$027F _Delay_5ms:
+$0292 _enterPowerSave:
+$0298 _Usart_Write:
+$0298 L_Usart_Write_3:
+$02A4 L_Usart_Write_4:
+$02A9 table___scanMap:
+$02DC _____DoICP:
+$02E3 table___serialMap:
+$03A8 _Mul_16x16_U:
+$03D3 _EEprom_read:
+$03DF _doScan:
+$03E5 L_doScan_25:
+$0442 L_doScan_27:
+$0447 L_doScan_26:
+$0448 _config:
+$0458 L352_ex_L_config_49:
+$0467 L_config_49:
+$0467 L_config_50:
+$046F L374_ex_L_config_53:
+$047E L_config_53:
+$047E L_config_54:
+$048E L_config_55:
+$0497 L_config_57:
+$04A2 L_config_56:
+$04A2 L_config_58:
+$04AB L_config_60:
+$04B6 L_config_59:
+$04B6 L_config_61:
+$04BF L_config_63:
+$04CA L_config_62:
+$04CA L_config_64:
+$04D7 L_config_66:
+$04E2 L_config_65:
+$04E2 L_config_67:
+$04EF L_config_69:
+$04FA L_config_68:
+$04FA L_config_70:
+$0503 L_config_72:
+$050E L_config_71:
+$050E L_config_73:
+$051A L_config_75:
+$0525 L_config_74:
+$0525 L_config_76:
+$052E L_config_78:
+$0533 L_config_77:
+$0533 L_config_79:
+$053C L_config_81:
+$0540 L_config_80:
+$0540 L_config_82:
+$054A L_config_83:
+$0550 L_config_84:
+$0552 _saveConfig:
+$057D _nop:
+$057E _lightFade:
+$0585 L_lightFade_13:
+$0595 L_lightFade_91:
+$05A2 L_lightFade_14:
+$05A8 L_lightFade_15:
+$05BA L_lightFade_92:
+$05C4 L_lightFade_16:
+$05C5 _scanSend:
+$05CC L_scanSend_35:
+$05E1 L_scanSend_38:
+$060A L_scanSend_93:
+$0612 L_scanSend_94:
+$0619 L_scanSend_95:
+$0621 L_scanSend_96:
+$0626 L_scanSend_41:
+$062A L_scanSend_40:
+$062F L_scanSend_39:
+$0632 L_scanSend_37:
+$0637 L_scanSend_36:
+$0638 _serialSend:
+$063E L_serialSend_28:
+$0646 L_serialSend_31:
+$0672 L_serialSend_34:
+$0675 L_serialSend_33:
+$067A L_serialSend_32:
+$067D L_serialSend_30:
+$0682 L_serialSend_29:
+$06AF _Delay_80us:
+$06B8 _____DoICF:
+$0800 GlobalIniopenKeyboard:
+$086B _main:
+$08DD L_main_97:
+$08E6 L_main_98:
+$090F L_main_86:
+$091A L_main_88:
+$0921 L_main_90:
+$0930 L_main_89:
+
+
+//** Variables locations **
+//ADDRESS VARIABLE
+//----------------------------------------------
+$0000 INDF
+$0002 PCL
+$0003 STATUS
+$0004 FSR
+$0005 PORTA
+$0006 PORTB
+$0007 PORTC
+$000A PCLATH
+$000B INTCON
+$000C PIR1
+$0012 T2CON
+$0015 CCPR1L
+$0017 CCP1CON
+$0018 RCSTA
+$0019 TXREG
+$001A RCREG
+$001B CCPR2L
+$001D CCP2CON
+$0020 _timer
+$0024 _lightFadeOffTime
+$0028 _pwmRunning
+$0029 _lightStrenght
+$002A _lightHandler
+$002D _lightMode
+$002E _baudrate
+$002F _send
+$0032 _sendMode
+$0033 ___DoICPSavePCLATH
+$0034 ___DoICPHiAddr
+$0035 ___DoICPLoAddr
+$0036 _newlyPressd
+$0037 _AMask
+$0038 _oldData
+$003F _data
+$0046 _justPressed
+$004D _somethingChanged
+$004E _BMask
+$004F _alt
+$0050 _alts
+$0058 ?saveFSR
+$0059 ?saveSTATUS
+$005A ?savePCLATH
+$005B doScan_sc_L0
+$005B FARG_EEprom_read+0
+$005B scanSend_idx_L0
+$005B serialSend_idx_L0
+$005C scanSend_sc_L0
+$005C serialSend_sc_L0
+$005D scanSend_bs_L0
+$005E FARG_setupLightMode+0
+$005E FARG_setupSendMode+0
+$005E FARG_setupUsart+0
+$005E FARG_Usart_Write+0
+$005F FARG_EEprom_write+0
+$005F FARG_PWM1_Init+0
+$005F FARG_PWM2_Init+0
+$005F FARG_Usart_Init+0
+$0060 FARG_EEprom_write+1
+$0063 Usart_Init_tmp_L0
+$0064 FARG_PWM1_Change_Duty+0
+$0064 FARG_PWM2_Change_Duty+0
+$0070 STACK_0
+$0071 STACK_1
+$0072 STACK_2
+$0073 STACK_3
+$0074 STACK_4
+$0075 STACK_5
+$0076 STACK_6
+$0077 STACK_7
+$0078 STACK_8
+$0079 STACK_9
+$007A STACK_10
+$007B STACK_11
+$007C STACK_12
+$007D STACK_13
+$007E STACK_14
+$007F STACK_15
+$0081 OPTION_REG
+$0085 TRISA
+$0086 TRISB
+$0087 TRISC
+$008C PIE1
+$008F OSCCON
+$0092 PR2
+$0096 IOCB
+$0098 TXSTA
+$0099 SPBRG
+$010C EEDATA
+$010D EEADR
+$0188 ANSEL
+$0189 ANSELH
+$018C EECON1
+$018D EECON2
+
+
diff --git a/openKeyboard031/openKeyboard.mcl b/openKeyboard031/openKeyboard.mcl
new file mode 100644
index 0000000..c163367
Binary files /dev/null and b/openKeyboard031/openKeyboard.mcl differ
diff --git a/openKeyboard031/openKeyboard.mil b/openKeyboard031/openKeyboard.mil
new file mode 100644
index 0000000..c7e7861
--- /dev/null
+++ b/openKeyboard031/openKeyboard.mil
@@ -0,0 +1,1173 @@
+_enterPowerSave:
+ begin
+//openKeyboard.c,116 :: PORTA = 0;
+ PORTA <- 0
+//openKeyboard.c,117 :: INTCON.RBIE = 1; // enables PORTB on-change interrupt
+ INTCON <- INTCON | 8
+//openKeyboard.c,119 :: sleep;
+ asm: sleep;
+ end
+
+_exitPowerSave:
+ begin
+//openKeyboard.c,124 :: INTCON.RBIE = 0; // disables PORTB on-change interrupt
+ INTCON <- INTCON & -9
+ end
+
+_setupUsart:
+ begin
+//openKeyboard.c,128 :: switch(br){ // done so, because you can't call USART_Init(variable); but only USART_Init(literal);
+ goto L_setupUsart_0
+//openKeyboard.c,129 :: case BAUDRATE_300: USART_Init(300);
+L_setupUsart_2:
+ SPBRG <- 207
+ asm: BCF TXSTA, BRGH
+ CALL _Usart_Init
+//openKeyboard.c,130 :: break;
+ goto L_setupUsart_1
+//openKeyboard.c,131 :: case BAUDRATE_1200: USART_Init(1200);
+L_setupUsart_3:
+ SPBRG <- 207
+ asm: BSF TXSTA, BRGH
+ CALL _Usart_Init
+//openKeyboard.c,132 :: break;
+ goto L_setupUsart_1
+//openKeyboard.c,133 :: case BAUDRATE_2400: USART_Init(2400);
+L_setupUsart_4:
+ SPBRG <- 103
+ asm: BSF TXSTA, BRGH
+ CALL _Usart_Init
+//openKeyboard.c,134 :: break;
+ goto L_setupUsart_1
+//openKeyboard.c,135 :: case BAUDRATE_4800: USART_Init(4800);
+L_setupUsart_5:
+ SPBRG <- 51
+ asm: BSF TXSTA, BRGH
+ CALL _Usart_Init
+//openKeyboard.c,136 :: break;
+ goto L_setupUsart_1
+//openKeyboard.c,137 :: case BAUDRATE_9600: USART_Init(9600);
+L_setupUsart_6:
+ SPBRG <- 25
+ asm: BSF TXSTA, BRGH
+ CALL _Usart_Init
+//openKeyboard.c,138 :: break;
+ goto L_setupUsart_1
+//openKeyboard.c,139 :: case BAUDRATE_19200: USART_Init(19200);
+L_setupUsart_7:
+ SPBRG <- 12
+ asm: BSF TXSTA, BRGH
+ CALL _Usart_Init
+//openKeyboard.c,140 :: break;
+ goto L_setupUsart_1
+//openKeyboard.c,141 :: case BAUDRATE_38400: USART_Init(38400);
+L_setupUsart_8:
+ SPBRG <- 6
+ asm: BSF TXSTA, BRGH
+ CALL _Usart_Init
+//openKeyboard.c,142 :: break;
+ goto L_setupUsart_1
+//openKeyboard.c,143 :: case BAUDRATE_57600: USART_Init(57600);
+L_setupUsart_9:
+ SPBRG <- 3
+ asm: BSF TXSTA, BRGH
+ CALL _Usart_Init
+//openKeyboard.c,144 :: break;
+ goto L_setupUsart_1
+//openKeyboard.c,145 :: case BAUDRATE_115200: USART_Init(115200);
+L_setupUsart_10:
+ SPBRG <- 1
+ asm: BSF TXSTA, BRGH
+ CALL _Usart_Init
+//openKeyboard.c,146 :: break;
+ goto L_setupUsart_1
+//openKeyboard.c,147 :: default: EEprom_write(CONFIG_BAUDRATE, BAUDRATE_4800); // if no config found, set a default 4800
+L_setupUsart_11:
+ FARG_EEprom_write+0 <- 1
+ FARG_EEprom_write+1 <- 4
+ CALL _EEprom_write
+//openKeyboard.c,148 :: br = BAUDRATE_4800;
+ FARG_setupUsart+0 <- 4
+//openKeyboard.c,149 :: USART_Init(4800);
+ SPBRG <- 51
+ asm: BSF TXSTA, BRGH
+ CALL _Usart_Init
+//openKeyboard.c,150 :: }
+ goto L_setupUsart_1
+L_setupUsart_0:
+ if ( FARG_setupUsart+0 = 1) then goto L_setupUsart_2
+ if ( FARG_setupUsart+0 = 2) then goto L_setupUsart_3
+ if ( FARG_setupUsart+0 = 3) then goto L_setupUsart_4
+ if ( FARG_setupUsart+0 = 4) then goto L_setupUsart_5
+ if ( FARG_setupUsart+0 = 5) then goto L_setupUsart_6
+ if ( FARG_setupUsart+0 = 6) then goto L_setupUsart_7
+ if ( FARG_setupUsart+0 = 7) then goto L_setupUsart_8
+ if ( FARG_setupUsart+0 = 8) then goto L_setupUsart_9
+ if ( FARG_setupUsart+0 = 9) then goto L_setupUsart_10
+ goto L_setupUsart_11
+L_setupUsart_1:
+//openKeyboard.c,151 :: baudrate = br;
+ _baudrate <- FARG_setupUsart+0
+ end
+
+_turnBacklightOn:
+ begin
+//openKeyboard.c,155 :: timer = lightFadeOffTime;
+ _timer <- _lightFadeOffTime
+//openKeyboard.c,156 :: if (!pwmRunning) {
+ if (_pwmRunning) then goto L_turnBacklightOn_12
+//openKeyboard.c,157 :: PWM1_Start();
+ CALL _PWM1_Start
+//openKeyboard.c,158 :: PWM2_Start();
+ CALL _PWM2_Start
+//openKeyboard.c,159 :: pwmRunning = 1;
+ _pwmRunning <- 1
+//openKeyboard.c,160 :: }
+L_turnBacklightOn_12:
+//openKeyboard.c,161 :: PWM1_Change_Duty(lightStrenght);
+ FARG_PWM1_Change_Duty+0 <- _lightStrenght
+ CALL _PWM1_Change_Duty
+//openKeyboard.c,162 :: PWM2_Change_Duty(lightStrenght);
+ FARG_PWM2_Change_Duty+0 <- _lightStrenght
+ CALL _PWM2_Change_Duty
+ end
+
+_nop:
+ begin
+ end
+
+_lightFade:
+ begin
+//openKeyboard.c,171 :: if (newlyPressd) {
+ if (!_newlyPressd) then goto L_lightFade_13
+//openKeyboard.c,172 :: turnBacklightOn();
+ CALL _turnBacklightOn
+//openKeyboard.c,173 :: return;
+ return
+//openKeyboard.c,174 :: }
+L_lightFade_13:
+//openKeyboard.c,176 :: if (timer>0) timer --;
+ if ( _timer <= 0) then goto L_lightFade_14
+ _timer <- _timer - 1
+ _timer <- _timer
+ goto L_lightFade_15
+L_lightFade_14:
+//openKeyboard.c,180 :: PORTC = 255;
+ PORTC <- 255
+//openKeyboard.c,181 :: pwmRunning = 0;
+ _pwmRunning <- 0
+//openKeyboard.c,182 :: enterPowerSave();
+ CALL _enterPowerSave
+//openKeyboard.c,183 :: }
+L_lightFade_15:
+//openKeyboard.c,185 :: if (timer<(~lightStrenght)){
+ STACK_1 <- ~_lightStrenght
+ if ( _timer >= STACK_1) then goto L_lightFade_16
+//openKeyboard.c,186 :: PWM1_Change_Duty(~((unsigned char)timer));
+ FARG_PWM1_Change_Duty+0 <- ~_timer
+ FARG_PWM1_Change_Duty+0 <- FARG_PWM1_Change_Duty+0
+ CALL _PWM1_Change_Duty
+//openKeyboard.c,187 :: PWM2_Change_Duty(~((unsigned char)timer));
+ FARG_PWM2_Change_Duty+0 <- ~_timer
+ FARG_PWM2_Change_Duty+0 <- FARG_PWM2_Change_Duty+0
+ CALL _PWM2_Change_Duty
+//openKeyboard.c,188 :: }
+L_lightFade_16:
+ end
+
+_setupLightMode:
+ begin
+//openKeyboard.c,194 :: if (pwmRunning){
+ if (!_pwmRunning) then goto L_setupLightMode_17
+//openKeyboard.c,195 :: PWM1_Stop();
+ CALL _PWM1_Stop
+//openKeyboard.c,196 :: PWM2_Stop();
+ CALL _PWM2_Stop
+//openKeyboard.c,197 :: }
+L_setupLightMode_17:
+//openKeyboard.c,199 :: switch (lm){
+ goto L_setupLightMode_18
+//openKeyboard.c,200 :: case LIGHTMODE_ALWAYSOFF: lightHandler = &nop;
+L_setupLightMode_20:
+ _lightHandler <- 0
+//openKeyboard.c,201 :: lightStrenght = 0xFF;
+ _lightStrenght <- 255
+//openKeyboard.c,202 :: lightMode = LIGHTMODE_ALWAYSOFF;
+ _lightMode <- 0
+//openKeyboard.c,203 :: break;
+ goto L_setupLightMode_19
+//openKeyboard.c,205 :: case LIGHTMODE_ALWAYSON: lightHandler = &nop;
+L_setupLightMode_21:
+ _lightHandler <- 0
+//openKeyboard.c,206 :: turnBacklightOn();
+ CALL _turnBacklightOn
+//openKeyboard.c,207 :: lightMode = LIGHTMODE_ALWAYSON;
+ _lightMode <- 1
+//openKeyboard.c,208 :: break;
+ goto L_setupLightMode_19
+//openKeyboard.c,210 :: case LIGHTMODE_FADE: lightHandler = &lightFade;
+L_setupLightMode_22:
+ _lightHandler <- 0
+//openKeyboard.c,211 :: turnBacklightOn();
+ CALL _turnBacklightOn
+//openKeyboard.c,212 :: lightStrenght = 0x80; // restore middle luminosity
+ _lightStrenght <- 128
+//openKeyboard.c,213 :: lightMode = LIGHTMODE_FADE;
+ _lightMode <- 2
+//openKeyboard.c,214 :: break;
+ goto L_setupLightMode_19
+//openKeyboard.c,216 :: default : EEprom_write(CONFIG_LIGHTMODE, LIGHTMODE_ALWAYSOFF);
+L_setupLightMode_23:
+ FARG_EEprom_write+0 <- 3
+ FARG_EEprom_write+1 <- 0
+ CALL _EEprom_write
+//openKeyboard.c,217 :: lightMode = LIGHTMODE_ALWAYSOFF;
+ _lightMode <- 0
+//openKeyboard.c,218 :: lightHandler = &nop;
+ _lightHandler <- 0
+//openKeyboard.c,219 :: lightStrenght = 0xFF;
+ _lightStrenght <- 255
+//openKeyboard.c,220 :: }
+ goto L_setupLightMode_19
+L_setupLightMode_18:
+ if ( FARG_setupLightMode+0 = 0) then goto L_setupLightMode_20
+ if ( FARG_setupLightMode+0 = 1) then goto L_setupLightMode_21
+ if ( FARG_setupLightMode+0 = 2) then goto L_setupLightMode_22
+ goto L_setupLightMode_23
+L_setupLightMode_19:
+//openKeyboard.c,222 :: PORTC = 255;
+ PORTC <- 255
+//openKeyboard.c,225 :: if (lightMode != LIGHTMODE_ALWAYSOFF) {
+ if ( _lightMode = 0) then goto L_setupLightMode_24
+//openKeyboard.c,226 :: PWM1_Init(40000);
+ asm: MOVLW 24
+ asm: MOVWF PR2
+ CALL _PWM1_Init
+//openKeyboard.c,227 :: PWM1_Change_Duty(lightStrenght);
+ FARG_PWM1_Change_Duty+0 <- _lightStrenght
+ CALL _PWM1_Change_Duty
+//openKeyboard.c,228 :: PWM1_Start();
+ CALL _PWM1_Start
+//openKeyboard.c,230 :: PWM2_Init(40000);
+ asm: MOVLW 24
+ asm: MOVWF PR2
+ CALL _PWM2_Init
+//openKeyboard.c,231 :: PWM2_Change_Duty(lightStrenght);
+ FARG_PWM2_Change_Duty+0 <- _lightStrenght
+ CALL _PWM2_Change_Duty
+//openKeyboard.c,232 :: PWM2_Start();
+ CALL _PWM2_Start
+//openKeyboard.c,234 :: pwmRunning = 1;
+ _pwmRunning <- 1
+//openKeyboard.c,235 :: }
+L_setupLightMode_24:
+ end
+
+_doScan:
+ begin
+//openKeyboard.c,239 :: unsigned char sc = 0;
+ doScan_sc_L0 <- 0
+//openKeyboard.c,241 :: newlyPressd = 0;
+ _newlyPressd <- 0
+//openKeyboard.c,243 :: for (AMask=1; AMask<128; AMask<<=1){
+ _AMask <- 1
+L_doScan_25:
+ if ( _AMask >= 128) then goto L_doScan_26
+//openKeyboard.c,245 :: oldData[sc] = data[sc]; // save old data
+ STACK_1 <- 0 + doScan_sc_L0
+ FSR <- 0 + doScan_sc_L0
+ STACK_0 <- *FSR
+ *STACK_1 <- STACK_0
+//openKeyboard.c,247 :: PORTA = ~AMask; // put a 0 on the line we want to inspect
+ PORTA <- ~_AMask
+ PORTA <- PORTA
+//openKeyboard.c,248 :: data[sc] = PORTB; // read PORTB (pulled up)...if a line goes to 0, bingo!
+ STACK_0 <- 0 + doScan_sc_L0
+ *STACK_0 <- PORTB
+//openKeyboard.c,249 :: data[sc] = data[sc] | PORTB; // antibounce
+ STACK_1 <- 0 + doScan_sc_L0
+ STACK_0 <- *STACK_1
+ STACK_0 <- STACK_0 | PORTB
+ *STACK_1 <- STACK_0
+//openKeyboard.c,250 :: data[sc] = data[sc] | PORTB; // antibounce
+ STACK_1 <- 0 + doScan_sc_L0
+ STACK_0 <- *STACK_1
+ STACK_0 <- STACK_0 | PORTB
+ *STACK_1 <- STACK_0
+//openKeyboard.c,251 :: data[sc] = ~data[sc]; // return to positive logic
+ STACK_1 <- 0 + doScan_sc_L0
+ STACK_0 <- *STACK_1
+ STACK_0 <- ~STACK_0
+ *STACK_1 <- STACK_0
+//openKeyboard.c,253 :: justPressed[sc] = data[sc]&(~oldData[sc]);
+ STACK_2 <- 0 + doScan_sc_L0
+ FSR <- 0 + doScan_sc_L0
+ STACK_1 <- *FSR
+ FSR <- 0 + doScan_sc_L0
+ STACK_0 <- *FSR
+ STACK_0 <- ~STACK_0
+ STACK_0 <- STACK_1 & STACK_0
+ *STACK_2 <- STACK_0
+//openKeyboard.c,255 :: newlyPressd = newlyPressd | justPressed[sc];
+ FSR <- 0 + doScan_sc_L0
+ STACK_0 <- *FSR
+ _newlyPressd <- _newlyPressd | STACK_0
+ _newlyPressd <- _newlyPressd
+//openKeyboard.c,257 :: sc++;
+ doScan_sc_L0 <- doScan_sc_L0 + 1
+ doScan_sc_L0 <- doScan_sc_L0
+//openKeyboard.c,258 :: }
+L_doScan_27:
+//openKeyboard.c,243 :: for (AMask=1; AMask<128; AMask<<=1){
+ STACK_0 <- 1
+ _AMask <- _AMask shl STACK_0 [Optimized To Dest]
+ _AMask <- _AMask
+//openKeyboard.c,258 :: }
+ goto L_doScan_25
+L_doScan_26:
+ end
+
+_serialSend:
+ begin
+//openKeyboard.c,263 :: unsigned char idx = 0;
+ serialSend_idx_L0 <- 0
+//openKeyboard.c,264 :: unsigned char sc = 0;
+ serialSend_sc_L0 <- 0
+//openKeyboard.c,266 :: for (AMask=1; AMask<128; AMask<<=1){
+ _AMask <- 1
+L_serialSend_28:
+ if ( _AMask >= 128) then goto L_serialSend_29
+//openKeyboard.c,267 :: for (BMask=1; BMask<128; BMask<<=1){
+ _BMask <- 1
+L_serialSend_31:
+ if ( _BMask >= 128) then goto L_serialSend_32
+//openKeyboard.c,268 :: if (justPressed[sc] & BMask) USART_Write(serialMap[alt][idx]);
+ FSR <- 0 + serialSend_sc_L0
+ STACK_0 <- *FSR
+ STACK_0 <- STACK_0 & _BMask
+ if (!STACK_0) then goto L_serialSend_34
+ STACK_0 <- 49 * _alt
+ STACK_0 <- 0 + STACK_0
+ STACK_0 <- STACK_0 + serialSend_idx_L0
+ FARG_Usart_Write+0 <- *STACK_0
+ FARG_Usart_Write+0 <- FARG_Usart_Write+0
+ CALL _Usart_Write
+L_serialSend_34:
+//openKeyboard.c,269 :: idx++;
+ serialSend_idx_L0 <- serialSend_idx_L0 + 1
+ serialSend_idx_L0 <- serialSend_idx_L0
+//openKeyboard.c,270 :: }
+L_serialSend_33:
+//openKeyboard.c,267 :: for (BMask=1; BMask<128; BMask<<=1){
+ STACK_0 <- 1
+ _BMask <- _BMask shl STACK_0 [Optimized To Dest]
+ _BMask <- _BMask
+//openKeyboard.c,270 :: }
+ goto L_serialSend_31
+L_serialSend_32:
+//openKeyboard.c,271 :: sc++;
+ serialSend_sc_L0 <- serialSend_sc_L0 + 1
+ serialSend_sc_L0 <- serialSend_sc_L0
+//openKeyboard.c,272 :: }
+L_serialSend_30:
+//openKeyboard.c,266 :: for (AMask=1; AMask<128; AMask<<=1){
+ STACK_0 <- 1
+ _AMask <- _AMask shl STACK_0 [Optimized To Dest]
+ _AMask <- _AMask
+//openKeyboard.c,272 :: }
+ goto L_serialSend_28
+L_serialSend_29:
+//openKeyboard.c,273 :: alt = alts[data[2]&1|((data[1]&1)<<1)|((data[0]&64)>>4)]; // next scan can use alt retrieved here
+ STACK_4 <- _data+2 & 1
+ STACK_3 <- _data+1 & 1
+ STACK_2 <- 1
+ STACK_0 <- STACK_3 shl STACK_2
+ STACK_4 <- STACK_4 | STACK_0
+ STACK_3 <- _data & 64
+ STACK_2 <- 4
+ STACK_0 <- STACK_3 shr STACK_2
+ STACK_0 <- STACK_4 | STACK_0
+ FSR <- 0 + STACK_0
+ _alt <- *FSR
+ _alt <- _alt
+ end
+
+_scanSend:
+ begin
+//openKeyboard.c,277 :: unsigned char idx = 0;
+ scanSend_idx_L0 <- 0
+//openKeyboard.c,278 :: unsigned char sc = 0;
+ scanSend_sc_L0 <- 0
+//openKeyboard.c,279 :: unsigned char bs = 0;
+ scanSend_bs_L0 <- 0
+//openKeyboard.c,281 :: for (AMask=1; AMask<128; AMask<<=1){
+ _AMask <- 1
+L_scanSend_35:
+ if ( _AMask >= 128) then goto L_scanSend_36
+//openKeyboard.c,282 :: somethingChanged = data[sc] ^ oldData[sc];
+ FSR <- 0 + scanSend_sc_L0
+ _somethingChanged <- *FSR
+ FSR <- 0 + scanSend_sc_L0
+ STACK_0 <- *FSR
+ _somethingChanged <- _somethingChanged ^ STACK_0
+ _somethingChanged <- _somethingChanged
+//openKeyboard.c,283 :: bs = 0;
+ scanSend_bs_L0 <- 0
+//openKeyboard.c,284 :: for (BMask=1; BMask<128; BMask<<=1){
+ _BMask <- 1
+L_scanSend_38:
+ if ( _BMask >= 128) then goto L_scanSend_39
+//openKeyboard.c,285 :: if (someThingChanged & BMask)
+ STACK_0 <- _somethingChanged & _BMask
+ if (!STACK_0) then goto L_scanSend_41
+//openKeyboard.c,286 :: USART_Write(scanMap[idx] | (((data[sc]&BMask)>>bs)<<6)); // | 64 if pressed
+ STACK_0 <- 0 + scanSend_idx_L0
+ FARG_Usart_Write+0 <- *STACK_0
+ FSR <- 0 + scanSend_sc_L0
+ STACK_0 <- *FSR
+ STACK_2 <- STACK_0 & _BMask
+ STACK_0 <- scanSend_bs_L0
+ STACK_3 <- STACK_2 shr STACK_0
+ STACK_2 <- 6
+ STACK_0 <- STACK_3 shl STACK_2 [Optimized To Dest]
+ FARG_Usart_Write+0 <- FARG_Usart_Write+0 | STACK_0 [Optimized To Dest]
+ FARG_Usart_Write+0 <- FARG_Usart_Write+0
+ CALL _Usart_Write
+L_scanSend_41:
+//openKeyboard.c,287 :: bs++;
+ scanSend_bs_L0 <- scanSend_bs_L0 + 1
+ scanSend_bs_L0 <- scanSend_bs_L0
+//openKeyboard.c,288 :: idx++;
+ scanSend_idx_L0 <- scanSend_idx_L0 + 1
+ scanSend_idx_L0 <- scanSend_idx_L0
+//openKeyboard.c,289 :: }
+L_scanSend_40:
+//openKeyboard.c,284 :: for (BMask=1; BMask<128; BMask<<=1){
+ STACK_0 <- 1
+ _BMask <- _BMask shl STACK_0 [Optimized To Dest]
+ _BMask <- _BMask
+//openKeyboard.c,289 :: }
+ goto L_scanSend_38
+L_scanSend_39:
+//openKeyboard.c,290 :: sc++;
+ scanSend_sc_L0 <- scanSend_sc_L0 + 1
+ scanSend_sc_L0 <- scanSend_sc_L0
+//openKeyboard.c,291 :: }
+L_scanSend_37:
+//openKeyboard.c,281 :: for (AMask=1; AMask<128; AMask<<=1){
+ STACK_0 <- 1
+ _AMask <- _AMask shl STACK_0 [Optimized To Dest]
+ _AMask <- _AMask
+//openKeyboard.c,291 :: }
+ goto L_scanSend_35
+L_scanSend_36:
+ end
+
+_ps2Send:
+ begin
+ end
+
+_setupSendMode:
+ begin
+//openKeyboard.c,299 :: switch (sm){
+ goto L_setupSendMode_42
+//openKeyboard.c,300 :: case SENDMODE_SCAN : send = &scanSend;
+L_setupSendMode_44:
+ _send <- 0
+//openKeyboard.c,301 :: sendMode = SENDMODE_SCAN;
+ _sendMode <- 1
+//openKeyboard.c,302 :: break;
+ goto L_setupSendMode_43
+//openKeyboard.c,304 :: case SENDMODE_SERIAL: send = &serialSend;
+L_setupSendMode_45:
+ _send <- 0
+//openKeyboard.c,305 :: sendMode = SENDMODE_SERIAL;
+ _sendMode <- 0
+//openKeyboard.c,306 :: break;
+ goto L_setupSendMode_43
+//openKeyboard.c,312 :: default : send = &serialSend;
+L_setupSendMode_46:
+ _send <- 0
+//openKeyboard.c,313 :: EEprom_write(CONFIG_SENDMODE, SENDMODE_SERIAL);
+ FARG_EEprom_write+0 <- 2
+ FARG_EEprom_write+1 <- 0
+ CALL _EEprom_write
+//openKeyboard.c,314 :: sendMode = SENDMODE_SERIAL;
+ _sendMode <- 0
+//openKeyboard.c,315 :: }
+ goto L_setupSendMode_43
+L_setupSendMode_42:
+ if ( FARG_setupSendMode+0 = 1) then goto L_setupSendMode_44
+ if ( FARG_setupSendMode+0 = 0) then goto L_setupSendMode_45
+ goto L_setupSendMode_46
+L_setupSendMode_43:
+ end
+
+_config:
+ begin
+//openKeyboard.c,319 :: timer = lightFadeOffTime;
+ _timer <- _lightFadeOffTime
+//openKeyboard.c,321 :: if ((data[1]&4)&&(lightStrenght<0xff)) { // <
+ if () then goto L_config_49
+ if ( _lightStrenght >= 255) then goto L_config_49
+L352_ex_L_config_49:
+//openKeyboard.c,322 :: lightStrenght++;
+ _lightStrenght <- _lightStrenght + 1
+ _lightStrenght <- _lightStrenght
+//openKeyboard.c,323 :: PWM1_Change_Duty(lightStrenght);
+ FARG_PWM1_Change_Duty+0 <- _lightStrenght
+ CALL _PWM1_Change_Duty
+//openKeyboard.c,324 :: PWM2_Change_Duty(lightStrenght);
+ FARG_PWM2_Change_Duty+0 <- _lightStrenght
+ CALL _PWM2_Change_Duty
+//openKeyboard.c,325 :: if (lightMode==LIGHTMODE_ALWAYSOFF) lightMode = LIGHTMODE_FADE;
+ if ( _lightMode != 0) then goto L_config_50
+ _lightMode <- 2
+L_config_50:
+//openKeyboard.c,326 :: } // decrease light strenght
+L_config_49:
+//openKeyboard.c,328 :: if ((data[1]&64)&&(lightStrenght>0)) { // >
+ if () then goto L_config_53
+ if ( _lightStrenght <= 0) then goto L_config_53
+L374_ex_L_config_53:
+//openKeyboard.c,329 :: lightStrenght--;
+ _lightStrenght <- _lightStrenght - 1
+ _lightStrenght <- _lightStrenght
+//openKeyboard.c,330 :: PWM1_Change_Duty(lightStrenght);
+ FARG_PWM1_Change_Duty+0 <- _lightStrenght
+ CALL _PWM1_Change_Duty
+//openKeyboard.c,331 :: PWM2_Change_Duty(lightStrenght);
+ FARG_PWM2_Change_Duty+0 <- _lightStrenght
+ CALL _PWM2_Change_Duty
+//openKeyboard.c,332 :: if (lightMode==LIGHTMODE_ALWAYSOFF) lightMode = LIGHTMODE_FADE;
+ if ( _lightMode != 0) then goto L_config_54
+ _lightMode <- 2
+L_config_54:
+//openKeyboard.c,333 :: } // increase light strenght
+L_config_53:
+//openKeyboard.c,336 :: if (justPressed[5]&1){ // 1
+ STACK_0 <- _justPressed+5 & 1
+ if (!STACK_0) then goto L_config_55
+//openKeyboard.c,340 :: setupLightMode(LIGHTMODE_FADE);
+ FARG_setupLightMode+0 <- 2
+ CALL _setupLightMode
+//openKeyboard.c,341 :: lightFadeOffTime = 2<<8;
+ _lightFadeOffTime <- 512
+//openKeyboard.c,343 :: }
+L_config_55:
+//openKeyboard.c,345 :: if (justPressed[5]&2){ // 2
+ if () then goto L_config_56
+//openKeyboard.c,346 :: if (data[1]&1)
+ STACK_0 <- _data+1 & 1
+ if (STACK_0) then goto L_config_58
+//openKeyboard.c,347 :: ;//setupUsart(BAUDRATE_300); //all setupUsart commented out are to save code words space...otherwise i'm running into demo limit
+L_config_57:
+//openKeyboard.c,349 :: setupLightMode(LIGHTMODE_FADE);
+ FARG_setupLightMode+0 <- 2
+ CALL _setupLightMode
+//openKeyboard.c,350 :: lightFadeOffTime = 4<<8; // more or less 5 sec
+ _lightFadeOffTime <- 1024
+//openKeyboard.c,351 :: }
+L_config_58:
+//openKeyboard.c,352 :: }
+L_config_56:
+//openKeyboard.c,354 :: if (justPressed[5]&4){ // 3
+ if () then goto L_config_59
+//openKeyboard.c,355 :: if (data[1]&1)
+ STACK_0 <- _data+1 & 1
+ if (STACK_0) then goto L_config_61
+//openKeyboard.c,356 :: ;//setupUsart(BAUDRATE_1200);
+L_config_60:
+//openKeyboard.c,358 :: setupLightMode(LIGHTMODE_FADE);
+ FARG_setupLightMode+0 <- 2
+ CALL _setupLightMode
+//openKeyboard.c,359 :: lightFadeOffTime = 8<<8;
+ _lightFadeOffTime <- 2048
+//openKeyboard.c,360 :: }
+L_config_61:
+//openKeyboard.c,361 :: }
+L_config_59:
+//openKeyboard.c,363 :: if (justPressed[5]&16){ // 4
+ if () then goto L_config_62
+//openKeyboard.c,364 :: if (data[1]&1)
+ STACK_0 <- _data+1 & 1
+ if (STACK_0) then goto L_config_64
+//openKeyboard.c,365 :: ;//setupUsart(BAUDRATE_2400);
+L_config_63:
+//openKeyboard.c,367 :: setupLightMode(LIGHTMODE_FADE);
+ FARG_setupLightMode+0 <- 2
+ CALL _setupLightMode
+//openKeyboard.c,368 :: lightFadeOffTime = 16<<8;
+ _lightFadeOffTime <- 4096
+//openKeyboard.c,369 :: }
+L_config_64:
+//openKeyboard.c,370 :: }
+L_config_62:
+//openKeyboard.c,372 :: if (justPressed[5]&8){ // 5
+ if () then goto L_config_65
+//openKeyboard.c,373 :: if (data[1]&1)
+ STACK_0 <- _data+1 & 1
+ if (!STACK_0) then goto L_config_66
+//openKeyboard.c,374 :: setupUsart(BAUDRATE_4800);
+ FARG_setupUsart+0 <- 4
+ CALL _setupUsart
+ goto L_config_67
+L_config_66:
+//openKeyboard.c,376 :: setupLightMode(LIGHTMODE_FADE);
+ FARG_setupLightMode+0 <- 2
+ CALL _setupLightMode
+//openKeyboard.c,377 :: lightFadeOffTime = 32<<8;
+ _lightFadeOffTime <- 8192
+//openKeyboard.c,378 :: }
+L_config_67:
+//openKeyboard.c,379 :: }
+L_config_65:
+//openKeyboard.c,381 :: if (justPressed[5]&32){ // 6
+ if () then goto L_config_68
+//openKeyboard.c,382 :: if (data[1]&1)
+ STACK_0 <- _data+1 & 1
+ if (!STACK_0) then goto L_config_69
+//openKeyboard.c,383 :: setupUsart(BAUDRATE_9600);
+ FARG_setupUsart+0 <- 5
+ CALL _setupUsart
+ goto L_config_70
+L_config_69:
+//openKeyboard.c,385 :: setupLightMode(LIGHTMODE_FADE);
+ FARG_setupLightMode+0 <- 2
+ CALL _setupLightMode
+//openKeyboard.c,386 :: lightFadeOffTime = 64<<8;
+ _lightFadeOffTime <- 16384
+//openKeyboard.c,387 :: }
+L_config_70:
+//openKeyboard.c,388 :: }
+L_config_68:
+//openKeyboard.c,390 :: if (justPressed[5]&64){ // 7
+ if () then goto L_config_71
+//openKeyboard.c,391 :: if (data[1]&1)
+ STACK_0 <- _data+1 & 1
+ if (STACK_0) then goto L_config_73
+//openKeyboard.c,392 :: ;//setupUsart(BAUDRATE_19200);
+L_config_72:
+//openKeyboard.c,394 :: setupLightMode(LIGHTMODE_FADE);
+ FARG_setupLightMode+0 <- 2
+ CALL _setupLightMode
+//openKeyboard.c,395 :: lightFadeOffTime = 128<<8;
+ _lightFadeOffTime <- 32768
+//openKeyboard.c,396 :: }
+L_config_73:
+//openKeyboard.c,397 :: }
+L_config_71:
+//openKeyboard.c,399 :: if (justPressed[0]&1){ // 8
+ STACK_0 <- _justPressed & 1
+ if (!STACK_0) then goto L_config_74
+//openKeyboard.c,400 :: if (data[1]&1)
+ STACK_0 <- _data+1 & 1
+ if (STACK_0) then goto L_config_76
+//openKeyboard.c,401 :: ;//setupUsart(BAUDRATE_38400);
+L_config_75:
+//openKeyboard.c,403 :: setupLightMode(LIGHTMODE_FADE);
+ FARG_setupLightMode+0 <- 2
+ CALL _setupLightMode
+//openKeyboard.c,404 :: lightFadeOffTime = 255<<8;
+ _lightFadeOffTime <- 65280
+//openKeyboard.c,405 :: }
+L_config_76:
+//openKeyboard.c,406 :: }
+L_config_74:
+//openKeyboard.c,408 :: if (justPressed[0]&2){ // 9
+ if () then goto L_config_77
+//openKeyboard.c,409 :: if (data[1]&1)
+ STACK_0 <- _data+1 & 1
+ if (STACK_0) then goto L_config_79
+//openKeyboard.c,410 :: ;//setupUsart(BAUDRATE_57600);
+L_config_78:
+//openKeyboard.c,412 :: setupLightMode(LIGHTMODE_ALWAYSON);
+ FARG_setupLightMode+0 <- 1
+ CALL _setupLightMode
+L_config_79:
+//openKeyboard.c,413 :: }
+L_config_77:
+//openKeyboard.c,415 :: if (justPressed[0]&4){ // 0
+ if () then goto L_config_80
+//openKeyboard.c,416 :: if (data[1]&1)
+ STACK_0 <- _data+1 & 1
+ if (STACK_0) then goto L_config_82
+//openKeyboard.c,417 :: ;//setupUsart(BAUDRATE_115200);
+L_config_81:
+//openKeyboard.c,419 :: setupLightMode(LIGHTMODE_ALWAYSOFF);
+ FARG_setupLightMode+0 <- 0
+ CALL _setupLightMode
+L_config_82:
+//openKeyboard.c,420 :: }
+L_config_80:
+//openKeyboard.c,422 :: if (justPressed[3]&1){ // A
+ STACK_0 <- _justPressed+3 & 1
+ if (!STACK_0) then goto L_config_83
+//openKeyboard.c,423 :: setupSendMode(SENDMODE_SCAN);
+ FARG_setupSendMode+0 <- 1
+ CALL _setupSendMode
+//openKeyboard.c,424 :: }
+L_config_83:
+//openKeyboard.c,426 :: if (justPressed[3]&2){ // S
+ if () then goto L_config_84
+//openKeyboard.c,427 :: setupSendMode(SENDMODE_SERIAL);
+ FARG_setupSendMode+0 <- 0
+ CALL _setupSendMode
+//openKeyboard.c,428 :: }
+L_config_84:
+//openKeyboard.c,430 :: Delay_5ms();
+ CALL _Delay_5ms
+ end
+
+_saveConfig:
+ begin
+//openKeyboard.c,435 :: EEprom_write(CONFIG_BAUDRATE, baudrate);
+ FARG_EEprom_write+0 <- 1
+ FARG_EEprom_write+1 <- _baudrate
+ CALL _EEprom_write
+//openKeyboard.c,436 :: EEprom_write(CONFIG_SENDMODE, sendMode);
+ FARG_EEprom_write+0 <- 2
+ FARG_EEprom_write+1 <- _sendMode
+ CALL _EEprom_write
+//openKeyboard.c,437 :: EEprom_write(CONFIG_LIGHTMODE, lightMode);
+ FARG_EEprom_write+0 <- 3
+ FARG_EEprom_write+1 <- _lightMode
+ CALL _EEprom_write
+//openKeyboard.c,438 :: EEprom_write(CONFIG_LIGHTSTRENGTH, lightStrenght);
+ FARG_EEprom_write+0 <- 4
+ FARG_EEprom_write+1 <- _lightStrenght
+ CALL _EEprom_write
+//openKeyboard.c,439 :: EEprom_write(CONFIG_LIGHTFADEOFFTIME, lightFadeOffTime>>8);
+ FARG_EEprom_write+0 <- 5
+ STACK_4 <- 8
+ STACK_0 <- _lightFadeOffTime shr STACK_4
+ FARG_EEprom_write+1 <- STACK_0
+ CALL _EEprom_write
+ end
+
+_interrupt:
+ begin
+//openKeyboard.c,443 :: if (INTCON.RBIF) { // SOMETHING CHANGED ON PORTB...
+ if (!INTCON) then goto L_interrupt_85
+//openKeyboard.c,444 :: exitPowerSave(); // just wakeup and so some scanning...
+ CALL _exitPowerSave
+//openKeyboard.c,445 :: INTCON.RBIF = 0; // clear intr flag
+ INTCON <- INTCON & -2
+//openKeyboard.c,446 :: }
+L_interrupt_85:
+ end
+
+_main:
+ begin
+//openKeyboard.c,455 :: OSCCON = 0x67; // 01100111 - 0110 stands for 4Mhz internal clock
+ OSCCON <- 103
+//openKeyboard.c,457 :: ANSEL = 0; // Configure AN pins as digital I/O
+ ANSEL <- 0
+//openKeyboard.c,458 :: ANSELH = 0;
+ ANSELH <- 0
+//openKeyboard.c,460 :: PORTA = 0; // init port A
+ PORTA <- 0
+//openKeyboard.c,461 :: TRISA = 0; // 1 = input
+ TRISA <- 0
+//openKeyboard.c,463 :: PORTB = 0; // initialize PORTB
+ PORTB <- 0
+//openKeyboard.c,464 :: TRISB = 255; // designate PORTB as all input
+ TRISB <- 255
+//openKeyboard.c,466 :: PORTC = 0; // initialize PORTC
+ PORTC <- 0
+//openKeyboard.c,467 :: TRISC = 0; // designate PORTB 0-7 as output
+ TRISC <- 0
+//openKeyboard.c,469 :: OPTION_REG = 0; // pull-ups enabled on PORTB....no external pull-downs
+ OPTION_REG <- 0
+//openKeyboard.c,474 :: INTCON.RBIE = 0; // disables PORTB on-change interrupt
+ INTCON <- INTCON & -9
+//openKeyboard.c,475 :: INTCON.RBIF = 0; // clear PORTB mismatch values
+ INTCON <- INTCON & -2
+//openKeyboard.c,477 :: IOCB = 127; // pin 0-6 of PORTB configured to raise interrupt when changed
+ IOCB <- 127
+//openKeyboard.c,479 :: PIE1 = 32; // RCIE = 1; enables EUSART on-receive interrupt
+ PIE1 <- 32
+//openKeyboard.c,481 :: INTCON.GIE = 1; // Global Interrupt Enable/disable
+ INTCON <- INTCON | 128
+//openKeyboard.c,484 :: Delay_ms(20); // required for eeprom_read to work correctly
+ asm: MOVLW 26
+ asm: MOVWF STACK_11
+ asm: MOVLW 255
+ asm: MOVWF STACK_10
+ asm: DECFSZ STACK_11,F
+ asm: GOTO $+2
+ asm: GOTO $+4
+ asm: DECFSZ STACK_10,F
+ asm: GOTO $-1
+ asm: GOTO $-5
+ asm: MOVLW 231
+ asm: MOVWF STACK_10
+ asm: DECFSZ STACK_10,F
+ asm: GOTO $-1
+ asm: nop
+//openKeyboard.c,485 :: sendMode = EEprom_read(CONFIG_SENDMODE);
+ FARG_EEprom_read+0 <- 2
+ CALL _EEprom_read
+ _sendMode <- STACK_0
+//openKeyboard.c,486 :: setupSendMode(sendMode);
+ FARG_setupSendMode+0 <- STACK_0
+ CALL _setupSendMode
+//openKeyboard.c,490 :: Delay_ms(20); // required for eeprom_read to work correctly
+ asm: MOVLW 26
+ asm: MOVWF STACK_11
+ asm: MOVLW 255
+ asm: MOVWF STACK_10
+ asm: DECFSZ STACK_11,F
+ asm: GOTO $+2
+ asm: GOTO $+4
+ asm: DECFSZ STACK_10,F
+ asm: GOTO $-1
+ asm: GOTO $-5
+ asm: MOVLW 231
+ asm: MOVWF STACK_10
+ asm: DECFSZ STACK_10,F
+ asm: GOTO $-1
+ asm: nop
+//openKeyboard.c,491 :: baudrate = EEprom_read(CONFIG_BAUDRATE);
+ FARG_EEprom_read+0 <- 1
+ CALL _EEprom_read
+ _baudrate <- STACK_0
+//openKeyboard.c,492 :: setupUsart(baudrate); // Initalize USART (xxxx baud rate, 1 stop bit, no parity...)
+ FARG_setupUsart+0 <- STACK_0
+ CALL _setupUsart
+//openKeyboard.c,495 :: Delay_ms(20); // required for eeprom_read to work correctly
+ asm: MOVLW 26
+ asm: MOVWF STACK_11
+ asm: MOVLW 255
+ asm: MOVWF STACK_10
+ asm: DECFSZ STACK_11,F
+ asm: GOTO $+2
+ asm: GOTO $+4
+ asm: DECFSZ STACK_10,F
+ asm: GOTO $-1
+ asm: GOTO $-5
+ asm: MOVLW 231
+ asm: MOVWF STACK_10
+ asm: DECFSZ STACK_10,F
+ asm: GOTO $-1
+ asm: nop
+//openKeyboard.c,496 :: lightFadeOffTime = EEprom_read(CONFIG_LIGHTFADEOFFTIME) << 8;
+ FARG_EEprom_read+0 <- 5
+ CALL _EEprom_read
+ STACK_1 <- 8
+ _lightFadeOffTime <- STACK_0 shl STACK_1
+ _lightFadeOffTime <- _lightFadeOffTime
+//openKeyboard.c,497 :: lightStrenght = EEprom_read(CONFIG_LIGHTSTRENGTH);
+ FARG_EEprom_read+0 <- 4
+ CALL _EEprom_read
+ _lightStrenght <- STACK_0
+//openKeyboard.c,499 :: Delay_ms(20); // required for eeprom_read to work correctly
+ asm: MOVLW 26
+ asm: MOVWF STACK_11
+ asm: MOVLW 255
+ asm: MOVWF STACK_10
+ asm: DECFSZ STACK_11,F
+ asm: GOTO $+2
+ asm: GOTO $+4
+ asm: DECFSZ STACK_10,F
+ asm: GOTO $-1
+ asm: GOTO $-5
+ asm: MOVLW 231
+ asm: MOVWF STACK_10
+ asm: DECFSZ STACK_10,F
+ asm: GOTO $-1
+ asm: nop
+//openKeyboard.c,500 :: lightMode = EEprom_read(CONFIG_LIGHTMODE);
+ FARG_EEprom_read+0 <- 3
+ CALL _EEprom_read
+ _lightMode <- STACK_0
+//openKeyboard.c,501 :: setUpLightMode(lightMode);
+ FARG_setupLightMode+0 <- STACK_0
+ CALL _setupLightMode
+//openKeyboard.c,503 :: do {
+L_main_86:
+//openKeyboard.c,505 :: doScan();
+ CALL _doScan
+//openKeyboard.c,507 :: if (data[1]&2) {
+ if () then goto L_main_88
+//openKeyboard.c,508 :: config(); // people button pressed -> config mode
+ CALL _config
+//openKeyboard.c,509 :: }else{
+ goto L_main_89
+L_main_88:
+//openKeyboard.c,510 :: if (oldData[1]&2) saveConfig(); // ppl btn just released... save config
+ if () then goto L_main_90
+ CALL _saveConfig
+L_main_90:
+//openKeyboard.c,511 :: send();
+ CALL (*_send)
+//openKeyboard.c,512 :: }
+L_main_89:
+//openKeyboard.c,513 :: lightHandler();
+ CALL (*_lightHandler)
+//openKeyboard.c,514 :: Delay_80us(); // without this delay, pic hangs on sleep...
+ CALL _Delay_80us
+//openKeyboard.c,515 :: } while (1); // endless loop
+ goto L_main_86
+ end
+
+table___scanMap:
+ begin
+//openKeyboard.c,39 :: const char scanMap[50] = { // i could output directly idx,
+ asm: RETLW 8
+ asm: RETLW 9
+ asm: RETLW 10
+ asm: RETLW 40
+ asm: RETLW 20
+ asm: RETLW 30
+ asm: RETLW 47
+ asm: RETLW 41
+ asm: RETLW 42
+ asm: RETLW 43
+ asm: RETLW 39
+ asm: RETLW 44
+ asm: RETLW 38
+ asm: RETLW 45
+ asm: RETLW 31
+ asm: RETLW 32
+ asm: RETLW 33
+ asm: RETLW 35
+ asm: RETLW 34
+ asm: RETLW 36
+ asm: RETLW 37
+ asm: RETLW 21
+ asm: RETLW 22
+ asm: RETLW 23
+ asm: RETLW 25
+ asm: RETLW 24
+ asm: RETLW 26
+ asm: RETLW 27
+ asm: RETLW 11
+ asm: RETLW 12
+ asm: RETLW 13
+ asm: RETLW 15
+ asm: RETLW 14
+ asm: RETLW 16
+ asm: RETLW 17
+ asm: RETLW 1
+ asm: RETLW 2
+ asm: RETLW 3
+ asm: RETLW 5
+ asm: RETLW 4
+ asm: RETLW 6
+ asm: RETLW 7
+ asm: RETLW 28
+ asm: RETLW 18
+ asm: RETLW 19
+ asm: RETLW 0
+ asm: RETLW 0
+ asm: RETLW 29
+ asm: RETLW 46
+ asm: RETLW 0
+ end
+
+table___serialMap:
+ begin
+//openKeyboard.c,48 :: const char serialMap[4][49] = { // CHARACTER MAPPING MATRIX for "pure serial mode"
+ asm: RETLW 56
+ asm: RETLW 57
+ asm: RETLW 48
+ asm: RETLW 13
+ asm: RETLW 112
+ asm: RETLW 44
+ asm: RETLW 0
+ asm: RETLW 0
+ asm: RETLW 0
+ asm: RETLW 0
+ asm: RETLW 46
+ asm: RETLW 32
+ asm: RETLW 109
+ asm: RETLW 0
+ asm: RETLW 0
+ asm: RETLW 122
+ asm: RETLW 120
+ asm: RETLW 118
+ asm: RETLW 99
+ asm: RETLW 98
+ asm: RETLW 110
+ asm: RETLW 97
+ asm: RETLW 115
+ asm: RETLW 100
+ asm: RETLW 103
+ asm: RETLW 102
+ asm: RETLW 104
+ asm: RETLW 106
+ asm: RETLW 113
+ asm: RETLW 119
+ asm: RETLW 101
+ asm: RETLW 116
+ asm: RETLW 114
+ asm: RETLW 121
+ asm: RETLW 117
+ asm: RETLW 49
+ asm: RETLW 50
+ asm: RETLW 51
+ asm: RETLW 53
+ asm: RETLW 52
+ asm: RETLW 54
+ asm: RETLW 55
+ asm: RETLW 107
+ asm: RETLW 105
+ asm: RETLW 111
+ asm: RETLW 0
+ asm: RETLW 0
+ asm: RETLW 108
+ asm: RETLW 8
+ asm: RETLW 56
+ asm: RETLW 57
+ asm: RETLW 48
+ asm: RETLW 13
+ asm: RETLW 80
+ asm: RETLW 44
+ asm: RETLW 0
+ asm: RETLW 0
+ asm: RETLW 0
+ asm: RETLW 0
+ asm: RETLW 46
+ asm: RETLW 32
+ asm: RETLW 77
+ asm: RETLW 0
+ asm: RETLW 0
+ asm: RETLW 90
+ asm: RETLW 88
+ asm: RETLW 86
+ asm: RETLW 67
+ asm: RETLW 66
+ asm: RETLW 78
+ asm: RETLW 65
+ asm: RETLW 83
+ asm: RETLW 68
+ asm: RETLW 71
+ asm: RETLW 70
+ asm: RETLW 72
+ asm: RETLW 74
+ asm: RETLW 81
+ asm: RETLW 87
+ asm: RETLW 69
+ asm: RETLW 84
+ asm: RETLW 82
+ asm: RETLW 89
+ asm: RETLW 85
+ asm: RETLW 49
+ asm: RETLW 50
+ asm: RETLW 51
+ asm: RETLW 53
+ asm: RETLW 52
+ asm: RETLW 54
+ asm: RETLW 55
+ asm: RETLW 75
+ asm: RETLW 73
+ asm: RETLW 79
+ asm: RETLW 0
+ asm: RETLW 0
+ asm: RETLW 76
+ asm: RETLW 8
+ asm: RETLW 56
+ asm: RETLW 57
+ asm: RETLW 48
+ asm: RETLW 13
+ asm: RETLW 41
+ asm: RETLW 58
+ asm: RETLW 0
+ asm: RETLW 0
+ asm: RETLW 0
+ asm: RETLW 0
+ asm: RETLW 63
+ asm: RETLW 32
+ asm: RETLW 62
+ asm: RETLW 0
+ asm: RETLW 0
+ asm: RETLW 96
+ asm: RETLW 39
+ asm: RETLW 45
+ asm: RETLW 187
+ asm: RETLW 124
+ asm: RETLW 60
+ asm: RETLW 126
+ asm: RETLW 154
+ asm: RETLW 123
+ asm: RETLW 168
+ asm: RETLW 125
+ asm: RETLW 47
+ asm: RETLW 39
+ asm: RETLW 33
+ asm: RETLW 64
+ asm: RETLW 128
+ asm: RETLW 37
+ asm: RETLW 35
+ asm: RETLW 94
+ asm: RETLW 38
+ asm: RETLW 49
+ asm: RETLW 50
+ asm: RETLW 51
+ asm: RETLW 53
+ asm: RETLW 52
+ asm: RETLW 54
+ asm: RETLW 55
+ asm: RETLW 91
+ asm: RETLW 42
+ asm: RETLW 40
+ asm: RETLW 0
+ asm: RETLW 0
+ asm: RETLW 93
+ asm: RETLW 8
+ asm: RETLW 56
+ asm: RETLW 57
+ asm: RETLW 48
+ asm: RETLW 13
+ asm: RETLW 61
+ asm: RETLW 59
+ asm: RETLW 0
+ asm: RETLW 0
+ asm: RETLW 0
+ asm: RETLW 0
+ asm: RETLW 191
+ asm: RETLW 32
+ asm: RETLW 181
+ asm: RETLW 0
+ asm: RETLW 0
+ asm: RETLW 230
+ asm: RETLW 156
+ asm: RETLW 95
+ asm: RETLW 231
+ asm: RETLW 43
+ asm: RETLW 241
+ asm: RETLW 225
+ asm: RETLW 223
+ asm: RETLW 240
+ asm: RETLW 165
+ asm: RETLW 163
+ asm: RETLW 92
+ asm: RETLW 34
+ asm: RETLW 161
+ asm: RETLW 229
+ asm: RETLW 232
+ asm: RETLW 254
+ asm: RETLW 36
+ asm: RETLW 253
+ asm: RETLW 249
+ asm: RETLW 49
+ asm: RETLW 50
+ asm: RETLW 51
+ asm: RETLW 53
+ asm: RETLW 52
+ asm: RETLW 54
+ asm: RETLW 55
+ asm: RETLW 169
+ asm: RETLW 236
+ asm: RETLW 242
+ asm: RETLW 0
+ asm: RETLW 0
+ asm: RETLW 248
+ asm: RETLW 8
+ end
+
+GlobalIniopenKeyboard:
+ begin
+ end
+
diff --git a/openKeyboard031/openKeyboard.ppc b/openKeyboard031/openKeyboard.ppc
new file mode 100644
index 0000000..be37d14
--- /dev/null
+++ b/openKeyboard031/openKeyboard.ppc
@@ -0,0 +1,41 @@
+[DeviceName]
+Value=P16F883
+[DeviceClock]
+Value=4
+[MainUnit]
+Value=ADC_USART.c
+[DeviceFlags]
+Count=12
+Value0=_INTOSCIO = $3FFC
+Value1=_WDT_OFF = $3FF7
+Value2=_PWRTE_ON = $3FEF
+Value3=_MCLRE_OFF = $3FDF
+Value4=_CP_OFF = $3FFF
+Value5=_CPD_OFF = $3FFF
+Value6=_BOR_OFF = $3CFF
+Value7=_IESO_OFF = $3BFF
+Value8=_FCMEN_OFF = $37FF
+Value9=_LVP_OFF = $2FFF
+Value10=_DEBUG_OFF = $3FFF
+Value11=_WRT_OFF = $3FFF
+[BuildType]
+bType=0
+[ProjectFiles]
+Count=1
+Value0=openKeyboard.c
+[HeaderFiles]
+Count=0
+[ObjLibFiles]
+Count=0
+[PLDFiles]
+Count=0
+[EEPROMinfo]
+isused=0
+[SearchPath]
+Count=4
+Value0=C:\Programmi\Mikroelektronika\mikroC\Defs\
+Value1=C:\Programmi\Mikroelektronika\mikroC\Uses\p16\
+Value2=D:\DEVELOPMENT\PROJECTS\micros\openKeyboard\
+Value3=C:\Programmi\Mikroelektronika\mikroC\miei\
+[IncludePath]
+Count=0
diff --git a/openKeyboard031/openKeyboard_callertable.txt b/openKeyboard031/openKeyboard_callertable.txt
new file mode 100644
index 0000000..f96ba9f
--- /dev/null
+++ b/openKeyboard031/openKeyboard_callertable.txt
@@ -0,0 +1,87 @@
+interrupt
+ exitPowerSave
+main
+ ____DoICF
+ GlobalIniopenKeyboard
+ Delay_80us
+ serialSend
+ ____DoICP
+ Mul_16x16_U
+ ?table___serialMap
+ Usart_Write
+ scanSend
+ ____DoICP
+ ?table___scanMap
+ Usart_Write
+ lightFade
+ PWM2_Change_Duty
+ Mul_16x16_S
+ PWM1_Change_Duty
+ Mul_16x16_S
+ enterPowerSave
+ turnBacklightOn
+ PWM2_Change_Duty
+ Mul_16x16_S
+ PWM1_Change_Duty
+ Mul_16x16_S
+ PWM2_Start
+ PWM1_Start
+ nop
+ saveConfig
+ EEprom_write
+ config
+ Delay_5ms
+ setupSendMode
+ EEprom_write
+ setupUsart
+ Usart_Init
+ EEprom_write
+ setupLightMode
+ PWM2_Init
+ PWM1_Init
+ PWM2_Start
+ PWM2_Change_Duty
+ Mul_16x16_S
+ PWM1_Start
+ PWM1_Change_Duty
+ Mul_16x16_S
+ EEprom_write
+ turnBacklightOn
+ PWM2_Change_Duty
+ Mul_16x16_S
+ PWM1_Change_Duty
+ Mul_16x16_S
+ PWM2_Start
+ PWM1_Start
+ PWM2_Stop
+ PWM1_Stop
+ PWM2_Change_Duty
+ Mul_16x16_S
+ PWM1_Change_Duty
+ Mul_16x16_S
+ doScan
+ setupLightMode
+ PWM2_Init
+ PWM1_Init
+ PWM2_Start
+ PWM2_Change_Duty
+ Mul_16x16_S
+ PWM1_Start
+ PWM1_Change_Duty
+ Mul_16x16_S
+ EEprom_write
+ turnBacklightOn
+ PWM2_Change_Duty
+ Mul_16x16_S
+ PWM1_Change_Duty
+ Mul_16x16_S
+ PWM2_Start
+ PWM1_Start
+ PWM2_Stop
+ PWM1_Stop
+ setupUsart
+ Usart_Init
+ EEprom_write
+ setupSendMode
+ EEprom_write
+ EEprom_read