Intial commit with original files, docs and modified Linux source.

This commit is contained in:
Leander Hutton 2019-04-13 00:24:49 -04:00
commit 754b8ccb3a
111 changed files with 13099 additions and 0 deletions

87
IBM_M122_configs/m122_new.sc Executable file
View File

@ -0,0 +1,87 @@
macroblock
macro EXTRA_F4
PUSH_META SET_META RALT
PRESS TAB
POP_ALL_META
endmacro
macro EXTRA_F5
PUSH_META SET_META LCTRL
PRESS F1
POP_ALL_META
endmacro
macro EXTRA_F6
PUSH_META SET_META LCTRL
PRESS F2
POP_ALL_META
endmacro
macro LANG_4
PUSH_META CLEAR_META ALL
PRESS F
PRESS A
PRESS R
PRESS T
PRESS S
PRESS SPACE
POP_ALL_META
endmacro
endblock
remapblock
EXTRA_F1 LGUI
EXTRA_F2 ESC
EXTRA_F3 APP
# EXTRA_F4 UNASSIGNED
# EXTRA_F5 UNASSIGNED
# EXTRA_F6 RALT
EXTRA_F7 PRINTSCREEN
EXTRA_F8 MEDIA_PLAY_PAUSE
EXTRA_F9 MEDIA_NEXT_TRACK
EXTRA_F10 MEDIA_NEXT_TRACK
F13 MUTE
F14 VOLUME_DOWN
F15 VOLUME_UP
F17 MEDIA_PLAY_PAUSE
F18 MEDIA_PREV_TRACK
F19 MEDIA_NEXT_TRACK
EUROPE_1 BACKSLASH
ESC PAD_EQUALS
NUM_LOCK PAD_SLASH
SCROLL_LOCK PAD_ASTERIX
EXTRA_SYSRQ PAD_MINUS
PAD_ASTERIX PAD_PLUS
PAD_MINUS COMMA
PAD_PLUS PAD_ENTER
endblock
ifselect 1
macroblock
macro PAD_PERIOD
PUSH_META CLEAR_META ALL
MAKE LSHIFT
PRESS PERIOD
BREAK LSHIFT
POP_ALL_META
endmacro
endblock
remapblock
ESC A
NUM_LOCK B
SCROLL_LOCK C
EXTRA_SYSRQ D
PAD_ASTERIX E
PAD_MINUS F
PAD_PLUS PAD_ENTER
PAD_PERIOD PAD_PERIOD
endblock

194
docs/DT.html Normal file
View File

@ -0,0 +1,194 @@
<html>
<head>
<link rel="stylesheet" type="text/css" href="style2.css">
<title>XT/AT/PS2/Terminal to USB Converter with NKRO - Deskthority Thread Contents</title>
</head>
<body>
<script type="text/javascript" src="headermenu.js"></script>
<script type="text/javascript">navtabfn("DT")</script>
<noscript><div id=jswarn class=\"navtabs\">These docs work best with Javascript enabled!</div></noscript>
<h2>Deskthority Thread Contents</h2>
<hr>
<p>
</p>
<table>
<tr><th>Reply</th><th>Date</th><th>By</th><th>Post</th></tr>
<tr><td><a href="http://deskthority.net/post44332.html#p44332">0</a></td><td>22 Apr 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> This is my Teensy-based project which adapts XT, AT and some 122 key terminal keyboar ...</td></tr>
<tr><td><a href="http://deskthority.net/post44348.html#p44348">1</a></td><td>23 Apr 2012</td><td><span style="float:right;"><b>Maarten:</b></span></td><td> Oh nice work! Now all i need is a teensy </td></tr>
<tr><td><a href="http://deskthority.net/post44349.html#p44349">2</a></td><td>23 Apr 2012</td><td><span style="float:right;"><b>Kurrk:</b></span></td><td> This is a good opportunity to say thank you! I&#39;m using a XT model F with your convert ...</td></tr>
<tr><td><a href="http://deskthority.net/post44366.html#p44366">3</a></td><td>23 Apr 2012</td><td><span style="float:right;"><b>bhtooefr:</b></span></td><td> Congrats on getting 1.0 out, and thank you. This adapter is powering my favorite keyb ...</td></tr>
<tr><td><a href="http://deskthority.net/post44400.html#p44400">4</a></td><td>23 Apr 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Thanks people, you&#39;re welcome! I hope there aren&#39;t too many bugs discovered, so I can ...</td></tr>
<tr><td><a href="http://deskthority.net/post44450.html#p44450">5</a></td><td>23 Apr 2012</td><td><span style="float:right;"><b>litster:</b></span></td><td> Excellent converter! It is not just for IBM keyboards. It can make all your Filco key ...</td></tr>
<tr><td><a href="http://deskthority.net/post44452.html#p44452">6</a></td><td>23 Apr 2012</td><td><span style="float:right;"><b>RC-1140:</b></span></td><td> Yup, have to agree, this converter firmware is by far the best. I&#39;m using a teensy at ...</td></tr>
<tr><td><a href="http://deskthority.net/post44491.html#p44491">7</a></td><td>23 Apr 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> I probably will - I&#39;m a forum whore, I&#39;ll open my mouth wherever there are good posti ...</td></tr>
<tr><td><a href="http://deskthority.net/post44495.html#p44495">8</a></td><td>23 Apr 2012</td><td><span style="float:right;"><b>fruktstund:</b></span></td><td> This is a fantastic converter. Used it for an old BTC (I think it was BTC at least) k ...</td></tr>
<tr><td><a href="http://deskthority.net/post44499.html#p44499">9</a></td><td>23 Apr 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> It could just be a wiring error when you rebuilt it... is it rebuilt with the same co ...</td></tr>
<tr><td><a href="http://deskthority.net/post44500.html#p44500">10</a></td><td>23 Apr 2012</td><td><span style="float:right;"><b>fruktstund:</b></span></td><td> Yeah, it seems the most likely that it&#39;s a wiring error, even though that would mean ...</td></tr>
<tr><td><a href="http://deskthority.net/post44507.html#p44507">11</a></td><td>23 Apr 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> It&#39;s pretty unusual to actually kill anything (but it has been known). Although, it&#39;s ...</td></tr>
<tr><td><a href="http://deskthority.net/post44606.html#p44606">12</a></td><td>24 Apr 2012</td><td><span style="float:right;"><b>Grond:</b></span></td><td> Is there any way to build such a converter without soldering?</td></tr>
<tr><td><a href="http://deskthority.net/post44608.html#p44608">13</a></td><td>24 Apr 2012</td><td><span style="float:right;"><b>bhtooefr:</b></span></td><td> Yes, although it&#39;ll take having a Teensy with pins, and then having the right jumper ...</td></tr>
<tr><td><a href="http://deskthority.net/post44614.html#p44614">14</a></td><td>24 Apr 2012</td><td><span style="float:right;"><b>Grond:</b></span></td><td> I&#39;d like to make this converter for Model M terminal. Suppose I get a female RJ conne ...</td></tr>
<tr><td><a href="http://deskthority.net/post44616.html#p44616">15</a></td><td>24 Apr 2012</td><td><span style="float:right;"><b>bhtooefr:</b></span></td><td> You&#39;d probably need to solder the RJ connector. However, 122-key terminal Ms (if it&#39;s ...</td></tr>
<tr><td><a href="http://deskthority.net/post44627.html#p44627">16</a></td><td>24 Apr 2012</td><td><span style="float:right;"><b>Grond:</b></span></td><td> Yes it does! So what? Can I get a wire that goes from the six pin connector to the Te ...</td></tr>
<tr><td><a href="http://deskthority.net/post44653.html#p44653">17</a></td><td>24 Apr 2012</td><td><span style="float:right;"><b>bhtooefr:</b></span></td><td> You would need female jumper wires to go from the pins on the controller to the pins ...</td></tr>
<tr><td><a href="http://deskthority.net/post44657.html#p44657">18</a></td><td>24 Apr 2012</td><td><span style="float:right;"><b>Grond:</b></span></td><td> Like these?</td></tr>
<tr><td><a href="http://deskthority.net/post44661.html#p44661">19</a></td><td>24 Apr 2012</td><td><span style="float:right;"><b>bhtooefr:</b></span></td><td> That would work, yes.</td></tr>
<tr><td><a href="http://deskthority.net/post44679.html#p44679">20</a></td><td>24 Apr 2012</td><td><span style="float:right;"><b>Grond:</b></span></td><td> Thanks! </td></tr>
<tr><td><a href="http://deskthority.net/post45198.html#p45198">21</a></td><td>26 Apr 2012</td><td><span style="float:right;"><b>fruktstund:</b></span></td><td> I&#39;ve checked the wiring now and I&#39;m confident it&#39;s correctly done! I also tried it ou ...</td></tr>
<tr><td><a href="http://deskthority.net/post45204.html#p45204">22</a></td><td>27 Apr 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Hmm, I get about 0.6M&Icirc;&copy; measured on the Teensy, with no keyboard or USB attached. I&#39;m ...</td></tr>
<tr><td><a href="http://deskthority.net/post45393.html#p45393">23</a></td><td>28 Apr 2012</td><td><span style="float:right;"><b>fruktstund:</b></span></td><td> I seem to get approximately the same measurements as you Soarer, so this is beginning ...</td></tr>
<tr><td><a href="http://deskthority.net/post45409.html#p45409">24</a></td><td>28 Apr 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Well, it doesn&#39;t mean the Teensy isn&#39;t damaged, but it seems to be basically OK. What ...</td></tr>
<tr><td><a href="http://deskthority.net/post46338.html#p46338">25</a></td><td>05 May 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> fruktstund - did you spot anything?</td></tr>
<tr><td><a href="http://deskthority.net/post46801.html#p46801">26</a></td><td>08 May 2012</td><td><span style="float:right;"><b>nfc:</b></span></td><td> Finally had the opportunity to test it... a masterpiece. Info research, write phase, ...</td></tr>
<tr><td><a href="http://deskthority.net/post46815.html#p46815">27</a></td><td>09 May 2012</td><td><span style="float:right;"><b>dirge:</b></span></td><td> What are the chances of the wyse boards working? Before I start messing on with mine.</td></tr>
<tr><td><a href="http://deskthority.net/post46827.html#p46827">28</a></td><td>09 May 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Thanks! I&#39;m happy enough if it&#39;s &#39;useful&#39; Pretty slim, I&#39;m afraid. I don&#39;t know muc ...</td></tr>
<tr><td><a href="http://deskthority.net/post46829.html#p46829">29</a></td><td>09 May 2012</td><td><span style="float:right;"><b>dirge:</b></span></td><td> You&#39;re much better at this type of thing so would you offer some advice on how I coul ...</td></tr>
<tr><td><a href="http://deskthority.net/post46831.html#p46831">30</a></td><td>09 May 2012</td><td><span style="float:right;"><b>off:</b></span></td><td> As the uninitiated, soarer&#39;s converter sounds like a protocol converter, so you&#39;d hav ...</td></tr>
<tr><td><a href="http://deskthority.net/post46844.html#p46844">31</a></td><td>09 May 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> I&#39;m going to assume for now that its signalling is something like the two shown on kb ...</td></tr>
<tr><td><a href="http://deskthority.net/post46850.html#p46850">32</a></td><td>09 May 2012</td><td><span style="float:right;"><b>dirge:</b></span></td><td> Thanks mate, that helps a lot. Working on the key matrix, following sixty&#39;s instructi ...</td></tr>
<tr><td><a href="http://deskthority.net/post47486.html#p47486">33</a></td><td>14 May 2012</td><td><span style="float:right;"><b>fruktstund:</b></span></td><td> hid_listen only prints out a lot of &quot;R05&quot;, with an occasional &quot;R04&quot; every now and the ...</td></tr>
<tr><td><a href="http://deskthority.net/post47491.html#p47491">34</a></td><td>14 May 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Sorry, I meant when it&#39;s first connected... have hid_listen running before you plug i ...</td></tr>
<tr><td><a href="http://deskthority.net/post47523.html#p47523">35</a></td><td>14 May 2012</td><td><span style="float:right;"><b>hoggy:</b></span></td><td> Just built one of these. Soarer, you are a genius. I&#39;ll take some pics when I&#39;ve got ...</td></tr>
<tr><td><a href="http://deskthority.net/post47631.html#p47631">36</a></td><td>15 May 2012</td><td><span style="float:right;"><b>hoggy:</b></span></td><td> It&#39;s a lousy photo...</td></tr>
<tr><td><a href="http://deskthority.net/post47632.html#p47632">37</a></td><td>15 May 2012</td><td><span style="float:right;"><b>fruktstund:</b></span></td><td> Ah, I see. I&#39;ll check as soon as I can!</td></tr>
<tr><td><a href="http://deskthority.net/post47643.html#p47643">38</a></td><td>15 May 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Nice project box! </td></tr>
<tr><td><a href="http://deskthority.net/post47646.html#p47646">39</a></td><td>15 May 2012</td><td><span style="float:right;"><b>off:</b></span></td><td> Indeed! Not the smallest, but looks to be the most functionally complete </td></tr>
<tr><td><a href="http://deskthority.net/post47652.html#p47652">40</a></td><td>16 May 2012</td><td><span style="float:right;"><b>hoggy:</b></span></td><td> What I wanted to make was a small lego box, with 3 leds and one of these stickers (to ...</td></tr>
<tr><td><a href="http://deskthority.net/post47746.html#p47746">41</a></td><td>16 May 2012</td><td><span style="float:right;"><b>hoggy:</b></span></td><td> The converter works better with my siig minitouch than a blue cube.</td></tr>
<tr><td><a href="http://deskthority.net/post47751.html#p47751">42</a></td><td>17 May 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> That&#39;s a fine idea to use one of those stickers! I don&#39;t think I ever looked into why ...</td></tr>
<tr><td><a href="http://deskthority.net/post49545.html#p49545">43</a></td><td>31 May 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> New version uploaded which fixes a bug that stopped jump to bootloader functions work ...</td></tr>
<tr><td><a href="http://deskthority.net/post51603.html#p51603">44</a></td><td>10 Jun 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Another new version posted, v1.02 - the converter wasn&#39;t handling the commands tellin ...</td></tr>
<tr><td><a href="http://deskthority.net/post61113.html#p61113">45</a></td><td>06 Jul 2012</td><td><span style="float:right;"><b>Findecanor:</b></span></td><td> Does the current code base have support for driving LEDs for Caps Lock, Scroll Lock a ...</td></tr>
<tr><td><a href="http://deskthority.net/post61116.html#p61116">46</a></td><td>06 Jul 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> It does </td></tr>
<tr><td><a href="http://deskthority.net/post61581.html#p61581">47</a></td><td>07 Jul 2012</td><td><span style="float:right;"><b>JBert:</b></span></td><td> I have made CapsLock an FN1 key, but now I was wondering if I could make some key on ...</td></tr>
<tr><td><a href="http://deskthority.net/post61639.html#p61639">48</a></td><td>07 Jul 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Not without remapping one of the shifts in the Fn layer to something which would just ...</td></tr>
<tr><td><a href="http://deskthority.net/post61660.html#p61660">49</a></td><td>07 Jul 2012</td><td><span style="float:right;"><b>JBert:</b></span></td><td> Ah, that&#39;s a handy chart. I&#39;ve been experimentally building some other macros to coun ...</td></tr>
<tr><td><a href="http://deskthority.net/post61694.html#p61694">50</a></td><td>07 Jul 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> I use the double-shift myself, in the base layer, and find it feels quite logical. Bu ...</td></tr>
<tr><td><a href="http://deskthority.net/post65786.html#p65786">51</a></td><td>16 Jul 2012</td><td><span style="float:right;"><b>Paranoid:</b></span></td><td> Has anyone ever tested if you can hook up an old laptop keyboard to your computer wit ...</td></tr>
<tr><td><a href="http://deskthority.net/post65811.html#p65811">52</a></td><td>16 Jul 2012</td><td><span style="float:right;"><b>Findecanor:</b></span></td><td> If a keyboard has a ribbon cable, then you can bet that the controller is not part of ...</td></tr>
<tr><td><a href="http://deskthority.net/post65818.html#p65818">53</a></td><td>16 Jul 2012</td><td><span style="float:right;"><b>JBert:</b></span></td><td> I happen to have another (weird) question: will there ever be support for a few extra ...</td></tr>
<tr><td><a href="http://deskthority.net/post68158.html#p68158">54</a></td><td>21 Jul 2012</td><td><span style="float:right;"><b>JBert:</b></span></td><td> No answer? I actually noticed another thing: it seems that the DELETE remap code crea ...</td></tr>
<tr><td><a href="http://deskthority.net/post68163.html#p68163">55</a></td><td>21 Jul 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Sorry! I saw your post before, but then forgot about it I don&#39;t think I&#39;ll add anyth ...</td></tr>
<tr><td><a href="http://deskthority.net/post68174.html#p68174">56</a></td><td>21 Jul 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Ahem Ignore that Autohotkey was blocking my deletes </td></tr>
<tr><td><a href="http://deskthority.net/post68251.html#p68251">57</a></td><td>22 Jul 2012</td><td><span style="float:right;"><b>JBert:</b></span></td><td> Woah, today it somehow works?!? I also noticed that the output above is not for TAB b ...</td></tr>
<tr><td><a href="http://deskthority.net/post68254.html#p68254">58</a></td><td>22 Jul 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Don&#39;t worry, I didn&#39;t spend too long on it. I added some debug printing to the macro ...</td></tr>
<tr><td><a href="http://deskthority.net/post68317.html#p68317">59</a></td><td>22 Jul 2012</td><td><span style="float:right;"><b>Paranoid:</b></span></td><td> Hey Soarer! I recently acquired a liberty keyboard and it has this connecter: The wei ...</td></tr>
<tr><td><a href="http://deskthority.net/post68350.html#p68350">60</a></td><td>22 Jul 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> WTF is that thing!!! At a guess, there is... CGND - case/shielding ground S.P. - dunn ...</td></tr>
<tr><td><a href="http://deskthority.net/post68694.html#p68694">61</a></td><td>24 Jul 2012</td><td><span style="float:right;"><b>Paranoid:</b></span></td><td> Hehe okidoki thanks for figuring it out! I wonder if there is any way that could ma ...</td></tr>
<tr><td><a href="http://deskthority.net/post68699.html#p68699">62</a></td><td>24 Jul 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> If you have a serial port, you could try wiring it to that (and a power supply for th ...</td></tr>
<tr><td><a href="http://deskthority.net/post70315.html#p70315">63</a></td><td>01 Aug 2012</td><td><span style="float:right;"><b>Trent:</b></span></td><td> Question: I have an IBM board with the RJ-45 converter. To hook this up to the conver ...</td></tr>
<tr><td><a href="http://deskthority.net/post70327.html#p70327">64</a></td><td>01 Aug 2012</td><td><span style="float:right;"><b>AltRN8:</b></span></td><td> Hoping folks can help. What is the expected behavior of using a SC with a Model F and ...</td></tr>
<tr><td><a href="http://deskthority.net/post70329.html#p70329">65</a></td><td>01 Aug 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Nope... just something like this: Unfortunately they don&#39;t fit in a breadboard though ...</td></tr>
<tr><td><a href="http://deskthority.net/post70332.html#p70332">66</a></td><td>01 Aug 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Yup, without legacy.sc compiled and loaded, * is just *. The two commands you need ar ...</td></tr>
<tr><td><a href="http://deskthority.net/post70334.html#p70334">67</a></td><td>02 Aug 2012</td><td><span style="float:right;"><b>spolia_optima:</b></span></td><td> Is anyone here willing to build one of these for profit? Or is building one myself no ...</td></tr>
<tr><td><a href="http://deskthority.net/post70348.html#p70348">68</a></td><td>02 Aug 2012</td><td><span style="float:right;"><b>Trent:</b></span></td><td> Soarer thanks for the advice. I took a look at the link you suggested and bought the ...</td></tr>
<tr><td><a href="http://deskthority.net/post70369.html#p70369">69</a></td><td>02 Aug 2012</td><td><span style="float:right;"><b>JBert:</b></span></td><td> Here&#39;s a step by step guide: You should now have a working converter. See Soarer&#39;s po ...</td></tr>
<tr><td><a href="http://deskthority.net/post70442.html#p70442">70</a></td><td>02 Aug 2012</td><td><span style="float:right;"><b>AltRN8:</b></span></td><td> Thanks Soarer! I actually figured it out right after I posted. I feel a little dense ...</td></tr>
<tr><td><a href="http://deskthority.net/post70507.html#p70507">71</a></td><td>02 Aug 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Sure does! It handles all of the codes produced by the &#39;extra&#39; positions available on ...</td></tr>
<tr><td><a href="http://deskthority.net/post70517.html#p70517">72</a></td><td>03 Aug 2012</td><td><span style="float:right;"><b>Trent:</b></span></td><td> Awesome thanks very much. I ordered all of the parts for my converter! The only parts ...</td></tr>
<tr><td><a href="http://deskthority.net/post70525.html#p70525">73</a></td><td>03 Aug 2012</td><td><span style="float:right;"><b>JBert:</b></span></td><td> I think you misunderstood that forum post. This also means that you will only supply ...</td></tr>
<tr><td><a href="http://deskthority.net/post70557.html#p70557">74</a></td><td>03 Aug 2012</td><td><span style="float:right;"><b>Trent:</b></span></td><td> Ah I was wondering whether or not the keyboard would still be able to be powered with ...</td></tr>
<tr><td><a href="http://deskthority.net/post70568.html#p70568">75</a></td><td>03 Aug 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Actually, I think the forum post is mistaken; a Teensy running at 5V should work fine ...</td></tr>
<tr><td><a href="http://deskthority.net/post70704.html#p70704">76</a></td><td>03 Aug 2012</td><td><span style="float:right;"><b>Trent:</b></span></td><td> Yeah it was that post. Ah a serial connection that makes sense. And does this convert ...</td></tr>
<tr><td><a href="http://deskthority.net/post70708.html#p70708">77</a></td><td>04 Aug 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Hey, that&#39;s a trick question! No fair! It&#39;s both, and neither! Typically the PS/2 por ...</td></tr>
<tr><td><a href="http://deskthority.net/post70995.html#p70995">78</a></td><td>06 Aug 2012</td><td><span style="float:right;"><b>Trent:</b></span></td><td> Ah clever. Well cool I look forward to making the converter! I am still waiting on pa ...</td></tr>
<tr><td><a href="http://deskthority.net/post71004.html#p71004">79</a></td><td>06 Aug 2012</td><td><span style="float:right;"><b>RC-1140:</b></span></td><td> hm, reading this stuff makes me overthink the project I had planned (maybe you rememb ...</td></tr>
<tr><td><a href="http://deskthority.net/post71187.html#p71187">80</a></td><td>07 Aug 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> I think I said before that it sounded &#39;challenging&#39;. Now it&#39;s sounding challenging ...</td></tr>
<tr><td><a href="http://deskthority.net/post71413.html#p71413">81</a></td><td>09 Aug 2012</td><td><span style="float:right;"><b>Trent:</b></span></td><td> Ok so what am I doing wrong: * Programmed the teensy with 1.02 * using a terminal sty ...</td></tr>
<tr><td><a href="http://deskthority.net/post71447.html#p71447">82</a></td><td>09 Aug 2012</td><td><span style="float:right;"><b>Icarium:</b></span></td><td> I&#39;ve tried a RJ-45 jack once for a 122key Model M and there was something else in the ...</td></tr>
<tr><td><a href="http://deskthority.net/post71452.html#p71452">83</a></td><td>09 Aug 2012</td><td><span style="float:right;"><b>JBert:</b></span></td><td> That&#39;s a known bug: Simply unplug the Teensy from USB and it should work again.</td></tr>
<tr><td><a href="http://deskthority.net/post71459.html#p71459">84</a></td><td>09 Aug 2012</td><td><span style="float:right;"><b>Trent:</b></span></td><td> Icarium I will try what you suggested. Jbert I noticed that does indeed help. I can&#39;t ...</td></tr>
<tr><td><a href="http://deskthority.net/post71471.html#p71471">85</a></td><td>09 Aug 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> I haven&#39;t had that problem with scinfo, only with scrd. After running scboot you woul ...</td></tr>
<tr><td><a href="http://deskthority.net/post71560.html#p71560">86</a></td><td>09 Aug 2012</td><td><span style="float:right;"><b>Trent:</b></span></td><td> So the order would be: 1. Flash teensy 2. scas example.sc example.scb 2. scwr example ...</td></tr>
<tr><td><a href="http://deskthority.net/post71571.html#p71571">87</a></td><td>09 Aug 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Ouch, that&#39;s as I feared... backwards The silver line is the shielding, which is PE. ...</td></tr>
<tr><td><a href="http://deskthority.net/post71578.html#p71578">88</a></td><td>09 Aug 2012</td><td><span style="float:right;"><b>Trent:</b></span></td><td> Edit: after re-do of backward ass colors, I load up the teensy, reflash with Soarer_a ...</td></tr>
<tr><td><a href="http://deskthority.net/post71590.html#p71590">89</a></td><td>09 Aug 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Strange choice of colours, for sure. Hardly matters though. That they used pinouts th ...</td></tr>
<tr><td><a href="http://deskthority.net/post71606.html#p71606">90</a></td><td>10 Aug 2012</td><td><span style="float:right;"><b>Trent:</b></span></td><td> Do you know what the colors would be for the silver tag XT/AT style adapters? I have ...</td></tr>
<tr><td><a href="http://deskthority.net/post71621.html#p71621">91</a></td><td>10 Aug 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> I think they vary... at least, the PC/XT colours are different to the 122-key&#39;s. Let ...</td></tr>
<tr><td><a href="http://deskthority.net/post71641.html#p71641">92</a></td><td>10 Aug 2012</td><td><span style="float:right;"><b>JBert:</b></span></td><td> Noooooo! 1. Press button on Teensy 2. Flash Teensy 3. scas ... 4. scwr 5. Unplug / pl ...</td></tr>
<tr><td><a href="http://deskthority.net/post71796.html#p71796">93</a></td><td>11 Aug 2012</td><td><span style="float:right;"><b>Trent:</b></span></td><td> Hmm, seems that this board is indeed dead after following your instructions jBert. I&#39; ...</td></tr>
<tr><td><a href="http://deskthority.net/post74412.html#p74412">94</a></td><td>31 Aug 2012</td><td><span style="float:right;"><b>AKIMbO:</b></span></td><td> I need some serious help with programming this teensy. If someone could give me the e ...</td></tr>
<tr><td><a href="http://deskthority.net/post74420.html#p74420">95</a></td><td>31 Aug 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Nothing but a couple of misunderstandings here First, you don&#39;t want to be in progra ...</td></tr>
<tr><td><a href="http://deskthority.net/post74428.html#p74428">96</a></td><td>31 Aug 2012</td><td><span style="float:right;"><b>AKIMbO:</b></span></td><td> It worked! Thank you so much Soarer! Is there an easy way to completely go back to de ...</td></tr>
<tr><td><a href="http://deskthority.net/post74458.html#p74458">97</a></td><td>31 Aug 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Sure, just compile an empty text file! Or, in a Windows command prompt, you can simpl ...</td></tr>
<tr><td><a href="http://deskthority.net/post75459.html#p75459">98</a></td><td>07 Sep 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> I see some people have noticed the v1.03 release... it&#39;s far from an essential update ...</td></tr>
<tr><td><a href="http://deskthority.net/post77160.html#p77160">99</a></td><td>23 Sep 2012</td><td><span style="float:right;"><b>fruktstund:</b></span></td><td> Soarer, I&#39;m back with a new exciting question: is it possible to use other pins on th ...</td></tr>
<tr><td><a href="http://deskthority.net/post77167.html#p77167">100</a></td><td>23 Sep 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Hmm, well I don&#39;t really want to start producing and testing a modified version, but ...</td></tr>
<tr><td><a href="http://deskthority.net/post77169.html#p77169">101</a></td><td>23 Sep 2012</td><td><span style="float:right;"><b>fruktstund:</b></span></td><td> Tried your shorting test, and both output the error codes as expected (except that on ...</td></tr>
<tr><td><a href="http://deskthority.net/post77174.html#p77174">102</a></td><td>23 Sep 2012</td><td><span style="float:right;"><b>dirge:</b></span></td><td> Got mine working but trying to make a USB cable out the original cable. Looking towar ...</td></tr>
<tr><td><a href="http://deskthority.net/post77176.html#p77176">103</a></td><td>23 Sep 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> So they are both XTs, but they have LEDs? Sorry, for some reason I thought you were t ...</td></tr>
<tr><td><a href="http://deskthority.net/post77179.html#p77179">104</a></td><td>23 Sep 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> On your head be it! Have a camera handy for when the magic smoke gets out </td></tr>
<tr><td><a href="http://deskthority.net/post77180.html#p77180">105</a></td><td>23 Sep 2012</td><td><span style="float:right;"><b>dirge:</b></span></td><td> well typing on it now so no great damage But would love to know the correct usb pinn ...</td></tr>
<tr><td><a href="http://deskthority.net/post77196.html#p77196">106</a></td><td>23 Sep 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> My files are symbol agnostic, as are scan codes and HID codes Any discrepancy betwe ...</td></tr>
<tr><td><a href="http://deskthority.net/post77347.html#p77347">107</a></td><td>25 Sep 2012</td><td><span style="float:right;"><b>Grond:</b></span></td><td> Anyone tested this with Teensy 3.0?</td></tr>
<tr><td><a href="http://deskthority.net/post77350.html#p77350">108</a></td><td>25 Sep 2012</td><td><span style="float:right;"><b>JBert:</b></span></td><td> It&#39;s a totally different processor and thus the .hex file will not work.</td></tr>
<tr><td><a href="http://deskthority.net/post77352.html#p77352">109</a></td><td>25 Sep 2012</td><td><span style="float:right;"><b>dirge:</b></span></td><td> Well that would explain it, who&#39;s idea was it to have the end inverted on the mini so ...</td></tr>
<tr><td><a href="http://deskthority.net/post77361.html#p77361">110</a></td><td>25 Sep 2012</td><td><span style="float:right;"><b>dirge:</b></span></td><td> right I`ve used the included tools and compiled the dvorak bin. I like the fact &Acirc;&pound; is ...</td></tr>
<tr><td><a href="http://deskthority.net/post77382.html#p77382">111</a></td><td>25 Sep 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Damn UK vs US layout problem! &#39;Backslash&#39; is a # on a UK layout... think of the diffe ...</td></tr>
<tr><td><a href="http://deskthority.net/post77384.html#p77384">112</a></td><td>25 Sep 2012</td><td><span style="float:right;"><b>dirge:</b></span></td><td> Changing to US would be bad, I`m logged into UK servers most the time. &quot;`&Acirc;&not;&quot; is an op ...</td></tr>
<tr><td><a href="http://deskthority.net/post77387.html#p77387">113</a></td><td>25 Sep 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> That&#39;s because GRAVE and HASH aren&#39;t keys All the key names are US-centric, so we j ...</td></tr>
<tr><td><a href="http://deskthority.net/post77388.html#p77388">114</a></td><td>25 Sep 2012</td><td><span style="float:right;"><b>dirge:</b></span></td><td> Your awesome! I&#39;m going to post some pics now! </td></tr>
<tr><td><a href="http://deskthority.net/post78131.html#p78131">115</a></td><td>02 Oct 2012</td><td><span style="float:right;"><b>Mikester:</b></span></td><td> hi guys, i just modified my IBM 3487 terminal keyboard with a teensy-board with soare ...</td></tr>
<tr><td><a href="http://deskthority.net/post78263.html#p78263">116</a></td><td>03 Oct 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Very nice! That USB extension fits tidily between the existing posts, I see! Strictly ...</td></tr>
<tr><td><a href="http://deskthority.net/post78264.html#p78264">117</a></td><td>03 Oct 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Anyone that thinks they might&#39;ve applied power in reverse - see here for a test and f ...</td></tr>
<tr><td><a href="http://deskthority.net/post78392.html#p78392">118</a></td><td>04 Oct 2012</td><td><span style="float:right;"><b>sealclubber:</b></span></td><td> Hey Soarer. Just wanted to thank you for your awesome work. I finally got my baby to ...</td></tr>
<tr><td><a href="http://deskthority.net/post78403.html#p78403">119</a></td><td>04 Oct 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Ha! You don&#39;t! There&#39;s an initial translation from each scan code set into HID codes, ...</td></tr>
<tr><td><a href="http://deskthority.net/post78414.html#p78414">120</a></td><td>04 Oct 2012</td><td><span style="float:right;"><b>sealclubber:</b></span></td><td> I am honestly surprised that this is so easy! Thank you for all of your help </td></tr>
<tr><td><a href="http://deskthority.net/post78420.html#p78420">121</a></td><td>04 Oct 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Cool! I made a little mistake in the last three macros - well, not really a mistake, ...</td></tr>
<tr><td><a href="http://deskthority.net/post78531.html#p78531">122</a></td><td>05 Oct 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Heh, another minor mistake... the code prefixed by &#39;d&#39; is remapping. The one you wa ...</td></tr>
<tr><td><a href="http://deskthority.net/post78563.html#p78563">123</a></td><td>05 Oct 2012</td><td><span style="float:right;"><b>sealclubber:</b></span></td><td> Gotcha. Just popped in again to tell you everything is working all nice and smooth. T ...</td></tr>
<tr><td><a href="http://deskthority.net/post78568.html#p78568">124</a></td><td>05 Oct 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Aha, well, that&#39;s even better! ... I finally finished my set of adapters... ... by fi ...</td></tr>
<tr><td><a href="http://deskthority.net/post80632.html#p80632">125</a></td><td>26 Oct 2012</td><td><span style="float:right;"><b>wcass:</b></span></td><td> feature request: i know that all of the guys that like trackpoints would like to see ...</td></tr>
<tr><td><a href="http://deskthority.net/post80685.html#p80685">126</a></td><td>26 Oct 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Hmm. I might add mousekeys functions at some point (similar to hasu&#39;s code), but I&#39;m ...</td></tr>
<tr><td><a href="http://deskthority.net/post80702.html#p80702">127</a></td><td>26 Oct 2012</td><td><span style="float:right;"><b>wcass:</b></span></td><td> a trackpoint mod would have bare leads rather than a proper PS2 plug. yes, i could cr ...</td></tr>
<tr><td><a href="http://deskthority.net/post80706.html#p80706">128</a></td><td>26 Oct 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Are you sure? I&#39;d only spotted the Mouse Keys (&quot;You can emulates mouse move and butto ...</td></tr>
<tr><td><a href="http://deskthority.net/post80710.html#p80710">129</a></td><td>26 Oct 2012</td><td><span style="float:right;"><b>wcass:</b></span></td><td> - Features section, 5th bullet item. if you have a copy of his code, look for ps2_mo ...</td></tr>
<tr><td><a href="http://deskthority.net/post80713.html#p80713">130</a></td><td>27 Oct 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Ah, so it does </td></tr>
<tr><td><a href="http://deskthority.net/post80723.html#p80723">131</a></td><td>27 Oct 2012</td><td><span style="float:right;"><b>hasu:</b></span></td><td> I&#39;m a fan of trackpoint, sure But it is very difficult to integrate it into my favo ...</td></tr>
<tr><td><a href="http://deskthority.net/post80733.html#p80733">132</a></td><td>27 Oct 2012</td><td><span style="float:right;"><b>Icarium:</b></span></td><td> Actually there is another good reason for putting PS/2 through the Teensy but I haven ...</td></tr>
<tr><td><a href="http://deskthority.net/post80747.html#p80747">133</a></td><td>27 Oct 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> I might pencil it in for v2.0 It sounds like quite a lot of work to do it nicely - d ...</td></tr>
<tr><td><a href="http://deskthority.net/post80850.html#p80850">134</a></td><td>29 Oct 2012</td><td><span style="float:right;"><b>suka:</b></span></td><td> I have used exactly such a setup in my custom board for the last couple of months, an ...</td></tr>
<tr><td><a href="http://deskthority.net/post80879.html#p80879">135</a></td><td>29 Oct 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Heh, I&#39;m not saying it would be , just that it would take And I don&#39;t even have a ...</td></tr>
<tr><td><a href="http://deskthority.net/post80947.html#p80947">136</a></td><td>29 Oct 2012</td><td><span style="float:right;"><b>fossala:</b></span></td><td> I&#39;ve got a teensy coming for a 122 key terminal M. What would be the best way to conn ...</td></tr>
<tr><td><a href="http://deskthority.net/post80963.html#p80963">137</a></td><td>29 Oct 2012</td><td><span style="float:right;"><b>wcass:</b></span></td><td> I installed a teensy inside the case of my keyboard. i&#39;ll post pictures of how i did ...</td></tr>
<tr><td><a href="http://deskthority.net/post80990.html#p80990">138</a></td><td>30 Oct 2012</td><td><span style="float:right;"><b>wcass:</b></span></td><td> This is what i did and it has worked very well for me. You will need a 6&#39; USB A-to-mi ...</td></tr>
<tr><td><a href="http://deskthority.net/post80996.html#p80996">139</a></td><td>30 Oct 2012</td><td><span style="float:right;"><b>fossala:</b></span></td><td> Looks good, lots of good info. I&#39;ll take mine apart and look at it later. I can see f ...</td></tr>
<tr><td><a href="http://deskthority.net/post81047.html#p81047">140</a></td><td>30 Oct 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> That&#39;s excellent, wcass! I&#39;ll just add my usual caveat about not trusting the wire co ...</td></tr>
<tr><td><a href="http://deskthority.net/post82185.html#p82185">141</a></td><td>08 Nov 2012</td><td><span style="float:right;"><b>fossala:</b></span></td><td> OK, the teensy turned up yesterday. I&#39;ve stripped the wires ready for doing the solde ...</td></tr>
<tr><td><a href="http://deskthority.net/post82197.html#p82197">142</a></td><td>08 Nov 2012</td><td><span style="float:right;"><b>JBert:</b></span></td><td> It should work fine without a config loaded. Only when you got some ancient keyboard ...</td></tr>
<tr><td><a href="http://deskthority.net/post82211.html#p82211">143</a></td><td>08 Nov 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Indeed; config files are just tweaks to the default mappings (one for each scan code ...</td></tr>
<tr><td><a href="http://deskthority.net/post82437.html#p82437">144</a></td><td>10 Nov 2012</td><td><span style="float:right;"><b>Vierax:</b></span></td><td> Hello, just a noob in C (in Python too but work in progress for both&acirc;&#128;&brvbar;) so I might m ...</td></tr>
<tr><td><a href="http://deskthority.net/post82439.html#p82439">145</a></td><td>10 Nov 2012</td><td><span style="float:right;"><b>fossala:</b></span></td><td> All up and running, typing this with it now. Thanks for your hard work. Sure there wi ...</td></tr>
<tr><td><a href="http://deskthority.net/post82445.html#p82445">146</a></td><td>10 Nov 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> It still sends keycodes, so yes, the sensible layouts to do in hardware are those whi ...</td></tr>
<tr><td><a href="http://deskthority.net/post82487.html#p82487">147</a></td><td>11 Nov 2012</td><td><span style="float:right;"><b>Vierax:</b></span></td><td> Oh yeah macros, that&#39;s clever ! You just need a referential layout who can handle the ...</td></tr>
<tr><td><a href="http://deskthority.net/post82535.html#p82535">148</a></td><td>11 Nov 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Hmm, true, and being OS specific would make it a bit pointless really, unless you wer ...</td></tr>
<tr><td><a href="http://deskthority.net/post82641.html#p82641">149</a></td><td>12 Nov 2012</td><td><span style="float:right;"><b>Vierax:</b></span></td><td> Yes the simplest way seems to have hard dvorak and colemak and combining the hard qwe ...</td></tr>
<tr><td><a href="http://deskthority.net/post83574.html#p83574">150</a></td><td>21 Nov 2012</td><td><span style="float:right;"><b>JBert:</b></span></td><td> Except it doesn&#39;t work with UAC or the login screen... It&#39;s fun to type in Colemak in ...</td></tr>
<tr><td><a href="http://deskthority.net/post84104.html#p84104">151</a></td><td>24 Nov 2012</td><td><span style="float:right;"><b>Hubbert:</b></span></td><td> I have the exact same question: did you come up with a fix, JBert? Otherwise, I guess ...</td></tr>
<tr><td><a href="http://deskthority.net/post84107.html#p84107">152</a></td><td>24 Nov 2012</td><td><span style="float:right;"><b>JBert:</b></span></td><td> No, I just left the project for what it was after Soarer said he didn&#39;t want to add s ...</td></tr>
<tr><td><a href="http://deskthority.net/post84115.html#p84115">153</a></td><td>24 Nov 2012</td><td><span style="float:right;"><b>Hubbert:</b></span></td><td> OK...sounds like maybe that&#39;s the way to go. I made a new thread about how to interfa ...</td></tr>
<tr><td><a href="http://deskthority.net/post84589.html#p84589">154</a></td><td>27 Nov 2012</td><td><span style="float:right;"><b>fossala:</b></span></td><td> How can I get the lefthand keys working on a 122 model m with this firmware?</td></tr>
<tr><td><a href="http://deskthority.net/post84591.html#p84591">155</a></td><td>27 Nov 2012</td><td><span style="float:right;"><b>Icarium:</b></span></td><td> Which one? With Soarer&#39;s it should work out of the box. Wait, what do you mean by lef ...</td></tr>
<tr><td><a href="http://deskthority.net/post84592.html#p84592">156</a></td><td>27 Nov 2012</td><td><span style="float:right;"><b>7bit:</b></span></td><td> The function keys to the left of the keyboard.</td></tr>
<tr><td><a href="http://deskthority.net/post84593.html#p84593">157</a></td><td>27 Nov 2012</td><td><span style="float:right;"><b>fossala:</b></span></td><td> IBM model m terminal. By left hand keys I mean the 10 key caps to the far left.</td></tr>
<tr><td><a href="http://deskthority.net/post84597.html#p84597">158</a></td><td>27 Nov 2012</td><td><span style="float:right;"><b>Icarium:</b></span></td><td> Ah, well those you actually have to add to the config afair. I can send you mine as a ...</td></tr>
<tr><td><a href="http://deskthority.net/post84598.html#p84598">159</a></td><td>27 Nov 2012</td><td><span style="float:right;"><b>fossala:</b></span></td><td> I will have to read up how to make configs, thanks.</td></tr>
<tr><td><a href="http://deskthority.net/post84600.html#p84600">160</a></td><td>27 Nov 2012</td><td><span style="float:right;"><b>Icarium:</b></span></td><td> Soarer&#39;s docs are insanely good. I would like to reward him with a virtual cookie or ...</td></tr>
<tr><td><a href="http://deskthority.net/post84825.html#p84825">161</a></td><td>28 Nov 2012</td><td><span style="float:right;"><b>bhtooefr:</b></span></td><td> I need to find how I mapped mine, but it involved mapping volume, the PrtSc/ScrLk/Pau ...</td></tr>
<tr><td><a href="http://deskthority.net/post87015.html#p87015">162</a></td><td>07 Dec 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> PLEASE VOTE for my converter in the Deskthority Awards 2012: Best input device mod 20 ...</td></tr>
<tr><td><a href="http://deskthority.net/post87621.html#p87621">163</a></td><td>10 Dec 2012</td><td><span style="float:right;"><b>sealclubber:</b></span></td><td> Hello again Soarer! Just nabbed myself a Model F off ebay (for cheap... great conditi ...</td></tr>
<tr><td><a href="http://deskthority.net/post87679.html#p87679">164</a></td><td>10 Dec 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> I can&#39;t remember it 100%. Which Model F? I think in most cases the controller grounds ...</td></tr>
<tr><td><a href="http://deskthority.net/post87691.html#p87691">165</a></td><td>10 Dec 2012</td><td><span style="float:right;"><b>bhtooefr:</b></span></td><td> You might get the ground path of: Base pan -&gt; keyboard frame -&gt; controller -&gt; Teensy ...</td></tr>
<tr><td><a href="http://deskthority.net/post87931.html#p87931">166</a></td><td>11 Dec 2012</td><td><span style="float:right;"><b>sealclubber:</b></span></td><td> Nevermind its all good. Typing on it at the moment actually. Some of the keys needed ...</td></tr>
<tr><td><a href="http://deskthority.net/post88252.html#p88252">167</a></td><td>13 Dec 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Is there still desire for the extra few keys? I&#39;ve got v1.1 almost ready, and could p ...</td></tr>
<tr><td><a href="http://deskthority.net/post88323.html#p88323">168</a></td><td>13 Dec 2012</td><td><span style="float:right;"><b>JBert:</b></span></td><td> I think I&#39;m personally not going to use it anymore now that there are alternative Pok ...</td></tr>
<tr><td><a href="http://deskthority.net/post89390.html#p89390">169</a></td><td>18 Dec 2012</td><td><span style="float:right;"><b>Hubbert:</b></span></td><td> That would still be great for me! And I like the no-matrix idea, both for simplicity ...</td></tr>
<tr><td><a href="http://deskthority.net/post89391.html#p89391">170</a></td><td>18 Dec 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> For now I&#39;ve coded it to read 5 inputs at 1kHz with a simple 10ms batch debounce. Tha ...</td></tr>
</table>
<hr>
</body>
</html>

651
docs/GH.html Normal file
View File

@ -0,0 +1,651 @@
<html>
<head>
<link rel="stylesheet" type="text/css" href="style2.css">
<title>XT/AT/PS2/Terminal to USB Converter with NKRO - GeekHack Thread Contents</title>
</head>
<body>
<script type="text/javascript" src="headermenu.js"></script>
<script type="text/javascript">navtabfn("GH")</script>
<noscript><div id=jswarn class=\"navtabs\">These docs work best with Javascript enabled!</div></noscript>
<h2>GeekHack Thread Contents</h2>
<hr>
<p>
</p>
<table>
<tr><th>Reply</th><th>Date</th><th>By</th><th>Post</th></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg335414#msg335414">0</a></td><td>22 Apr 2011</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> This is my Teensy-based project which adapts XT, AT and some 122 key terminal keyboar ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg335427#msg335427">1</a></td><td>22 Apr 2011</td><td><span style="float:right;"><b>Mr. Perfect:</b></span></td><td> Impressive work there. It&#39;s tempting to make one of these even for boards that work o ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg335428#msg335428">2</a></td><td>22 Apr 2011</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Some boards don&#39;t have LEDs (e.g. XTs and Terminals), and in the case of the XT the p ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg335463#msg335463">3</a></td><td>22 Apr 2011</td><td><span style="float:right;"><b>HaveANiceDay:</b></span></td><td> This looks really interesting. Especially the Filco NKRO USB Mod possibilities. I don ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg335876#msg335876">4</a></td><td>23 Apr 2011</td><td><span style="float:right;"><b>hasu:</b></span></td><td> Nice work! I tried your converter with PS/2 keyboard on Mac and confirmed NKRO works ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg336036#msg336036">5</a></td><td>23 Apr 2011</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Thanks, hasu! I might need to add in your fix for the SET_IDLE problem on OS-X. I hav ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg336152#msg336152">6</a></td><td>23 Apr 2011</td><td><span style="float:right;"><b>Soarer:</b></span></td><td>Which one? My firmware was already working better than theirs many weeks ago.</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg336196#msg336196">7</a></td><td>23 Apr 2011</td><td><span style="float:right;"><b>ch_123:</b></span></td><td>I&#39;d be willing to check this out whenever I get my Teensy and sufficient free time.</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg336218#msg336218">8</a></td><td>23 Apr 2011</td><td><span style="float:right;"><b>Soarer:</b></span></td><td>That would be great, thanks! I think the most likely problem (if any) is an occasio ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg336430#msg336430">9</a></td><td>24 Apr 2011</td><td><span style="float:right;"><b>Hak Foo:</b></span></td><td> Just built, waiting for my terminal F to come tomorrow. adding the LEDs lets you test ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg336471#msg336471">10</a></td><td>24 Apr 2011</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Ah, Hak Foo... just spotted your question on IRC about the devices that the converter ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg336486#msg336486">11</a></td><td>24 Apr 2011</td><td><span style="float:right;"><b>xwhatsit:</b></span></td><td> What are you using for a VID/PID?</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg336491#msg336491">12</a></td><td>24 Apr 2011</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> I&#39;ll check later, but I haven&#39;t changed it from the defaults in the PJRC sample code. ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg336495#msg336495">13</a></td><td>24 Apr 2011</td><td><span style="float:right;"><b>xwhatsit:</b></span></td><td> Ah right. I&#39;m going to use the standard V-USB HID keyboard VID/PID for my wee project ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg336575#msg336575">14</a></td><td>24 Apr 2011</td><td><span style="float:right;"><b>intealls:</b></span></td><td> Nice work! Just wondering what kind of remapping/macro features your firmware support ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg336708#msg336708">15</a></td><td>25 Apr 2011</td><td><span style="float:right;"><b>Soarer:</b></span></td><td>For personal projects, I guess it doesn&#39;t really matter what we use! (I admit I hav ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg336724#msg336724">16</a></td><td>25 Apr 2011</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Remappings are done from HID code to HID code, using a table in RAM, after the native ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg336801#msg336801">17</a></td><td>25 Apr 2011</td><td><span style="float:right;"><b>Hak Foo:</b></span></td><td> Stupid question: what&#39;s the default mapping for a 122 look like? &nbsp;I&#39;m thinking I&#39;m go ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg336851#msg336851">18</a></td><td>25 Apr 2011</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Roughly speaking, it&#39;s done as a regular 102 with extra keys. The block of 10 keys on ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg337011#msg337011">19</a></td><td>25 Apr 2011</td><td><span style="float:right;"><b>intealls:</b></span></td><td> I&#39;ve got a Teensy++ 2.0 with your firmware hooked up to my MBP Santa Rosa, and I&#39;ve y ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg337025#msg337025">20</a></td><td>25 Apr 2011</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Excellent news! Thanks for letting me know, that was the last part that was completel ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg337030#msg337030">21</a></td><td>25 Apr 2011</td><td><span style="float:right;"><b>intealls:</b></span></td><td> Sorry &#39;bout that. :/ Yup, seems fine when no keys are pressed! Gonna test a couple mo ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg337047#msg337047">22</a></td><td>25 Apr 2011</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Thinking about it, I can&#39;t quite figure out what&#39;s going wrong - I guess it must some ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg337050#msg337050">23</a></td><td>25 Apr 2011</td><td><span style="float:right;"><b>intealls:</b></span></td><td> It does not wake up :( That was what I was testing. I just tried the same thing on Li ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg337065#msg337065">24</a></td><td>25 Apr 2011</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> I think handling wake-up will have to wait until I support suspend mode correctly - i ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg337070#msg337070">25</a></td><td>25 Apr 2011</td><td><span style="float:right;"><b>intealls:</b></span></td><td> It still seems to repeat. :/ Would be great if someone else could try to reproduce it ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg337073#msg337073">26</a></td><td>25 Apr 2011</td><td><span style="float:right;"><b>kishy:</b></span></td><td> I am unable to reproduce, or witness any issues at all after waking from standby (jus ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg337086#msg337086">27</a></td><td>25 Apr 2011</td><td><span style="float:right;"><b>intealls:</b></span></td><td> I think it&#39;s a problem related to OS X, Linux (Ubuntu 10.04 I think) on the same mach ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg337089#msg337089">28</a></td><td>25 Apr 2011</td><td><span style="float:right;"><b>kishy:</b></span></td><td> Win7...so yeah...might be OS-related (in fact, there&#39;s a good chance it is...standby ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg337236#msg337236">29</a></td><td>26 Apr 2011</td><td><span style="float:right;"><b>Soarer:</b></span></td><td>Thanks for trying it. :-) &nbsp;I&#39;m still hoping that there is a change I can make that ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg337902#msg337902">30</a></td><td>27 Apr 2011</td><td><span style="float:right;"><b>Oqsy:</b></span></td><td> High five! 122 key terminal Model F up and running!!! &nbsp;Everything is good so far :) I ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg339706#msg339706">31</a></td><td>01 May 2011</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> v0.992 is now available, which works around an annoying issue with Linux. The problem ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg339968#msg339968">32</a></td><td>01 May 2011</td><td><span style="float:right;"><b>Neit:</b></span></td><td> Hi Soarer, I would like to wire your converter with both DIN and PS/2 connectors. Sin ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg339994#msg339994">33</a></td><td>01 May 2011</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Nice diagram! Yes, that should be fine. (In fact, I don&#39;t think plugging both in at t ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg340185#msg340185">34</a></td><td>02 May 2011</td><td><span style="float:right;"><b>Oqsy:</b></span></td><td> Glad this was brought up, as short-term I will be doing the same with a terminal F, a ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg340469#msg340469">35</a></td><td>02 May 2011</td><td><span style="float:right;"><b>Neit:</b></span></td><td> Thanks :) I wanted to make it clear and &quot;readable&quot; for my first electronic build. Goo ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg340492#msg340492">36</a></td><td>02 May 2011</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> That is fine. (It&#39;s probably about the same thickness as the wires in the cable to th ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg340516#msg340516">37</a></td><td>02 May 2011</td><td><span style="float:right;"><b>Neit:</b></span></td><td> Okay good. I&#39;ll get some resistors just in case. Yes, I was planning on a (lego) box. ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg340581#msg340581">38</a></td><td>02 May 2011</td><td><span style="float:right;"><b>nowsharing:</b></span></td><td> Wow, awesome work everyone. You&#39;ve achieved the &quot;impossible.&quot; Could I buy one of the ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg340670#msg340670">39</a></td><td>03 May 2011</td><td><span style="float:right;"><b>bhtooefr:</b></span></td><td> Man, this code works great. Now I just need the remappable version. :)</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg340683#msg340683">40</a></td><td>03 May 2011</td><td><span style="float:right;"><b>slueth:</b></span></td><td>Just buy a teensy and request a sample from tyco electronics for the DIN connectors ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg340770#msg340770">41</a></td><td>03 May 2011</td><td><span style="float:right;"><b>Hak Foo:</b></span></td><td> if you don&#39;t feel like harassing tyco, the socket costs &lt;4 USD from the big online pa ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg340790#msg340790">42</a></td><td>03 May 2011</td><td><span style="float:right;"><b>8_INCH_FLOPPY:</b></span></td><td> I want to do this, but why is the teensy so damn expensive?</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg340818#msg340818">43</a></td><td>03 May 2011</td><td><span style="float:right;"><b>slueth:</b></span></td><td> Its because not only can you use it for a keyboard convertor, you can use it for a sl ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg341287#msg341287">44</a></td><td>04 May 2011</td><td><span style="float:right;"><b>Neit:</b></span></td><td> Hey, I Updated the diagram before soldering. I finally chose to add the resistors for ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg341462#msg341462">45</a></td><td>04 May 2011</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Yep, even better! I like that the socket views are labelled as front and back - it re ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg341464#msg341464">46</a></td><td>04 May 2011</td><td><span style="float:right;"><b>Soarer:</b></span></td><td>Is it though? Even used just as a keyboard converter, I don&#39;t think it&#39;s unreasonab ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg341477#msg341477">47</a></td><td>04 May 2011</td><td><span style="float:right;"><b>Findecanor:</b></span></td><td> There are lots of unused pins, though. I wonder if they could be used for something u ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg341710#msg341710">48</a></td><td>04 May 2011</td><td><span style="float:right;"><b>Mr. Perfect:</b></span></td><td> Very nice diagrams there Neit. Any idea where the lock LEDs would fit into those?</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg341721#msg341721">49</a></td><td>04 May 2011</td><td><span style="float:right;"><b>Soarer:</b></span></td><td>DIP switches!!</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg341724#msg341724">50</a></td><td>04 May 2011</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Has anyone wired them up yet? I&#39;m tempted to move them to different pins on the Teens ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg341877#msg341877">51</a></td><td>05 May 2011</td><td><span style="float:right;"><b>Hak Foo:</b></span></td><td> I have. If one thing is annoying about the laout, it is the lights. &nbsp;Too close togeth ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg342138#msg342138">52</a></td><td>05 May 2011</td><td><span style="float:right;"><b>Neit:</b></span></td><td> I&#39;ll add them on the diagram as soon as Soarer has chosen the final pins to use (curr ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg342193#msg342193">53</a></td><td>05 May 2011</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Still a bit risky but should be ok (as ok as hot-swapping any PS/2, I guess). The con ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg342287#msg342287">54</a></td><td>06 May 2011</td><td><span style="float:right;"><b>Mr. Perfect:</b></span></td><td>Yes, that&#39;s exactly what I was asking about. Probably best to wait and see if they ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg342347#msg342347">55</a></td><td>06 May 2011</td><td><span style="float:right;"><b>8_INCH_FLOPPY:</b></span></td><td>I&#39;m just a cheapass who doesn&#39;t understand who people are willing to use an arduino ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg342411#msg342411">56</a></td><td>06 May 2011</td><td><span style="float:right;"><b>hasu:</b></span></td><td> 8_INCH_FLOPPY, You can do with V-USB at cheap. You just need a crystal, 2 zeners, som ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg342427#msg342427">57</a></td><td>06 May 2011</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Ah, well, I can explain that quite simply: it&#39;s easier! I chose Atmel AVR mainly beca ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg342580#msg342580">58</a></td><td>06 May 2011</td><td><span style="float:right;"><b>8_INCH_FLOPPY:</b></span></td><td> Thanks for the detailed explanation. I didn&#39;t mean to suggest that you &nbsp;are lazy. Aft ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg342616#msg342616">59</a></td><td>06 May 2011</td><td><span style="float:right;"><b>Soarer:</b></span></td><td>I didn&#39;t really think you had, the last paragraph was very much tongue in cheek :-) ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg342673#msg342673">60</a></td><td>06 May 2011</td><td><span style="float:right;"><b>8_INCH_FLOPPY:</b></span></td><td> I caved and ordered a couple. Maybe I can recoup the cost of one by selling the other ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg342910#msg342910">61</a></td><td>07 May 2011</td><td><span style="float:right;"><b>Oqsy:</b></span></td><td> Repeat that enough times in the right places and they will. However, this is still DI ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg343018#msg343018">62</a></td><td>07 May 2011</td><td><span style="float:right;"><b>8_INCH_FLOPPY:</b></span></td><td> Not if I build a bunch and sell them. Muahahahaha.</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg343202#msg343202">63</a></td><td>08 May 2011</td><td><span style="float:right;"><b>Hak Foo:</b></span></td><td> To me, the logical endgame of this project is to eventually develop a small-run PCB w ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg343252#msg343252">64</a></td><td>08 May 2011</td><td><span style="float:right;"><b>bhtooefr:</b></span></td><td> Of course, in my case, I just mounted the Teensy internally. That way, it looks like ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg343753#msg343753">65</a></td><td>09 May 2011</td><td><span style="float:right;"><b>Mr. Perfect:</b></span></td><td> Ok, here&#39;s a question that probably hasn&#39;t come up before: can USB keyboards be hooke ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg343781#msg343781">66</a></td><td>09 May 2011</td><td><span style="float:right;"><b>Soarer:</b></span></td><td>Yes, it should work fine! (I&#39;m sure someone did ask that before, but maybe not in t ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg343899#msg343899">67</a></td><td>09 May 2011</td><td><span style="float:right;"><b>Mr. Perfect:</b></span></td><td> That&#39;s great news. So to wire a female USB socket to the controller you just match up ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg343914#msg343914">68</a></td><td>09 May 2011</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> I don&#39;t know how the passive USB to PS/2 adapters are wired up though - either probe ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg345109#msg345109">69</a></td><td>12 May 2011</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> New version (v0.994) posted which adds suspend and wake-up support! Many thanks to ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg345219#msg345219">70</a></td><td>12 May 2011</td><td><span style="float:right;"><b>slueth:</b></span></td><td> Soarer, you are amazing! &nbsp;:)</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg345559#msg345559">71</a></td><td>13 May 2011</td><td><span style="float:right;"><b>intealls:</b></span></td><td> Heh, no problem, just glad I was able to help :) You&#39;re the one doing the awesome wor ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg345571#msg345571">72</a></td><td>13 May 2011</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Well this phase is really a shakedown, making sure that reliability is top notch befo ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg345685#msg345685">73</a></td><td>13 May 2011</td><td><span style="float:right;"><b>Voixdelion:</b></span></td><td> Okay, I just kind of skimmed the discussion because it was all rather technical for m ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg345686#msg345686">74</a></td><td>13 May 2011</td><td><span style="float:right;"><b>bhtooefr:</b></span></td><td> Soarer is developing the firmware, you buy a Teensy or Teensy++, you can get one with ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg345690#msg345690">75</a></td><td>13 May 2011</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Basic shopping list: Optional items, as desired: To assemble it just needs a few wire ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg345692#msg345692">76</a></td><td>13 May 2011</td><td><span style="float:right;"><b>bhtooefr:</b></span></td><td> And, my build didn&#39;t even use the socket, due to how I installed mine.</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg345728#msg345728">77</a></td><td>13 May 2011</td><td><span style="float:right;"><b>intealls:</b></span></td><td> Here&#39;s my highly ghettoish solution (I HATE that movie btw) [ Attachment Invalid Or ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg345907#msg345907">78</a></td><td>13 May 2011</td><td><span style="float:right;"><b>ch_123:</b></span></td><td> Things often get more difficult to comprehend as you grow older.</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg345982#msg345982">79</a></td><td>14 May 2011</td><td><span style="float:right;"><b>slueth:</b></span></td><td> Not that hard as long as you can understand the pinouts. &nbsp;Make sure you are looking a ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg345999#msg345999">80</a></td><td>14 May 2011</td><td><span style="float:right;"><b>8_INCH_FLOPPY:</b></span></td><td>Is that the same as the XT pinout? I wired it up to my XT keyboard like that and it ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg346044#msg346044">81</a></td><td>14 May 2011</td><td><span style="float:right;"><b>slueth:</b></span></td><td> I used this with the information from the article: Conn. &nbsp; &nbsp; &nbsp; Teensy GND -------- GN ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg346056#msg346056">82</a></td><td>14 May 2011</td><td><span style="float:right;"><b>Oqsy:</b></span></td><td> Voix: &nbsp;I have this connected to a 122 Terminal F from the acfrazier group buy. Really ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg346090#msg346090">83</a></td><td>14 May 2011</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> The most common mistake so far is wiring the socket backwards - it&#39;s important to not ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg346149#msg346149">84</a></td><td>14 May 2011</td><td><span style="float:right;"><b>kishy:</b></span></td><td> [ Attachment Invalid Or Does Not Exist ] 18121[/ATTACH] Please feel free to pop this ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg346197#msg346197">85</a></td><td>14 May 2011</td><td><span style="float:right;"><b>Voixdelion:</b></span></td><td> kewl. &nbsp;will definitely try this...soon</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg346675#msg346675">86</a></td><td>15 May 2011</td><td><span style="float:right;"><b>Neit:</b></span></td><td> Finally done mine, 0.994 working perfectly with my cherry 81-3000 (yes MY switches ar ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg346764#msg346764">87</a></td><td>15 May 2011</td><td><span style="float:right;"><b>slueth:</b></span></td><td> It shouldn&#39;t light up, if it lights up there was a problem. &nbsp;Should handle nkro. Corr ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg346766#msg346766">88</a></td><td>15 May 2011</td><td><span style="float:right;"><b>bhtooefr:</b></span></td><td> If the keyboard itself doesn&#39;t handle NKRO, though, there&#39;s a problem, and it&#39;ll ligh ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg346802#msg346802">89</a></td><td>16 May 2011</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> I don&#39;t think the lack of NKRO is a factor here - the keyboard is still capable of tr ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg349618#msg349618">90</a></td><td>22 May 2011</td><td><span style="float:right;"><b>8_INCH_FLOPPY:</b></span></td><td> I got mine to work for a moment with a PS/2 keyboard, but after I unplugged it and tr ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg349622#msg349622">91</a></td><td>22 May 2011</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Yup, that&#39;s the right order when looking into the socket. AT and XT are the same. Pul ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg349632#msg349632">92</a></td><td>22 May 2011</td><td><span style="float:right;"><b>8_INCH_FLOPPY:</b></span></td><td> Ok, here&#39;s the message with one keypress on an AT keyboard: R06 R06 R06 It doesn&#39;t gi ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg349640#msg349640">93</a></td><td>22 May 2011</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Not accusing you of sloppy soldering! But something seems to have broken after the fi ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg349707#msg349707">94</a></td><td>22 May 2011</td><td><span style="float:right;"><b>8_INCH_FLOPPY:</b></span></td><td> There&#39;s continuity between The socket and the board, according to ye olde VTVM. Also, ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg349710#msg349710">95</a></td><td>22 May 2011</td><td><span style="float:right;"><b>8_INCH_FLOPPY:</b></span></td><td> Ok, I&#39;ve switched back to an AT board, and now it&#39;s not working again. Here&#39;s the mes ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg349711#msg349711">96</a></td><td>22 May 2011</td><td><span style="float:right;"><b>8_INCH_FLOPPY:</b></span></td><td> It seems that, out of the 3 AT keyboard that I&#39;ve tested, the only one that does not ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg349714#msg349714">97</a></td><td>22 May 2011</td><td><span style="float:right;"><b>8_INCH_FLOPPY:</b></span></td><td> After much testing, here&#39;s what basically happens: Normal AT keyboard: Works fine, do ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg349771#msg349771">98</a></td><td>22 May 2011</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Hmm... I used an IBM XT &#39;board for developing, and then had to tweak my code to get i ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg349912#msg349912">99</a></td><td>22 May 2011</td><td><span style="float:right;"><b>8_INCH_FLOPPY:</b></span></td><td> I tested my other XT keyboard, and it responded the same as the first one. I have to ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg350175#msg350175">100</a></td><td>23 May 2011</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Cherry &#39;board didn&#39;t do anything that might shed light on what the &#39;S&#39; setting on you ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg350538#msg350538">101</a></td><td>24 May 2011</td><td><span style="float:right;"><b>8_INCH_FLOPPY:</b></span></td><td> I&#39;m not sure what make they are. Unfortunately, the last owner peeled the stickers of ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg350637#msg350637">102</a></td><td>24 May 2011</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Oh wow, that would really help! Normally the signals very easy to capture on a &#39;scope ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg359618#msg359618">103</a></td><td>13 Jun 2011</td><td><span style="float:right;"><b>Hak Foo:</b></span></td><td> Is there any chance we can get the source if we want to compile our own custom mappin ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg360683#msg360683">104</a></td><td>14 Jun 2011</td><td><span style="float:right;"><b>8_INCH_FLOPPY:</b></span></td><td> These were all captured with me pressing the &quot;accent grave/tilde&quot; key. The &quot;S&quot; settin ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg362636#msg362636">105</a></td><td>18 Jun 2011</td><td><span style="float:right;"><b>REVENGE:</b></span></td><td> Soarer, this is an excellent project! My implementation works nicely with a Model F 1 ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg362816#msg362816">106</a></td><td>18 Jun 2011</td><td><span style="float:right;"><b>Soarer:</b></span></td><td>It could well well Autumn before I have a chance to implement the fancy bits; loo ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg362823#msg362823">107</a></td><td>18 Jun 2011</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> That Monterey is an odd beast! For starters, it&#39;s going more than twice as fast as a ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg362862#msg362862">108</a></td><td>18 Jun 2011</td><td><span style="float:right;"><b>didjamatic:</b></span></td><td> Nice work, I&#39;m doing this! &nbsp;Is there a downside to the ++ or is it just larger than n ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg362869#msg362869">109</a></td><td>18 Jun 2011</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> No downside apart from cost really! It just has more of everything (which the convert ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg367634#msg367634">110</a></td><td>25 Jun 2011</td><td><span style="float:right;"><b>REVENGE:</b></span></td><td> Soarer, one of the keys on my 122 key terminal Model F does not send any key codes th ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg367653#msg367653">111</a></td><td>25 Jun 2011</td><td><span style="float:right;"><b>Soarer:</b></span></td><td>My bad! Looks like I did half a change - I took it out of the global remaps, but fo ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg367662#msg367662">112</a></td><td>25 Jun 2011</td><td><span style="float:right;"><b>REVENGE:</b></span></td><td> Thanks! :) Aside from that key not sending a code, the board is currently missing def ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg368471#msg368471">113</a></td><td>26 Jun 2011</td><td><span style="float:right;"><b>kps:</b></span></td><td>This is what I did for my 122-key F; it might help someone else. No guarantees, and ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg369260#msg369260">114</a></td><td>28 Jun 2011</td><td><span style="float:right;"><b>Oqsy:</b></span></td><td> Nice. I need to do an ANSI mod and add my RGB modifiers too. Excellent work and thx f ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg371928#msg371928">115</a></td><td>02 Jul 2011</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> New version (0.995) posted that maps the top-right key of the numpad to &#39;Pause&#39;. Not ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg372484#msg372484">116</a></td><td>03 Jul 2011</td><td><span style="float:right;"><b>mr_a500:</b></span></td><td> I&#39;m thinking of trying this thing with an IBM 5155 keyboard. It should be the same as ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg372784#msg372784">117</a></td><td>04 Jul 2011</td><td><span style="float:right;"><b>REVENGE:</b></span></td><td> Yep, I had my BlackWidow and the Model F both connected. First off, the Teensy stays ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg373627#msg373627">118</a></td><td>05 Jul 2011</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> It has to stay powered for a keypress to be able to trigger the wake-up ;) &nbsp;I know it ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg373648#msg373648">119</a></td><td>05 Jul 2011</td><td><span style="float:right;"><b>REVENGE:</b></span></td><td> Still waiting for Explorer to scan the pr0n cache and total up the file sizes, I&#39;ll g ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg373666#msg373666">120</a></td><td>05 Jul 2011</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> It&#39;s just the size that counts! I&#39;ll check next time I reboot what I set in my BIOS, ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg373689#msg373689">121</a></td><td>05 Jul 2011</td><td><span style="float:right;"><b>REVENGE:</b></span></td><td> Sounds good, mad props again for developing and maintaining this project. :P</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg377416#msg377416">122</a></td><td>10 Jul 2011</td><td><span style="float:right;"><b>mr_a500:</b></span></td><td> So nobody has ever tried this with an IBM 5155? (that means I&#39;ll be the first... in h ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg377422#msg377422">123</a></td><td>10 Jul 2011</td><td><span style="float:right;"><b>kps:</b></span></td><td>Open it. Power and ground should be straightforward to identify. Data &amp; clock might ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg377428#msg377428">124</a></td><td>10 Jul 2011</td><td><span style="float:right;"><b>mr_a500:</b></span></td><td> You mean open the keyboard? That could be tricky. There are no screws. It looks like ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg377446#msg377446">125</a></td><td>10 Jul 2011</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> If you have a multimeter, you might be able to work it out without taking it apart. M ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg377772#msg377772">126</a></td><td>11 Jul 2011</td><td><span style="float:right;"><b>Hak Foo:</b></span></td><td> Revenge: &nbsp;I think I&#39;ve had a similar symptom. &nbsp;Only happened since 0.99.5, but it see ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg384194#msg384194">127</a></td><td>20 Jul 2011</td><td><span style="float:right;"><b>LETE:</b></span></td><td> These files aren&#39;t much use without the source code, right? Or did you just inject th ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg384204#msg384204">128</a></td><td>20 Jul 2011</td><td><span style="float:right;"><b>alaricljs:</b></span></td><td> You write the teensy firmware with this hex file. &nbsp;It&#39;s a complete firmware.</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg384207#msg384207">129</a></td><td>20 Jul 2011</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> [strike]I didn&#39;t work out what they were for either.... presumably OS side somewhere. ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg384217#msg384217">130</a></td><td>20 Jul 2011</td><td><span style="float:right;"><b>LETE:</b></span></td><td> I&#39;m talking about the files kps posted in the attached zip file &quot;remap.zip&quot; on page 1 ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg384220#msg384220">131</a></td><td>20 Jul 2011</td><td><span style="float:right;"><b>alaricljs:</b></span></td><td> Just looked at the contents, it&#39;s got a makefile and everything is automatic... it sp ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg384221#msg384221">132</a></td><td>20 Jul 2011</td><td><span style="float:right;"><b>LETE:</b></span></td><td> Ah, well said. Thank you.</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg384288#msg384288">133</a></td><td>20 Jul 2011</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Oh... so that&#39;s what it does... outrageous subterfuge!! I should warn anyone trying t ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg384293#msg384293">134</a></td><td>20 Jul 2011</td><td><span style="float:right;"><b>alaricljs:</b></span></td><td> The people WANT YOUR STUFF... ;) &nbsp;they just want it their way.</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg384321#msg384321">135</a></td><td>21 Jul 2011</td><td><span style="float:right;"><b>REVENGE:</b></span></td><td> Soarer, I understand you&#39;re not ready to release your source, but I would be satisfie ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg384417#msg384417">136</a></td><td>21 Jul 2011</td><td><span style="float:right;"><b>kps:</b></span></td><td> Thanks! I thought so, from the table contents. It&#39;s enough to get my Terminal F layou ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg385088#msg385088">137</a></td><td>22 Jul 2011</td><td><span style="float:right;"><b>LETE:</b></span></td><td> I&#39;m going to stick a couple solid state relays in my box and set this thing up to con ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg389392#msg389392">138</a></td><td>29 Jul 2011</td><td><span style="float:right;"><b>LETE:</b></span></td><td> Here are a few pictures of my teensy mounting solution for a model F terminal board. ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg396808#msg396808">139</a></td><td>11 Aug 2011</td><td><span style="float:right;"><b>SmallFry:</b></span></td><td> Is it possible that I could get the source code? I wanted to recompile/edit a little/ ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg396960#msg396960">140</a></td><td>11 Aug 2011</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Sorry, I&#39;m not ready to give it out yet. It might be a while because I&#39;m very busy wi ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg397088#msg397088">141</a></td><td>11 Aug 2011</td><td><span style="float:right;"><b>SmallFry:</b></span></td><td> Alright, thanks anyways Soarer</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg397641#msg397641">142</a></td><td>12 Aug 2011</td><td><span style="float:right;"><b>wcass:</b></span></td><td> Soarer, perhaps the GH community could help with building a front end? something that ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg400916#msg400916">143</a></td><td>18 Aug 2011</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> I&#39;m sorry, I missed this! Thanks for the offer! I would like some help with the front ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg406278#msg406278">144</a></td><td>28 Aug 2011</td><td><span style="float:right;"><b>wcass:</b></span></td><td> so a couple of questions. input file format should be ... what? default name? comment ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg406351#msg406351">145</a></td><td>28 Aug 2011</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> I&#39;m imagining something along the lines of this: (Case insensitive and spaces ignored ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg406478#msg406478">146</a></td><td>28 Aug 2011</td><td><span style="float:right;"><b>wcass:</b></span></td><td> would it conserve RAM to only include key mappings for the hardware and configuration ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg406554#msg406554">147</a></td><td>28 Aug 2011</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Oh, I was just using Colemak as an example, it needn&#39;t be included all the time. And ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg406726#msg406726">148</a></td><td>29 Aug 2011</td><td><span style="float:right;"><b>wcass:</b></span></td><td> yes, i was thinking to reload firmware when changing key maps and macros. speaking fo ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg406797#msg406797">149</a></td><td>29 Aug 2011</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Heh, it&#39;s not that - I&#39;d always planned on asking for someone to do the front end whe ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg407197#msg407197">150</a></td><td>30 Aug 2011</td><td><span style="float:right;"><b>Hak Foo:</b></span></td><td> box an xampp install with the package. I&#39;ve pondered doing that with an in-house web- ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg411919#msg411919">151</a></td><td>07 Sep 2011</td><td><span style="float:right;"><b>timofonic:</b></span></td><td> About macros and remappings... What about showing it as a Mass Storage Device with th ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg411952#msg411952">152</a></td><td>07 Sep 2011</td><td><span style="float:right;"><b>Shawn Stanford:</b></span></td><td> Well, I went ahead and ordered a Teensy 2.0, a breadboard and a set of LEDs. I&#39;ve nev ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg412017#msg412017">153</a></td><td>07 Sep 2011</td><td><span style="float:right;"><b>Oqsy:</b></span></td><td> Shawn, it&#39;s a great project to start with. Pretty straightforward, and great payoff ( ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg412033#msg412033">154</a></td><td>07 Sep 2011</td><td><span style="float:right;"><b>itlnstln:</b></span></td><td> So, in other words, you&#39;re calling Shawn a dummy. &nbsp;Way to support our troops.</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg412052#msg412052">155</a></td><td>07 Sep 2011</td><td><span style="float:right;"><b>one_each:</b></span></td><td> IF THE-KEY-PRESSED-HAS-A-KEYCAP-WITH-A-ON-IT THEN &nbsp; SEND-THE-CODE-FOR THE-LETTER-A. E ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg412096#msg412096">156</a></td><td>07 Sep 2011</td><td><span style="float:right;"><b>itlnstln:</b></span></td><td> I&#39;m lame. &nbsp;VB.NET for the win. &nbsp;I&#39;m a DB guy, not a programmer.</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg412363#msg412363">157</a></td><td>08 Sep 2011</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Seems a bit heavyweight for this! I think if JavaScript can&#39;t do it, a Python or Java ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg412689#msg412689">158</a></td><td>08 Sep 2011</td><td><span style="float:right;"><b>kps:</b></span></td><td> No, no, no. During the day, whenever someone presses a key, you simply append the mat ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg413121#msg413121">159</a></td><td>09 Sep 2011</td><td><span style="float:right;"><b>timofonic:</b></span></td><td> OK, sorry. I did think the structure would be able to be generated in-time. There wou ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg413226#msg413226">160</a></td><td>09 Sep 2011</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Of the four layers I was thinking of, the driver is actually the easiest part. The de ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg413342#msg413342">161</a></td><td>09 Sep 2011</td><td><span style="float:right;"><b>timofonic:</b></span></td><td>Like this board? They use a common Broadcom bluetooth controller.</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg413351#msg413351">162</a></td><td>09 Sep 2011</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> The battery comment wasn&#39;t a joke! Those things work great as controllers for contact ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg413432#msg413432">163</a></td><td>09 Sep 2011</td><td><span style="float:right;"><b>Oqsy:</b></span></td><td> Lawn mower batt work? :P</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg413518#msg413518">164</a></td><td>09 Sep 2011</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Bettah! You could fit one a terminal keyboard&#39;s case, no problem. Look a bit daft con ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg413737#msg413737">165</a></td><td>10 Sep 2011</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> I had changed the ACPI setting in my BIOS to S1. IIRC, in S3 the wakeup simply didn&#39;t ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg413855#msg413855">166</a></td><td>10 Sep 2011</td><td><span style="float:right;"><b>timofonic:</b></span></td><td> Well, the oriiginal battery fromm. The bluetooth keyboard was 1xx mah and lastedd a w ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg413919#msg413919">167</a></td><td>10 Sep 2011</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Unable to reproduce :-/ BIOS Power Settings at defaults (S3). Fresh Window 7 install. ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg413946#msg413946">168</a></td><td>10 Sep 2011</td><td><span style="float:right;"><b>Hak Foo:</b></span></td><td> It seems to be alonbg the lines of suspend wake via converted board power down conver ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg413949#msg413949">169</a></td><td>10 Sep 2011</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> power down?</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg414495#msg414495">170</a></td><td>11 Sep 2011</td><td><span style="float:right;"><b>Hak Foo:</b></span></td><td> start-&gt; shut down?</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg414508#msg414508">171</a></td><td>11 Sep 2011</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> I dunno, you said it! :-p I&#39;m confused as to how power down is part of a problem with ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg422288#msg422288">172</a></td><td>27 Sep 2011</td><td><span style="float:right;"><b>fohat.digs:</b></span></td><td> OK guys, I am totally stoked. I received an IBM Model F 122-key terminal keyboard fro ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg423084#msg423084">173</a></td><td>29 Sep 2011</td><td><span style="float:right;"><b>theferenc:</b></span></td><td> Harry, did you snag yours from OceanTechPrecision on ebay? Does it have dip switches ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg423103#msg423103">174</a></td><td>29 Sep 2011</td><td><span style="float:right;"><b>kishy:</b></span></td><td> It can misbehave quite severely if you attempt to press any keys BEFORE the auto-dete ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg423105#msg423105">175</a></td><td>29 Sep 2011</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Sounds like the adapter is somehow thinking it&#39;s a scan code set 2 board, so not tryi ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg423112#msg423112">176</a></td><td>29 Sep 2011</td><td><span style="float:right;"><b>fohat.digs:</b></span></td><td> Thanks, but I am not there yet. It will be sometime next week before my Teensy gets h ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg423120#msg423120">177</a></td><td>29 Sep 2011</td><td><span style="float:right;"><b>theferenc:</b></span></td><td> Thanks, kishy. I&#39;ll give that a try and see if it fixes the issue. I would really lov ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg423123#msg423123">178</a></td><td>29 Sep 2011</td><td><span style="float:right;"><b>Hak Foo:</b></span></td><td> The Enter labelling is just for decoration- the converter ighnores it. &nbsp;I have a 122M ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg423323#msg423323">179</a></td><td>29 Sep 2011</td><td><span style="float:right;"><b>theferenc:</b></span></td><td> Running hid_listen, I get the following: rAA rBF rBF wEE R101wF2 rEE wED R100!!00wED ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg423353#msg423353">180</a></td><td>29 Sep 2011</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> It looks like it&#39;s just unusually slow to reply to commands - like world record holde ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg423471#msg423471">181</a></td><td>29 Sep 2011</td><td><span style="float:right;"><b>theferenc:</b></span></td><td> Soarer is the man! Hopefully it continues to work as well as it does right now -- tho ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg423728#msg423728">182</a></td><td>30 Sep 2011</td><td><span style="float:right;"><b>Oqsy:</b></span></td><td> Great news!</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg423744#msg423744">183</a></td><td>30 Sep 2011</td><td><span style="float:right;"><b>theferenc:</b></span></td><td> So one last question about this. The key on the keypad, directly above 9. What is its ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg423752#msg423752">184</a></td><td>30 Sep 2011</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> It&#39;s scroll lock... what does that do in X?</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg423786#msg423786">185</a></td><td>30 Sep 2011</td><td><span style="float:right;"><b>N8N:</b></span></td><td> nothing at all, really... but I just tried it on my machine and scroll lock comes up ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg423797#msg423797">186</a></td><td>30 Sep 2011</td><td><span style="float:right;"><b>theferenc:</b></span></td><td> Yeah, I thought it should be scroll lock, but it doesn&#39;t match scroll lock on my othe ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg424335#msg424335">187</a></td><td>01 Oct 2011</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Just posted a new version (v0.996) with fixes for some reported problems, and a coupl ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg424358#msg424358">188</a></td><td>01 Oct 2011</td><td><span style="float:right;"><b>theferenc:</b></span></td><td> That second one is almost exactly how I have mine laid out at the moment. Too bad I d ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg424363#msg424363">189</a></td><td>01 Oct 2011</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Ah, but instead you have the jumper block inside! I&#39;ve chosen the IDs so they only re ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg424440#msg424440">190</a></td><td>01 Oct 2011</td><td><span style="float:right;"><b>SmallFry:</b></span></td><td> Just a thought... not really necessary but it&#39;d be cool to add support for the SD rea ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg424449#msg424449">191</a></td><td>01 Oct 2011</td><td><span style="float:right;"><b>theferenc:</b></span></td><td> AHK runs portably, for certain sure. It&#39;s just a download directly from their website ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg424454#msg424454">192</a></td><td>01 Oct 2011</td><td><span style="float:right;"><b>SmallFry:</b></span></td><td> My school would have a hacker alert stroke if I wired in like at home. Therefore, I w ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg424477#msg424477">193</a></td><td>01 Oct 2011</td><td><span style="float:right;"><b>Oqsy:</b></span></td><td> The perfboard and alligator clip rig I&#39;m using for this would surely get a bomb squad ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg425809#msg425809">194</a></td><td>04 Oct 2011</td><td><span style="float:right;"><b>kishy:</b></span></td><td> Here&#39;s what I&#39;ve been working on for the last little while... Complete with externall ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg425879#msg425879">195</a></td><td>04 Oct 2011</td><td><span style="float:right;"><b>timofonic:</b></span></td><td>Hello. Very nice! I would consider ordering one too... What about adding a SD card ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg425903#msg425903">196</a></td><td>04 Oct 2011</td><td><span style="float:right;"><b>kishy:</b></span></td><td> What I did is essentially just &#39;packaging&#39; the adapter...I did not make any design ch ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg425918#msg425918">197</a></td><td>04 Oct 2011</td><td><span style="float:right;"><b>alaricljs:</b></span></td><td> 7 pins for the LCD... 2 pins for up/down buttons... 5 pins for the SD card slot... 2 ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg425957#msg425957">198</a></td><td>04 Oct 2011</td><td><span style="float:right;"><b>one_each:</b></span></td><td> @Soarer &nbsp;Have you considered using something like code.google.com to host the code as ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg425988#msg425988">199</a></td><td>04 Oct 2011</td><td><span style="float:right;"><b>timofonic:</b></span></td><td> @Soarer In terms of available pinout, memory and such... How&#39;s the Teensy2 or Tenensy ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg425994#msg425994">200</a></td><td>04 Oct 2011</td><td><span style="float:right;"><b>alaricljs:</b></span></td><td> I&#39;m not exactly sure what it is you&#39;re asking timo, but if you scroll to the top of t ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg426052#msg426052">201</a></td><td>04 Oct 2011</td><td><span style="float:right;"><b>fohat.digs:</b></span></td><td> Help ! Getting very close, I think, but I am way over my head here, and I am not a pr ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg426087#msg426087">202</a></td><td>04 Oct 2011</td><td><span style="float:right;"><b>Oqsy:</b></span></td><td> Have you checked yr pinout from the keyboard? &nbsp;I have no idea what colors mean what i ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg426089#msg426089">203</a></td><td>04 Oct 2011</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Thanks for showing your build! &nbsp; SD card is almost definitely a &#39;no&#39;. There&#39;s no shor ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg426092#msg426092">204</a></td><td>04 Oct 2011</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> [strike]Have you tried swapping the yellow and red wires?[/strike] Hang on, not sure ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg426099#msg426099">205</a></td><td>04 Oct 2011</td><td><span style="float:right;"><b>fohat.digs:</b></span></td><td> Thanks for the reply. I think/hope I did something kind of like what you described. M ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg426102#msg426102">206</a></td><td>04 Oct 2011</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Found a label inside my 122F so decided to just photograph it :-) [ Attachment Inval ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg426103#msg426103">207</a></td><td>04 Oct 2011</td><td><span style="float:right;"><b>fohat.digs:</b></span></td><td> Thank you so much. I think that is exactly how I connected mine. Is there anything el ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg426105#msg426105">208</a></td><td>04 Oct 2011</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Is it? Yellow/Clock should go to PD1, and Red/Data should go to PD0.</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg426113#msg426113">209</a></td><td>04 Oct 2011</td><td><span style="float:right;"><b>fohat.digs:</b></span></td><td> RIGHT YOU ARE ! Stupid me with that whole upside-down-and-backwards thing! (And my re ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg426135#msg426135">210</a></td><td>05 Oct 2011</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Excellent! Glad to hear it&#39;s working :-)</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg426141#msg426141">211</a></td><td>05 Oct 2011</td><td><span style="float:right;"><b>fohat.digs:</b></span></td><td> Sorry for the double post, but, for doing the majority of my re-mapping for me! I w ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg426192#msg426192">212</a></td><td>05 Oct 2011</td><td><span style="float:right;"><b>theferenc:</b></span></td><td> Yeah, I briefly considered wiring up the lock LEDs. Then I realized, wait a sec, I do ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg426427#msg426427">213</a></td><td>05 Oct 2011</td><td><span style="float:right;"><b>fohat.digs:</b></span></td><td> Now this beauty is together and working great. I could not be more pleased - it is fa ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg426516#msg426516">214</a></td><td>05 Oct 2011</td><td><span style="float:right;"><b>theferenc:</b></span></td><td> If you&#39;re running windows, AHK is a decent option, as is KeyTweak. The former is an a ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg426525#msg426525">215</a></td><td>05 Oct 2011</td><td><span style="float:right;"><b>fohat.digs:</b></span></td><td> I usually work in Windows, but I dual-boot to Ubuntu fairly often. I would use it a l ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg426530#msg426530">216</a></td><td>05 Oct 2011</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> There was a hack somewhere, which should work, but some remappings done that way migh ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg426553#msg426553">217</a></td><td>05 Oct 2011</td><td><span style="float:right;"><b>theferenc:</b></span></td><td> I use KeyTweak and xmodmap both, without issues whatsoever. I prefer these over the A ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg426616#msg426616">218</a></td><td>06 Oct 2011</td><td><span style="float:right;"><b>fohat.digs:</b></span></td><td> You guys are simply the greatest! But I am a pest. Hopefully, when you answer my ques ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg426624#msg426624">219</a></td><td>06 Oct 2011</td><td><span style="float:right;"><b>theferenc:</b></span></td><td> That&#39;s weird, I was able to remap them just fine. Did you use &quot;teach mode&quot; in keytwea ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg426644#msg426644">220</a></td><td>06 Oct 2011</td><td><span style="float:right;"><b>fohat.digs:</b></span></td><td> No luck with that. I went through the routines in both &quot;Half Teach Mode&quot; and &quot;Full Te ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg426671#msg426671">221</a></td><td>06 Oct 2011</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> I reckon KeyTweak has got confused trying to remap Pause... try reverting both NumLoc ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg426916#msg426916">222</a></td><td>07 Oct 2011</td><td><span style="float:right;"><b>fohat.digs:</b></span></td><td> Boy-oh-boy! a missed day of geekhack down had me worried! Thanks for all your help, g ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg426937#msg426937">223</a></td><td>07 Oct 2011</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Sorry, but you won&#39;t be able to remap some of the keys in that left hand F-key block, ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg427785#msg427785">224</a></td><td>09 Oct 2011</td><td><span style="float:right;"><b>fohat.digs:</b></span></td><td> Hi, it&#39;s me, harrymoss, I just felt like I needed to change my ID to something less m ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg427848#msg427848">225</a></td><td>09 Oct 2011</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> As it stands, I&#39;m afraid you&#39;ll have to accept that you can&#39;t get all of the layout t ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg430102#msg430102">226</a></td><td>13 Oct 2011</td><td><span style="float:right;"><b>theferenc:</b></span></td><td> That&#39;s really weird, honestly. I remapped nearly everything in Linux with no issues w ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg431298#msg431298">227</a></td><td>14 Oct 2011</td><td><span style="float:right;"><b>fohat.digs:</b></span></td><td> So, my amateurish trial and error fumblings continue. I post this stuff, not in a nar ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg431929#msg431929">228</a></td><td>15 Oct 2011</td><td><span style="float:right;"><b>LETE:</b></span></td><td> You don&#39;t need to worry about the thicker coating affecting performance. When the key ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg432044#msg432044">229</a></td><td>16 Oct 2011</td><td><span style="float:right;"><b>fohat.digs:</b></span></td><td> It might not be all that hard to make one, provided that you had a hole punch of just ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg432052#msg432052">230</a></td><td>16 Oct 2011</td><td><span style="float:right;"><b>LETE:</b></span></td><td> Let&#39;s both give it a shot and compare notes. Of course, if we get a proof of concept ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg432713#msg432713">231</a></td><td>17 Oct 2011</td><td><span style="float:right;"><b>fohat.digs:</b></span></td><td> May be getting far enough off-topic to warrant a new thread. Since I am really fond o ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg432917#msg432917">232</a></td><td>17 Oct 2011</td><td><span style="float:right;"><b>LETE:</b></span></td><td> Yeah, I made us a thread of our own.</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg434752#msg434752">233</a></td><td>19 Oct 2011</td><td><span style="float:right;"><b>fohat.digs:</b></span></td><td> Soarer - I have put together a 2nd keyboard, and left all the jumpers open to defaul ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg435526#msg435526">234</a></td><td>20 Oct 2011</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> I wish I knew why that numlock won&#39;t remap! Does it just stay as numlock then? True, ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg435618#msg435618">235</a></td><td>20 Oct 2011</td><td><span style="float:right;"><b>fohat.digs:</b></span></td><td> Yes, it just stays NumLock regardless of what I tell it to be. I was using KeyTweak a ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg436684#msg436684">236</a></td><td>22 Oct 2011</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> No requests, sorry! The two alternative mappings came about for specific reasons - th ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg437303#msg437303">237</a></td><td>23 Oct 2011</td><td><span style="float:right;"><b>theferenc:</b></span></td><td> I would recommend something like C++/Qt combination, or possibly python using wx or s ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg437662#msg437662">238</a></td><td>24 Oct 2011</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> C++/Qt would suit me - I&#39;d only need to learn the Qt bit! I think I&#39;ll just go with C ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg438301#msg438301">239</a></td><td>24 Oct 2011</td><td><span style="float:right;"><b>HaaTa:</b></span></td><td> Heh, I know Qt :D</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg441956#msg441956">240</a></td><td>29 Oct 2011</td><td><span style="float:right;"><b>RPro:</b></span></td><td> Hi - dumb question,but I couldn&#39;t find it with search: Does this Teensy PS2 adapter w ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg441968#msg441968">241</a></td><td>30 Oct 2011</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> It should - it certainly works with my Dell AT102W and SGI Granite :)</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg441974#msg441974">242</a></td><td>30 Oct 2011</td><td><span style="float:right;"><b>RPro:</b></span></td><td> That&#39;s great! Gonna order a teensy board soon then. </td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg442398#msg442398">243</a></td><td>31 Oct 2011</td><td><span style="float:right;"><b>fohat.digs:</b></span></td><td> A couple of things: First, do you want the Teensy for the Dell AT-101 for gaming? Bec ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg442496#msg442496">244</a></td><td>31 Oct 2011</td><td><span style="float:right;"><b>kishy:</b></span></td><td> And that really does sum up a lot of why so many of us love these things...the Fs, es ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg442915#msg442915">245</a></td><td>31 Oct 2011</td><td><span style="float:right;"><b>fohat.digs:</b></span></td><td> You have to take the Model F apart to really appreciate its construction. It seems mo ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg445779#msg445779">246</a></td><td>04 Nov 2011</td><td><span style="float:right;"><b>theferenc:</b></span></td><td> I know the M cases can be dyed, but it&#39;s a challenge due to the size. Some folks have ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg446313#msg446313">247</a></td><td>05 Nov 2011</td><td><span style="float:right;"><b>fohat.digs:</b></span></td><td> I decided that the advice was mostly against dyeing the Model F case, so I went to th ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg446412#msg446412">248</a></td><td>06 Nov 2011</td><td><span style="float:right;"><b>RPro:</b></span></td><td> Actually, my new Sandy Bridge Asus P8Z68V-Pro motherboard does not have any PS/2 port ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg446446#msg446446">249</a></td><td>06 Nov 2011</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Looks great, I like it! This code can&#39;t add NKRO to a non-NKRO keyboard of course, b ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg448164#msg448164">250</a></td><td>08 Nov 2011</td><td><span style="float:right;"><b>kishy:</b></span></td><td> That&#39;s GORGEOUS! Very well done.</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg449646#msg449646">251</a></td><td>11 Nov 2011</td><td><span style="float:right;"><b>RPro:</b></span></td><td> I got the teensy converter programmed and the connector soldered (stole it from an ol ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg450169#msg450169">252</a></td><td>11 Nov 2011</td><td><span style="float:right;"><b>RPro:</b></span></td><td> Whoops - guess the Dell AT101W is a 2KRO. Oh well.</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg450192#msg450192">253</a></td><td>11 Nov 2011</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Ah cool, you got it working ok! You never know exactly what you&#39;re going to get with ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg450205#msg450205">254</a></td><td>11 Nov 2011</td><td><span style="float:right;"><b>RC-1140:</b></span></td><td> Hey, Currently I&#39;m using this adapter for a 1990&#39;s 122-Key Terminal Model M, and in g ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg450231#msg450231">255</a></td><td>11 Nov 2011</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Hmm, I dunno! Although... 7 is the HID usage page for keyboard keys, and 88 is the HI ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg450246#msg450246">256</a></td><td>11 Nov 2011</td><td><span style="float:right;"><b>RC-1140:</b></span></td><td> well, 93 is the X keycode for the Hiragana_Katakana Symbol. I don&#39;t know why, but one ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg450273#msg450273">257</a></td><td>12 Nov 2011</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Oh, ok. I don&#39;t really know anything about remapping USB keyboards in X, but somethin ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg450319#msg450319">258</a></td><td>12 Nov 2011</td><td><span style="float:right;"><b>RC-1140:</b></span></td><td> d&#39;oh! when in doubt, read manpages&hellip; m( Well. Looks like I have to do it by editing al ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg450403#msg450403">259</a></td><td>12 Nov 2011</td><td><span style="float:right;"><b>RPro:</b></span></td><td> Hmm, I seem to be having an issue - it seems when I let the PC idle for a while (it d ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg450499#msg450499">260</a></td><td>12 Nov 2011</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> That sounds odd, I&#39;m gonna hope it works ok on a rear port! Power saving can be an is ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg450714#msg450714">261</a></td><td>12 Nov 2011</td><td><span style="float:right;"><b>RPro:</b></span></td><td> I have an Asus P8Z68-V Pro motherboard. Windows 7 64 bit. It is set to S3. It BSODed ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg450793#msg450793">262</a></td><td>13 Nov 2011</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> I doubt the converter caused a BSOD! Wish I knew what to suggest for that, getting a ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg450986#msg450986">263</a></td><td>13 Nov 2011</td><td><span style="float:right;"><b>RPro:</b></span></td><td> Yeah I don&#39;t think it was the converter. If I have more issues with the keyboard itse ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg465833#msg465833">264</a></td><td>07 Dec 2011</td><td><span style="float:right;"><b>dorkvader:</b></span></td><td> Hmm, Can I use something like this to decode a normal ascii keyboard?</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg466000#msg466000">265</a></td><td>07 Dec 2011</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Dunno... I&#39;m not sure what you mean...?</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg466081#msg466081">266</a></td><td>07 Dec 2011</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Are not whole translation tables! As a silly example, if you wanted to swap the &#39;1&#39; k ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg466149#msg466149">267</a></td><td>08 Dec 2011</td><td><span style="float:right;"><b>hasu:</b></span></td><td> mmm, nice features! and can&#39;t wait for trying new your firmware! If the syntax is sim ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg466159#msg466159">268</a></td><td>08 Dec 2011</td><td><span style="float:right;"><b>alaricljs:</b></span></td><td> I want. &nbsp;I am not patient... but I haven&#39;t succeeded in getting anywhere with my own ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg466187#msg466187">269</a></td><td>08 Dec 2011</td><td><span style="float:right;"><b>fohat.digs:</b></span></td><td> Soarer - Have you come up with a way to remap those 2 pesky numpad keys on the F-122 ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg466252#msg466252">270</a></td><td>08 Dec 2011</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Thanks! I&#39;m looking for the quickest way to get something usable - a better syntax, o ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg472938#msg472938">271</a></td><td>18 Dec 2011</td><td><span style="float:right;"><b>LukStarkiller:</b></span></td><td> I have one question in mind, which is the slower response time (latency) that we can ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg472974#msg472974">272</a></td><td>18 Dec 2011</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Hmm, good question! I haven&#39;t tested it, but I the worst case should be just under ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg473016#msg473016">273</a></td><td>18 Dec 2011</td><td><span style="float:right;"><b>LukStarkiller:</b></span></td><td> :eek: Surprising information I never thought that the delay caused by the keyboard&#39;s ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg473077#msg473077">274</a></td><td>18 Dec 2011</td><td><span style="float:right;"><b>dorkvader:</b></span></td><td> I had to do some research, to know what I meant by that (I had to look up and double ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg473902#msg473902">275</a></td><td>19 Dec 2011</td><td><span style="float:right;"><b>Mikelittoris:</b></span></td><td> Okey, so i&#39;ve got my terminal 122 key model f (6110347), my teensy with a female 5 po ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg473907#msg473907">276</a></td><td>19 Dec 2011</td><td><span style="float:right;"><b>DaemonRaccoon:</b></span></td><td> Assuming counting from the bottom left (facing the connector). That&#39;s AT (and PS/2), ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg473913#msg473913">277</a></td><td>19 Dec 2011</td><td><span style="float:right;"><b>Mikelittoris:</b></span></td><td> Oh crapper! Thanks alot DeamonRaccoon yo&#39;re the best, I shall get back to the solderi ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg473969#msg473969">278</a></td><td>19 Dec 2011</td><td><span style="float:right;"><b>Mikelittoris:</b></span></td><td> Well I&#39;ve connected the cables as you said DaemonRaccoon. Still nothing is happening. ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg473994#msg473994">279</a></td><td>19 Dec 2011</td><td><span style="float:right;"><b>DaemonRaccoon:</b></span></td><td> Start with flashing the Teensy without the keyboard connected, make sure you have the ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg474004#msg474004">280</a></td><td>19 Dec 2011</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Don&#39;t panic just yet - it&#39;s not easy to kill a Teensy with this mod! I think about th ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg474012#msg474012">281</a></td><td>19 Dec 2011</td><td><span style="float:right;"><b>Mikelittoris:</b></span></td><td> Ok thanks I will have to try that tomorrow, been up for 32h straight now and I thogut ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg474016#msg474016">282</a></td><td>19 Dec 2011</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> LOL! Yeah, helps if everything is plugged in!</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg474047#msg474047">283</a></td><td>19 Dec 2011</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> I&#39;ve no idea! There is another Wyse that kbdbabel has signalling info for, and it is ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg474414#msg474414">284</a></td><td>20 Dec 2011</td><td><span style="float:right;"><b>Mikelittoris:</b></span></td><td> There we go, connected the cable to the controller and it works! I&#39;ve done it, YEY! : ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg480771#msg480771">285</a></td><td>31 Dec 2011</td><td><span style="float:right;"><b>thebum:</b></span></td><td> Wow. Soarer thanks so much for putting your time into this. Just got my teensy today. ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg482787#msg482787">286</a></td><td>04 Jan 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> You&#39;re welcome - thanks for posting :-) &nbsp;The XT support was actually one of the easie ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg482801#msg482801">287</a></td><td>04 Jan 2012</td><td><span style="float:right;"><b>litster:</b></span></td><td> Soarer, is your mapping without recompiling part ready yet? &nbsp;I am wondering if I coul ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg482820#msg482820">288</a></td><td>04 Jan 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Afraid not - I haven&#39;t had time to do any more since the last status update :-( The o ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg482879#msg482879">289</a></td><td>04 Jan 2012</td><td><span style="float:right;"><b>litster:</b></span></td><td> That&#39;s cool, Soarer. &nbsp;We can wait. &nbsp;Thanks.</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg483420#msg483420">290</a></td><td>05 Jan 2012</td><td><span style="float:right;"><b>thebum:</b></span></td><td> Thanks for the welcome. &nbsp;I&#39;ve spent quite a bit of time on the board and have encount ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg527014#msg527014">291</a></td><td>26 Feb 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> New version posted. For the brave!</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg527041#msg527041">292</a></td><td>26 Feb 2012</td><td><span style="float:right;"><b>timofonic:</b></span></td><td> Features list? Please? :)</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg527063#msg527063">293</a></td><td>26 Feb 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Not brave enough - you&#39;re barred! :-p There is some (scant) documentation in the tool ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg527414#msg527414">294</a></td><td>27 Feb 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Ok, so what&#39;s new is all the stuff outlined in this post, and media key support. You ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg529599#msg529599">295</a></td><td>28 Feb 2012</td><td><span style="float:right;"><b>REVENGE:</b></span></td><td> HOOOOOOOOOORAAAAAAAAAYYYYY!</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg529605#msg529605">296</a></td><td>28 Feb 2012</td><td><span style="float:right;"><b>alaricljs:</b></span></td><td> Can you explain a &#39;SELECT&#39;? &nbsp;It sounds as tho it can be used to set a layer/keymap vi ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg529611#msg529611">297</a></td><td>28 Feb 2012</td><td><span style="float:right;"><b>litster:</b></span></td><td> This new update sounds very awesome. &nbsp;We need someone to help port it over to use on ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg529636#msg529636">298</a></td><td>28 Feb 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Pretty much what I thought when I finally found some time to work on it again!! FN an ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg529642#msg529642">299</a></td><td>28 Feb 2012</td><td><span style="float:right;"><b>alaricljs:</b></span></td><td> Where you use crazy chords, I would use Fn. &nbsp;I&#39;m also not a fan of toggles, hence usi ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg529658#msg529658">300</a></td><td>28 Feb 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> The crazy chord was just an example :) There must be millions of ways you could put t ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg529882#msg529882">301</a></td><td>29 Feb 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Oh yeah, forgot to mention - SELECT_0 can be used to reset all toggles to off. So you ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg530048#msg530048">302</a></td><td>29 Feb 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Currently got about a dozen items on my to-do list, and making this sort of thing pos ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg530083#msg530083">303</a></td><td>29 Feb 2012</td><td><span style="float:right;"><b>alaricljs:</b></span></td><td> Well, there&#39;s people willing to help if you want to share the load &nbsp;;)</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg530662#msg530662">304</a></td><td>29 Feb 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Has anyone had a go at compiling the tools for Linux or MacOSX? (Linux I could try so ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg531133#msg531133">305</a></td><td>29 Feb 2012</td><td><span style="float:right;"><b>theferenc:</b></span></td><td> I can try it on Mac later today or tomorrow, if you want. I&#39;ll be trying Linux, as we ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg531213#msg531213">306</a></td><td>29 Feb 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Either would be great! Linux is probably the one I&#39;m more worried about, in case diff ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg532344#msg532344">307</a></td><td>01 Mar 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Lego! [ Attachment Invalid Or Does Not Exist ] 42352[/ATTACH]</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg532355#msg532355">308</a></td><td>01 Mar 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> I call the bastardized version of usage page 7 HID codes that the converter uses inte ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg532652#msg532652">309</a></td><td>02 Mar 2012</td><td><span style="float:right;"><b>litster:</b></span></td><td> Good to hear that this is on your to-do list!</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg532876#msg532876">310</a></td><td>02 Mar 2012</td><td><span style="float:right;"><b>mkawa:</b></span></td><td> i can port this to phantom, i just need some pointers on how to get simulavr running ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg532999#msg532999">311</a></td><td>02 Mar 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> I haven&#39;t used the simulator at all, just a combination of debug print output, extra ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg534032#msg534032">312</a></td><td>03 Mar 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Built myself a neat converter today :-) A while back I spotted some console hack dong ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg534039#msg534039">313</a></td><td>03 Mar 2012</td><td><span style="float:right;"><b>SmallFry:</b></span></td><td> SWEET! Nice package to keep your converter in! Since it uses Atmel&#39;s stuff to program ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg534045#msg534045">314</a></td><td>03 Mar 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Thanks! Still one thing left to do... drill a hole in the case so I can reset it for ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg534047#msg534047">315</a></td><td>03 Mar 2012</td><td><span style="float:right;"><b>alaricljs:</b></span></td><td> How much does the case flex in that spot? &nbsp;You might not need a hole, just fill the g ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg534048#msg534048">316</a></td><td>03 Mar 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Sorry, missed your edit... No, it&#39;s not compatible with the Teensy utility, and you c ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg534050#msg534050">317</a></td><td>03 Mar 2012</td><td><span style="float:right;"><b>mkawa:</b></span></td><td> ok message received -- it sounds like simulators are pretty hopeless. this will have ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg534057#msg534057">318</a></td><td>03 Mar 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Hardly any flex, surprisingly, but it might _just_ work... with a very firm squeeze! ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg534065#msg534065">319</a></td><td>03 Mar 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Dunno about hopeless, but I always find using them a mixed bag. It&#39;s nice to be able ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg534069#msg534069">320</a></td><td>03 Mar 2012</td><td><span style="float:right;"><b>mkawa:</b></span></td><td> agreed. i was hoping there was a nice debugging toolkit that would let me do these th ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg534197#msg534197">321</a></td><td>03 Mar 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Hmm. This looks quite easy, actually, but which address to jump to depends on the boo ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg535332#msg535332">322</a></td><td>05 Mar 2012</td><td><span style="float:right;"><b>drteming:</b></span></td><td> Newbie here. &nbsp;Just got a terminal 1390572 last week. &nbsp;Cleaned it up and did a full bo ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg536118#msg536118">323</a></td><td>05 Mar 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Thank you for posting pics - I love seeing a nice tidy build!</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg536351#msg536351">324</a></td><td>06 Mar 2012</td><td><span style="float:right;"><b>fohat.digs:</b></span></td><td> Oh that is beautiful. I am doing something similar when I have some spare time, and y ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg536995#msg536995">325</a></td><td>06 Mar 2012</td><td><span style="float:right;"><b>theferenc:</b></span></td><td> Soarer, do you want compilation feedback via PM or in the thread?</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg537028#msg537028">326</a></td><td>06 Mar 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Aha, cool! Probably here, in case others might want to try as well. Unless it&#39;s embar ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg537280#msg537280">327</a></td><td>07 Mar 2012</td><td><span style="float:right;"><b>theferenc:</b></span></td><td> I don&#39;t think it&#39;s embarrassing, no. This is all on Linux (RHEL 6). I was able to get ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg537283#msg537283">328</a></td><td>07 Mar 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Knocked together some code that should work for nearly all Atmel AVR chips (except xm ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg537299#msg537299">329</a></td><td>07 Mar 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Thanks for putting the time in! I&#39;ll plug my Linux (Mint, Debian) box back in so I ca ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg537453#msg537453">330</a></td><td>07 Mar 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Got scrd and scwr working on Mint! Needed libusb-0.1-4 and libusb-dev installing to g ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg537713#msg537713">331</a></td><td>07 Mar 2012</td><td><span style="float:right;"><b>RC-1140:</b></span></td><td> Hey Soarer, at first: thank you very much for creating such a fantastic converter sof ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg537797#msg537797">332</a></td><td>07 Mar 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> It should work fine on any 32U4, as long as you can get it in there! The dongle I ada ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg538883#msg538883">333</a></td><td>08 Mar 2012</td><td><span style="float:right;"><b>RC-1140:</b></span></td><td> Actually even this would be great, as I&#39;m currently using 0.996 anyway. This might be ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg538919#msg538919">334</a></td><td>08 Mar 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> The trouble is, I&#39;m not sure why it helps much - the &#39;32U4 chip is about 5EUR, and th ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg538924#msg538924">335</a></td><td>08 Mar 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> In other news, I just added Jump to Bootloader support for the next release, with two ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg539315#msg539315">336</a></td><td>08 Mar 2012</td><td><span style="float:right;"><b>RC-1140:</b></span></td><td> Yeah, of course that little price difference doesn&#39;t justify the extra work you would ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg539358#msg539358">337</a></td><td>08 Mar 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> I will have a look in case there&#39;s some easy memory saving that can be done, but othe ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg539499#msg539499">338</a></td><td>08 Mar 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Well, I managed to reduce the size by about 2KB. (Stupid makefile forcing inclusion o ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg539786#msg539786">339</a></td><td>09 Mar 2012</td><td><span style="float:right;"><b>SmallFry:</b></span></td><td> Will you ever open source your code? I know I&#39;ve asked before, but can&#39;t recall off hand.</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg539989#msg539989">340</a></td><td>09 Mar 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> I really don&#39;t know if or when. Once done it cannot be undone - last time I started t ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg540320#msg540320">341</a></td><td>09 Mar 2012</td><td><span style="float:right;"><b>litster:</b></span></td><td> Which IBM keyboard would be best to use for this project if I want to keep it small a ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg540344#msg540344">342</a></td><td>09 Mar 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> The AT (84-key). It&#39;s not &#39;small&#39;, but there&#39;s only about an extra inch on the RHS co ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg540352#msg540352">343</a></td><td>09 Mar 2012</td><td><span style="float:right;"><b>litster:</b></span></td><td> Right, the AT. &nbsp;But it would be hard to get one now. &nbsp;Could I do this on a Phantom, w ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg540406#msg540406">344</a></td><td>09 Mar 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Hard, but far from impossible. You just have to keep looking, and be prepared to pay ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg540413#msg540413">345</a></td><td>09 Mar 2012</td><td><span style="float:right;"><b>litster:</b></span></td><td> Ah, I get it now. &nbsp;The Phantom firmware we have now came from PrinsValium. &nbsp;His code ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg540433#msg540433">346</a></td><td>09 Mar 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> OK. I&#39;ll talk to him when I&#39;m ready to make plans for controller stuff.</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg543629#msg543629">347</a></td><td>12 Mar 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Yes. (I missed seeing the edit again!)</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg544056#msg544056">348</a></td><td>13 Mar 2012</td><td><span style="float:right;"><b>drteming:</b></span></td><td> Well, I worked up the courage to delve into Soarer&#39;s 0.997 firmware. &nbsp;My last foray i ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg544074#msg544074">349</a></td><td>13 Mar 2012</td><td><span style="float:right;"><b>wcass:</b></span></td><td> if you are serious about this, i&#39;ld like to talk to you about a project i&#39;m working o ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg544116#msg544116">350</a></td><td>13 Mar 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Hail to the Brave! Thanks for posting up what you&#39;ve done, and how. Sorry about the l ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg544119#msg544119">351</a></td><td>13 Mar 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> I&#39;m serious, but it&#39;s possibly not quite what you&#39;re after - my plan is to replace ju ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg547334#msg547334">352</a></td><td>16 Mar 2012</td><td><span style="float:right;"><b>Parak:</b></span></td><td> I&#39;m entirely too lazy to check this at the moment, but isn&#39;t the teensy++ and the mai ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg547398#msg547398">353</a></td><td>16 Mar 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Yup, same size, but the ++ has GND and AREF in the middle of one side, which aligns w ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg547433#msg547433">354</a></td><td>16 Mar 2012</td><td><span style="float:right;"><b>Parak:</b></span></td><td> They would align in every one of the four possible orientations of a teensy++? Still, ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg547732#msg547732">355</a></td><td>16 Mar 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Well, there&#39;s also that +5V and GND are on diagonally opposite corners of the CPU, vs ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg547815#msg547815">356</a></td><td>16 Mar 2012</td><td><span style="float:right;"><b>Parak:</b></span></td><td> Hmm, I see. Does T0 have to be used for something? If not then using teensy++ with +5 ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg547965#msg547965">357</a></td><td>16 Mar 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Depends on the &#39;board - the XT, AT and DisplayWriter use it for signalling to the hos ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg550248#msg550248">358</a></td><td>19 Mar 2012</td><td><span style="float:right;"><b>wcass:</b></span></td><td> thanks Soarer. i used this in my IBM AT project here: http://geekhack.org/showwiki.ph ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg563473#msg563473">359</a></td><td>01 Apr 2012</td><td><span style="float:right;"><b>ed_avis:</b></span></td><td> With a Dell M6300 (BIOS rev A14) and Windows XP x64 SP2, and the converter driving a ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg563521#msg563521">360</a></td><td>01 Apr 2012</td><td><span style="float:right;"><b>kishy:</b></span></td><td> Yeah, I&#39;ve had troubles with a Dell Inspiron 630m doing the same thing. Presuming BIO ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg563712#msg563712">361</a></td><td>01 Apr 2012</td><td><span style="float:right;"><b>ed_avis:</b></span></td><td> Strangely, although the M6300 does not recognize the Soarer-adapted keyboard for hitt ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg563719#msg563719">362</a></td><td>01 Apr 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> There must be something peculiar that these machines have in common. I mean, they wor ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg564466#msg564466">363</a></td><td>02 Apr 2012</td><td><span style="float:right;"><b>ed_avis:</b></span></td><td> Soarer I see that you are in the same country as me. &nbsp;If you are near London and you ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg565018#msg565018">364</a></td><td>02 Apr 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Many thanks for the offer! For me, that wouldn&#39;t be feasible for a month or two thoug ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg565097#msg565097">365</a></td><td>03 Apr 2012</td><td><span style="float:right;"><b>litster:</b></span></td><td> Sweet! &nbsp;I am going to get a few parts to build this. &nbsp;I have Teensys at home ready to go.</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg570135#msg570135">366</a></td><td>07 Apr 2012</td><td><span style="float:right;"><b>Morning Song:</b></span></td><td> Just a little report/question: I&#39;m using one of the earliest teensy adapters, made by ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg570157#msg570157">367</a></td><td>08 Apr 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Hey, that&#39;s an odd one! What&#39;s a 6011668? I&#39;m guessing it&#39;s a 122-key terminal board ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg570182#msg570182">368</a></td><td>08 Apr 2012</td><td><span style="float:right;"><b>Morning Song:</b></span></td><td> Er, whoops! It&#39;s a 6110668, not 6011668. (Same as, i believe, Sethstorm&#39;s). &nbsp;Force Se ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg570187#msg570187">369</a></td><td>08 Apr 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Cool, &#39;force&#39; works! Using it stops the converter querying the board at all, so it&#39;s ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg570207#msg570207">370</a></td><td>08 Apr 2012</td><td><span style="float:right;"><b>Morning Song:</b></span></td><td> Exactly! Back in the Dark Times before you guys came out with these adapters, Kishy h ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg570240#msg570240">371</a></td><td>08 Apr 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Heh, I finally started to try and get some better documentation sorted out today! A d ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg570268#msg570268">372</a></td><td>08 Apr 2012</td><td><span style="float:right;"><b>wcass:</b></span></td><td> i was thinking i would like to help with an .hta GUI wrapper for your code. it would ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg570302#msg570302">373</a></td><td>08 Apr 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> The more the merrier! I&#39;ve managed to get the command line tools compiling on all pla ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg570345#msg570345">374</a></td><td>08 Apr 2012</td><td><span style="float:right;"><b>Morning Song:</b></span></td><td> My thoughts on the matter is that if there&#39;s a nice simple one-file way of including ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg570524#msg570524">375</a></td><td>08 Apr 2012</td><td><span style="float:right;"><b>alaricljs:</b></span></td><td> A gui could probably be built across the command line tools with AutoHotKey.</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg570910#msg570910">376</a></td><td>08 Apr 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> It partly depends on what you all think a GUI should do! I know it wouldn&#39;t start off ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg570938#msg570938">377</a></td><td>09 Apr 2012</td><td><span style="float:right;"><b>SmallFry:</b></span></td><td> The gui should include a verbose just for debugging stuff:) Other than that, and bein ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg571203#msg571203">378</a></td><td>09 Apr 2012</td><td><span style="float:right;"><b>Parak:</b></span></td><td> I think the GUI could basically just be a front end to the tools. One would select fr ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg571374#msg571374">379</a></td><td>09 Apr 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Heh, a minimal front-end could just be a text editor with a &#39;send to keyboard&#39; button ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg576314#msg576314">380</a></td><td>16 Apr 2012</td><td><span style="float:right;"><b>fruktstund:</b></span></td><td> I&#39;m a bit tired right now, and this might therefore be somewhat a stupid question, bu ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg576415#msg576415">381</a></td><td>17 Apr 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Glad you find it useful! USB-to-USB might happen at some point in the future - there ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg576600#msg576600">382</a></td><td>17 Apr 2012</td><td><span style="float:right;"><b>litster:</b></span></td><td> Hi. &nbsp;I just built a Soarer converter. &nbsp;But I am running into some problem. &nbsp;Here is t ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg576848#msg576848">383</a></td><td>17 Apr 2012</td><td><span style="float:right;"><b>kishy:</b></span></td><td> Silly question, but are you unplugging the USB connector before changing keyboards? E ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg576853#msg576853">384</a></td><td>17 Apr 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Aha, I hope it is just that! It&#39;s the only thing I can think of that makes sense of t ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg576955#msg576955">385</a></td><td>17 Apr 2012</td><td><span style="float:right;"><b>litster:</b></span></td><td> Hi. &nbsp;I tried cold plugging different keyboards. &nbsp;The result is the same. &nbsp;On the old ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg576976#msg576976">386</a></td><td>17 Apr 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> So you&#39;re plugging the keyboard into the converter, and then the converter into the P ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg577034#msg577034">387</a></td><td>17 Apr 2012</td><td><span style="float:right;"><b>litster:</b></span></td><td> Thank you! &nbsp;That was it! &nbsp;I always connected the Teensy to the PC first, and then plu ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg577061#msg577061">388</a></td><td>17 Apr 2012</td><td><span style="float:right;"><b>kishy:</b></span></td><td> Good to hear - and yes, hotplugging XT, AT or PS/2 interfaces is not really the best ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg577062#msg577062">389</a></td><td>17 Apr 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Phew!</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg577098#msg577098">390</a></td><td>17 Apr 2012</td><td><span style="float:right;"><b>litster:</b></span></td><td> Soarer, is it possible to detect a disconnect of the PS/2 connection, and reset the T ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg577113#msg577113">391</a></td><td>17 Apr 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Hmm. Probably, with some work, but I&#39;m not sure I want to encourage it! (There is a r ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg577729#msg577729">392</a></td><td>18 Apr 2012</td><td><span style="float:right;"><b>bhtooefr:</b></span></td><td> What about detecting the unplug, and then blinking an error condition? Or even having ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg578222#msg578222">393</a></td><td>18 Apr 2012</td><td><span style="float:right;"><b>litster:</b></span></td><td> Hehe, I thought more people need to know how cool Soarer&#39;s converter is, so I posted ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg578509#msg578509">394</a></td><td>19 Apr 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Thanks for that! Hope you enjoy it, and find a use for some of the other features as ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg578542#msg578542">395</a></td><td>19 Apr 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Been working on the docs a bit - any comments and/or tips would be welcome! [ Attach ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg579112#msg579112">396</a></td><td>19 Apr 2012</td><td><span style="float:right;"><b>REVENGE:</b></span></td><td> Oh man, this looks great! I&#39;ll do a read through, let you know if I have any suggestions.</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg579114#msg579114">397</a></td><td>19 Apr 2012</td><td><span style="float:right;"><b>Gawkbasher:</b></span></td><td> Very cool documentation. &nbsp;Thanks!</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg579139#msg579139">398</a></td><td>19 Apr 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> It&#39;s pretty much the first time I&#39;ve messed with CSS, so, um, don&#39;t look at that! The ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg579331#msg579331">399</a></td><td>20 Apr 2012</td><td><span style="float:right;"><b>bhtooefr:</b></span></td><td> FWIW, you can do the navbar stuff in CSS, too - no need to do it in JavaScript. Typo ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg579364#msg579364">400</a></td><td>20 Apr 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> The navbar is done in CSS, but effectively it&#39;s a client-side include I really wanted ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg579614#msg579614">401</a></td><td>23 Apr 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> To celebrate, I present , with these new and improved features...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg579916#msg579916">402</a></td><td>23 Apr 2012</td><td><span style="float:right;"><b>Zorael:</b></span></td><td> Pre-built linux tools sounds awesome! Excuse me if I&#39;m sobbing; I&#39;ve just spent the b ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg579994#msg579994">403</a></td><td>23 Apr 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Thanks! And welcome to geekhack! Oh man, I&#39;m really sorry :-( &nbsp;There were a few posts ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg581635#msg581635">404</a></td><td>25 Apr 2012</td><td><span style="float:right;"><b>andrewjoy:</b></span></td><td> will this work on the rubber dome wise boards also ? i got one off ebay quite cheap i ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg581641#msg581641">405</a></td><td>25 Apr 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> I don&#39;t know the keyboard - any idea what protocol it uses? What connector?</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg581695#msg581695">406</a></td><td>25 Apr 2012</td><td><span style="float:right;"><b>andrewjoy:</b></span></td><td> it uses a phone type connector similar to other terminal boards i am amusing it uses ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg581868#msg581868">407</a></td><td>25 Apr 2012</td><td><span style="float:right;"><b>John Boone:</b></span></td><td> Congrats and happy birthday for your Converter ! I would like to know if it is possi ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg582001#msg582001">408</a></td><td>25 Apr 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Thanks! Yes, it can, with some caveats... First, it won&#39;t fit with the standard Atmel ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg586774#msg586774">409</a></td><td>01 May 2012</td><td><span style="float:right;"><b>John Boone:</b></span></td><td> Thanks for the answer, well I will stick with the 32k version as for now, since i am ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg587144#msg587144">410</a></td><td>01 May 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Unless you already have some 16k chips, then it&#39;s definitely worth going for the 32k. ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg601130#msg601130">411</a></td><td>27 May 2012</td><td><span style="float:right;"><b>REVENGE:</b></span></td><td> Woo, busted out the Unsaver tonight. Converter works great, and now I finally have th ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg601190#msg601190">412</a></td><td>27 May 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> BTW: LANG_4 is the center key in the arrow cluster for 122s. :-p There is an easier w ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg601454#msg601454">413</a></td><td>27 May 2012</td><td><span style="float:right;"><b>REVENGE:</b></span></td><td> Good tip, thanks!</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg604863#msg604863">414</a></td><td>31 May 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> New version which fixes a bug that stopped jump to bootloader functions working on AT ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg608114#msg608114">415</a></td><td>05 Jun 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> We can add Dell Latitude D800 to that list :-( At least I have one to play with, so i ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg608283#msg608283">416</a></td><td>06 Jun 2012</td><td><span style="float:right;"><b>fohat.digs:</b></span></td><td> I have installed 12.04 as a dual-boot with Windows 7, and the OS does not seem to rec ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg608442#msg608442">417</a></td><td>06 Jun 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Oh crap - what have they gone and done! :-( No driver needed, it should be all there ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg608452#msg608452">418</a></td><td>06 Jun 2012</td><td><span style="float:right;"><b>alaricljs:</b></span></td><td> Also check if the USB on the other side of the Dell works. &nbsp;I haven&#39;t been able to fi ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg608468#msg608468">419</a></td><td>06 Jun 2012</td><td><span style="float:right;"><b>kishy:</b></span></td><td> FWIW, all of my tests on the 630m involved all 4 ports (which are on the same &quot;side&quot;, ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg608470#msg608470">420</a></td><td>06 Jun 2012</td><td><span style="float:right;"><b>alaricljs:</b></span></td><td> My D820 and e6410 both have opposite side USB ports, I was under the impression that ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg608475#msg608475">421</a></td><td>06 Jun 2012</td><td><span style="float:right;"><b>kishy:</b></span></td><td> [ Attachment Invalid Or Does Not Exist ] 52336[/ATTACH] I believe 630m is the odd on ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg608487#msg608487">422</a></td><td>06 Jun 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Actually, on the D800 (A11 BIOS) it seems to work OK from a cold boot, but not on res ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg608565#msg608565">423</a></td><td>06 Jun 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Hmm... so on this Dell actually all devices are showing up. Strangely, the scinfo com ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg609833#msg609833">424</a></td><td>08 Jun 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> I not sure that this D800 has the quite same problem as those other Dells. On this on ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg609928#msg609928">425</a></td><td>08 Jun 2012</td><td><span style="float:right;"><b>fohat.digs:</b></span></td><td> I don&#39;t know about anybody else&#39;s Ubuntu 12.04 problem, but mine was fixed immediatel ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg609939#msg609939">426</a></td><td>08 Jun 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Interesting... that actually makes it more similar to the Dell laptops&#39; problem, in t ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg609987#msg609987">427</a></td><td>08 Jun 2012</td><td><span style="float:right;"><b>fohat.digs:</b></span></td><td> Yes, I think that it just had to recognize the USB device once, smooth sailing after ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg609993#msg609993">428</a></td><td>08 Jun 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Ah good. Just these pesky Dells to deal with now then! :-D</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg616567#msg616567">429</a></td><td>19 Jun 2012</td><td><span style="float:right;"><b>AKIMbO:</b></span></td><td> Hey guys I need a little help with my teensy install. &nbsp;I&#39;m converting an XT to usb. &nbsp; ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg616598#msg616598">430</a></td><td>19 Jun 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Brown = Vcc Red = Ground White = Data Black = Clock :-)</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg616661#msg616661">431</a></td><td>19 Jun 2012</td><td><span style="float:right;"><b>AKIMbO:</b></span></td><td> Thank you so much Soarer. &nbsp;I was pulling my hair out and second guessing myself with ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg616920#msg616920">432</a></td><td>19 Jun 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Haha, yeah, IBM (and Cherry) sure did pick some unintuitive colours! Good to hear of ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg617116#msg617116">433</a></td><td>19 Jun 2012</td><td><span style="float:right;"><b>Paranoid:</b></span></td><td> Hi everyone. I&#39;m also trying to convert XT to USB (IBM model F), but when I wire it l ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg617153#msg617153">434</a></td><td>19 Jun 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Ouch, that doesn&#39;t sound good at all - the Teensy shouldn&#39;t even be warm :-( Where th ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg617158#msg617158">435</a></td><td>19 Jun 2012</td><td><span style="float:right;"><b>Paranoid:</b></span></td><td> The wire colours are in the same order as in the picture (brown-red-white-black) with ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg617212#msg617212">436</a></td><td>19 Jun 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Either Vcc and GND are fine. Hate to say it, but I think somehow the Teensy has died ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg617658#msg617658">437</a></td><td>20 Jun 2012</td><td><span style="float:right;"><b>Paranoid:</b></span></td><td> Damn that would suck! I also can connect it to my computer and run and load the LED b ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg617717#msg617717">438</a></td><td>20 Jun 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Reversing Vcc and GND is more likely to damage the keyboard than the Teensy, and I&#39;m ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg617893#msg617893">439</a></td><td>20 Jun 2012</td><td><span style="float:right;"><b>Paranoid:</b></span></td><td> Yes, I do have a multimeter :) I did the test that you asked. Let me sum it up: Basic ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg617942#msg617942">440</a></td><td>20 Jun 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> I dunno... something doesn&#39;t quite add up :-) I don&#39;t see how the Teensy would get ho ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg617969#msg617969">441</a></td><td>20 Jun 2012</td><td><span style="float:right;"><b>Paranoid:</b></span></td><td> yes that&#39;s exactly how I did the current measurement. Maybe there&#39;s something wrong w ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg618461#msg618461">442</a></td><td>21 Jun 2012</td><td><span style="float:right;"><b>REVENGE:</b></span></td><td> You could double check the wire config by using a multimeter and testing for continui ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg618482#msg618482">443</a></td><td>21 Jun 2012</td><td><span style="float:right;"><b>Paranoid:</b></span></td><td> Hi Revenge, I checked that in the beginning. The VCC, ground and data were correct, o ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg618535#msg618535">444</a></td><td>21 Jun 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> I think that means you were reading the pinout diagram backwards - it&#39;s drawn looking ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg618541#msg618541">445</a></td><td>21 Jun 2012</td><td><span style="float:right;"><b>Paranoid:</b></span></td><td> hehe, that would explain why I got the grnd and vcc wrong the first try ^^ the pins a ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg619737#msg619737">446</a></td><td>22 Jun 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Sorry, I missed the update :-) I&#39;m still puzzled why the teensy and cable get hot, wi ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg620576#msg620576">447</a></td><td>24 Jun 2012</td><td><span style="float:right;"><b>Parak:</b></span></td><td> For my second F122 refurbishment, I took some of these that I had lying around and fo ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg620617#msg620617">448</a></td><td>24 Jun 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> That&#39;s pretty neat :-) Put the pins on the back you mean? But then you&#39;d have bits st ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg620684#msg620684">449</a></td><td>24 Jun 2012</td><td><span style="float:right;"><b>Parak:</b></span></td><td> It would have looked a bit neater as the d0/d1 pins could have been flush, but then I ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg646147#msg646147">450</a></td><td>23 Aug 2012</td><td><span style="float:right;"><b>fohat.digs:</b></span></td><td> I am probably just dense or incompetent, but here are 2 questions: 1. How to I get to ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg646189#msg646189">451</a></td><td>23 Aug 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> 1. The article has moved to the first post in this thread ;) 2. Depends... Day-to-day ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg648235#msg648235">452</a></td><td>26 Aug 2012</td><td><span style="float:right;"><b>neocalm:</b></span></td><td> Hello Soarer! What a fantastic project, with my beginner skills I never thought I wo ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg648265#msg648265">453</a></td><td>26 Aug 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Well, AB is only &#39;bad&#39; because it is used to identify the regular 101/102-key keyboa ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg649449#msg649449">454</a></td><td>28 Aug 2012</td><td><span style="float:right;"><b>neocalm:</b></span></td><td> Thanks, that makes sense on why &quot;AB&quot; is bad.&nbsp; Turns out that the board has no &quot;JP3&quot; ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg649576#msg649576">455</a></td><td>28 Aug 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Excellent! Actually, the &#39;force&#39; command only forces the converter to for set 3, it ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg652101#msg652101">456</a></td><td>31 Aug 2012</td><td><span style="float:right;"><b>neocalm:</b></span></td><td> That&#39;s great to know the Converter doesn&#39;t set the Set.&nbsp; So I did do something!&nbsp; :) E ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg652640#msg652640">457</a></td><td>31 Aug 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> It isn&#39;t. I thought about it, but never got round to adding it, because it didn&#39;t rea ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg653147#msg653147">458</a></td><td>01 Sep 2012</td><td><span style="float:right;"><b>neocalm:</b></span></td><td> ... well that ended pretty quick :( I was all set for the &quot;bolt-mod&quot; with all the req ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg653191#msg653191">459</a></td><td>01 Sep 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> How frustrating :( I guess that means that one of those traces on the plastic sheets ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg653244#msg653244">460</a></td><td>01 Sep 2012</td><td><span style="float:right;"><b>N8N:</b></span></td><td> Rear defogger repair kit?</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg653263#msg653263">461</a></td><td>01 Sep 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Yeah. Or from electronics suppliers ( ). I should say I&#39;ve no idea how well or even i ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg658073#msg658073">462</a></td><td>09 Sep 2012</td><td><span style="float:right;"><b>Halvar:</b></span></td><td> Hi, thank you Soarer for this great piece of software. Another report of a successful ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg658087#msg658087">463</a></td><td>09 Sep 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> You&#39;re welcome! And good job building it in with LEDs, many people don&#39;t bother with ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg658161#msg658161">464</a></td><td>09 Sep 2012</td><td><span style="float:right;"><b>Halvar:</b></span></td><td> *danceandsing* Thanks a lot Soarer, that did it! I even did read the post that you l ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg658191#msg658191">465</a></td><td>09 Sep 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Excellent! LOL, I hadn&#39;t even noticed the [&acute;] in your post! Thanks for posting the c ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg658282#msg658282">466</a></td><td>10 Sep 2012</td><td><span style="float:right;"><b>__red__:</b></span></td><td> Another satisfied customer here - IBM Model F 122 key, 6110344 5 August 1986. :)</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg665250#msg665250">467</a></td><td>18 Sep 2012</td><td><span style="float:right;"><b>Krogenar:</b></span></td><td> I&#39;ve got two broke-down Model M 122&#39;s headed my way -- looking forward to giving this ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg665363#msg665363">468</a></td><td>18 Sep 2012</td><td><span style="float:right;"><b>fohat.digs:</b></span></td><td> Something is escaping me here. I am back where I was a month ago at post 451 trying t ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg665407#msg665407">469</a></td><td>18 Sep 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> It&#39;s usually described as a 270 degree 5 pin DIN (or sometimes 240 degree), whereas t ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg665428#msg665428">470</a></td><td>18 Sep 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Does it recognize the keyboard if you program it with v0.997? There isn&#39;t any real di ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg665442#msg665442">471</a></td><td>18 Sep 2012</td><td><span style="float:right;"><b>fohat.digs:</b></span></td><td> Thank you. I did this last year with an F-122 in which I installed the Teensy interna ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg665492#msg665492">472</a></td><td>18 Sep 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> I think the old config will be fine, and anyway we won&#39;t need one yet, to get the key ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg665557#msg665557">473</a></td><td>19 Sep 2012</td><td><span style="float:right;"><b>fohat.digs:</b></span></td><td> I think that I have done it several ways. My assumption is that the preferable metho ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg665588#msg665588">474</a></td><td>19 Sep 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> I was just checking, since with the Teensy built-in to your other keyboard, the quest ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg665603#msg665603">475</a></td><td>19 Sep 2012</td><td><span style="float:right;"><b>fohat.digs:</b></span></td><td> I do have hid_listen but there is nothing for it to listen to ...... Are the pins on ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg665760#msg665760">476</a></td><td>19 Sep 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Odd. Once the Teensy is programmed with the converter code, hid_listen should at leas ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg665784#msg665784">477</a></td><td>19 Sep 2012</td><td><span style="float:right;"><b>Krogenar:</b></span></td><td> Thank you Soarer! I think I&#39;m going to try a panel mount because I&#39;d rather not alter ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg665794#msg665794">478</a></td><td>19 Sep 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Ah, the trailing socket wouldn&#39;t mean modifying the keyboard, it would be for making ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg665824#msg665824">479</a></td><td>19 Sep 2012</td><td><span style="float:right;"><b>fohat.digs:</b></span></td><td> Allow me to clarify the situation and reduce misunderstanding. I have my &quot;old&quot; rig w ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg665854#msg665854">480</a></td><td>19 Sep 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> That&#39;s exactly what would happen if you programmed it with blinkfast instead of progr ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg666140#msg666140">481</a></td><td>20 Sep 2012</td><td><span style="float:right;"><b>fohat.digs:</b></span></td><td> Thank you. Do I need to somehow de-program ore re-format the Teensy from Fast-Blink? ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg666176#msg666176">482</a></td><td>20 Sep 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Hmm, strange. Programming it with the converter hex ought to remove the blinking. Jus ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg666452#msg666452">483</a></td><td>20 Sep 2012</td><td><span style="float:right;"><b>fohat.digs:</b></span></td><td> &quot;Something&quot; happened. I went through your steps again. After opening the hex file, pr ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg666504#msg666504">484</a></td><td>20 Sep 2012</td><td><span style="float:right;"><b>fohat.digs:</b></span></td><td> Now I am getting a little worried. I plugged an ordinary PS2 keyboard into the Teensy ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg666536#msg666536">485</a></td><td>20 Sep 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> OK, progress, it seems to be programmed now :-) Since you&#39;re getting some response wh ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg666542#msg666542">486</a></td><td>20 Sep 2012</td><td><span style="float:right;"><b>fohat.digs:</b></span></td><td> I keep working on this instead of my &quot;real&quot; work. My working converter is hard-wired ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg666545#msg666545">487</a></td><td>20 Sep 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Don&#39;t dismantle your working one! I meant we should be able to get this new one worki ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg666595#msg666595">488</a></td><td>20 Sep 2012</td><td><span style="float:right;"><b>fohat.digs:</b></span></td><td> Using a 10-year-old Compaq rubber dome board with PS2 connector, with each key press ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg666623#msg666623">489</a></td><td>20 Sep 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> That&#39;s a mix of Timeout and Start Bit errors, with a rare Internal error. One possibl ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg666715#msg666715">490</a></td><td>20 Sep 2012</td><td><span style="float:right;"><b>fohat.digs:</b></span></td><td> Thanks, but going by your diagram at the beginning of the thread, I think I have it w ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg666735#msg666735">491</a></td><td>20 Sep 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> I know you do, but there must be something wrong somewhere! :D Pretty much any standa ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg666880#msg666880">492</a></td><td>21 Sep 2012</td><td><span style="float:right;"><b>fohat.digs:</b></span></td><td> Yes, the XT is what I have been working with. I gave up the alligator clips and have ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg667044#msg667044">493</a></td><td>21 Sep 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> I think the only way to fully cook the keyboard is to connect power and ground in rev ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg667053#msg667053">494</a></td><td>21 Sep 2012</td><td><span style="float:right;"><b>fohat.digs:</b></span></td><td> This is indeed disappointing, if I have carelessly wrecked 2 Model Fs. Is there a rel ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg667103#msg667103">495</a></td><td>21 Sep 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Well I&#39;m not sure that you have totally wrecked them, unless you think you might have ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg667774#msg667774">496</a></td><td>22 Sep 2012</td><td><span style="float:right;"><b>fohat.digs:</b></span></td><td> This is going to have to get shelved for a few days. - IF - I did apply the power bac ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg667778#msg667778">497</a></td><td>22 Sep 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> OK. I&#39;m sorry that this hasn&#39;t gone as smoothly for you as it did last time. Trouble ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg667781#msg667781">498</a></td><td>22 Sep 2012</td><td><span style="float:right;"><b>fohat.digs:</b></span></td><td> Depending on how this all plays out, I can send you some dead parts that have no more ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg667783#msg667783">499</a></td><td>22 Sep 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Thanks! I&#39;m still hopeful that it&#39;s not that much of a disaster though :)</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg668952#msg668952">500</a></td><td>24 Sep 2012</td><td><span style="float:right;"><b>kishy:</b></span></td><td> If the controller is toast, let&#39;s not forget that dfj was making a full replacement.. ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg669015#msg669015">501</a></td><td>24 Sep 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> True, I&#39;m not forgetting it, but dfj would need quite some prodding to release code o ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg669876#msg669876">502</a></td><td>25 Sep 2012</td><td><span style="float:right;"><b>Krogenar:</b></span></td><td> Fohat, just a heads up -- I got two 122-key Terminal Model M&#39;s from eBay. One has a c ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg669878#msg669878">503</a></td><td>25 Sep 2012</td><td><span style="float:right;"><b>kishy:</b></span></td><td> I guess with the attachments being lost my huge post showing the differences between ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg669893#msg669893">504</a></td><td>25 Sep 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Unfortunately, Model M controllers don&#39;t have the special capacitive sensing chip tha ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg670261#msg670261">505</a></td><td>26 Sep 2012</td><td><span style="float:right;"><b>oTurtlez:</b></span></td><td> I&#39;ve got a Leading Edge DC-2014 and the internal connector has six wires coming out. ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg670312#msg670312">506</a></td><td>26 Sep 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Yeah, I&#39;m afraid they need to be properly identified. Either by using a multimeter, o ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg670757#msg670757">507</a></td><td>26 Sep 2012</td><td><span style="float:right;"><b>oTurtlez:</b></span></td><td> Heres another pic focusing more on the traces. It seems the Yellow is definitely the ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg670775#msg670775">508</a></td><td>26 Sep 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> LOL, I said DON&#39;T take my guesswork as fact!!&nbsp; :p Still need a pic that shows the tra ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg670799#msg670799">509</a></td><td>26 Sep 2012</td><td><span style="float:right;"><b>oTurtlez:</b></span></td><td> Traces of the 14 pin ---&gt; The 40-pin is an 8048 and the 14 pin reads 6A1 8(New line) ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg670867#msg670867">510</a></td><td>26 Sep 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Cool. 74LS125 is a tri-state buffer chip. Black and grey wires both go there, so they ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg670875#msg670875">511</a></td><td>26 Sep 2012</td><td><span style="float:right;"><b>oTurtlez:</b></span></td><td> Trying that now, Teensy just came in the mail so I&#39;m getting to the soldering Thanks.</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg670910#msg670910">512</a></td><td>26 Sep 2012</td><td><span style="float:right;"><b>oTurtlez:</b></span></td><td> Well my Teensy just arrived so I tried it out and got everything soldered up. Loaded ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg671023#msg671023">513</a></td><td>26 Sep 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Bah :( Is it giving any output to hid_listen when you press keys? Also, with hid_list ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg671150#msg671150">514</a></td><td>26 Sep 2012</td><td><span style="float:right;"><b>oTurtlez:</b></span></td><td> It gave no output when keys were pressed, I hadnt used it with the black and grey swa ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg671182#msg671182">515</a></td><td>27 Sep 2012</td><td><span style="float:right;"><b>fohat.digs:</b></span></td><td> Sounds like what is happening to me. Could there be a bad batch of Teensys shipping r ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg671231#msg671231">516</a></td><td>27 Sep 2012</td><td><span style="float:right;"><b>oTurtlez:</b></span></td><td> As much as I&#39;d like that to be the case so I could get a replacement, All software de ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg671233#msg671233">517</a></td><td>27 Sep 2012</td><td><span style="float:right;"><b>Halvar:</b></span></td><td> Hi, from my experience this error means that there&#39;s a problem with the connection be ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg671252#msg671252">518</a></td><td>27 Sep 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Oh man, that really sucks... I think the track away from the PD1 pad is on the top si ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg671259#msg671259">519</a></td><td>27 Sep 2012</td><td><span style="float:right;"><b>oTurtlez:</b></span></td><td> I really need a better iron. This 25w POS has been with me for far too long. I need s ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg671264#msg671264">520</a></td><td>27 Sep 2012</td><td><span style="float:right;"><b>oTurtlez:</b></span></td><td> Do you know if there&#39;s any way to reprogram the code to look to PD2 instead of PD1? O ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg671610#msg671610">521</a></td><td>27 Sep 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> It would be possible, but the problem is I don&#39;t want to add such a build to the rele ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg671617#msg671617">522</a></td><td>27 Sep 2012</td><td><span style="float:right;"><b>oTurtlez:</b></span></td><td> I&#39;m guessing it&#39;s not as simple as going into the code and changing all PD1 to PD2? ( ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg671868#msg671868">523</a></td><td>27 Sep 2012</td><td><span style="float:right;"><b>Krogenar:</b></span></td><td> How would you know if a keyboards controller were faulty, broken?</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg672060#msg672060">524</a></td><td>28 Sep 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> It&#39;s written in C :-) The point is, it would be fairly easy for me to mod it, but I d ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg672075#msg672075">525</a></td><td>28 Sep 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> That is a properly sorted 122-key! The LEDs and relegendable keys really make it sple ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg672204#msg672204">526</a></td><td>28 Sep 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> From the IBM PC Technical Reference... So although the IBM keyboards didn&#39;t use the R ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg676919#msg676919">527</a></td><td>03 Oct 2012</td><td><span style="float:right;"><b>Krogenar:</b></span></td><td> Soarer, just wanted to give you a huge thanks! Got your converter working late last n ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg676946#msg676946">528</a></td><td>03 Oct 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> That&#39;s good to hear! Let&#39;s have some pics :D</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg676971#msg676971">529</a></td><td>03 Oct 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Paranoid&#39;s dead XT arrived, and I started examining it. Testing revealed a complete s ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg677867#msg677867">530</a></td><td>04 Oct 2012</td><td><span style="float:right;"><b>__red__:</b></span></td><td> Any sign of bulging or other physical defecT?</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg677876#msg677876">531</a></td><td>04 Oct 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Not that I can tell. I&#39;m sure it would&#39;ve been more dramatic without the USB port&#39;s o ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg679230#msg679230">532</a></td><td>05 Oct 2012</td><td><span style="float:right;"><b>page2pagepro:</b></span></td><td> Please note, for IBM Model M 1390572, the image above is for female socket, not male ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg680015#msg680015">533</a></td><td>06 Oct 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> That on github is hasu&#39;s great repo :) There&#39;s no source code available for my conver ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg680029#msg680029">534</a></td><td>06 Oct 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Recently I&#39;ve been working with oTurtlez trying to figure out his Leading Edge DC-201 ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg685596#msg685596">535</a></td><td>14 Oct 2012</td><td><span style="float:right;"><b>page2pagepro:</b></span></td><td> Anti-Ghosting with Teensy? Using tool, http://www.microsoft.com/appliedsciences/antig ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg685611#msg685611">536</a></td><td>14 Oct 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> I&#39;m sorry to disappoint you, but the Model M isn&#39;t NKRO and the converter can&#39;t chang ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg686084#msg686084">537</a></td><td>14 Oct 2012</td><td><span style="float:right;"><b>__red__:</b></span></td><td> I think we as a community need to buy soarer a logic analyzer.&nbsp; Given what he&#39;s given ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg686125#msg686125">538</a></td><td>14 Oct 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Thanks red! Actually, I&#39;ve already got this one with a ... here&#39;s some ! ;D But mos ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg686389#msg686389">539</a></td><td>15 Oct 2012</td><td><span style="float:right;"><b>Krogenar:</b></span></td><td> Is my converter weird or something? It&#39;s working -- if press keys on my 122 Terminal ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg686661#msg686661">540</a></td><td>15 Oct 2012</td><td><span style="float:right;"><b>Halvar:</b></span></td><td> @Krogenar: To see the scan set, you&#39;ll have to have the hid_listen.exe window open w ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg686839#msg686839">541</a></td><td>15 Oct 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Thanks Halvar, that&#39;s all great! Krogenar, you don&#39;t really need to know which scan s ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg686849#msg686849">542</a></td><td>15 Oct 2012</td><td><span style="float:right;"><b>urbanus:</b></span></td><td> Works with my 83-key Model F XT -- typing on it right now!&nbsp; :) Thank you very much So ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg686893#msg686893">543</a></td><td>15 Oct 2012</td><td><span style="float:right;"><b>Krogenar:</b></span></td><td> Yes, I discovered that when I remove the keyboard cable and reinsert, that there&#39;s mo ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg686895#msg686895">544</a></td><td>15 Oct 2012</td><td><span style="float:right;"><b>alaricljs:</b></span></td><td> If I recall from my reading of this thread.... you&#39;re not supposed to detach/attach t ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg687249#msg687249">545</a></td><td>15 Oct 2012</td><td><span style="float:right;"><b>Krogenar:</b></span></td><td> Ok, here we go. Keep in mind I have no experience building electronics. My goal was t ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg687265#msg687265">546</a></td><td>15 Oct 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Hmm, that should work to clear things back to the defaults. You can check by running ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg687329#msg687329">547</a></td><td>16 Oct 2012</td><td><span style="float:right;"><b>Krogenar:</b></span></td><td> I tried using Halvar&#39;s config file -- worked beautifully. I&#39;m trying to find some nic ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg687838#msg687838">548</a></td><td>16 Oct 2012</td><td><span style="float:right;"><b>Halvar:</b></span></td><td> The painting restoration story is hilarious.&nbsp; :D Some symbol fonts I found and partly ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg687986#msg687986">549</a></td><td>16 Oct 2012</td><td><span style="float:right;"><b>Krogenar:</b></span></td><td> Yeah, she started out trying to restore Jesus, and wound up making him look like Mr. ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg688025#msg688025">550</a></td><td>16 Oct 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Nothing exciting... it&#39;s just the Window&#39;s menu key.</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg688064#msg688064">551</a></td><td>16 Oct 2012</td><td><span style="float:right;"><b>Halvar:</b></span></td><td> http://www.clker.com/clipart-15445.html</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg701240#msg701240">552</a></td><td>01 Nov 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> New improved version (sorry __red__!) now samples whenever any of PD0 to PD3 change, ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg707511#msg707511">553</a></td><td>08 Nov 2012</td><td><span style="float:right;"><b>Arbiter343GS:</b></span></td><td> I actually did this project about a month ago after I bought a 122 key model M off of ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg707636#msg707636">554</a></td><td>08 Nov 2012</td><td><span style="float:right;"><b>fohat.digs:</b></span></td><td> I have used Key Tweak, but most people seem to prefer Auto Hot Key. I plan to try AHK ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg707708#msg707708">555</a></td><td>08 Nov 2012</td><td><span style="float:right;"><b>Arbiter343GS:</b></span></td><td> Ive been trying auto hotkey but I have no idea how to go about programming the extra ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg707717#msg707717">556</a></td><td>08 Nov 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Remappings are best done in the converter because then there&#39;s no restrictions (like ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg707885#msg707885">557</a></td><td>08 Nov 2012</td><td><span style="float:right;"><b>fohat.digs:</b></span></td><td> Do you remember that I went through hours/days of anguish trying to get a Teensy to w ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg707989#msg707989">558</a></td><td>09 Nov 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> That&#39;s a tough one to call! I the only likely way to electrically damage a Teensy w ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg708090#msg708090">559</a></td><td>09 Nov 2012</td><td><span style="float:right;"><b>fohat.digs:</b></span></td><td> I emailed &quot;Paul&quot; and he was nice but I am not going to push for a replacement. He is ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg708145#msg708145">560</a></td><td>09 Nov 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Yes, that is a relief. I&#39;ve used about half a dozen Teensies, and had no bad ones. I ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg708153#msg708153">561</a></td><td>09 Nov 2012</td><td><span style="float:right;"><b>wcass:</b></span></td><td> it is actually quite easy. first, go to the DOCS folder and double-click on . since ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg708506#msg708506">562</a></td><td>09 Nov 2012</td><td><span style="float:right;"><b>fohat.digs:</b></span></td><td> The last leg of this trip has been surprisingly difficult, but I now have my working ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg708571#msg708571">563</a></td><td>09 Nov 2012</td><td><span style="float:right;"><b>Krogenar:</b></span></td><td> Nice build fohat!</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg708581#msg708581">564</a></td><td>09 Nov 2012</td><td><span style="float:right;"><b>fohat.digs:</b></span></td><td> Arrgh! I spoke too soon about my ecstasy. My old build, F-122 with internal Teensy an ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg708609#msg708609">565</a></td><td>09 Nov 2012</td><td><span style="float:right;"><b>Halvar:</b></span></td><td> hid_listen only shows the ID when the teensy is started. So to see it, unplug your ke ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg708627#msg708627">566</a></td><td>09 Nov 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Yes, the solution is to use a config file and do the remapping on the Teensy - wcass&#39; ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg708646#msg708646">567</a></td><td>09 Nov 2012</td><td><span style="float:right;"><b>fohat.digs:</b></span></td><td> Thank you. When I hot plug the Teensy, I get: wED rFE !!FEwED rFE !!FEwED rFE !!FE Th ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg708672#msg708672">568</a></td><td>09 Nov 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> You don&#39;t have to give up on remapping Pause if you do the remapping in the converter ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg708690#msg708690">569</a></td><td>09 Nov 2012</td><td><span style="float:right;"><b>Halvar:</b></span></td><td> I don&#39;t know if there&#39;s a difference between the default mapping of an M-122 and an F ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg708697#msg708697">570</a></td><td>09 Nov 2012</td><td><span style="float:right;"><b>fohat.digs:</b></span></td><td> Finding the picture (not easy) that went along with my own post at #223 allowed me to ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg708715#msg708715">571</a></td><td>10 Nov 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Halvar, that&#39;s true... since v0.997 that Pause mapping moved to legacy.sc. It never w ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg708736#msg708736">572</a></td><td>10 Nov 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> fohat, to give a quick idea of the process of getting config &#39;in the converter&#39;, the ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg708857#msg708857">573</a></td><td>10 Nov 2012</td><td><span style="float:right;"><b>Arbiter343GS:</b></span></td><td> I pretty much understand how the entire process works now, but Im stumped on how to g ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg709035#msg709035">574</a></td><td>10 Nov 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> On Windows, the simplest way to do it without the drag-drop into the command prompt w ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg709078#msg709078">575</a></td><td>10 Nov 2012</td><td><span style="float:right;"><b>zz:</b></span></td><td> hi! and thank you so much for making this awesome project! i can confirm that it work ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg709086#msg709086">576</a></td><td>10 Nov 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Data line is stuck high - hopefully just a bad connection :)</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg709100#msg709100">577</a></td><td>10 Nov 2012</td><td><span style="float:right;"><b>zz:</b></span></td><td> aw man and a support reaction time of ten minutes! there is no hid manufacturer that ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg709145#msg709145">578</a></td><td>10 Nov 2012</td><td><span style="float:right;"><b>Arbiter343GS:</b></span></td><td> That worked, thank you for all the help! And wow. I am definitely blind, I was scouri ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg709168#msg709168">579</a></td><td>10 Nov 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Yeah, scas takes two arguments, so dropping a file onto it in the GUI doesn&#39;t work. ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg709196#msg709196">580</a></td><td>10 Nov 2012</td><td><span style="float:right;"><b>fohat.digs:</b></span></td><td> Thank you again, you always come through. I was having a similar problem to Arbiter, ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg709221#msg709221">581</a></td><td>10 Nov 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> We can most definitely get it much better than having to live with any annoyances, bu ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg709254#msg709254">582</a></td><td>10 Nov 2012</td><td><span style="float:right;"><b>fohat.digs:</b></span></td><td> Sorry to make life difficult. First, I had already reset everything in KeyTweak back ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg709261#msg709261">583</a></td><td>10 Nov 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> For the top-right numpad key, you need to remap EXTRA_SYSRQ, and the centre key in th ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg709294#msg709294">584</a></td><td>10 Nov 2012</td><td><span style="float:right;"><b>fohat.digs:</b></span></td><td> My hat is off to you once again. And please, never let questions about keyboards get ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg709330#msg709330">585</a></td><td>10 Nov 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> All stocked up now&nbsp; :cool: If Pause hadn&#39;t been EXTRA_SYSRQ, it would&#39;ve been PAD_MIN ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg709335#msg709335">586</a></td><td>10 Nov 2012</td><td><span style="float:right;"><b>fohat.digs:</b></span></td><td> Sweet! Even better than I thought. I guess that in England you don&#39;t have &quot;blue laws&quot; ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg709350#msg709350">587</a></td><td>11 Nov 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> No, nothing like &#39;blue laws&#39;, but big shops are limited to I think 6 hours opening on ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg709383#msg709383">588</a></td><td>11 Nov 2012</td><td><span style="float:right;"><b>AKIMbO:</b></span></td><td> A big shout out to Soarer...I just want to say thank you again for this awesome conve ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg709404#msg709404">589</a></td><td>11 Nov 2012</td><td><span style="float:right;"><b>fohat.digs:</b></span></td><td> Good Luck! What was that one dated, April 1984? The oldest one I have is a 6110344 da ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg709405#msg709405">590</a></td><td>11 Nov 2012</td><td><span style="float:right;"><b>AKIMbO:</b></span></td><td> April 1984....Part # 6110344.&nbsp; Foam mat appeared to be in decent condition and the me ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg709424#msg709424">591</a></td><td>11 Nov 2012</td><td><span style="float:right;"><b>zz:</b></span></td><td> damn. why did i touch it. it was running perfectly&nbsp; :&#39;( after very carefully resolder ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg709428#msg709428">592</a></td><td>11 Nov 2012</td><td><span style="float:right;"><b>fohat.digs:</b></span></td><td> What wires? As much as I have tinkered with other stuff, I have not touched any &quot;inte ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg709468#msg709468">593</a></td><td>11 Nov 2012</td><td><span style="float:right;"><b>zz:</b></span></td><td> i meant the cable.. i just wanted to make it shorter to fit inside.</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg709630#msg709630">594</a></td><td>11 Nov 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> So it&#39;s worse than before? Not even the rFF codes now? :( Most of the ways to damage ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg709748#msg709748">595</a></td><td>11 Nov 2012</td><td><span style="float:right;"><b>zz:</b></span></td><td> phew! got it back to work on pd3 and pd4 with the alternate firmware a few pages bac ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg709903#msg709903">596</a></td><td>11 Nov 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Shame about the damage, but at least it&#39;s working now :)</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg720898#msg720898">597</a></td><td>24 Nov 2012</td><td><span style="float:right;"><b>AKIMbO:</b></span></td><td> Mmmmm.....success.&nbsp; ANSI layout.&nbsp; Thanks again Soarer!</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg720902#msg720902">598</a></td><td>24 Nov 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Nicely done... and very clean!</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg720942#msg720942">599</a></td><td>24 Nov 2012</td><td><span style="float:right;"><b>AKIMbO:</b></span></td><td> I&#39;m having a bit of an issue with the converter.&nbsp; When I run the command (scwr akimbo ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg720952#msg720952">600</a></td><td>24 Nov 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> That&#39;s odd. No errors from &#39;scas akimbo.cfg akimbo.scb&#39;, presumably?</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg720957#msg720957">601</a></td><td>24 Nov 2012</td><td><span style="float:right;"><b>AKIMbO:</b></span></td><td> ^You know what I did wrong.&nbsp; I didn&#39;t use type .cfg when i ran &#39;scas akimbo.cfg akimb ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg720962#msg720962">602</a></td><td>24 Nov 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Ahahahahahaha... haaaa.... :p</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg720963#msg720963">603</a></td><td>24 Nov 2012</td><td><span style="float:right;"><b>AKIMbO:</b></span></td><td>:-[ Hehehehe </td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg720976#msg720976">604</a></td><td>24 Nov 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td>:-* (there is no bro-hug smiley, so...)</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg721164#msg721164">605</a></td><td>25 Nov 2012</td><td><span style="float:right;"><b>fohat.digs:</b></span></td><td> Great job, AKIMbO. I have been working on my instructions for a project similar to th ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg723143#msg723143">606</a></td><td>27 Nov 2012</td><td><span style="float:right;"><b>fohat.digs:</b></span></td><td> Just when I thought it was safe to go in the water again ..... I lost my numpad. The ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg723309#msg723309">607</a></td><td>27 Nov 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> What an odd problem, since the CURRENT_USER setting should override the .DEFAULT!! BT ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg723436#msg723436">608</a></td><td>27 Nov 2012</td><td><span style="float:right;"><b>fohat.digs:</b></span></td><td> I think that .DEFAULT must have blown everybody&#39;s minds. The choices were 0, 1, or 2 ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg733666#msg733666">609</a></td><td>07 Dec 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> PLEASE VOTE for my converter in the Deskthority Awards 2012: Best input device mod 20 ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg733776#msg733776">610</a></td><td>07 Dec 2012</td><td><span style="float:right;"><b>fohat.digs:</b></span></td><td> Everybody vote for Soarer. Without him, I would never have known the joy I have exper ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg733810#msg733810">611</a></td><td>07 Dec 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> At least I can&#39;t lose to thin ABS keycaps again this year!! That made me sad, but my ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg733905#msg733905">612</a></td><td>08 Dec 2012</td><td><span style="float:right;"><b>Krogenar:</b></span></td><td> Voted. Possibly twice.&nbsp; ;)</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg734281#msg734281">613</a></td><td>08 Dec 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Full source and binaries for the logic analyzer now posted on DT :D</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg734582#msg734582">614</a></td><td>09 Dec 2012</td><td><span style="float:right;"><b>JesuswasaZombie:</b></span></td><td> http://learn.adafruit.com/usb-next-keyboard-with-arduino-micro/overview How cute, the ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg734602#msg734602">615</a></td><td>09 Dec 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Well maybe they are - it&#39;s a different protocol, after all! Pains me to see bit-bangi ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg736416#msg736416">616</a></td><td>11 Dec 2012</td><td><span style="float:right;"><b>precarious:</b></span></td><td> http://deskthority.net/wiki/File:G80-0777.pdf I purchased a Teensy the other day to t ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg736453#msg736453">617</a></td><td>11 Dec 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Difficult to say what that extra ROM chip changes - it could be an entirely different ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg736747#msg736747">618</a></td><td>11 Dec 2012</td><td><span style="float:right;"><b>Halvar:</b></span></td><td> Quite remarkable -- I have never seen an Amiga keyboard like that. AFAIK, the Amiga ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg736810#msg736810">619</a></td><td>11 Dec 2012</td><td><span style="float:right;"><b>precarious:</b></span></td><td> The seller of the keyboard said it was for an Amiga 1000, so I suppose that makes sen ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg737388#msg737388">620</a></td><td>12 Dec 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Sure, this would be a great way to convert a Dolch! I don&#39;t know if there are any con ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg737494#msg737494">621</a></td><td>12 Dec 2012</td><td><span style="float:right;"><b>metalliqaz:</b></span></td><td> Well this was an easy project.&nbsp; Zero to typing with my Model-M with surprisingly litt ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg740508#msg740508">622</a></td><td>15 Dec 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Many thanks to everyone who voted for my converter :D Deskthority Awards - Best input ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg740523#msg740523">623</a></td><td>15 Dec 2012</td><td><span style="float:right;"><b>precarious:</b></span></td><td> the competition didn&#39;t stand a chance, congratulations :)</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg740758#msg740758">624</a></td><td>15 Dec 2012</td><td><span style="float:right;"><b>fohat.digs:</b></span></td><td> Great work, Soarer! I guess that you have been working on this for the better part of ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg741011#msg741011">625</a></td><td>16 Dec 2012</td><td><span style="float:right;"><b>Krogenar:</b></span></td><td> Congrats Soarer!</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg743201#msg743201">626</a></td><td>18 Dec 2012</td><td><span style="float:right;"><b>precarious:</b></span></td><td> Received my Teensy and PS2 connector today, managed to get the Dolch working over USB ...</td></tr>
<tr><td><a href="http://geekhack.org/index.php?topic=17458.msg743248#msg743248">627</a></td><td>18 Dec 2012</td><td><span style="float:right;"><b>Soarer:</b></span></td><td> Certainly some (most?) WYSE keyboards aren&#39;t handled by the converter, since they hav ...</td></tr>
</table>
<hr>
</body>
</html>

333
docs/codes.html Normal file
View File

@ -0,0 +1,333 @@
<html>
<head>
<link rel="stylesheet" type="text/css" href="style1.css">
<title>XT/AT/PS2/Terminal to USB Converter with NKRO - Codes</title>
</head>
<body>
<script type="text/javascript" src="headermenu.js"></script>
<script type="text/javascript">navtabfn("Codes")</script>
<noscript><div id=jswarn class=\"navtabs\">These docs work best with Javascript enabled!</div></noscript>
<h2>Codes</h2>
<hr>
<div id="contentslist">
<ul>
<li><a href="#codes">Modified HID Code Set</a></li>
<li><a href="#deprecated">Deprecated Code Names</a></li>
<li><a href="#modifiers">Modifiers</a></li>
</ul>
</div>
<h3><a name="codes">Modified HID Code Set</a></h3>
<hr>
<p>
Mainly HID page 7, with additions to support internal features, media keys, and power keys.<br/>
Codes in <i>italics</i> are used internally by the converter, and are not output.<br/>
Codes with <span class="caution">highlight</span> are output, but may not be supported by all OS (notably Windows).<br/>
Media and Power codes are translated to the correct code page before being output.<br/>
</p>
<table>
<tr><th>Name</th><th>HID Code</th><th>Description</th></tr>
<tr><td>UNASSIGNED</td><td>0x00</td><td>No Event</td></tr>
<tr><td>OVERRUN_ERROR</td><td>0x01</td><td>Overrun Error</td></tr>
<tr><td>POST_FAIL</td><td>0x02</td><td>POST Fail</td></tr>
<tr><td>ERROR_UNDEFINED</td><td>0x03</td><td>ErrorUndefined</td></tr>
<tr><td>A</td><td>0x04</td><td>a A</td></tr>
<tr><td>B</td><td>0x05</td><td>b B</td></tr>
<tr><td>C</td><td>0x06</td><td>c C</td></tr>
<tr><td>D</td><td>0x07</td><td>d D</td></tr>
<tr><td>E</td><td>0x08</td><td>e E</td></tr>
<tr><td>F</td><td>0x09</td><td>f F</td></tr>
<tr><td>G</td><td>0x0A</td><td>g G</td></tr>
<tr><td>H</td><td>0x0B</td><td>h H</td></tr>
<tr><td>I</td><td>0x0C</td><td>i I</td></tr>
<tr><td>J</td><td>0x0D</td><td>j J</td></tr>
<tr><td>K</td><td>0x0E</td><td>k K</td></tr>
<tr><td>L</td><td>0x0F</td><td>l L</td></tr>
<tr><td>M</td><td>0x10</td><td>m M</td></tr>
<tr><td>N</td><td>0x11</td><td>n N</td></tr>
<tr><td>O</td><td>0x12</td><td>o O</td></tr>
<tr><td>P</td><td>0x13</td><td>p P</td></tr>
<tr><td>Q</td><td>0x14</td><td>q Q</td></tr>
<tr><td>R</td><td>0x15</td><td>r R</td></tr>
<tr><td>S</td><td>0x16</td><td>s S</td></tr>
<tr><td>T</td><td>0x17</td><td>t T</td></tr>
<tr><td>U</td><td>0x18</td><td>u U</td></tr>
<tr><td>V</td><td>0x19</td><td>v V</td></tr>
<tr><td>W</td><td>0x1A</td><td>w W</td></tr>
<tr><td>X</td><td>0x1B</td><td>x X</td></tr>
<tr><td>Y</td><td>0x1C</td><td>y Y</td></tr>
<tr><td>Z</td><td>0x1D</td><td>z Z</td></tr>
<tr><td>1</td><td>0x1E</td><td>1 !</td></tr>
<tr><td>2</td><td>0x1F</td><td>2 @</td></tr>
<tr><td>3</td><td>0x20</td><td>3 #</td></tr>
<tr><td>4</td><td>0x21</td><td>4 $</td></tr>
<tr><td>5</td><td>0x22</td><td>5 %</td></tr>
<tr><td>6</td><td>0x23</td><td>6 ^</td></tr>
<tr><td>7</td><td>0x24</td><td>7 &</td></tr>
<tr><td>8</td><td>0x25</td><td>8 *</td></tr>
<tr><td>9</td><td>0x26</td><td>9 (</td></tr>
<tr><td>0</td><td>0x27</td><td>0 )</td></tr>
<tr><td>ENTER</td><td>0x28</td><td>Return</td></tr>
<tr><td>ESC</td><td>0x29</td><td>Escape</td></tr>
<tr><td>BACKSPACE</td><td>0x2A</td><td>Backspace</td></tr>
<tr><td>TAB</td><td>0x2B</td><td>Tab</td></tr>
<tr><td>SPACE</td><td>0x2C</td><td>Space</td></tr>
<tr><td>MINUS</td><td>0x2D</td><td>- _</td></tr>
<tr><td>EQUAL</td><td>0x2E</td><td>= +</td></tr>
<tr><td>LEFT_BRACE</td><td>0x2F</td><td>[ {</td></tr>
<tr><td>RIGHT_BRACE</td><td>0x30</td><td>] }</td></tr>
<tr><td>BACKSLASH</td><td>0x31</td><td>\ | </td></tr>
<tr><td>EUROPE_1</td><td>0x32</td><td>Europe 1</td></tr>
<tr><td>SEMICOLON</td><td>0x33</td><td>; :</td></tr>
<tr><td>QUOTE</td><td>0x34</td><td>' "</td></tr>
<tr><td>BACK_QUOTE</td><td>0x35</td><td>` ~</td></tr>
<tr><td>COMMA</td><td>0x36</td><td>, &lt;</td></tr>
<tr><td>PERIOD</td><td>0x37</td><td>. &gt;</td></tr>
<tr><td>SLASH</td><td>0x38</td><td>/ ?</td></tr>
<tr><td>CAPS_LOCK</td><td>0x39</td><td>Caps Lock</td></tr>
<tr><td>F1</td><td>0x3A</td><td>F1</td></tr>
<tr><td>F2</td><td>0x3B</td><td>F2</td></tr>
<tr><td>F3</td><td>0x3C</td><td>F3</td></tr>
<tr><td>F4</td><td>0x3D</td><td>F4</td></tr>
<tr><td>F5</td><td>0x3E</td><td>F5</td></tr>
<tr><td>F6</td><td>0x3F</td><td>F6</td></tr>
<tr><td>F7</td><td>0x40</td><td>F7</td></tr>
<tr><td>F8</td><td>0x41</td><td>F8</td></tr>
<tr><td>F9</td><td>0x42</td><td>F9</td></tr>
<tr><td>F10</td><td>0x43</td><td>F10</td></tr>
<tr><td>F11</td><td>0x44</td><td>F11</td></tr>
<tr><td>F12</td><td>0x45</td><td>F12</td></tr>
<tr><td>PRINTSCREEN</td><td>0x46</td><td>Print Screen</td></tr>
<tr><td>SCROLL_LOCK</td><td>0x47</td><td>Scroll Lock</td></tr>
<tr><td>PAUSE</td><td>0x48</td><td>Pause</td></tr>
<tr><td>INSERT</td><td>0x49</td><td>Insert</td></tr>
<tr><td>HOME</td><td>0x4A</td><td>Home</td></tr>
<tr><td>PAGE_UP</td><td>0x4B</td><td>Page Up</td></tr>
<tr><td>DELETE</td><td>0x4C</td><td>Delete</td></tr>
<tr><td>END</td><td>0x4D</td><td>End</td></tr>
<tr><td>PAGE_DOWN</td><td>0x4E</td><td>Page Down</td></tr>
<tr><td>RIGHT</td><td>0x4F</td><td>Right Arrow</td></tr>
<tr><td>LEFT</td><td>0x50</td><td>Left Arrow</td></tr>
<tr><td>DOWN</td><td>0x51</td><td>Down Arrow</td></tr>
<tr><td>UP</td><td>0x52</td><td>Up Arrow</td></tr>
<tr><td>NUM_LOCK</td><td>0x53</td><td>Num Lock</td></tr>
<tr><td>PAD_SLASH</td><td>0x54</td><td>Keypad /</td></tr>
<tr><td>PAD_ASTERIX</td><td>0x55</td><td>Keypad *</td></tr>
<tr><td>PAD_MINUS</td><td>0x56</td><td>Keypad -</td></tr>
<tr><td>PAD_PLUS</td><td>0x57</td><td>Keypad +</td></tr>
<tr><td>PAD_ENTER</td><td>0x58</td><td>Keypad Enter</td></tr>
<tr><td>PAD_1</td><td>0x59</td><td>Keypad 1 End</td></tr>
<tr><td>PAD_2</td><td>0x5A</td><td>Keypad 2 Down</td></tr>
<tr><td>PAD_3</td><td>0x5B</td><td>Keypad 3 PageDn</td></tr>
<tr><td>PAD_4</td><td>0x5C</td><td>Keypad 4 Left</td></tr>
<tr><td>PAD_5</td><td>0x5D</td><td>Keypad 5</td></tr>
<tr><td>PAD_6</td><td>0x5E</td><td>Keypad 6 Right</td></tr>
<tr><td>PAD_7</td><td>0x5F</td><td>Keypad 7 Home</td></tr>
<tr><td>PAD_8</td><td>0x60</td><td>Keypad 8 Up</td></tr>
<tr><td>PAD_9</td><td>0x61</td><td>Keypad 9 PageUp</td></tr>
<tr><td>PAD_0</td><td>0x62</td><td>Keypad 0 Insert</td></tr>
<tr><td>PAD_PERIOD</td><td>0x63</td><td>Keypad . Delete</td></tr>
<tr><td>EUROPE_2</td><td>0x64</td><td>Europe 2</td></tr>
<tr><td>APP</td><td>0x65</td><td>App</td></tr>
<tr><td>POWER</td><td>0x66</td><td>Keyboard Power</td></tr>
<tr class="caution"><td>PAD_EQUALS</td><td>0x67</td><td>Keypad =</td></tr>
<tr><td>F13</td><td>0x68</td><td>F13</td></tr>
<tr><td>F14</td><td>0x69</td><td>F14</td></tr>
<tr><td>F15</td><td>0x6A</td><td>F15</td></tr>
<tr><td>F16</td><td>0x6B</td><td>F16</td></tr>
<tr><td>F17</td><td>0x6C</td><td>F17</td></tr>
<tr><td>F18</td><td>0x6D</td><td>F18</td></tr>
<tr><td>F19</td><td>0x6E</td><td>F19</td></tr>
<tr><td>F20</td><td>0x6F</td><td>F20</td></tr>
<tr><td>F21</td><td>0x70</td><td>F21</td></tr>
<tr><td>F22</td><td>0x71</td><td>F22</td></tr>
<tr><td>F23</td><td>0x72</td><td>F23</td></tr>
<tr><td>F24</td><td>0x73</td><td>F24</td></tr>
<tr class="caution"><td>EXECUTE</td><td>0x74</td><td>Keyboard Execute</td></tr>
<tr class="caution"><td>HELP</td><td>0x75</td><td>Keyboard Help</td></tr>
<tr class="caution"><td>MENU</td><td>0x76</td><td>Keyboard Menu</td></tr>
<tr class="caution"><td>SELECT</td><td>0x77</td><td>Keyboard Select</td></tr>
<tr class="caution"><td>STOP</td><td>0x78</td><td>Keyboard Stop</td></tr>
<tr class="caution"><td>AGAIN</td><td>0x79</td><td>Keyboard Again</td></tr>
<tr class="caution"><td>UNDO</td><td>0x7A</td><td>Keyboard Undo</td></tr>
<tr class="caution"><td>CUT</td><td>0x7B</td><td>Keyboard Cut</td></tr>
<tr class="caution"><td>COPY</td><td>0x7C</td><td>Keyboard Copy</td></tr>
<tr class="caution"><td>PASTE</td><td>0x7D</td><td>Keyboard Paste</td></tr>
<tr class="caution"><td>FIND</td><td>0x7E</td><td>Keyboard Find</td></tr>
<tr class="caution"><td>MUTE</td><td>0x7F</td><td>Keyboard Mute</td></tr>
<tr class="caution"><td>VOLUME_UP</td><td>0x80</td><td>Keyboard Volume Up</td></tr>
<tr class="caution"><td>VOLUME_DOWN</td><td>0x81</td><td>Keyboard Volume Dn</td></tr>
<tr class="caution"><td>LOCKING_CAPS_LOCK</td><td>0x82</td><td>Keyboard Locking Caps Lock</td></tr>
<tr class="caution"><td>LOCKING_NUM_LOCK</td><td>0x83</td><td>Keyboard Locking Num Lock</td></tr>
<tr class="caution"><td>LOCKING_SCROLL_LOCK</td><td>0x84</td><td>Keyboard Locking Scroll Lock</td></tr>
<tr><td>PAD_COMMA</td><td>0x85</td><td>Keypad comma (Brazilian Keypad .)</td></tr>
<tr><td>EQUAL_SIGN</td><td>0x86</td><td>Keyboard Equal Sign</td></tr>
<tr><td>INTERNATIONAL_1</td><td>0x87</td><td>Keyboard Int'l 1 (Ro)</td></tr>
<tr><td>INTERNATIONAL_2</td><td>0x88</td><td>Keyboard Intl'2 (Katakana/Hiragana)</td></tr>
<tr><td>INTERNATIONAL_3</td><td>0x89</td><td>Keyboard Int'l 2 (Yen)</td></tr>
<tr><td>INTERNATIONAL_4</td><td>0x8A</td><td>Keyboard Int'l 4 (Henkan)</td></tr>
<tr><td>INTERNATIONAL_5</td><td>0x8B</td><td>Keyboard Int'l 5 (Muhenkan)</td></tr>
<tr><td>INTERNATIONAL_6</td><td>0x8C</td><td>Keyboard Int'l 6 (PC9800 Keypad comma)</td></tr>
<tr><td>INTERNATIONAL_7</td><td>0x8D</td><td>Keyboard Int'l 7</td></tr>
<tr><td>INTERNATIONAL_8</td><td>0x8E</td><td>Keyboard Int'l 8</td></tr>
<tr><td>INTERNATIONAL_9</td><td>0x8F</td><td>Keyboard Int'l 9</td></tr>
<tr><td>LANG_1</td><td>0x90</td><td>Keyboard Lang 1 (Hanguel/English)</td></tr>
<tr><td>LANG_2</td><td>0x91</td><td>Keyboard Lang 2 (Hanja)</td></tr>
<tr><td>LANG_3</td><td>0x92</td><td>Keyboard Lang 3 (Katakana)</td></tr>
<tr><td>LANG_4</td><td>0x93</td><td>Keyboard Lang 4 (Hiragana)</td></tr>
<tr><td>LANG_5</td><td>0x94</td><td>Keyboard Lang 5 (Zenkaku/Hankaku)</td></tr>
<tr><td>LANG_6</td><td>0x95</td><td>Keyboard Lang 6</td></tr>
<tr><td>LANG_7</td><td>0x96</td><td>Keyboard Lang 7</td></tr>
<tr><td>LANG_8</td><td>0x97</td><td>Keyboard Lang 8</td></tr>
<tr><td>LANG_9</td><td>0x98</td><td>Keyboard Lang 9</td></tr>
<tr class="caution"><td>ALTERNATE_ERASE</td><td>0x99</td><td>Keyboard Alternate Erase</td></tr>
<tr class="caution"><td>SYSREQ_ATTN</td><td>0x9A</td><td>Keyboard SysReq/Attention</td></tr>
<tr class="caution"><td>CANCEL</td><td>0x9B</td><td>Keyboard Cancel</td></tr>
<tr class="caution"><td>CLEAR</td><td>0x9C</td><td>Keyboard Clear</td></tr>
<tr class="caution"><td>PRIOR</td><td>0x9D</td><td>Keyboard Prior</td></tr>
<tr class="caution"><td>RETURN</td><td>0x9E</td><td>Keyboard Return</td></tr>
<tr class="caution"><td>SEPARATOR</td><td>0x9F</td><td>Keyboard Separator</td></tr>
<tr class="caution"><td>OUT</td><td>0xA0</td><td>Keyboard Out</td></tr>
<tr class="caution"><td>OPER</td><td>0xA1</td><td>Keyboard Oper</td></tr>
<tr class="caution"><td>CLEAR_AGAIN</td><td>0xA2</td><td>Keyboard Clear/Again</td></tr>
<tr class="caution"><td>CRSEL_PROPS</td><td>0xA3</td><td>Keyboard CrSel/Props</td></tr>
<tr class="caution"><td>EXSEL</td><td>0xA4</td><td>Keyboard ExSel</td></tr>
<tr><td>SYSTEM_POWER</td><td>0xA8</td><td>System Power</td></tr>
<tr><td>SYSTEM_SLEEP</td><td>0xA9</td><td>System Sleep</td></tr>
<tr><td>SYSTEM_WAKE</td><td>0xAA</td><td>System Wake</td></tr>
<tr><td><i>AUX1</i></td><td><i>0xAB</i></td><td><i>Auxiliary key 1</i></td></tr>
<tr><td><i>AUX2</i></td><td><i>0xAC</i></td><td><i>Auxiliary key 2</i></td></tr>
<tr><td><i>AUX3</i></td><td><i>0xAD</i></td><td><i>Auxiliary key 3</i></td></tr>
<tr><td><i>AUX4</i></td><td><i>0xAE</i></td><td><i>Auxiliary key 4</i></td></tr>
<tr><td><i>AUX5</i></td><td><i>0xAF</i></td><td><i>Auxiliary key 5</i></td></tr>
<tr><td><i>EXTRA_LALT</i></td><td><i>0xB1</i></td><td><i>AT-F extra pad lhs of space</i></td></tr>
<tr><td><i>EXTRA_PAD_PLUS</i></td><td><i>0xB2</i></td><td><i>Term extra pad bottom of keypad +</i></td></tr>
<tr><td><i>EXTRA_RALT</i></td><td><i>0xB3</i></td><td><i>AT-F extra pad rhs of space</i></td></tr>
<tr><td><i>EXTRA_EUROPE_2</i></td><td><i>0xB4</i></td><td><i>AT-F extra pad lhs of enter</i></td></tr>
<tr><td><i>EXTRA_BACKSLASH</i></td><td><i>0xB5</i></td><td><i>AT-F extra pad top of enter</i></td></tr>
<tr><td><i>EXTRA_INSERT</i></td><td><i>0xB6</i></td><td><i>AT-F extra pad lhs of Insert</i></td></tr>
<tr><td><i>EXTRA_F1</i></td><td><i>0xB7</i></td><td><i>122-key Terminal lhs F1</i></td></tr>
<tr><td><i>EXTRA_F2</i></td><td><i>0xB8</i></td><td><i>122-key Terminal lhs F2</i></td></tr>
<tr><td><i>EXTRA_F3</i></td><td><i>0xB9</i></td><td><i>122-key Terminal lhs F3</i></td></tr>
<tr><td><i>EXTRA_F4</i></td><td><i>0xBA</i></td><td><i>122-key Terminal lhs F4</i></td></tr>
<tr><td><i>EXTRA_F5</i></td><td><i>0xBB</i></td><td><i>122-key Terminal lhs F5</i></td></tr>
<tr><td><i>EXTRA_F6</i></td><td><i>0xBC</i></td><td><i>122-key Terminal lhs F6</i></td></tr>
<tr><td><i>EXTRA_F7</i></td><td><i>0xBD</i></td><td><i>122-key Terminal lhs F7</i></td></tr>
<tr><td><i>EXTRA_F8</i></td><td><i>0xBE</i></td><td><i>122-key Terminal lhs F8</i></td></tr>
<tr><td><i>EXTRA_F9</i></td><td><i>0xBF</i></td><td><i>122-key Terminal lhs F9</i></td></tr>
<tr><td><i>EXTRA_F10</i></td><td><i>0xC0</i></td><td><i>122-key Terminal lhs F10</i></td></tr>
<tr><td><i>EXTRA_SYSRQ</i></td><td><i>0xC2</i></td><td><i>Sys Req (AT 84-key)</i></td></tr>
<tr><td><i>FN1</i></td><td><i>0xD0</i></td><td><i>Function layer key 1</i></td></tr>
<tr><td><i>FN2</i></td><td><i>0xD1</i></td><td><i>Function layer key 2</i></td></tr>
<tr><td><i>FN3</i></td><td><i>0xD2</i></td><td><i>Function layer key 3</i></td></tr>
<tr><td><i>FN4</i></td><td><i>0xD3</i></td><td><i>Function layer key 4</i></td></tr>
<tr><td><i>FN5</i></td><td><i>0xD4</i></td><td><i>Function layer key 5</i></td></tr>
<tr><td><i>FN6</i></td><td><i>0xD5</i></td><td><i>Function layer key 6</i></td></tr>
<tr><td><i>FN7</i></td><td><i>0xD6</i></td><td><i>Function layer key 7</i></td></tr>
<tr><td><i>FN8</i></td><td><i>0xD7</i></td><td><i>Function layer key 8</i></td></tr>
<tr><td><i>SELECT_0</i></td><td><i>0xD8</i></td><td><i>Select reset</i></td></tr>
<tr><td><i>SELECT_1</i></td><td><i>0xD9</i></td><td><i>Select 1 toggle</i></td></tr>
<tr><td><i>SELECT_2</i></td><td><i>0xDA</i></td><td><i>Select 2 toggle</i></td></tr>
<tr><td><i>SELECT_3</i></td><td><i>0xDB</i></td><td><i>Select 3 toggle</i></td></tr>
<tr><td><i>SELECT_4</i></td><td><i>0xDC</i></td><td><i>Select 4 toggle</i></td></tr>
<tr><td><i>SELECT_5</i></td><td><i>0xDD</i></td><td><i>Select 5 toggle</i></td></tr>
<tr><td><i>SELECT_6</i></td><td><i>0xDE</i></td><td><i>Select 6 toggle</i></td></tr>
<tr><td><i>SELECT_7</i></td><td><i>0xDF</i></td><td><i>Select 7 toggle</i></td></tr>
<tr><td>LCTRL</td><td>0xE0</td><td>Left Control</td></tr>
<tr><td>LSHIFT</td><td>0xE1</td><td>Left Shift</td></tr>
<tr><td>LALT</td><td>0xE2</td><td>Left Alt</td></tr>
<tr><td>LGUI</td><td>0xE3</td><td>Left GUI</td></tr>
<tr><td>RCTRL</td><td>0xE4</td><td>Right Control</td></tr>
<tr><td>RSHIFT</td><td>0xE5</td><td>Right Shift</td></tr>
<tr><td>RALT</td><td>0xE6</td><td>Right Alt</td></tr>
<tr><td>RGUI</td><td>0xE7</td><td>Right GUI</td></tr>
<tr><td>MEDIA_NEXT_TRACK</td><td>0xE8</td><td>Scan Next Track</td></tr>
<tr><td>MEDIA_PREV_TRACK</td><td>0xE9</td><td>Scan Previous Track</td></tr>
<tr><td>MEDIA_STOP</td><td>0xEA</td><td>Stop</td></tr>
<tr><td>MEDIA_PLAY_PAUSE</td><td>0xEB</td><td>Play/ Pause</td></tr>
<tr><td>MEDIA_MUTE</td><td>0xEC</td><td>Mute</td></tr>
<tr><td>MEDIA_BASS_BOOST</td><td>0xED</td><td>Bass Boost</td></tr>
<tr><td>MEDIA_LOUDNESS</td><td>0xEE</td><td>Loudness</td></tr>
<tr><td>MEDIA_VOLUME_UP</td><td>0xEF</td><td>Volume Up</td></tr>
<tr><td>MEDIA_VOLUME_DOWN</td><td>0xF0</td><td>Volume Down</td></tr>
<tr><td>MEDIA_BASS_UP</td><td>0xF1</td><td>Bass Up</td></tr>
<tr><td>MEDIA_BASS_DOWN</td><td>0xF2</td><td>Bass Down</td></tr>
<tr><td>MEDIA_TREBLE_UP</td><td>0xF3</td><td>Treble Up</td></tr>
<tr><td>MEDIA_TREBLE_DOWN</td><td>0xF4</td><td>Treble Down</td></tr>
<tr><td>MEDIA_MEDIA_SELECT</td><td>0xF5</td><td>Media Select</td></tr>
<tr><td>MEDIA_MAIL</td><td>0xF6</td><td>Mail</td></tr>
<tr><td>MEDIA_CALCULATOR</td><td>0xF7</td><td>Calculator</td></tr>
<tr><td>MEDIA_MY_COMPUTER</td><td>0xF8</td><td>My Computer</td></tr>
<tr><td>MEDIA_WWW_SEARCH</td><td>0xF9</td><td>WWW Search</td></tr>
<tr><td>MEDIA_WWW_HOME</td><td>0xFA</td><td>WWW Home</td></tr>
<tr><td>MEDIA_WWW_BACK</td><td>0xFB</td><td>WWW Back</td></tr>
<tr><td>MEDIA_WWW_FORWARD</td><td>0xFC</td><td>WWW Forward</td></tr>
<tr><td>MEDIA_WWW_STOP</td><td>0xFD</td><td>WWW Stop</td></tr>
<tr><td>MEDIA_WWW_REFRESH</td><td>0xFE</td><td>WWW Refresh</td></tr>
<tr><td>MEDIA_WWW_FAVORITES</td><td>0xFF</td><td>WWW Favorites</td></tr>
</table>
<p class="breakhere" />
<h3><a name="deprecated">Deprecated Code Names</a> <span class="versioninfo">v1.0+</span></h3>
<hr>
<p>
The following code names are deprecated, and should no longer be used.<br/>
They are included for compatibility with older config files written for v0.997.<br/>
Replacements for these names have been added beginning 'EXTRA_'.<br/>
(As in, the change is just in the names of these codes).<br/>
</p>
<table>
<tr><th>Name</th><th>HID Code</th><th>Description</th></tr>
<tr><td><i>FAKE_01</i></td><td><i>0xB0</i></td><td><i>extra</i></td></tr>
<tr><td><i>FAKE_02</i></td><td><i>0xB1</i></td><td><i>AT-F extra pad lhs of space</i></td></tr>
<tr><td><i>FAKE_03</i></td><td><i>0xB2</i></td><td><i>Term extra pad bottom of keypad +</i></td></tr>
<tr><td><i>FAKE_04</i></td><td><i>0xB3</i></td><td><i>AT-F extra pad rhs of space</i></td></tr>
<tr><td><i>FAKE_05</i></td><td><i>0xB4</i></td><td><i>AT-F extra pad lhs of enter</i></td></tr>
<tr><td><i>FAKE_06</i></td><td><i>0xB5</i></td><td><i>AT-F extra pad top of enter</i></td></tr>
<tr><td><i>FAKE_07</i></td><td><i>0xB6</i></td><td><i>AT-F extra pad lhs of Insert</i></td></tr>
<tr><td><i>FAKE_08</i></td><td><i>0xB7</i></td><td><i>Term F1</i></td></tr>
<tr><td><i>FAKE_09</i></td><td><i>0xB8</i></td><td><i>Term F2</i></td></tr>
<tr><td><i>FAKE_10</i></td><td><i>0xB9</i></td><td><i>Term F3</i></td></tr>
<tr><td><i>FAKE_11</i></td><td><i>0xBA</i></td><td><i>Term F4</i></td></tr>
<tr><td><i>FAKE_12</i></td><td><i>0xBB</i></td><td><i>Term F5</i></td></tr>
<tr><td><i>FAKE_13</i></td><td><i>0xBC</i></td><td><i>Term F6</i></td></tr>
<tr><td><i>FAKE_14</i></td><td><i>0xBD</i></td><td><i>Term F7</i></td></tr>
<tr><td><i>FAKE_15</i></td><td><i>0xBE</i></td><td><i>Term F8</i></td></tr>
<tr><td><i>FAKE_16</i></td><td><i>0xBF</i></td><td><i>Term F9</i></td></tr>
<tr><td><i>FAKE_17</i></td><td><i>0xC0</i></td><td><i>Term F10</i></td></tr>
<tr><td><i>FAKE_18</i></td><td><i>0xC1</i></td><td><i>extra</i></td></tr>
<tr><td><i>FAKE_19</i></td><td><i>0xC2</i></td><td><i>Sys Req (AT 84-key)</i></td></tr>
</table>
<h3><a name="modifiers">Modifiers</a></h3>
<hr>
<p>
For most uses, either a single key or a combination can be specified.<br/>
Depending on context, a combination might mean 'any' or 'all' of the specified modifiers.<br/>
</p>
<table>
<tr><th>Name</th><th>Description</th></tr>
<tr><td>LCTRL</td><td>Left Control</td></tr>
<tr><td>LSHIFT</td><td>Left Shift</td></tr>
<tr><td>LALT</td><td>Left Alt</td></tr>
<tr><td>LGUI</td><td>Left GUI</td></tr>
<tr><td>RCTRL</td><td>Right Control</td></tr>
<tr><td>RSHIFT</td><td>Right Shift</td></tr>
<tr><td>RALT</td><td>Right Alt</td></tr>
<tr><td>RGUI</td><td>Right GUI</td></tr>
<tr><td>CTRL</td><td>Either/Both Control (shorthand for LCTRL RCTRL)</td></tr>
<tr><td>SHIFT</td><td>Either/Both Shift (shorthand for LSHIFT RSHIFT)</td></tr>
<tr><td>ALT</td><td>Either/Both Alt (shorthand for LALT RALT)</td></tr>
<tr><td>GUI</td><td>Either/Both GUI (shorthand for LGUI RGUI)</td></tr>
<tr><td>ALL</td><td>Any/All (shorthand for CTRL SHIFT ALT GUI)</td></tr>
</table>
<hr>
</body></html>

258
docs/config.html Normal file
View File

@ -0,0 +1,258 @@
<html>
<head>
<link rel="stylesheet" type="text/css" href="style1.css">
<title>XT/AT/PS2/Terminal to USB Converter with NKRO - Config</title>
</head>
<body>
<script type="text/javascript" src="headermenu.js"></script>
<script type="text/javascript">navtabfn("Config")</script>
<noscript><div id=jswarn class=\"navtabs\">These docs work best with Javascript enabled!</div></noscript>
<h2>Config <span class="versioninfo">v0.997+</span></h2>
<hr>
<div id="contentslist">
<ul>
<li><a href="#overview">Overview</a></li>
<li><a href="#commands">Command Reference</a></li>
<ul>
<li><a href="#force">force</a></li>
<li><a href="#include">include</a></li>
<li><a href="#ifselect">ifselect</a></li>
<li><a href="#ifset">ifset</a></li>
<li><a href="#ifkeyboard">ifkeyboard</a></li>
<li><a href="#remapblock">remapblock</a></li>
<li><a href="#layerblock">layerblock</a></li>
<li><a href="#macroblock">macroblock</a></li>
<ul>
<li><a href="#macro_commands">Macro Commands</a></li>
<li><a href="#triggers">Macro trigger matching</a></li>
</ul>
</ul>
</ul>
</div>
<h3><a name="overview">Overview</a></h3>
<hr>
<p>This diagram gives an simplified view of the processing stages inside the converter:<br>
<img src="images/dataflow.png"/></p>
<p>The first stage is a fixed translation into HID codes, that cannot be modified by the config. The goal of this stage is
to map into a reasonable base set of codes for further remapping, and to try and ensure that each key on the keyboard
results in a unique HID code after this stage.</p>
<p>The second stage combines remapping and layer functions, since layers are simply alternate remappings.</p>
<p>The third stage is macro expansion.</p>
<p>The final stage separates out the internal commands such as SELECTn and BOOT etc. and routes them appropriately, and
also converts the HIDX codes back into standard HID codes for the keyboard, media, and power code pages.</p>
<h3><a name="commands">Command Reference</a></h3>
<hr>
<h4><a name=force></a>force</h4>
<hr>
<p>The <code>force</code> command disables the auto-detection of keyboard type. It is only very rarely needed!</p>
<pre><code>force {set1|set2|set3|set2ext}
</code></pre>
<p>Example:</p>
<pre><code>force set2
</code></pre>
<h4><a name=include></a>include</h4>
<hr>
<p>The <code>include</code> command processes another file, exactly as if it was copy-pasted to where the include command is.</p>
<pre><code>include &lt;file_name&gt;
</code></pre>
<p>Quotation marks are optional unless the file name contains spaces.</p>
<p>Example:</p>
<pre><code>include "colemak.sc"
</code></pre>
<h4><a name=ifselect></a>ifselect</h4>
<hr>
<p>
Groups of settings can be toggled by using the <code>ifselect</code> command and defining remaps or macros that output the SELECT_0 to SELECT_7 codes.</p>
<pre><code>ifselect {&lt;select_num&gt; | any}
</code></pre>
<p>
When any of the SELECT codes are output the entire config is reloaded, and the <code>ifselect</code> commands choose which blocks will be applied.<br/>
When the converter powers-up, all selects, except select 0, are inactive.<br/>
Multiple selects can be active at a time.<br/>
Select 0 is special - it is always active, and when SELECT_0 is output it resets all the other selects.
</p>
<p>Blocks following <code>ifselect &lt;select_num&gt;</code>, up to the next <code>ifselect</code>, are applied only if the specified select is active.</p>
<p>Blocks following <code>ifselect any</code>, up to the next <code>ifselect</code>, are applied regardless of which selects are active.</p>
<p>Example:</p>
<pre><code># toggle between qwerty and colemak by pressing scroll lock
ifselect 1
include colemak.sc
ifselect any
remapblock
SCROLL_LOCK SELECT_1
endblock
</code></pre>
<h4><a name=ifset></a>ifset</h4>
<hr>
<p>Blocks following the <code>ifset</code> command are only applied if using one of the specified sets.</p>
<pre><code>ifset [set1] [set2] [set3] [set2ext] [any]
</code></pre>
<p>Example:</p>
<pre><code>ifset set1 set2
</code></pre>
<h4><a name=ifkeyboard></a>ifkeyboard</h4>
<hr>
<p>Blocks following the <code>ifkeyboard</code> command are only applied if the keyboard has the specified ID.</br>
<pre><code>ifkeyboard {&lt;keyboard_id&gt; | any}
</code></pre>
<p>The keyboard ID is given in hexadecimal.</p>
<p>See the <a href=trouble.html#keyboardid>Troubleshooting</a> section for details of how to find out the ID of your keyboard.</p>
<p>Example:</p>
<pre><code>ifkeyboard BABA
</code></pre>
<h4><a name=layerblock></a>layerblock</h4>
<hr>
<p>Layerblocks define combinations of function keys to access different layers.</p>
<pre><code>layerblock
&lt;fn_key_combo&gt; &lt;layer_num&gt;
...
endblock
</code></pre>
<p>Function keys are defined by remapping keys to codes FN1 to FN8.</p>
<p>Example:</p>
<pre><code>layerblock
FN1 1
FN2 1
FN1 FN2 2
endblock
<a href=config.html#remapblock>remapblock</a>
LGUI FN1
RGUI FN2
endblock
</code></pre>
<h4><a name=remapblock></a>remapblock</h4>
<hr>
<p>Remapblocks define remappings either for the base layer, or for the specified
layer if a <code>layer</code> command is given inside the block.</p>
<pre><code>remapblock
[layer &lt;layer_num&gt;]
&lt;from_hid&gt; &lt;to_hid&gt;
...
endblock
</code></pre>
<p>Example:</p>
<pre><code># swap capslock and backspace
remapblock
CAPS_LOCK BACKSPACE
BACKSPACE CAPS_LOCK
endblock
</code></pre>
<h4><a name=macroblock></a>macroblock</h4>
<hr>
<p>Macroblocks define one or more macros. Macros are triggered by a single HID
key with any combination of metas, and can have command blocks that execute
on make and/or break of the HID key.</p>
<pre><code>macroblock
macro &lt;hid&gt; [[-][{l|r}]shift] [[-][{l|r}]ctrl] [[-][{l|r}]alt] [[-][{l|r}]gui] ...
[
&lt;command&gt; [&lt;value&gt;]
...
]
[onbreak [norestoremeta]
&lt;command&gt; [&lt;value&gt;]
...
]
endmacro
...
endblock
</code></pre>
<p>Example:</p>
<pre><code>macroblock
macro SCROLL_LOCK LSHIFT LCTRL -ALT
PUSH_META CLEAR_META all # save and clear all metas
PRESS p # press some keys...
PRESS i
PRESS N # case is ignored - this results in lowercase 'n'
SET_META lshift # you have to set modifiers yourself
PRESS g # results in a capital 'G', since shift is set
POP_ALL_META # restore metas that were active before
endmacro
endblock
</code></pre>
<h5><a name="macro_commands">Macro Commands</a></h5>
<table>
<tr><th>Command</th><th>Description</th></tr>
<tr><td>NOP</td><td>Does nothing</td></tr>
<tr><td>PRESS &lt;hid&gt;</td><td>Shorthand for MAKE &lt;hid&gt; then BREAK &lt;hid&gt;</td></tr>
<tr><td>MAKE &lt;hid&gt;</td><td>Set keystate to 'down'</td></tr>
<tr><td>BREAK &lt;hid&gt;</td><td>Set keystate to 'up'</td></tr>
<tr><td>ASSIGN_META &lt;metas&gt;</td><td>Set all metas to the state specified</td></tr>
<tr><td>SET_META &lt;metas&gt;</td><td>Set specified metas to down state</td></tr>
<tr><td>CLEAR_META &lt;metas&gt;</td><td>Set specified metas to up state</td></tr>
<tr><td>TOGGLE_META &lt;metas&gt;</td><td>Set specified metas to inverse of current state</td></tr>
<tr><td>POP_META</td><td>Restore metas from the time of the last PUSH_META</td></tr>
<tr><td>POP_ALL_META</td><td>Restore metas from the time of the first PUSH_META</td></tr>
<tr><td>DELAY &lt;delay_in_ms&gt;</td><td>Delay by the specified number of milliseconds</td></tr>
<tr><td>CLEAR_ALL</td><td>(internal use e.g. when buffer overrun is received)</td></tr>
<tr><td>BOOT</td><td>Cause the converter to jump to the bootloader <span class="versioninfo">v1.0+</span></td></tr>
<tr><td>PUSH_META &lt;cmd&gt; &lt;value&gt;</td><td>Save metas for later. Combines with other commands</td></tr>
</table>
<h5><a name="triggers">Macro trigger matching</a></h5>
<p>
Macros are triggered only when the state matches for all of the the specified metas.<br/>
If a particular meta is not specified, its state is not matched.<br/>
</p>
<table>
<tr><th>Meta</th><th>Trigger condition</th></tr>
<tr><td>LSHIFT</td><td>LSHIFT is pressed</td></tr>
<tr><td>RSHIFT</td><td>RSHIFT is pressed</td></tr>
<tr><td>SHIFT</td><td>Either LSHIFT or RSHIFT is pressed</td></tr>
<tr><td>-LSHIFT</td><td>LSHIFT is not pressed</td></tr>
</table>
<p>
When looking for a match, macros are checked in the order they appear in the config file.<br/>
The first matching macro found (if any) is executed, so you sometimes need to take of what order the macros are in.
</p>
<pre><code>macroblock
macro SCROLL_LOCK LSHIFT # this macro will execute even if LCTRL is down, so...
...
endmacro
macro SCROLL_LOCK LSHIFT LCTRL # ... this macro will never execute!
...
endmacro
endblock
</code></pre>
<p>The correct order would be:</p>
<pre><code>macroblock
macro SCROLL_LOCK LSHIFT LCTRL
...
endmacro
macro SCROLL_LOCK LSHIFT
...
endmacro
endblock
</code></pre>
<p>See the <a href="codes.html">HID code list</a> for HID and META values.</p>
<hr>
</body></html>

69
docs/configquickref.html Normal file
View File

@ -0,0 +1,69 @@
<html>
<head>
<link rel="stylesheet" type="text/css" href="style1.css">
<title>XT/AT/PS2/Terminal to USB Converter with NKRO - QuickRef</title>
</head>
<body>
<script type="text/javascript" src="headermenu.js"></script>
<script type="text/javascript">navtabfn("QuickRef")</script>
<noscript><div id=jswarn class=\"navtabs\">These docs work best with Javascript enabled!</div></noscript>
<h2>Config Quick Reference <span class="versioninfo">v0.997+</span></h2>
<hr>
<p>Comments begin with a '#' and continue to the end of the line.</p>
<pre><code># This is a comment.
</code></pre>
<p>The force command disables the auto-detection of keyboard type.</p>
<pre><code><a href=config.html#force>force</a> {set1|set2|set3|set2ext}
</code></pre>
<p>The include command processes another file, exactly as if it was copy-pasted to where the include command is.</p>
<pre><code><a href=config.html#include>include</a> &lt;file_name&gt;
</code></pre>
<p>Conditionals stay in effect until the conditional is repeated with different argument(s).<br/>
The blocks following a conditional are only applied if...</p>
<pre><code><a href=config.html#ifselect>ifselect</a> {&lt;select_num&gt; | any} # specified select is active.
<a href=config.html#ifset>ifset</a> [set1] [set2] [set3] [set2ext] [any] # using one of the specified sets.
<a href=config.html#ifkeyboard>ifkeyboard</a> {&lt;keyboard_id&gt; | any} # keyboard has the specified ID.
</code></pre>
<p>Layerblocks define combinations of function keys to access different layers.<br/>
(Function keys are defined by remapping one or more keys to pseudo-HID codes FN1 to FN8).</p>
<pre><code><a href=config.html#layerblock>layerblock</a>
&lt;fn_key_combo&gt; &lt;layer_num&gt;
...
endblock
</code></pre>
<p>Remapblocks define remappings either for the base layer, or for the specified
layer if a layer command is given inside the block.</p>
<pre><code><a href=config.html#remapblock>remapblock</a>
[layer &lt;layer_num&gt;]
&lt;from_hid&gt; &lt;to_hid&gt;
...
endblock
</code></pre>
<p>Macroblocks define one or more macros. Macros are triggered by a single HID
key with any combination of metas, and can have command blocks that execute
on either or both of make and break of the HID key.</p>
<pre><code><a href=config.html#macro>macroblock</a>
<a href=config.html#macro>macro</a> &lt;hid&gt; [[-][{l|r}]shift] [[-][{l|r}]ctrl] [[-][{l|r}]alt] [[-][{l|r}]gui] ...
[
&lt;command&gt; [&lt;value&gt;]
...
]
[onbreak [norestoremeta]
&lt;command&gt; [&lt;value&gt;]
...
]
endmacro
...
endblock
</code></pre>
<hr>
</body></html>

57
docs/firmware.html Normal file
View File

@ -0,0 +1,57 @@
<html>
<head>
<link rel="stylesheet" type="text/css" href="style1.css">
<title>XT/AT/PS2/Terminal to USB Converter with NKRO - Firmware</title>
</head>
<body>
<script type="text/javascript" src="headermenu.js"></script>
<script type="text/javascript">navtabfn("Firmware")</script>
<noscript><div id=jswarn class=\"navtabs\">These docs work best with Javascript enabled!</div></noscript>
<h2>Firmware</h2>
<hr>
<div id="contentslist">
<ul>
<li><a href="#cpus">CPUs</a></li>
<li><a href="#loading">Loading</a></li>
</ul>
</div>
<h3><a name="cpus">CPUs</a></h3>
<hr>
<p>The firmware has been compiled for the following CPUs, listed roughly in order of preference:</p>
<p><table>
<tr><th>CPU</th><th>Known breakout board(s)</th></tr>
<tr><td>ATmega32U4</td><td><a href=http://www.pjrc.com/store/teensy.html>Teensy 2.0</a>, <a href=http://www.adafruit.com/products/296>Adafruit Atmega32u4 Breakout Board</a></td></tr>
<tr><td>AT90USB1286</td><td><a href=http://www.pjrc.com/store/teensypp.html>Teensy++ 2.0</a></td></tr>
<tr><td>AT90USB646 <span class="versioninfo">v1.0+</span></td><td>Teensy++ (no longer available)</td></tr>
<tr><td>ATmega16U4 <span class="versioninfo">v1.0+</span></td><td>???</td></tr>
</table></p>
<p>Make sure you pick the right .hex file for your dev board!</p>
<p>ATmega32U4 breakout boards are usually the best choice, on a price basis.</p>
<p>AT90USB1286 boards work equally as well, and have more memory (which can be essential if you want to set up a <i>very</i> large number of layers and/or macros), but cost more.</p>
<p><i>Note: the ATmega16U4 build is very close to 16KB in size, and probably does not leave room for a USB bootloader on the chip.<br/>
So, ATmega16U4 based breakout boards are not recommended for novices!</i></p>
<h3><a name="loading">Loading</a></h3>
<hr>
<p>
The Teensy family have the PJRC bootloader installed and are programmed using <a href="http://www.pjrc.com/teensy/loader.html">PJRC's Teensy Loader</a>, available for all common OS.
</p>
<p>
Other breakout boards usually have the Atmel DFU bootloader installed and can be programmed using <a href="http://www.atmel.com/tools/FLIP.aspx">FLIP</a>.<br/>
FLIP is available for Windows and Linux. For Mac OS-X, see this <a href="http://www.pensieridigitali.com/2010/10/24/upgrade-psgroove-ps3break-with-mac-osx-at90usb162/?lang=en">guide on how use DFU-programmer</a>.
</p>
<p>
Arduino Leonardo can be programmed using <a href="http://www.nongnu.org/avrdude/">avrdude</a>, or the Arduino IDE.
</p>
<hr>
</body></html>

171
docs/hardware.html Normal file
View File

@ -0,0 +1,171 @@
<html>
<head>
<link rel="stylesheet" type="text/css" href="style1.css">
<title>XT/AT/PS2/Terminal to USB Converter with NKRO - Hardware</title>
</head>
<body>
<script type="text/javascript" src="headermenu.js"></script>
<script type="text/javascript">navtabfn("Hardware")</script>
<noscript><div id=jswarn class=\"navtabs\">These docs work best with Javascript enabled!</div></noscript>
<h2>Hardware</h2>
<hr>
<div id="contentslist">
<ul>
<li><a href="#parts">Parts List</a></li>
<li><a href="#wiring">Wiring Info</a></li>
<li><a href="#connectors">Connectors</a></li>
<li><a href="#pullups">Pull-up resistors</a></li>
<li><a href="#leds">LEDs</a></li>
<li><a href="#aux_inputs">Auxiliary Key Inputs</a> <span class="versioninfo">v1.1+</span></li>
<li><a href="#conn_summary">Connection Summary for Teensy</a></li>
</ul>
</div>
<h3><a name="parts">Parts List</a></h3>
<hr>
<p>Essential items:</p>
<ul>
<li>Teensy, or similar AVR breakout board
<li>Connector to suit your keyboard
<li>Some wire
</ul>
<p>Optional items, as desired:</p>
<ul>
<li>3x LEDs
<li>3x Resistors for LEDs (value depends on the LEDs)
<li>2x 1k Resistors (for pull-ups)
<li>Box (optional, but recommended!)
</ul>
<p>You could, of course, mount the Teensy inside your keyboard and not even need a connector or a box!</p>
<p>See the <a href=firmware.html>firmware</a> section for details of supported AVR processors and breakout boards.</p>
<h3><a name="wiring">Wiring Info</a></h3>
<hr>
<p><table>
<tr><th>Connector</th><th>Breakout board</th></tr>
<tr><td>GND</td><td>GND</td></tr>
<tr><td>Vcc/+5V</td><td>VCC</td></tr>
<tr><td>Data</td><td>PD0</td></tr>
<tr><td>Clock</td><td>PD1</td></tr>
<tr><td>Keyboard Reset <span class="versioninfo">v1.1+</span></td><td>PB7</td></tr>
</table></p>
<p>See PJRC for <a href="http://www.pjrc.com/teensy/pinout.html">Teensy pinouts</a>, or the documentation that came with your chosen breakout board.</p>
<p>'Keyboard Reset' is only required for certain PC/XT-like keyboards, such as the Leading Edge DC-2014.</p>
<h3><a name="connectors">Connectors</a></h3>
<hr>
<p>I wired mine to a PS/2 socket, and then use adapters to connect the others.</p>
<p><a href="http://www.kbdbabel.org">kbdbabel</a> has masses of <a href="http://www.kbdbabel.org/conn/index.html">connector info</a>.
So much, that it can be hard to find the one you want!</p>
<p>So I've included the most common connectors used with this converter here.</p>
<p>Note that all the connectors are shown looking into the socket.<br><br></p>
<p><b>PC/XT</b> keyboards use a 5 pin, 180 degree, DIN connector. It is the same as the AT connector shown later, except
that pin 3 is defined as a reset signal...</p>
<p><img src="images/IBM_PC_keyboard_connector_180.png"/><br>
<i>(from the IBM PC Technical Reference Manual, with correction!)</i><br><br></p>
<p><b>Terminal</b> keyboards usually have a 5 pin, 270 degree, DIN connector...<br>
<img src="images/kbd_connector_ibm3179_318x_319x.png"/></p>
<p>...or sometimes this 8P5C connector...<br>
<img src="images/kbd_connector_ibmterm.png"/></p>
<p><b>PC</b>, <b>XT</b> and <b>AT</b> keyboards use the same 5 pin, 180 degree, DIN connector and pinout,
while PS/2 keyboards use a 6 pin mini-DIN connector...<br>
<img src="images/kbd_connector_ps2.png"/></p>
<h3><a name="pullups">Pull-up resistors</a></h3>
<hr>
<p>In nearly all cases, these resistors are not needed.</p>
<p>But, if the keyboard has a very long cable (3m+), I recommend adding two pull-up resistors of 1Kohm -
one between Clock and +5V, the other between Data and +5V.
These can really help to clean up a dirty signal
(see <a href="http://geekhack.org/index.php?topic=14290.msg296052#msg296052">here</a>).</p>
<h3><a name="leds">LEDs</a></h3>
<hr>
<p>Optionally, lock LEDs can be wired up. Useful if your keyboard doesn't have them!<br>
The outputs are active high (each pin puts out +5V when it wants to light the LED).<br>
A resistor is needed inline with each LED. (The value needed depends on the type of LED,
1Kohm is a good starting point for modern high-brightness types).</p>
<p>Here's an example circuit for hooking up an LED, taken from
<a href="http://www.ladyada.net/learn/arduino/lesson3.html">ladyada.net</a>:<br>
<img src="images/LED_circuit.jpg"/><br>
They also have a more <a href="http://www.ladyada.net/learn/arduino/LEDs.html">in-depth tutorial</a>.</p>
<br>
<p>The pins used differ between CPUs.</p>
<p>ATMEGA32U4 (Teensy 2.0) and ATMEGA16U4:</p>
<table>
<tr><th>LED</th><th>CPU Pin</th></tr>
<tr><td>CapsLock</td><td>PF5</td></tr>
<tr><td>NumLock</td><td>PF6</td></tr>
<tr><td>ScrollLock</td><td>PF7</td></tr>
</table>
<p>AT90USB1286 (Teensy++ 2.0) and AT90USB646:</p>
<table>
<tr><th>LED</th><th>CPU Pin</th></tr>
<tr><td>CapsLock</td><td>PD3</td></tr>
<tr><td>NumLock</td><td>PD4</td></tr>
<tr><td>ScrollLock</td><td>PD5</td></tr>
</table>
<h3><a name="aux_inputs">Auxiliary Key Inputs</a> <span class="versioninfo">v1.1+</span></h3>
<hr>
<p>Five inputs are provided for auxiliary keys, buttons, or footswitches, which generate codes that can be remapped in your config:</p>
<table>
<tr><th>Auxiliary Key</th><th>Code</th><th>CPU Pin</th></tr>
<tr><td>1</td><td>AUX1</td><td>PB0</td></tr>
<tr><td>2</td><td>AUX2</td><td>PB1</td></tr>
<tr><td>3</td><td>AUX3</td><td>PB2</td></tr>
<tr><td>4</td><td>AUX4</td><td>PB3</td></tr>
<tr><td>5</td><td>AUX5</td><td>PB4</td></tr>
</table>
<p>Inputs cause key presses when grounded, so you can simply connect the switch between the pin and ground:</p>
<p><img src="images/aux_switch.png"></p>
<p>Inputs have the internal pull-up enabled, so an external resistor won't be required in most cases. But
it might be necessary to use one, for example with footswitches where the wires are long. Here's how
you would wire one up:<p>
<p><img src="images/aux_switch_with_pullup.png"></p>
<h3><a name="conn_summary">Connection Summary for Teensy</a></h3>
<hr>
<p>The GND and Vcc pins at the end of the Teensy can be used instead of the marked GND and Vcc, if you prefer.
Or you might choose to wire the connector to one GND and the LEDs using the other.</p>
<p>Of course, not all connections are required! The minimum, and still fairly typical, setup would be to connect
just Ground, +5V, Data and Clock to the connector (or keyboard).</p>
<h4>Teensy 2.0</h4>
<p><img src="images/connections_teensy2.png"></p
<h4>Teensy++ 2.0</h4>
<p><img src="images/connections_teensy++2.png"></p>
<hr>
</body></html>

17
docs/headermenu.js Normal file
View File

@ -0,0 +1,17 @@
function navtabfn(current)
{
document.write("<div id=\"header\"><h1>XT/AT/PS2/Terminal to USB Converter with NKRO</h1></div>");
document.write("<div id=menu class=\"navtabs\"><ul class=\"navtabs\">");
var titles = new Array("Intro", "Hardware", "Firmware", "Config", "QuickRef", "Tools", "Codes", "Trouble", "GH", "DT", "History");
var pages = new Array("index.html", "hardware.html", "firmware.html", "config.html", "configquickref.html", "tools.html", "codes.html", "trouble.html", "GH.html", "DT.html", "history.html");
for ( i = 0; i < titles.length; i++ ) {
document.write("<li class=\"navtabs\">");
if ( current == titles[i] ) { document.write("<p class=\"navtabs\">" + titles[i] + "</p>"); }
else { document.write("<a class=\"navtabs\" href=" + pages[i] + ">" + titles[i] + "</a>"); }
document.write("</li>");
}
document.write("</ul></div>");
}

98
docs/history.html Normal file
View File

@ -0,0 +1,98 @@
<html>
<head>
<link rel="stylesheet" type="text/css" href="style1.css">
<title>XT/AT/PS2/Terminal to USB Converter with NKRO - History</title>
</head>
<body>
<script type="text/javascript" src="headermenu.js"></script>
<script type="text/javascript">navtabfn("History")</script>
<noscript><div id=jswarn class=\"navtabs\">These docs work best with Javascript enabled!</div></noscript>
<h2>Release History</h2>
<hr>
<p><b>v1.10</b><br>
<ul>
<li>Added support for 'almost' PC/XT protocol keyboards, e.g. Leading Edge DC-2014.</li>
<li>Added Keyboard Reset output (required by some PC/XT keyboards).</li>
<li>Added five auxiliary key inputs (for extra keys, buttons, or footswitches).</li>
<li>Updated and expanded documentation generally, and added GH and DT Thread Contents pages and History page.</li>
<li>Fixed error LED timeout so it now stays on for 3 seconds after an error instead of flickering.</li>
</ul>
</p>
<p><b>v1.03</b><br>
<ul>
<li>Fixed bug which caused the converter to lose config or reboot after using the scrd tool.</li>
<li>Fixed minor USB errors revealed by using the Command Verifier compliance testing tool.</li>
</ul>
</p>
<p><b>v1.02</b><br>
<ul>
<li>Fixed bug which could cause the converter to lock up if a key was pressed at certain times during system boot - <a href="http://geekhack.org/index.php?topic=17458.msg609833#msg609833">details</a>.</li>
</ul>
</p>
<p><b>v1.01</b><br>
<ul>
<li>Fixed bug in jump to bootloader affecting Teensy++ - <a href="http://geekhack.org/index.php?topic=17458.msg604863#msg604863">details</a>.</li>
</ul>
</p>
<p><b>v1.0</b> - <a href="http://geekhack.org/index.php?topic=17458.msg579614#msg579614">details</a><br>
<ul>
<li>Added jump to bootloader function, triggered by a macro or a command line tool</li>
<li>Added scboot tool to jump to bootloader.</li>
<li>Added scinfo tool to display version and memory use.</li>
<li>Added tools built for Linux and Mac OS-X.</li>
<li>Improved reliability of the settings protocol.</li>
<li>Reduced memory use when not using onbreak macros and/or not using layers.</li>
<li>Reduced hex size, allowing use of CPUs with only 16kB of flash.</li>
<li>Added documentation.</a>
</ul>
</p>
<p><b>v0.997</b><br>
<ul>
<li>Added user-definable remaps, macros, layers, selects, media keys, and config tools - <a href="http://geekhack.org/index.php?topic=17458.msg527414#msg527414">details</a>.</li>
</ul>
</p>
<p><b>v0.996</b><br>
<ul>
<li>Fixed 'slow' responding keyboards.</li>
<li>Improved robustness when keys are being pressed before init has completed.</li>
<li>Added alternative layouts for terminal keyboards - <a href="http://geekhack.org/index.php?topic=17458.msg424335#msg424335">details</a>.</li>
</ul>
</p>
<p><b>v0.995</b><br>
<ul>
<li>Fixed missing 122-key mapping (top right numpad key is 'pause').</li>
<li>Simplified the code testing which keyboard type is attached.</li>
</ul>
</p>
<p><b>v0.994</b><br>
<ul>
<li>Added suspend support, with remote wake-up - <a href="http://geekhack.org/index.php?topic=17458.msg345109#msg345109">details</a>.</li>
</ul>
</p>
<p><b>v0.992</b><br>
<ul>
<li>Fixed minor incompatibility with Linux (backslash key not repeating etc.) - <a href="http://geekhack.org/index.php?topic=17458.msg339706#msg339706">details</a>.</li>
</ul>
</p>
<p><b>v0.99</b><br>
<ul>
<li>First public release</li
</ul
</p>
<hr>
</body></html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

BIN
docs/images/LED_circuit.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

BIN
docs/images/aux_switch.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

BIN
docs/images/bullet.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 181 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 202 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 194 KiB

BIN
docs/images/dataflow.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

70
docs/index.html Normal file
View File

@ -0,0 +1,70 @@
<html>
<head>
<link rel="stylesheet" type="text/css" href="style1.css">
<title>XT/AT/PS2/Terminal to USB Converter with NKRO</title>
</head>
<body>
<script type="text/javascript" src="headermenu.js"></script>
<script type="text/javascript">navtabfn("Intro")</script>
<noscript><div id=jswarn class=\"navtabs\">These docs work best with Javascript enabled!</div></noscript>
<h2>Introduction</h2>
<hr>
<p>A Teensy-based project to adapt XT, AT, PS/2 and some 122-key terminal keyboards to USB, also known simply as "Soarer's Converter".</p>
<h2>Features</h2>
<hr>
<p>Keyboard protocols supported:</p>
<ul>
<li>PC/XT (scan code set 1)
<li>AT (scan code set 2)
<li>PS/2 (MF2) (extended scan code set 2)
<li>Terminal e.g. 3179/318x/319x (scan code set 3)
</ul>
<p>Configurable Features: <span class="versioninfo">v0.997+</span></p>
<ul>
<li>Remapping
<li>Layers
<li>Macros
<li>On-the fly Config Selection
</ul>
<p>Other Features:</p>
<ul>
<li>Full NKRO, if the keyboard supports it (even on Macs!)
<li>Boot mode support (even with faulty BIOS!)
<li>Auto-detection of the keyboard type
<li>XT and AT boards are remapped correctly for PrtSc etc.
<li>1000Hz polling using Full Speed USB
<li>Media and Power key support
<li>Jump to bootloader function (update firmware without pressing the reset button) <span class="versioninfo">v1.0+</span>
<li>Support for 'almost' PC/XT protocol keyboards, e.g. Leading Edge DC-2014 <span class="versioninfo">v1.1+</span>
<li>Keyboard Reset output (required by some PC/XT keyboards) <span class="versioninfo">v1.1+</span>
<li>Five auxiliary key inputs (for extra keys, buttons, or footswitches) <span class="versioninfo">v1.1+</span>
</ul>
<h2>Award!</h2>
<hr>
<p><a href="http://deskthority.net/deskthority-awards-2012-f34/best-input-device-mod-2012-t4632.html"><img src="images/DT_best_input_device_mod_2012.png"/></a></p>
<h2>Origins</h2>
<hr>
<p>Way back in 2010, a Teensy landed on my doormat.</p>
<p>My goal then was simply "<a href="http://geekhack.org/showthread.php?10629-What-did-you-get-in-the-mail-today&p=247450&viewfull=1#post247450">to make a USB adapter for my AT model F</a>".</p>
<p>Why? I had modified the keyboard, and existing PS/2 to USB adapters didn't support the unusual codes created by the extra key positions.</p>
<p>A few months later, the first release was made available on geekhack, in my <a href="http://geekhack.org/index.php?topic=17458.0">project thread</a>.</p>
<p>On the release of v1.0, I also made it available <a href="http://deskthority.net/workshop-f7/xt-at-ps2-terminal-to-usb-converter-with-nkro-t2510.html">on Deskthority</a>.</p>
<p>I guess I got a little carried away :-)</p>
<hr>
</body></html>

204
docs/style1.css Normal file
View File

@ -0,0 +1,204 @@
body
{
font-size:12px;
#font-family:"lucida calligraphy",arial,'sans serif';
font-family: Verdana;
background-color:white;
color:black;
margin:10px;
}
h1 {font-size:175%; margin:0; padding:4px;}
h2 {font-size:140%; margin-top:24px; margin-bottom:0px;}
h3 {font-size:120%;font-style:italic; margin-bottom:0px;}
h4 {font-size:100%; margin-bottom:0px;}
h5 {font-size:100%; font-style:italic;}
/*pre {font-size:125%;}*/
th {background-color:#f8f8f8;}
#td { margin:0px; padding:0px; }
table
{
font-family: Verdana;
font-weight: normal;
font-size: 11px;
color: #404040;
#width: 320px;
#background-color: #fafafa;
border: 1px #404040 solid;
border-collapse: collapse;
border-spacing: 0px;
margin-top: 0px;
}
table th
{
border-left: 1px dotted #404040;
border-bottom: 1px solid #404040;
background-color: #f8f8f8;
text-align: center;
font-family: Verdana;
font-weight: bold;
font-size: 11px;
#color: #404040;
}
#td
#{
#border-left: 1px dotted #CEDCEA;
#border-bottom: 1px dotted #6699CC;
#}
table td
{
border-left: 1px dotted #E0E0E0;
border-bottom: 1px dotted #E0E0E0;
font-family: Verdana, sans-serif, Arial;
font-weight: normal;
font-size: 11px;
#color: #404040;
#background-color: white;
text-align: left;
padding-left: 5px;
padding-right: 30px;
}
.caution
{
background-color: #FFFFA0;
}
p.breakhere {page-break-after: always}
pre
{
background-color: #F8F8F8;
display: block;
padding: 0.5em 1em;
border: 1px solid #e0e0e0;
}
#header { width:100%; color:#FFFFFF; background-color:#800000; }
#header { width:100%; color:black; background-color:white; }
#menu { width:100%; background-color:green; }
#jswarn { font-weight:bold; width:100%; padding:4px; padding-left:8px; background-color:red; }
div.menubar
{
top: 0;
position: fixed;
}
div.content
{
top: 30;
position: fixed;
}
#contentslist { }
#contentslist ul { list-style-image: url("images/bullet.png"); margin-left: 0; padding-left: 2em; }
/*#contentslist ul li { line-height:130%; }*/
#contentslist ul li a:link {text-decoration: none}
#contentslist ul li a:visited {text-decoration: none}
#contentslist ul li a:active {text-decoration: none}
#contentslist ul li a:hover {text-decoration: underline; color: green;}
ul.navtabs
{
list-style-type:none;
margin:0;
padding:0;
overflow:hidden;
}
li.navtabs
{
float:left;
}
a.navtabs:link,a.navtabs:visited
{
display:block;
/*width:125px;*/
font-weight:bold;
color:black;
background-color:green;
text-align:center;
padding:4px;
padding-left:8px;
padding-right:8px;
text-decoration:none;
/*text-transform:uppercase;*/
}
a.navtabs:hover,a.navtabs:active
{
background-color:#00FF00;
}
p.navtabs
{
display:block;
/*width:125px;*/
font-weight:bold;
color:black;
background-color:#00C000;
text-align:center;
padding:4px;
padding-left:8px;
padding-right:8px;
margin:0px;
text-decoration:none;
/*text-transform:uppercase;*/
}
span.versioninfo
{
font-size:10px;
color:black;
background-color:#60C060;
padding:0px;
padding-left:2px;
padding-right:2px;
margin:0px;
text-decoration:none;
font-style:italic;
font-weight:bold;
}
span.todo
{
color:black;
background-color:#F0A0A0;
padding:0px;
padding-left:20px;
padding-right:20px;
margin:0px;
text-decoration:none;
font-style:italic;
}
@media print {
a {
text-decoration:none;
color:black;
}
#menu { display:none; }
span.versioninfo
{
font-size:10px;
color:black;
background-color:#F8F8F8;
padding:0px;
padding-left:2px;
padding-right:2px;
margin:0px;
text-decoration:none;
font-style:italic;
font-weight:bold;
}
}

6
docs/style2.css Normal file
View File

@ -0,0 +1,6 @@
@import url("style1.css");
table td
{
padding-right: 5px;
}

225
docs/tools.html Normal file
View File

@ -0,0 +1,225 @@
<html>
<head>
<link rel="stylesheet" type="text/css" href="style1.css">
<title>XT/AT/PS2/Terminal to USB Converter with NKRO - Tools</title>
</head>
<body>
<script type="text/javascript" src="headermenu.js"></script>
<script type="text/javascript">navtabfn("Tools")</script>
<noscript><div id=jswarn class=\"navtabs\">These docs work best with Javascript enabled!</div></noscript>
<h2>Command Line Tools <span class="versioninfo">v0.997+</span></h2>
<hr>
<div id="contentslist">
<ul>
<li><a href="#intro">Introduction</a></li>
<li><a href="#tools">Tools</a></li>
<ul>
<li><a href="#scas">scas</a></li>
<li><a href="#scdis">scdis</a></li>
<li><a href="#scwr">scwr</a></li>
<li><a href="#scrd">scrd</a></li>
<li><a href="#scboot">scboot</a></li>
<li><a href="#scinfo">scinfo</a></li>
<li><a href="#scaswr">scaswr</a></li>
</ul>
<li><a href="#building">Building</a></li>
<ul>
<li><a href="#windows">Windows</a></li>
<li><a href="#linux">Linux</a></li>
<li><a href="#mac">Mac OS-X</a></li>
</ul>
</ul>
</div>
<h3><a name="intro">Introduction</a></h3>
<hr>
<p>The main tools are <a href=#scas>scas</a> and <a href=#scwr>scwr</a>.</p>
<p>Typically, you edit your config file(s), assemble them with <a href=#scas>scas</a>,
then load them onto the converter with <a href=#scwr>scwr</a>.</p>
<p>As long as it says 'device: complete' at the end, <a href=#scwr>scwr</a> has succeeded.</p>
<pre><code>C:\sctools&gt; scas foo.sc foo.scb
No errors. Wrote: foo.scb
C:\sctools&gt; scwr foo.scb
Looking for Soarer's Converter: found
...
device: complete
</code></pre>
<p>On Windows, you may find <a href=#scaswr>scaswr</a> more convenient. It simply combines the two steps.</p>
<h3><a name="tools">Tools</a></h3>
<hr>
<p>
<table>
<tr><th>Tool</th><th>Description</th></tr>
<tr><td><a href=#scas>scas</a></td><td>Assembles one or more config text files to a config binary file</td></tr>
<tr><td><a href=#scdis>scdis</a></td><td>Dissassembles a config binary file to a config text file</td></tr>
<tr><td><a href=#scwr>scwr</a></td><td>Writes a config binary file to the converter</td></tr>
<tr><td><a href=#scrd>scrd</a></td><td>Reads a config binary file from the converter</td></tr>
<tr><td><a href=#scboot>scboot</a></td><td>Causes the converter to jump to the bootloader <span class="versioninfo">v1.0+</span></td></tr>
<tr><td><a href=#scinfo>scinfo</a></td><td>Displays converter's version and memory information <span class="versioninfo">v1.0+</span></td></tr>
<tr><td><a href=#scaswr>scaswr</a></td><td>Combination of scas and scwr (Windows only) <span class="versioninfo">v1.1+</span></td></tr>
</table>
</p>
<h4><a name=scas>scas</a></h4>
<hr>
<p>Assembles one or more config text files to a config binary file.</p>
<p>Usage:</p>
<pre><code>scas &lt;text_config&gt; [&lt;text_config&gt; ...] &lt;binary_config&gt;</code></pre>
<p>Output, if everything is fine:</p>
<pre><code>No errors. Wrote: foo.scb</code></pre>
<p>Output, if there's an error:</p>
<pre><code>error at line 4: invalid argument</code></pre>
<p>Output, if there's an error in an included file in an included file:</p>
<pre><code>error at line 4: error at line 5: error at line 5: invalid argument</code></pre>
<p>To find the error, start with the last line number given, which will be an include command.<br/>
Then look in that file for the next to last line number given, and so on.<br/>
The first line number given is where the actual error is.</p>
<p>Only the first error found is reported.</p>
<p>Alternatively, check that included files assemble successfully on their own, before including into another config.</p>
<h4><a name=scdis>scdis</a></h4>
<hr>
<p>Dissassembles a config binary file to a config text file.</p>
<p>Usage:</p>
<pre><code>scdis &lt;binary_config&gt; [&lt;text_config&gt;]</code></pre>
<p>There is no output unless an error occurs.</p>
<p>This tool might be useful to validate that your config assembles as you expected (it was very useful while I was writing scas).</p>
<h4><a name=scwr>scwr</a></h4>
<hr>
<p>Writes a config binary file to the converter.</p>
<p>Usage:</p>
<pre><code>scwr &lt;binary_config&gt;
</code></pre>
<p>Output:</p>
<pre><code>scwr: looking for Soarer's Converter: found
scwr: reading file: 139 bytes: ok
scwr: sending info request: ok
device: ok
protocol version check: converter=1.00, scwr=1.00: ok
settings version check: converter=1.01, file=1.01: ok
settings length check: max=1018, file=137 bytes: ok
scwr: sending write request for 137 bytes: ok
device: ok
device: ready
scwr: sending 60 bytes: ok
device: ok
device: ready
scwr: sending 60 bytes: ok
device: ok
device: ready
scwr: sending 17 bytes: ok
device: ok
device: complete
</code></pre>
<h4><a name=scrd>scrd</a></h4>
<hr>
<p>Reads a config binary file from the converter.</p>
<p>Usage:</p>
<pre><code>scrd &lt;binary_config&gt;
</code></pre>
<p>Output:</p>
<pre><code>scrd: looking for Soarer's Converter: found
scrd: sending read request: ok
device: has 137 bytes: ok
scrd: ready
device: sent 64 bytes: ok
scrd: ok
scrd: ready
device: sent 64 bytes: ok
scrd: ok
scrd: ready
device: sent 9 bytes: ok
scrd: ok
scrd: complete
scrd: writing file: 139 bytes: ok
</code></pre>
<h4><a name=scboot>scboot</a> <span class="versioninfo">v1.0+</span></h4>
<hr>
<p>Causes the converter to jump to the bootloader.</p>
<p>Usage:</p>
<pre><code>scboot
</code></pre>
<p>After running this command, the converter should be ready to have new firmware loaded into it.
Note that, at this point, the converter will not be working as a keyboard any more!
To cancel the bootloader mode, simply disconnect the converter from the computer and reconnect it.</p>
<p>Output:</p>
<pre><code>scboot: looking for Soarer's Converter: found
scboot: sending boot request: ok
device: ok
</code></pre>
<h4><a name=scinfo>scinfo</a> <span class="versioninfo">v1.0+</span></h4>
<hr>
<p>Displays converter's version and memory information.</p>
<p>Usage:</p>
<pre><code>scinfo
</code></pre>
<p>Output:</p>
<pre><code>Code Version: v1.00
Max Settings Version: v1.01
Current Settings Version: v1.01
SRAM Size: 2560 bytes
SRAM Free: 1817 bytes
EEPROM Size: 1024 bytes
EEPROM Free: 883 bytes
</code></pre>
<h4><a name=scaswr>scaswr.bat (Windows only)</a> <span class="versioninfo">v1.1+</span></h4>
<hr>
<p>A combination of scas and scwr, designed so you can simply drag'n'drop a config file onto it (or a shortcut to it).
It will assemble the text config and then write the resulting binary config to the converter, in a single step.</p>
<p>Of course, it can also be used from the command line...</p>
<p>Usage:</p>
<pre><code>scaswr &lt;text_config&gt;
</code></pre>
<h3><a name="building">Building</a></h3>
<hr>
<p>Source code is provided, along with makefiles etc., to natively build on Windows, Linux and OS-X.<br/>
Additionally, a mingw32 cross-compile can be used to build the Windows tools on Linux.</p>
<p>To rebuild the tools, change directory to the sub-directory of build that's right for your OS, and type make.</p>
<h4><a name="windows">Windows</a></h4>
<hr>
<p>The tools are built for Windows using MS Visual Studio 2003. Porting to later versions should be trivial.</p>
<p>scwr, scrd, scboot and scinfo rely on a small library of <a href="http://www.pjrc.com/teensy/rawhid.html">RAWHID routines from PJRC</a>.<br/>
For Windows, this library was compiled to a DLL using the <a href="http://download.microsoft.com/download/9/0/f/90f019ac-8243-48d3-91cf-81fc4093ecfd/1830_usa_ddk.iso">Microsoft DDK</a>.</p>
<h4><a name="linux">Linux</a> <span class="versioninfo">v1.0+</span></h4>
<hr>
<p>The tools are built for Linux using gcc etc.</p>
<h4><a name="mac">Mac OS-X</a> <span class="versioninfo">v1.0+</span></h4>
<hr>
<p>The tools are built for Mac OS-X on Snow Leopard using Xcode 3.2.6 and the version 10.6 SDK.</p>
<hr>
</body></html>

110
docs/trouble.html Normal file
View File

@ -0,0 +1,110 @@
<html>
<head>
<link rel="stylesheet" type="text/css" href="style1.css">
<title>XT/AT/PS2/Terminal to USB Converter with NKRO - Troubleshooting</title>
</head>
<body>
<script type="text/javascript" src="headermenu.js"></script>
<script type="text/javascript">navtabfn("Trouble")</script>
<noscript><div id=jswarn class=\"navtabs\">These docs work best with Javascript enabled!</div></noscript>
<h2><a name="Troubleshooting">Troubleshooting</a></h2>
<hr>
<div id="contentslist">
<ul>
<li><a href="#diag">Diagnostic Output</a></li>
<li><a href="#sctrace">Simple Logic Analyzer</a></li>
<li><a href="#kbid">Keyboard IDs</a></li>
<li><a href="#issues">Known Issues</a></li>
</ul>
</div>
<h3><a name="diag">Diagnostic Output</a></h3>
<hr>
<p>The converter outputs some cryptic diagnostic information when in use -
it's especially useful to see what is happening when it starts up.</p>
<p>The <a href="http://www.pjrc.com/teensy/hid_listen.html">hid_listen</a>
program (from <a href="http://www.pjrc.com/">PJRC</a>) can display this output,
which mostly just consists of bytes read from and written to the keyboard when
things are working correctly.</p>
<p>Most of the output takes the form of a prefix code, followed by a hex value, followed by a space. For example, 'r4A '.</p>
<p>Prefixes used:</p>
<p>
<table>
<tr><th>Prefix</th><th>Description</th></tr>
<tr><td>r</td><td>byte read from keyboard</td></tr>
<tr><td>w</td><td>byte written to keyboard</td></tr>
<tr><td>R</td><td>read error</td></tr>
<tr><td>W</td><td>write error</td></tr>
<tr><td>+</td><td>HID code output from first translation stage (for key-press)</td></tr>
<tr><td>-</td><td>HID code output from first translation stage (for key-release)</td></tr>
<tr><td>d</td><td>HID code output (for key-press) <span class="versioninfo">v1.03+</span></td></tr>
<tr><td>u</td><td>HID code output (for key-release) <span class="versioninfo">v1.03+</span></td></tr>
</table>
</p>
<p>Error codes:</p>
<p>
<table>
<tr><th>Code</th><th>Error</th><th>Description</th></tr>
<tr><td>R03</td><td>unknown</td><td>something bad happened!</td></tr>
<tr><td>R04</td><td>clock</td><td>missed one edge of the clock signal, usually because of a short spike</td></tr>
<tr><td>R05</td><td>timeout</td><td>started receiving clock from the board, but didn't receive enough for a full code</td></tr>
<tr><td>R06</td><td>start bit</td><td>read a start bit, but it was incorrect</td></tr>
<tr><td>R07</td><td>parity bit</td><td>failed to correctly read a parity bit</td></tr>
<tr><td>R08</td><td>stop bit</td><td>failed to correctly read a stop bit</td></tr>
<tr><td>W005</td><td>timeout</td><td>timeout while writing a command to the keyboard</td></tr>
<tr><td>W105</td><td>timeout</td><td>timeout while writing the first byte of a 2-byte command</td></tr>
<tr><td>W205</td><td>timeout</td><td>timeout while writing the second byte of a 2-byte command</td></tr>
</table>
</p>
<p>Usually, if you get error codes right after building your converter, it's because the wiring is incorrect.
One fairly common error is to read the socket pinout diagrams backwards -
they are drawn looking at the <i>front</i> of the socket, not the back.</p>
<h3><a name="sctrace">Simple Logic Analyzer</a></h3>
<hr>
<p>As a side-project, I've posted a <a href="http://deskthority.net/workshop-f7/simple-logic-analyzer-for-teensy-t4567.html">
Simple Logic Analyzer</a> on Deskthority. This can help to diagnose wiring problems or incompatibilities quickly and simply,
whereas before you might've had to resort to trial and error, risking damage to the Teensy in the process.</p>
<h3><a name="kbid">Keyboard IDs</a></h3>
<hr>
<p>
This section is mostly only relevant to terminal keyboards. The converter uses the ID to decide between using scan code set 3 for terminal keyboards, or extended scan code set 2 for 'regular' keyboards.
<p>
By using hid_listen, you can see what ID your keyboard has by looking at the two bytes read back after the get ID command (wF2 rFA).
<p>
The ID and scan code set selected are also printed in a more readable way: <span class="versioninfo">v0.996+</span>
</p>
<pre><code>Keyboard ID: BFBF
Code Set: 3</code></pre>
<p>
Terminal keyboards often have DIP switches on the back panel, or alternatively a pin header on the PCB that you can fit jumpers to, which configure the keyboard's ID code. The ID is a 16-bit number, but commonly fewer than 16 switches/jumpers are fitted meaning it's not possible to select all of the bits. The default value with no jumpers fitted, or with all the DIP switches in the 'open' position, is BFBF.
<p>
If your terminal keyboard is not operating correctly, it might be because the wrong ID is set on the switches/jumpers. The first byte should <b><i>not </i></b>be AB.
<h3><a name="issues">Known Issues</a></h3>
<hr>
<ul>
<li><a href="http://geekhack.org/showwiki.php?title=Island:17458&p=362823&viewfull=1#post362823">Weirdo Monterey International Corp. FKF456K-104 AT keyboard with 3-way A,X,S switch on the back</a>.<br/>
Outputs a very asymmetric clock signal, which is too fast for the converter to track both edges of.<br/>
<b>Update</b>: this should be fixed now, but hasn't been verified. <span class="versioninfo">v1.1+</span><br/><br/>
</li>
<li><a href="http://geekhack.org/showwiki.php?title=Island:17458&p=563473&viewfull=1#post563473">Dell M6300 (BIOS rev A14) and Dell Inspiron 630m</a><br/>
Converter does not work with the BIOS on these machines at boot time. Presuming BIOS defect.
</li>
</ul>
<hr>
</body></html>

View File

@ -0,0 +1,908 @@
:1000000008C3000024C300000C941E0920C3000094
:100010001EC300001CC300001AC3000018C3000068
:1000200016C3000014C300000C948E0D0C94BC0E7B
:100030000EC300000CC300000AC3000008C3000088
:1000400006C300000C94620902C3000000C3000054
:10005000FEC200000C94DB0AFAC20000F8C20000E5
:10006000F6C20000F4C20000F2C20000F0C20000BC
:10007000EEC20000ECC200000C94D614E8C20000EE
:10008000C3C50000E4C20000E2C20000E0C20000FC
:10009000DEC20000DCC2000000291E1F2021222336
:1000A000242526272D2E2A2B141A0815171C180C68
:1000B00012132F3028E0041607090A0B0D0E0F3318
:1000C0003435E1311D1B0619051110363738E55559
:1000D000E22C393A3B3C3D3E3F4041424353475F6F
:1000E0006061565C5D5E57595A5B6263C2BE644490
:1000F0004567B0B28CB7B8B9BABBBCBD68696A6BAA
:100100006C6D6E6F707172C188B1B387B4B5739343
:10011000928ABF8BB68985C00142003E3C3A3B457E
:100120006843413F3D2B356769E2E188E0141EB02A
:100130006AB11D16041A1FB26B061B070821208C1A
:100140006C2C1909171522B76D11050B0A1C23B861
:100150006EB3100D182425B96F360E0C122726BA6F
:100160007037380F33132DBB718734B42F2EBC7208
:1001700039E52830B531BD73BE6493928ABF2A8BAE
:10018000B659895C5F85C0C162635A5D5E60295360
:1001900044575B565561470000000040C200000014
:1001A00000000000000000000000000000F9E60070
:1001B00000E4E90000FF000000000000E3FEF000A2
:1001C000EC000000E7FD0000F700000065FC00EF18
:1001D00000EB000066FB00FAEA000000A9F800004E
:1001E0000000000000F600540000E80000F50000E8
:1001F0000000000000000058000000AA00000000FD
:100200000000000000004D00504A000000494C5121
:10021000004F52000000004E00464B4801BF00BB9B
:10022000B9B7B83A68C0BEBCBA2B353B69E0E164E7
:1002300039141E3C6AE21D16041A1F3D6B061B078B
:100240000821203E6C2C19091715223F6D11050B52
:100250000A1C23406EE6100D182425416F360E0C43
:10026000122726427037380F33132D4371873432EB
:100270002F2E4472E4E52830318945735150935252
:100280004C4D2A49B6594F5C5F4E4A4B62635A5DEA
:100290005E602953B2575B5655614700000000BDB0
:1002A000C20A4D6F64653A2041542F5053320A0AF6
:1002B000000A4D6F64653A2050432F58540A0A00D3
:1002C000756E6B6E6F776E00322028657874656E80
:1002D0006465642900436F6465205365743A2000A7
:1002E0004B6579626F6172642049443A20000001D5
:1002F0000000580312000200006A0374002200008C
:10030000DE0312002100007C030900220100F0033B
:100310001500210100950309002202000504DC00FC
:10032000210200AE030900220300E1041C002103A6
:1003300000C7030900030000FD04040103090401D0
:10034000050E0203090411053801C10601C1260189
:10035000C12601C13601C036120100020000002092
:10036000C0167D04000101020001090274000401AD
:1003700000A032090400000103010100092111015C
:100380000001221200070581030800010904010091
:1003900001030000000921110100012215000705D9
:1003A0008303200001090402000103000000092169
:1003B0001101000122DC0007058203170001090476
:1003C00003000203000000092111010001221C00AA
:1003D00007058403400002070505034000080501E6
:1003E0000906A101150026FF00950875088103C0C4
:1003F0000631FF0974A1537508150026FF009520EA
:1004000009758102C005010906A1018501750195E3
:1004100008050719E029E7150025018102950575F2
:1004200001050819012905910295017503910375CC
:100430000195310507190129311500250181029522
:1004400001750181037501956905071933299B150C
:10045000002501810295017501810375019508054B
:1004600007199D29A41500250181029504750181B4
:1004700003C005010980A101850275019503198159
:100480002983150025018102950575018103C005A9
:100490000C0901A10185037501951809B509B60973
:1004A000B709CD09E209E509E709E909EA0A5201B4
:1004B0000A53010A54010A55010A83010A8A010AF2
:1004C00092010A94010A21020A23020A24020A253F
:1004D000020A26020A27020A2A02150025018102C1
:1004E000C00699FF0A6824A1017508150026FF00BF
:1004F000954009018102954009029102C004030957
:10050000040E0353006F006100720065007200006A
:1005100000380353006F006100720065007200270D
:1005200000730020004B006500790062006F0061DD
:100530000072006400200043006F006E00760065CA
:100540000072007400650072000000616C6C6F63E3
:10055000206F6B2E0A00616C6C6F63206661696CA2
:1005600065642E0A00616C6C6F63206661696C655E
:10057000642E0A00746F74616C5F6D6163726F73D7
:100580003A20006D61785F6C617965723A20006C89
:1005900061796572646566733A2000216170706CE0
:1005A000790A006C656E3C350A000A0A72656D6155
:1005B000696E696E673A20006572726F722000651D
:1005C00072726F7220006572726F7220002169640E
:1005D00020002173657420002173656C65637420AD
:1005E000006D6163726F73200072656D61707320BE
:1005F000006C6179657273200003010001010C0237
:10060000010104000005002007000006001008009A
:10061000000011241FBECFEFD0E2DEBFCDBF11E03E
:10062000A0E0B1E0E8E8F8E300E00BBF02C007900B
:100630000D92A032B107D9F713E0A0E2B1E001C0FA
:100640001D92AB3AB107E1F7AAD00C94421CD8CC6A
:1006500090910001923021F1933018F4913041F5DE
:1006600005C0933059F0943019F510C087FD20C0B3
:10067000E82FF0E0E856FF4F849108958538C0F4E4
:10068000E82FF0E0E45EFD4F84910895662341F089
:100690008F3770F4E82FF0E0E356FE4F8491089511
:1006A000853830F4E82FF0E0E85EFE4F849108953D
:1006B00080E008950E94451A0E944F1A109222016C
:1006C000109223011092240108951F93182F0E9465
:1006D0003E1A212F30E0882371F08AB188638AB9ED
:1006E0009BB143E0220F331F4A95E1F7822F8873B5
:1006F000977C892B0DC09AB183E0220F331F8A9516
:10070000E1F7822F8873977C892B8AB98BB1886334
:100710008BB91F9108959CDF0C94521A99DF0C94A9
:10072000711ACF92DF92EF92FF920F931F93CF93A4
:10073000DF93ABD2082F80912601802739F1C0E0EA
:10074000D0E01BEAC82EDD24E02EFF24C6010C2ECB
:1007500002C0959587950A94E2F780FF10C0C70103
:100760000C2E02C0959587950A94E2F780FF04C08D
:10077000812F0E94521A03C0812F0E94711A219664
:100780001F5F103B19F70093260181E0DF91CF91A5
:100790001F910F91FF90EF90DF90CF9008952F92CF
:1007A0003F924F925F926F927F928F929F92AF9201
:1007B000BF92CF92DF92EF92FF920F931F93DF933E
:1007C000CF9300D00F92CDB7DEB780E88093610061
:1007D00010926100569A80E078DF87E076DFDDD600
:1007E0000E94411A5AD536D265DF80E076D2332492
:1007F000882499245524AA24BB24650114E0412EA1
:10080000B2E02B2E3320A1F42FB7F894809136015B
:1008100090913701A0913801B09139012FBF855FC8
:100820009140A040B04020F081E057D2332433946F
:10083000882009F0E5C02FB7F89480913601909197
:100840003701A0913801B09139012FBF895B9B40DE
:10085000A040B04008F4D4C00E94EC15982F9F70BF
:1008600099F082958F7059F490930001913019F4AA
:100870002092290161C081E0809329015DC08093AD
:1008800029019093000158C010920001109221019B
:10089000109220018EEE62E355D5823009F041C0FE
:1008A00082E3FBD581E080932901809100018823B8
:1008B00009F03CC082EF62E345D5182F8230B1F5D4
:1008C00082E3EBD58A3F91F5CE01029662E38BD5A8
:1008D000823021F5CE01039662E385D59A8182307C
:1008E000B1F49B3A31F48B81853819F040920001C4
:1008F00003C083E080930001792E66248B8190E011
:100900008629972990932101809320010FC040925E
:100910000001909320011092210108C01093000162
:1009200005C02092290181E080930001809100019F
:10093000882311F4409200016091200170912101FF
:10094000809100010E94BE150E94411780912901EB
:10095000823011F4F0D1F5D180910001833011F48F
:1009600088EFEED580E0B1DE8FB7F894A090360125
:10097000B0903701C0903801D09039018FBF8AE024
:100980000E9496118AE00E94961180EE92E00E94E9
:10099000B21180912001909121010E94AA118AE058
:1009A0000E94961185ED92E00E94B21180910001A3
:1009B000823061F0833018F4813089F405C08330CF
:1009C00049F0843061F408C081E301C082E30E94F1
:1009D000961109C083E3FBCF88EC92E002C080EC63
:1009E00092E00E94B21180912901823019F481EBCA
:1009F00092E002C081EA92E00E94B21188248394BE
:100A0000CE01019660E0EFD4882009F4DDC0823089
:100A100008F485C0823009F06DC019818091000111
:100A2000813069F41F3F09F44EC017FF05C0812FC4
:100A30008F7760E070DE64C0812F60E013C090911A
:100A40002401992309F1E92FF0E0EF5FFE4F808147
:100A5000181799F4E92FEF5FE0932401E33021F4B4
:100A60008EE761E05BDE4CC0E83009F049C08EE7FC
:100A700061E051DE1092240143C0933018F08EE7FC
:100A800061E049DE10922401103E91F0113E28F4FD
:100A90001123C9F01A3AE1F433C0103F29F01C3F8A
:100AA00079F0113EA9F408C081E08093220128C0AA
:100AB00081E08093230124C081E08093240120C041
:100AC00080E197E203C0F6DD88E893E160D518C0C5
:100AD00080912201882339F0812F609123011BDE50
:100AE0001092220104C0812F6091230117DE109221
:100AF000230106C08EEF62E325D49924939401C0AC
:100B000099248FB7F894A0903601B0903701C09027
:100B10003801D09039018FBF5524539471C0882378
:100B200009F06EC0992009F06BC00E943B1A182F83
:100B30000E943E1A082F079500270795012B8091E8
:100B40002501081709F45CC0FF24F394F022E02E7D
:100B5000E69421E0E222102F1695169511708091EF
:100B60002001909121016F2D70E02E2D30E0805BEF
:100B70009F4B41F4660F771F660F771F612B220F83
:100B8000331F07C0660F771F612B220F331F220F01
:100B9000331F622B8DEE9BD4FF0CFE28110F110F1B
:100BA000812F8F2992DD009325012AC08FB7F894F9
:100BB000A0903601B0903701C0903801D090390133
:100BC0008FBF5524539402C05520B9F02FB7F89425
:100BD0008091360190913701A0913801B09139018F
:100BE0002FBF8A199B09AC09BD09C397A105B1059F
:100BF00020F08AE00E94961155240E94F91702CE37
:100C000090DD882399F6E0CF1F920F920FB60F92D6
:100C100011248F939F9393B19F718091280198170E
:100C200029F0909328018AE08093090180910901BD
:100C3000882349F0815080930901882321F4809111
:100C40002801809327019F918F910F900FBE0F90E5
:100C50001F90189584B1807E84B985B18F6185B964
:100C6000E1E7F0E08081826080838AEF90E09093FA
:100C700099008093980010929000E1E9F0E088E0FC
:100C80008083808183608083089580912701089507
:100C90009C0180918100887F8093810080916F000A
:100CA0008D7F80936F00109285001092840082E007
:100CB00086BB2115310581F0220F331F3093890047
:100CC0002093880080916F00826080936F008091F4
:100CD00081008260809381000895882319F027980D
:100CE0002F9A08952F98279A0895882319F05098DD
:100CF000589A08955898509A0895382F4DB3E99806
:100D00000000882319F05198599A02C0519A5998B5
:100D100024E189B190E0969587958170831711F051
:100D20002150B9F782E08CBB41FF02C0E99A01C0B3
:100D3000E9988DB30895F894E99882E08CBB789493
:100D40000895F894E9E6F0E080818C608083E99A68
:100D500078940895882321F08091110180931201E5
:100D600089B190E096958795982F917080911201A6
:100D70008F3F21F481E08927809312018091120135
:100D8000813089F0813018F08E3FB9F419C0992371
:100D9000C9F08AE590E07CDF8EEF8093110181E05D
:100DA000809312010AC0992369F488EE93E070DF02
:100DB0008FEF809311011092120191E0892F089515
:100DC00092E001C094E08FEF80931201F7CF1F9360
:100DD00019B11170882321F080910A0180930B01D1
:100DE00080910B018230F1F0833020F4813009F0E2
:100DF0004BC006C0833079F18E3F09F045C03AC040
:100E00008EEF80930A0180EB94E042DF10922D0177
:100E100010922C01112311F416E02DC082E0809372
:100E20000B0132C017951127179580912C018695DB
:100E3000182B10932C0180912D018F5F80932D0131
:100E4000883011F513E010930A0188E790E020DF65
:100E500010930B0119C080E090E01ADF80912C0103
:100E600080932A0112E007C088EB9BE090D3109397
:100E70002B010AC015E080E090E00ADF81E080935A
:100E80000B01123089F7F3CF1F9108950F931F9331
:100E9000982F80910E018F3F19F482E080930E010C
:100EA000992321F080910D0180930E0180910E0114
:100EB000873009F460C0883088F4843009F43EC07B
:100EC000853030F48230E9F0833009F081C02CC0E5
:100ED0008530B1F1863009F07BC04BC08A3009F40F
:100EE0005FC08B3038F4883009F44FC0893009F086
:100EF0006FC04DC08B3009F457C08E3F09F068C0F9
:100F00005AC080912E0180932F0188E08093300198
:100F100081E080930C0183E080930D0188EC90E0E8
:100F2000B7DE80E0EADE54C080E0DFDE81E0E5DEAF
:100F30008EEF80930D0180E29EE4AADE85E031C051
:100F400010912F01012F0170802FCFDE1695109385
:100F50002F0180910C01802780930C01809130013A
:100F6000815080933001882311F084E01AC086E01C
:100F700018C087E016C080910C01B7DE8091300167
:100F800081508093300188E00CC089E00AC081E084
:100F9000ACDE809130018150809330018AE001C045
:100FA0008BE080930E0114C080E090E071DE4899E0
:100FB0002CC012E007C0109130011295107F15600F
:100FC000123030F081E091DE8FEF80930E0119C076
:100FD00089B120910E0130E02170307090E096953B
:100FE0008795817090702817390711F411E009C0B6
:100FF00081E07BDE8FEF80930E0188EB9BE0C7D210
:1010000014E0812F1F910F91089519E0DBCFFF921B
:101010000F931F93F9B099B1882329F08FEF809334
:10102000100115E07DC0809110018F3F19F481E01F
:1010300080931001092F0170109110011630E9F111
:10104000173040F41430D9F01530D8F4113009F0CD
:1010500050C008C01830D9F1183088F1193009F0A3
:1010600048C037C080EB94E013DE1092320110923A
:10107000310110930F01002309F057C01CC085E017
:1010800017C0902F97959927979580913101869554
:10109000982B9093310180910F01802780930F014D
:1010A000809132018F5F80933201883021F486E095
:1010B000809310011EC084E0FBCF87E0F9CF8091C0
:1010C0000F01801711F017E031C088E0F1CF89E0FF
:1010D000EFCF002349F08091310180932A0181E014
:1010E0008093290112E022C088EB9BE050D218E0E7
:1010F0001DC02091100130E0217030708F2D90E0E4
:1011000096958795817090702817390711F411E032
:1011100007C08FEF8093100188EB9BE038D214E07A
:10112000812F1F910F91FF90089516E080E090E0CD
:10113000AFDD8FEF80931001F3CFDF92EF92FF923C
:101140000F931F93082F8230F9F480912901823088
:1011500021F483E0809333016BC0809135018130AD
:1011600079F483E08093350180913301882319F06D
:1011700088EB9BE00CD281E08093330100E004C057
:1011800081E08093340154C0FF24F394A2E0DA2E6E
:10119000F3E0EF2E80913501813031F1813030F074
:1011A000823081F1833009F043C039C0802FD2DD15
:1011B000823008F43DC0823069F780913401882381
:1011C00079F01092340180913301882319F088EB73
:1011D0009BE0DDD1F0923301E092350100E0DACFFF
:1011E00081E08093350124C049991FC0809133016B
:1011F000882319F088EB9BE0CAD1F0922B01D092A2
:101200003501C8CF802F03DF182F823088F082305D
:1012100019F088EB9BE0BBD110932B0106C0802F07
:1012200035DE823028F08093330110923501B2CF41
:101230001F910F91FF90EF90DF9008951F920F92F2
:101240000FB60F920BB60F9211242F933F934F932B
:101250005F936F937F938F939F93AF93BF93EF931E
:10126000FF9380912901823019F480E0B0DD02C043
:1012700080E063DFFF91EF91BF91AF919F918F91DC
:101280007F916F915F914F913F912F910F900BBE86
:101290000F900FBE0F901F901895F89481E02DDDF0
:1012A00081E023DD1092800088E080938100E9E6F0
:1012B000F0E08081837F84608083E99A80E03DDF75
:1012C000789408951F920F920FB60F920BB60F925B
:1012D00011242F933F934F935F936F937F938F933B
:1012E0009F93AF93BF93EF93FF9380918100887F8B
:1012F0008093810080916F008D7F80936F0000004C
:10130000109285001092840082E086BB80912901B2
:10131000823019F481E05BDD02C081E00EDFFF91D5
:10132000EF91BF91AF919F918F917F916F915F915D
:101330004F913F912F910F900BBE0F900FBE0F90CA
:101340001F901895DF92EF92FF920F931F93182F23
:10135000D62E80912901823011F480E03EC087E7CB
:10136000E5D7812FEDD780E2E1D7F89410932E01D5
:101370001092330182E0E1DE78948FB7F894E09028
:101380003601F090370100913801109139018FBF7B
:101390004D2D50E060E070E018C0DD20B1F02FB7B7
:1013A000F8948091360190913701A0913801B09165
:1013B00039012FBF8E199F09A00BB10B4817590790
:1013C0006A077B0710F48AE008C0809133018230FD
:1013D00020F380913301109233011F910F91FF9000
:1013E000EF90DF900895DF92EF92FF920F931F939B
:1013F000CF93DF93EC018FB7F894E0903601F09033
:10140000370100913801109139018FBFD0902B0125
:101410006623C1F41FC02FB7F894809136019091D4
:101420003701A0913801B09139012FBF8E199F0962
:10143000A00BB10B481759076A077B0728F1D0901A
:101440002B0104C0462F50E060E070E081E08D1574
:1014500010F703C081E08D15B8F410912A011092A5
:101460002B0182E0D81651F482E760D7812F68D72C
:1014700080E25CD7209741F0188306C082E556D7FA
:101480008D2D5ED780E252D78D2DDF91CF911F91A8
:101490000F91FF90EF90DF9008951F93DF93CF930C
:1014A0000F92CDB7DEB7682FCE0101969CDF182FC3
:1014B000823039F0198282E539D781E337D7812F1D
:1014C0003FD789810F90CF91DF911F910895EF92BF
:1014D000FF920F931F93E82EF62E80912901823000
:1014E00049F103E08E2D62E32DDF182F8230D1F415
:1014F00082E3D3DF182F8A3F69F48F2D62E322DF66
:10150000182F823059F482E3C8DF182F8A3F11F474
:1015100081E011C081E20AD781E207C087E506D7E2
:1015200082E303C087E502D781E300D7812F08D784
:101530000150C1F680E01F910F91FF90EF90089548
:10154000FF920F931F93F82E809129018230D1F0E2
:1015500003E08F2D62E3F6DE182F823059F482E328
:101560009CDF182F8A3F11F481E00DC081E2DED6A6
:1015700081E203C087E5DAD680E3D8D6812FE0D6B2
:10158000015039F780E01F910F91FF9008959093DB
:101590003B0180933A015E9A0895EEE6F0E0808187
:1015A000826080838AEF87BD82E084BD15BC85B5EB
:1015B000836085BD08951F920F920FB60F920BB6F0
:1015C0000F9211242F933F934F935F936F937F93C9
:1015D0008F939F93AF93BF93EF93FF9380913601C7
:1015E00090913701A0913801B09139010196A11D68
:1015F000B11D8093360190933701A0933801B093C9
:10160000390180913A0190913B01009731F00197A7
:1016100090933B0180933A0101C05E9880913C0118
:10162000882341F481E080933C0178940E94DB1A86
:1016300010923C01FF91EF91BF91AF919F918F91DB
:101640007F916F915F914F913F912F910F900BBEC2
:101650000F900FBE0F901F9018952091150130919B
:1016600016012115310521F42DB73EB72052304027
:101670008091170190911801281B390BC901089519
:10168000AC0120911501309116012115310521F48D
:101690002DB73EB72052304080911701909118012C
:1016A000281B390B2417350718F420E030E007C059
:1016B000480F591F50931801409317019C01C9010D
:1016C00008958BEA93E09093180180931701089591
:1016D0001092490110924A0110924B0110924C0154
:1016E00010924D0110924E01E2E5F1E0119281E07D
:1016F000ED36F807D9F7109240018FE00895E8DF42
:1017000081E88093D70080EA8093D80086E189BD84
:1017100009B400FEFDCF80E98093D8001092E0006C
:101720001092420110923D0110923E0110923F0131
:101730008DE28093E2007894089580913F018823A0
:1017400061F080913E01882341F48091E000826045
:101750008093E00081E080933E010895582F382F58
:101760003150343A10F040E014C0E32FE695E6958E
:10177000E695F0E0EE5AFE4F232F277081E090E0CF
:1017800002C0880F991F2A95E2F72081282B208319
:1017900043E0852F885A8330A0F4E52FE695E6953F
:1017A000E695F0E0EE5AFE4F252F277081E090E09D
:1017B00002C0880F991F2A95E2F72081282B2083E9
:1017C0004460852F885E8831A8F4252F2853E22FA6
:1017D000E695E695E695F0E0EE5AFE4F277081E03B
:1017E00090E002C0880F991F2A95E2F72081282BEC
:1017F00020834860252F205E283080F481E090E02F
:1018000002C0880F991F2A95E2F7982F882331F09C
:1018100080914001892B8093400115C0343AD0F467
:10182000E9E4F1E080818517A9F0319681E0EF3499
:10183000F807C1F720E030E0F901E75BFE4F808157
:10184000882319F45083436005C02F5F3F4F263033
:10185000310591F7842F0895482F282F2150243ADD
:1018600010F030E014C0E22FE695E695E695F0E042
:10187000EE5AFE4F277081E090E002C0880F991F5A
:101880002A95E2F7809520818223808333E0842F9C
:10189000885A8330A8F4E42FE695E695E695F0E0C3
:1018A000EE5AFE4F242F277081E090E002C0880F8F
:1018B000991F2A95E2F780952081822380833460E6
:1018C000842F885E8831B0F4242F2853E22FE695C8
:1018D000E695E695F0E0EE5AFE4F277081E090E045
:1018E00002C0880F991F2A95E2F7809520818223F4
:1018F00080833860242F205E283050F481E090E00F
:1019000002C0880F991F2A95E2F7982F882319F4AF
:10191000E9E4F1E008C0909580914001892380932B
:10192000400133600AC08081841711F41082336053
:10193000319681E0EF34F807B1F7832F0895982F9F
:1019400080914201882309F492C090FF2EC02FB7E6
:10195000F89481E08093E9008091E80085FF24C03D
:10196000809140018093F1001092F1008091490133
:101970008093F10080914A018093F10080914B01A6
:101980008093F10080914C018093F10080914D0192
:101990008093F10080914E018093F1008AE380935F
:1019A000E800109248019E7F2FBF80911901882383
:1019B00009F45CC091FF20C02FB7F89482E08093B7
:1019C000E9008091E80085FF16C081E08093F10076
:1019D000809140018093F100E2E5F1E081918093F4
:1019E000F10081E0E736F807C9F78AE38093E80061
:1019F000109245019D7F2FBF92FF16C03FB7F8940C
:101A000022E02093E9008091E80085FF0CC020933C
:101A1000F100809167018093F1008AE38093E800F0
:101A2000109246019B7F3FBF93FF21C02FB7F894D0
:101A300082E08093E9008091E80085FF15C083E093
:101A40008093F100809168018093F1008091690199
:101A50008093F10080916A018093F1008AE3809382
:101A6000E80010924701977F2FBF01C0917F892F17
:101A70000895482F80914201882309F44DC0809138
:101A80003D01882309F048C080913E01882309F078
:101A900043C080911901882309F43EC02FB7F89400
:101AA00083E08093E90080915101882341F0809187
:101AB000E80085FD02C02FBF12C010925101909125
:101AC000E4009C5F33E08091E80085FD13C02FBFE8
:101AD0008091E400891729F481E0809351018FEF10
:101AE0000895809142018823B9F02FB7F89430937C
:101AF000E900E9CF4093F1008091E80085FD06C040
:101B00008AE38093E80010924F0103C082E0809343
:101B10004F012FBF80E008958FEF08951F920F921D
:101B20000FB60F920BB60F9211242F938F939F93A2
:101B3000EF93FF938091E1001092E100282F83FF43
:101B400017C01092E90081E08093EB001092EC0046
:101B500092E29093ED0098E09093F0001092420191
:101B600010923F0110923D0110923E0180931901A5
:101B700020FF08C08091E20080618093E20081E054
:101B800080933D0124FF0BC080913D01882339F0F3
:101B90008091E2008F7E8093E20010923D0125FF4C
:101BA00002C010923E0122FFDBC0809142018823D7
:101BB00009F4D6C0809119018823B1F080914F01BA
:101BC000882391F0815080934F01882369F483E04A
:101BD0008093E90002C01092F1008091E80085FD39
:101BE000FACF8AE38093E80080911901882371F08D
:101BF00080914401882319F08150809344018091A1
:101C00004301882319F08150809343018091500152
:101C10008F5F8093500190E083709070892B09F062
:101C20009FC090911D01992389F181E08093E90083
:101C30008091E80085FF2AC0809148018F5F8093E2
:101C40004801891718F11092480180914001809352
:101C5000F1001092F100809149018093F100809190
:101C60004A018093F10080914B018093F1008091B3
:101C70004C018093F10080914D018093F10080919F
:101C80004E018093F1008AE38093E800809119016E
:101C9000882309F465C082E08093E90090911A01DD
:101CA000992301F18091E80085FF1CC080914501D6
:101CB0008F5F809345018917A8F01092450181E05C
:101CC0008093F100809140018093F100E2E5F1E022
:101CD00081918093F10081E0E736F807C9F78AE344
:101CE0008093E80090911B019923B9F08091E8005E
:101CF00085FF13C0809146018F5F8093460189174D
:101D000060F01092460182E08093F10080916701BB
:101D10008093F1008AE38093E80090911C0199235D
:101D2000F9F08091E80085FF1BC0809147018F5F2B
:101D3000809347018917A0F01092470183E08093B8
:101D4000F100809168018093F10080916901809396
:101D5000F10080916A018093F1008AE38093E800AA
:101D6000FF91EF919F918F912F910F900BBE0F904C
:101D70000FBE0F901F9018951F920F920FB60F92E3
:101D80000BB60F9211242F933F934F935F936F9352
:101D90007F938F939F93AF93BF93CF93DF93EF93F3
:101DA000FF931092E9008091E80083FF4BC260919D
:101DB000F1003091F1008091F100482F50E0209126
:101DC000F100922F80E0482B592B8091F100A82F31
:101DD000B0E02091F100922F80E0A82BB92B8091E8
:101DE000F100C82FD0E02091F100922F80E0C82BA5
:101DF000D92B82EF8093E800363009F056C025EFEA
:101E000032E0B90165507040F9013797859194919E
:101E100084179507E1F4FB01859194918A179B073C
:101E2000B1F49B012E5F3F4FF901659174912E5FD4
:101E30003F4FF9012491CE01CF3FD10519F010F0A9
:101E40008FEF90E0422F821758F4482F09C0295F86
:101E50003F4F695F7F4FF3E020353F07A9F6F2C19E
:101E60005EEF8091E800282F30E0C9018570907006
:101E7000892BB9F322FDE9C1342F413208F030E259
:101E8000232FCB0106C0FC010196E491E093F10001
:101E900021502223C1F7630F711D431B5093E800AB
:101EA0004423F9F63032E9F2D0C1862F8F7709F05A
:101EB0005BC0353061F48EEF8093E8008091E800DC
:101EC00080FFFCCF842F80688093E300BEC139304F
:101ED00019F5409342018EEF8093E80089E493E086
:101EE00021E02093E900FC010196E491E093EB00EE
:101EF000EE2369F0AC014F5F5F4FFC01849180934A
:101F0000EC00CA010196FA0134913093ED002F5F85
:101F1000263039F78EE164C0383039F48091E8001A
:101F200080FFFCCF809142010AC1332341F48091AC
:101F3000E80080FFFCCF80913F01880F2BC031303B
:101F400019F0333009F07EC14130510509F07AC1F2
:101F50008EEF8093E800313019F410923F0175C183
:101F600081E080933F0171C1823009F03EC033238C
:101F7000B1F48091E80080FFFCCFA093E90080914C
:101F8000EB0090E025E0969587952A95E1F7817022
:101F90001092E9008093F1001092F1004FC13130AE
:101FA00019F0333009F04EC1452B09F04BC12A2FEF
:101FB0002F77822F8150853008F044C18EEF8093B7
:101FC000E8002093E900333009F43CC189E18093B3
:101FD000EB0081E090E002C0880F991F2A95E2F79C
:101FE0008093EA001092EA0030C1813209F02AC1E0
:101FF000A230B10509F06CC0E42F313069F5809151
:10200000E80080FFFCCFE13081F4E093F1008091A3
:1020100040018093F100E2E5F1E081918093F100CD
:1020200081E0E736F807C9F709C1E23029F4E09307
:10203000F1008091670183C0E33009F0FFC0E093B5
:10204000F100809168018093F10080916901809393
:10205000F10080916A0173C0393039F48091E80051
:1020600082FFFCCF8091F10073C0323071F4809117
:10207000E80080FFFCCFEE2329F0F0E0E75EFE4FA2
:1020800080815DC080911A015AC03A3009F0DAC0EF
:10209000442371F0A42FB0E01197FD01E65EFE4FDE
:1020A0005083552309F0CAC0AB5BBE4F1C92C6C01B
:1020B00050931A0150931B0150931C01552309F0B2
:1020C000BDC0109245011092460110924701B6C062
:1020D000109709F055C0313009F58091E80080FF74
:1020E000FCCF809140018093F1001092F10080912B
:1020F00049018093F10080914A018093F100809121
:102100004B018093F10080914C018093F10080910C
:102110004D018093F10080914E0111C0323039F4AD
:102120008091E80080FFFCCF80911D0108C0333012
:1021300049F48091E80080FFFCCF809119018093E1
:10214000F1007CC0393061F48091E80082FFFCCF5F
:102150008091F100809341018BEF8093E8006EC085
:102160003A3041F450931D01552309F067C0109295
:10217000480164C03B3009F065C0409319015EC05E
:10218000A130B10519F5313009F05CC04C2F5EEF7C
:102190008091E800282F30E0C90185709070892B6C
:1021A000B9F322FD52C0942F413208F090E2892FFA
:1021B00003C01092F10081508823D9F7491B509336
:1021C000E800442329F7903219F33FC01397D1F563
:1021D000313001F540E45EEF8091E800282F30E0D7
:1021E000C90185709070892BB9F322FD2EC0942F00
:1021F000413208F090E2892F03C01092F100815023
:102200008823D9F7491B5093E800442329F79032DB
:1022100019F31BC03930B1F490E42BEF8091E80042
:1022200082FFFCCF2093E800892F913208F080E2F2
:10223000981BA1F78091E80080FFFCCF8EEF809380
:10224000E80003C081E28093EB00FF91EF91DF9102
:10225000CF91BF91AF919F918F917F916F915F913E
:102260004F913F912F910F900BBE0F900FBE0F908B
:102270001F901895FC0180914201882339F12FB7F6
:10228000F8946093440185E08093E90095E08091A3
:10229000E80085FF02C090E40EC02FBF809144018A
:1022A0008823A9F080914201882381F02FB7F89408
:1022B0009093E900ECCF8091F10081939150D9F790
:1022C0008BE68093E8002FBF80E408958FEF089598
:1022D000FC0180914201882339F12FB7F894609373
:1022E000430184E08093E90094E08091E80085FF59
:1022F00002C090E40EC02FBF809143018823A9F053
:1023000080914201882381F02FB7F8949093E900DF
:10231000ECCF81918093F1009150D9F78AE38093BB
:10232000E8002FBF80E408958FEF0895A2CB0895B1
:10233000982F8A3010F087E301C080E3890F99CB92
:102340001F93182F82958F70F3DF812F8F70F0DF2E
:102350001F9108951F93182F892FF2DF812FF0DF2F
:102360001F9108951F93CF93DF93EC01FE012196F7
:102370001491112339F01A3011F48DE07ADB812F9A
:1023800078DBF4CFDF91CF911F910895382F209102
:102390007001E0916D01F0916E0190E009C0DF01E4
:1023A00080813296831719F411968C9108959F5F5E
:1023B0009217A8F380E008950F931F93CF93DF93B4
:1023C000182F062F809173018823B1F1662349F0FD
:1023D000E0917501F0917601E10FF11D809174019A
:1023E0008083C12FD0E0E0917501F0917601EC0F70
:1023F000FD1F8081CBDF282F8823F1F080917301AE
:102400008217D0F081E090E0821B9109880F991F1C
:10241000E0917101F0917201E81BF90B0190F081DC
:10242000E02DEC0FFD1F8081882311F0E82F09C0FB
:10243000C656DE4FE88105C0E12FF0E0E656FE4FBC
:10244000E0812E2F30E0C901887F9070803D91059A
:10245000D9F44091740127703070002349F081E075
:1024600090E002C0880F991F2A95E2F7482B09C017
:1024700081E090E002C0880F991F2A95E2F78095CD
:10248000482340937401E0E08E2FDF91CF911F919C
:102490000F91089510926F011092700110927301C4
:1024A00010926E0110926D011092720110927101E2
:1024B00010927601109275010895ECDF80E0815052
:1024C000E82FF0E0E656FE4F80838823C1F7089599
:1024D000382F2091700180916F01281778F4822F96
:1024E00090E0880F991FE0916D01F0916E01E80F67
:1024F000F91F308361832F5F20937001089510923C
:1025000074018091750190917601892B59F080E0DA
:102510008150E0917501F0917601E80FF11D108274
:102520008823B1F70895AF92BF92CF92DF92EF92D6
:10253000FF920F93DF93CF9300D0CDB7DEB75C014E
:10254000E62E80917301841770F1442329F46AE91F
:10255000C62E61E0D62E0EC081E090E0841B91096A
:10256000880F991FE0917101F0917201E81BF90B3E
:10257000C080D18000E015C0C50101969A8389838F
:10258000C5010E94271CF82EE2E0F0E0AE0EBF1E4F
:1025900089819A810E94271CF601EF0DF11D80832D
:1025A0000F5F0E1548F30F900F90CF91DF910F91B1
:1025B000FF90EF90DF90CF90BF90AF900895EF9293
:1025C000FF920F931F93CF93DF93E82EF62E66238F
:1025D00009F44FC080E091E053D890937601809346
:1025E00075018DDFCF2DD0E00E2D10E0CE01969538
:1025F000982F8827979587958C0F9D1F800F911F87
:10260000880F991F3DD89C0190936E0180936D01B6
:10261000009711F480E02EC0E0926F01F0927301F8
:10262000C801880F991F820F931F909372018093A6
:1026300071019E01220F331F280F391F90E040E0E7
:1026400050E015C0E0917101F0917201E40FF51FA7
:102650003183208380E08150F901E80FF11D108261
:102660008823C9F720503F4F9F5F4E5F5F4F9F15F4
:1026700048F381E0DF91CF911F910F91FF90EF9090
:10268000089581E080937C01089510927C01089563
:10269000582F40917B01E0917801F091790130E071
:1026A00014C08081851779F481812281922F9095C1
:1026B0009823962392959F70692B8627822319F47D
:1026C0002381348106C03F5F3596341750F320E0F4
:1026D00030E0C901089510927C0110927A011092A5
:1026E0007B018091780190917901892B21F01092E2
:1026F0007901109278010895EECF08951092770134
:1027000080919A0290919B02892B59F080E0815030
:10271000E0919A02F0919B02E80FF11D108288234C
:10272000B1F708957F928F929F92AF92BF92CF920E
:10273000DF92EF92FF920F931F93CF93DF93862E3A
:1027400090907A01C0917801D0917901AA2425E076
:10275000722E3DC0B0907B01B914D9F1B79C7001C5
:102760001124EC0EFD1E8C010F5F1F4F0E94271CD1
:10277000F701808368010894C11CD11CC8010E9424
:10278000271CF701818386010F5F1F4FC6010E943E
:10279000271CF70182831483038378010894E11CCA
:1027A000F11CC8010E94271C182FC7010E94271C7A
:1027B0008F731F73810F880F0894E11CF11C970120
:1027C000280F311DC901B394B0927B01A394A814C2
:1027D00008F2DF91CF911F910F91FF90EF90DF9062
:1027E000CF90BF90AF909F908F907F9008951F9350
:1027F000182F662349F080E091E00E94400B9093EF
:102800009B0280939A027ADF85E0189FC001112411
:102810000E94400B9093790180937801009711F406
:1028200080E005C010937A0110927B0181E01F9136
:102830000895BF92CF92DF92EF92FF920F931F9372
:10284000CF93DF93C62EB42E8C010F5F1F4FFFD79F
:10285000F82EE8012196C801FAD7D82E8F2D8F7354
:10286000BB2011F0E82E1BC04FE3E42EED2090E0DA
:10287000880F991FC80FD91FD7FE11C084E86C2D8F
:102880005AD60DC08E010F5F1F4FCE01E0D7F82E34
:102890002296C801DCD7682F8F2D4DD6EA94EE2002
:1028A00089F7BB2029F4D7FE03C088E060E043D657
:1028B000DF91CF911F910F91FF90EF90DF90CF901C
:1028C000BF900895FF920F931F93082FF62E10913B
:1028D0007701E0919A02F0919B02309761F06623B4
:1028E00019F0E80FF11D1083E0919A02F0919B021C
:1028F000E00FF11D108180917C01882351F0802F21
:10290000612FC6DE009729F0612F4F2D92DF51E035
:1029100001C050E0202F30E0C901887F9070803ED8
:102920009105D1F44091770127703070FF2049F074
:1029300081E090E002C0880F991F2A95E2F7482BAA
:1029400009C081E090E002C0880F991F2A95E2F744
:102950008095482340937701852F1F910F91FF9019
:10296000089580917D0190E0882309F491E0892FFA
:1029700008959C0151E050939F0280917D0188232E
:1029800011F08FEF0895F99B02C08EEF08957093B8
:102990009D0260939C023093A1022093A002409379
:1029A0009E0250937D01FB9A80E008951F920F9242
:1029B0000FB60F920BB60F9211242F933F934F93A4
:1029C0005F936F937F938F939F93AF93BF93EF9397
:1029D000FF9380919E02882329F180919F02882392
:1029E00091F180919C0290919D0231D724C08091F9
:1029F0009E02815080939E028091A0029091A1023C
:102A000001969093A1028093A00280919C029091E4
:102A10009D02019690939D0280939C0280919E025C
:102A2000882321F4FB9810927D0132C080919C0292
:102A300090919D020CD7982FE091A002F091A102F5
:102A400080819817A1F280919C0290919D0292BD85
:102A500081BDE091A002F091A102808180BDFA9A2F
:102A6000F99A80919E02815080939E028091A002EB
:102A70009091A10201969093A1028093A00280916F
:102A80009C0290919D02019690939D0280939C02DE
:102A9000FF91EF91BF91AF919F918F917F916F9136
:102AA0005F914F913F912F910F900BBE0F900FBEF2
:102AB0000F901F901895E2E0F0E089E080935700B6
:102AC000849183FD5AC0F89481E08093E00080E215
:102AD0008093D8001092C90080E29EE40197F1F73C
:102AE0001DBA109268001CBC10BE1FBA10927A006A
:102AF00010926E0010926F00109270001092710090
:102B00001092C9001092BC0011B814B817B81AB8C6
:102B10001DB810BA12B815B818B81BB81EB811BA3B
:102B2000E3E0F0E089E08093570084918670869519
:102B300093E0892720E034E002C0220F331F8A95FA
:102B4000E2F788E02030380791F088E0213038073C
:102B500020F42050344089F408C080E12030380748
:102B600041F02050304249F406C00C9400FE0C9411
:102B700000FC0C9400F80C9400F0089580938201FE
:102B800070938401609383010895282F285D69F074
:102B900081E090E002C0880F991F2A95E2F720910A
:102BA0001F01282720931F01089581E080931F01B2
:102BB00008951F9380E090E04AD6182F81E090E0BE
:102BC00046D620E093E4982783E58127982B09F4E3
:102BD00021E0822F1F910895ECDF882389F082E0A5
:102BE00090E03DD69C01009759F0275F3F4044F4A8
:102BF00084E090E02CD6813019F486E090E027C67E
:102C000080E00895EF92FF920F931F93CF93DF938D
:102C1000E62E142F00E020C0153010F1EC012496B0
:102C2000039615D6F82ECE0112D6982F9F7329F051
:102C3000809181018F5F809381012F2D2F73290F48
:102C4000220F412F4550421758F0CE010196820FB6
:102C5000911D142F121B0F5F0E15F0F281E001C0C1
:102C600080E0DF91CF911F910F91FF90EF90089539
:102C700083E090E060E0F8D582E090E060E0F4D599
:102C800081E090E063E4F0D580E090E063E5ECC59E
:102C900090DF882309F4ECCF0895AF92BF92DF92C2
:102CA000EF92FF920F931F93CF93DF93E62ED42ED4
:102CB000EC012196CE01CBD5082F182F1770DD20FF
:102CC00081F4113041F0113018F0123051F406C087
:102CD00081EF95E005C089EE95E002C081EE95E0B8
:102CE00041DB402F50E020911F0130E0CA01887382
:102CF0009070E3E095958795EA95E1F702C03595E8
:102D000027958A95E2F720FD06C0DD2009F0AEC0C8
:102D100088ED95E02FC021967EEFF72EFE0C06FF82
:102D200019C0CE0194D590E02091820130E021506D
:102D3000304002C0959587952A95E2F780FD06C040
:102D4000DD2009F093C082ED95E014C021966DEF6F
:102D5000F62EFE0C07FF13C0CE0181D52091830112
:102D6000309184018217930739F0DD2009F07EC08D
:102D70008DEC95E0F7DA7AC022962EEFF20E113044
:102D800009F43BC0113020F0123009F068C052C085
:102D9000CE015DD5482FA82EBB249501220F331FED
:102DA000FA948F2D90E02817390719F086EC95E0FA
:102DB00055C0DD2029F480917E01840F80937E012F
:102DC000219600E010E015C0CE0141D5F82ECE01CD
:102DD00001963DD5682FDD2019F08F2D79DB06C0D7
:102DE00080917F01861710F460937F0122960F5F18
:102DF0001F4F0A151B0544F339C08E010F5F1F4F8B
:102E0000CE0125D5E82EC80122D5682F90E0880F85
:102E1000991F2EEFF20E2F2D30E08217930719F035
:102E20008FEB95E01BC0DD2009F1C80101964E2D06
:102E30007ADB1CC08E010F5F1F4FCE0108D5E82E34
:102E4000DD2021F0C8016E2D6DDC10C0C8016E2D93
:102E50004F2DD8DE882329F488EB95E083DA80E0D3
:102E600006C0809180018E0D8093800181E0DF910A
:102E7000CF911F910F91FF90EF90DF90BF90AF9097
:102E80000895EF92FF920F931F93CF93DF9334DC5B
:102E900014DB0E94610B10927E0110927F01109250
:102EA00080011092810185DE882309F49AC082E0B6
:102EB00090E0D5D48C01FCEFEF2EFFEFFF2EE80E53
:102EC000F91E8AEA95E04EDAC70144DA8AE02EDA82
:102ED00005501040065F1F4008F083C084E090E07A
:102EE000B6D4813009F07DC085E090E0B0D4823066
:102EF00008F077C0C8E0D0E020C0CE01A8D4182FD9
:102F00001FDA80E413DACE0125DA80E20FDA153019
:102F100018F483EA95E042C0CE01612F40E0BDDEA7
:102F2000882319F48BE995E039C08AE0FFD9812F15
:102F300090E0C80FD91FE81AF90A1E141F04ECF21A
:102F40008FE895E00FDA80917E01FAD98AE0EED918
:102F500083E895E007DA80917F01F2D98AE0E6D92B
:102F600084E795E0FFD980918001EAD98AE0DED933
:102F700080917E0160917F0122DB882319F485E630
:102F800095E00CC0809180016091810130DC882344
:102F900039F480DA0E94610B86E595E0E3D921C01F
:102FA0008BE495E0DFD982E090E059D48C010450A5
:102FB0001040C8E0D0E00FC0CE0149D4F82ECE01B9
:102FC0006F2D41E06ADE882361F08F2D90E0C80FFD
:102FD000D91F081B190B1016110674F352DB81E080
:102FE00001C080E0DF91CF911F910F91FF90EF9092
:102FF0000895CF92DF92EF92FF920F931F93CF939A
:10300000DF93C090890123E0C21609F413C12C1587
:1030100040F081E0C81609F4DAC08C1508F4DDC070
:103020000CC0E5E0CE1609F451C1CE1608F440C13B
:10303000F6E0CF1609F0ACC189C183EA92E060E006
:1030400019D918160CF0B6C01091A302123009F469
:103050003BC0133020F4113009F0ACC007C013306E
:1030600009F463C0143009F0A5C089C0E9EFF5E0A8
:10307000A3EAB2E084918D93319626E0E231F20723
:10308000C9F782E090E0EBD3EC01009759F084E0BF
:1030900090E0DDD3182F85E090E0D9D31093AD02F6
:1030A0008093AE02882799278C1B9D0B8450904FEC
:1030B0008093B9029093BA020E942D0B8093B302C1
:1030C0009093B40282E02AC03091A50220E0809162
:1030D000A40290E0822B932B90938B0180938A0122
:1030E000875F9F40D0F484E090E090938D018093BF
:1030F0008C0110928F0110928E018EE891E062E0B7
:1031000070E042E036DC882341F41093A20282EAA8
:1031100092E060E0DDD8B9DA5EC081E08093A2027F
:1031200082EA92E060E0D4D845C082E090E09093DB
:103130008D0180938C018AE891E062E070E042E0CA
:1031400050E075D320918A0130918B01FFE0273F39
:103150003F0718F780918C0190918D010296909312
:103160008D0180938C012093A3023093A40282E00E
:103170008093A20282EA92E060E0AAD8E5C08FB70D
:10318000F8942091360130913701409138015091E7
:1031900039018FBF209390013093910140939201A8
:1031A0005093930182E08093A20282EA92E060E071
:1031B0008FD8E8C090911F0180911E01981709F4E3
:1031C000E4C05FDE80911F0180931E01DEC0C9DB79
:1031D000882309F04EC081E0D9C083EA92E060E024
:1031E00049D818160CF04CC08091A302823809F01F
:1031F00057C01091A402212F30E080918A01909154
:103200008B018217930708F44BC060918C01709179
:103210008D0187EA92E0412FACDB882309F040C0A2
:103220001093940182E08093A20282EA92E060E02F
:103230004FD803C096DB882311F483E0A7C0C09168
:103240008C01D0918D01D0909401A7EAEA2EA2E0E2
:10325000FA2E8E0109C0C801FAD2F70191917F01BF
:103260008917F1F40F5F1F4F802F8C1B8D1598F37A
:10327000BDC083E08093A20282EA92E060E028D899
:1032800082E084C02450304030938F0120938E011F
:103290008EE891E062E070E042E06BDB882359F059
:1032A00081E08093A20282EA92E060E011D86DC0D2
:1032B00058DB882311F484E069C084E08093A20283
:1032C00082EA92E060E004D8DCDD5FC083EA92E04D
:1032D00060E00E943A111816BCF58091A302833079
:1032E00031F0843009F451C0813071F54EC0009145
:1032F0008A0110918B010115110531F1013411057D
:1033000008F000E410E060918C0170918D0183EA77
:1033100092E0A8018CD283EA92E060E00E946811FA
:1033200080918A0190918B01801B910B90938B016E
:1033300080938A0180918C0190918D01800F911F63
:1033400090938D0180938C0185E020C08FB7F89415
:103350002091360130913701409138015091390167
:103360008FBF8091900190919101A0919201B091B5
:103370009301281B390B4A0B5B0B295E33404040FD
:10338000504010F486E002C096DB80E08093890113
:103390008FB7F89420913601309137014091380170
:1033A000509139018FBF80918901882311F08C15CC
:1033B00049F0209385013093860140938701509313
:1033C00088012AC08091850190918601A091870192
:1033D000B0918801281B390B4A0B5B0B29583341EC
:1033E00040405040C8F01092890116C02D2D30E0A9
:1033F00080918A0190918B01821B930B90938B019A
:1034000080938A012C0F3D1F30938D0120938C01F6
:10341000892B09F02ECF36CFDF91CF911F910F91DD
:10342000FF90EF90DF90CF900895982F977021E054
:1034300030E001C0220F9A95EAF786958695869529
:1034400090E0662351F0FC01ED51FD4F9081822FF9
:10345000892379F4292B20830895FC01ED51FD4F38
:103460009081822F892329F020952923208380E0D1
:10347000089581E008958091410108958091190196
:1034800008950E947F0B04DC18C8E3EEF2E011926D
:1034900083E0E330F807D9F732D830D987C08BE022
:1034A00060E049C01F93182F60E0BFDF8823B9F4A4
:1034B0008DE20E949611812F0E94A01180E20E944D
:1034C0009611812F60E00E94DC11182F882339F0BB
:1034D00060E0F8D9882319F483E0612F2CD01F9184
:1034E00008951F93182F61E0A0DF8823B9F48BE2C1
:1034F0000E949611812F0E94A01180E20E949611D5
:10350000812F61E00E94DC11182F882339F061E0DF
:10351000D9D9882319F482E0612F0DD01F91089525
:103520008091960190E0019720919501821B91096D
:1035300060E570E055C10F931F93082F162FF0DF41
:103540008823B1F08091950190E0FC01EE0FFF1F00
:10355000E55FFC4F412F50E0302F20E0422B532BF2
:1035600051834083019660E570E03AD180939501E4
:103570001F910F910895909196018091950189175F
:1035800019F4E0E0F0E010C0892F90E0FC01EE0FAC
:10359000FF1FE55FFC4F0190F081E02D019660E593
:1035A00070E01ED180939601CF010895809195011E
:1035B0008093960108950F931F9380913D01882376
:1035C00021F480913E01882391F080913E0188236F
:1035D00009F003C19091950180919601981709F423
:1035E000FCC00E949D0B8AE080939801F6C08091F8
:1035F0009801882361F0815080939801882309F015
:10360000ECC043DF0E94680B80939901E6C0E09113
:103610009601809195018E1719F4E0E0F0E008C062
:10362000F0E0EE0FFF1FE55FFC4F0190F081E02D11
:103630008F01F7FF0FC090919701983050F4E92F58
:10364000F0E0ED5FFC4F8091400180839F5F90939D
:1036500097011F77113091F11A3009F48EC08BDF7A
:10366000163009F469C0173090F4133009F44AC0D9
:10367000143030F4113011F1123009F09AC02EC01C
:10368000143009F452C0153009F093C051C01930FC
:1036900009F467C01A3038F4173009F452C01830F2
:1036A00009F087C052C01B3039F01B3008F465C0E8
:1036B0001C3009F07EC077C010E077C0E091960121
:1036C000809195018E1751F0F0E0EE0FFF1FE55F3E
:1036D000FC4F802F90E0936091838083802F887FC0
:1036E000883D19F4802F51DA64C084E60E94961157
:1036F000802F0E94A01180E20E949611802F0E94CC
:10370000AE0B11C0802F887F883D09F452C085E739
:103710000E949611802F0E94A01180E20E949611B3
:10372000802F0E942C0C982F45C00093400123C08D
:1037300080914001802B1DC0009580914001802325
:1037400018C080914001802714C0E0919701EE23BA
:1037500081F1E150E0939701F0E0ED5FFC4F808153
:1037600008C080919701882321F1109297018091E0
:1037700003038093400193E01DC0902F915089F086
:10378000E0919601809195018E1799F0F0E0EE0F8F
:10379000FF1FE55FFC4F892F90E09A609183808343
:1037A00008C0E9DE06C071DE11E00E94680B982FA8
:1037B00002C090E010E080919901892B80939901DB
:1037C000882321F00E949F0C80939901112329F0F6
:1037D00080E29EE40197F1F76ED91F910F91089551
:1037E00097FB092E07260AD077FD04D00CD006D00F
:1037F00000201AF4709561957F4F0895F6F7909523
:1038000081959F4F0895AA1BBB1B51E107C0AA1FBA
:10381000BB1FA617B70710F0A61BB70B881F991F71
:103820005A95A9F780959095BC01CD010895DC01CA
:10383000CB01FC01F999FECF06C0F2BDE1BDF89ABB
:10384000319600B40D9241505040B8F70895F9995F
:10385000FECF92BD81BDF89A992780B50895A8E161
:10386000B0E042E050E0E5CF262FF999FECF1FBA35
:1038700092BD81BD20BD0FB6F894FA9AF99A0FBE99
:0838800001960895F894FFCFB2
:1038880004E11477E1F014F0770AFE0101FFFF016B
:10389800FFFFFFFF7F0000AB03017D7D7D7D010100
:00000001FF

View File

@ -0,0 +1,901 @@
:1000000008C3000022C300000C941C091EC300009A
:100010001CC300001AC3000018C3000016C3000070
:1000200014C3000012C300000C94800D0C94AA0E9F
:100030000CC300000AC3000008C3000006C3000090
:1000400004C300000C945C0900C30000FEC2000061
:10005000FCC200000C94D10AF8C20000F6C20000F5
:10006000F4C20000F2C20000F0C20000EEC20000C4
:10007000ECC20000EAC200000C94C014E6C200000A
:10008000C1C50000E2C20000E0C20000DEC2000004
:10009000DCC20000DAC2000000291E1F202122233A
:1000A000242526272D2E2A2B141A0815171C180C68
:1000B00012132F3028E0041607090A0B0D0E0F3318
:1000C0003435E1311D1B0619051110363738E55559
:1000D000E22C393A3B3C3D3E3F4041424353475F6F
:1000E0006061565C5D5E57595A5B6263C2BE644490
:1000F0004567B0B28CB7B8B9BABBBCBD68696A6BAA
:100100006C6D6E6F707172C188B1B387B4B5739343
:10011000928ABF8BB68985C00142003E3C3A3B457E
:100120006843413F3D2B356769E2E188E0141EB02A
:100130006AB11D16041A1FB26B061B070821208C1A
:100140006C2C1909171522B76D11050B0A1C23B861
:100150006EB3100D182425B96F360E0C122726BA6F
:100160007037380F33132DBB718734B42F2EBC7208
:1001700039E52830B531BD73BE6493928ABF2A8BAE
:10018000B659895C5F85C0C162635A5D5E60295360
:1001900044575B565561470000000040C200000014
:1001A00000000000000000000000000000F9E60070
:1001B00000E4E90000FF000000000000E3FEF000A2
:1001C000EC000000E7FD0000F700000065FC00EF18
:1001D00000EB000066FB00FAEA000000A9F800004E
:1001E0000000000000F600540000E80000F50000E8
:1001F0000000000000000058000000AA00000000FD
:100200000000000000004D00504A000000494C5121
:10021000004F52000000004E00464B4801BF00BB9B
:10022000B9B7B83A68C0BEBCBA2B353B69E0E164E7
:1002300039141E3C6AE21D16041A1F3D6B061B078B
:100240000821203E6C2C19091715223F6D11050B52
:100250000A1C23406EE6100D182425416F360E0C43
:10026000122726427037380F33132D4371873432EB
:100270002F2E4472E4E52830318945735150935252
:100280004C4D2A49B6594F5C5F4E4A4B62635A5DEA
:100290005E602953B2575B5655614700000000BDB0
:1002A000C20A4D6F64653A2041542F5053320A0AF6
:1002B000000A4D6F64653A2050432F58540A0A00D3
:1002C000756E6B6E6F776E00322028657874656E80
:1002D0006465642900436F6465205365743A2000A7
:1002E0004B6579626F6172642049443A20000001D5
:1002F0000000580312000200006A0374002200008C
:10030000DE0312002100007C030900220100F0033B
:100310001500210100950309002202000504DC00FC
:10032000210200AE030900220300E1041C002103A6
:1003300000C7030900030000FD04040103090401D0
:10034000050E0203090411053801C10601C1260189
:10035000C12601C13601C036120100020000002092
:10036000C0167D04000101020001090274000401AD
:1003700000A032090400000103010100092111015C
:100380000001221200070581030800010904010091
:1003900001030000000921110100012215000705D9
:1003A0008303200001090402000103000000092169
:1003B0001101000122DC0007058203170001090476
:1003C00003000203000000092111010001221C00AA
:1003D00007058403400002070505034000080501E6
:1003E0000906A101150026FF00950875088103C0C4
:1003F0000631FF0974A1537508150026FF009520EA
:1004000009758102C005010906A1018501750195E3
:1004100008050719E029E7150025018102950575F2
:1004200001050819012905910295017503910375CC
:100430000195310507190129311500250181029522
:1004400001750181037501956905071933299B150C
:10045000002501810295017501810375019508054B
:1004600007199D29A41500250181029504750181B4
:1004700003C005010980A101850275019503198159
:100480002983150025018102950575018103C005A9
:100490000C0901A10185037501951809B509B60973
:1004A000B709CD09E209E509E709E909EA0A5201B4
:1004B0000A53010A54010A55010A83010A8A010AF2
:1004C00092010A94010A21020A23020A24020A253F
:1004D000020A26020A27020A2A02150025018102C1
:1004E000C00699FF0A6824A1017508150026FF00BF
:1004F000954009018102954009029102C004030957
:10050000040E0353006F006100720065007200006A
:1005100000380353006F006100720065007200270D
:1005200000730020004B006500790062006F0061DD
:100530000072006400200043006F006E00760065CA
:100540000072007400650072000000616C6C6F63E3
:10055000206F6B2E0A00616C6C6F63206661696CA2
:1005600065642E0A00616C6C6F63206661696C655E
:10057000642E0A00746F74616C5F6D6163726F73D7
:100580003A20006D61785F6C617965723A20006C89
:1005900061796572646566733A2000216170706CE0
:1005A000790A006C656E3C350A000A0A72656D6155
:1005B000696E696E673A20006572726F722000651D
:1005C00072726F7220006572726F7220002169640E
:1005D00020002173657420002173656C65637420AD
:1005E000006D6163726F73200072656D61707320BE
:1005F000006C6179657273200003010001010C0237
:1006000001010400000500100700000600080800B2
:10061000000011241FBECFEFD0E1DEBFCDBF11E03F
:10062000A0E0B1E0EEE1F8E302C005900D92A03247
:10063000B107D9F713E0A0E2B1E001C01D92AB3AD7
:10064000B107E1F7AAD00C940D1CDACC909100010F
:10065000923021F1933018F4913041F505C0933078
:1006600059F0943019F510C087FD20C0E82FF0E054
:10067000E856FF4F849108958538C0F4E82FF0E0E4
:10068000E45EFD4F84910895662341F08F3770F446
:10069000E82FF0E0E356FE4F84910895853830F45A
:1006A000E82FF0E0E85EFE4F8491089580E0089521
:1006B0000E94101A0E941A1A10922201109223010D
:1006C0001092240108951F93182F0E94091A212FB8
:1006D00030E0882371F08AB188638AB99BB143E026
:1006E000220F331F4A95E1F7822F8873977C892B5D
:1006F0000DC09AB183E0220F331F8A95E1F7822F54
:100700008873977C892B8AB98BB188638BB91F91C9
:1007100008959CDF0C941D1A99DF0C943C1ACF921B
:10072000DF92EF92FF920F931F93CF93DF93ABD2A1
:10073000082F80912601802739F1C0E0D0E01BEA24
:10074000C82EDD24E02EFF24C6010C2E02C0959594
:1007500087950A94E2F780FF10C0C7010C2E02C0F3
:10076000959587950A94E2F780FF04C0812F0E9437
:100770001D1A03C0812F0E943C1A21961F5F103B57
:1007800019F70093260181E0DF91CF911F910F911E
:10079000FF90EF90DF90CF9008952F923F924F926D
:1007A0005F926F927F928F929F92AF92BF92CF9201
:1007B000DF92EF92FF920F931F93DF93CF9300D0BE
:1007C0000F92CDB7DEB780E8809361001092610090
:1007D000569A80E078DF87E076DFD5D60E940C1A43
:1007E00056D536D265DF80E076D23324882499242A
:1007F0005524AA24BB24650114E0412EB2E02B2E1F
:100800003320A1F42FB7F8948091360190913701ED
:10081000A0913801B09139012FBF855F9140A04070
:10082000B04020F081E057D233243394882009F07F
:10083000E5C02FB7F8948091360190913701A091CF
:100840003801B09139012FBF895B9B40A040B04077
:1008500008F4D4C00E94B715982F9F7099F0829524
:100860008F7059F490930001913019F4209229016E
:1008700061C081E0809329015DC08093290190933C
:10088000000158C010920001109221011092200125
:100890008EEE62E34DD5823009F041C082E3F3D59C
:1008A00081E08093290180910001882309F03CC0F8
:1008B00082EF62E33DD5182F8230B1F582E3E3D5B4
:1008C0008A3F91F5CE01029662E383D5823021F50D
:1008D000CE01039662E37DD59A818230B1F49B3AD2
:1008E00031F48B81853819F04092000103C083E018
:1008F00080930001792E66248B8190E086299729C8
:1009000090932101809320010FC0409200019093A9
:1009100020011092210108C01093000105C020920F
:10092000290181E08093000180910001882311F466
:10093000409200016091200170912101809100019D
:100940000E9489150E940C1780912901823011F4B0
:10095000F0D1F5D180910001833011F488EFE6D514
:1009600080E0B1DE8FB7F894A0903601B0903701E7
:10097000C0903801D09039018FBF8AE00E94801169
:100980008AE00E94801180EE92E00E949C1180918A
:100990002001909121010E9494118AE00E9480110F
:1009A00085ED92E00E949C1180910001823061F0FF
:1009B000833018F4813089F405C0833049F08430E5
:1009C00061F408C081E301C082E30E94801109C084
:1009D00083E3FBCF88EC92E002C080EC92E00E94BF
:1009E0009C1180912901823019F481EB92E002C0C0
:1009F00081EA92E00E949C1188248394CE010196A2
:100A000060E0E7D4882009F4DDC0823008F485C0B6
:100A1000823009F06DC0198180910001813069F444
:100A20001F3F09F44EC017FF05C0812F8F7760E08C
:100A300070DE64C0812F60E013C09091240199237F
:100A400009F1E92FF0E0EF5FFE4F8081181799F46C
:100A5000E92FEF5FE0932401E33021F48EE761E0BA
:100A60005BDE4CC0E83009F049C08EE761E051DE42
:100A70001092240143C0933018F08EE761E049DE04
:100A800010922401103E91F0113E28F41123C9F078
:100A90001A3AE1F433C0103F29F01C3F79F0113EBF
:100AA000A9F408C081E08093220128C081E08093EE
:100AB000230124C081E08093240120C080E197E2DB
:100AC00003C0F6DD88E893E158D518C08091220173
:100AD000882339F0812F609123011BDE10922201BF
:100AE00004C0812F6091230117DE1092230106C0FC
:100AF0008EEF62E31DD49924939401C099248FB79B
:100B0000F894A0903601B0903701C0903801D09091
:100B100039018FBF5524539471C0882309F06EC0EA
:100B2000992009F06BC00E94061A182F0E94091A1A
:100B3000082F079500270795012B8091250108179D
:100B400009F45CC0FF24F394F022E02EE69421E047
:100B5000E222102F16951695117080912001909128
:100B600021016F2D70E02E2D30E0805B9F4B41F412
:100B7000660F771F660F771F612B220F331F07C089
:100B8000660F771F612B220F331F220F331F622B3B
:100B90008DEE93D4FF0CFE28110F110F812F8F299A
:100BA00092DD009325012AC08FB7F894A0903601FA
:100BB000B0903701C0903801D09039018FBF5524D3
:100BC000539402C05520B9F02FB7F89480913601A4
:100BD00090913701A0913801B09139012FBF8A1946
:100BE0009B09AC09BD09C397A105B10520F08AE0B6
:100BF0000E94801155240E94C41702CE90DD8823E4
:100C000099F6E0CF1F920F920FB60F9211248F9397
:100C10009F9393B19F7180912801981729F0909329
:100C200028018AE08093090180910901882349F015
:100C3000815080930901882321F4809128018093B9
:100C400027019F918F910F900FBE0F901F901895C5
:100C500084B1807E84B985B18F6185B9E1E7F0E028
:100C60008081826080838AEF90E0909399008093E6
:100C7000980010929000E1E9F0E088E080838081A4
:100C80008360808308958091270108959C0180915D
:100C90008100887F8093810080916F008D7F809399
:100CA0006F00109285001092840082E086BB2115AF
:100CB000310581F0220F331F309389002093880083
:100CC00080916F00826080936F00809181008260CC
:100CD000809381000895882319F027982F9A08950A
:100CE0002F98279A0895882319F05098589A0895B4
:100CF0005898509A0895382F4DB3E99800008823EA
:100D000019F05198599A02C0519A599824E189B121
:100D100090E0969587958170831711F02150B9F76F
:100D200082E08CBB41FF02C0E99A01C0E9988DB313
:100D30000895F894E99882E08CBB78940895F8942B
:100D4000E9E6F0E080818C608083E99A78940895E8
:100D5000882321F0809111018093120189B190E0E4
:100D600096958795982F9170809112018F3F21F46D
:100D700081E089278093120180911201813089F0EE
:100D8000813018F08E3FB9F419C09923C9F08AE573
:100D900090E07CDF8EEF8093110181E0809312015F
:100DA0000AC0992369F488EE93E070DF8FEF809397
:100DB00011011092120191E0892F089592E001C073
:100DC00094E08FEF80931201F7CF1F9319B1117048
:100DD000882321F080910A0180930B0180910B01FF
:100DE0008230F1F0833020F4813009F04BC006C02E
:100DF000833079F18E3F09F045C03AC08EEF809381
:100E00000A0180EB94E042DF10922D0110922C0138
:100E1000112311F416E02DC082E080930B0132C043
:100E200017951127179580912C018695182B1093F3
:100E30002C0180912D018F5F80932D01883011F559
:100E400013E010930A0188E790E020DF10930B0174
:100E500019C080E090E01ADF80912C0180932A0174
:100E600012E007C088EB9BE088D310932B010AC0E7
:100E700015E080E090E00ADF81E080930B01123002
:100E800089F7F3CF1F9108950F931F93982F8091A7
:100E90000E018F3F19F482E080930E01992321F017
:100EA00080910D0180930E0180910E01873009F42D
:100EB00060C0883088F4843009F43EC0853030F456
:100EC0008230E9F0833009F081C02CC08530B1F167
:100ED000863009F07BC04BC08A3009F45FC08B308C
:100EE00038F4883009F44FC0893009F06FC04DC024
:100EF0008B3009F457C08E3F09F068C05AC080910A
:100F00002E0180932F0188E08093300181E080934F
:100F10000C0183E080930D0188EC90E0B7DE80E067
:100F2000EADE54C080E0DFDE81E0E5DE8EEF809314
:100F30000D0180E29EE4AADE85E031C010912F0110
:100F4000012F0170802FCFDE169510932F01809115
:100F50000C01802780930C01809130018150809397
:100F60003001882311F084E01AC086E018C087E0C1
:100F700016C080910C01B7DE8091300181508093C2
:100F8000300188E00CC089E00AC081E0ACDE8091CD
:100F900030018150809330018AE001C08BE0809362
:100FA0000E0114C080E090E071DE48992CC012E080
:100FB00007C0109130011295107F1560123030F08B
:100FC00081E091DE8FEF80930E0119C089B12091ED
:100FD0000E0130E02170307090E096958795817019
:100FE00090702817390711F411E009C081E07BDE09
:100FF0008FEF80930E0188EB9BE0BFD214E0812F2E
:101000001F910F91089519E0DBCFFF920F931F936B
:10101000F9B099B1882329F08FEF8093100115E082
:101020007DC0809110018F3F19F481E08093100101
:10103000092F0170109110011630E9F1173040F4BA
:101040001430D9F01530D8F4113009F050C008C070
:101050001830D9F1183088F1193009F048C037C07C
:1010600080EB94E013DE1092320110923101109364
:101070000F01002309F057C01CC085E017C0902F56
:10108000979599279795809131018695982B909304
:10109000310180910F01802780930F0180913201EF
:1010A0008F5F80933201883021F486E080931001B5
:1010B0001EC084E0FBCF87E0F9CF80910F0180173D
:1010C00011F017E031C088E0F1CF89E0EFCF0023C5
:1010D00049F08091310180932A0181E080932901B8
:1010E00012E022C088EB9BE048D218E01DC020919E
:1010F000100130E0217030708F2D90E0969587952B
:10110000817090702817390711F411E007C08FEF34
:101110008093100188EB9BE030D214E0812F1F9167
:101120000F91FF90089516E080E090E0AFDD8FEF23
:1011300080931001F3CFDF92EF92FF920F931F93F2
:10114000082F8230F9F480912901823021F483E064
:10115000809333016BC080913501813079F483E055
:101160008093350180913301882319F088EB9BE04F
:1011700004D281E08093330100E004C081E08093D9
:10118000340154C0FF24F394A2E0DA2EF3E0EF2EF2
:1011900080913501813031F1813030F0823081F140
:1011A000833009F043C039C0802FD2DD823008F48B
:1011B0003DC0823069F780913401882379F0109224
:1011C000340180913301882319F088EB9BE0D5D15D
:1011D000F0923301E092350100E0DACF81E08093B4
:1011E000350124C049991FC080913301882319F02B
:1011F00088EB9BE0C2D1F0922B01D0923501C8CF91
:10120000802F03DF182F823088F0823019F088EBAE
:101210009BE0B3D110932B0106C0802F35DE8230C6
:1012200028F08093330110923501B2CF1F910F91B6
:10123000FF90EF90DF9008951F920F920FB60F92DC
:1012400011242F933F934F935F936F937F938F93CB
:101250009F93AF93BF93EF93FF93809129018230C7
:1012600019F480E0B2DD02C080E065DFFF91EF910C
:10127000BF91AF919F918F917F916F915F914F91AE
:101280003F912F910F900FBE0F901F901895F894DB
:1012900081E031DD81E027DD1092800088E08093DD
:1012A0008100E9E6F0E08081837F84608083E99AB1
:1012B00080E041DF789408951F920F920FB60F924D
:1012C00011242F933F934F935F936F937F938F934B
:1012D0009F93AF93BF93EF93FF9380918100887F9B
:1012E0008093810080916F008D7F80936F0000005C
:1012F000109285001092840082E086BB80912901C3
:10130000823019F481E061DD02C081E014DFFF91D9
:10131000EF91BF91AF919F918F917F916F915F916D
:101320004F913F912F910F900FBE0F901F901895E6
:10133000DF92EF92FF920F931F93182FD62E80917A
:101340002901823011F480E03EC087E7D9D7812F90
:10135000E1D780E2D5D7F89410932E011092330193
:1013600082E0E9DE78948FB7F894E0903601F0904F
:10137000370100913801109139018FBF4D2D50E098
:1013800060E070E018C0DD20B1F02FB7F8948091D4
:10139000360190913701A0913801B09139012FBFEA
:1013A0008E199F09A00BB10B481759076A077B07D5
:1013B00010F48AE008C080913301823020F38091DC
:1013C0003301109233011F910F91FF90EF90DF9046
:1013D0000895DF92EF92FF920F931F93CF93DF93C5
:1013E000EC018FB7F894E0903601F090370100914E
:1013F0003801109139018FBFD0902B016623C1F4C1
:101400001FC02FB7F8948091360190913701A091B9
:101410003801B09139012FBF8E199F09A00BB10B74
:10142000481759076A077B0728F1D0902B0104C0A1
:10143000462F50E060E070E081E08D1510F703C0AA
:1014400081E08D15B8F410912A0110922B0182E0F1
:10145000D81651F482E754D7812F5CD780E250D759
:10146000209741F0188306C082E54AD78D2D52D7C8
:1014700080E246D78D2DDF91CF911F910F91FF9084
:10148000EF90DF9008951F93DF93CF930F92CDB726
:10149000DEB7682FCE0101969CDF182F823039F01D
:1014A000198282E52DD781E32BD7812F33D789810C
:1014B0000F90CF91DF911F910895EF92FF920F93BC
:1014C0001F93E82EF62E80912901823049F103E026
:1014D0008E2D62E32DDF182F8230D1F482E3D3DF2B
:1014E000182F8A3F69F48F2D62E322DF182F823094
:1014F00059F482E3C8DF182F8A3F11F481E011C04C
:1015000081E2FED681E207C087E5FAD682E303C016
:1015100087E5F6D681E3F4D6812FFCD60150C1F6DB
:1015200080E01F910F91FF90EF900895FF920F932D
:101530001F93F82E809129018230D1F003E08F2D86
:1015400062E3F6DE182F823059F482E39CDF182F15
:101550008A3F11F481E00DC081E2D2D681E203C05E
:1015600087E5CED680E3CCD6812FD4D6015039F78B
:1015700080E01F910F91FF90089590933B0180931D
:101580003A015E980895EEE6F0E080818260808303
:101590008AEF87BD82E084BD15BC85B5836085BDBB
:1015A00008951F920F920FB60F9211242F933F931D
:1015B0004F935F936F937F938F939F93AF93BF935B
:1015C000EF93FF938091360190913701A0913801FC
:1015D000B09139010196A11DB11D80933601909300
:1015E0003701A0933801B093390180913A0190916D
:1015F0003B01009731F0019790933B0180933A01B2
:1016000001C05E9A80913C01882341F481E080937F
:101610003C0178940E94A61A10923C01FF91EF9130
:10162000BF91AF919F918F917F916F915F914F91FA
:101630003F912F910F900FBE0F901F901895209102
:101640001501309116012115310521F42DB73EB752
:10165000205230408091170190911801281B390BBE
:10166000C9010895AC012091150130911601211591
:10167000310521F42DB73EB720523040809117013B
:1016800090911801281B390B2417350718F420E016
:1016900030E007C0480F591F5093180140931701BD
:1016A0009C01C90108958BEA93E0909318018093FF
:1016B000170108951092490110924A0110924B01AE
:1016C00010924C0110924D0110924E01E2E5F1E0B2
:1016D000119281E0ED36F807D9F7109240018FE0C2
:1016E0000895E8DF81E88093D70080EA8093D800EE
:1016F0008AE189BD09B400FEFDCF80E98093D8005E
:101700001092E0001092420110923D0110923E01B1
:1017100010923F018DE28093E200789408958091C9
:101720003F01882361F080913E01882341F480913C
:10173000E00082608093E00081E080933E010895A4
:10174000582F382F3150343A10F040E014C0E32FB6
:10175000E695E695E695F0E0EE5AFE4F232F2770CA
:1017600081E090E002C0880F991F2A95E2F720815E
:10177000282B208343E0852F885A8330A0F4E52F5F
:10178000E695E695E695F0E0EE5AFE4F252F277098
:1017900081E090E002C0880F991F2A95E2F720812E
:1017A000282B20834460852F885E8831A8F4252F5C
:1017B0002853E22FE695E695E695F0E0EE5AFE4FC7
:1017C000277081E090E002C0880F991F2A95E2F708
:1017D0002081282B20834860252F205E283080F42C
:1017E00081E090E002C0880F991F2A95E2F7982FB8
:1017F000882331F080914001892B8093400115C0EE
:10180000343AD0F4E9E4F1E080818517A9F031960B
:1018100081E0EF34F807C1F720E030E0F901E75B41
:10182000FE4F8081882319F45083436005C02F5FE9
:101830003F4F2630310591F7842F0895482F282FE8
:101840002150243A10F030E014C0E22FE695E695DE
:10185000E695F0E0EE5AFE4F277081E090E002C07E
:10186000880F991F2A95E2F7809520818223808333
:1018700033E0842F885A8330A8F4E42FE695E69568
:10188000E695F0E0EE5AFE4F242F277081E090E0BD
:1018900002C0880F991F2A95E2F780952081822344
:1018A00080833460842F885E8831B0F4242F2853DD
:1018B000E22FE695E695E695F0E0EE5AFE4F2770AA
:1018C00081E090E002C0880F991F2A95E2F7809589
:1018D0002081822380833860242F205E283050F4BA
:1018E00081E090E002C0880F991F2A95E2F7982FB7
:1018F000882319F4E9E4F1E008C090958091400153
:1019000089238093400133600AC08081841711F4D9
:1019100010823360319681E0EF34F807B1F7832FFE
:101920000895982F80914201882309F492C090FF76
:101930002EC02FB7F89481E08093E9008091E800F1
:1019400085FF24C0809140018093F1001092F10046
:10195000809149018093F10080914A018093F100C8
:1019600080914B018093F10080914C018093F100B4
:1019700080914D018093F10080914E018093F100A0
:101980008AE38093E800109248019E7F2FBF8091E8
:101990001901882309F45CC091FF20C02FB7F89487
:1019A00082E08093E9008091E80085FF16C081E025
:1019B0008093F100809140018093F100E2E5F1E035
:1019C00081918093F10081E0E736F807C9F78AE357
:1019D0008093E800109245019D7F2FBF92FF16C0B3
:1019E0003FB7F89422E02093E9008091E80085FF5A
:1019F0000CC02093F100809167018093F1008AE38D
:101A00008093E800109246019B7F3FBF93FF21C067
:101A10002FB7F89482E08093E9008091E80085FF79
:101A200015C083E08093F100809168018093F100FC
:101A3000809169018093F10080916A018093F100A7
:101A40008AE38093E80010924701977F2FBF01C07F
:101A5000917F892F0895482F80914201882309F4AE
:101A60004DC080913D01882309F048C080913E011E
:101A7000882309F043C080911901882309F43EC0EE
:101A80002FB7F89483E08093E90080915101882377
:101A900041F08091E80085FD02C02FBF12C0109276
:101AA00051019091E4009C5F33E08091E80085FD56
:101AB00013C02FBF8091E400891729F481E080933F
:101AC00051018FEF0895809142018823B9F02FB71B
:101AD000F8943093E900E9CF4093F1008091E80059
:101AE00085FD06C08AE38093E80010924F0103C091
:101AF00082E080934F012FBF80E008958FEF08951B
:101B00001F920F920FB60F9211242F938F939F93D2
:101B1000EF93FF938091E1001092E100282F83FF63
:101B200017C01092E90081E08093EB001092EC0066
:101B300092E29093ED0098E09093F00010924201B1
:101B400010923F0110923D0110923E0180931901C5
:101B500020FF08C08091E20080618093E20081E074
:101B600080933D0124FF0BC080913D01882339F013
:101B70008091E2008F7E8093E20010923D0125FF6C
:101B800002C010923E0122FFDBC0809142018823F7
:101B900009F4D6C0809119018823B1F080914F01DA
:101BA000882391F0815080934F01882369F483E06A
:101BB0008093E90002C01092F1008091E80085FD59
:101BC000FACF8AE38093E80080911901882371F0AD
:101BD00080914401882319F08150809344018091C1
:101BE0004301882319F08150809343018091500173
:101BF0008F5F8093500190E083709070892B09F083
:101C00009FC090911D01992389F181E08093E900A3
:101C10008091E80085FF2AC0809148018F5F809302
:101C20004801891718F11092480180914001809372
:101C3000F1001092F100809149018093F1008091B0
:101C40004A018093F10080914B018093F1008091D3
:101C50004C018093F10080914D018093F1008091BF
:101C60004E018093F1008AE38093E800809119018E
:101C7000882309F465C082E08093E90090911A01FD
:101C8000992301F18091E80085FF1CC080914501F6
:101C90008F5F809345018917A8F01092450181E07C
:101CA0008093F100809140018093F100E2E5F1E042
:101CB00081918093F10081E0E736F807C9F78AE364
:101CC0008093E80090911B019923B9F08091E8007E
:101CD00085FF13C0809146018F5F8093460189176D
:101CE00060F01092460182E08093F10080916701DC
:101CF0008093F1008AE38093E80090911C0199237E
:101D0000F9F08091E80085FF1BC0809147018F5F4B
:101D1000809347018917A0F01092470183E08093D8
:101D2000F100809168018093F100809169018093B6
:101D3000F10080916A018093F1008AE38093E800CA
:101D4000FF91EF919F918F912F910F900FBE0F9068
:101D50001F9018951F920F920FB60F9211242F9378
:101D60003F934F935F936F937F938F939F93AF9323
:101D7000BF93CF93DF93EF93FF931092E90080918D
:101D8000E80083FF4BC26091F1003091F100809137
:101D9000F100482F50E02091F100922F80E0482B75
:101DA000592B8091F100A82FB0E02091F100922FE3
:101DB00080E0A82BB92B8091F100C82FD0E02091B2
:101DC000F100922F80E0C82BD92B82EF8093E8009E
:101DD000363009F056C025EF32E0B9016550704049
:101DE000F90137978591949184179507E1F4FB01E8
:101DF000859194918A179B07B1F49B012E5F3F4F09
:101E0000F901659174912E5F3F4FF9012491CE0144
:101E1000CF3FD10519F010F08FEF90E0422F8217DD
:101E200058F4482F09C0295F3F4F695F7F4FF3E0A7
:101E300020353F07A9F6F2C15EEF8091E800282F18
:101E400030E0C90185709070892BB9F322FDE9C19A
:101E5000342F413208F030E2232FCB0106C0FC01C1
:101E60000196E491E093F10021502223C1F7630F22
:101E7000711D431B5093E8004423F9F63032E9F218
:101E8000D0C1862F8F7709F05BC0353061F48EEFBB
:101E90008093E8008091E80080FFFCCF842F806869
:101EA0008093E300BEC1393019F5409342018EEFB3
:101EB0008093E80089E493E021E02093E900FC01AD
:101EC0000196E491E093EB00EE2369F0AC014F5FE3
:101ED0005F4FFC0184918093EC00CA010196FA01E6
:101EE00034913093ED002F5F263039F78EE164C0D6
:101EF000383039F48091E80080FFFCCF80914201B6
:101F00000AC1332341F48091E80080FFFCCF809127
:101F10003F01880F2BC0313019F0333009F07EC1FA
:101F20004130510509F07AC18EEF8093E8003130DD
:101F300019F410923F0175C181E080933F0171C196
:101F4000823009F03EC03323B1F48091E80080FF75
:101F5000FCCFA093E9008091EB0090E025E09695FE
:101F600087952A95E1F781701092E9008093F1003E
:101F70001092F1004FC1313019F0333009F04EC1E9
:101F8000452B09F04BC12A2F2F77822F81508530A6
:101F900008F044C18EEF8093E8002093E9003330CD
:101FA00009F43CC189E18093EB0081E090E002C03C
:101FB000880F991F2A95E2F78093EA001092EA00B1
:101FC00030C1813209F02AC1A230B10509F06CC0DC
:101FD000E42F313069F58091E80080FFFCCFE130DB
:101FE00081F4E093F100809140018093F100E2E5FB
:101FF000F1E081918093F10081E0E736F807C9F7BD
:1020000009C1E23029F4E093F1008091670183C0B7
:10201000E33009F0FFC0E093F10080916801809304
:10202000F100809169018093F10080916A0173C091
:10203000393039F48091E80082FFFCCF8091F100C3
:1020400073C0323071F48091E80080FFFCCFEE2342
:1020500029F0F0E0E75EFE4F80815DC080911A01BB
:102060005AC03A3009F0DAC0442371F0A42FB0E02E
:102070001197FD01E65EFE4F5083552309F0CAC05B
:10208000AB5BBE4F1C92C6C050931A0150931B010C
:1020900050931C01552309F0BDC0109245011092C8
:1020A000460110924701B6C0109709F055C0313073
:1020B00009F58091E80080FFFCCF8091400180937A
:1020C000F1001092F100809149018093F10080911C
:1020D0004A018093F10080914B018093F10080913F
:1020E0004C018093F10080914D018093F10080912B
:1020F0004E0111C0323039F48091E80080FFFCCFEE
:1021000080911D0108C0333049F48091E80080FFC0
:10211000FCCF809119018093F1007CC0393061F4CB
:102120008091E80082FFFCCF8091F1008093410113
:102130008BEF8093E8006EC03A3041F450931D015C
:10214000552309F067C01092480164C03B3009F084
:1021500065C0409319015EC0A130B10519F5313059
:1021600009F05CC04C2F5EEF8091E800282F30E032
:10217000C90185709070892BB9F322FD52C0942F4C
:10218000413208F090E2892F03C01092F100815093
:102190008823D9F7491B5093E800442329F790324C
:1021A00019F33FC01397D1F5313001F540E45EEFEC
:1021B0008091E800282F30E0C90185709070892B4C
:1021C000B9F322FD2EC0942F413208F090E2892FFE
:1021D00003C01092F10081508823D9F7491B509316
:1021E000E800442329F7903219F31BC03930B1F4C9
:1021F00090E42BEF8091E80082FFFCCF2093E80071
:10220000892F913208F080E2981BA1F78091E800B5
:1022100080FFFCCF8EEF8093E80003C081E28093C3
:10222000EB00FF91EF91DF91CF91BF91AF919F9123
:102230008F917F916F915F914F913F912F910F906F
:102240000FBE0F901F901895FC01809142018823CA
:1022500039F12FB7F8946093440185E08093E90049
:1022600095E08091E80085FF02C090E40EC02FBF8A
:10227000809144018823A9F080914201882381F054
:102280002FB7F8949093E900ECCF8091F1008193FF
:102290009150D9F78BE68093E8002FBF80E4089532
:1022A0008FEF0895FC0180914201882339F12FB707
:1022B000F8946093430184E08093E90094E0809176
:1022C000E80085FF02C090E40EC02FBF809143015B
:1022D0008823A9F080914201882381F02FB7F894D8
:1022E0009093E900ECCF81918093F1009150D9F760
:1022F0008AE38093E8002FBF80E408958FEF08956C
:10230000AACB0895982F8A3010F087E301C080E3AC
:10231000890FA1CB1F93182F82958F70F3DF812F28
:102320008F70F0DF1F9108951F93182F892FF2DF10
:10233000812FF0DF1F9108951F93CF93DF93EC015E
:10234000FE0121961491112339F01A3011F48DE019
:1023500082DB812F80DBF4CFDF91CF911F91089535
:10236000382F20917001E0916D01F0916E0190E0A5
:1023700009C0DF0180813296831719F411968C9180
:1023800008959F5F9217A8F380E008950F931F931D
:10239000CF93DF93182F062F809173018823B1F11B
:1023A000662349F0E0917501F0917601E10FF11D8E
:1023B000809174018083C12FD0E0E0917501F0918C
:1023C0007601EC0FFD1F8081CBDF282F8823F1F0F1
:1023D000809173018217D0F081E090E0821B910917
:1023E000880F991FE0917101F0917201E81BF90BC0
:1023F0000190F081E02DEC0FFD1F8081882311F00A
:10240000E82F09C0C656DE4FE88105C0E12FF0E095
:10241000E656FE4FE0812E2F30E0C901887F907094
:10242000803D9105D9F440917401277030700023EC
:1024300049F081E090E002C0880F991F2A95E2F7E9
:10244000482B09C081E090E002C0880F991F2A95AF
:10245000E2F78095482340937401E0E08E2FDF91EE
:10246000CF911F910F91089510926F0110927001FA
:102470001092730110926E0110926D011092720110
:102480001092710110927601109275010895ECDF9F
:1024900080E08150E82FF0E0E656FE4F80838823ED
:1024A000C1F70895382F2091700180916F0128178E
:1024B00078F4822F90E0880F991FE0916D01F091E0
:1024C0006E01E80FF91F308361832F5F2093700145
:1024D0000895109274018091750190917601892B75
:1024E00059F080E08150E0917501F0917601E80F9C
:1024F000F11D10828823B1F70895AF92BF92CF9259
:10250000DF92EF92FF920F93DF93CF9300D0CDB77E
:10251000DEB75C01E62E80917301841770F14423CD
:1025200029F46AE9C62E61E0D62E0EC081E090E063
:10253000841B9109880F991FE0917101F09172013C
:10254000E81BF90BC080D18000E015C0C5010196E1
:102550009A838983C5010E94F21BF82EE2E0F0E025
:10256000AE0EBF1E89819A810E94F21BF601EF0D0B
:10257000F11D80830F5F0E1548F30F900F90CF91E0
:10258000DF910F91FF90EF90DF90CF90BF90AF90D1
:102590000895EF92FF920F931F93CF93DF93E82E4E
:1025A000F62E662309F44FC080E091E05BD890934B
:1025B0007601809375018DDFCF2DD0E00E2D10E0D8
:1025C000CE019695982F8827979587958C0F9D1FFC
:1025D000800F911F880F991F45D89C0190936E0121
:1025E00080936D01009711F480E02EC0E0926F019E
:1025F000F0927301C801880F991F820F931F909367
:102600007201809371019E01220F331F280F391F21
:1026100090E040E050E015C0E0917101F09172014E
:10262000E40FF51F3183208380E08150F901E80F2A
:10263000F11D10828823C9F720503F4F9F5F4E5FE6
:102640005F4F9F1548F381E0DF91CF911F910F916C
:10265000FF90EF90089581E080937C01089510929F
:102660007C010895582F40917B01E0917801F09111
:10267000790130E014C08081851779F4818122814D
:10268000922F90959823962392959F70692B862779
:10269000822319F42381348106C03F5F35963417B5
:1026A00050F320E030E0C901089510927C011092AF
:1026B0007A0110927B018091780190917901892BA8
:1026C00021F010927901109278010895EECF0895CB
:1026D0001092770180919A0290919B02892B59F078
:1026E00080E08150E0919A02F0919B02E80FF11D89
:1026F00010828823B1F708957F928F929F92AF92B4
:10270000BF92CF92DF92EF92FF920F931F93CF93DE
:10271000DF93862E90907A01C0917801D091790153
:10272000AA2425E0722E3DC0B0907B01B914D9F1E6
:10273000B79C70011124EC0EFD1E8C010F5F1F4F22
:102740000E94F21BF701808368010894C11CD11C10
:10275000C8010E94F21BF701818386010F5F1F4FA2
:10276000C6010E94F21BF701828314830383780160
:102770000894E11CF11CC8010E94F21B182FC7012C
:102780000E94F21B8F731F73810F880F0894E11C46
:10279000F11C9701280F311DC901B394B0927B0140
:1027A000A394A81408F2DF91CF911F910F91FF908D
:1027B000EF90DF90CF90BF90AF909F908F907F90E1
:1027C00008951F93182F662349F080E091E00E943E
:1027D000320B90939B0280939A027ADF85E0189FD8
:1027E000C00111240E94320B9093790180937801EB
:1027F000009711F480E005C010937A0110927B01DC
:1028000081E01F910895BF92CF92DF92EF92FF92E5
:102810000F931F93CF93DF93C62EB42E8C010F5FBF
:102820001F4FE0D7F82EE8012196C801DBD7D82E3C
:102830008F2D8F73BB2011F0E82E1BC04FE3E42EC9
:10284000ED2090E0880F991FC80FD91FD7FE11C047
:1028500084E86C2D3BD60DC08E010F5F1F4FCE015B
:10286000C1D7F82E2296C801BDD7682F8F2D2ED63E
:10287000EA94EE2089F7BB2029F4D7FE03C088E054
:1028800060E024D6DF91CF911F910F91FF90EF90E0
:10289000DF90CF90BF900895FF920F931F93082F62
:1028A000F62E10917701E0919A02F0919B023097F9
:1028B00061F0662319F0E80FF11D1083E0919A0290
:1028C000F0919B02E00FF11D108180917C01882323
:1028D00051F0802F612FC6DE009729F0612F4F2D18
:1028E00092DF51E001C050E0202F30E0C901887F25
:1028F0009070803E9105D1F440917701277030703F
:10290000FF2049F081E090E002C0880F991F2A95CE
:10291000E2F7482B09C081E090E002C0880F991FC0
:102920002A95E2F78095482340937701852F1F91E0
:102930000F91FF90089580917D0190E0882309F424
:1029400091E0892F08959C0151E050939F0280915E
:102950007D01882311F08FEF0895F99B02C08EEF5F
:10296000089570939D0260939C023093A10220937E
:10297000A00240939E0250937D01FB9A80E008954F
:102980001F920F920FB60F9211242F933F934F93E4
:102990005F936F937F938F939F93AF93BF93EF93C7
:1029A000FF9380919E02882329F180919F028823C2
:1029B00091F180919C0290919D0214D724C0809146
:1029C0009E02815080939E028091A0029091A1026C
:1029D00001969093A1028093A00280919C02909115
:1029E0009D02019690939D0280939C0280919E028D
:1029F000882321F4FB9810927D0132C080919C02C3
:102A000090919D02EFD6982FE091A002F091A10243
:102A100080819817A1F280919C0290919D0292BDB5
:102A200081BDE091A002F091A102808180BDFA9A5F
:102A3000F99A80919E02815080939E028091A0021B
:102A40009091A10201969093A1028093A00280919F
:102A50009C0290919D02019690939D0280939C020E
:102A6000FF91EF91BF91AF919F918F917F916F9166
:102A70005F914F913F912F910F900FBE0F901F903C
:102A80001895E2E0F0E089E080935700849183FD9F
:102A90003FC0F89481E08093E00080E28093D8000A
:102AA0001092C90080E29EE40197F1F71DBA1092DE
:102AB00068001CBC10BE1FBA10927A0010926E0003
:102AC00010926F0010927000109271001092C90065
:102AD0001092BC0011B814B817B81AB81DB810BAC3
:102AE00012B815B818B81BB81EB811BAE3E0F0E078
:102AF00089E08093570084918670869593E08927BA
:102B0000E0E0FCEF02C0EE0FFF1F8A95E2F70995A7
:102B100008958093820170938401609383010895E6
:102B2000282F285D69F081E090E002C0880F991F8E
:102B30002A95E2F720911F01282720931F0108956D
:102B400081E080931F0108951F9380E090E04AD6B2
:102B5000182F81E090E046D620E093E4982783E5A3
:102B60008127982B09F421E0822F1F910895ECDF33
:102B7000882389F082E090E03DD69C01009759F0CF
:102B8000275F374044F484E090E02CD6813019F47C
:102B900086E090E027C680E00895EF92FF920F93C1
:102BA0001F93CF93DF93E62E142F00E020C0153043
:102BB00010F1EC012496039615D6F82ECE0112D60C
:102BC000982F9F7329F0809181018F5F80938101FD
:102BD0002F2D2F73290F220F412F4550421758F0E8
:102BE000CE010196820F911D142F121B0F5F0E153F
:102BF000F0F281E001C080E0DF91CF911F910F9151
:102C0000FF90EF90089583E090E060E0F8D582E0D7
:102C100090E060E0F4D581E090E063E4F0D580E0FE
:102C200090E063E5ECC590DF882309F4ECCF0895CC
:102C3000AF92BF92DF92EF92FF920F931F93CF93C9
:102C4000DF93E62ED42EEC012196CE01CBD5082FB2
:102C5000182F1770DD2081F4113041F0113018F079
:102C6000123051F406C081EF95E005C089EE95E081
:102C700002C081EE95E060DB402F50E020911F0103
:102C800030E0CA0188739070E3E095958795EA95E6
:102C9000E1F702C0359527958A95E2F720FD06C039
:102CA000DD2009F0AEC088ED95E02FC021967EEFC3
:102CB000F72EFE0C06FF19C0CE0194D590E02091AE
:102CC000820130E02150304002C0959587952A95C9
:102CD000E2F780FD06C0DD2009F093C082ED95E0AB
:102CE00014C021966DEFF62EFE0C07FF13C0CE0127
:102CF00081D520918301309184018217930739F0A7
:102D0000DD2009F07EC08DEC95E016DB7AC02296BE
:102D10002EEFF20E113009F43BC0113020F01230CA
:102D200009F068C052C0CE015DD5482FA82EBB2443
:102D30009501220F331FFA948F2D90E02817390741
:102D400019F086EC95E055C0DD2029F480917E01D4
:102D5000840F80937E01219600E010E015C0CE0123
:102D600041D5F82ECE0101963DD5682FDD2019F012
:102D70008F2D98DB06C080917F01861710F4609339
:102D80007F0122960F5F1F4F0A151B0544F339C0C0
:102D90008E010F5F1F4FCE0125D5E82EC80122D529
:102DA000682F90E0880F991F2EEFF20E2F2D30E044
:102DB0008217930719F08FEB95E01BC0DD2009F116
:102DC000C80101964E2D99DB1CC08E010F5F1F4F6D
:102DD000CE0108D5E82EDD2021F0C8016E2D8CDC57
:102DE00010C0C8016E2D4F2DD8DE882329F488EB42
:102DF00095E0A2DA80E006C0809180018E0D80937C
:102E0000800181E0DF91CF911F910F91FF90EF90B2
:102E1000DF90BF90AF900895EF92FF920F931F93B2
:102E2000CF93DF9353DC33DB0E94530B10927E0170
:102E300010927F01109280011092810185DE88231B
:102E400009F49AC082E090E0D5D48C01FCEFEF2E1B
:102E5000FFEFFF2EE80EF91E8AEA95E06DDAC70152
:102E600063DA8AE04DDA05501040065F174008F03B
:102E700083C084E090E0B6D4813009F07DC085E065
:102E800090E0B0D4823008F077C0C8E0D0E020C035
:102E9000CE01A8D4182F3EDA80E432DACE0144DA2B
:102EA00080E22EDA153018F483EA95E042C0CE01B4
:102EB000612F40E0BDDE882319F48BE995E039C02D
:102EC0008AE01EDA812F90E0C80FD91FE81AF90AAC
:102ED0001E141F04ECF28FE895E02EDA80917E013B
:102EE00019DA8AE00DDA83E895E026DA80917F012D
:102EF00011DA8AE005DA84E795E01EDA8091800134
:102F000009DA8AE0FDD980917E0160917F0141DB81
:102F1000882319F485E695E00CC0809180016091CA
:102F200081014FDC882339F49FDA0E94530B86E538
:102F300095E002DA21C08BE495E0FED982E090E0D2
:102F400059D48C0104501040C8E0D0E00FC0CE012D
:102F500049D4F82ECE016F2D41E06ADE882361F05E
:102F60008F2D90E0C80FD91F081B190B10161106E2
:102F700074F371DB81E001C080E0DF91CF911F919C
:102F80000F91FF90EF900895CF92DF92EF92FF9212
:102F90000F931F93CF93DF93C090890123E0C21654
:102FA00009F413C12C1540F081E0C81609F4DAC009
:102FB0008C1508F4DDC00CC0E5E0CE1609F451C153
:102FC000CE1608F440C1F6E0CF1609F0ACC189C1B5
:102FD00083EA92E060E038D918160CF0B6C0109180
:102FE000A302123009F43BC0133020F4113009F071
:102FF000ACC007C0133009F463C0143009F0A5C099
:1030000089C0E9EFF5E0A3EAB2E084918D933196AF
:1030100026E0E231F207C9F782E090E0EBD3EC0161
:10302000009759F084E090E0DDD3182F85E090E020
:10303000D9D31093AD028093AE02882799278C1BB9
:103040009D0B8450984F8093B9029093BA020E94CE
:103050001F0B8093B3029093B40282E02AC0309198
:10306000A50220E08091A40290E0822B932B909304
:103070008B0180938A01875F9740D0F484E090E0D1
:1030800090938D0180938C0110928F0110928E018C
:103090008EE891E062E070E042E055DC882341F484
:1030A0001093A20282EA92E060E0FCD8D8DA5EC017
:1030B00081E08093A20282EA92E060E0F3D845C00A
:1030C00082E090E090938D0180938C018AE891E0FA
:1030D00062E070E042E050E075D320918A013091C7
:1030E0008B01F7E0273F3F0718F780918C01909103
:1030F0008D01029690938D0180938C012093A30201
:103100003093A40282E08093A20282EA92E060E01F
:10311000C9D8E5C08FB7F8942091360130913701B6
:1031200040913801509139018FBF20939001309325
:103130009101409392015093930182E08093A20207
:1031400082EA92E060E0AED8E8C090911F018091E1
:103150001E01981709F4E4C05FDE80911F0180937F
:103160001E01DEC0E8DB882309F04EC081E0D9C033
:1031700083EA92E060E068D818160CF04CC08091A9
:10318000A302823809F057C01091A402212F30E029
:1031900080918A0190918B018217930708F44BC0AC
:1031A00060918C0170918D0187EA92E0412FCBDB19
:1031B000882309F040C01093940182E08093A2021A
:1031C00082EA92E060E06ED803C0B5DB882311F498
:1031D00083E0A7C0C0918C01D0918D01D090940163
:1031E000A7EAEA2EA2E0FA2E8E0109C0C801FAD29F
:1031F000F70191917F018917F1F40F5F1F4F802F25
:103200008C1B8D1598F3BDC083E08093A20282EAE7
:1032100092E060E047D882E084C024503040309390
:103220008F0120938E018EE891E062E070E042E031
:103230008ADB882359F081E08093A20282EA92E03F
:1032400060E030D86DC077DB882311F484E069C07A
:1032500084E08093A20282EA92E060E023D8DCDD81
:103260005FC083EA92E060E00E9424111816BCF56A
:103270008091A302833031F0843009F451C0813051
:1032800071F54EC000918A0110918B010115110555
:1032900031F10134110508F000E410E060918C0177
:1032A00070918D0183EA92E0A8018CD283EA92E0CA
:1032B00060E00E94521180918A0190918B01801BE5
:1032C000910B90938B0180938A0180918C01909156
:1032D0008D01800F911F90938D0180938C0185E06B
:1032E00020C08FB7F894209136013091370140917A
:1032F0003801509139018FBF8091900190919101D7
:10330000A0919201B0919301281B390B4A0B5B0BE2
:10331000295E33404040504010F486E002C0B1DBEB
:1033200080E0809389018FB7F89420913601309125
:10333000370140913801509139018FBF8091890147
:10334000882311F08C1549F0209385013093860174
:1033500040938701509388012AC080918501909104
:103360008601A0918701B0918801281B390B4A0B77
:103370005B0B2958334140405040C8F010928901FE
:1033800016C02D2D30E080918A0190918B01821B17
:10339000930B90938B0180938A012C0F3D1F3093E8
:1033A0008D0120938C01892B09F02ECF36CFDF9130
:1033B000CF911F910F91FF90EF90DF90CF900895E4
:1033C000982F977021E030E001C0220F9A95EAF71C
:1033D00086958695869590E0662351F0FC01ED5127
:1033E000FD4F9081822F892379F4292B2083089522
:1033F000FC01ED51FD4F9081822F892329F020950A
:103400002923208380E0089581E00895809141017F
:1034100008958091190108950E94710B04DC37C84A
:10342000E3EEF2E0119283E0E330F807D9F751D8E8
:103430004FD987C08BE060E049C01F93182F60E030
:10344000BFDF8823B9F48DE20E948011812F0E9492
:103450008A1180E20E948011812F60E00E94C611D3
:10346000182F882339F060E017DA882319F483E0F5
:10347000612F2CD01F9108951F93182F61E0A0DFBA
:103480008823B9F48BE20E948011812F0E948A1157
:1034900080E20E948011812F61E00E94C611182FE6
:1034A000882339F061E0F8D9882319F482E0612F8C
:1034B0000DD01F9108958091960190E00197209181
:1034C0009501821B910960E570E055C10F931F9330
:1034D000082F162FF0DF8823B1F08091950190E03E
:1034E000FC01EE0FFF1FE55FFC4F412F50E0302F36
:1034F00020E0422B532B51834083019660E570E01E
:103500003AD1809395011F910F9108959091960162
:1035100080919501891719F4E0E0F0E010C0892F3F
:1035200090E0FC01EE0FFF1FE55FFC4F0190F08182
:10353000E02D019660E570E01ED180939601CF01E9
:103540000895809195018093960108950F931F939C
:1035500080913D01882321F480913E01882391F0E0
:1035600080913E01882309F003C1909195018091DB
:103570009601981709F4FCC00E948F0B8AE0809393
:103580009801F6C080919801882361F08150809362
:103590009801882309F0ECC043DF0E945A0B809306
:1035A0009901E6C0E0919601809195018E1719F47A
:1035B000E0E0F0E008C0F0E0EE0FFF1FE55FFC4F39
:1035C0000190F081E02D8F01F7FF0FC090919701DE
:1035D000983050F4E92FF0E0ED5FFC4F809140010E
:1035E00080839F5F909397011F77113091F11A307C
:1035F00009F48EC08BDF163009F469C0173090F4DF
:10360000133009F44AC0143030F4113011F1123083
:1036100009F09AC02EC0143009F452C0153009F0D8
:1036200093C051C0193009F467C01A3038F417300C
:1036300009F452C0183009F087C052C01B3039F06D
:103640001B3008F465C01C3009F07EC077C010E064
:1036500077C0E0919601809195018E1751F0F0E0CE
:10366000EE0FFF1FE55FFC4F802F90E0936091838A
:103670008083802F887F883D19F4802F51DA64C0C1
:1036800084E60E948011802F0E948A1180E20E94AD
:103690008011802F0E94A00B11C0802F887F883D51
:1036A00009F452C085E70E948011802F0E948A1180
:1036B00080E20E948011802F0E941E0C982F45C02E
:1036C0000093400123C080914001802B1DC00095D4
:1036D00080914001802318C080914001802714C050
:1036E000E0919701EE2381F1E150E0939701F0E042
:1036F000ED5FFC4F808108C080919701882321F104
:1037000010929701809103038093400193E01DC0C4
:10371000902F915089F0E0919601809195018E173C
:1037200099F0F0E0EE0FFF1FE55FFC4F892F90E06E
:103730009A609183808308C0E9DE06C071DE11E0E3
:103740000E945A0B982F02C090E010E080919901DE
:10375000892B80939901882321F00E94910C8093FA
:103760009901112329F080E29EE40197F1F789D9AC
:103770001F910F91089597FB092E07260AD077FD18
:1037800004D00CD006D000201AF4709561957F4FBC
:103790000895F6F7909581959F4F0895AA1BBB1B3E
:1037A00051E107C0AA1FBB1FA617B70710F0A61B41
:1037B000B70B881F991F5A95A9F780959095BC0162
:1037C000CD010895DC01CB01FC01F999FECF06C0C3
:1037D000F2BDE1BDF89A319600B40D9241505040CF
:1037E000B8F70895F999FECF92BD81BDF89A99274F
:1037F00080B50895A8E1B0E042E050E0E5CF262F83
:10380000F999FECF1FBA92BD81BD20BD0FB6F894C5
:0E381000FA9AF99A0FBE01960895F894FFCF28
:10381E0004E11477E1F014F0770AFE0101FFFF01D5
:10382E00FFFFFFFF7F0000AB03017D7D7D7D01016A
:00000001FF

View File

@ -0,0 +1,901 @@
:1000000012C300002CC300000C94220928C3000076
:1000100026C3000024C3000022C3000020C3000048
:100020001EC300001CC300000C94830D0C94AD0E85
:1000300016C3000014C3000012C3000010C3000068
:100040000EC300000C9462090AC3000008C300003C
:1000500006C300000C94D60A02C3000000C30000CF
:10006000FEC20000FCC20000FAC20000F8C200009C
:10007000F6C20000F4C200000C94C314F0C20000E9
:10008000C7C50000ECC20000EAC20000E8C20000E0
:10009000E6C20000E4C20000E2C20000E0C20000CC
:1000A000DEC20000DCC20000DAC2000000291E1F10
:1000B00020212223242526272D2E2A2B141A081529
:1000C000171C180C12132F3028E0041607090A0B0E
:1000D0000D0E0F333435E1311D1B06190511103695
:1000E0003738E555E22C393A3B3C3D3E3F404142F2
:1000F0004353475F6061565C5D5E57595A5B62636C
:10010000C2BE64444567B0B28CB7B8B9BABBBCBD17
:1001100068696A6B6C6D6E6F707172C188B1B387FC
:10012000B4B57393928ABF8BB68985C00142003EF5
:100130003C3A3B456843413F3D2B356769E2E188E6
:10014000E0141EB06AB11D16041A1FB26B061B071D
:100150000821208C6C2C1909171522B76D11050B7D
:100160000A1C23B86EB3100D182425B96F360E0C77
:10017000122726BA7037380F33132DBB718734B46A
:100180002F2EBC7239E52830B531BD73BE64939211
:100190008ABF2A8BB659895C5F85C0C162635A5D8C
:1001A0005E60295344575B5655614700000000408C
:1001B000C20000000000000000000000000000007D
:1001C00000F9E60000E4E90000FF00000000000084
:1001D000E3FEF000EC000000E7FD0000F700000087
:1001E00065FC00EF00EB000066FB00FAEA0000008F
:1001F000A9F800000000000000F600540000E8002C
:1002000000F500000000000000000058000000AAF7
:10021000000000000000000000004D00504A0000F7
:1002200000494C51004F52000000004E00464B4820
:1002300001BF00BBB9B7B83A68C0BEBCBA2B353BEA
:1002400069E0E16439141E3C6AE21D16041A1F3D80
:100250006B061B070821203E6C2C19091715223F3D
:100260006D11050B0A1C23406EE6100D1824254164
:100270006F360E0C122726427037380F33132D437A
:10028000718734322F2E4472E4E52830318945736A
:10029000515093524C4D2A49B6594F5C5F4E4A4BD0
:1002A00062635A5D5E602953B2575B5655614700E1
:1002B000000000BDC20A4D6F64653A2041542F50C2
:1002C00053320A0A000A4D6F64653A2050432F5892
:1002D000540A0A00756E6B6E6F776E0032202865C7
:1002E0007874656E6465642900436F6465205365A6
:1002F000743A20004B6579626F6172642049443A18
:100300002000000100006C0312000200007E037454
:1003100000220000F20312002100009003090022D5
:10032000010004041500210100A9030900220200B4
:100330001904DC00210200C2030900220300F504B5
:100340001C00210300DB0309000300001105040168
:1003500003090415050E0203090425053801C10629
:1003600001C12601C12601C13601C03612010002B9
:1003700000000020C0167D040001010200010902F6
:100380007400040100A0320904000001030101000F
:100390000921110100012212000705810308000153
:1003A00009040100010300000009211101000122DC
:1003B0001500070583032000010904020001030062
:1003C000000009211101000122DC0007058203174A
:1003D00000010904030002030000000921110100CB
:1003E00001221C00070584034000020705050340A5
:1003F000000805010906A101150026FF00950875F2
:10040000088103C00631FF0974A153750815002641
:10041000FF00952009758102C005010906A101852B
:100420000175019508050719E029E71500250181E7
:1004300002950575010508190129059102950175B7
:10044000039103750195310507190129311500251F
:1004500001810295017501810375019569050719EF
:1004600033299B15002501810295017501810375D2
:100470000195080507199D29A415002501810295FC
:100480000475018103C005010980A1018502750180
:1004900095031981298315002501810295057501B0
:1004A0008103C0050C0901A1018503750195180997
:1004B000B509B609B709CD09E209E509E709E9096E
:1004C000EA0A52010A53010A54010A55010A83013A
:1004D0000A8A010A92010A94010A21020A23020AE5
:1004E00024020A25020A26020A27020A2A02150005
:1004F00025018102C00699FF0A6824A1017508152B
:100500000026FF00954009018102954009029102F1
:10051000C0040309040E0353006F006100720065FC
:100520000072000000380353006F00610072006524
:100530000072002700730020004B00650079006204
:10054000006F00610072006400200043006F006EC5
:1005500000760065007200740065007200000061A2
:100560006C6C6F63206F6B2E0A00616C6C6F632084
:100570006661696C65642E0A00616C6C6F6320664D
:1005800061696C65642E0A00746F74616C5F6D61E3
:1005900063726F733A20006D61785F6C6179657288
:1005A0003A20006C61796572646566733A200021B7
:1005B0006170706C790A006C656E3C350A000A0A3D
:1005C00072656D61696E696E673A20006572726F5F
:1005D0007220006572726F7220006572726F7220F5
:1005E0000021696420002173657420002173656C0B
:1005F00065637420006D6163726F73200072656DB6
:1006000061707320006C61796572732000030100D2
:1006100001010C02010104000005000507000006AD
:1006200000020800000011241FBECFEFD5E0DEBF9E
:10063000CDBF11E0A0E0B1E0E0E2F8E302C0059038
:100640000D92A032B107D9F713E0A0E2B1E001C0EA
:100650001D92AB3AB107E1F7A6D00C940E1CD0CC9A
:1006600090910001923021F1933018F4913041F5CE
:1006700005C0933059F0943019F510C087FD20C0A3
:10068000E82FF0E0E455FF4F849108958538C0F4D9
:10069000E82FF0E0E05DFD4F84910895662341F07E
:1006A0008F3770F4E82FF0E0EF54FE4F84910895F7
:1006B000853830F4E82FF0E0E45DFE4F8491089532
:1006C00080E008950E94111A0E941B1A10922201C4
:1006D000109223011092240108951F93182F0E9455
:1006E0000A1A212F30E0882361F080B3806E80BB2E
:1006F00081B345E0220F331F4A95E1F78F71822BBA
:100700000BC080B395E0220F331F9A95E1F78F71EC
:10071000822B80BB81B3806E81BB1F910895A0DFC7
:100720000C941E1A9DDF0C943D1ACF92DF92EF922B
:10073000FF920F931F93CF93DF93ABD2082F80913B
:100740002601802739F1C0E0D0E01BEAC82EDD2465
:10075000E02EFF24C6010C2E02C0959587950A94C1
:10076000E2F780FF10C0C7010C2E02C09595879557
:100770000A94E2F780FF04C0812F0E941E1A03C072
:10078000812F0E943D1A21961F5F103B19F700939D
:10079000260181E0DF91CF911F910F91FF90EF90A3
:1007A000DF90CF9008952F923F924F925F926F9279
:1007B0007F928F929F92AF92BF92CF92DF92EF92F1
:1007C000FF920F931F93DF93CF9300D00F92CDB77B
:1007D000DEB780E88093610010926100569A80E055
:1007E0007CDF87E07ADFD4D60E940D1A56D536D248
:1007F00069DF80E076D23324882499245524AA2402
:10080000BB24650114E0412EB2E02B2E3320A1F46D
:100810002FB7F8948091360190913701A09138015B
:10082000B09139012FBF855F9140A040B04020F0CA
:1008300081E057D233243394882009F0E5C02FB7E4
:10084000F8948091360190913701A0913801B091D0
:1008500039012FBF895B9B40A040B04008F4D4C051
:100860000E94B815982F9F7099F082958F7059F457
:1008700090930001913019F42092290161C081E028
:10088000809329015DC0809329019093000158C095
:100890001092000110922101109220018EEE62E36D
:1008A0004DD5823009F041C082E3F3D581E08093D9
:1008B000290180910001882309F03CC082EF62E3A6
:1008C0003DD5182F8230B1F582E3E3D58A3F91F50B
:1008D000CE01029662E383D5823021F5CE010396E4
:1008E00062E37DD59A818230B1F49B3A31F48B81F9
:1008F000853819F04092000103C083E08093000125
:10090000792E66248B8190E0862997299093210186
:10091000809320010FC0409200019093200110921B
:10092000210108C01093000105C02092290181E037
:100930008093000180910001882311F4409200010E
:100940006091200170912101809100010E948A151F
:100950000E940D1780912901823011F4F0D1F5D158
:1009600080910001833011F488EFE6D580E0B5DE98
:100970008FB7F894A0903601B0903701C09038013D
:10098000D09039018FBF8AE00E9483118AE00E94D3
:10099000831184EF92E00E949F1180912001909139
:1009A00021010E9497118AE00E94831189EE92E052
:1009B0000E949F1180910001823061F0833018F411
:1009C000813089F405C0833049F0843061F408C077
:1009D00081E301C082E30E94831109C083E3FBCF5E
:1009E0008CED92E002C084ED92E00E949F11809114
:1009F0002901823019F485EC92E002C085EB92E087
:100A00000E949F1188248394CE01019660E0E7D470
:100A1000882009F4DDC0823008F485C0823009F0F6
:100A20006DC0198180910001813069F41F3F09F484
:100A30004EC017FF05C0812F8F7760E070DE64C065
:100A4000812F60E013C090912401992309F1E92FCF
:100A5000F0E0EF5FFE4F8081181799F4E92FEF5F08
:100A6000E0932401E33021F48EE761E05BDE4CC0CB
:100A7000E83009F049C08EE761E051DE10922401B0
:100A800043C0933018F08EE761E049DE10922401F4
:100A9000103E91F0113E28F41123C9F01A3AE1F406
:100AA00033C0103F29F01C3F79F0113EA9F408C073
:100AB00081E08093220128C081E08093230124C03B
:100AC00081E08093240120C080E197E203C0FADD39
:100AD00088E893E158D518C080912201882339F025
:100AE000812F609123011BDE1092220104C0812F0F
:100AF0006091230117DE1092230106C08EEF62E39E
:100B00001DD49924939401C099248FB7F894A09090
:100B10003601B0903701C0903801D09039018FBFB5
:100B20005524539471C0882309F06EC0992009F0B0
:100B30006BC00E94071A182F0E940A1A082F0795E7
:100B400000270795012B80912501081709F45CC047
:100B5000FF24F394F022E02EE69421E0E222102F0D
:100B600016951695117080912001909121016F2D9D
:100B700070E02E2D30E0805B9F4B41F4660F771FB5
:100B8000660F771F612B220F331F07C0660F771F79
:100B9000612B220F331F220F331F622B8DEE93D454
:100BA000FF0CFE28110F110F812F8F2996DD009366
:100BB00025012AC08FB7F894A0903601B090370174
:100BC000C0903801D09039018FBF5524539402C092
:100BD0005520B9F02FB7F8948091360190913701E4
:100BE000A0913801B09139012FBF8A199B09AC0936
:100BF000BD09C397A105B10520F08AE00E948311C9
:100C000055240E94C51702CE90DD882399F6E0CFC7
:100C10001F920F920FB60F9211248F939F9393B14F
:100C20009F7180912801981729F0909328018AE0FC
:100C30008093090180910901882349F081508093B4
:100C40000901882321F480912801809327019F9135
:100C50008F910F900FBE0F901F90189584B1807EDA
:100C600084B985B18F6185B9E1E7F0E08081826068
:100C700080838AEF90E0909399008093980010927F
:100C80009000E1E9F0E088E08083808183608083E8
:100C900008958091270108959C0180918100887FAB
:100CA0008093810080916F008D7F80936F00109200
:100CB00085001092840082E086BB2115310581F009
:100CC000220F331F309389002093880080916F009A
:100CD000826080936F0080918100826080938100A8
:100CE0000895882319F027982F9A08952F98279A06
:100CF0000895882319F05098589A08955898509A52
:100D00000895382F4DB3E9980000882319F05198C1
:100D1000599A02C0519A599824E189B190E0969568
:100D200087958170831711F02150B9F782E08CBB51
:100D300041FF02C0E99A01C0E9988DB30895F89483
:100D4000E99882E08CBB78940895F894E9E6F0E0A5
:100D500080818C608083E99A78940895882321F0BB
:100D6000809111018093120189B190E09695879549
:100D7000982F9170809112018F3F21F481E0892793
:100D80008093120180911201813089F0813018F036
:100D90008E3FB9F419C09923C9F08AE590E07CDF51
:100DA0008EEF8093110181E0809312010AC0992394
:100DB00069F488EE93E070DF8FEF80931101109259
:100DC000120191E0892F089592E001C094E08FEF25
:100DD00080931201F7CF1F9319B11170882321F06E
:100DE00080910A0180930B0180910B018230F1F018
:100DF000833020F4813009F04BC006C0833079F194
:100E00008E3F09F045C03AC08EEF80930A0180EB17
:100E100094E042DF10922D0110922C01112311F465
:100E200016E02DC082E080930B0132C01795112788
:100E3000179580912C018695182B10932C01809189
:100E40002D018F5F80932D01883011F513E01093F1
:100E50000A0188E790E020DF10930B0119C080E0C1
:100E600090E01ADF80912C0180932A0112E007C0E4
:100E700088EB9BE088D310932B010AC015E080E03B
:100E800090E00ADF81E080930B01123089F7F3CF05
:100E90001F9108950F931F93982F80910E018F3FFC
:100EA00019F482E080930E01992321F080910D01C5
:100EB00080930E0180910E01873009F460C0883064
:100EC00088F4843009F43EC0853030F48230E9F093
:100ED000833009F081C02CC08530B1F1863009F033
:100EE0007BC04BC08A3009F45FC08B3038F4883047
:100EF00009F44FC0893009F06FC04DC08B3009F440
:100F000057C08E3F09F068C05AC080912E0180936F
:100F10002F0188E08093300181E080930C0183E011
:100F200080930D0188EC90E0B7DE80E0EADE54C0EB
:100F300080E0DFDE81E0E5DE8EEF80930D0180E270
:100F40009EE4AADE85E031C010912F01012F0170CF
:100F5000802FCFDE169510932F0180910C018027F2
:100F600080930C018091300181508093300188235F
:100F700011F084E01AC086E018C087E016C08091A6
:100F80000C01B7DE8091300181508093300188E000
:100F90000CC089E00AC081E0ACDE80913001815054
:100FA000809330018AE001C08BE080930E0114C071
:100FB00080E090E071DE48992CC012E007C01091EB
:100FC00030011295107F1560123030F081E091DE13
:100FD0008FEF80930E0119C089B120910E0130E08E
:100FE0002170307090E096958795817090702817E9
:100FF000390711F411E009C081E07BDE8FEF8093A7
:101000000E0188EB9BE0BFD214E0812F1F910F915E
:10101000089519E0DBCFFF920F931F93F9B099B1B8
:10102000882329F08FEF8093100115E07DC0809117
:1010300010018F3F19F481E080931001092F017096
:10104000109110011630E9F1173040F41430D9F046
:101050001530D8F4113009F050C008C01830D9F15B
:10106000183088F1193009F048C037C080EB94E09F
:1010700013DE109232011092310110930F01002300
:1010800009F057C01CC085E017C0902F979599278D
:101090009795809131018695982B9093310180919D
:1010A0000F01802780930F01809132018F5F809321
:1010B0003201883021F486E0809310011EC084E064
:1010C000FBCF87E0F9CF80910F01801711F017E077
:1010D00031C088E0F1CF89E0EFCF002349F0809163
:1010E000310180932A0181E08093290112E022C01E
:1010F00088EB9BE048D218E01DC02091100130E041
:10110000217030708F2D90E096958795817090704A
:101110002817390711F411E007C08FEF80931001F1
:1011200088EB9BE030D214E0812F1F910F91FF904C
:10113000089516E080E090E0AFDD8FEF809310011E
:10114000F3CFDF92EF92FF920F931F93082F82301D
:10115000F9F480912901823021F483E080933301F6
:101160006BC080913501813079F483E08093350143
:1011700080913301882319F088EB9BE004D281E051
:101180008093330100E004C081E08093340154C0B7
:10119000FF24F394A2E0DA2EF3E0EF2E80913501E4
:1011A000813031F1813030F0823081F1833009F0CB
:1011B00043C039C0802FD2DD823008F43DC0823078
:1011C00069F780913401882379F01092340180917D
:1011D0003301882319F088EB9BE0D5D1F0923301DD
:1011E000E092350100E0DACF81E08093350124C040
:1011F00049991FC080913301882319F088EB9BE047
:10120000C2D1F0922B01D0923501C8CF802F03DFDD
:10121000182F823088F0823019F088EB9BE0B3D130
:1012200010932B0106C0802F35DE823028F080938A
:10123000330110923501B2CF1F910F91FF90EF90C3
:10124000DF9008951F920F920FB60F9211242F93E3
:101250003F934F935F936F937F938F939F93AF933E
:10126000BF93EF93FF9380912901823019F480E0BE
:10127000B2DD02C080E065DFFF91EF91BF91AF91D9
:101280009F918F917F916F915F914F913F912F919E
:101290000F900FBE0F901F901895F89481E031DDEC
:1012A00081E027DD1092800088E080938100E9E6EC
:1012B000F0E08081837F84608083E99A80E041DF71
:1012C000789408951F920F920FB60F9211242F93C6
:1012D0003F934F935F936F937F938F939F93AF93BE
:1012E000BF93EF93FF9380918100887F809381006B
:1012F00080916F008D7F80936F00000010928500B9
:101300001092840082E086BB80912901823019F41A
:1013100081E061DD02C081E014DFFF91EF91BF91B8
:10132000AF919F918F917F916F915F914F913F917D
:101330002F910F900FBE0F901F901895DF92EF9294
:10134000FF920F931F93182FD62E80912901823080
:1013500011F480E03EC087E7D6D7812FDED780E248
:10136000D2D7F89410932E011092330182E0E9DE77
:1013700078948FB7F894E0903601F090370100919F
:101380003801109139018FBF4D2D50E060E070E0C1
:1013900018C0DD20B1F02FB7F894809136019091FC
:1013A0003701A0913801B09139012FBF8E199F09E3
:1013B000A00BB10B481759076A077B0710F48AE0A6
:1013C00008C080913301823020F380913301109264
:1013D00033011F910F91FF90EF90DF900895DF92FE
:1013E000EF92FF920F931F93CF93DF93EC018FB790
:1013F000F894E0903601F090370100913801109197
:1014000039018FBFD0902B016623C1F41FC02FB7C5
:10141000F8948091360190913701A0913801B091F4
:1014200039012FBF8E199F09A00BB10B481759071F
:101430006A077B0728F1D0902B0104C0462F50E0AB
:1014400060E070E081E08D1510F703C081E08D153C
:10145000B8F410912A0110922B0182E0D81651F4B1
:1014600082E751D7812F59D780E24DD7209741F09D
:10147000188306C082E547D78D2D4FD780E243D72A
:101480008D2DDF91CF911F910F91FF90EF90DF9005
:1014900008951F93DF93CF930F92CDB7DEB7682FD8
:1014A000CE0101969CDF182F823039F0198282E537
:1014B0002AD781E328D7812F30D789810F90CF9108
:1014C000DF911F910895EF92FF920F931F93E82EE3
:1014D000F62E80912901823049F103E08E2D62E3DE
:1014E0002DDF182F8230D1F482E3D3DF182F8A3F0B
:1014F00069F48F2D62E322DF182F823059F482E3E2
:10150000C8DF182F8A3F11F481E011C081E2FBD6B9
:1015100081E207C087E5F7D682E303C087E5F3D60B
:1015200081E3F1D6812FF9D60150C1F680E01F91F9
:101530000F91FF90EF900895FF920F931F93F82E55
:10154000809129018230D1F003E08F2D62E3F6DE35
:10155000182F823059F482E39CDF182F8A3F11F450
:1015600081E00DC081E2CFD681E203C087E5CBD612
:1015700080E3C9D6812FD1D6015039F780E01F9181
:101580000F91FF90089590933B0180933A01089545
:10159000EEE6F0E08081826080838AEF87BD82E0A2
:1015A00084BD15BC85B5836085BD08951F920F92DB
:1015B0000FB60F9211242F933F934F935F936F9326
:1015C0007F938F939F93AF93BF93EF93FF938091FC
:1015D000360190913701A0913801B09139010196FF
:1015E000A11DB11D8093360190933701A09338015E
:1015F000B093390180913A0190913B01009729F015
:10160000019790933B0180933A0180913C0188239C
:1016100041F481E080933C0178940E94A71A1092D3
:101620003C01FF91EF91BF91AF919F918F917F917D
:101630006F915F914F913F912F910F900FBE0F903F
:101640001F90189520911501309116012115310533
:1016500021F42DB73EB72052304080911701909170
:101660001801281B390BC9010895AC0120911501FF
:10167000309116012115310521F42DB73EB72052C6
:1016800030408091170190911801281B390B2417C5
:10169000350718F420E030E007C0480F591F509379
:1016A0001801409317019C01C90108958BEA93E04A
:1016B0009093180180931701089510924901109298
:1016C0004A0110924B0110924C0110924D01109260
:1016D0004E01E2E5F1E0119281E0ED36F807D9F72D
:1016E000109240018FE00895E8DF81E08093D700F9
:1016F00080EA8093D80082E189BD09B400FEFDCF65
:1017000080E98093D8001092E0001092420110927C
:101710003D0110923E0110923F018DE28093E20064
:101720007894089580913F01882361F080913E0173
:10173000882341F48091E00082608093E00081E0A2
:1017400080933E010895582F382F3150343A10F0CD
:1017500040E014C0E32FE695E695E695F0E0EE5AFA
:10176000FE4F232F277081E090E002C0880F991F61
:101770002A95E2F72081282B208343E0852F885A81
:101780008330A0F4E52FE695E695E695F0E0EE5A75
:10179000FE4F252F277081E090E002C0880F991F2F
:1017A0002A95E2F72081282B20834460852F885ECC
:1017B0008831A8F4252F2853E22FE695E695E69583
:1017C000F0E0EE5AFE4F277081E090E002C0880FF3
:1017D000991F2A95E2F72081282B20834860252F26
:1017E000205E283080F481E090E002C0880F991FCD
:1017F0002A95E2F7982F882331F080914001892BB8
:101800008093400115C0343AD0F4E9E4F1E08081DE
:101810008517A9F0319681E0EF34F807C1F720E091
:1018200030E0F901E75BFE4F8081882319F4508393
:10183000436005C02F5F3F4F2630310591F7842F5D
:101840000895482F282F2150243A10F030E014C07A
:10185000E22FE695E695E695F0E0EE5AFE4F27700A
:1018600081E090E002C0880F991F2A95E2F78095E9
:1018700020818223808333E0842F885A8330A8F428
:10188000E42FE695E695E695F0E0EE5AFE4F242F1C
:10189000277081E090E002C0880F991F2A95E2F737
:1018A00080952081822380833460842F885E8831F4
:1018B000B0F4242F2853E22FE695E695E695F0E064
:1018C000EE5AFE4F277081E090E002C0880F991F0A
:1018D0002A95E2F780952081822380833860242F27
:1018E000205E283050F481E090E002C0880F991FFC
:1018F0002A95E2F7982F882319F4E9E4F1E008C06B
:1019000090958091400189238093400133600AC003
:101910008081841711F410823360319681E0EF34B6
:10192000F807B1F7832F0895982F809142018823FB
:1019300009F492C090FF2EC02FB7F89481E08093F5
:10194000E9008091E80085FF24C0809140018093E8
:10195000F1001092F100809149018093F100809193
:101960004A018093F10080914B018093F1008091B6
:101970004C018093F10080914D018093F1008091A2
:101980004E018093F1008AE38093E80010924801B1
:101990009E7F2FBF80911901882309F45CC091FFBD
:1019A00020C02FB7F89482E08093E9008091E8008E
:1019B00085FF16C081E08093F10080914001809303
:1019C000F100E2E5F1E081918093F10081E0E736FA
:1019D000F807C9F78AE38093E800109245019D7FDC
:1019E0002FBF92FF16C03FB7F89422E02093E90082
:1019F0008091E80085FF0CC02093F1008091670181
:101A00008093F1008AE38093E800109246019B7F67
:101A10003FBF93FF21C02FB7F89482E08093E90085
:101A20008091E80085FF15C083E08093F1008091EC
:101A300068018093F100809169018093F1008091A9
:101A40006A018093F1008AE38093E80010924701D5
:101A5000977F2FBF01C0917F892F0895482F8091D4
:101A60004201882309F44DC080913D01882309F08B
:101A700048C080913E01882309F043C0809119013C
:101A8000882309F43EC02FB7F89483E08093E900DF
:101A900080915101882341F08091E80085FD02C0CA
:101AA0002FBF12C0109251019091E4009C5F33E06F
:101AB0008091E80085FD13C02FBF8091E400891755
:101AC00029F481E0809351018FEF089580914201C4
:101AD0008823B9F02FB7F8943093E900E9CF409309
:101AE000F1008091E80085FD06C08AE38093E8005C
:101AF00010924F0103C082E080934F012FBF80E01E
:101B000008958FEF08951F920F920FB60F92112430
:101B10002F938F939F93EF93FF938091E100109207
:101B2000E100282F83FF17C01092E90081E0809325
:101B3000EB001092EC0092E29093ED0098E090930D
:101B4000F0001092420110923F0110923D0110925C
:101B50003E018093190120FF08C08091E20080615E
:101B60008093E20081E080933D0124FF0BC08091CF
:101B70003D01882339F08091E2008F7E8093E2005E
:101B800010923D0125FF02C010923E0122FFDBC0F2
:101B900080914201882309F4D6C0809119018823DD
:101BA000B1F080914F01882391F0815080934F01D3
:101BB000882369F483E08093E90002C01092F10069
:101BC0008091E80085FDFACF8AE38093E800809158
:101BD0001901882371F080914401882319F0815004
:101BE0008093440180914301882319F081508093B0
:101BF0004301809150018F5F8093500190E083708A
:101C00009070892B09F09FC090911D01992389F153
:101C100081E08093E9008091E80085FF2AC08091EF
:101C200048018F5F80934801891718F1109248018D
:101C3000809140018093F1001092F1008091490160
:101C40008093F10080914A018093F10080914B01D3
:101C50008093F10080914C018093F10080914D01BF
:101C60008093F10080914E018093F1008AE380938C
:101C7000E80080911901882309F465C082E080930F
:101C8000E90090911A01992301F18091E80085FF04
:101C90001CC0809145018F5F809345018917A8F092
:101CA0001092450181E08093F10080914001809382
:101CB000F100E2E5F1E081918093F10081E0E73607
:101CC000F807C9F78AE38093E80090911B019923F4
:101CD000B9F08091E80085FF13C0809146018F5FC5
:101CE00080934601891760F01092460182E080934C
:101CF000F100809167018093F1008AE38093E8000E
:101D000090911C019923F9F08091E80085FF1BC098
:101D1000809147018F5F809347018917A0F010924F
:101D2000470183E08093F100809168018093F10086
:101D3000809169018093F10080916A018093F100A4
:101D40008AE38093E800FF91EF919F918F912F910B
:101D50000F900FBE0F901F9018951F920F920FB605
:101D60000F9211242F933F934F935F936F937F9321
:101D70008F939F93AF93BF93CF93DF93EF93FF9393
:101D80001092E9008091E80083FF4BC26091F1005E
:101D90003091F1008091F100482F50E02091F10046
:101DA000922F80E0482B592B8091F100A82FB0E0B2
:101DB0002091F100922F80E0A82BB92B8091F100A7
:101DC000C82FD0E02091F100922F80E0C82BD92BB2
:101DD00082EF8093E800363009F056C029E033E006
:101DE000B90165507040F901379785919491841736
:101DF0009507E1F4FB01859194918A179B07B1F453
:101E00009B012E5F3F4FF901659174912E5F3F4F0B
:101E1000F9012491CE01CF3FD10519F010F08FEFD9
:101E200090E0422F821758F4482F09C0295F3F4F96
:101E3000695F7F4FF3E024363F07A9F6F2C15EEFFA
:101E40008091E800282F30E0C90185709070892BBF
:101E5000B9F322FDE9C1342F413208F030E2232FDB
:101E6000CB0106C0FC010196E491E093F100215002
:101E70002223C1F7630F711D431B5093E8004423D5
:101E8000F9F63032E9F2D0C1862F8F7709F05BC0C6
:101E9000353061F48EEF8093E8008091E80080FF98
:101EA000FCCF842F80688093E300BEC1393019F5E0
:101EB000409342018EEF8093E8008DE593E021E0AE
:101EC0002093E900FC010196E491E093EB00EE23FE
:101ED00069F0AC014F5F5F4FFC0184918093EC008F
:101EE000CA010196FA0134913093ED002F5F26303C
:101EF00039F78EE164C0383039F48091E80080FF12
:101F0000FCCF809142010AC1332341F48091E80063
:101F100080FFFCCF80913F01880F2BC0313019F03A
:101F2000333009F07EC14130510509F07AC18EEF9E
:101F30008093E800313019F410923F0175C181E0BF
:101F400080933F0171C1823009F03EC03323B1F468
:101F50008091E80080FFFCCFA093E9008091EB0026
:101F600090E025E0969587952A95E1F7817010928B
:101F7000E9008093F1001092F1004FC1313019F067
:101F8000333009F04EC1452B09F04BC12A2F2F7772
:101F9000822F8150853008F044C18EEF8093E80095
:101FA0002093E900333009F43CC189E18093EB00D0
:101FB00081E090E002C0880F991F2A95E2F7809394
:101FC000EA001092EA0030C1813209F02AC1A23041
:101FD000B10509F06CC0E42F313069F58091E8005B
:101FE00080FFFCCFE13081F4E093F100809140016B
:101FF0008093F100E2E5F1E081918093F10081E0CE
:10200000E736F807C9F709C1E23029F4E093F10097
:102010008091670183C0E33009F0FFC0E093F100D5
:10202000809168018093F100809169018093F100B3
:1020300080916A0173C0393039F48091E80082FFE1
:10204000FCCF8091F10073C0323071F48091E800D0
:1020500080FFFCCFEE2329F0F0E0E75EFE4F8081A9
:102060005DC080911A015AC03A3009F0DAC04423A9
:1020700071F0A42FB0E01197FD01E65EFE4F508392
:10208000552309F0CAC0AB5BBE4F1C92C6C050932B
:102090001A0150931B0150931C01552309F0BDC038
:1020A000109245011092460110924701B6C0109758
:1020B00009F055C0313009F58091E80080FFFCCF70
:1020C000809140018093F1001092F10080914901CC
:1020D0008093F10080914A018093F10080914B013F
:1020E0008093F10080914C018093F10080914D012B
:1020F0008093F10080914E0111C0323039F480910B
:10210000E80080FFFCCF80911D0108C0333049F406
:102110008091E80080FFFCCF809119018093F1004D
:102120007CC0393061F48091E80082FFFCCF80915F
:10213000F100809341018BEF8093E8006EC03A304C
:1021400041F450931D01552309F067C010924801D6
:1021500064C03B3009F065C0409319015EC0A130F6
:10216000B10519F5313009F05CC04C2F5EEF80915C
:10217000E800282F30E0C90185709070892BB9F3F1
:1021800022FD52C0942F413208F090E2892F03C003
:102190001092F10081508823D9F7491B5093E80031
:1021A000442329F7903219F33FC01397D1F531300A
:1021B00001F540E45EEF8091E800282F30E0C9018E
:1021C00085709070892BB9F322FD2EC0942F413277
:1021D00008F090E2892F03C01092F100815088230B
:1021E000D9F7491B5093E800442329F7903219F39B
:1021F0001BC03930B1F490E42BEF8091E80082FFEE
:10220000FCCF2093E800892F913208F080E2981BE0
:10221000A1F78091E80080FFFCCF8EEF8093E8006B
:1022200003C081E28093EB00FF91EF91DF91CF91AA
:10223000BF91AF919F918F917F916F915F914F91DE
:102240003F912F910F900FBE0F901F901895FC019A
:1022500080914201882339F12FB7F89460934401AB
:1022600085E08093E90095E08091E80085FF02C059
:1022700090E40EC02FBF809144018823A9F0809183
:102280004201882381F02FB7F8949093E900ECCFB6
:102290008091F10081939150D9F78BE68093E8000B
:1022A0002FBF80E408958FEF0895FC0180914201D3
:1022B000882339F12FB7F8946093430184E0809329
:1022C000E90094E08091E80085FF02C090E40EC030
:1022D0002FBF809143018823A9F080914201882378
:1022E00081F02FB7F8949093E900ECCF819180931F
:1022F000F1009150D9F78AE38093E8002FBF80E482
:1023000008958FEF0895AACB0895982F8A3010F082
:1023100087E301C080E3890FA1CB1F93182F82951B
:102320008F70F3DF812F8F70F0DF1F9108951F935F
:10233000182F892FF2DF812FF0DF1F9108951F934F
:10234000CF93DF93EC01FE0121961491112339F014
:102350001A3011F48DE082DB812F80DBF4CFDF9126
:10236000CF911F910895382F20917001E0916D0158
:10237000F0916E0190E009C0DF01808132968317F1
:1023800019F411968C9108959F5F9217A8F380E03D
:1023900008950F931F93CF93DF93182F062F8091EB
:1023A00073018823B1F1662349F0E0917501F09142
:1023B0007601E10FF11D809174018083C12FD0E07F
:1023C000E0917501F0917601EC0FFD1F8081CBDF6C
:1023D000282F8823F1F0809173018217D0F081E0DB
:1023E00090E0821B9109880F991FE0917101F09193
:1023F0007201E81BF90B0190F081E02DEC0FFD1F3D
:102400008081882311F0E82F09C0C656DE4FE8818D
:1024100005C0E12FF0E0E656FE4FE0812E2F30E0C0
:10242000C901887F9070803D9105D9F44091740175
:1024300027703070002349F081E090E002C0880FDF
:10244000991F2A95E2F7482B09C081E090E002C06D
:10245000880F991F2A95E2F78095482340937401CD
:10246000E0E08E2FDF91CF911F910F910895109290
:102470006F01109270011092730110926E01109210
:102480006D011092720110927101109276011092FA
:1024900075010895ECDF80E08150E82FF0E0E6560A
:1024A000FE4F80838823C1F70895382F2091700153
:1024B00080916F01281778F4822F90E0880F991F80
:1024C000E0916D01F0916E01E80FF91F3083618397
:1024D0002F5F20937001089510927401809175010F
:1024E00090917601892B59F080E08150E09175013F
:1024F000F0917601E80FF11D10828823B1F708955D
:10250000AF92BF92CF92DF92EF92FF920F93DF9341
:10251000CF9300D0CDB7DEB75C01E62E809173017A
:10252000841770F1442329F46AE9C62E61E0D62E9F
:102530000EC081E090E0841B9109880F991FE09103
:102540007101F0917201E81BF90BC080D18000E0AD
:1025500015C0C50101969A838983C5010E94F31BAA
:10256000F82EE2E0F0E0AE0EBF1E89819A810E9453
:10257000F31BF601EF0DF11D80830F5F0E1548F37D
:102580000F900F90CF91DF910F91FF90EF90DF9020
:10259000CF90BF90AF900895EF92FF920F931F934B
:1025A000CF93DF93E82EF62E662309F44FC080E028
:1025B00091E05BD890937601809375018DDFCF2DEC
:1025C000D0E00E2D10E0CE019695982F8827979594
:1025D00087958C0F9D1F800F911F880F991F45D8DD
:1025E0009C0190936E0180936D01009711F480E03F
:1025F0002EC0E0926F01F0927301C801880F991FFD
:10260000820F931F90937201809371019E01220F9C
:10261000331F280F391F90E040E050E015C0E091D3
:102620007101F0917201E40FF51F3183208380E086
:102630008150F901E80FF11D10828823C9F720505D
:102640003F4F9F5F4E5F5F4F9F1548F381E0DF91E3
:10265000CF911F910F91FF90EF90089581E08093AB
:102660007C01089510927C010895582F40917B01C0
:10267000E0917801F091790130E014C080818517F4
:1026800079F481812281922F9095982396239295B7
:102690009F70692B8627822319F42381348106C019
:1026A0003F5F3596341750F320E030E0C9010895BC
:1026B00010927C0110927A0110927B018091780136
:1026C00090917901892B21F0109279011092780173
:1026D0000895EECF08951092770180919A0290911B
:1026E0009B02892B59F080E08150E0919A02F09191
:1026F0009B02E80FF11D10828823B1F708957F92A5
:102700008F929F92AF92BF92CF92DF92EF92FF9201
:102710000F931F93CF93DF93862E90907A01C091F1
:102720007801D0917901AA2425E0722E3DC0B090A5
:102730007B01B914D9F1B79C70011124EC0EFD1E78
:102740008C010F5F1F4F0E94F31BF701808368010C
:102750000894C11CD11CC8010E94F31BF70181839E
:1027600086010F5F1F4FC6010E94F31BF701828392
:102770001483038378010894E11CF11CC8010E94B2
:10278000F31B182FC7010E94F31B8F731F73810F58
:10279000880F0894E11CF11C9701280F311DC90115
:1027A000B394B0927B01A394A81408F2DF91CF9167
:1027B0001F910F91FF90EF90DF90CF90BF90AF905F
:1027C0009F908F907F9008951F93182F662349F054
:1027D00080E091E00E94350B90939B0280939A02D7
:1027E0007ADF85E0189FC00111240E94350B909379
:1027F000790180937801009711F480E005C010936F
:102800007A0110927B0181E01F910895BF92CF92CF
:10281000DF92EF92FF920F931F93CF93DF93C62E19
:10282000B42E8C010F5F1F4FDED7F82EE8012196E2
:10283000C801D9D7D82E8F2D8F73BB2011F0E82E69
:102840001BC04FE3E42EED2090E0880F991FC80FC6
:10285000D91FD7FE11C084E86C2D39D60DC08E016A
:102860000F5F1F4FCE01BFD7F82E2296C801BBD7EE
:10287000682F8F2D2CD6EA94EE2089F7BB2029F4FF
:10288000D7FE03C088E060E022D6DF91CF911F9190
:102890000F91FF90EF90DF90CF90BF900895FF923F
:1028A0000F931F93082FF62E10917701E0919A0253
:1028B000F0919B02309761F0662319F0E80FF11D4B
:1028C0001083E0919A02F0919B02E00FF11D1081BC
:1028D00080917C01882351F0802F612FC6DE009704
:1028E00029F0612F4F2D92DF51E001C050E0202FE1
:1028F00030E0C901887F9070803E9105D1F440910D
:10290000770127703070FF2049F081E090E002C02D
:10291000880F991F2A95E2F7482B09C081E090E0C3
:1029200002C0880F991F2A95E2F7809548234093AB
:102930007701852F1F910F91FF90089580917D0160
:1029400090E0882309F491E0892F08959C0151E0DB
:1029500050939F0280917D01882311F08FEF08959D
:10296000F99B02C08EEF089570939D0260939C02C4
:102970003093A1022093A00240939E0250937D01C8
:10298000FB9A80E008951F920F920FB60F921124C8
:102990002F933F934F935F936F937F938F939F9367
:1029A000AF93BF93EF93FF9380919E02882329F109
:1029B00080919F02882391F180919C0290919D02C9
:1029C00012D724C080919E02815080939E028091F4
:1029D000A0029091A10201969093A1028093A0027F
:1029E00080919C0290919D02019690939D0280930C
:1029F0009C0280919E02882321F4FB9810927D0115
:102A000032C080919C0290919D02EDD6982FE0916A
:102A1000A002F091A10280819817A1F280919C02FE
:102A200090919D0292BD81BDE091A002F091A10222
:102A3000808180BDFA9AF99A80919E02815080939C
:102A40009E028091A0029091A10201969093A10212
:102A50008093A00280919C0290919D020196909398
:102A60009D0280939C02FF91EF91BF91AF919F9146
:102A70008F917F916F915F914F913F912F910F9027
:102A80000FBE0F901F901895E2E0F0E089E0809370
:102A90005700849183FD3DC0F89481E08093E0006D
:102AA00080E28093D8001092C90080E29EE40197F2
:102AB000F1F71DBA109268001CBC10BE1FBA10922C
:102AC0007A0010926E0010926F00109271001092B6
:102AD000C90014B817B81AB81DB810BA15B818B884
:102AE0001BB81EB811BAE3E0F0E029E020935700CC
:102AF00024912670269583E0282780E092E002C08A
:102B0000880F991F2A95E2F7E0E0F0E4E81BF90B43
:102B100009950895809382017093840160938301E5
:102B20000895282F285D69F081E090E002C0880FA9
:102B3000991F2A95E2F720911F01282720931F0152
:102B4000089581E080931F0108951F9380E090E035
:102B50004AD6182F81E090E046D620E093E49827EB
:102B600083E58127982B09F421E0822F1F91089596
:102B7000ECDF882389F082E090E03DD69C0100974D
:102B800059F0275F314044F484E090E02CD6813046
:102B900019F486E090E027C680E00895EF92FF9256
:102BA0000F931F93CF93DF93E62E142F00E020C0E6
:102BB000153010F1EC012496039615D6F82ECE01AF
:102BC00012D6982F9F7329F0809181018F5F809397
:102BD00081012F2D2F73290F220F412F45504217AE
:102BE00058F0CE010196820F911D142F121B0F5F1A
:102BF0000E15F0F281E001C080E0DF91CF911F91CE
:102C00000F91FF90EF90089583E090E060E0F8D599
:102C100082E090E060E0F4D581E090E063E4F0D5FC
:102C200080E090E063E5ECC590DF882309F4ECCF09
:102C30000895AF92BF92DF92EF92FF920F931F938E
:102C4000CF93DF93E62ED42EEC012196CE01CBD587
:102C5000082F182F1770DD2081F4113041F011304A
:102C600018F0123051F406C085E096E005C08DEFF3
:102C700095E002C085EF95E062DB402F50E02091A7
:102C80001F0130E0CA0188739070E3E09595879545
:102C9000EA95E1F702C0359527958A95E2F720FD80
:102CA00006C0DD2009F0AEC08CEE95E02FC0219665
:102CB0007EEFF72EFE0C06FF19C0CE0194D590E0F2
:102CC0002091820130E02150304002C095958795D7
:102CD0002A95E2F780FD06C0DD2009F093C086EE5C
:102CE00095E014C021966DEFF62EFE0C07FF13C081
:102CF000CE0181D520918301309184018217930701
:102D000039F0DD2009F07EC081EE95E018DB7AC055
:102D100022962EEFF20E113009F43BC0113020F054
:102D2000123009F068C052C0CE015DD5482FA82EE0
:102D3000BB249501220F331FFA948F2D90E02817A2
:102D4000390719F08AED95E055C0DD2029F480910E
:102D50007E01840F80937E01219600E010E015C073
:102D6000CE0141D5F82ECE0101963DD5682FDD204C
:102D700019F08F2D9ADB06C080917F01861710F421
:102D800060937F0122960F5F1F4F0A151B0544F3C6
:102D900039C08E010F5F1F4FCE0125D5E82EC80127
:102DA00022D5682F90E0880F991F2EEFF20E2F2D5D
:102DB00030E08217930719F083ED95E01BC0DD200A
:102DC00009F1C80101964E2D9BDB1CC08E010F5FDF
:102DD0001F4FCE0108D5E82EDD2021F0C8016E2D51
:102DE0008EDC10C0C8016E2D4F2DD8DE882329F44B
:102DF0008CEC95E0A4DA80E006C0809180018E0D15
:102E00008093800181E0DF91CF911F910F91FF901E
:102E1000EF90DF90BF90AF900895EF92FF920F93E5
:102E20001F93CF93DF9355DC35DB0E94560B109236
:102E30007E0110927F01109280011092810185DE47
:102E4000882309F49AC082E090E0D5D48C01FCEF8D
:102E5000EF2EFFEFFF2EE80EF91E8EEB95E06FDAF6
:102E6000C70165DA8AE04FDA05501040065F11406D
:102E700008F083C084E090E0B6D4813009F07DC0D2
:102E800085E090E0B0D4823008F077C0C8E0D0E0B0
:102E900020C0CE01A8D4182F40DA80E434DACE0165
:102EA00046DA80E230DA153018F487EB95E042C05C
:102EB000CE01612F40E0BDDE882319F48FEA95E052
:102EC00039C08AE020DA812F90E0C80FD91FE81AB4
:102ED000F90A1E141F04ECF283EA95E030DA8091BF
:102EE0007E011BDA8AE00FDA87E995E028DA809123
:102EF0007F0113DA8AE007DA88E895E020DA80912A
:102F000080010BDA8AE0FFD980917E0160917F0118
:102F100043DB882319F489E795E00CC08091800198
:102F20006091810151DC882339F4A1DA0E94560BAB
:102F30008AE695E004DA21C08FE595E000DA82E0C8
:102F400090E059D48C0104501040C8E0D0E00FC08C
:102F5000CE0149D4F82ECE016F2D41E06ADE8823E0
:102F600061F08F2D90E0C80FD91F081B190B1016A8
:102F7000110674F373DB81E001C080E0DF91CF9133
:102F80001F910F91FF90EF900895CF92DF92EF92F3
:102F9000FF920F931F93CF93DF93C090890123E09B
:102FA000C21609F413C12C1540F081E0C81609F4CB
:102FB000DAC08C1508F4DDC00CC0E5E0CE1609F4CB
:102FC00051C1CE1608F440C1F6E0CF1609F0ACC1ED
:102FD00089C183EA92E060E03AD918160CF0B6C0D5
:102FE0001091A302123009F43BC0133020F41130C9
:102FF00009F0ACC007C0133009F463C0143009F005
:10300000A5C089C0EDE0F6E0A3EAB2E084918D931B
:10301000319626E0E632F207C9F782E090E0EBD382
:10302000EC01009759F084E090E0DDD3182F85E0A3
:1030300090E0D9D31093AD028093AE0288279927F0
:103040008C1B9D0B84509E4F8093B9029093BA02C3
:103050000E94220B8093B3029093B40282E02AC0B4
:103060003091A50220E08091A40290E0822B932B66
:1030700090938B0180938A01875F9140D0F484E024
:1030800090E090938D0180938C0110928F011092AB
:103090008E018EE891E062E070E042E057DC882328
:1030A00041F41093A20282EA92E060E0FED8DADAFC
:1030B0005EC081E08093A20282EA92E060E0F5D8EF
:1030C00045C082E090E090938D0180938C018AE866
:1030D00091E062E070E042E050E075D320918A0117
:1030E00030918B01F1E0273F3F0718F780918C0169
:1030F00090918D01029690938D0180938C01209385
:10310000A3023093A40282E08093A20282EA92E0BA
:1031100060E0CBD8E5C08FB7F894209136013091AC
:10312000370140913801509139018FBF20939001B0
:1031300030939101409392015093930182E08093E8
:10314000A20282EA92E060E0B0D8E8C090911F014C
:1031500080911E01981709F4E4C05FDE80911F0181
:1031600080931E01DEC0EADB882309F04EC081E0B7
:10317000D9C083EA92E060E06AD818160CF04CC01F
:103180008091A302823809F057C01091A402212F28
:1031900030E080918A0190918B018217930708F4A7
:1031A0004BC060918C0170918D0187EA92E0412FB4
:1031B000CDDB882309F040C01093940182E0809316
:1031C000A20282EA92E060E070D803C0B7DB8823F5
:1031D00011F483E0A7C0C0918C01D0918D01D090F3
:1031E0009401A7EAEA2EA2E0FA2E8E0109C0C801D6
:1031F000FAD2F70191917F018917F1F40F5F1F4F08
:10320000802F8C1B8D1598F3BDC083E08093A202A4
:1032100082EA92E060E049D882E084C024503040E5
:1032200030938F0120938E018EE891E062E070E090
:1032300042E08CDB882359F081E08093A20282EA8D
:1032400092E060E032D86DC079DB882311F484E02D
:1032500069C084E08093A20282EA92E060E025D80F
:10326000DCDD5FC083EA92E060E00E94271118165F
:10327000BCF58091A302833031F0843009F451C051
:10328000813071F54EC000918A0110918B010115BA
:10329000110531F10134110508F000E410E06091EE
:1032A0008C0170918D0183EA92E0A8018CD283EAAF
:1032B00092E060E00E94551180918A0190918B010B
:1032C000801B910B90938B0180938A0180918C01DC
:1032D00090918D01800F911F90938D0180938C01AF
:1032E00085E020C08FB7F8942091360130913701E6
:1032F00040913801509139018FBF80919001909198
:103300009101A0919201B0919301281B390B4A0BB6
:103310005B0B295E33404040504010F486E002C011
:10332000B3DB80E0809389018FB7F8942091360158
:103330003091370140913801509139018FBF809110
:103340008901882311F08C1549F020938501309371
:10335000860140938701509388012AC0809185019E
:1033600090918601A0918701B0918801281B390BAB
:103370004A0B5B0B2958334140405040C8F0109233
:10338000890116C02D2D30E080918A0190918B012A
:10339000821B930B90938B0180938A012C0F3D1F0E
:1033A00030938D0120938C01892B09F02ECF36CFDD
:1033B000DF91CF911F910F91FF90EF90DF90CF9011
:1033C0000895982F977021E030E001C0220F9A9560
:1033D000EAF786958695869590E0662351F0FC0184
:1033E000ED51FD4F9081822F892379F4292B208381
:1033F0000895FC01ED51FD4F9081822F892329F022
:1034000020952923208380E0089581E0089580910C
:10341000410108958091190108950E94740B04DC04
:1034200039C8E3EEF2E0119283E0E330F807D9F710
:1034300053D851D987C08BE060E049C01F93182F43
:1034400060E0BFDF8823B9F48DE20E948311812FF1
:103450000E948D1180E20E948311812F60E00E9402
:10346000C911182F882339F060E019DA882319F47C
:1034700083E0612F2CD01F9108951F93182F61E0D6
:10348000A0DF8823B9F48BE20E948311812F0E9470
:103490008D1180E20E948311812F61E00E94C91189
:1034A000182F882339F061E0FAD9882319F482E0D3
:1034B000612F0DD01F9108958091960190E00197A2
:1034C00020919501821B910960E570E055C10F9331
:1034D0001F93082F162FF0DF8823B1F080919501FC
:1034E00090E0FC01EE0FFF1FE55FFC4F412F50E025
:1034F000302F20E0422B532B51834083019660E50F
:1035000070E03AD1809395011F910F9108959091A9
:10351000960180919501891719F4E0E0F0E010C060
:10352000892F90E0FC01EE0FFF1FE55FFC4F01903B
:10353000F081E02D019660E570E01ED18093960148
:10354000CF010895809195018093960108950F937E
:103550001F9380913D01882321F480913E018823AF
:1035600091F080913E01882309F003C1909195016B
:1035700080919601981709F4FCC00E94920B8AE092
:1035800080939801F6C080919801882361F0815062
:1035900080939801882309F0ECC043DF0E945D0B03
:1035A00080939901E6C0E0919601809195018E1774
:1035B00019F4E0E0F0E008C0F0E0EE0FFF1FE55F77
:1035C000FC4F0190F081E02D8F01F7FF0FC090912B
:1035D0009701983050F4E92FF0E0ED5FFC4F8091B7
:1035E000400180839F5F909397011F77113091F185
:1035F0001A3009F48EC08BDF163009F469C0173019
:1036000090F4133009F44AC0143030F4113011F141
:10361000123009F09AC02EC0143009F452C015308F
:1036200009F093C051C0193009F467C01A3038F45A
:10363000173009F452C0183009F087C052C01B304F
:1036400039F01B3008F465C01C3009F07EC077C02B
:1036500010E077C0E0919601809195018E1751F0AE
:10366000F0E0EE0FFF1FE55FFC4F802F90E09360CE
:1036700091838083802F887F883D19F4802F51DAD1
:1036800064C084E60E948311802F0E948D1180E225
:103690000E948311802F0E94A30B11C0802F887F6E
:1036A000883D09F452C085E70E948311802F0E9453
:1036B0008D1180E20E948311802F0E94210C982F8F
:1036C00045C00093400123C080914001802B1DC064
:1036D000009580914001802318C08091400180278F
:1036E00014C0E0919701EE2381F1E150E09397013E
:1036F000F0E0ED5FFC4F808108C080919701882346
:1037000021F110929701809103038093400193E08F
:103710001DC0902F915089F0E09196018091950104
:103720008E1799F0F0E0EE0FFF1FE55FFC4F892F39
:1037300090E09A609183808308C0E9DE06C071DE64
:1037400011E00E945D0B982F02C090E010E0809184
:103750009901892B80939901882321F00E94940C70
:1037600080939901112329F080E29EE40197F1F7FB
:103770008BD91F910F91089597FB092E07260AD028
:1037800077FD04D00CD006D000201AF47095619516
:103790007F4F0895F6F7909581959F4F0895AA1B46
:1037A000BB1B51E107C0AA1FBB1FA617B70710F02C
:1037B000A61BB70B881F991F5A95A9F7809590955E
:1037C000BC01CD010895DC01CB01FC01F999FECFCC
:1037D00006C0F2BDE1BDF89A319600B40D92415099
:1037E0005040B8F70895F999FECF92BD81BDF89A7F
:1037F000992780B50895A8E1B0E042E050E0E5CF18
:10380000262FF999FECF1FBA92BD81BD20BD0FB6FC
:10381000F894FA9AF99A0FBE01960895F894FFCF9A
:1038200004E11477E1F014F0770AFE0101FFFF01D3
:10383000FFFFFFFF7F0000AB03017D7D7D7D010168
:00000001FF

View File

@ -0,0 +1,902 @@
:1000000012C300002CC300000C94220928C3000076
:1000100026C3000024C3000022C3000020C3000048
:100020001EC300001CC300000C94860D0C94B00E7F
:1000300016C3000014C3000012C3000010C3000068
:100040000EC300000C9462090AC3000008C300003C
:1000500006C300000C94D70A02C3000000C30000CE
:10006000FEC20000FCC20000FAC20000F8C200009C
:10007000F6C20000F4C200000C94C614F0C20000E6
:10008000C7C50000ECC20000EAC20000E8C20000E0
:10009000E6C20000E4C20000E2C20000E0C20000CC
:1000A000DEC20000DCC20000DAC2000000291E1F10
:1000B00020212223242526272D2E2A2B141A081529
:1000C000171C180C12132F3028E0041607090A0B0E
:1000D0000D0E0F333435E1311D1B06190511103695
:1000E0003738E555E22C393A3B3C3D3E3F404142F2
:1000F0004353475F6061565C5D5E57595A5B62636C
:10010000C2BE64444567B0B28CB7B8B9BABBBCBD17
:1001100068696A6B6C6D6E6F707172C188B1B387FC
:10012000B4B57393928ABF8BB68985C00142003EF5
:100130003C3A3B456843413F3D2B356769E2E188E6
:10014000E0141EB06AB11D16041A1FB26B061B071D
:100150000821208C6C2C1909171522B76D11050B7D
:100160000A1C23B86EB3100D182425B96F360E0C77
:10017000122726BA7037380F33132DBB718734B46A
:100180002F2EBC7239E52830B531BD73BE64939211
:100190008ABF2A8BB659895C5F85C0C162635A5D8C
:1001A0005E60295344575B5655614700000000408C
:1001B000C20000000000000000000000000000007D
:1001C00000F9E60000E4E90000FF00000000000084
:1001D000E3FEF000EC000000E7FD0000F700000087
:1001E00065FC00EF00EB000066FB00FAEA0000008F
:1001F000A9F800000000000000F600540000E8002C
:1002000000F500000000000000000058000000AAF7
:10021000000000000000000000004D00504A0000F7
:1002200000494C51004F52000000004E00464B4820
:1002300001BF00BBB9B7B83A68C0BEBCBA2B353BEA
:1002400069E0E16439141E3C6AE21D16041A1F3D80
:100250006B061B070821203E6C2C19091715223F3D
:100260006D11050B0A1C23406EE6100D1824254164
:100270006F360E0C122726427037380F33132D437A
:10028000718734322F2E4472E4E52830318945736A
:10029000515093524C4D2A49B6594F5C5F4E4A4BD0
:1002A00062635A5D5E602953B2575B5655614700E1
:1002B000000000BDC20A4D6F64653A2041542F50C2
:1002C00053320A0A000A4D6F64653A2050432F5892
:1002D000540A0A00756E6B6E6F776E0032202865C7
:1002E0007874656E6465642900436F6465205365A6
:1002F000743A20004B6579626F6172642049443A18
:100300002000000100006C0312000200007E037454
:1003100000220000F20312002100009003090022D5
:10032000010004041500210100A9030900220200B4
:100330001904DC00210200C2030900220300F504B5
:100340001C00210300DB0309000300001105040168
:1003500003090415050E0203090425053801C10629
:1003600001C12601C12601C13601C03612010002B9
:1003700000000020C0167D040001010200010902F6
:100380007400040100A0320904000001030101000F
:100390000921110100012212000705810308000153
:1003A00009040100010300000009211101000122DC
:1003B0001500070583032000010904020001030062
:1003C000000009211101000122DC0007058203174A
:1003D00000010904030002030000000921110100CB
:1003E00001221C00070584034000020705050340A5
:1003F000000805010906A101150026FF00950875F2
:10040000088103C00631FF0974A153750815002641
:10041000FF00952009758102C005010906A101852B
:100420000175019508050719E029E71500250181E7
:1004300002950575010508190129059102950175B7
:10044000039103750195310507190129311500251F
:1004500001810295017501810375019569050719EF
:1004600033299B15002501810295017501810375D2
:100470000195080507199D29A415002501810295FC
:100480000475018103C005010980A1018502750180
:1004900095031981298315002501810295057501B0
:1004A0008103C0050C0901A1018503750195180997
:1004B000B509B609B709CD09E209E509E709E9096E
:1004C000EA0A52010A53010A54010A55010A83013A
:1004D0000A8A010A92010A94010A21020A23020AE5
:1004E00024020A25020A26020A27020A2A02150005
:1004F00025018102C00699FF0A6824A1017508152B
:100500000026FF00954009018102954009029102F1
:10051000C0040309040E0353006F006100720065FC
:100520000072000000380353006F00610072006524
:100530000072002700730020004B00650079006204
:10054000006F00610072006400200043006F006EC5
:1005500000760065007200740065007200000061A2
:100560006C6C6F63206F6B2E0A00616C6C6F632084
:100570006661696C65642E0A00616C6C6F6320664D
:1005800061696C65642E0A00746F74616C5F6D61E3
:1005900063726F733A20006D61785F6C6179657288
:1005A0003A20006C61796572646566733A200021B7
:1005B0006170706C790A006C656E3C350A000A0A3D
:1005C00072656D61696E696E673A20006572726F5F
:1005D0007220006572726F7220006572726F7220F5
:1005E0000021696420002173657420002173656C0B
:1005F00065637420006D6163726F73200072656DB6
:1006000061707320006C61796572732000030100D2
:1006100001010C02010104000005000A07000006A8
:1006200000040800000011241FBECFEFDAE0DEBF97
:10063000CDBF11E0A0E0B1E0EEE2F8E302C005902A
:100640000D92A032B107D9F713E0A0E2B1E001C0EA
:100650001D92AB3AB107E1F7A6D00C94151CD0CC93
:1006600090910001923021F1933018F4913041F5CE
:1006700005C0933059F0943019F510C087FD20C0A3
:10068000E82FF0E0E455FF4F849108958538C0F4D9
:10069000E82FF0E0E05DFD4F84910895662341F07E
:1006A0008F3770F4E82FF0E0EF54FE4F84910895F7
:1006B000853830F4E82FF0E0E45DFE4F8491089532
:1006C00080E008950E94181A0E94221A10922201B6
:1006D000109223011092240108951F93182F0E9455
:1006E000111A212F30E0882361F080B3806E80BB27
:1006F00081B345E0220F331F4A95E1F78F71822BBA
:100700000BC080B395E0220F331F9A95E1F78F71EC
:10071000822B80BB81B3806E81BB1F910895A0DFC7
:100720000C94251A9DDF0C94441ACF92DF92EF921D
:10073000FF920F931F93CF93DF93ABD2082F80913B
:100740002601802739F1C0E0D0E01BEAC82EDD2465
:10075000E02EFF24C6010C2E02C0959587950A94C1
:10076000E2F780FF10C0C7010C2E02C09595879557
:100770000A94E2F780FF04C0812F0E94251A03C06B
:10078000812F0E94441A21961F5F103B19F7009396
:10079000260181E0DF91CF911F910F91FF90EF90A3
:1007A000DF90CF9008952F923F924F925F926F9279
:1007B0007F928F929F92AF92BF92CF92DF92EF92F1
:1007C000FF920F931F93DF93CF9300D00F92CDB77B
:1007D000DEB780E88093610010926100569A80E055
:1007E0007CDF87E07ADFD5D60E94141A56D536D240
:1007F00069DF80E076D23324882499245524AA2402
:10080000BB24650114E0412EB2E02B2E3320A1F46D
:100810002FB7F8948091360190913701A09138015B
:10082000B09139012FBF855F9140A040B04020F0CA
:1008300081E057D233243394882009F0E5C02FB7E4
:10084000F8948091360190913701A0913801B091D0
:1008500039012FBF895B9B40A040B04008F4D4C051
:100860000E94BF15982F9F7099F082958F7059F450
:1008700090930001913019F42092290161C081E028
:10088000809329015DC0809329019093000158C095
:100890001092000110922101109220018EEE62E36D
:1008A0004DD5823009F041C082E3F3D581E08093D9
:1008B000290180910001882309F03CC082EF62E3A6
:1008C0003DD5182F8230B1F582E3E3D58A3F91F50B
:1008D000CE01029662E383D5823021F5CE010396E4
:1008E00062E37DD59A818230B1F49B3A31F48B81F9
:1008F000853819F04092000103C083E08093000125
:10090000792E66248B8190E0862997299093210186
:10091000809320010FC0409200019093200110921B
:10092000210108C01093000105C02092290181E037
:100930008093000180910001882311F4409200010E
:100940006091200170912101809100010E94911518
:100950000E94141780912901823011F4F0D1F5D151
:1009600080910001833011F488EFE6D580E0B5DE98
:100970008FB7F894A0903601B0903701C09038013D
:10098000D09039018FBF8AE00E9486118AE00E94D0
:10099000861184EF92E00E94A21180912001909133
:1009A00021010E949A118AE00E94861189EE92E04C
:1009B0000E94A21180910001823061F0833018F40E
:1009C000813089F405C0833049F0843061F408C077
:1009D00081E301C082E30E94861109C083E3FBCF5B
:1009E0008CED92E002C084ED92E00E94A211809111
:1009F0002901823019F485EC92E002C085EB92E087
:100A00000E94A21188248394CE01019660E0E7D46D
:100A1000882009F4DDC0823008F485C0823009F0F6
:100A20006DC0198180910001813069F41F3F09F484
:100A30004EC017FF05C0812F8F7760E070DE64C065
:100A4000812F60E013C090912401992309F1E92FCF
:100A5000F0E0EF5FFE4F8081181799F4E92FEF5F08
:100A6000E0932401E33021F48EE761E05BDE4CC0CB
:100A7000E83009F049C08EE761E051DE10922401B0
:100A800043C0933018F08EE761E049DE10922401F4
:100A9000103E91F0113E28F41123C9F01A3AE1F406
:100AA00033C0103F29F01C3F79F0113EA9F408C073
:100AB00081E08093220128C081E08093230124C03B
:100AC00081E08093240120C080E197E203C0FADD39
:100AD00088E893E158D518C080912201882339F025
:100AE000812F609123011BDE1092220104C0812F0F
:100AF0006091230117DE1092230106C08EEF62E39E
:100B00001DD49924939401C099248FB7F894A09090
:100B10003601B0903701C0903801D09039018FBFB5
:100B20005524539471C0882309F06EC0992009F0B0
:100B30006BC00E940E1A182F0E94111A082F0795D9
:100B400000270795012B80912501081709F45CC047
:100B5000FF24F394F022E02EE69421E0E222102F0D
:100B600016951695117080912001909121016F2D9D
:100B700070E02E2D30E0805B9F4B41F4660F771FB5
:100B8000660F771F612B220F331F07C0660F771F79
:100B9000612B220F331F220F331F622B8DEE93D454
:100BA000FF0CFE28110F110F812F8F2996DD009366
:100BB00025012AC08FB7F894A0903601B090370174
:100BC000C0903801D09039018FBF5524539402C092
:100BD0005520B9F02FB7F8948091360190913701E4
:100BE000A0913801B09139012FBF8A199B09AC0936
:100BF000BD09C397A105B10520F08AE00E948611C6
:100C000055240E94CC1702CE90DD882399F6E0CFC0
:100C10001F920F920FB60F9211248F939F9393B14F
:100C20009F7180912801981729F0909328018AE0FC
:100C30008093090180910901882349F081508093B4
:100C40000901882321F480912801809327019F9135
:100C50008F910F900FBE0F901F90189584B1807EDA
:100C600084B985B18F6185B9E1E7F0E08081826068
:100C700080838AEF90E0909399008093980010927F
:100C80009000E1E9F0E088E08083808183608083E8
:100C900008958091270108959C0180918100887FAB
:100CA0008093810080916F008D7F80936F00109200
:100CB00085001092840082E086BB2115310581F009
:100CC000220F331F309389002093880080916F009A
:100CD000826080936F0080918100826080938100A8
:100CE0000895882319F027982F9A08952F98279A06
:100CF0000895882319F05098589A08955898509A52
:100D00000895382F4DB3E9980000882319F05198C1
:100D1000599A02C0519A599824E189B190E0969568
:100D200087958170831711F02150B9F782E08CBB51
:100D300041FF02C0E99A01C0E9988DB30895F89483
:100D4000E99882E08CBB78940895F894E9E6F0E0A5
:100D500080818C608083E99A78940895882321F0BB
:100D6000809111018093120189B190E09695879549
:100D7000982F9170809112018F3F21F481E0892793
:100D80008093120180911201813089F0813018F036
:100D90008E3FB9F419C09923C9F08AE590E07CDF51
:100DA0008EEF8093110181E0809312010AC0992394
:100DB00069F488EE93E070DF8FEF80931101109259
:100DC000120191E0892F089592E001C094E08FEF25
:100DD00080931201F7CF1F9319B11170882321F06E
:100DE00080910A0180930B0180910B018230F1F018
:100DF000833020F4813009F04BC006C0833079F194
:100E00008E3F09F045C03AC08EEF80930A0180EB17
:100E100094E042DF10922D0110922C01112311F465
:100E200016E02DC082E080930B0132C01795112788
:100E3000179580912C018695182B10932C01809189
:100E40002D018F5F80932D01883011F513E01093F1
:100E50000A0188E790E020DF10930B0119C080E0C1
:100E600090E01ADF80912C0180932A0112E007C0E4
:100E700088EB9BE088D310932B010AC015E080E03B
:100E800090E00ADF81E080930B01123089F7F3CF05
:100E90001F9108950F931F93982F80910E018F3FFC
:100EA00019F482E080930E01992321F080910D01C5
:100EB00080930E0180910E01873009F460C0883064
:100EC00088F4843009F43EC0853030F48230E9F093
:100ED000833009F081C02CC08530B1F1863009F033
:100EE0007BC04BC08A3009F45FC08B3038F4883047
:100EF00009F44FC0893009F06FC04DC08B3009F440
:100F000057C08E3F09F068C05AC080912E0180936F
:100F10002F0188E08093300181E080930C0183E011
:100F200080930D0188EC90E0B7DE80E0EADE54C0EB
:100F300080E0DFDE81E0E5DE8EEF80930D0180E270
:100F40009EE4AADE85E031C010912F01012F0170CF
:100F5000802FCFDE169510932F0180910C018027F2
:100F600080930C018091300181508093300188235F
:100F700011F084E01AC086E018C087E016C08091A6
:100F80000C01B7DE8091300181508093300188E000
:100F90000CC089E00AC081E0ACDE80913001815054
:100FA000809330018AE001C08BE080930E0114C071
:100FB00080E090E071DE48992CC012E007C01091EB
:100FC00030011295107F1560123030F081E091DE13
:100FD0008FEF80930E0119C089B120910E0130E08E
:100FE0002170307090E096958795817090702817E9
:100FF000390711F411E009C081E07BDE8FEF8093A7
:101000000E0188EB9BE0BFD214E0812F1F910F915E
:10101000089519E0DBCFFF920F931F93F9B099B1B8
:10102000882329F08FEF8093100115E07DC0809117
:1010300010018F3F19F481E080931001092F017096
:10104000109110011630E9F1173040F41430D9F046
:101050001530D8F4113009F050C008C01830D9F15B
:10106000183088F1193009F048C037C080EB94E09F
:1010700013DE109232011092310110930F01002300
:1010800009F057C01CC085E017C0902F979599278D
:101090009795809131018695982B9093310180919D
:1010A0000F01802780930F01809132018F5F809321
:1010B0003201883021F486E0809310011EC084E064
:1010C000FBCF87E0F9CF80910F01801711F017E077
:1010D00031C088E0F1CF89E0EFCF002349F0809163
:1010E000310180932A0181E08093290112E022C01E
:1010F00088EB9BE048D218E01DC02091100130E041
:10110000217030708F2D90E096958795817090704A
:101110002817390711F411E007C08FEF80931001F1
:1011200088EB9BE030D214E0812F1F910F91FF904C
:10113000089516E080E090E0AFDD8FEF809310011E
:10114000F3CFDF92EF92FF920F931F93082F82301D
:10115000F9F480912901823021F483E080933301F6
:101160006BC080913501813079F483E08093350143
:1011700080913301882319F088EB9BE004D281E051
:101180008093330100E004C081E08093340154C0B7
:10119000FF24F394A2E0DA2EF3E0EF2E80913501E4
:1011A000813031F1813030F0823081F1833009F0CB
:1011B00043C039C0802FD2DD823008F43DC0823078
:1011C00069F780913401882379F01092340180917D
:1011D0003301882319F088EB9BE0D5D1F0923301DD
:1011E000E092350100E0DACF81E08093350124C040
:1011F00049991FC080913301882319F088EB9BE047
:10120000C2D1F0922B01D0923501C8CF802F03DFDD
:10121000182F823088F0823019F088EB9BE0B3D130
:1012200010932B0106C0802F35DE823028F080938A
:10123000330110923501B2CF1F910F91FF90EF90C3
:10124000DF9008951F920F920FB60F9211242F93E3
:101250003F934F935F936F937F938F939F93AF933E
:10126000BF93EF93FF9380912901823019F480E0BE
:10127000B2DD02C080E065DFFF91EF91BF91AF91D9
:101280009F918F917F916F915F914F913F912F919E
:101290000F900FBE0F901F901895F89481E031DDEC
:1012A00081E027DD1092800088E080938100E9E6EC
:1012B000F0E08081837F84608083E99A80E041DF71
:1012C000789408951F920F920FB60F9211242F93C6
:1012D0003F934F935F936F937F938F939F93AF93BE
:1012E000BF93EF93FF9380918100887F809381006B
:1012F00080916F008D7F80936F00000010928500B9
:101300001092840082E086BB80912901823019F41A
:1013100081E061DD02C081E014DFFF91EF91BF91B8
:10132000AF919F918F917F916F915F914F913F917D
:101330002F910F900FBE0F901F901895DF92EF9294
:10134000FF920F931F93182FD62E80912901823080
:1013500011F480E03EC087E7D9D7812FE1D780E242
:10136000D5D7F89410932E011092330182E0E9DE74
:1013700078948FB7F894E0903601F090370100919F
:101380003801109139018FBF4D2D50E060E070E0C1
:1013900018C0DD20B1F02FB7F894809136019091FC
:1013A0003701A0913801B09139012FBF8E199F09E3
:1013B000A00BB10B481759076A077B0710F48AE0A6
:1013C00008C080913301823020F380913301109264
:1013D00033011F910F91FF90EF90DF900895DF92FE
:1013E000EF92FF920F931F93CF93DF93EC018FB790
:1013F000F894E0903601F090370100913801109197
:1014000039018FBFD0902B016623C1F41FC02FB7C5
:10141000F8948091360190913701A0913801B091F4
:1014200039012FBF8E199F09A00BB10B481759071F
:101430006A077B0728F1D0902B0104C0462F50E0AB
:1014400060E070E081E08D1510F703C081E08D153C
:10145000B8F410912A0110922B0182E0D81651F4B1
:1014600082E754D7812F5CD780E250D7209741F094
:10147000188306C082E54AD78D2D52D780E246D721
:101480008D2DDF91CF911F910F91FF90EF90DF9005
:1014900008951F93DF93CF930F92CDB7DEB7682FD8
:1014A000CE0101969CDF182F823039F0198282E537
:1014B0002DD781E32BD7812F33D789810F90CF91FF
:1014C000DF911F910895EF92FF920F931F93E82EE3
:1014D000F62E80912901823049F103E08E2D62E3DE
:1014E0002DDF182F8230D1F482E3D3DF182F8A3F0B
:1014F00069F48F2D62E322DF182F823059F482E3E2
:10150000C8DF182F8A3F11F481E011C081E2FED6B6
:1015100081E207C087E5FAD682E303C087E5F6D605
:1015200081E3F4D6812FFCD60150C1F680E01F91F3
:101530000F91FF90EF900895FF920F931F93F82E55
:10154000809129018230D1F003E08F2D62E3F6DE35
:10155000182F823059F482E39CDF182F8A3F11F450
:1015600081E00DC081E2D2D681E203C087E5CED60C
:1015700080E3CCD6812FD4D6015039F780E01F917B
:101580000F91FF90089590933B0180933A015E9AEA
:101590000895EEE6F0E08081826080838AEF87BD67
:1015A00082E084BD15BC85B5836085BD08951F921A
:1015B0000F920FB60F9211242F933F934F935F9387
:1015C0006F937F938F939F93AF93BF93EF93FF930B
:1015D0008091360190913701A0913801B091390185
:1015E0000196A11DB11D8093360190933701A09300
:1015F0003801B093390180913A0190913B010097F5
:1016000031F0019790933B0180933A0101C05E98BD
:1016100080913C01882341F481E080933C017894DF
:101620000E94AE1A10923C01FF91EF91BF91AF91D1
:101630009F918F917F916F915F914F913F912F91EA
:101640000F900FBE0F901F901895209115013091AB
:1016500016012115310521F42DB73EB72052304037
:101660008091170190911801281B390BC901089529
:10167000AC0120911501309116012115310521F49D
:101680002DB73EB72052304080911701909118013C
:10169000281B390B2417350718F420E030E007C069
:1016A000480F591F50931801409317019C01C9011D
:1016B00008958BEA93E090931801809317010895A1
:1016C0001092490110924A0110924B0110924C0164
:1016D00010924D0110924E01E2E5F1E0119281E08D
:1016E000ED36F807D9F7109240018FE00895E8DF52
:1016F00081E08093D70080EA8093D80082E189BDA1
:1017000009B400FEFDCF80E98093D8001092E0007C
:101710001092420110923D0110923E0110923F0141
:101720008DE28093E2007894089580913F018823B0
:1017300061F080913E01882341F48091E000826055
:101740008093E00081E080933E010895582F382F68
:101750003150343A10F040E014C0E32FE695E6959E
:10176000E695F0E0EE5AFE4F232F277081E090E0DF
:1017700002C0880F991F2A95E2F72081282B208329
:1017800043E0852F885A8330A0F4E52FE695E6954F
:10179000E695F0E0EE5AFE4F252F277081E090E0AD
:1017A00002C0880F991F2A95E2F72081282B2083F9
:1017B0004460852F885E8831A8F4252F2853E22FB6
:1017C000E695E695E695F0E0EE5AFE4F277081E04B
:1017D00090E002C0880F991F2A95E2F72081282BFC
:1017E00020834860252F205E283080F481E090E03F
:1017F00002C0880F991F2A95E2F7982F882331F0AD
:1018000080914001892B8093400115C0343AD0F477
:10181000E9E4F1E080818517A9F0319681E0EF34A9
:10182000F807C1F720E030E0F901E75BFE4F808167
:10183000882319F45083436005C02F5F3F4F263043
:10184000310591F7842F0895482F282F2150243AED
:1018500010F030E014C0E22FE695E695E695F0E052
:10186000EE5AFE4F277081E090E002C0880F991F6A
:101870002A95E2F7809520818223808333E0842FAC
:10188000885A8330A8F4E42FE695E695E695F0E0D3
:10189000EE5AFE4F242F277081E090E002C0880F9F
:1018A000991F2A95E2F780952081822380833460F6
:1018B000842F885E8831B0F4242F2853E22FE695D8
:1018C000E695E695F0E0EE5AFE4F277081E090E055
:1018D00002C0880F991F2A95E2F780952081822304
:1018E00080833860242F205E283050F481E090E01F
:1018F00002C0880F991F2A95E2F7982F882319F4C0
:10190000E9E4F1E008C0909580914001892380933B
:10191000400133600AC08081841711F41082336063
:10192000319681E0EF34F807B1F7832F0895982FAF
:1019300080914201882309F492C090FF2EC02FB7F6
:10194000F89481E08093E9008091E80085FF24C04D
:10195000809140018093F1001092F1008091490143
:101960008093F10080914A018093F10080914B01B6
:101970008093F10080914C018093F10080914D01A2
:101980008093F10080914E018093F1008AE380936F
:10199000E800109248019E7F2FBF80911901882393
:1019A00009F45CC091FF20C02FB7F89482E08093C7
:1019B000E9008091E80085FF16C081E08093F10086
:1019C000809140018093F100E2E5F1E08191809304
:1019D000F10081E0E736F807C9F78AE38093E80071
:1019E000109245019D7F2FBF92FF16C03FB7F8941C
:1019F00022E02093E9008091E80085FF0CC020934D
:101A0000F100809167018093F1008AE38093E80000
:101A1000109246019B7F3FBF93FF21C02FB7F894E0
:101A200082E08093E9008091E80085FF15C083E0A3
:101A30008093F100809168018093F10080916901A9
:101A40008093F10080916A018093F1008AE3809392
:101A5000E80010924701977F2FBF01C0917F892F27
:101A60000895482F80914201882309F44DC0809148
:101A70003D01882309F048C080913E01882309F088
:101A800043C080911901882309F43EC02FB7F89410
:101A900083E08093E90080915101882341F0809197
:101AA000E80085FD02C02FBF12C010925101909135
:101AB000E4009C5F33E08091E80085FD13C02FBFF8
:101AC0008091E400891729F481E0809351018FEF20
:101AD0000895809142018823B9F02FB7F89430938C
:101AE000E900E9CF4093F1008091E80085FD06C050
:101AF0008AE38093E80010924F0103C082E0809354
:101B00004F012FBF80E008958FEF08951F920F922D
:101B10000FB60F9211242F938F939F93EF93FF9300
:101B20008091E1001092E100282F83FF17C01092EE
:101B3000E90081E08093EB001092EC0092E2909338
:101B4000ED0098E09093F0001092420110923F0156
:101B500010923D0110923E018093190120FF08C0B0
:101B60008091E20080618093E20081E080933D01FA
:101B700024FF0BC080913D01882339F08091E20061
:101B80008F7E8093E20010923D0125FF02C01092EB
:101B90003E0122FFDBC080914201882309F4D6C0B8
:101BA000809119018823B1F080914F01882391F031
:101BB000815080934F01882369F483E08093E9008A
:101BC00002C01092F1008091E80085FDFACF8AE30F
:101BD0008093E80080911901882371F0809144017D
:101BE000882319F081508093440180914301882318
:101BF00019F0815080934301809150018F5F809351
:101C0000500190E083709070892B09F09FC09091F3
:101C10001D01992389F181E08093E9008091E8001A
:101C200085FF2AC0809148018F5F80934801891702
:101C300018F110924801809140018093F1001092B8
:101C4000F100809149018093F10080914A018093D5
:101C5000F10080914B018093F10080914C018093C1
:101C6000F10080914D018093F10080914E018093AD
:101C7000F1008AE38093E80080911901882309F438
:101C800065C082E08093E90090911A01992301F1E7
:101C90008091E80085FF1CC0809145018F5F809393
:101CA00045018917A8F01092450181E08093F10069
:101CB000809140018093F100E2E5F1E08191809311
:101CC000F10081E0E736F807C9F78AE38093E8007E
:101CD00090911B019923B9F08091E80085FF13C012
:101CE000809146018F5F80934601891760F01092C2
:101CF000460182E08093F100809167018093F100BA
:101D00008AE38093E80090911C019923F9F0809177
:101D1000E80085FF1BC0809147018F5F80934701DA
:101D20008917A0F01092470183E08093F100809121
:101D300068018093F100809169018093F1008091A6
:101D40006A018093F1008AE38093E800FF91EF91AC
:101D50009F918F912F910F900FBE0F901F9018950C
:101D60001F920F920FB60F9211242F933F934F9310
:101D70005F936F937F938F939F93AF93BF93CF9313
:101D8000DF93EF93FF931092E9008091E80083FFC7
:101D90004BC26091F1003091F1008091F100482F29
:101DA00050E02091F100922F80E0482B592B809138
:101DB000F100A82FB0E02091F100922F80E0A82B35
:101DC000B92B8091F100C82FD0E02091F100922F23
:101DD00080E0C82BD92B82EF8093E800363009F0E1
:101DE00056C029E033E0B90165507040F9013797DA
:101DF0008591949184179507E1F4FB018591949165
:101E00008A179B07B1F49B012E5F3F4FF901659143
:101E100074912E5F3F4FF9012491CE01CF3FD10540
:101E200019F010F08FEF90E0422F821758F4482FEE
:101E300009C0295F3F4F695F7F4FF3E024363F07BA
:101E4000A9F6F2C15EEF8091E800282F30E0C901C9
:101E500085709070892BB9F322FDE9C1342F41328E
:101E600008F030E2232FCB0106C0FC010196E4917B
:101E7000E093F10021502223C1F7630F711D431B32
:101E80005093E8004423F9F63032E9F2D0C1862FAE
:101E90008F7709F05BC0353061F48EEF8093E800F6
:101EA0008091E80080FFFCCF842F80688093E3005E
:101EB000BEC1393019F5409342018EEF8093E8009E
:101EC0008DE593E021E02093E900FC010196E49187
:101ED000E093EB00EE2369F0AC014F5F5F4FFC0134
:101EE00084918093EC00CA010196FA0134913093F9
:101EF000ED002F5F263039F78EE164C0383039F4B9
:101F00008091E80080FFFCCF809142010AC1332319
:101F100041F48091E80080FFFCCF80913F01880F61
:101F20002BC0313019F0333009F07EC141305105FA
:101F300009F07AC18EEF8093E800313019F41092E5
:101F40003F0175C181E080933F0171C1823009F08A
:101F50003EC03323B1F48091E80080FFFCCFA09312
:101F6000E9008091EB0090E025E0969587952A9511
:101F7000E1F781701092E9008093F1001092F10076
:101F80004FC1313019F0333009F04EC1452B09F003
:101F90004BC12A2F2F77822F8150853008F044C102
:101FA0008EEF8093E8002093E900333009F43CC1C0
:101FB00089E18093EB0081E090E002C0880F991FD7
:101FC0002A95E2F78093EA001092EA0030C181324C
:101FD00009F02AC1A230B10509F06CC0E42F3130FC
:101FE00069F58091E80080FFFCCFE13081F4E09357
:101FF000F100809140018093F100E2E5F1E08191F0
:102000008093F10081E0E736F807C9F709C1E230B3
:1020100029F4E093F1008091670183C0E33009F077
:10202000FFC0E093F100809168018093F1008091FE
:1020300069018093F10080916A0173C0393039F4ED
:102040008091E80082FFFCCF8091F10073C03230B4
:1020500071F48091E80080FFFCCFEE2329F0F0E0DE
:10206000E75EFE4F80815DC080911A015AC03A3010
:1020700009F0DAC0442371F0A42FB0E01197FD01FC
:10208000E65EFE4F5083552309F0CAC0AB5BBE4FDE
:102090001C92C6C050931A0150931B0150931C010F
:1020A000552309F0BDC010924501109246011092CF
:1020B0004701B6C0109709F055C0313009F580913D
:1020C000E80080FFFCCF809140018093F1001092E6
:1020D000F100809149018093F10080914A01809341
:1020E000F10080914B018093F10080914C0180932D
:1020F000F10080914D018093F10080914E0111C05B
:10210000323039F48091E80080FFFCCF80911D01CE
:1021100008C0333049F48091E80080FFFCCF809103
:1021200019018093F1007CC0393061F48091E8009E
:1021300082FFFCCF8091F100809341018BEF80936F
:10214000E8006EC03A3041F450931D01552309F068
:1021500067C01092480164C03B3009F065C04093ED
:1021600019015EC0A130B10519F5313009F05CC02C
:102170004C2F5EEF8091E800282F30E0C901857078
:102180009070892BB9F322FD52C0942F413208F090
:1021900090E2892F03C01092F10081508823D9F773
:1021A000491B5093E800442329F7903219F33FC0AC
:1021B0001397D1F5313001F540E45EEF8091E800EE
:1021C000282F30E0C90185709070892BB9F322FD6A
:1021D0002EC0942F413208F090E2892F03C0109254
:1021E000F10081508823D9F7491B5093E80044231C
:1021F00029F7903219F31BC03930B1F490E42BEF7A
:102200008091E80082FFFCCF2093E800892F913273
:1022100008F080E2981BA1F78091E80080FFFCCFD6
:102220008EEF8093E80003C081E28093EB00FF9182
:10223000EF91DF91CF91BF91AF919F918F917F915E
:102240006F915F914F913F912F910F900FBE0F9023
:102250001F901895FC0180914201882339F12FB716
:10226000F8946093440185E08093E90095E08091C3
:10227000E80085FF02C090E40EC02FBF80914401AA
:102280008823A9F080914201882381F02FB7F89428
:102290009093E900ECCF8091F10081939150D9F7B0
:1022A0008BE68093E8002FBF80E408958FEF0895B8
:1022B000FC0180914201882339F12FB7F894609393
:1022C000430184E08093E90094E08091E80085FF79
:1022D00002C090E40EC02FBF809143018823A9F073
:1022E00080914201882381F02FB7F8949093E90000
:1022F000ECCF81918093F1009150D9F78AE38093DC
:10230000E8002FBF80E408958FEF0895AACB0895C9
:10231000982F8A3010F087E301C080E3890FA1CBAA
:102320001F93182F82958F70F3DF812F8F70F0DF4E
:102330001F9108951F93182F892FF2DF812FF0DF4F
:102340001F9108951F93CF93DF93EC01FE01219617
:102350001491112339F01A3011F48DE082DB812FB2
:1023600080DBF4CFDF91CF911F910895382F20911A
:102370007001E0916D01F0916E0190E009C0DF0104
:1023800080813296831719F411968C9108959F5F7E
:102390009217A8F380E008950F931F93CF93DF93D4
:1023A000182F062F809173018823B1F1662349F01D
:1023B000E0917501F0917601E10FF11D80917401BA
:1023C0008083C12FD0E0E0917501F0917601EC0F90
:1023D000FD1F8081CBDF282F8823F1F080917301CE
:1023E0008217D0F081E090E0821B9109880F991F3D
:1023F000E0917101F0917201E81BF90B0190F081FD
:10240000E02DEC0FFD1F8081882311F0E82F09C01B
:10241000C656DE4FE88105C0E12FF0E0E656FE4FDC
:10242000E0812E2F30E0C901887F9070803D9105BA
:10243000D9F44091740127703070002349F081E095
:1024400090E002C0880F991F2A95E2F7482B09C037
:1024500081E090E002C0880F991F2A95E2F78095ED
:10246000482340937401E0E08E2FDF91CF911F91BC
:102470000F91089510926F011092700110927301E4
:1024800010926E0110926D01109272011092710102
:1024900010927601109275010895ECDF80E0815072
:1024A000E82FF0E0E656FE4F80838823C1F70895B9
:1024B000382F2091700180916F01281778F4822FB6
:1024C00090E0880F991FE0916D01F0916E01E80F87
:1024D000F91F308361832F5F20937001089510925C
:1024E00074018091750190917601892B59F080E0FB
:1024F0008150E0917501F0917601E80FF11D108295
:102500008823B1F70895AF92BF92CF92DF92EF92F6
:10251000FF920F93DF93CF9300D0CDB7DEB75C016E
:10252000E62E80917301841770F1442329F46AE93F
:10253000C62E61E0D62E0EC081E090E0841B91098A
:10254000880F991FE0917101F0917201E81BF90B5E
:10255000C080D18000E015C0C50101969A838983AF
:10256000C5010E94FA1BF82EE2E0F0E0AE0EBF1E9D
:1025700089819A810E94FA1BF601EF0DF11D80837B
:102580000F5F0E1548F30F900F90CF91DF910F91D1
:10259000FF90EF90DF90CF90BF90AF900895EF92B3
:1025A000FF920F931F93CF93DF93E82EF62E6623AF
:1025B00009F44FC080E091E05BD89093760180935E
:1025C00075018DDFCF2DD0E00E2D10E0CE01969558
:1025D000982F8827979587958C0F9D1F800F911FA7
:1025E000880F991F45D89C0190936E0180936D01CF
:1025F000009711F480E02EC0E0926F01F092730119
:10260000C801880F991F820F931F909372018093C6
:1026100071019E01220F331F280F391F90E040E007
:1026200050E015C0E0917101F0917201E40FF51FC7
:102630003183208380E08150F901E80FF11D108281
:102640008823C9F720503F4F9F5F4E5F5F4F9F1514
:1026500048F381E0DF91CF911F910F91FF90EF90B0
:10266000089581E080937C01089510927C01089583
:10267000582F40917B01E0917801F091790130E091
:1026800014C08081851779F481812281922F9095E1
:102690009823962392959F70692B8627822319F49D
:1026A0002381348106C03F5F3596341750F320E014
:1026B00030E0C901089510927C0110927A011092C5
:1026C0007B018091780190917901892B21F0109202
:1026D0007901109278010895EECF08951092770154
:1026E00080919A0290919B02892B59F080E0815051
:1026F000E0919A02F0919B02E80FF11D108288236D
:10270000B1F708957F928F929F92AF92BF92CF922E
:10271000DF92EF92FF920F931F93CF93DF93862E5A
:1027200090907A01C0917801D0917901AA2425E096
:10273000722E3DC0B0907B01B914D9F1B79C7001E5
:102740001124EC0EFD1E8C010F5F1F4F0E94FA1B1F
:10275000F701808368010894C11CD11CC8010E9444
:10276000FA1BF701818386010F5F1F4FC6010E948C
:10277000FA1BF70182831483038378010894E11C18
:10278000F11CC8010E94FA1B182FC7010E94FA1BF6
:102790008F731F73810F880F0894E11CF11C970140
:1027A000280F311DC901B394B0927B01A394A814E2
:1027B00008F2DF91CF911F910F91FF90EF90DF9082
:1027C000CF90BF90AF909F908F907F9008951F9370
:1027D000182F662349F080E091E00E94380B909317
:1027E0009B0280939A027ADF85E0189FC001112432
:1027F0000E94380B9093790180937801009711F42F
:1028000080E005C010937A0110927B0181E01F9156
:102810000895BF92CF92DF92EF92FF920F931F9392
:10282000CF93DF93C62EB42E8C010F5F1F4FE2D7DC
:10283000F82EE8012196C801DDD7D82E8F2D8F7391
:10284000BB2011F0E82E1BC04FE3E42EED2090E0FA
:10285000880F991FC80FD91FD7FE11C084E86C2DAF
:102860003DD60DC08E010F5F1F4FCE01C3D7F82E8E
:102870002296C801BFD7682F8F2D30D6EA94EE205C
:1028800089F7BB2029F4D7FE03C088E060E026D694
:10289000DF91CF911F910F91FF90EF90DF90CF903C
:1028A000BF900895FF920F931F93082FF62E10915B
:1028B0007701E0919A02F0919B02309761F06623D4
:1028C00019F0E80FF11D1083E0919A02F0919B023C
:1028D000E00FF11D108180917C01882351F0802F41
:1028E000612FC6DE009729F0612F4F2D92DF51E056
:1028F00001C050E0202F30E0C901887F9070803EF9
:102900009105D1F44091770127703070FF2049F094
:1029100081E090E002C0880F991F2A95E2F7482BCA
:1029200009C081E090E002C0880F991F2A95E2F764
:102930008095482340937701852F1F910F91FF9039
:10294000089580917D0190E0882309F491E0892F1A
:1029500008959C0151E050939F0280917D0188234E
:1029600011F08FEF0895F99B02C08EEF08957093D8
:102970009D0260939C023093A1022093A002409399
:102980009E0250937D01FB9A80E008951F920F9262
:102990000FB60F9211242F933F934F935F936F9332
:1029A0007F938F939F93AF93BF93EF93FF93809108
:1029B0009E02882329F180919F02882391F18091C2
:1029C0009C0290919D0216D724C080919E02815056
:1029D00080939E028091A0029091A1020196909313
:1029E000A1028093A00280919C0290919D02019689
:1029F00090939D0280939C0280919E02882321F4F3
:102A0000FB9810927D0132C080919C0290919D02B2
:102A1000F1D6982FE091A002F091A1028081981741
:102A2000A1F280919C0290919D0292BD81BDE091A6
:102A3000A002F091A102808180BDFA9AF99A80915A
:102A40009E02815080939E028091A0029091A102EB
:102A500001969093A1028093A00280919C02909194
:102A60009D02019690939D0280939C02FF91EF91AD
:102A7000BF91AF919F918F917F916F915F914F9196
:102A80003F912F910F900FBE0F901F901895E2E08D
:102A9000F0E089E080935700849183FD41C0F89471
:102AA00081E08093E00080E28093D8001092C9001A
:102AB00080E29EE40197F1F71DBA109268001CBCF9
:102AC00010BE1FBA10927A0010926E0010926F0022
:102AD00010927000109271001092C9001092BC0008
:102AE00014B817B81AB81DB810BA15B818B81BB86A
:102AF0001EB811BAE3E0F0E029E0209357002491DA
:102B00002670269583E0282780E092E002C0880F97
:102B1000991F2A95E2F7E0E0F0E8E81BF90B099528
:102B200008958093820170938401609383010895D6
:102B3000282F285D69F081E090E002C0880F991F7E
:102B40002A95E2F720911F01282720931F0108955D
:102B500081E080931F0108951F9380E090E04AD6A2
:102B6000182F81E090E046D620E093E4982783E593
:102B70008127982B09F421E0822F1F910895ECDF23
:102B8000882389F082E090E03DD69C01009759F0BF
:102B9000275F334044F484E090E02CD6813019F470
:102BA00086E090E027C680E00895EF92FF920F93B1
:102BB0001F93CF93DF93E62E142F00E020C0153033
:102BC00010F1EC012496039615D6F82ECE0112D6FC
:102BD000982F9F7329F0809181018F5F80938101ED
:102BE0002F2D2F73290F220F412F4550421758F0D8
:102BF000CE010196820F911D142F121B0F5F0E152F
:102C0000F0F281E001C080E0DF91CF911F910F9140
:102C1000FF90EF90089583E090E060E0F8D582E0C7
:102C200090E060E0F4D581E090E063E4F0D580E0EE
:102C300090E063E5ECC590DF882309F4ECCF0895BC
:102C4000AF92BF92DF92EF92FF920F931F93CF93B9
:102C5000DF93E62ED42EEC012196CE01CBD5082FA2
:102C6000182F1770DD2081F4113041F0113018F069
:102C7000123051F406C085E096E005C08DEF95E076
:102C800002C085EF95E05EDB402F50E020911F01F0
:102C900030E0CA0188739070E3E095958795EA95D6
:102CA000E1F702C0359527958A95E2F720FD06C029
:102CB000DD2009F0AEC08CEE95E02FC021967EEFAE
:102CC000F72EFE0C06FF19C0CE0194D590E020919E
:102CD000820130E02150304002C0959587952A95B9
:102CE000E2F780FD06C0DD2009F093C086EE95E096
:102CF00014C021966DEFF62EFE0C07FF13C0CE0117
:102D000081D520918301309184018217930739F096
:102D1000DD2009F07EC081EE95E014DB7AC02296BA
:102D20002EEFF20E113009F43BC0113020F01230BA
:102D300009F068C052C0CE015DD5482FA82EBB2433
:102D40009501220F331FFA948F2D90E02817390731
:102D500019F08AED95E055C0DD2029F480917E01BF
:102D6000840F80937E01219600E010E015C0CE0113
:102D700041D5F82ECE0101963DD5682FDD2019F002
:102D80008F2D96DB06C080917F01861710F460932B
:102D90007F0122960F5F1F4F0A151B0544F339C0B0
:102DA0008E010F5F1F4FCE0125D5E82EC80122D519
:102DB000682F90E0880F991F2EEFF20E2F2D30E034
:102DC0008217930719F083ED95E01BC0DD2009F110
:102DD000C80101964E2D97DB1CC08E010F5F1F4F5F
:102DE000CE0108D5E82EDD2021F0C8016E2D8ADC49
:102DF00010C0C8016E2D4F2DD8DE882329F48CEC2D
:102E000095E0A0DA80E006C0809180018E0D80936D
:102E1000800181E0DF91CF911F910F91FF90EF90A2
:102E2000DF90BF90AF900895EF92FF920F931F93A2
:102E3000CF93DF9351DC31DB0E94590B10927E015E
:102E400010927F01109280011092810185DE88230B
:102E500009F49AC082E090E0D5D48C01FCEFEF2E0B
:102E6000FFEFFF2EE80EF91E8EEB95E06BDAC7013F
:102E700061DA8AE04BDA05501040065F134008F033
:102E800083C084E090E0B6D4813009F07DC085E055
:102E900090E0B0D4823008F077C0C8E0D0E020C025
:102EA000CE01A8D4182F3CDA80E430DACE0142DA21
:102EB00080E22CDA153018F487EB95E042C0CE01A1
:102EC000612F40E0BDDE882319F48FEA95E039C018
:102ED0008AE01CDA812F90E0C80FD91FE81AF90A9E
:102EE0001E141F04ECF283EA95E02CDA80917E0137
:102EF00017DA8AE00BDA87E995E024DA80917F011E
:102F00000FDA8AE003DA88E895E01CDA8091800124
:102F100007DA8AE0FBD980917E0160917F013FDB77
:102F2000882319F489E795E00CC0809180016091B5
:102F300081014DDC882339F49DDA0E94590B8AE621
:102F400095E000DA21C08FE595E0FCD982E090E0C1
:102F500059D48C0104501040C8E0D0E00FC0CE011D
:102F600049D4F82ECE016F2D41E06ADE882361F04E
:102F70008F2D90E0C80FD91F081B190B10161106D2
:102F800074F36FDB81E001C080E0DF91CF911F918E
:102F90000F91FF90EF900895CF92DF92EF92FF9202
:102FA0000F931F93CF93DF93C090890123E0C21644
:102FB00009F413C12C1540F081E0C81609F4DAC0F9
:102FC0008C1508F4DDC00CC0E5E0CE1609F451C143
:102FD000CE1608F440C1F6E0CF1609F0ACC189C1A5
:102FE00083EA92E060E036D918160CF0B6C0109172
:102FF000A302123009F43BC0133020F4113009F061
:10300000ACC007C0133009F463C0143009F0A5C088
:1030100089C0EDE0F6E0A3EAB2E084918D933196A9
:1030200026E0E632F207C9F782E090E0EBD3EC014C
:10303000009759F084E090E0DDD3182F85E090E010
:10304000D9D31093AD028093AE02882799278C1BA9
:103050009D0B84509C4F8093B9029093BA020E94BA
:10306000250B8093B3029093B40282E02AC0309182
:10307000A50220E08091A40290E0822B932B9093F4
:103080008B0180938A01875F9340D0F484E090E0C5
:1030900090938D0180938C0110928F0110928E017C
:1030A0008EE891E062E070E042E053DC882341F476
:1030B0001093A20282EA92E060E0FAD8D6DA5EC00B
:1030C00081E08093A20282EA92E060E0F1D845C0FC
:1030D00082E090E090938D0180938C018AE891E0EA
:1030E00062E070E042E050E075D320918A013091B7
:1030F0008B01F3E0273F3F0718F780918C019091F7
:103100008D01029690938D0180938C012093A302F0
:103110003093A40282E08093A20282EA92E060E00F
:10312000C7D8E5C08FB7F8942091360130913701A8
:1031300040913801509139018FBF20939001309315
:103140009101409392015093930182E08093A202F7
:1031500082EA92E060E0ACD8E8C090911F018091D3
:103160001E01981709F4E4C05FDE80911F0180936F
:103170001E01DEC0E6DB882309F04EC081E0D9C025
:1031800083EA92E060E066D818160CF04CC080919B
:10319000A302823809F057C01091A402212F30E019
:1031A00080918A0190918B018217930708F44BC09C
:1031B00060918C0170918D0187EA92E0412FC9DB0B
:1031C000882309F040C01093940182E08093A2020A
:1031D00082EA92E060E06CD803C0B3DB882311F48C
:1031E00083E0A7C0C0918C01D0918D01D090940153
:1031F000A7EAEA2EA2E0FA2E8E0109C0C801FAD28F
:10320000F70191917F018917F1F40F5F1F4F802F14
:103210008C1B8D1598F3BDC083E08093A20282EAD7
:1032200092E060E045D882E084C024503040309382
:103230008F0120938E018EE891E062E070E042E021
:1032400088DB882359F081E08093A20282EA92E031
:1032500060E02ED86DC075DB882311F484E069C06E
:1032600084E08093A20282EA92E060E021D8DCDD73
:103270005FC083EA92E060E00E942A111816BCF554
:103280008091A302833031F0843009F451C0813041
:1032900071F54EC000918A0110918B010115110545
:1032A00031F10134110508F000E410E060918C0167
:1032B00070918D0183EA92E0A8018CD283EA92E0BA
:1032C00060E00E94581180918A0190918B01801BCF
:1032D000910B90938B0180938A0180918C01909146
:1032E0008D01800F911F90938D0180938C0185E05B
:1032F00020C08FB7F894209136013091370140916A
:103300003801509139018FBF8091900190919101C6
:10331000A0919201B0919301281B390B4A0B5B0BD2
:10332000295E33404040504010F486E002C0AFDBDD
:1033300080E0809389018FB7F89420913601309115
:10334000370140913801509139018FBF8091890137
:10335000882311F08C1549F0209385013093860164
:1033600040938701509388012AC0809185019091F4
:103370008601A0918701B0918801281B390B4A0B67
:103380005B0B2958334140405040C8F010928901EE
:1033900016C02D2D30E080918A0190918B01821B07
:1033A000930B90938B0180938A012C0F3D1F3093D8
:1033B0008D0120938C01892B09F02ECF36CFDF9120
:1033C000CF911F910F91FF90EF90DF90CF900895D4
:1033D000982F977021E030E001C0220F9A95EAF70C
:1033E00086958695869590E0662351F0FC01ED5117
:1033F000FD4F9081822F892379F4292B2083089512
:10340000FC01ED51FD4F9081822F892329F02095F9
:103410002923208380E0089581E00895809141016F
:1034200008958091190108950E94770B04DC35C836
:10343000E3EEF2E0119283E0E330F807D9F74FD8DA
:103440004DD987C08BE060E049C01F93182F60E022
:10345000BFDF8823B9F48DE20E948611812F0E947C
:10346000901180E20E948611812F60E00E94CC11B1
:10347000182F882339F060E015DA882319F483E0E7
:10348000612F2CD01F9108951F93182F61E0A0DFAA
:103490008823B9F48BE20E948611812F0E9490113B
:1034A00080E20E948611812F61E00E94CC11182FCA
:1034B000882339F061E0F6D9882319F482E0612F7E
:1034C0000DD01F9108958091960190E00197209171
:1034D0009501821B910960E570E055C10F931F9320
:1034E000082F162FF0DF8823B1F08091950190E02E
:1034F000FC01EE0FFF1FE55FFC4F412F50E0302F26
:1035000020E0422B532B51834083019660E570E00D
:103510003AD1809395011F910F9108959091960152
:1035200080919501891719F4E0E0F0E010C0892F2F
:1035300090E0FC01EE0FFF1FE55FFC4F0190F08172
:10354000E02D019660E570E01ED180939601CF01D9
:103550000895809195018093960108950F931F938C
:1035600080913D01882321F480913E01882391F0D0
:1035700080913E01882309F003C1909195018091CB
:103580009601981709F4FCC00E94950B8AE080937D
:103590009801F6C080919801882361F08150809352
:1035A0009801882309F0ECC043DF0E94600B8093F0
:1035B0009901E6C0E0919601809195018E1719F46A
:1035C000E0E0F0E008C0F0E0EE0FFF1FE55FFC4F29
:1035D0000190F081E02D8F01F7FF0FC090919701CE
:1035E000983050F4E92FF0E0ED5FFC4F80914001FE
:1035F00080839F5F909397011F77113091F11A306C
:1036000009F48EC08BDF163009F469C0173090F4CE
:10361000133009F44AC0143030F4113011F1123073
:1036200009F09AC02EC0143009F452C0153009F0C8
:1036300093C051C0193009F467C01A3038F41730FC
:1036400009F452C0183009F087C052C01B3039F05D
:103650001B3008F465C01C3009F07EC077C010E054
:1036600077C0E0919601809195018E1751F0F0E0BE
:10367000EE0FFF1FE55FFC4F802F90E0936091837A
:103680008083802F887F883D19F4802F51DA64C0B1
:1036900084E60E948611802F0E94901180E20E9491
:1036A0008611802F0E94A60B11C0802F887F883D35
:1036B00009F452C085E70E948611802F0E94901164
:1036C00080E20E948611802F0E94240C982F45C012
:1036D0000093400123C080914001802B1DC00095C4
:1036E00080914001802318C080914001802714C040
:1036F000E0919701EE2381F1E150E0939701F0E032
:10370000ED5FFC4F808108C080919701882321F1F3
:1037100010929701809103038093400193E01DC0B4
:10372000902F915089F0E0919601809195018E172C
:1037300099F0F0E0EE0FFF1FE55FFC4F892F90E05E
:103740009A609183808308C0E9DE06C071DE11E0D3
:103750000E94600B982F02C090E010E080919901C8
:10376000892B80939901882321F00E94970C8093E4
:103770009901112329F080E29EE40197F1F787D99E
:103780001F910F91089597FB092E07260AD077FD08
:1037900004D00CD006D000201AF4709561957F4FAC
:1037A0000895F6F7909581959F4F0895AA1BBB1B2E
:1037B00051E107C0AA1FBB1FA617B70710F0A61B31
:1037C000B70B881F991F5A95A9F780959095BC0152
:1037D000CD010895DC01CB01FC01F999FECF06C0B3
:1037E000F2BDE1BDF89A319600B40D9241505040BF
:1037F000B8F70895F999FECF92BD81BDF89A99273F
:1038000080B50895A8E1B0E042E050E0E5CF262F72
:10381000F999FECF1FBA92BD81BD20BD0FB6F894B5
:0E382000FA9AF99A0FBE01960895F894FFCF18
:10382E0004E11477E1F014F0770AFE0101FFFF01C5
:10383E00FFFFFFFF7F0000AB03017D7D7D7D01015A
:00000001FF

View File

@ -0,0 +1,43 @@
ifset set3
# Halvar's config for Terminal Model M (No 1394312, 122 keys, German, cable with RJ45 connector)
remapblock
# left hand side function keys
EXTRA_F1 MEDIA_MY_COMPUTER
EXTRA_F2 MEDIA_MEDIA_SELECT
EXTRA_F3 MEDIA_MAIL
EXTRA_F4 MEDIA_CALCULATOR
EXTRA_F5 MEDIA_WWW_HOME
EXTRA_F6 MEDIA_WWW_SEARCH
EXTRA_F7 MEDIA_WWW_BACK
EXTRA_F8 MEDIA_WWW_FORWARD
EXTRA_F9 LGUI
EXTRA_F10 APP
# function keys upper row
# block 1
F13 ESC
F14 MEDIA_VOLUME_DOWN
F15 MEDIA_VOLUME_UP
F16 MEDIA_MUTE
# block 2
F17 MEDIA_PLAY_PAUSE
F18 MEDIA_PREV_TRACK
F19 MEDIA_NEXT_TRACK
F20 MEDIA_STOP
# block 3
F21 SYSTEM_SLEEP
F22 SYSTEM_WAKE
F23 PRINTSCREEN
F24 PAUSE
# cursor block
LANG_4 DOWN
# Numpad
ESC NUM_LOCK
NUM_LOCK SCROLL_LOCK
SCROLL_LOCK PAD_SLASH
EXTRA_SYSRQ PAD_ASTERIX
PAD_ASTERIX PAD_MINUS
PAD_MINUS PAD_ENTER
# #-key
EUROPE_1 BACKSLASH
endblock

View File

@ -0,0 +1,20 @@
# at_f_remaps_modded
ifset set2
remapblock
FAKE_02 LALT # extra pad lhs of space
FAKE_04 RALT # extra pad rhs of space
FAKE_05 EUROPE_1 # extra pad lhs of enter
FAKE_06 BACKSLASH # extra pad top of enter
FAKE_07 F11 # extra pad lhs of insert
CAPS_LOCK RCTRL
LCTRL CAPS_LOCK
LALT LCTRL
INTERNATIONAL_2 EUROPE_2 # extra pad rhs of left shift
#INTERNATIONAL_1 F13 # extra pad lhs of right shift
F11 F14 # extra pad bottom of numpad +
endblock

View File

@ -0,0 +1,21 @@
# colemak layout
remapblock
D S
E F
F T
G D
I U
J N
K E
L I
N K
O Y
P SEMICOLON
R P
S R
T G
U L
Y J
SEMICOLON O
endblock

View File

@ -0,0 +1,14 @@
# toggle between qwerty and colemak by pressing lshift-lctrl-lalt-1
ifselect 1
include colemak.sc
ifselect any
macroblock
macro 1 lctrl lshift lalt
PRESS SELECT_1
endmacro
endblock

View File

@ -0,0 +1,39 @@
# dvorak layout - contributed by Morning Song
remapblock
MINUS LEFT_BRACE
EQUAL RIGHT_BRACE
Q QUOTE
W COMMA
E PERIOD
R P
T Y
Y F
U G
I C
O R
P L
LEFT_BRACE SLASH
RIGHT_BRACE EQUAL
# A A
S O
D E
F U
G I
H D
J H
K T
L N
SEMICOLON S
QUOTE MINUS
Z SEMICOLON
X Q
C J
V K
B X
N B
# M M
COMMA W
PERIOD V
SLASH Z
endblock

View File

View File

@ -0,0 +1,5 @@
include legacy.sc
include "layer example.sc"
include colemak_select1.sc

View File

@ -0,0 +1,23 @@
# basic layer example - cursors on r.h. home position when caps lock is held
# define that FN1 accesses layer 1
layerblock
FN1 1
FN2 1 # in case FN2 is used as well, define it as an alternative
FN1 FN2 1 # both together still gets layer 1
endblock
# the layer itself is just some remaps tagged with the layer number
remapblock
layer 1
I UP
J LEFT
K DOWN
L RIGHT
endblock
# need to map the FN key into the base layer (0)
remapblock
layer 0
CAPS_LOCK FN1
endblock

101
original_configs/legacy.sc Normal file
View File

@ -0,0 +1,101 @@
# legacy settings file
# (these settings used to be hard-coded in the converter)
# mappings for the extra, normally unused, pads on the IBM AT (84-key)
ifset set2
remapblock
FAKE_02 INTERNATIONAL_4
FAKE_04 INTERNATIONAL_5
FAKE_05 EUROPE_1
FAKE_06 INTERNATIONAL_6
FAKE_07 F13
F11 F14
endblock
# macros to convert some keys on 83- and 84-key keyboard's to the 101-key equivalents
ifset set1 set2
macroblock
# pause macro
macro NUM_LOCK ctrl
PUSH_META CLEAR_META ctrl
PRESS PAUSE
POP_META
endmacro
# printscreen macro
macro PAD_ASTERIX shift
PUSH_META CLEAR_META shift
PRESS PRINTSCREEN
POP_META
endmacro
# break macro
macro SCROLL_LOCK ctrl
PRESS PAUSE
endmacro
endblock
# default mappings for terminal 122-key keyboards
ifset set3
remapblock
FAKE_06 BACKSLASH # extra pad top of enter
EUROPE_1 BACKSLASH # key left of enter
FAKE_08 INTERNATIONAL_2 # LF1
FAKE_09 INTERNATIONAL_4 # LF2
FAKE_10 INTERNATIONAL_5 # LF3
FAKE_11 INTERNATIONAL_6 # LF4
FAKE_12 LANG_3 # LF5
FAKE_13 PAD_EQUALS # LF6
FAKE_14 PRINTSCREEN # LF7
FAKE_15 RGUI # LF8
FAKE_16 LGUI # LF9
FAKE_17 APP # LF10
FAKE_19 PAUSE
PAD_PLUS PAD_ENTER
endblock
# two sets of alternative mappings for terminal 122-key keyboards
# (set the keyboard's ID (jumpers or DIP switches) to use one)
ifset set3
ifkeyboard 9FBF
remapblock
LANG_4 DOWN
RALT LGUI
EUROPE_2 LGUI
F13 MEDIA_PLAY_PAUSE
F14 MEDIA_PREV_TRACK
F15 MEDIA_NEXT_TRACK
F16 MEDIA_VOLUME_UP
F17 MEDIA_VOLUME_DOWN
endblock
ifset set3
ifkeyboard AFBF
remapblock
FAKE_08 ESC # LF1
FAKE_09 PAUSE # LF2
FAKE_10 NUM_LOCK # LF3
FAKE_11 SCROLL_LOCK # LF4
ESC NUM_LOCK
NUM_LOCK PAD_SLASH
SCROLL_LOCK PAD_ASTERIX
FAKE_19 PAD_MINUS
PAD_ASTERIX PAD_PLUS
PAD_MINUS PAD_EQUALS
endblock
# reset conditionals in case this file is included from another file
ifset any
ifkeyboard any
ifselect any

View File

@ -0,0 +1,10 @@
#Numpad, Macintosh style - contributed by Morning Song
remapblock
ESC NUM_LOCK
NUM_LOCK PAD_EQUALS
SCROLL_LOCK PAD_SLASH
FAKE_19 PAD_ASTERIX
PAD_ASTERIX PAD_MINUS
PAD_MINUS PAD_PLUS
PAD_PLUS PAD_ENTER
endblock

View File

@ -0,0 +1,13 @@
#left function keys, Linux/sun mode - contributed by Morning Song
remapblock
FAKE_08 STOP
FAKE_09 AGAIN
FAKE_10 MENU
FAKE_11 UNDO
FAKE_12 SELECT
FAKE_13 COPY
FAKE_14 EXECUTE
FAKE_15 PASTE
FAKE_16 FIND
FAKE_17 CUT
endblock

View File

@ -0,0 +1,46 @@
# Billy's AT layout
remapblock
F1 ESC
F2 PRINTSCREEN
F3 MEDIA_MEDIA_SELECT
F4 MEDIA_PLAY_PAUSE
F5 MEDIA_PREV_TRACK
F6 MEDIA_NEXT_TRACK
F7 MEDIA_VOLUME_DOWN
F8 MEDIA_VOLUME_UP
F9 APP
F10 LGUI
ESC CAPS_LOCK
FAKE_19 PAD_SLASH
FAKE_06 BACKSLASH
LCTRL FN1
LALT LCTRL
FAKE_02 LALT
FAKE_04 RALT
CAPS_LOCK RCTRL
FAKE_03 PAD_ENTER
F11 PAD_ENTER
endblock
layerblock
FN1 1
endblock
remapblock
layer 1
1 F1
2 F2
3 F3
4 F4
5 F5
6 F6
7 F7
8 F8
9 F9
0 F10
MINUS F11
EQUAL F12
F4 PAUSE
F7 MEDIA_MUTE
endblock

BIN
source/bin/m122_new.bin Executable file

Binary file not shown.

20
source/bin/scaswr.bat Executable file
View File

@ -0,0 +1,20 @@
@echo off
rem scaswr.bat - a drop target for config files
rem Change directory to the location of the batch script file (%0)...
cd /d "%~dp0"
rem Run scas with a default target filename...
echo Assembling %1...
scas %1 %1.scb
if errorlevel 1 goto end
rem Run scwr with that default filename...
echo:
echo Writing %1.scb...
scwr %1.scb
:end
rem Wait for a keypress so the output can be read...
echo:
pause

View File

@ -0,0 +1,38 @@
#OS = LINUX
#OS = MACOSX
#OS = WINDOWS
# To set up Ubuntu Linux to cross compile for Windows:
#
# apt-get install mingw32 mingw32-binutils mingw32-runtime
#
# Just edit the variable above for WINDOWS, then use "make" to build rawhid.exe
ifeq ($(OS), LINUX)
TARGET = $(PROG)
CC = gcc
STRIP = strip
CFLAGS = -Wall -O2 -DOS_$(OS) -std=c99
LIBS = -lusb
else ifeq ($(OS), MACOSX)
TARGET = $(PROG)
SDK = /Developer/SDKs/MacOSX10.6.sdk
ARCH = -mmacosx-version-min=10.6 -arch i386
CC = gcc
STRIP = strip
CFLAGS = -Wall -O2 -DOS_$(OS) -std=c99 -isysroot $(SDK) $(ARCH)
LIBS = $(ARCH) -Wl,-syslibroot,$(SDK) -framework IOKit -framework CoreFoundation
else ifeq ($(OS), WINDOWS)
TARGET = $(PROG).exe
CC = i586-mingw32msvc-gcc
STRIP = i586-mingw32msvc-strip
CFLAGS = -Wall -O2 -DOS_$(OS) -std=c99
LIBS = -lhid -lsetupapi
endif
OBJS += ../common/hid_$(OS).o
include ../build/Makefile_rules.inc

44
source/build/Makefile_prog.inc Executable file
View File

@ -0,0 +1,44 @@
#OS = LINUX
#OS = MACOSX
#OS = WINDOWS
# To set up Ubuntu Linux to cross compile for Windows:
#
# apt-get install mingw32 mingw32-binutils mingw32-runtime
#
# Just edit the variable above for WINDOWS, then use "make" to build rawhid.exe
ifeq ($(OS), LINUX)
TARGET = $(PROG)
CC = g++
STRIP = strip
CFLAGS = -Wall -O2 -DOS_$(OS)
CXXFLAGS = $(CFLAGS)
LIBS =
else ifeq ($(OS), MACOSX)
TARGET = $(PROG)
SDK = /Developer/SDKs/MacOSX10.6.sdk
ARCH = -mmacosx-version-min=10.6 -arch i386
CC = g++
STRIP = strip
CFLAGS = -Wall -O2 -DOS_$(OS) -isysroot $(SDK) $(ARCH)
CXXFLAGS = $(CFLAGS)
LIBS = $(ARCH) -Wl,-syslibroot,$(SDK) -framework IOKit -framework CoreFoundation
else ifeq ($(OS), WINDOWS)
TARGET = $(PROG).exe
CC = i586-mingw32msvc-g++
CXX = i586-mingw32msvc-g++
STRIP = i586-mingw32msvc-strip
CFLAGS = -Wall -O2 -DOS_$(OS) -mwin32 -mconsole
CXXFLAGS = $(CFLAGS)
#LIBS = -lsetupapi
#LIBS = -lsetupapi -lstdc++ -lgcc -lmsvcrt
LIBS =
endif
#OBJS = $(OBJS)
include ../build/Makefile_rules.inc

View File

@ -0,0 +1,10 @@
DIRS = scas scdis scboot scinfo scrd scwr
all :
for d in $(DIRS); do (cd ../../$$d; $(MAKE) OS=$(OS) ); done
clean :
for d in $(DIRS); do (cd ../../$$d; $(MAKE) OS=$(OS) clean ); done

26
source/build/Makefile_rules.inc Executable file
View File

@ -0,0 +1,26 @@
all: ../bin/$(TARGET)
$(PROG): $(OBJS)
$(CC) -o $(PROG) $(OBJS) $(LIBS)
$(STRIP) $(PROG)
$(PROG).exe: $(PROG)
cp $(PROG) $(PROG).exe
#$(PROG).dmg: $(PROG)
# mkdir tmp
# cp $(PROG) tmp
# hdiutil create -ov -volname sctools_$(PROG) -srcfolder tmp $(PROG).dmg
#hid.o: hid_$(OS).c rawhid.h
# $(CC) $(CFLAGS) -c -o $@ $<
clean:
rm -f $(OBJS) $(PROG) $(PROG).exe $(PROG).dmg ../bin/$(TARGET)
rm -rf tmp
../bin/$(TARGET): $(TARGET)
mkdir -p ../bin
cp $(TARGET) ../bin/$(TARGET)

7
source/build/linux/Makefile Executable file
View File

@ -0,0 +1,7 @@
# build all sctools for Linux
OS = LINUX
include ../Makefile_recurse.inc

7
source/build/macosx/Makefile Executable file
View File

@ -0,0 +1,7 @@
# build all sctools for Mac OS-X
OS = MACOSX
include ../Makefile_recurse.inc

7
source/build/mingw32/Makefile Executable file
View File

@ -0,0 +1,7 @@
# build all sctools for Windows (mingw32)
OS = WINDOWS
include ../Makefile_recurse.inc

3
source/build/msvc/make.bat Executable file
View File

@ -0,0 +1,3 @@
@echo off
if "%1" == "clean" devenv sctools.sln /clean Release
if "%1" != "clean" devenv sctools.sln /build Release

61
source/build/msvc/sctools.sln Executable file
View File

@ -0,0 +1,61 @@
Microsoft Visual Studio Solution File, Format Version 8.00
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "scas", "..\..\scas\scas.vcproj", "{6BD9A7D9-B220-49FF-B527-45C04DBBDA9A}"
ProjectSection(ProjectDependencies) = postProject
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "scdis", "..\..\scdis\scdis.vcproj", "{81871EED-13AF-42FF-BB7F-88F93647B45B}"
ProjectSection(ProjectDependencies) = postProject
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "scboot", "..\..\scboot\scboot.vcproj", "{9ED4BD6A-E53F-4CB0-9057-3F45F9570B2B}"
ProjectSection(ProjectDependencies) = postProject
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "scinfo", "..\..\scinfo\scinfo.vcproj", "{A243DB4C-FFAB-46C1-B68E-89E066EFF06E}"
ProjectSection(ProjectDependencies) = postProject
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "scrd", "..\..\scrd\scrd.vcproj", "{262F101E-E54C-4DD7-A7BD-C5F07A7B0047}"
ProjectSection(ProjectDependencies) = postProject
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "scwr", "..\..\scwr\scwr.vcproj", "{63366BE7-6C6E-43E0-A59B-16AFB7DDF369}"
ProjectSection(ProjectDependencies) = postProject
EndProjectSection
EndProject
Global
GlobalSection(SolutionConfiguration) = preSolution
Debug = Debug
Release = Release
EndGlobalSection
GlobalSection(ProjectConfiguration) = postSolution
{6BD9A7D9-B220-49FF-B527-45C04DBBDA9A}.Debug.ActiveCfg = Debug|Win32
{6BD9A7D9-B220-49FF-B527-45C04DBBDA9A}.Debug.Build.0 = Debug|Win32
{6BD9A7D9-B220-49FF-B527-45C04DBBDA9A}.Release.ActiveCfg = Release|Win32
{6BD9A7D9-B220-49FF-B527-45C04DBBDA9A}.Release.Build.0 = Release|Win32
{81871EED-13AF-42FF-BB7F-88F93647B45B}.Debug.ActiveCfg = Debug|Win32
{81871EED-13AF-42FF-BB7F-88F93647B45B}.Debug.Build.0 = Debug|Win32
{81871EED-13AF-42FF-BB7F-88F93647B45B}.Release.ActiveCfg = Release|Win32
{81871EED-13AF-42FF-BB7F-88F93647B45B}.Release.Build.0 = Release|Win32
{9ED4BD6A-E53F-4CB0-9057-3F45F9570B2B}.Debug.ActiveCfg = Debug|Win32
{9ED4BD6A-E53F-4CB0-9057-3F45F9570B2B}.Debug.Build.0 = Debug|Win32
{9ED4BD6A-E53F-4CB0-9057-3F45F9570B2B}.Release.ActiveCfg = Release|Win32
{9ED4BD6A-E53F-4CB0-9057-3F45F9570B2B}.Release.Build.0 = Release|Win32
{A243DB4C-FFAB-46C1-B68E-89E066EFF06E}.Debug.ActiveCfg = Debug|Win32
{A243DB4C-FFAB-46C1-B68E-89E066EFF06E}.Debug.Build.0 = Debug|Win32
{A243DB4C-FFAB-46C1-B68E-89E066EFF06E}.Release.ActiveCfg = Release|Win32
{A243DB4C-FFAB-46C1-B68E-89E066EFF06E}.Release.Build.0 = Release|Win32
{262F101E-E54C-4DD7-A7BD-C5F07A7B0047}.Debug.ActiveCfg = Debug|Win32
{262F101E-E54C-4DD7-A7BD-C5F07A7B0047}.Debug.Build.0 = Debug|Win32
{262F101E-E54C-4DD7-A7BD-C5F07A7B0047}.Release.ActiveCfg = Release|Win32
{262F101E-E54C-4DD7-A7BD-C5F07A7B0047}.Release.Build.0 = Release|Win32
{63366BE7-6C6E-43E0-A59B-16AFB7DDF369}.Debug.ActiveCfg = Debug|Win32
{63366BE7-6C6E-43E0-A59B-16AFB7DDF369}.Debug.Build.0 = Debug|Win32
{63366BE7-6C6E-43E0-A59B-16AFB7DDF369}.Release.ActiveCfg = Release|Win32
{63366BE7-6C6E-43E0-A59B-16AFB7DDF369}.Release.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
EndGlobalSection
GlobalSection(ExtensibilityAddIns) = postSolution
EndGlobalSection
EndGlobal

22
source/common/global.h Executable file
View File

@ -0,0 +1,22 @@
#ifndef __GLOBAL_H__
#define __GLOBAL_H__
#define INVALID_NUMBER -9999
struct token_t
{
const char* token;
int value;
};
#define BLOCK_NONE -1
#define BLOCK_LAYERDEF 0
#define BLOCK_REMAP 1
#define BLOCK_MACRO 2
#ifndef _MSC_VER
#define strnicmp strncasecmp
#define stricmp strcasecmp
#endif
#endif // __GLOBAL_H__

381
source/common/hid_LINUX.c Executable file
View File

@ -0,0 +1,381 @@
/* Simple Raw HID functions for Linux - for use with Teensy RawHID example
* http://www.pjrc.com/teensy/rawhid.html
* Copyright (c) 2009 PJRC.COM, LLC
*
* rawhid_open - open 1 or more devices
* rawhid_recv - receive a packet
* rawhid_send - send a packet
* rawhid_close - close a device
*
* 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 description, website URL and 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.
*
* Version 1.0: Initial Release
*/
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <sys/param.h>
#include <usb.h>
#include "rawhid.h"
// On Linux there are several options to access HID devices.
//
// libusb 0.1 - the only way that works well on all distributions
// libusb 1.0 - someday will become standard on most distributions
// hidraw driver - relatively new, not supported on many distributions (yet)
// hiddev driver - old, ubuntu, fedora, others dropping support
// usbfs - low level usb API: http://www.kernel.org/doc/htmldocs/usb.html#usbfs
//
// This code uses libusb 0.1, which is well supported on all linux distributions
// and very stable and widely used by many programs. libusb 0.1 only provides a
// simple synchronous interface, basically the same as this code needs. However,
// if you want non-blocking I/O, libusb 0.1 simply does not provide that. There
// is also no kernel-level buffering, so performance is poor.
//
// UPDATE: As of November 2011, hidraw support seems to be working well in all
// major linux distributions. Embedded and "small" distros, used on ARM boards,
// routers and embedded hardware stil seem to omit the hidraw driver.
//
// The hidraw driver is a great solution. However, it has only been supported
// by relatively recent (in 2009) kernels. Here is a quick survey of the status
// of hidraw support in various distributions as of Sept 2009:
//
// Fedora 11: works, kernel 2.6.29.4
// Mandiva 2009.1: works, kernel 2.6.29.1
// Ubuntu 9.10-alpha6: works, kernel 2.6.31
// Ubuntu 9.04: sysfs attrs chain broken (hidraw root only), 2.6.28 kernel
// openSUSE 11.1: sysfs attrs chain broken (hidraw root only), 2.6.27.7 kernel
// Debian Live, Lenny 5.0.2: sysfs attrs chain broken (hidraw root only), 2.6.26
// SimplyMEPIS 8.0.10: sysfs attrs chain broken (hidraw root only), 2.6.27
// Mint 7: sysfs attrs chain broken (hidraw root only), 2.6.28 kernel
// Gentoo 2008.0-r1: sysfs attrs chain broken (hidraw root only), 2.6.24 kernel
// Centos 5: no hidraw or hiddev devices, 2.6.18 kernel
// Slitaz 2.0: no hidraw devices (has hiddev), 2.6.25.5 kernel
// Puppy 4.3: no hidraw devices (has hiddev), 2.6.30.5 kernel
// Damn Small 4.4.10: (would not boot)
// Gentoo 10.0-test20090926: (would not boot)
// PCLinuxOS 2009.2: (would not boot)
// Slackware: (no live cd available? www.slackware-live.org dead)
#define printf(...) // comment this out for lots of info
// a list of all opened HID devices, so the caller can
// simply refer to them by number
typedef struct hid_struct hid_t;
static hid_t *first_hid = NULL;
static hid_t *last_hid = NULL;
struct hid_struct {
usb_dev_handle *usb;
int open;
int iface;
int ep_in;
int ep_out;
struct hid_struct *prev;
struct hid_struct *next;
};
// private functions, not intended to be used from outside this file
static void add_hid(hid_t *h);
static hid_t * get_hid(int num);
static void free_all_hid(void);
static void hid_close(hid_t *hid);
static int hid_parse_item(uint32_t *val, uint8_t **data, const uint8_t *end);
// rawhid_recv - receive a packet
// Inputs:
// num = device to receive from (zero based)
// buf = buffer to receive packet
// len = buffer's size
// timeout = time to wait, in milliseconds
// Output:
// number of bytes received, or -1 on error
//
int rawhid_recv(int num, void *buf, int len, int timeout)
{
hid_t *hid;
int r;
hid = get_hid(num);
if (!hid || !hid->open) return -1;
r = usb_interrupt_read(hid->usb, hid->ep_in, buf, len, timeout);
if (r >= 0) return r;
if (r == -110) return 0; // timeout
return -1;
}
// rawhid_send - send a packet
// Inputs:
// num = device to transmit to (zero based)
// buf = buffer containing packet to send
// len = number of bytes to transmit
// timeout = time to wait, in milliseconds
// Output:
// number of bytes sent, or -1 on error
//
int rawhid_send(int num, void *buf, int len, int timeout)
{
hid_t *hid;
hid = get_hid(num);
if (!hid || !hid->open) return -1;
if (hid->ep_out) {
return usb_interrupt_write(hid->usb, hid->ep_out, buf, len, timeout);
} else {
return usb_control_msg(hid->usb, 0x21, 9, 0, hid->iface, buf, len, timeout);
}
}
// rawhid_open - open 1 or more devices
//
// Inputs:
// max = maximum number of devices to open
// vid = Vendor ID, or -1 if any
// pid = Product ID, or -1 if any
// usage_page = top level usage page, or -1 if any
// usage = top level usage number, or -1 if any
// Output:
// actual number of devices opened
//
int rawhid_open(int max, int vid, int pid, int usage_page, int usage)
{
struct usb_bus *bus;
struct usb_device *dev;
struct usb_interface *iface;
struct usb_interface_descriptor *desc;
struct usb_endpoint_descriptor *ep;
usb_dev_handle *u;
uint8_t buf[1024], *p;
int i, n, len, tag, ep_in, ep_out, count=0, claimed;
uint32_t val=0, parsed_usage, parsed_usage_page;
hid_t *hid;
if (first_hid) free_all_hid();
printf("rawhid_open, max=%d\n", max);
if (max < 1) return 0;
usb_init();
usb_find_busses();
usb_find_devices();
for (bus = usb_get_busses(); bus; bus = bus->next) {
for (dev = bus->devices; dev; dev = dev->next) {
if (vid > 0 && dev->descriptor.idVendor != vid) continue;
if (pid > 0 && dev->descriptor.idProduct != pid) continue;
if (!dev->config) continue;
if (dev->config->bNumInterfaces < 1) continue;
printf("device: vid=%04X, pic=%04X, with %d iface\n",
dev->descriptor.idVendor,
dev->descriptor.idProduct,
dev->config->bNumInterfaces);
iface = dev->config->interface;
u = NULL;
claimed = 0;
for (i=0; i<dev->config->bNumInterfaces && iface; i++, iface++) {
desc = iface->altsetting;
if (!desc) continue;
printf(" type %d, %d, %d\n", desc->bInterfaceClass,
desc->bInterfaceSubClass, desc->bInterfaceProtocol);
if (desc->bInterfaceClass != 3) continue;
if (desc->bInterfaceSubClass != 0) continue;
if (desc->bInterfaceProtocol != 0) continue;
ep = desc->endpoint;
ep_in = ep_out = 0;
for (n = 0; n < desc->bNumEndpoints; n++, ep++) {
if (ep->bEndpointAddress & 0x80) {
if (!ep_in) ep_in = ep->bEndpointAddress & 0x7F;
printf(" IN endpoint %d\n", ep_in);
} else {
if (!ep_out) ep_out = ep->bEndpointAddress;
printf(" OUT endpoint %d\n", ep_out);
}
}
if (!ep_in) continue;
if (!u) {
u = usb_open(dev);
if (!u) {
printf(" unable to open device\n");
break;
}
}
printf(" hid interface (generic)\n");
if (usb_get_driver_np(u, i, (char *)buf, sizeof(buf)) >= 0) {
printf(" in use by driver \"%s\"\n", buf);
if (usb_detach_kernel_driver_np(u, i) < 0) {
printf(" unable to detach from kernel\n");
continue;
}
}
if (usb_claim_interface(u, i) < 0) {
printf(" unable claim interface %d\n", i);
continue;
}
len = usb_control_msg(u, 0x81, 6, 0x2200, i, (char *)buf, sizeof(buf), 250);
printf(" descriptor, len=%d\n", len);
if (len < 2) {
usb_release_interface(u, i);
continue;
}
p = buf;
parsed_usage_page = parsed_usage = 0;
while ((tag = hid_parse_item(&val, &p, buf + len)) >= 0) {
printf(" tag: %X, val %X\n", tag, val);
if (tag == 4) parsed_usage_page = val;
if (tag == 8) parsed_usage = val;
if (parsed_usage_page && parsed_usage) break;
}
if ((!parsed_usage_page) || (!parsed_usage) ||
(usage_page > 0 && parsed_usage_page != usage_page) ||
(usage > 0 && parsed_usage != usage)) {
usb_release_interface(u, i);
continue;
}
hid = (struct hid_struct *)malloc(sizeof(struct hid_struct));
if (!hid) {
usb_release_interface(u, i);
continue;
}
hid->usb = u;
hid->iface = i;
hid->ep_in = ep_in;
hid->ep_out = ep_out;
hid->open = 1;
add_hid(hid);
claimed++;
count++;
if (count >= max) return count;
}
if (u && !claimed) usb_close(u);
}
}
return count;
}
// rawhid_close - close a device
//
// Inputs:
// num = device to close (zero based)
// Output
// (nothing)
//
void rawhid_close(int num)
{
hid_t *hid;
hid = get_hid(num);
if (!hid || !hid->open) return;
hid_close(hid);
}
// Chuck Robey wrote a real HID report parser
// (chuckr@telenix.org) chuckr@chuckr.org
// http://people.freebsd.org/~chuckr/code/python/uhidParser-0.2.tbz
// this tiny thing only needs to extract the top-level usage page
// and usage, and even then is may not be truly correct, but it does
// work with the Teensy Raw HID example.
static int hid_parse_item(uint32_t *val, uint8_t **data, const uint8_t *end)
{
const uint8_t *p = *data;
uint8_t tag;
int table[4] = {0, 1, 2, 4};
int len;
if (p >= end) return -1;
if (p[0] == 0xFE) {
// long item, HID 1.11, 6.2.2.3, page 27
if (p + 5 >= end || p + p[1] >= end) return -1;
tag = p[2];
*val = 0;
len = p[1] + 5;
} else {
// short item, HID 1.11, 6.2.2.2, page 26
tag = p[0] & 0xFC;
len = table[p[0] & 0x03];
if (p + len + 1 >= end) return -1;
switch (p[0] & 0x03) {
case 3: *val = p[1] | (p[2] << 8) | (p[3] << 16) | (p[4] << 24); break;
case 2: *val = p[1] | (p[2] << 8); break;
case 1: *val = p[1]; break;
case 0: *val = 0; break;
}
}
*data += len + 1;
return tag;
}
static void add_hid(hid_t *h)
{
if (!first_hid || !last_hid) {
first_hid = last_hid = h;
h->next = h->prev = NULL;
return;
}
last_hid->next = h;
h->prev = last_hid;
h->next = NULL;
last_hid = h;
}
static hid_t * get_hid(int num)
{
hid_t *p;
for (p = first_hid; p && num > 0; p = p->next, num--) ;
return p;
}
static void free_all_hid(void)
{
hid_t *p, *q;
for (p = first_hid; p; p = p->next) {
hid_close(p);
}
p = first_hid;
while (p) {
q = p;
p = p->next;
free(q);
}
first_hid = last_hid = NULL;
}
static void hid_close(hid_t *hid)
{
hid_t *p;
int others=0;
usb_release_interface(hid->usb, hid->iface);
for (p = first_hid; p; p = p->next) {
if (p->open && p->usb == hid->usb) others++;
}
if (!others) usb_close(hid->usb);
hid->usb = NULL;
}

409
source/common/hid_MACOSX.c Executable file
View File

@ -0,0 +1,409 @@
/* Simple Raw HID functions for Linux - for use with Teensy RawHID example
* http://www.pjrc.com/teensy/rawhid.html
* Copyright (c) 2009 PJRC.COM, LLC
*
* rawhid_open - open 1 or more devices
* rawhid_recv - receive a packet
* rawhid_send - send a packet
* rawhid_close - close a device
*
* 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 description, website URL and 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.
*
* Version 1.0: Initial Release
*/
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <unistd.h>
#include <IOKit/IOKitLib.h>
#include <IOKit/hid/IOHIDLib.h>
#include "rawhid.h"
#define BUFFER_SIZE 64
#define printf(...) // comment this out to get lots of info printed
// a list of all opened HID devices, so the caller can
// simply refer to them by number
typedef struct hid_struct hid_t;
typedef struct buffer_struct buffer_t;
static hid_t *first_hid = NULL;
static hid_t *last_hid = NULL;
struct hid_struct {
IOHIDDeviceRef ref;
int open;
uint8_t buffer[BUFFER_SIZE];
buffer_t *first_buffer;
buffer_t *last_buffer;
struct hid_struct *prev;
struct hid_struct *next;
};
struct buffer_struct {
struct buffer_struct *next;
uint32_t len;
uint8_t buf[BUFFER_SIZE];
};
// private functions, not intended to be used from outside this file
static void add_hid(hid_t *);
static hid_t * get_hid(int);
static void free_all_hid(void);
static void hid_close(hid_t *);
static void attach_callback(void *, IOReturn, void *, IOHIDDeviceRef);
static void detach_callback(void *, IOReturn, void *hid_mgr, IOHIDDeviceRef dev);
static void timeout_callback(CFRunLoopTimerRef, void *);
static void input_callback(void *, IOReturn, void *, IOHIDReportType,
uint32_t, uint8_t *, CFIndex);
// rawhid_recv - receive a packet
// Inputs:
// num = device to receive from (zero based)
// buf = buffer to receive packet
// len = buffer's size
// timeout = time to wait, in milliseconds
// Output:
// number of bytes received, or -1 on error
//
int rawhid_recv(int num, void *buf, int len, int timeout)
{
hid_t *hid;
buffer_t *b;
CFRunLoopTimerRef timer=NULL;
CFRunLoopTimerContext context;
int ret=0, timeout_occurred=0;
if (len < 1) return 0;
hid = get_hid(num);
if (!hid || !hid->open) return -1;
if ((b = hid->first_buffer) != NULL) {
if (len > b->len) len = b->len;
memcpy(buf, b->buf, len);
hid->first_buffer = b->next;
free(b);
return len;
}
memset(&context, 0, sizeof(context));
context.info = &timeout_occurred;
timer = CFRunLoopTimerCreate(NULL, CFAbsoluteTimeGetCurrent() +
(double)timeout / 1000.0, 0, 0, 0, timeout_callback, &context);
CFRunLoopAddTimer(CFRunLoopGetCurrent(), timer, kCFRunLoopDefaultMode);
while (1) {
CFRunLoopRun();
if ((b = hid->first_buffer) != NULL) {
if (len > b->len) len = b->len;
memcpy(buf, b->buf, len);
hid->first_buffer = b->next;
free(b);
ret = len;
break;
}
if (!hid->open) {
printf("rawhid_recv, device not open\n");
ret = -1;
break;
}
if (timeout_occurred) break;
}
CFRunLoopTimerInvalidate(timer);
CFRelease(timer);
return ret;
}
static void input_callback(void *context, IOReturn ret, void *sender,
IOHIDReportType type, uint32_t id, uint8_t *data, CFIndex len)
{
buffer_t *n;
hid_t *hid;
printf("input_callback\n");
if (ret != kIOReturnSuccess || len < 1) return;
hid = context;
if (!hid || hid->ref != sender) return;
n = (buffer_t *)malloc(sizeof(buffer_t));
if (!n) return;
if (len > BUFFER_SIZE) len = BUFFER_SIZE;
memcpy(n->buf, data, len);
n->len = len;
n->next = NULL;
if (!hid->first_buffer || !hid->last_buffer) {
hid->first_buffer = hid->last_buffer = n;
} else {
hid->last_buffer->next = n;
hid->last_buffer = n;
}
CFRunLoopStop(CFRunLoopGetCurrent());
}
static void timeout_callback(CFRunLoopTimerRef timer, void *info)
{
printf("timeout_callback\n");
*(int *)info = 1;
CFRunLoopStop(CFRunLoopGetCurrent());
}
void output_callback(void *context, IOReturn ret, void *sender,
IOHIDReportType type, uint32_t id, uint8_t *data, CFIndex len)
{
printf("output_callback, r=%d\n", ret);
if (ret == kIOReturnSuccess) {
*(int *)context = len;
} else {
// timeout if not success?
*(int *)context = 0;
}
CFRunLoopStop(CFRunLoopGetCurrent());
}
// rawhid_send - send a packet
// Inputs:
// num = device to transmit to (zero based)
// buf = buffer containing packet to send
// len = number of bytes to transmit
// timeout = time to wait, in milliseconds
// Output:
// number of bytes sent, or -1 on error
//
int rawhid_send(int num, void *buf, int len, int timeout)
{
hid_t *hid;
int result=-100;
hid = get_hid(num);
if (!hid || !hid->open) return -1;
#if 1
#warning "Send timeout not implemented on MACOSX"
IOReturn ret = IOHIDDeviceSetReport(hid->ref, kIOHIDReportTypeOutput, 0, buf, len);
result = (ret == kIOReturnSuccess) ? len : -1;
#endif
#if 0
// No matter what I tried this never actually sends an output
// report and output_callback never gets called. Why??
// Did I miss something? This is exactly the same params as
// the sync call that works. Is it an Apple bug?
// (submitted to Apple on 22-sep-2009, problem ID 7245050)
//
IOHIDDeviceScheduleWithRunLoop(hid->ref, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);
// should already be scheduled with run loop by attach_callback,
// sadly this doesn't make any difference either way
//
IOHIDDeviceSetReportWithCallback(hid->ref, kIOHIDReportTypeOutput,
0, buf, len, (double)timeout / 1000.0, output_callback, &result);
while (1) {
printf("enter run loop (send)\n");
CFRunLoopRun();
printf("leave run loop (send)\n");
if (result > -100) break;
if (!hid->open) {
result = -1;
break;
}
}
#endif
return result;
}
// rawhid_open - open 1 or more devices
//
// Inputs:
// max = maximum number of devices to open
// vid = Vendor ID, or -1 if any
// pid = Product ID, or -1 if any
// usage_page = top level usage page, or -1 if any
// usage = top level usage number, or -1 if any
// Output:
// actual number of devices opened
//
int rawhid_open(int max, int vid, int pid, int usage_page, int usage)
{
static IOHIDManagerRef hid_manager=NULL;
CFMutableDictionaryRef dict;
CFNumberRef num;
IOReturn ret;
hid_t *p;
int count=0;
if (first_hid) free_all_hid();
printf("rawhid_open, max=%d\n", max);
if (max < 1) return 0;
// Start the HID Manager
// http://developer.apple.com/technotes/tn2007/tn2187.html
if (!hid_manager) {
hid_manager = IOHIDManagerCreate(kCFAllocatorDefault, kIOHIDOptionsTypeNone);
if (hid_manager == NULL || CFGetTypeID(hid_manager) != IOHIDManagerGetTypeID()) {
if (hid_manager) CFRelease(hid_manager);
return 0;
}
}
if (vid > 0 || pid > 0 || usage_page > 0 || usage > 0) {
// Tell the HID Manager what type of devices we want
dict = CFDictionaryCreateMutable(kCFAllocatorDefault, 0,
&kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
if (!dict) return 0;
if (vid > 0) {
num = CFNumberCreate(kCFAllocatorDefault, kCFNumberIntType, &vid);
CFDictionarySetValue(dict, CFSTR(kIOHIDVendorIDKey), num);
CFRelease(num);
}
if (pid > 0) {
num = CFNumberCreate(kCFAllocatorDefault, kCFNumberIntType, &pid);
CFDictionarySetValue(dict, CFSTR(kIOHIDProductIDKey), num);
CFRelease(num);
}
if (usage_page > 0) {
num = CFNumberCreate(kCFAllocatorDefault, kCFNumberIntType, &usage_page);
CFDictionarySetValue(dict, CFSTR(kIOHIDPrimaryUsagePageKey), num);
CFRelease(num);
}
if (usage > 0) {
num = CFNumberCreate(kCFAllocatorDefault, kCFNumberIntType, &usage);
CFDictionarySetValue(dict, CFSTR(kIOHIDPrimaryUsageKey), num);
CFRelease(num);
}
IOHIDManagerSetDeviceMatching(hid_manager, dict);
CFRelease(dict);
} else {
IOHIDManagerSetDeviceMatching(hid_manager, NULL);
}
// set up a callbacks for device attach & detach
IOHIDManagerScheduleWithRunLoop(hid_manager, CFRunLoopGetCurrent(),
kCFRunLoopDefaultMode);
IOHIDManagerRegisterDeviceMatchingCallback(hid_manager, attach_callback, NULL);
IOHIDManagerRegisterDeviceRemovalCallback(hid_manager, detach_callback, NULL);
ret = IOHIDManagerOpen(hid_manager, kIOHIDOptionsTypeNone);
if (ret != kIOReturnSuccess) {
IOHIDManagerUnscheduleFromRunLoop(hid_manager,
CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);
CFRelease(hid_manager);
return 0;
}
printf("run loop\n");
// let it do the callback for all devices
while (CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0, true) == kCFRunLoopRunHandledSource) ;
// count up how many were added by the callback
for (p = first_hid; p; p = p->next) count++;
return count;
}
// rawhid_close - close a device
//
// Inputs:
// num = device to close (zero based)
// Output
// (nothing)
//
void rawhid_close(int num)
{
hid_t *hid;
hid = get_hid(num);
if (!hid || !hid->open) return;
hid_close(hid);
hid->open = 0;
}
static void add_hid(hid_t *h)
{
if (!first_hid || !last_hid) {
first_hid = last_hid = h;
h->next = h->prev = NULL;
return;
}
last_hid->next = h;
h->prev = last_hid;
h->next = NULL;
last_hid = h;
}
static hid_t * get_hid(int num)
{
hid_t *p;
for (p = first_hid; p && num > 0; p = p->next, num--) ;
return p;
}
static void free_all_hid(void)
{
hid_t *p, *q;
for (p = first_hid; p; p = p->next) {
hid_close(p);
}
p = first_hid;
while (p) {
q = p;
p = p->next;
free(q);
}
first_hid = last_hid = NULL;
}
static void hid_close(hid_t *hid)
{
if (!hid || !hid->open || !hid->ref) return;
IOHIDDeviceUnscheduleFromRunLoop(hid->ref, CFRunLoopGetCurrent( ), kCFRunLoopDefaultMode);
IOHIDDeviceClose(hid->ref, kIOHIDOptionsTypeNone);
hid->ref = NULL;
}
static void detach_callback(void *context, IOReturn r, void *hid_mgr, IOHIDDeviceRef dev)
{
hid_t *p;
printf("detach callback\n");
for (p = first_hid; p; p = p->next) {
if (p->ref == dev) {
p->open = 0;
CFRunLoopStop(CFRunLoopGetCurrent());
return;
}
}
}
static void attach_callback(void *context, IOReturn r, void *hid_mgr, IOHIDDeviceRef dev)
{
struct hid_struct *h;
printf("attach callback\n");
if (IOHIDDeviceOpen(dev, kIOHIDOptionsTypeNone) != kIOReturnSuccess) return;
h = (hid_t *)malloc(sizeof(hid_t));
if (!h) return;
memset(h, 0, sizeof(hid_t));
IOHIDDeviceScheduleWithRunLoop(dev, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);
IOHIDDeviceRegisterInputReportCallback(dev, h->buffer, sizeof(h->buffer),
input_callback, h);
h->ref = dev;
h->open = 1;
add_hid(h);
}

330
source/common/hid_WINDOWS.c Executable file
View File

@ -0,0 +1,330 @@
/* Simple Raw HID functions for Windows - for use with Teensy RawHID example
* http://www.pjrc.com/teensy/rawhid.html
* Copyright (c) 2009 PJRC.COM, LLC
*
* rawhid_open - open 1 or more devices
* rawhid_recv - receive a packet
* rawhid_send - send a packet
* rawhid_close - close a device
*
* 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 description, website URL and 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.
*
* Version 1.0: Initial Release
*/
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <windows.h>
#include <setupapi.h>
#include <ddk/hidsdi.h>
#include <ddk/hidclass.h>
#include "rawhid.h"
// a list of all opened HID devices, so the caller can
// simply refer to them by number
typedef struct hid_struct hid_t;
static hid_t *first_hid = NULL;
static hid_t *last_hid = NULL;
struct hid_struct {
HANDLE handle;
int open;
struct hid_struct *prev;
struct hid_struct *next;
};
static HANDLE rx_event=NULL;
static HANDLE tx_event=NULL;
static CRITICAL_SECTION rx_mutex;
static CRITICAL_SECTION tx_mutex;
// private functions, not intended to be used from outside this file
static void add_hid(hid_t *h);
static hid_t * get_hid(int num);
static void free_all_hid(void);
static void hid_close(hid_t *hid);
void print_win32_err(void);
// rawhid_recv - receive a packet
// Inputs:
// num = device to receive from (zero based)
// buf = buffer to receive packet
// len = buffer's size
// timeout = time to wait, in milliseconds
// Output:
// number of bytes received, or -1 on error
//
int RAWHIDFN rawhid_recv(int num, void *buf, int len, int timeout)
{
hid_t *hid;
unsigned char tmpbuf[516];
OVERLAPPED ov;
DWORD n, r;
if (sizeof(tmpbuf) < len + 1) return -1;
hid = get_hid(num);
if (!hid || !hid->open) return -1;
EnterCriticalSection(&rx_mutex);
ResetEvent(&rx_event);
memset(&ov, 0, sizeof(ov));
ov.hEvent = rx_event;
if (!ReadFile(hid->handle, tmpbuf, len + 1, NULL, &ov)) {
if (GetLastError() != ERROR_IO_PENDING) goto return_error;
r = WaitForSingleObject(rx_event, timeout);
if (r == WAIT_TIMEOUT) goto return_timeout;
if (r != WAIT_OBJECT_0) goto return_error;
}
if (!GetOverlappedResult(hid->handle, &ov, &n, FALSE)) goto return_error;
LeaveCriticalSection(&rx_mutex);
if (n <= 0) return -1;
n--;
if (n > len) n = len;
memcpy(buf, tmpbuf + 1, n);
return n;
return_timeout:
CancelIo(hid->handle);
LeaveCriticalSection(&rx_mutex);
return 0;
return_error:
print_win32_err();
LeaveCriticalSection(&rx_mutex);
return -1;
}
// rawhid_send - send a packet
// Inputs:
// num = device to transmit to (zero based)
// buf = buffer containing packet to send
// len = number of bytes to transmit
// timeout = time to wait, in milliseconds
// Output:
// number of bytes sent, or -1 on error
//
int RAWHIDFN rawhid_send(int num, void *buf, int len, int timeout)
{
hid_t *hid;
unsigned char tmpbuf[516];
OVERLAPPED ov;
DWORD n, r;
if (sizeof(tmpbuf) < len + 1) return -1;
hid = get_hid(num);
if (!hid || !hid->open) return -1;
EnterCriticalSection(&tx_mutex);
ResetEvent(&tx_event);
memset(&ov, 0, sizeof(ov));
ov.hEvent = tx_event;
tmpbuf[0] = 0;
memcpy(tmpbuf + 1, buf, len);
if (!WriteFile(hid->handle, tmpbuf, len + 1, NULL, &ov)) {
if (GetLastError() != ERROR_IO_PENDING) goto return_error;
r = WaitForSingleObject(tx_event, timeout);
if (r == WAIT_TIMEOUT) goto return_timeout;
if (r != WAIT_OBJECT_0) goto return_error;
}
if (!GetOverlappedResult(hid->handle, &ov, &n, FALSE)) goto return_error;
LeaveCriticalSection(&tx_mutex);
if (n <= 0) return -1;
return n - 1;
return_timeout:
CancelIo(hid->handle);
LeaveCriticalSection(&tx_mutex);
return 0;
return_error:
print_win32_err();
LeaveCriticalSection(&tx_mutex);
return -1;
}
// rawhid_open - open 1 or more devices
//
// Inputs:
// max = maximum number of devices to open
// vid = Vendor ID, or -1 if any
// pid = Product ID, or -1 if any
// usage_page = top level usage page, or -1 if any
// usage = top level usage number, or -1 if any
// Output:
// actual number of devices opened
//
int RAWHIDFN rawhid_open(int max, int vid, int pid, int usage_page, int usage)
{
GUID guid;
HDEVINFO info;
DWORD index=0, reqd_size;
SP_DEVICE_INTERFACE_DATA iface;
SP_DEVICE_INTERFACE_DETAIL_DATA *details;
HIDD_ATTRIBUTES attrib;
PHIDP_PREPARSED_DATA hid_data;
HIDP_CAPS capabilities;
HANDLE h;
BOOL ret;
hid_t *hid;
int count=0;
if (first_hid) free_all_hid();
if (max < 1) return 0;
if (!rx_event) {
rx_event = CreateEvent(NULL, TRUE, TRUE, NULL);
tx_event = CreateEvent(NULL, TRUE, TRUE, NULL);
InitializeCriticalSection(&rx_mutex);
InitializeCriticalSection(&tx_mutex);
}
HidD_GetHidGuid(&guid);
info = SetupDiGetClassDevs(&guid, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
if (info == INVALID_HANDLE_VALUE) return 0;
for (index=0; 1 ;index++) {
iface.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
ret = SetupDiEnumDeviceInterfaces(info, NULL, &guid, index, &iface);
if (!ret) return count;
SetupDiGetInterfaceDeviceDetail(info, &iface, NULL, 0, &reqd_size, NULL);
details = (SP_DEVICE_INTERFACE_DETAIL_DATA *)malloc(reqd_size);
if (details == NULL) continue;
memset(details, 0, reqd_size);
details->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
ret = SetupDiGetDeviceInterfaceDetail(info, &iface, details,
reqd_size, NULL, NULL);
if (!ret) {
free(details);
continue;
}
h = CreateFile(details->DevicePath, GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE, NULL,
OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
free(details);
if (h == INVALID_HANDLE_VALUE) continue;
attrib.Size = sizeof(HIDD_ATTRIBUTES);
ret = HidD_GetAttributes(h, &attrib);
//printf("vid: %4x\n", attrib.VendorID);
if (!ret || (vid > 0 && attrib.VendorID != vid) ||
(pid > 0 && attrib.ProductID != pid) ||
!HidD_GetPreparsedData(h, &hid_data)) {
CloseHandle(h);
continue;
}
if (!HidP_GetCaps(hid_data, &capabilities) ||
(usage_page > 0 && capabilities.UsagePage != usage_page) ||
(usage > 0 && capabilities.Usage != usage)) {
HidD_FreePreparsedData(hid_data);
CloseHandle(h);
continue;
}
HidD_FreePreparsedData(hid_data);
hid = (struct hid_struct *)malloc(sizeof(struct hid_struct));
if (!hid) {
CloseHandle(h);
continue;
}
hid->handle = h;
hid->open = 1;
add_hid(hid);
count++;
if (count >= max) return count;
}
return count;
}
// rawhid_close - close a device
//
// Inputs:
// num = device to close (zero based)
// Output
// (nothing)
//
void RAWHIDFN rawhid_close(int num)
{
hid_t *hid;
hid = get_hid(num);
if (!hid || !hid->open) return;
hid_close(hid);
}
static void add_hid(hid_t *h)
{
if (!first_hid || !last_hid) {
first_hid = last_hid = h;
h->next = h->prev = NULL;
return;
}
last_hid->next = h;
h->prev = last_hid;
h->next = NULL;
last_hid = h;
}
static hid_t * get_hid(int num)
{
hid_t *p;
for (p = first_hid; p && num > 0; p = p->next, num--) ;
return p;
}
static void free_all_hid(void)
{
hid_t *p, *q;
for (p = first_hid; p; p = p->next) {
hid_close(p);
}
p = first_hid;
while (p) {
q = p;
p = p->next;
free(q);
}
first_hid = last_hid = NULL;
}
static void hid_close(hid_t *hid)
{
CloseHandle(hid->handle);
hid->handle = NULL;
}
void print_win32_err(void)
{
char buf[256];
DWORD err;
err = GetLastError();
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, err,
0, buf, sizeof(buf), NULL);
printf("err %ld: %s\n", err, buf);
}

319
source/common/hid_tokens.cpp Executable file
View File

@ -0,0 +1,319 @@
#include "hid_tokens.h"
#include "global.h"
#include <string.h>
token_t meta_token_list[] =
{
{ "LCTRL", 0x01 }, // Left Control
{ "LSHIFT", 0x02 }, // Left Shift
{ "LALT", 0x04 }, // Left Alt
{ "LGUI", 0x08 }, // Left GUI
{ "RCTRL", 0x10 }, // Right Control
{ "RSHIFT", 0x20 }, // Right Shift
{ "RALT", 0x40 }, // Right Alt
{ "RGUI", 0x80 }, // Right GUI
{ "CTRL", 0x11 }, // Either/Both Control
{ "SHIFT", 0x22 }, // Either/Both Shift
{ "ALT", 0x44 }, // Either/Both Alt
{ "GUI", 0x88 }, // Either/Both GUI
{ "ALL", 0xFF }, // Any/All
};
token_t hid_token_list[] =
{
{ "UNASSIGNED", 0x00 }, // No Event
{ "OVERRUN_ERROR", 0x01 }, // Overrun Error
{ "POST_FAIL", 0x02 }, // POST Fail
{ "ERROR_UNDEFINED", 0x03 }, // ErrorUndefined
{ "A", 0x04 }, // a A
{ "B", 0x05 }, // b B
{ "C", 0x06 }, // c C
{ "D", 0x07 }, // d D
{ "E", 0x08 }, // e E
{ "F", 0x09 }, // f F
{ "G", 0x0A }, // g G
{ "H", 0x0B }, // h H
{ "I", 0x0C }, // i I
{ "J", 0x0D }, // j J
{ "K", 0x0E }, // k K
{ "L", 0x0F }, // l L
{ "M", 0x10 }, // m M
{ "N", 0x11 }, // n N
{ "O", 0x12 }, // o O
{ "P", 0x13 }, // p P
{ "Q", 0x14 }, // q Q
{ "R", 0x15 }, // r R
{ "S", 0x16 }, // s S
{ "T", 0x17 }, // t T
{ "U", 0x18 }, // u U
{ "V", 0x19 }, // v V
{ "W", 0x1A }, // w W
{ "X", 0x1B }, // x X
{ "Y", 0x1C }, // y Y
{ "Z", 0x1D }, // z Z
{ "1", 0x1E }, // 1 !
{ "2", 0x1F }, // 2 @
{ "3", 0x20 }, // 3 #
{ "4", 0x21 }, // 4 $
{ "5", 0x22 }, // 5 %
{ "6", 0x23 }, // 6 ^
{ "7", 0x24 }, // 7 &
{ "8", 0x25 }, // 8 *
{ "9", 0x26 }, // 9 (
{ "0", 0x27 }, // 0 )
{ "ENTER", 0x28 }, // Return
{ "ESC", 0x29 }, // Escape
{ "BACKSPACE", 0x2A }, // Backspace
{ "TAB", 0x2B }, // Tab
{ "SPACE", 0x2C }, // Space
{ "MINUS", 0x2D }, // minus _
{ "EQUAL", 0x2E }, // = +
{ "LEFT_BRACE", 0x2F }, // [ {
{ "RIGHT_BRACE", 0x30 }, // ] }
{ "BACKSLASH", 0x31 }, // \ |
{ "EUROPE_1", 0x32 }, // Europe 1
{ "SEMICOLON", 0x33 }, // ; :
{ "QUOTE", 0x34 }, // quotes
{ "BACK_QUOTE", 0x35 }, // ` ~
{ "COMMA", 0x36 }, // comma <
{ "PERIOD", 0x37 }, // . >
{ "SLASH", 0x38 }, // / ?
{ "CAPS_LOCK", 0x39 }, // Caps Lock
{ "F1", 0x3A }, // F1
{ "F2", 0x3B }, // F2
{ "F3", 0x3C }, // F3
{ "F4", 0x3D }, // F4
{ "F5", 0x3E }, // F5
{ "F6", 0x3F }, // F6
{ "F7", 0x40 }, // F7
{ "F8", 0x41 }, // F8
{ "F9", 0x42 }, // F9
{ "F10", 0x43 }, // F10
{ "F11", 0x44 }, // F11
{ "F12", 0x45 }, // F12
{ "PRINTSCREEN", 0x46 }, // Print Screen
{ "SCROLL_LOCK", 0x47 }, // Scroll Lock
{ "PAUSE", 0x48 }, // Pause
{ "INSERT", 0x49 }, // Insert
{ "HOME", 0x4A }, // Home
{ "PAGE_UP", 0x4B }, // Page Up
{ "DELETE", 0x4C }, // Delete
{ "END", 0x4D }, // End
{ "PAGE_DOWN", 0x4E }, // Page Down
{ "RIGHT", 0x4F }, // Right Arrow
{ "LEFT", 0x50 }, // Left Arrow
{ "DOWN", 0x51 }, // Down Arrow
{ "UP", 0x52 }, // Up Arrow
{ "NUM_LOCK", 0x53 }, // Num Lock
{ "PAD_SLASH", 0x54 }, // Keypad /
{ "PAD_ASTERIX", 0x55 }, // Keypad *
{ "PAD_MINUS", 0x56 }, // Keypad -
{ "PAD_PLUS", 0x57 }, // Keypad +
{ "PAD_ENTER", 0x58 }, // Keypad Enter
{ "PAD_1", 0x59 }, // Keypad 1 End
{ "PAD_2", 0x5A }, // Keypad 2 Down
{ "PAD_3", 0x5B }, // Keypad 3 PageDn
{ "PAD_4", 0x5C }, // Keypad 4 Left
{ "PAD_5", 0x5D }, // Keypad 5
{ "PAD_6", 0x5E }, // Keypad 6 Right
{ "PAD_7", 0x5F }, // Keypad 7 Home
{ "PAD_8", 0x60 }, // Keypad 8 Up
{ "PAD_9", 0x61 }, // Keypad 9 PageUp
{ "PAD_0", 0x62 }, // Keypad 0 Insert
{ "PAD_PERIOD", 0x63 }, // Keypad . Delete
{ "EUROPE_2", 0x64 }, // Europe 2
{ "APP", 0x65 }, // App
{ "POWER", 0x66 }, // Keyboard Power
{ "PAD_EQUALS", 0x67 }, // Keypad =
{ "F13", 0x68 }, // F13
{ "F14", 0x69 }, // F14
{ "F15", 0x6A }, // F15
{ "F16", 0x6B }, // F16
{ "F17", 0x6C }, // F17
{ "F18", 0x6D }, // F18
{ "F19", 0x6E }, // F19
{ "F20", 0x6F }, // F20
{ "F21", 0x70 }, // F21
{ "F22", 0x71 }, // F22
{ "F23", 0x72 }, // F23
{ "F24", 0x73 }, // F24
{ "EXECUTE", 0x74 }, // Keyboard Execute
{ "HELP", 0x75 }, // Keyboard Help
{ "MENU", 0x76 }, // Keyboard Menu
{ "SELECT", 0x77 }, // Keyboard Select
{ "STOP", 0x78 }, // Keyboard Stop
{ "AGAIN", 0x79 }, // Keyboard Again
{ "UNDO", 0x7A }, // Keyboard Undo
{ "CUT", 0x7B }, // Keyboard Cut
{ "COPY", 0x7C }, // Keyboard Copy
{ "PASTE", 0x7D }, // Keyboard Paste
{ "FIND", 0x7E }, // Keyboard Find
{ "MUTE", 0x7F }, // Keyboard Mute
{ "VOLUME_UP", 0x80 }, // Keyboard Volume Up
{ "VOLUME_DOWN", 0x81 }, // Keyboard Volume Dn
{ "LOCKING_CAPS_LOCK", 0x82 }, // Keyboard Locking Caps Lock
{ "LOCKING_NUM_LOCK", 0x83 }, // Keyboard Locking Num Lock
{ "LOCKING_SCROLL_LOCK", 0x84 }, // Keyboard Locking Scroll Lock
{ "PAD_COMMA", 0x85 }, // Keypad comma (Brazilian Keypad .)
{ "EQUAL_SIGN", 0x86 }, // Keyboard Equal Sign
{ "INTERNATIONAL_1", 0x87 }, // Keyboard Int'l 1 (Ro)
{ "INTERNATIONAL_2", 0x88 }, // Keyboard Intl'2 (Katakana/Hiragana)
{ "INTERNATIONAL_3", 0x89 }, // Keyboard Int'l 2 (Yen)
{ "INTERNATIONAL_4", 0x8A }, // Keyboard Int'l 4 (Henkan)
{ "INTERNATIONAL_5", 0x8B }, // Keyboard Int'l 5 (Muhenkan)
{ "INTERNATIONAL_6", 0x8C }, // Keyboard Int'l 6 (PC9800 Keypad comma)
{ "INTERNATIONAL_7", 0x8D }, // Keyboard Int'l 7
{ "INTERNATIONAL_8", 0x8E }, // Keyboard Int'l 8
{ "INTERNATIONAL_9", 0x8F }, // Keyboard Int'l 9
{ "LANG_1", 0x90 }, // Keyboard Lang 1 (Hanguel/English)
{ "LANG_2", 0x91 }, // Keyboard Lang 2 (Hanja)
{ "LANG_3", 0x92 }, // Keyboard Lang 3 (Katakana)
{ "LANG_4", 0x93 }, // Keyboard Lang 4 (Hiragana)
{ "LANG_5", 0x94 }, // Keyboard Lang 5 (Zenkaku/Hankaku)
{ "LANG_6", 0x95 }, // Keyboard Lang 6
{ "LANG_7", 0x96 }, // Keyboard Lang 7
{ "LANG_8", 0x97 }, // Keyboard Lang 8
{ "LANG_9", 0x98 }, // Keyboard Lang 9
{ "ALTERNATE_ERASE", 0x99 }, // Keyboard Alternate Erase
{ "SYSREQ_ATTN", 0x9A }, // Keyboard SysReq/Attention
{ "CANCEL", 0x9B }, // Keyboard Cancel
{ "CLEAR", 0x9C }, // Keyboard Clear
{ "PRIOR", 0x9D }, // Keyboard Prior
{ "RETURN", 0x9E }, // Keyboard Return
{ "SEPARATOR", 0x9F }, // Keyboard Separator
{ "OUT", 0xA0 }, // Keyboard Out
{ "OPER", 0xA1 }, // Keyboard Oper
{ "CLEAR_AGAIN", 0xA2 }, // Keyboard Clear/Again
{ "CRSEL_PROPS", 0xA3 }, // Keyboard CrSel/Props
{ "EXSEL", 0xA4 }, // Keyboard ExSel
{ "SYSTEM_POWER", 0xA8 }, // System Power
{ "SYSTEM_SLEEP", 0xA9 }, // System Sleep
{ "SYSTEM_WAKE", 0xAA }, // System Wake
{ "AUX1", 0xAB }, // Auxiliary key 1
{ "AUX2", 0xAC }, // Auxiliary key 2
{ "AUX3", 0xAD }, // Auxiliary key 3
{ "AUX4", 0xAE }, // Auxiliary key 4
{ "AUX5", 0xAF }, // Auxiliary key 5
//{ "EXTRA_UNUSED_1", 0xB0 }, // extra
{ "EXTRA_LALT", 0xB1 }, // AT-F extra pad lhs of space
{ "EXTRA_PAD_PLUS", 0xB2 }, // Term extra pad bottom of keypad +
{ "EXTRA_RALT", 0xB3 }, // AT-F extra pad rhs of space
{ "EXTRA_EUROPE_2", 0xB4 }, // AT-F extra pad lhs of enter
{ "EXTRA_BACKSLASH", 0xB5 }, // AT-F extra pad top of enter
{ "EXTRA_INSERT", 0xB6 }, // AT-F extra pad lhs of Insert
{ "EXTRA_F1", 0xB7 }, // Term F1
{ "EXTRA_F2", 0xB8 }, // Term F2
{ "EXTRA_F3", 0xB9 }, // Term F3
{ "EXTRA_F4", 0xBA }, // Term F4
{ "EXTRA_F5", 0xBB }, // Term F5
{ "EXTRA_F6", 0xBC }, // Term F6
{ "EXTRA_F7", 0xBD }, // Term F7
{ "EXTRA_F8", 0xBE }, // Term F8
{ "EXTRA_F9", 0xBF }, // Term F9
{ "EXTRA_F10", 0xC0 }, // Term F10
//{ "EXTRA_UNUSED_2", 0xC1 }, // extra
{ "EXTRA_SYSRQ", 0xC2 }, // Sys Req (AT 84-key)
{ "FAKE_01", 0xB0 }, // extra
{ "FAKE_02", 0xB1 }, // AT-F extra pad lhs of space
{ "FAKE_03", 0xB2 }, // Term extra pad bottom of keypad +
{ "FAKE_04", 0xB3 }, // AT-F extra pad rhs of space
{ "FAKE_05", 0xB4 }, // AT-F extra pad lhs of enter
{ "FAKE_06", 0xB5 }, // AT-F extra pad top of enter
{ "FAKE_07", 0xB6 }, // AT-F extra pad lhs of Insert
{ "FAKE_08", 0xB7 }, // Term F1
{ "FAKE_09", 0xB8 }, // Term F2
{ "FAKE_10", 0xB9 }, // Term F3
{ "FAKE_11", 0xBA }, // Term F4
{ "FAKE_12", 0xBB }, // Term F5
{ "FAKE_13", 0xBC }, // Term F6
{ "FAKE_14", 0xBD }, // Term F7
{ "FAKE_15", 0xBE }, // Term F8
{ "FAKE_16", 0xBF }, // Term F9
{ "FAKE_17", 0xC0 }, // Term F10
{ "FAKE_18", 0xC1 }, // extra
{ "FAKE_19", 0xC2 }, // Sys Req (AT 84-key)
{ "FN1", 0xD0 }, // Function layer key 1
{ "FN2", 0xD1 }, // Function layer key 2
{ "FN3", 0xD2 }, // Function layer key 3
{ "FN4", 0xD3 }, // Function layer key 4
{ "FN5", 0xD4 }, // Function layer key 5
{ "FN6", 0xD5 }, // Function layer key 6
{ "FN7", 0xD6 }, // Function layer key 7
{ "FN8", 0xD7 }, // Function layer key 8
{ "SELECT_0", 0xD8 }, // Select reset
{ "SELECT_1", 0xD9 }, // Select 1
{ "SELECT_2", 0xDA }, // Select 2
{ "SELECT_3", 0xDB }, // Select 3
{ "SELECT_4", 0xDC }, // Select 4
{ "SELECT_5", 0xDD }, // Select 5
{ "SELECT_6", 0xDE }, // Select 6
{ "SELECT_7", 0xDF }, // Select 7
{ "LCTRL", 0xE0 }, // Left Control
{ "LSHIFT", 0xE1 }, // Left Shift
{ "LALT", 0xE2 }, // Left Alt
{ "LGUI", 0xE3 }, // Left GUI
{ "RCTRL", 0xE4 }, // Right Control
{ "RSHIFT", 0xE5 }, // Right Shift
{ "RALT", 0xE6 }, // Right Alt
{ "RGUI", 0xE7 }, // Right GUI
{ "MEDIA_NEXT_TRACK", 0xE8 }, // Scan Next Track
{ "MEDIA_PREV_TRACK", 0xE9 }, // Scan Previous Track
{ "MEDIA_STOP", 0xEA }, // Stop
{ "MEDIA_PLAY_PAUSE", 0xEB }, // Play/ Pause
{ "MEDIA_MUTE", 0xEC }, // Mute
{ "MEDIA_BASS_BOOST", 0xED }, // Bass Boost
{ "MEDIA_LOUDNESS", 0xEE }, // Loudness
{ "MEDIA_VOLUME_UP", 0xEF }, // Volume Up
{ "MEDIA_VOLUME_DOWN", 0xF0 }, // Volume Down
{ "MEDIA_BASS_UP", 0xF1 }, // Bass Up
{ "MEDIA_BASS_DOWN", 0xF2 }, // Bass Down
{ "MEDIA_TREBLE_UP", 0xF3 }, // Treble Up
{ "MEDIA_TREBLE_DOWN", 0xF4 }, // Treble Down
{ "MEDIA_MEDIA_SELECT", 0xF5 }, // Media Select
{ "MEDIA_MAIL", 0xF6 }, // Mail
{ "MEDIA_CALCULATOR", 0xF7 }, // Calculator
{ "MEDIA_MY_COMPUTER", 0xF8 }, // My Computer
{ "MEDIA_WWW_SEARCH", 0xF9 }, // WWW Search
{ "MEDIA_WWW_HOME", 0xFA }, // WWW Home
{ "MEDIA_WWW_BACK", 0xFB }, // WWW Back
{ "MEDIA_WWW_FORWARD", 0xFC }, // WWW Forward
{ "MEDIA_WWW_STOP", 0xFD }, // WWW Stop
{ "MEDIA_WWW_REFRESH", 0xFE }, // WWW Refresh
{ "MEDIA_WWW_FAVORITES", 0xFF }, // WWW Favorites
};
const char* lookup_hid_token(int value)
{
int n = sizeof(hid_token_list) / sizeof(token_t);
for ( int i = 0; i < n; ++i ) {
if ( hid_token_list[i].value == value ) {
return hid_token_list[i].token;
}
}
return "INVALID";
}
int lookup_hid_token(const char* s)
{
int n = sizeof(hid_token_list) / sizeof(token_t);
for ( int i = 0; i < n; ++i ) {
if ( 0 == stricmp(hid_token_list[i].token, s) ) {
return hid_token_list[i].value;
}
}
return INVALID_NUMBER;
}
int lookup_meta_token(const char* s)
{
int n = sizeof(meta_token_list) / sizeof(token_t);
for ( int i = 0; i < n; ++i ) {
if ( 0 == stricmp(meta_token_list[i].token, s) ) {
return meta_token_list[i].value;
}
}
return INVALID_NUMBER;
}

13
source/common/hid_tokens.h Executable file
View File

@ -0,0 +1,13 @@
#ifndef __HID_TOKENS_H__
#define __HID_TOKENS_H__
int lookup_hid_token(const char* s);
const char* lookup_hid_token(int value);
int lookup_meta_token(const char* s);
inline bool is_meta_handed(int meta)
{
return !(meta & (meta >> 4));
}
#endif // __HID_TOKENS_H__

69
source/common/macro_tokens.cpp Executable file
View File

@ -0,0 +1,69 @@
#include "macro_tokens.h"
#include "global.h"
#include <string.h>
token_t macro_token_list[] =
{
{ "NOP", Q_NOP }, // value = ignored
{ "PRESS", Q_KEY_PRESS }, // value = hid code
{ "MAKE", Q_KEY_MAKE }, // value = hid code
{ "BREAK", Q_KEY_RELEASE }, // value = hid code
{ "ASSIGN_META", Q_ASSIGN_META }, // value = metas
{ "SET_META", Q_SET_META }, // value = metas
{ "CLEAR_META", Q_CLEAR_META }, // value = metas
{ "TOGGLE_META", Q_TOGGLE_META }, // value = metas
{ "POP_META", Q_POP_META }, // value = ignored
{ "POP_ALL_META", Q_POP_ALL_META }, // value = ignored
{ "DELAY", Q_DELAY_MS }, // value = delay count
{ "CLEAR_ALL", Q_CLEAR_ALL }, // value = ignored // internal use
{ "BOOT", Q_BOOT }, // value = ignored
{ "PUSH_META", Q_PUSH_META }, // can be combined with any other command. value = value for other command
};
const char* lookup_macro_token(int value)
{
int n = sizeof(macro_token_list) / sizeof(token_t);
for ( int i = 0; i < n; ++i ) {
if ( macro_token_list[i].value == value ) {
return macro_token_list[i].token;
}
}
return "INVALID";
}
int lookup_macro_token(const char* s)
{
int n = sizeof(macro_token_list) / sizeof(token_t);
for ( int i = 0; i < n; ++i ) {
if ( 0 == stricmp(macro_token_list[i].token, s) ) {
return macro_token_list[i].value;
}
}
return INVALID_NUMBER;
}
int get_macro_arg_type(int cmd)
{
switch ( cmd & ~Q_PUSH_META ) {
case Q_KEY_PRESS:
case Q_KEY_MAKE:
case Q_KEY_RELEASE:
return MACRO_ARG_HID;
case Q_ASSIGN_META:
case Q_SET_META:
case Q_CLEAR_META:
case Q_TOGGLE_META:
return MACRO_ARG_META;
case Q_DELAY_MS:
return MACRO_ARG_DELAY;
case Q_NOP:
case Q_POP_META:
case Q_POP_ALL_META:
case Q_CLEAR_ALL:
case Q_BOOT:
return MACRO_ARG_NONE;
default:
return INVALID_NUMBER;
}
}

30
source/common/macro_tokens.h Executable file
View File

@ -0,0 +1,30 @@
#ifndef __MACRO_TOKENS_H__
#define __MACRO_TOKENS_H__
enum queue_command_t {
Q_NOP = 0, // value = ignored
Q_KEY_PRESS = 1, // value = hid code
Q_KEY_MAKE = 2, // value = hid code
Q_KEY_RELEASE = 3, // value = hid code
Q_ASSIGN_META = 4, // value = metas
Q_SET_META = 5, // value = metas
Q_CLEAR_META = 6, // value = metas
Q_TOGGLE_META = 7, // value = metas
Q_POP_META = 8, // value = ignored
Q_POP_ALL_META = 9, // value = ignored
Q_DELAY_MS = 10, // value = delay count
Q_CLEAR_ALL = 11, // value = ignored
Q_BOOT = 12, // value = ignored
Q_PUSH_META = 0x80, // can be or'ed with any other command
};
#define MACRO_ARG_NONE 0
#define MACRO_ARG_HID 1
#define MACRO_ARG_META 2
#define MACRO_ARG_DELAY 3
const char* lookup_macro_token(int value);
int lookup_macro_token(const char* s);
int get_macro_arg_type(int cmd);
#endif // __MACRO_TOKENS_H__

62
source/common/rawhid.h Executable file
View File

@ -0,0 +1,62 @@
#ifndef __RAWHID_H__
#define __RAWHID_H__
#ifdef __cplusplus
extern "C" {
#endif
#ifdef _MSC_VER
#define RAWHIDFN __stdcall
#else
#define RAWHIDFN
#endif
// rawhid_open - open 1 or more devices
//
// Inputs:
// max = maximum number of devices to open
// vid = Vendor ID, or -1 if any
// pid = Product ID, or -1 if any
// usage_page = top level usage page, or -1 if any
// usage = top level usage number, or -1 if any
// Output:
// actual number of devices opened
//
int RAWHIDFN rawhid_open(int max, int vid, int pid, int usage_page, int usage);
// rawhid_recv - receive a packet
// Inputs:
// num = device to receive from (zero based)
// buf = buffer to receive packet
// len = buffer's size
// timeout = time to wait, in milliseconds
// Output:
// number of bytes received, or -1 on error
//
int RAWHIDFN rawhid_recv(int num, void *buf, int len, int timeout);
// rawhid_send - send a packet
// Inputs:
// num = device to transmit to (zero based)
// buf = buffer containing packet to send
// len = number of bytes to transmit
// timeout = time to wait, in milliseconds
// Output:
// number of bytes sent, or -1 on error
//
int RAWHIDFN rawhid_send(int num, void *buf, int len, int timeout);
// rawhid_close - close a device
//
// Inputs:
// num = device to close (zero based)
// Output
// (nothing)
//
void RAWHIDFN rawhid_close(int num);
#ifdef __cplusplus
};
#endif
#endif // __RAWHID_H__

50
source/common/rawhid_defs.h Executable file
View File

@ -0,0 +1,50 @@
#ifndef __RAWHID_DEFS_H__
#define __RAWHID_DEFS_H__
// enum settings_state_t {
// SS_IDLE,
// SS_WRITE_INIT,
// SS_WRITE,
// SS_WRITING,
// SS_WRITTEN,
// SS_READ,
// };
enum request_code_t {
RQ_INFO = 1,
RQ_WRITE = 2,
RQ_READ = 3,
RQ_BOOT = 4,
RQ_CONTINUATION = 0x80
};
enum response_code_t {
RC_ERROR = 1,
RC_OK = 2,
RC_READY = 3,
RC_COMPLETED = 4,
};
enum info_code_t {
IC_END = 0,
IC_CODE_VERSION = 1,
IC_CONFIG_MAX_VERSION = 2,
IC_PROTOCOL_VERSION = 3,
IC_CONFIG_VERSION = 4,
IC_RAM_SIZE = 5,
IC_EEPROM_SIZE = 6,
IC_RAM_FREE = 7,
IC_EEPROM_FREE = 8,
};
#define PACKET_LEN 64
#define SC_VID 0x16C0
#define SC_PID 0x047D
#define SC_USAGE_PAGE 0xFF99
#define SC_USAGE 0x2468
#define PROTOCOL_VERSION_MAJOR 1
#define PROTOCOL_VERSION_MINOR 0
#endif // __RAWHID_DEFS_H__

BIN
source/lib/rawhid.lib Executable file

Binary file not shown.

6
source/rawhid/0_readme.txt Executable file
View File

@ -0,0 +1,6 @@
PJRC rawhid code, adapted to build a DLL using the Microsoft Device Driver Kit (DDK).
The DDK version used was 3790.1830, obtained from:
http://download.microsoft.com/download/9/0/f/90f019ac-8243-48d3-91cf-81fc4093ecfd/1830_usa_ddk.iso
Original PJRC code can be found in PJRC_rawhid.

View File

@ -0,0 +1,53 @@
OS = LINUX
#OS = MACOSX
#OS = WINDOWS
PROG = rawhid_test
ifeq ($(OS), LINUX)
TARGET = $(PROG)
CC = gcc
STRIP = strip
CFLAGS = -Wall -O2 -DOS_$(OS)
LIBS = -lusb
else ifeq ($(OS), MACOSX)
TARGET = $(PROG).dmg
SDK = /Developer/SDKs/MacOSX10.5.sdk
ARCH = -mmacosx-version-min=10.5 -arch ppc -arch i386
CC = gcc
STRIP = strip
CFLAGS = -Wall -O2 -DOS_$(OS) -isysroot $(SDK) $(ARCH)
LIBS = $(ARCH) -Wl,-syslibroot,$(SDK) -framework IOKit -framework CoreFoundation
else ifeq ($(OS), WINDOWS)
TARGET = $(PROG).exe
CC = i586-mingw32msvc-gcc
STRIP = i586-mingw32msvc-strip
CFLAGS = -Wall -O2 -DOS_$(OS)
LIBS = -lhid -lsetupapi
endif
OBJS = $(PROG).o hid.o
all: $(TARGET)
$(PROG): $(OBJS)
$(CC) -o $(PROG) $(OBJS) $(LIBS)
$(STRIP) $(PROG)
$(PROG).exe: $(PROG)
cp $(PROG) $(PROG).exe
$(PROG).dmg: $(PROG)
mkdir tmp
cp $(PROG) tmp
hdiutil create -ov -volname "Raw HID Test" -srcfolder tmp $(PROG).dmg
hid.o: hid_$(OS).c hid.h
$(CC) $(CFLAGS) -c -o $@ $<
clean:
rm -f *.o $(PROG) $(PROG).exe $(PROG).dmg
rm -rf tmp

View File

@ -0,0 +1,6 @@
int rawhid_open(int max, int vid, int pid, int usage_page, int usage);
int rawhid_recv(int num, void *buf, int len, int timeout);
int rawhid_send(int num, void *buf, int len, int timeout);
void rawhid_close(int num);

View File

@ -0,0 +1,340 @@
/* Simple Raw HID functions for Linux - for use with Teensy RawHID example
* http://www.pjrc.com/teensy/rawhid.html
* Copyright (c) 2009 PJRC.COM, LLC
*
* rawhid_open - open 1 or more devices
* rawhid_recv - receive a packet
* rawhid_send - send a packet
* rawhid_close - close a device
*
* 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 description, website URL and 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.
*
* Version 1.0: Initial Release
*/
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <usb.h>
#include "hid.h"
#define printf(...) // comment this out for lots of info
// a list of all opened HID devices, so the caller can
// simply refer to them by number
typedef struct hid_struct hid_t;
static hid_t *first_hid = NULL;
static hid_t *last_hid = NULL;
struct hid_struct {
usb_dev_handle *usb;
int open;
int iface;
int ep_in;
int ep_out;
struct hid_struct *prev;
struct hid_struct *next;
};
// private functions, not intended to be used from outside this file
static void add_hid(hid_t *h);
static hid_t * get_hid(int num);
static void free_all_hid(void);
static void hid_close(hid_t *hid);
static int hid_parse_item(uint32_t *val, uint8_t **data, const uint8_t *end);
// rawhid_recv - receive a packet
// Inputs:
// num = device to receive from (zero based)
// buf = buffer to receive packet
// len = buffer's size
// timeout = time to wait, in milliseconds
// Output:
// number of bytes received, or -1 on error
//
int rawhid_recv(int num, void *buf, int len, int timeout)
{
hid_t *hid;
int r;
hid = get_hid(num);
if (!hid || !hid->open) return -1;
r = usb_interrupt_read(hid->usb, hid->ep_in, buf, len, timeout);
if (r >= 0) return r;
if (r == -110) return 0; // timeout
return -1;
}
// rawhid_send - send a packet
// Inputs:
// num = device to transmit to (zero based)
// buf = buffer containing packet to send
// len = number of bytes to transmit
// timeout = time to wait, in milliseconds
// Output:
// number of bytes sent, or -1 on error
//
int rawhid_send(int num, void *buf, int len, int timeout)
{
hid_t *hid;
hid = get_hid(num);
if (!hid || !hid->open) return -1;
if (hid->ep_out) {
return usb_interrupt_write(hid->usb, hid->ep_out, buf, len, timeout);
} else {
return usb_control_msg(hid->usb, 0x21, 9, 0, hid->iface, buf, len, timeout);
}
}
// rawhid_open - open 1 or more devices
//
// Inputs:
// max = maximum number of devices to open
// vid = Vendor ID, or -1 if any
// pid = Product ID, or -1 if any
// usage_page = top level usage page, or -1 if any
// usage = top level usage number, or -1 if any
// Output:
// actual number of devices opened
//
int rawhid_open(int max, int vid, int pid, int usage_page, int usage)
{
struct usb_bus *bus;
struct usb_device *dev;
struct usb_interface *iface;
struct usb_interface_descriptor *desc;
struct usb_endpoint_descriptor *ep;
usb_dev_handle *u;
uint8_t buf[1024], *p;
int i, n, len, tag, ep_in, ep_out, count=0, claimed;
uint32_t val=0, parsed_usage, parsed_usage_page;
hid_t *hid;
if (first_hid) free_all_hid();
printf("rawhid_open, max=%d\n", max);
if (max < 1) return 0;
usb_init();
usb_find_busses();
usb_find_devices();
for (bus = usb_get_busses(); bus; bus = bus->next) {
for (dev = bus->devices; dev; dev = dev->next) {
if (vid > 0 && dev->descriptor.idVendor != vid) continue;
if (pid > 0 && dev->descriptor.idProduct != pid) continue;
if (!dev->config) continue;
if (dev->config->bNumInterfaces < 1) continue;
printf("device: vid=%04X, pic=%04X, with %d iface\n",
dev->descriptor.idVendor,
dev->descriptor.idProduct,
dev->config->bNumInterfaces);
iface = dev->config->interface;
u = NULL;
claimed = 0;
for (i=0; i<dev->config->bNumInterfaces && iface; i++, iface++) {
desc = iface->altsetting;
if (!desc) continue;
printf(" type %d, %d, %d\n", desc->bInterfaceClass,
desc->bInterfaceSubClass, desc->bInterfaceProtocol);
if (desc->bInterfaceClass != 3) continue;
if (desc->bInterfaceSubClass != 0) continue;
if (desc->bInterfaceProtocol != 0) continue;
ep = desc->endpoint;
ep_in = ep_out = 0;
for (n = 0; n < desc->bNumEndpoints; n++, ep++) {
if (ep->bEndpointAddress & 0x80) {
if (!ep_in) ep_in = ep->bEndpointAddress & 0x7F;
printf(" IN endpoint %d\n", ep_in);
} else {
if (!ep_out) ep_out = ep->bEndpointAddress;
printf(" OUT endpoint %d\n", ep_out);
}
}
if (!ep_in) continue;
if (!u) {
u = usb_open(dev);
if (!u) {
printf(" unable to open device\n");
break;
}
}
printf(" hid interface (generic)\n");
if (usb_get_driver_np(u, i, (char *)buf, sizeof(buf)) >= 0) {
printf(" in use by driver \"%s\"\n", buf);
if (usb_detach_kernel_driver_np(u, i) < 0) {
printf(" unable to detach from kernel\n");
continue;
}
}
if (usb_claim_interface(u, i) < 0) {
printf(" unable claim interface %d\n", i);
continue;
}
len = usb_control_msg(u, 0x81, 6, 0x2200, i, (char *)buf, sizeof(buf), 250);
printf(" descriptor, len=%d\n", len);
if (len < 2) {
usb_release_interface(u, i);
continue;
}
p = buf;
parsed_usage_page = parsed_usage = 0;
while ((tag = hid_parse_item(&val, &p, buf + len)) >= 0) {
printf(" tag: %X, val %X\n", tag, val);
if (tag == 4) parsed_usage_page = val;
if (tag == 8) parsed_usage = val;
if (parsed_usage_page && parsed_usage) break;
}
if ((!parsed_usage_page) || (!parsed_usage) ||
(usage_page > 0 && parsed_usage_page != usage_page) ||
(usage > 0 && parsed_usage != usage)) {
usb_release_interface(u, i);
continue;
}
hid = (struct hid_struct *)malloc(sizeof(struct hid_struct));
if (!hid) {
usb_release_interface(u, i);
continue;
}
hid->usb = u;
hid->iface = i;
hid->ep_in = ep_in;
hid->ep_out = ep_out;
hid->open = 1;
add_hid(hid);
claimed++;
count++;
if (count >= max) return count;
}
if (u && !claimed) usb_close(u);
}
}
return count;
}
// rawhid_close - close a device
//
// Inputs:
// num = device to close (zero based)
// Output
// (nothing)
//
void rawhid_close(int num)
{
hid_t *hid;
hid = get_hid(num);
if (!hid || !hid->open) return;
hid_close(hid);
}
// Chuck Robey wrote a real HID report parser
// (chuckr@telenix.org) chuckr@chuckr.org
// http://people.freebsd.org/~chuckr/code/python/uhidParser-0.2.tbz
// this tiny thing only needs to extract the top-level usage page
// and usage, and even then is may not be truly correct, but it does
// work with the Teensy Raw HID example.
static int hid_parse_item(uint32_t *val, uint8_t **data, const uint8_t *end)
{
const uint8_t *p = *data;
uint8_t tag;
int table[4] = {0, 1, 2, 4};
int len;
if (p >= end) return -1;
if (p[0] == 0xFE) {
// long item, HID 1.11, 6.2.2.3, page 27
if (p + 5 >= end || p + p[1] >= end) return -1;
tag = p[2];
*val = 0;
len = p[1] + 5;
} else {
// short item, HID 1.11, 6.2.2.2, page 26
tag = p[0] & 0xFC;
len = table[p[0] & 0x03];
if (p + len + 1 >= end) return -1;
switch (p[0] & 0x03) {
case 3: *val = p[1] | (p[2] << 8) | (p[3] << 16) | (p[4] << 24); break;
case 2: *val = p[1] | (p[2] << 8); break;
case 1: *val = p[1]; break;
case 0: *val = 0; break;
}
}
*data += len + 1;
return tag;
}
static void add_hid(hid_t *h)
{
if (!first_hid || !last_hid) {
first_hid = last_hid = h;
h->next = h->prev = NULL;
return;
}
last_hid->next = h;
h->prev = last_hid;
h->next = NULL;
last_hid = h;
}
static hid_t * get_hid(int num)
{
hid_t *p;
for (p = first_hid; p && num > 0; p = p->next, num--) ;
return p;
}
static void free_all_hid(void)
{
hid_t *p, *q;
for (p = first_hid; p; p = p->next) {
hid_close(p);
}
p = first_hid;
while (p) {
q = p;
p = p->next;
free(q);
}
first_hid = last_hid = NULL;
}
static void hid_close(hid_t *hid)
{
hid_t *p;
int others=0;
usb_release_interface(hid->usb, hid->iface);
for (p = first_hid; p; p = p->next) {
if (p->open && p->usb == hid->usb) others++;
}
if (!others) usb_close(hid->usb);
hid->usb = NULL;
}

View File

@ -0,0 +1,409 @@
/* Simple Raw HID functions for Linux - for use with Teensy RawHID example
* http://www.pjrc.com/teensy/rawhid.html
* Copyright (c) 2009 PJRC.COM, LLC
*
* rawhid_open - open 1 or more devices
* rawhid_recv - receive a packet
* rawhid_send - send a packet
* rawhid_close - close a device
*
* 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 description, website URL and 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.
*
* Version 1.0: Initial Release
*/
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <unistd.h>
#include <IOKit/IOKitLib.h>
#include <IOKit/hid/IOHIDLib.h>
#include "hid.h"
#define BUFFER_SIZE 64
#define printf(...) // comment this out to get lots of info printed
// a list of all opened HID devices, so the caller can
// simply refer to them by number
typedef struct hid_struct hid_t;
typedef struct buffer_struct buffer_t;
static hid_t *first_hid = NULL;
static hid_t *last_hid = NULL;
struct hid_struct {
IOHIDDeviceRef ref;
int open;
uint8_t buffer[BUFFER_SIZE];
buffer_t *first_buffer;
buffer_t *last_buffer;
struct hid_struct *prev;
struct hid_struct *next;
};
struct buffer_struct {
struct buffer_struct *next;
uint32_t len;
uint8_t buf[BUFFER_SIZE];
};
// private functions, not intended to be used from outside this file
static void add_hid(hid_t *);
static hid_t * get_hid(int);
static void free_all_hid(void);
static void hid_close(hid_t *);
static void attach_callback(void *, IOReturn, void *, IOHIDDeviceRef);
static void detach_callback(void *, IOReturn, void *hid_mgr, IOHIDDeviceRef dev);
static void timeout_callback(CFRunLoopTimerRef, void *);
static void input_callback(void *, IOReturn, void *, IOHIDReportType,
uint32_t, uint8_t *, CFIndex);
// rawhid_recv - receive a packet
// Inputs:
// num = device to receive from (zero based)
// buf = buffer to receive packet
// len = buffer's size
// timeout = time to wait, in milliseconds
// Output:
// number of bytes received, or -1 on error
//
int rawhid_recv(int num, void *buf, int len, int timeout)
{
hid_t *hid;
buffer_t *b;
CFRunLoopTimerRef timer=NULL;
CFRunLoopTimerContext context;
int ret=0, timeout_occurred=0;
if (len < 1) return 0;
hid = get_hid(num);
if (!hid || !hid->open) return -1;
if ((b = hid->first_buffer) != NULL) {
if (len > b->len) len = b->len;
memcpy(buf, b->buf, len);
hid->first_buffer = b->next;
free(b);
return len;
}
memset(&context, 0, sizeof(context));
context.info = &timeout_occurred;
timer = CFRunLoopTimerCreate(NULL, CFAbsoluteTimeGetCurrent() +
(double)timeout / 1000.0, 0, 0, 0, timeout_callback, &context);
CFRunLoopAddTimer(CFRunLoopGetCurrent(), timer, kCFRunLoopDefaultMode);
while (1) {
CFRunLoopRun();
if ((b = hid->first_buffer) != NULL) {
if (len > b->len) len = b->len;
memcpy(buf, b->buf, len);
hid->first_buffer = b->next;
free(b);
ret = len;
break;
}
if (!hid->open) {
printf("rawhid_recv, device not open\n");
ret = -1;
break;
}
if (timeout_occurred) break;
}
CFRunLoopTimerInvalidate(timer);
CFRelease(timer);
return ret;
}
static void input_callback(void *context, IOReturn ret, void *sender,
IOHIDReportType type, uint32_t id, uint8_t *data, CFIndex len)
{
buffer_t *n;
hid_t *hid;
printf("input_callback\n");
if (ret != kIOReturnSuccess || len < 1) return;
hid = context;
if (!hid || hid->ref != sender) return;
n = (buffer_t *)malloc(sizeof(buffer_t));
if (!n) return;
if (len > BUFFER_SIZE) len = BUFFER_SIZE;
memcpy(n->buf, data, len);
n->len = len;
n->next = NULL;
if (!hid->first_buffer || !hid->last_buffer) {
hid->first_buffer = hid->last_buffer = n;
} else {
hid->last_buffer->next = n;
hid->last_buffer = n;
}
CFRunLoopStop(CFRunLoopGetCurrent());
}
static void timeout_callback(CFRunLoopTimerRef timer, void *info)
{
printf("timeout_callback\n");
*(int *)info = 1;
CFRunLoopStop(CFRunLoopGetCurrent());
}
void output_callback(void *context, IOReturn ret, void *sender,
IOHIDReportType type, uint32_t id, uint8_t *data, CFIndex len)
{
printf("output_callback, r=%d\n", ret);
if (ret == kIOReturnSuccess) {
*(int *)context = len;
} else {
// timeout if not success?
*(int *)context = 0;
}
CFRunLoopStop(CFRunLoopGetCurrent());
}
// rawhid_send - send a packet
// Inputs:
// num = device to transmit to (zero based)
// buf = buffer containing packet to send
// len = number of bytes to transmit
// timeout = time to wait, in milliseconds
// Output:
// number of bytes sent, or -1 on error
//
int rawhid_send(int num, void *buf, int len, int timeout)
{
hid_t *hid;
int result=-100;
hid = get_hid(num);
if (!hid || !hid->open) return -1;
#if 1
#warning "Send timeout not implemented on MACOSX"
IOReturn ret = IOHIDDeviceSetReport(hid->ref, kIOHIDReportTypeOutput, 0, buf, len);
result = (ret == kIOReturnSuccess) ? len : -1;
#endif
#if 0
// No matter what I tried this never actually sends an output
// report and output_callback never gets called. Why??
// Did I miss something? This is exactly the same params as
// the sync call that works. Is it an Apple bug?
// (submitted to Apple on 22-sep-2009, problem ID 7245050)
//
IOHIDDeviceScheduleWithRunLoop(hid->ref, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);
// should already be scheduled with run loop by attach_callback,
// sadly this doesn't make any difference either way
//
IOHIDDeviceSetReportWithCallback(hid->ref, kIOHIDReportTypeOutput,
0, buf, len, (double)timeout / 1000.0, output_callback, &result);
while (1) {
printf("enter run loop (send)\n");
CFRunLoopRun();
printf("leave run loop (send)\n");
if (result > -100) break;
if (!hid->open) {
result = -1;
break;
}
}
#endif
return result;
}
// rawhid_open - open 1 or more devices
//
// Inputs:
// max = maximum number of devices to open
// vid = Vendor ID, or -1 if any
// pid = Product ID, or -1 if any
// usage_page = top level usage page, or -1 if any
// usage = top level usage number, or -1 if any
// Output:
// actual number of devices opened
//
int rawhid_open(int max, int vid, int pid, int usage_page, int usage)
{
static IOHIDManagerRef hid_manager=NULL;
CFMutableDictionaryRef dict;
CFNumberRef num;
IOReturn ret;
hid_t *p;
int count=0;
if (first_hid) free_all_hid();
printf("rawhid_open, max=%d\n", max);
if (max < 1) return 0;
// Start the HID Manager
// http://developer.apple.com/technotes/tn2007/tn2187.html
if (!hid_manager) {
hid_manager = IOHIDManagerCreate(kCFAllocatorDefault, kIOHIDOptionsTypeNone);
if (hid_manager == NULL || CFGetTypeID(hid_manager) != IOHIDManagerGetTypeID()) {
if (hid_manager) CFRelease(hid_manager);
return 0;
}
}
if (vid > 0 || pid > 0 || usage_page > 0 || usage > 0) {
// Tell the HID Manager what type of devices we want
dict = CFDictionaryCreateMutable(kCFAllocatorDefault, 0,
&kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
if (!dict) return 0;
if (vid > 0) {
num = CFNumberCreate(kCFAllocatorDefault, kCFNumberIntType, &vid);
CFDictionarySetValue(dict, CFSTR(kIOHIDVendorIDKey), num);
CFRelease(num);
}
if (pid > 0) {
num = CFNumberCreate(kCFAllocatorDefault, kCFNumberIntType, &pid);
CFDictionarySetValue(dict, CFSTR(kIOHIDProductIDKey), num);
CFRelease(num);
}
if (usage_page > 0) {
num = CFNumberCreate(kCFAllocatorDefault, kCFNumberIntType, &usage_page);
CFDictionarySetValue(dict, CFSTR(kIOHIDPrimaryUsagePageKey), num);
CFRelease(num);
}
if (usage > 0) {
num = CFNumberCreate(kCFAllocatorDefault, kCFNumberIntType, &usage);
CFDictionarySetValue(dict, CFSTR(kIOHIDPrimaryUsageKey), num);
CFRelease(num);
}
IOHIDManagerSetDeviceMatching(hid_manager, dict);
CFRelease(dict);
} else {
IOHIDManagerSetDeviceMatching(hid_manager, NULL);
}
// set up a callbacks for device attach & detach
IOHIDManagerScheduleWithRunLoop(hid_manager, CFRunLoopGetCurrent(),
kCFRunLoopDefaultMode);
IOHIDManagerRegisterDeviceMatchingCallback(hid_manager, attach_callback, NULL);
IOHIDManagerRegisterDeviceRemovalCallback(hid_manager, detach_callback, NULL);
ret = IOHIDManagerOpen(hid_manager, kIOHIDOptionsTypeNone);
if (ret != kIOReturnSuccess) {
IOHIDManagerUnscheduleFromRunLoop(hid_manager,
CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);
CFRelease(hid_manager);
return 0;
}
printf("run loop\n");
// let it do the callback for all devices
while (CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0, true) == kCFRunLoopRunHandledSource) ;
// count up how many were added by the callback
for (p = first_hid; p; p = p->next) count++;
return count;
}
// rawhid_close - close a device
//
// Inputs:
// num = device to close (zero based)
// Output
// (nothing)
//
void rawhid_close(int num)
{
hid_t *hid;
hid = get_hid(num);
if (!hid || !hid->open) return;
hid_close(hid);
hid->open = 0;
}
static void add_hid(hid_t *h)
{
if (!first_hid || !last_hid) {
first_hid = last_hid = h;
h->next = h->prev = NULL;
return;
}
last_hid->next = h;
h->prev = last_hid;
h->next = NULL;
last_hid = h;
}
static hid_t * get_hid(int num)
{
hid_t *p;
for (p = first_hid; p && num > 0; p = p->next, num--) ;
return p;
}
static void free_all_hid(void)
{
hid_t *p, *q;
for (p = first_hid; p; p = p->next) {
hid_close(p);
}
p = first_hid;
while (p) {
q = p;
p = p->next;
free(q);
}
first_hid = last_hid = NULL;
}
static void hid_close(hid_t *hid)
{
if (!hid || !hid->open || !hid->ref) return;
IOHIDDeviceUnscheduleFromRunLoop(hid->ref, CFRunLoopGetCurrent( ), kCFRunLoopDefaultMode);
IOHIDDeviceClose(hid->ref, kIOHIDOptionsTypeNone);
hid->ref = NULL;
}
static void detach_callback(void *context, IOReturn r, void *hid_mgr, IOHIDDeviceRef dev)
{
hid_t *p;
printf("detach callback\n");
for (p = first_hid; p; p = p->next) {
if (p->ref == dev) {
p->open = 0;
CFRunLoopStop(CFRunLoopGetCurrent());
return;
}
}
}
static void attach_callback(void *context, IOReturn r, void *hid_mgr, IOHIDDeviceRef dev)
{
struct hid_struct *h;
printf("attach callback\n");
if (IOHIDDeviceOpen(dev, kIOHIDOptionsTypeNone) != kIOReturnSuccess) return;
h = (hid_t *)malloc(sizeof(hid_t));
if (!h) return;
memset(h, 0, sizeof(hid_t));
IOHIDDeviceScheduleWithRunLoop(dev, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);
IOHIDDeviceRegisterInputReportCallback(dev, h->buffer, sizeof(h->buffer),
input_callback, h);
h->ref = dev;
h->open = 1;
add_hid(h);
}

View File

@ -0,0 +1,328 @@
/* Simple Raw HID functions for Windows - for use with Teensy RawHID example
* http://www.pjrc.com/teensy/rawhid.html
* Copyright (c) 2009 PJRC.COM, LLC
*
* rawhid_open - open 1 or more devices
* rawhid_recv - receive a packet
* rawhid_send - send a packet
* rawhid_close - close a device
*
* 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 description, website URL and 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.
*
* Version 1.0: Initial Release
*/
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <windows.h>
#include <setupapi.h>
#include <ddk/hidsdi.h>
#include <ddk/hidclass.h>
#include "hid.h"
// a list of all opened HID devices, so the caller can
// simply refer to them by number
typedef struct hid_struct hid_t;
static hid_t *first_hid = NULL;
static hid_t *last_hid = NULL;
struct hid_struct {
HANDLE handle;
int open;
struct hid_struct *prev;
struct hid_struct *next;
};
static HANDLE rx_event=NULL;
static HANDLE tx_event=NULL;
static CRITICAL_SECTION rx_mutex;
static CRITICAL_SECTION tx_mutex;
// private functions, not intended to be used from outside this file
static void add_hid(hid_t *h);
static hid_t * get_hid(int num);
static void free_all_hid(void);
static void hid_close(hid_t *hid);
void print_win32_err(void);
// rawhid_recv - receive a packet
// Inputs:
// num = device to receive from (zero based)
// buf = buffer to receive packet
// len = buffer's size
// timeout = time to wait, in milliseconds
// Output:
// number of bytes received, or -1 on error
//
int rawhid_recv(int num, void *buf, int len, int timeout)
{
hid_t *hid;
unsigned char tmpbuf[516];
OVERLAPPED ov;
DWORD n, r;
if (sizeof(tmpbuf) < len + 1) return -1;
hid = get_hid(num);
if (!hid || !hid->open) return -1;
EnterCriticalSection(&rx_mutex);
ResetEvent(&rx_event);
memset(&ov, 0, sizeof(ov));
ov.hEvent = rx_event;
if (!ReadFile(hid->handle, tmpbuf, len + 1, NULL, &ov)) {
if (GetLastError() != ERROR_IO_PENDING) goto return_error;
r = WaitForSingleObject(rx_event, timeout);
if (r == WAIT_TIMEOUT) goto return_timeout;
if (r != WAIT_OBJECT_0) goto return_error;
}
if (!GetOverlappedResult(hid->handle, &ov, &n, FALSE)) goto return_error;
LeaveCriticalSection(&rx_mutex);
if (n <= 0) return -1;
n--;
if (n > len) n = len;
memcpy(buf, tmpbuf + 1, n);
return n;
return_timeout:
CancelIo(hid->handle);
LeaveCriticalSection(&rx_mutex);
return 0;
return_error:
print_win32_err();
LeaveCriticalSection(&rx_mutex);
return -1;
}
// rawhid_send - send a packet
// Inputs:
// num = device to transmit to (zero based)
// buf = buffer containing packet to send
// len = number of bytes to transmit
// timeout = time to wait, in milliseconds
// Output:
// number of bytes sent, or -1 on error
//
int rawhid_send(int num, void *buf, int len, int timeout)
{
hid_t *hid;
unsigned char tmpbuf[516];
OVERLAPPED ov;
DWORD n, r;
if (sizeof(tmpbuf) < len + 1) return -1;
hid = get_hid(num);
if (!hid || !hid->open) return -1;
EnterCriticalSection(&tx_mutex);
ResetEvent(&tx_event);
memset(&ov, 0, sizeof(ov));
ov.hEvent = tx_event;
tmpbuf[0] = 0;
memcpy(tmpbuf + 1, buf, len);
if (!WriteFile(hid->handle, tmpbuf, len + 1, NULL, &ov)) {
if (GetLastError() != ERROR_IO_PENDING) goto return_error;
r = WaitForSingleObject(tx_event, timeout);
if (r == WAIT_TIMEOUT) goto return_timeout;
if (r != WAIT_OBJECT_0) goto return_error;
}
if (!GetOverlappedResult(hid->handle, &ov, &n, FALSE)) goto return_error;
LeaveCriticalSection(&tx_mutex);
if (n <= 0) return -1;
return n - 1;
return_timeout:
CancelIo(hid->handle);
LeaveCriticalSection(&tx_mutex);
return 0;
return_error:
print_win32_err();
LeaveCriticalSection(&tx_mutex);
return -1;
}
// rawhid_open - open 1 or more devices
//
// Inputs:
// max = maximum number of devices to open
// vid = Vendor ID, or -1 if any
// pid = Product ID, or -1 if any
// usage_page = top level usage page, or -1 if any
// usage = top level usage number, or -1 if any
// Output:
// actual number of devices opened
//
int rawhid_open(int max, int vid, int pid, int usage_page, int usage)
{
GUID guid;
HDEVINFO info;
DWORD index=0, reqd_size;
SP_DEVICE_INTERFACE_DATA iface;
SP_DEVICE_INTERFACE_DETAIL_DATA *details;
HIDD_ATTRIBUTES attrib;
PHIDP_PREPARSED_DATA hid_data;
HIDP_CAPS capabilities;
HANDLE h;
BOOL ret;
hid_t *hid;
int count=0;
if (first_hid) free_all_hid();
if (max < 1) return 0;
if (!rx_event) {
rx_event = CreateEvent(NULL, TRUE, TRUE, NULL);
tx_event = CreateEvent(NULL, TRUE, TRUE, NULL);
InitializeCriticalSection(&rx_mutex);
InitializeCriticalSection(&tx_mutex);
}
HidD_GetHidGuid(&guid);
info = SetupDiGetClassDevs(&guid, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
if (info == INVALID_HANDLE_VALUE) return 0;
for (index=0; 1 ;index++) {
iface.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
ret = SetupDiEnumDeviceInterfaces(info, NULL, &guid, index, &iface);
if (!ret) return count;
SetupDiGetInterfaceDeviceDetail(info, &iface, NULL, 0, &reqd_size, NULL);
details = (SP_DEVICE_INTERFACE_DETAIL_DATA *)malloc(reqd_size);
if (details == NULL) continue;
memset(details, 0, reqd_size);
details->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
ret = SetupDiGetDeviceInterfaceDetail(info, &iface, details,
reqd_size, NULL, NULL);
if (!ret) {
free(details);
continue;
}
h = CreateFile(details->DevicePath, GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE, NULL,
OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
free(details);
if (h == INVALID_HANDLE_VALUE) continue;
attrib.Size = sizeof(HIDD_ATTRIBUTES);
ret = HidD_GetAttributes(h, &attrib);
//printf("vid: %4x\n", attrib.VendorID);
if (!ret || (vid > 0 && attrib.VendorID != vid) ||
(pid > 0 && attrib.ProductID != pid) ||
!HidD_GetPreparsedData(h, &hid_data)) {
CloseHandle(h);
continue;
}
if (!HidP_GetCaps(hid_data, &capabilities) ||
(usage_page > 0 && capabilities.UsagePage != usage_page) ||
(usage > 0 && capabilities.Usage != usage)) {
HidD_FreePreparsedData(hid_data);
CloseHandle(h);
continue;
}
HidD_FreePreparsedData(hid_data);
hid = (struct hid_struct *)malloc(sizeof(struct hid_struct));
if (!hid) {
CloseHandle(h);
continue;
}
hid->handle = h;
hid->open = 1;
add_hid(hid);
count++;
if (count >= max) return count;
}
return count;
}
// rawhid_close - close a device
//
// Inputs:
// num = device to close (zero based)
// Output
// (nothing)
//
void rawhid_close(int num)
{
hid_t *hid;
hid = get_hid(num);
if (!hid || !hid->open) return;
hid_close(hid);
}
static void add_hid(hid_t *h)
{
if (!first_hid || !last_hid) {
first_hid = last_hid = h;
h->next = h->prev = NULL;
return;
}
last_hid->next = h;
h->prev = last_hid;
h->next = NULL;
last_hid = h;
}
static hid_t * get_hid(int num)
{
hid_t *p;
for (p = first_hid; p && num > 0; p = p->next, num--) ;
return p;
}
static void free_all_hid(void)
{
hid_t *p, *q;
for (p = first_hid; p; p = p->next) {
hid_close(p);
}
p = first_hid;
while (p) {
q = p;
p = p->next;
free(q);
}
first_hid = last_hid = NULL;
}
static void hid_close(hid_t *hid)
{
CloseHandle(hid->handle);
hid->handle = NULL;
}
void print_win32_err(void)
{
char buf[256];
DWORD err;
err = GetLastError();
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, err,
0, buf, sizeof(buf), NULL);
printf("err %ld: %s\n", err, buf);
}

Binary file not shown.

View File

@ -0,0 +1,95 @@
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#if defined(OS_LINUX) || defined(OS_MACOSX)
#include <sys/ioctl.h>
#include <termios.h>
#elif defined(OS_WINDOWS)
#include <conio.h>
#endif
#include "hid.h"
static char get_keystroke(void);
int main()
{
int i, r, num;
char c, buf[64];
r = rawhid_open(1, 0x16C0, 0x0480, 0xFFAB, 0x0200);
if (r <= 0) {
printf("no rawhid device found\n");
return -1;
}
printf("found rawhid device\n");
while (1) {
// check if any Raw HID packet has arrived
num = rawhid_recv(0, buf, 64, 220);
if (num < 0) {
printf("\nerror reading, device went offline\n");
rawhid_close(0);
return 0;
}
if (num > 0) {
printf("\nrecv %d bytes:\n", num);
for (i=0; i<num; i++) {
printf("%02X ", buf[i] & 255);
if (i % 16 == 15 && i < num-1) printf("\n");
}
printf("\n");
}
// check if any input on stdin
while ((c = get_keystroke()) >= 32) {
printf("\ngot key '%c', sending...\n", c);
buf[0] = c;
for (i=1; i<64; i++) {
buf[i] = 0;
}
rawhid_send(0, buf, 64, 100);
}
}
}
#if defined(OS_LINUX) || defined(OS_MACOSX)
// Linux (POSIX) implementation of _kbhit().
// Morgan McGuire, morgan@cs.brown.edu
static int _kbhit() {
static const int STDIN = 0;
static int initialized = 0;
int bytesWaiting;
if (!initialized) {
// Use termios to turn off line buffering
struct termios term;
tcgetattr(STDIN, &term);
term.c_lflag &= ~ICANON;
tcsetattr(STDIN, TCSANOW, &term);
setbuf(stdin, NULL);
initialized = 1;
}
ioctl(STDIN, FIONREAD, &bytesWaiting);
return bytesWaiting;
}
static char _getch(void) {
char c;
if (fread(&c, 1, 1, stdin) < 1) return 0;
return c;
}
#endif
static char get_keystroke(void)
{
if (_kbhit()) {
char c = _getch();
if (c >= 32) return c;
}
return 0;
}

View File

@ -0,0 +1,70 @@
BUILD: Computing Include file dependencies:
BUILD: Examining d:\xtkbk\pjrc\usb_raw_hid\rawhid_lib directory for files to compile.
Compiling (NoSync) d:\xtkbk\pjrc\usb_raw_hid\rawhid_lib directory ********************
1>'nmake.exe /nologo BUILDMSG=Stop. -i NTTEST= UMTEST= NOLINK=1 NOPASS0=1 PASS1_NOLIB=1 386=1'
1>BUILDMSG: Processing d:\xtkbk\pjrc\usb_raw_hid\rawhid_lib
1>cl -nologo -Ii386\ -I. -IC:\WINDDK\3790~1.183\inc\mfc42 -IC:\WINDDK\3790~1.183\inc\ddk\wdm\wxp -Iobjfre_wxp_x86\i386 -IC:\WINDDK\3790~1.183\inc\wxp -IC:\WINDDK\3790~1.183\inc\wxp -IC:\WINDDK\3790~1.183\inc\crt -D_X86_=1 -Di386=1 -DSTD_CALL -DCONDITION_HANDLING=1 -DNT_INST=0 -DWIN32=100 -D_NT1X_=100 -DWINNT=1 -D_WIN32_WINNT=0x0501 /DWINVER=0x0501 -D_WIN32_IE=0x0603 -DWIN32_LEAN_AND_MEAN=1 -DDEVL=1 -D__BUILDMACHINE__=WinDDK -DFPO=0 -DNDEBUG -D_DLL=1 -D_MT=1 /c /Zl /Zp8 /Gy /Gm- /W3 /WX /WX /Gz /GX- /GR- /GF /GS /G6 /Ze /Gi- /QIfdiv- /hotpatch -Z7 /Oxs /Oy- -FIC:\WINDDK\3790~1.183\inc\wxp\warning.h .\hid_windows.c
1>hid_windows.c
1>
1>Stop.
Compiling d:\xtkbk\pjrc\usb_raw_hid\rawhid_lib directory ********************
100>'nmake.exe /nologo BUILDMSG=Stop. -i NTTEST= UMTEST= NOLINK=1 NOPASS0=1 386=1'
100>BUILDMSG: Processing d:\xtkbk\pjrc\usb_raw_hid\rawhid_lib
100> lib -out:objfre_wxp_x86\i386\rawhid.lib @C:\DOCUME~1\Jon\LOCALS~1\Temp\nm6C.tmp
100>Microsoft (R) Library Manager Version 7.10.4035
100>Copyright (C) Microsoft Corporation. All rights reserved.
100>
100>-IGNORE:4198,4010,4037,4039,4065,4070,4078,4087,4089,4221
100>/WX
100>-nodefaultlib
100>-machine:ix86
100>-def:rawhid.def
100>objfre_wxp_x86\i386\hid_windows.obj
100> Creating library objfre_wxp_x86\i386\rawhid.lib and object objfre_wxp_x86\i386\rawhid.exp
100>
100>Stop.
Linking d:\xtkbk\pjrc\usb_raw_hid\rawhid_lib directory ********************
1>'nmake.exe /nologo BUILDMSG=Stop. -i LINKONLY=1 NOPASS0=1 NTTEST= UMTEST= MAKEDLL=1 386=1'
1>BUILDMSG: Processing d:\xtkbk\pjrc\usb_raw_hid\rawhid_lib
1> link -out:objfre_wxp_x86\i386\rawhid.dll -machine:ix86 @C:\DOCUME~1\Jon\LOCALS~1\Temp\nm6D.tmp
1>Microsoft (R) Incremental Linker Version 7.10.4035
1>Copyright (C) Microsoft Corporation. All rights reserved.
1>
1>-MERGE:_PAGE=PAGE
1>-MERGE:_TEXT=.text
1>-SECTION:INIT,d
1>-OPT:REF
1>-OPT:ICF
1>-IGNORE:4198,4010,4037,4039,4065,4070,4078,4087,4089,4221
1>-INCREMENTAL:NO
1>-FULLBUILD
1>/release
1>-NODEFAULTLIB
1>/WX
1>-debug
1>-debugtype:cv
1>-version:5.1
1>-osversion:5.1
1>/functionpadmin:5
1>/safeseh
1>/opt:nowin98
1>-merge:.rdata=.text
1>/pdbcompress
1>-STACK:0x40000,0x1000
1>-dll
1>-base:@C:\WINDDK\3790~1.183\bin\coffbase.txt,rawhid
1>-subsystem:console,4.10
1>-entry:_DllMainCRTStartup@12
1>objfre_wxp_x86\i386\rawhid.exp
1>objfre_wxp_x86\i386\hid_windows.obj
1>C:\WINDDK\3790~1.183\lib\wxp\i386\BufferOverflowU.lib
1>C:\WINDDK\3790~1.183\lib\crt\i386\msvcrt.lib
1>C:\WINDDK\3790~1.183\lib\wxp\i386\ntdll.lib
1>C:\WINDDK\3790~1.183\lib\wxp\i386\hid.lib
1>C:\WINDDK\3790~1.183\lib\wxp\i386\setupapi.lib
1>C:\WINDDK\3790~1.183\lib\wxp\i386\Kernel32.lib
1>C:\WINDDK\3790~1.183\lib\wxp\i386\sehupd.lib
1> echo Skip Binplace:
1>Skip Binplace:
1>
1>Stop.

4
source/rawhid/clean.bat Executable file
View File

@ -0,0 +1,4 @@
del /Q objfre_wxp_x86\i386\*.*
rd objfre_wxp_x86\i386
del /Q objfre_wxp_x86\*.*
rd objfre_wxp_x86

328
source/rawhid/hid_WINDOWS.c Executable file
View File

@ -0,0 +1,328 @@
/* Simple Raw HID functions for Windows - for use with Teensy RawHID example
* http://www.pjrc.com/teensy/rawhid.html
* Copyright (c) 2009 PJRC.COM, LLC
*
* rawhid_open - open 1 or more devices
* rawhid_recv - receive a packet
* rawhid_send - send a packet
* rawhid_close - close a device
*
* 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 description, website URL and 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.
*
* Version 1.0: Initial Release
*/
#include <stdio.h>
#include <stdlib.h>
//#include <stdint.h>
#include <windows.h>
#include <setupapi.h>
#include <hidsdi.h>
#include <hidclass.h>
#include "rawhid.h"
// a list of all opened HID devices, so the caller can
// simply refer to them by number
typedef struct hid_struct hid_t;
static hid_t *first_hid = NULL;
static hid_t *last_hid = NULL;
struct hid_struct {
HANDLE handle;
int open;
struct hid_struct *prev;
struct hid_struct *next;
};
static HANDLE rx_event=NULL;
static HANDLE tx_event=NULL;
static CRITICAL_SECTION rx_mutex;
static CRITICAL_SECTION tx_mutex;
// private functions, not intended to be used from outside this file
static void add_hid(hid_t *h);
static hid_t * get_hid(int num);
static void free_all_hid(void);
static void hid_close(hid_t *hid);
void print_win32_err(void);
// rawhid_recv - receive a packet
// Inputs:
// num = device to receive from (zero based)
// buf = buffer to receive packet
// len = buffer's size
// timeout = time to wait, in milliseconds
// Output:
// number of bytes received, or -1 on error
//
int rawhid_recv(int num, void *buf, int len, int timeout)
{
hid_t *hid;
unsigned char tmpbuf[516];
OVERLAPPED ov;
DWORD n, r;
if (sizeof(tmpbuf) < len + 1) return -1;
hid = get_hid(num);
if (!hid || !hid->open) return -1;
EnterCriticalSection(&rx_mutex);
ResetEvent(&rx_event);
memset(&ov, 0, sizeof(ov));
ov.hEvent = rx_event;
if (!ReadFile(hid->handle, tmpbuf, len + 1, NULL, &ov)) {
if (GetLastError() != ERROR_IO_PENDING) goto return_error;
r = WaitForSingleObject(rx_event, timeout);
if (r == WAIT_TIMEOUT) goto return_timeout;
if (r != WAIT_OBJECT_0) goto return_error;
}
if (!GetOverlappedResult(hid->handle, &ov, &n, FALSE)) goto return_error;
LeaveCriticalSection(&rx_mutex);
if (n <= 0) return -1;
n--;
if (n > (DWORD)len) n = len;
memcpy(buf, tmpbuf + 1, n);
return n;
return_timeout:
CancelIo(hid->handle);
LeaveCriticalSection(&rx_mutex);
return 0;
return_error:
print_win32_err();
LeaveCriticalSection(&rx_mutex);
return -1;
}
// rawhid_send - send a packet
// Inputs:
// num = device to transmit to (zero based)
// buf = buffer containing packet to send
// len = number of bytes to transmit
// timeout = time to wait, in milliseconds
// Output:
// number of bytes sent, or -1 on error
//
int rawhid_send(int num, void *buf, int len, int timeout)
{
hid_t *hid;
unsigned char tmpbuf[516];
OVERLAPPED ov;
DWORD n, r;
if (sizeof(tmpbuf) < len + 1) return -1;
hid = get_hid(num);
if (!hid || !hid->open) return -1;
EnterCriticalSection(&tx_mutex);
ResetEvent(&tx_event);
memset(&ov, 0, sizeof(ov));
ov.hEvent = tx_event;
tmpbuf[0] = 0;
memcpy(tmpbuf + 1, buf, len);
if (!WriteFile(hid->handle, tmpbuf, len + 1, NULL, &ov)) {
if (GetLastError() != ERROR_IO_PENDING) goto return_error;
r = WaitForSingleObject(tx_event, timeout);
if (r == WAIT_TIMEOUT) goto return_timeout;
if (r != WAIT_OBJECT_0) goto return_error;
}
if (!GetOverlappedResult(hid->handle, &ov, &n, FALSE)) goto return_error;
LeaveCriticalSection(&tx_mutex);
if (n <= 0) return -1;
return n - 1;
return_timeout:
CancelIo(hid->handle);
LeaveCriticalSection(&tx_mutex);
return 0;
return_error:
print_win32_err();
LeaveCriticalSection(&tx_mutex);
return -1;
}
// rawhid_open - open 1 or more devices
//
// Inputs:
// max = maximum number of devices to open
// vid = Vendor ID, or -1 if any
// pid = Product ID, or -1 if any
// usage_page = top level usage page, or -1 if any
// usage = top level usage number, or -1 if any
// Output:
// actual number of devices opened
//
int rawhid_open(int max, int vid, int pid, int usage_page, int usage)
{
GUID guid;
HDEVINFO info;
DWORD index=0, reqd_size;
SP_DEVICE_INTERFACE_DATA iface;
SP_DEVICE_INTERFACE_DETAIL_DATA *details;
HIDD_ATTRIBUTES attrib;
PHIDP_PREPARSED_DATA hid_data;
HIDP_CAPS capabilities;
HANDLE h;
BOOL ret;
hid_t *hid;
int count=0;
if (first_hid) free_all_hid();
if (max < 1) return 0;
if (!rx_event) {
rx_event = CreateEvent(NULL, TRUE, TRUE, NULL);
tx_event = CreateEvent(NULL, TRUE, TRUE, NULL);
InitializeCriticalSection(&rx_mutex);
InitializeCriticalSection(&tx_mutex);
}
HidD_GetHidGuid(&guid);
info = SetupDiGetClassDevs(&guid, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
if (info == INVALID_HANDLE_VALUE) return 0;
for (index=0; 1 ;index++) {
iface.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
ret = SetupDiEnumDeviceInterfaces(info, NULL, &guid, index, &iface);
if (!ret) return count;
SetupDiGetInterfaceDeviceDetail(info, &iface, NULL, 0, &reqd_size, NULL);
details = (SP_DEVICE_INTERFACE_DETAIL_DATA *)malloc(reqd_size);
if (details == NULL) continue;
memset(details, 0, reqd_size);
details->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
ret = SetupDiGetDeviceInterfaceDetail(info, &iface, details,
reqd_size, NULL, NULL);
if (!ret) {
free(details);
continue;
}
h = CreateFile(details->DevicePath, GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE, NULL,
OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
free(details);
if (h == INVALID_HANDLE_VALUE) continue;
attrib.Size = sizeof(HIDD_ATTRIBUTES);
ret = HidD_GetAttributes(h, &attrib);
//printf("vid: %4x\n", attrib.VendorID);
if (!ret || (vid > 0 && attrib.VendorID != vid) ||
(pid > 0 && attrib.ProductID != pid) ||
!HidD_GetPreparsedData(h, &hid_data)) {
CloseHandle(h);
continue;
}
if (!HidP_GetCaps(hid_data, &capabilities) ||
(usage_page > 0 && capabilities.UsagePage != usage_page) ||
(usage > 0 && capabilities.Usage != usage)) {
HidD_FreePreparsedData(hid_data);
CloseHandle(h);
continue;
}
HidD_FreePreparsedData(hid_data);
hid = (struct hid_struct *)malloc(sizeof(struct hid_struct));
if (!hid) {
CloseHandle(h);
continue;
}
hid->handle = h;
hid->open = 1;
add_hid(hid);
count++;
if (count >= max) return count;
}
return count;
}
// rawhid_close - close a device
//
// Inputs:
// num = device to close (zero based)
// Output
// (nothing)
//
void rawhid_close(int num)
{
hid_t *hid;
hid = get_hid(num);
if (!hid || !hid->open) return;
hid_close(hid);
}
static void add_hid(hid_t *h)
{
if (!first_hid || !last_hid) {
first_hid = last_hid = h;
h->next = h->prev = NULL;
return;
}
last_hid->next = h;
h->prev = last_hid;
h->next = NULL;
last_hid = h;
}
static hid_t * get_hid(int num)
{
hid_t *p;
for (p = first_hid; p && num > 0; p = p->next, num--) ;
return p;
}
static void free_all_hid(void)
{
hid_t *p, *q;
for (p = first_hid; p; p = p->next) {
hid_close(p);
}
p = first_hid;
while (p) {
q = p;
p = p->next;
free(q);
}
first_hid = last_hid = NULL;
}
static void hid_close(hid_t *hid)
{
CloseHandle(hid->handle);
hid->handle = NULL;
}
void print_win32_err(void)
{
char buf[256];
DWORD err;
err = GetLastError();
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, err,
0, buf, sizeof(buf), NULL);
printf("err %ld: %s\n", err, buf);
}

18
source/rawhid/makefile Executable file
View File

@ -0,0 +1,18 @@
#############################################################################
#
# Copyright (C) Microsoft Corporation 1995 - 1998
# All Rights Reserved.
#
# MAKEFILE for HIDGAME directory
#
#############################################################################
#
# DO NOT EDIT THIS FILE!!! Edit .\sources. if you want to add a new source
# file to this component. This file merely indirects to the real make file
# that is shared by all the driver components of the Windows NT DDK
#
!INCLUDE $(NTMAKEENV)\makefile.def

View File

@ -0,0 +1,20 @@
MUI_386_OBJECTS=
386_OBJECTS= \
$(_OBJ_DIR)\i386\hid_windows.obj
MUI_IA64_OBJECTS=
IA64_OBJECTS= \
$(_OBJ_DIR)\ia64\hid_windows.obj
MUI_AMD64_OBJECTS=
AMD64_OBJECTS= \
$(_OBJ_DIR)\amd64\hid_windows.obj
MUI_ARM_OBJECTS=
ARM_OBJECTS= \
$(_OBJ_DIR)\arm\hid_windows.obj

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

5
source/rawhid/rawhid.def Executable file
View File

@ -0,0 +1,5 @@
EXPORTS
rawhid_open
rawhid_recv
rawhid_send
rawhid_close

View File

@ -0,0 +1,6 @@
LIBRARY rawhid
EXPORTS
rawhid_open @1
rawhid_recv @2
rawhid_send @3
rawhid_close @4

48
source/rawhid/rawhid.h Executable file
View File

@ -0,0 +1,48 @@
#ifndef __RAWHID_H__
#define __RAWHID_H__
// rawhid_open - open 1 or more devices
//
// Inputs:
// max = maximum number of devices to open
// vid = Vendor ID, or -1 if any
// pid = Product ID, or -1 if any
// usage_page = top level usage page, or -1 if any
// usage = top level usage number, or -1 if any
// Output:
// actual number of devices opened
//
int __stdcall rawhid_open(int max, int vid, int pid, int usage_page, int usage);
// rawhid_recv - receive a packet
// Inputs:
// num = device to receive from (zero based)
// buf = buffer to receive packet
// len = buffer's size
// timeout = time to wait, in milliseconds
// Output:
// number of bytes received, or -1 on error
//
int __stdcall rawhid_recv(int num, void *buf, int len, int timeout);
// rawhid_send - send a packet
// Inputs:
// num = device to transmit to (zero based)
// buf = buffer containing packet to send
// len = number of bytes to transmit
// timeout = time to wait, in milliseconds
// Output:
// number of bytes sent, or -1 on error
//
int __stdcall rawhid_send(int num, void *buf, int len, int timeout);
// rawhid_close - close a device
//
// Inputs:
// num = device to close (zero based)
// Output
// (nothing)
//
void __stdcall rawhid_close(int num);
#endif // __RAWHID_H__

20
source/rawhid/sources Executable file
View File

@ -0,0 +1,20 @@
TARGETNAME=rawhid
TARGETTYPE=DYNLINK
TARGETPATH=obj
#UMTYPE=console
#UMENTRY=main
MSC_WARNING_LEVEL=/W3 /WX
TARGETLIBS=$(SDK_LIB_PATH)\hid.lib $(SDK_LIB_PATH)\setupapi.lib $(SDK_LIB_PATH)\Kernel32.lib
INCLUDES=$(WDM_INC_PATH)
#C_DEFINES=-DRAWHID_EXPORTS
USE_MSVCRT=1
SOURCES=hid_WINDOWS.c
i386_SOURCES=

8
source/scas/Makefile Executable file
View File

@ -0,0 +1,8 @@
PROG = scas
OBJS = $(PROG).o ../common/hid_tokens.o ../common/macro_tokens.o
include ../build/Makefile_prog.inc

910
source/scas/scas.cpp Executable file
View File

@ -0,0 +1,910 @@
// scas.cpp - config file assembler for Soarer's Keyboard Converter.
#include "../common/global.h"
#include "../common/hid_tokens.h"
#include "../common/macro_tokens.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <vector>
#include <utility>
#include <string>
using namespace std;
typedef unsigned char uint8_t;
typedef unsigned short uint16_t;
#define SETTINGS_VERSION_MAJOR 1
#define SETTINGS_VERSION_MINOR 1
#define COMMENT_CHAR '#'
#define ERR_FILE_NOT_FOUND 1
#define ERR_INVALID_COMMAND 2
#define ERR_INVALID_ARGS 3
#define ERR_NOT_IMPLEMENTED 4
#define ERR_BLOCK_TOO_LARGE 5
#define ERR_MACRO_TOO_LONG 6
#define ERR_FILE_WRITE 7
void print_error(int err)
{
switch ( err ) {
case ERR_FILE_NOT_FOUND: fprintf(stderr, "file not found\n"); break;
case ERR_INVALID_COMMAND: fprintf(stderr, "invalid command\n"); break;
case ERR_INVALID_ARGS: fprintf(stderr, "invalid argument\n"); break;
case ERR_NOT_IMPLEMENTED: fprintf(stderr, "not implemented\n"); break;
case ERR_BLOCK_TOO_LARGE: fprintf(stderr, "block too large\n"); break;
case ERR_MACRO_TOO_LONG: fprintf(stderr, "macro too long\n"); break;
default: fprintf(stderr, "unknown error\n"); break;
}
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
const char* skip_whitespace(const char* p)
{
while ( isspace(*p) ) {
++p;
}
return p;
}
const char* skip_non_whitespace(const char* p)
{
while ( *p && !isspace(*p) ) {
++p;
}
return p;
}
const char* skip_digit(const char* p)
{
while ( isdigit(*p) ) {
++p;
}
return p;
}
const char* match(const char* s1, const char* s2)
{
size_t len = strlen(s1);
if ( 0 == strnicmp(s1, s2, len) ) {
return s2 + len;
}
return 0;
}
const char* skip_to_end_quote(const char* p)
{
if ( *p == '\"' ) {
return p;
}
while ( *p ) {
if ( *p == '\"' && *(p-1) != '\\' ) {
break;
}
++p;
}
return p;
}
const char* skip_token(const char* p)
{
p = skip_whitespace(p);
if ( *p == '\"' ) {
++p;
p = skip_to_end_quote(p);
if ( *p == '\"' ) {
++p;
}
} else {
p = skip_non_whitespace(p);
}
p = skip_whitespace(p);
return p;
}
string get_token(const char* p)
{
p = skip_whitespace(p);
const char* p2;
if ( *p == '\"' ) {
++p;
p2 = skip_to_end_quote(p);
} else {
p2 = skip_non_whitespace(p);
}
return string(p, p2);
}
int parse_int(const char* args)
{
args = skip_whitespace(args);
if ( isdigit(*args) ) {
return atoi(args);
}
return INVALID_NUMBER;
}
int parse_int(const char* args, int minval, int maxval)
{
int v = parse_int(args);
if ( minval <= v && v <= maxval ) {
return v;
}
return INVALID_NUMBER;
}
int parse_hid(const char* args)
{
string t = get_token(args);
return lookup_hid_token(t.c_str());
/*
const char* p2 = skip_non_whitespace(args);
char c = *p2;
if ( c ) {
*p2 = 0;
}
int hid = lookup_hid_token(args);
if ( c ) {
*p2 = c;
}
return hid;
*/
}
bool parse_meta_match(const char* args, int& desired_meta, int& matched_meta)
{
desired_meta = 0;
matched_meta = 0;
const char* p = args;
while ( *p ) {
bool inverted = false;
if ( *p == '-' ) {
inverted = true;
++p;
}
string t = get_token(p);
int meta = lookup_meta_token(t.c_str());
if ( meta == INVALID_NUMBER ) {
return false;
}
if ( inverted ) {
desired_meta &= ~meta;
matched_meta |= meta;
} else {
desired_meta |= meta;
if ( is_meta_handed(meta) ) {
matched_meta |= meta;
} else {
matched_meta |= (meta & 0x0F);
}
}
p = skip_token(p);
}
return true;
}
int parse_meta_handed(const char* p)
{
int val = 0;
while ( *p ) {
string t = get_token(p);
int meta = lookup_meta_token(t.c_str());
if ( meta == INVALID_NUMBER /*|| !is_meta_handed(meta)*/ ) {
return INVALID_NUMBER;
}
val |= meta;
p = skip_token(p);
}
return val;
}
bool parse_macro_cmd(const char* args, int& cmd, int& val)
{
string t = get_token(args);
cmd = lookup_macro_token(t.c_str());
if ( cmd == INVALID_NUMBER ) {
return false;
}
const char* p = skip_token(args);
// todo: Q_PLAY
if ( cmd == Q_PUSH_META ) {
t = get_token(p);
int q = lookup_macro_token(t.c_str());
if ( q == INVALID_NUMBER ) {
return false;
}
cmd |= q;
p = skip_token(p);
}
t = get_token(p);
//char* p2 = p;
int argtype = get_macro_arg_type(cmd);
switch ( argtype ) {
case MACRO_ARG_HID:
val = lookup_hid_token(t.c_str());
//p2 = skip_token(p);
break;
case MACRO_ARG_META:
val = parse_meta_handed(p);
////p2 = next_token(p);
break;
case MACRO_ARG_DELAY:
val = parse_int(t.c_str(), 0, 255);
//p2 = skip_token(p);
break;
case MACRO_ARG_NONE:
val = 0;
break;
}
return val != INVALID_NUMBER;
}
int lookup_set_token(const char* t)
{
if ( 0 == stricmp(t, "set1") ) {
return 1;
} else if ( 0 == stricmp(t, "set2") ) {
return 2;
} else if ( 0 == stricmp(t, "set3") ) {
return 3;
} else if ( 0 == stricmp(t, "set2ext") ) {
return 4;
} else if ( 0 == stricmp(t, "any") ) {
return 0;
}
return INVALID_NUMBER;
}
int parse_single_set(const char* p)
{
string t = get_token(p);
int s = lookup_set_token(t.c_str());
if ( s == INVALID_NUMBER ) {
return INVALID_NUMBER;
}
return s;
}
int parse_multi_set(const char* p)
{
int val = 0;
while ( *p ) {
string t = get_token(p);
int s = lookup_set_token(t.c_str());
if ( s == INVALID_NUMBER ) {
return INVALID_NUMBER;
}
if ( s ) {
val |= 1 << (s - 1);
} else {
val = 0;
}
p = skip_token(p);
}
return val;
}
int parse_function_n(const char* p)
{
if ( 0 == strnicmp("fn", p, 2) ) {
p += 2;
if ( isdigit(*p) ) {
int v = atoi(p);
if ( 1 <= v && v <= 8 ) {
return v;
}
}
}
return INVALID_NUMBER;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
typedef int (*command_fn)(const char* args);
uint8_t current_force_flags = 0;
int cmd_force(const char* args)
{
int set = parse_single_set(args);
if ( set != INVALID_NUMBER ) {
current_force_flags = (current_force_flags & 0xF0) | (uint8_t)set;
return 0;
}
// todo: XT/AT force?
return ERR_INVALID_ARGS;
}
uint8_t current_select = 0;
int cmd_select(const char* args)
{
string t = get_token(args);
int s;
if ( 0 == stricmp(t.c_str(), "any") ) {
s = 0;
} else {
s = parse_int(args, 1, 7);
}
if ( s != INVALID_NUMBER ) {
current_select = (uint8_t)s;
return 0;
}
return ERR_INVALID_ARGS;
}
uint8_t current_scanset = 0;
int cmd_scanset(const char* args)
{
int s = parse_multi_set(args);
if ( s != INVALID_NUMBER ) {
current_scanset = (uint8_t)s;
return 0;
}
return ERR_INVALID_ARGS;
}
bool is_hex(char c)
{
c = (char)toupper(c);
return isdigit(c) || ('A' <= c && c <= 'F');
}
int parse_hex(char c)
{
c = (char)toupper(c);
if ( isdigit(c) ) {
return c - '0';
} else if ( 'A' <= c && c <= 'F' ) {
return c - 'A' + 10;
} else {
return INVALID_NUMBER;
}
}
int parse_hex(const char* p)
{
p = skip_whitespace(p);
int val = 0;
int digit = parse_hex(*p++);
if ( digit == INVALID_NUMBER ) {
return INVALID_NUMBER;
}
while ( digit != INVALID_NUMBER ) {
val = (val << 4) | digit;
digit = parse_hex(*p++);
}
return val;
}
int parse_hex(const char* p, int minval, int maxval)
{
int v = parse_hex(p);
if ( minval <= v && v <= maxval ) {
return v;
}
return INVALID_NUMBER;
}
uint16_t current_keyboard_id = 0;
int cmd_keyboard_id(const char* args)
{
string t = get_token(args);
if ( 0 == stricmp(t.c_str(), "any") ) {
current_keyboard_id = 0;
} else {
int v = parse_hex(args, 0, 0xFFFF);
if ( v == INVALID_NUMBER ) {
return ERR_INVALID_ARGS;
}
current_keyboard_id = (uint16_t)v;
}
return 0;
}
uint8_t current_layer = 0;
int cmd_layer(const char* args)
{
int v = parse_int(args, 0, 255);
if ( v != INVALID_NUMBER ) {
current_layer = (uint8_t)v;
return 0;
}
return ERR_INVALID_ARGS;
}
typedef pair<uint8_t, uint8_t> layerdef_pair;
typedef vector<layerdef_pair> layerdef_list_t;
layerdef_list_t layerdef_list;
int cmd_layerdef(const char* args)
{
int fn_combo = 0;
const char* p = skip_whitespace(args);
for ( ; *p; p = skip_token(p) ) {
int fn = parse_function_n(p);
if ( fn == INVALID_NUMBER ) {
break;
}
fn_combo |= 1 << (fn - 1);
}
if ( !fn_combo ) {
return ERR_INVALID_ARGS;
}
int layer = parse_int(p, 1, 255); // layer id
if ( layer == INVALID_NUMBER ) {
return ERR_INVALID_ARGS;
}
layerdef_list.push_back(layerdef_pair((uint8_t)fn_combo, (uint8_t)layer));
return 0;
}
typedef pair<uint8_t, uint8_t> remap_pair;
typedef vector<remap_pair> remap_list_t;
remap_list_t remap_list;
int cmd_remap(const char* args)
{
args = skip_whitespace(args);
int v1 = parse_hid(args);
if ( v1 != INVALID_NUMBER ) {
args = skip_token(args);
int v2 = parse_hid(args);
if ( v2 != INVALID_NUMBER ) {
remap_list.push_back(remap_pair((uint8_t)v1, (uint8_t)v2));
return 0;
}
}
return ERR_INVALID_ARGS;
}
int current_macro_phase = -1; // -1 = invalid, 0 = make, 1 = break
uint8_t current_macro_release_meta = 1;
uint8_t current_hid_code = 0;
uint8_t current_desired_meta = 0;
uint8_t current_matched_meta = 0;
int cmd_macro(const char* args)
{
string t = get_token(args);
int hid_code = lookup_hid_token(t.c_str());
if ( hid_code == INVALID_NUMBER ) {
return ERR_INVALID_ARGS;
}
int desired_meta, matched_meta;
if ( !parse_meta_match(skip_token(args), desired_meta, matched_meta) ) {
return ERR_INVALID_ARGS;
}
current_macro_phase = 0;
current_macro_release_meta = 1;
current_hid_code = (uint8_t)hid_code;
current_desired_meta = (uint8_t)desired_meta;
current_matched_meta = (uint8_t)matched_meta;
return 0;
}
/*
int cmd_meta(char* args)
{
int v = parse_int(args, 0, 255);
if ( v != INVALID_NUMBER ) {
current_desired_meta = (uint8_t)v;
return 0;
}
return ERR_INVALID_ARGS;
}
*/
/*
int cmd_ignore(char* args)
{
int v = parse_int(args, 0, 255);
if ( v != INVALID_NUMBER ) {
current_matched_meta = (uint8_t)v;
return 0;
}
return ERR_INVALID_ARGS;
}
*/
int cmd_onbreak(const char* args)
{
if ( current_macro_phase != 0 ) {
return ERR_INVALID_COMMAND;
}
current_macro_phase = 1;
string t = get_token(args);
if ( t == "" ) {
current_macro_release_meta = 1;
} else if ( 0 == stricmp(t.c_str(), "norestoremeta") ) {
current_macro_release_meta = 0;
} else {
return ERR_INVALID_ARGS;
}
return 0;
}
typedef pair<uint8_t, uint8_t> mcommand_pair;
typedef vector<mcommand_pair> mcommand_list_t;
mcommand_list_t press_mcommand_list;
mcommand_list_t release_mcommand_list;
/*
int cmd_press(char* args)
{
int cmd, val;
if ( parse_macro_cmd(args, cmd, val) ) {
press_mcommand_list.push_back(mcommand_pair((uint8_t)cmd, (uint8_t)val));
return 0;
}
return ERR_INVALID_ARGS;
}
int cmd_release(char* args)
{
int cmd, val;
if ( parse_macro_cmd(args, cmd, val) ) {
release_mcommand_list.push_back(mcommand_pair((uint8_t)cmd, (uint8_t)val));
return 0;
}
return ERR_INVALID_ARGS;
}
*/
int cmd_macrostep(const char* args)
{
int cmd, val;
if ( parse_macro_cmd(args, cmd, val) ) {
mcommand_pair mcp((uint8_t)cmd, (uint8_t)val);
if ( current_macro_phase == 0 ) {
press_mcommand_list.push_back(mcp);
} else {
release_mcommand_list.push_back(mcp);
}
return 0;
}
return ERR_INVALID_ARGS;
}
struct macro_t
{
uint8_t hid_code;
uint8_t desired_meta;
uint8_t matched_meta;
uint8_t press_flags;
uint8_t release_flags;
mcommand_list_t commands;
};
typedef vector<macro_t> macro_list_t;
macro_list_t macro_list;
int cmd_endmacro(const char* /*args*/)
{
if ( current_macro_phase == -1 ) {
return ERR_INVALID_COMMAND;
}
current_macro_phase = -1;
macro_t macro;
macro.hid_code = current_hid_code;
macro.desired_meta = current_desired_meta;
macro.matched_meta = current_matched_meta;
macro.press_flags = (uint8_t)press_mcommand_list.size();
macro.release_flags = (uint8_t)release_mcommand_list.size();
macro.release_flags |= current_macro_release_meta << 7;
if ( press_mcommand_list.size() > 63 || release_mcommand_list.size() > 63 ) {
return ERR_MACRO_TOO_LONG;
}
//macro.commands.push_back(press_mcommand_list);
macro.commands.insert(macro.commands.end(), press_mcommand_list.begin(), press_mcommand_list.end());
//macro.commands.push_back(release_mcommand_list);
macro.commands.insert(macro.commands.end(), release_mcommand_list.begin(), release_mcommand_list.end());
macro_list.push_back(macro);
press_mcommand_list.clear();
release_mcommand_list.clear();
return 0;
}
int block_type = BLOCK_NONE;
int cmd_layerdefblock(const char* /*args*/)
{
if ( block_type != BLOCK_NONE ) {
return ERR_INVALID_COMMAND;
}
block_type = BLOCK_LAYERDEF;
return 0;
}
int cmd_remapblock(const char* /*args*/)
{
if ( block_type != BLOCK_NONE ) {
return ERR_INVALID_COMMAND;
}
block_type = BLOCK_REMAP;
return 0;
}
int cmd_macroblock(const char* /*args*/)
{
if ( block_type != BLOCK_NONE ) {
return ERR_INVALID_COMMAND;
}
block_type = BLOCK_MACRO;
return 0;
}
int cmd_invalid(const char* args)
{
switch ( block_type ) {
case BLOCK_LAYERDEF: return cmd_layerdef(args);
case BLOCK_REMAP: return cmd_remap(args);
case BLOCK_MACRO: return cmd_macrostep(args);
default: return ERR_INVALID_COMMAND;
}
}
int process_file(const char* fname);
int cmd_include(const char* args)
{
string fname = get_token(args);
return process_file(fname.c_str());
}
typedef vector<uint8_t> block_t;
typedef vector<block_t> block_list_t;
block_list_t block_list;
void fill_block_header(block_t& block)
{
// common block header stuff...
block.push_back(0); // placeholder for size
uint8_t flags = (uint8_t)block_type;
flags |= current_select << 3;
flags |= (current_scanset != 0) << 6;
flags |= (current_keyboard_id != 0) << 7;
block.push_back(flags);
if ( current_scanset ) {
block.push_back(current_scanset);
}
if ( current_keyboard_id ) {
block.push_back((uint8_t)(current_keyboard_id & 0xFF));
block.push_back((uint8_t)((current_keyboard_id >> 8) & 0xFF));
}
}
int cmd_endlayerdefblock(const char* /*args*/)
{
block_t block;
fill_block_header(block);
block.push_back((uint8_t)layerdef_list.size());
for ( int i = 0; i < (int)layerdef_list.size(); ++i ) {
block.push_back(layerdef_list[i].first);
block.push_back(layerdef_list[i].second);
}
if ( block.size() > 255 ) {
return ERR_BLOCK_TOO_LARGE;
}
block[0] = (uint8_t)block.size();
block_list.push_back(block);
layerdef_list.clear();
block_type = BLOCK_NONE;
return 0;
}
int cmd_endremapblock(const char* /*args*/)
{
block_t block;
fill_block_header(block);
block.push_back(current_layer);
block.push_back((uint8_t)remap_list.size());
for ( int i = 0; i < (int)remap_list.size(); ++i ) {
block.push_back(remap_list[i].first);
block.push_back(remap_list[i].second);
}
if ( block.size() > 255 ) {
return ERR_BLOCK_TOO_LARGE;
}
block[0] = (uint8_t)block.size();
block_list.push_back(block);
remap_list.clear();
current_layer = 0;
block_type = BLOCK_NONE;
return 0;
}
int cmd_endmacroblock(const char* /*args*/)
{
block_t block;
fill_block_header(block);
block.push_back((uint8_t)macro_list.size());
for ( int i = 0; i < (int)macro_list.size(); ++i ) {
block.push_back(macro_list[i].hid_code);
block.push_back(macro_list[i].desired_meta);
block.push_back(macro_list[i].matched_meta);
block.push_back(macro_list[i].press_flags);
block.push_back(macro_list[i].release_flags);
for ( int j = 0; j < (int)macro_list[i].commands.size(); ++j ) {
block.push_back(macro_list[i].commands[j].first);
block.push_back(macro_list[i].commands[j].second);
}
}
if ( block.size() > 255 ) {
return ERR_BLOCK_TOO_LARGE;
}
block[0] = (uint8_t)block.size();
block_list.push_back(block);
macro_list.clear();
block_type = BLOCK_NONE;
return 0;
}
int cmd_endblock(const char* args)
{
switch ( block_type ) {
case BLOCK_LAYERDEF: return cmd_endlayerdefblock(args);
case BLOCK_REMAP: return cmd_endremapblock(args);
case BLOCK_MACRO: return cmd_endmacroblock(args);
default: return ERR_INVALID_COMMAND;
}
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
struct command_map_t
{
const char* cmd;
command_fn fn;
};
command_map_t command_map[] =
{
{ "force", cmd_force },
{ "ifselect", cmd_select },
{ "ifset", cmd_scanset },
{ "ifkeyboard", cmd_keyboard_id },
{ "layerblock", cmd_layerdefblock },
{ "remapblock", cmd_remapblock },
{ "layer", cmd_layer },
{ "macroblock", cmd_macroblock },
{ "macro", cmd_macro },
{ "onbreak", cmd_onbreak },
{ "endmacro", cmd_endmacro },
{ "endblock", cmd_endblock },
{ "include", cmd_include },
};
command_fn find_command(const char* cmd)
{
int n = sizeof(command_map) / sizeof(command_map_t);
for ( int i = 0; i < n; ++i ) {
if ( 0 == stricmp(cmd, command_map[i].cmd) ) {
return command_map[i].fn;
}
}
return cmd_invalid;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
int process_line(char* linebuf)
{
char* pcomment = strchr(linebuf, COMMENT_CHAR);
if ( pcomment ) {
*pcomment = 0;
}
string t = get_token(linebuf);
if ( t.size() ) {
const char* p;
command_fn fn = find_command(t.c_str());
if ( fn != cmd_invalid ) {
p = skip_token(linebuf);
} else {
p = linebuf;
}
if ( int err = fn(p) ) {
return err;
}
}
// p = skip_whitespace(linebuf);
// char* p2 = skip_non_whitespace(p);
// if ( *p2 ) {
// *p2++ = 0;
// p2 = skip_whitespace(p2);
// if ( int err = find_command(p)(p2) ) {
// return err;
// }
// }
return 0;
}
int process_file(FILE* f)
{
int linenum = 0;
char linebuf[256];
while ( fgets(linebuf, sizeof(linebuf), f) ) {
++linenum;
if ( int err = process_line(linebuf) ) {
fprintf(stderr, "error at line %d: ", linenum);
return err;
}
}
return 0;
}
int process_file(const char* fname)
{
FILE* f = fopen(fname, "rt");
if ( f ) {
int retval = process_file(f);
fclose(f);
return retval;
}
return ERR_FILE_NOT_FOUND;
}
int write_target(FILE* f)
{
// Header...
fputc('S', f); // signature...
fputc('C', f);
fputc(SETTINGS_VERSION_MAJOR, f);
fputc(SETTINGS_VERSION_MINOR, f);
fputc(current_force_flags, f);
fputc(0, f); // reserved
// Blocks...
for ( int i = 0; i < (int)block_list.size(); ++i ) {
if ( !fwrite(&(block_list[i][0]), block_list[i].size(), 1, f) ) {
return ERR_FILE_WRITE;
}
}
return 0;
}
int write_target(const char* fname)
{
FILE* f = fopen(fname, "wb");
if ( f ) {
int retval = write_target(f);
fclose(f);
return retval;
}
return ERR_FILE_WRITE;
}
int main(int argc, char** argv)
{
printf("scas v1.10\n");
int err = 0;
if ( argc < 3 ) {
fprintf(stderr, "usage: scas <text_config> [<text_config> ...] <binary_config>\n");
err = 1;
}
for ( int i = 1; i < argc - 1; ++i ) {
err = process_file(argv[i]);
if ( err ) {
print_error(err);
}
}
if ( !err ) {
err = write_target(argv[argc - 1]);
if ( err ) {
fprintf(stderr, "unable to write to file: %s\n", argv[argc - 1]);
}
}
if ( !err ) {
fprintf(stderr, "No errors. Wrote: %s\n", argv[argc - 1]);
}
return err ? 1 : 0;
}

21
source/scas/scas.sln Executable file
View File

@ -0,0 +1,21 @@
Microsoft Visual Studio Solution File, Format Version 8.00
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "scas", "scas.vcproj", "{6BD9A7D9-B220-49FF-B527-45C04DBBDA9A}"
ProjectSection(ProjectDependencies) = postProject
EndProjectSection
EndProject
Global
GlobalSection(SolutionConfiguration) = preSolution
Debug = Debug
Release = Release
EndGlobalSection
GlobalSection(ProjectConfiguration) = postSolution
{6BD9A7D9-B220-49FF-B527-45C04DBBDA9A}.Debug.ActiveCfg = Debug|Win32
{6BD9A7D9-B220-49FF-B527-45C04DBBDA9A}.Debug.Build.0 = Debug|Win32
{6BD9A7D9-B220-49FF-B527-45C04DBBDA9A}.Release.ActiveCfg = Release|Win32
{6BD9A7D9-B220-49FF-B527-45C04DBBDA9A}.Release.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
EndGlobalSection
GlobalSection(ExtensibilityAddIns) = postSolution
EndGlobalSection
EndGlobal

147
source/scas/scas.vcproj Executable file
View File

@ -0,0 +1,147 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="7.10"
Name="scas"
ProjectGUID="{6BD9A7D9-B220-49FF-B527-45C04DBBDA9A}"
Keyword="Win32Proj">
<Platforms>
<Platform
Name="Win32"/>
</Platforms>
<Configurations>
<Configuration
Name="Debug|Win32"
OutputDirectory="Debug"
IntermediateDirectory="Debug"
ConfigurationType="1"
CharacterSet="2">
<Tool
Name="VCCLCompilerTool"
Optimization="0"
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
MinimalRebuild="TRUE"
BasicRuntimeChecks="3"
RuntimeLibrary="5"
UsePrecompiledHeader="0"
WarningLevel="3"
Detect64BitPortabilityProblems="TRUE"
DebugInformationFormat="4"/>
<Tool
Name="VCCustomBuildTool"/>
<Tool
Name="VCLinkerTool"
OutputFile="$(OutDir)/scas.exe"
LinkIncremental="2"
GenerateDebugInformation="TRUE"
ProgramDatabaseFile="$(OutDir)/scas.pdb"
SubSystem="1"
TargetMachine="1"/>
<Tool
Name="VCMIDLTool"/>
<Tool
Name="VCPostBuildEventTool"/>
<Tool
Name="VCPreBuildEventTool"/>
<Tool
Name="VCPreLinkEventTool"/>
<Tool
Name="VCResourceCompilerTool"/>
<Tool
Name="VCWebServiceProxyGeneratorTool"/>
<Tool
Name="VCXMLDataGeneratorTool"/>
<Tool
Name="VCWebDeploymentTool"/>
<Tool
Name="VCManagedWrapperGeneratorTool"/>
<Tool
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
</Configuration>
<Configuration
Name="Release|Win32"
OutputDirectory="../bin"
IntermediateDirectory="Release"
ConfigurationType="1"
CharacterSet="2">
<Tool
Name="VCCLCompilerTool"
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
RuntimeLibrary="4"
UsePrecompiledHeader="0"
WarningLevel="4"
Detect64BitPortabilityProblems="TRUE"
DebugInformationFormat="3"/>
<Tool
Name="VCCustomBuildTool"/>
<Tool
Name="VCLinkerTool"
OutputFile="$(OutDir)/scas.exe"
LinkIncremental="1"
GenerateDebugInformation="FALSE"
SubSystem="1"
OptimizeReferences="2"
EnableCOMDATFolding="2"
TargetMachine="1"/>
<Tool
Name="VCMIDLTool"/>
<Tool
Name="VCPostBuildEventTool"/>
<Tool
Name="VCPreBuildEventTool"/>
<Tool
Name="VCPreLinkEventTool"/>
<Tool
Name="VCResourceCompilerTool"/>
<Tool
Name="VCWebServiceProxyGeneratorTool"/>
<Tool
Name="VCXMLDataGeneratorTool"/>
<Tool
Name="VCWebDeploymentTool"/>
<Tool
Name="VCManagedWrapperGeneratorTool"/>
<Tool
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
</Configuration>
</Configurations>
<References>
</References>
<Files>
<Filter
Name="Source Files"
Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
<File
RelativePath="..\common\hid_tokens.cpp">
</File>
<File
RelativePath="..\common\macro_tokens.cpp">
</File>
<File
RelativePath=".\scas.cpp">
</File>
</Filter>
<Filter
Name="Header Files"
Filter="h;hpp;hxx;hm;inl;inc;xsd"
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
<File
RelativePath="..\common\global.h">
</File>
<File
RelativePath="..\common\hid_tokens.h">
</File>
<File
RelativePath="..\common\macro_tokens.h">
</File>
</Filter>
<Filter
Name="Resource Files"
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}">
</Filter>
</Files>
<Globals>
</Globals>
</VisualStudioProject>

8
source/scboot/Makefile Executable file
View File

@ -0,0 +1,8 @@
PROG = scboot
OBJS = $(PROG).o
include ../build/Makefile_hidprog.inc

67
source/scboot/scboot.c Executable file
View File

@ -0,0 +1,67 @@
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <memory.h>
#include "../common/rawhid.h"
#include "../common/rawhid_defs.h"
typedef unsigned char u_char;
int do_boot()
{
u_char hbuf[64];
int err = 0;
if ( !err ) {
printf("scboot: sending boot request: ");
hbuf[0] = RQ_BOOT;
if ( 64 != rawhid_send(0, hbuf, 64, 100) ) {
err = 2;
printf("failed\n");
} else {
printf("ok\n");
}
}
if ( !err ) {
printf("device: ");
if ( 64 != rawhid_recv(0, hbuf, 64, 220) ) {
err = 3;
printf("failed to respond\n");
}
}
if ( !err ) {
if ( hbuf[0] != RC_OK ) {
err = 4;
printf("not ok\n");
} else {
printf("ok\n");
}
}
return err;
}
int main(int argc, char** argv)
{
printf("scboot v1.10\n");
if ( argc != 1 ) {
fprintf(stderr, "usage: scboot\n");
return 0;
}
printf("scboot: looking for Soarer\'s Converter: ");
int r = rawhid_open(1, SC_VID, SC_PID, SC_USAGE_PAGE, SC_USAGE);
if (r <= 0) {
printf("not found\n");
return -1;
}
printf("found\n");
int err = do_boot();
if ( err ) {
//printf("\nerror %d\n", err);
}
rawhid_close(0);
return 0;
}

21
source/scboot/scboot.sln Executable file
View File

@ -0,0 +1,21 @@
Microsoft Visual Studio Solution File, Format Version 8.00
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "scboot", "scboot.vcproj", "{9ED4BD6A-E53F-4CB0-9057-3F45F9570B2B}"
ProjectSection(ProjectDependencies) = postProject
EndProjectSection
EndProject
Global
GlobalSection(SolutionConfiguration) = preSolution
Debug = Debug
Release = Release
EndGlobalSection
GlobalSection(ProjectConfiguration) = postSolution
{9ED4BD6A-E53F-4CB0-9057-3F45F9570B2B}.Debug.ActiveCfg = Debug|Win32
{9ED4BD6A-E53F-4CB0-9057-3F45F9570B2B}.Debug.Build.0 = Debug|Win32
{9ED4BD6A-E53F-4CB0-9057-3F45F9570B2B}.Release.ActiveCfg = Release|Win32
{9ED4BD6A-E53F-4CB0-9057-3F45F9570B2B}.Release.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
EndGlobalSection
GlobalSection(ExtensibilityAddIns) = postSolution
EndGlobalSection
EndGlobal

147
source/scboot/scboot.vcproj Executable file
View File

@ -0,0 +1,147 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="7.10"
Name="scboot"
ProjectGUID="{9ED4BD6A-E53F-4CB0-9057-3F45F9570B2B}"
Keyword="Win32Proj">
<Platforms>
<Platform
Name="Win32"/>
</Platforms>
<Configurations>
<Configuration
Name="Debug|Win32"
OutputDirectory="Debug"
IntermediateDirectory="Debug"
ConfigurationType="1"
CharacterSet="2">
<Tool
Name="VCCLCompilerTool"
Optimization="0"
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
MinimalRebuild="TRUE"
BasicRuntimeChecks="3"
RuntimeLibrary="5"
UsePrecompiledHeader="0"
WarningLevel="3"
Detect64BitPortabilityProblems="TRUE"
DebugInformationFormat="4"/>
<Tool
Name="VCCustomBuildTool"/>
<Tool
Name="VCLinkerTool"
OutputFile="$(OutDir)/scboot.exe"
LinkIncremental="2"
GenerateDebugInformation="TRUE"
ProgramDatabaseFile="$(OutDir)/scboot.pdb"
SubSystem="1"
TargetMachine="1"/>
<Tool
Name="VCMIDLTool"/>
<Tool
Name="VCPostBuildEventTool"/>
<Tool
Name="VCPreBuildEventTool"/>
<Tool
Name="VCPreLinkEventTool"/>
<Tool
Name="VCResourceCompilerTool"/>
<Tool
Name="VCWebServiceProxyGeneratorTool"/>
<Tool
Name="VCXMLDataGeneratorTool"/>
<Tool
Name="VCWebDeploymentTool"/>
<Tool
Name="VCManagedWrapperGeneratorTool"/>
<Tool
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
</Configuration>
<Configuration
Name="Release|Win32"
OutputDirectory="../bin"
IntermediateDirectory="Release"
ConfigurationType="1"
CharacterSet="2">
<Tool
Name="VCCLCompilerTool"
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
RuntimeLibrary="4"
UsePrecompiledHeader="0"
WarningLevel="3"
Detect64BitPortabilityProblems="TRUE"
DebugInformationFormat="3"/>
<Tool
Name="VCCustomBuildTool"/>
<Tool
Name="VCLinkerTool"
OutputFile="$(OutDir)/scboot.exe"
LinkIncremental="1"
GenerateDebugInformation="FALSE"
SubSystem="1"
OptimizeReferences="2"
EnableCOMDATFolding="2"
TargetMachine="1"/>
<Tool
Name="VCMIDLTool"/>
<Tool
Name="VCPostBuildEventTool"/>
<Tool
Name="VCPreBuildEventTool"/>
<Tool
Name="VCPreLinkEventTool"/>
<Tool
Name="VCResourceCompilerTool"/>
<Tool
Name="VCWebServiceProxyGeneratorTool"/>
<Tool
Name="VCXMLDataGeneratorTool"/>
<Tool
Name="VCWebDeploymentTool"/>
<Tool
Name="VCManagedWrapperGeneratorTool"/>
<Tool
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
</Configuration>
</Configurations>
<References>
</References>
<Files>
<Filter
Name="Source Files"
Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
<File
RelativePath=".\scboot.c">
<FileConfiguration
Name="Debug|Win32">
<Tool
Name="VCCLCompilerTool"
CompileAs="2"/>
</FileConfiguration>
<FileConfiguration
Name="Release|Win32">
<Tool
Name="VCCLCompilerTool"
CompileAs="2"/>
</FileConfiguration>
</File>
</Filter>
<Filter
Name="Header Files"
Filter="h;hpp;hxx;hm;inl;inc;xsd"
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
</Filter>
<Filter
Name="Resource Files"
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}">
</Filter>
<File
RelativePath="..\lib\rawhid.lib">
</File>
</Files>
<Globals>
</Globals>
</VisualStudioProject>

8
source/scdis/Makefile Executable file
View File

@ -0,0 +1,8 @@
PROG = scdis
OBJS = ../common/hid_tokens.o ../common/macro_tokens.o $(PROG).o
include ../build/Makefile_prog.inc

376
source/scdis/scdis.cpp Executable file
View File

@ -0,0 +1,376 @@
// scdis.cpp - config file disassembler for Soarer's Keyboard Converter.
#include "../common/global.h"
#include "../common/hid_tokens.h"
#include "../common/macro_tokens.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <vector>
#include <utility>
#include <string>
using namespace std;
typedef unsigned char uint8_t;
typedef unsigned short uint16_t;
FILE* fout = stdout;
const char* get_force_set(uint8_t force)
{
static const char* sets[] = { "set1", "set2", "set3", "set2ext" };
uint8_t force_set = force & 0x0F;
if ( 1 <= force_set && force_set <= 4 ) {
return sets[force_set - 1];
}
return "ERROR";
}
const char* get_force_protocol(uint8_t force)
{
static const char* protocols[] = { "xt", "at" };
uint8_t force_protocol = (force & 0xF0) >> 4;
if ( 1 <= force_protocol && force_protocol <= 2 ) {
return protocols[force_protocol - 1];
}
return "ERROR";
}
const char* get_block_type(uint8_t blk_type)
{
static const char* blk_types[] = { "layerblock", "remapblock", "macroblock" };
if ( 0 <= blk_type && blk_type <= 2 ) {
return blk_types[blk_type];
}
return "ERROR";
}
string get_ifset(uint8_t ifset)
{
static const char* sets[8] = { "set1", "set2", "set3", "set2ext", "INVALIDSET", "INVALIDSET", "INVALIDSET", "INVALIDSET" };
if ( !ifset ) {
return string("any");
} else {
string s;
for ( int i = 0; i < 8; ++i ) {
if ( ifset & 1 ) {
s += sets[i];
s += " ";
}
ifset = ifset >> 1;
}
return s;
}
}
string get_macro_match_metas(uint8_t desired_meta, uint8_t matched_meta)
{
static const char* metas[4] = { "control", "shift", "alt", "gui" };
static const char* hmetas[8] = { "lcontrol", "lshift", "lalt", "lgui", "rcontrol", "rshift", "ralt", "rgui" };
uint8_t unhanded_meta = (desired_meta & ~matched_meta) & 0xF0;
string s;
for ( int i = 0; i < 4; ++i ) {
uint8_t mask = (uint8_t)((1 << (i + 4)) | (1 << i));
if ( unhanded_meta & mask ) {
s += metas[i];
s += " ";
desired_meta &= ~mask;
matched_meta &= ~mask;
}
}
for ( int i = 0; i < 8; ++i ) {
uint8_t mask = (uint8_t)(1 << i);
if ( matched_meta & mask ) {
if ( !(desired_meta & mask) ) {
s += "-";
}
s += hmetas[i];
s += " ";
}
}
return s;
}
string get_macrostep_metas(int val)
{
static const char* metas[8] = { "lcontrol", "lshift", "lalt", "lgui", "rcontrol", "rshift", "ralt", "rgui" };
string s;
for ( int i = 0; i < 8; ++i ) {
if ( val & 1 ) {
s += metas[i];
s += " ";
}
val = val >> 1;
}
return s;
}
string get_macrostep(int cmd, int val)
{
//fprintf(fout, "\t%s %d\n", lookup_macro_token(cmd), val);
string s;
if ( cmd & Q_PUSH_META ) {
s = "PUSH_META ";
}
s += lookup_macro_token(cmd & ~Q_PUSH_META);
s += " ";
int argtype = get_macro_arg_type(cmd);
char buffer[64];
switch ( argtype ) {
case MACRO_ARG_NONE:
break;
case MACRO_ARG_HID:
s += lookup_hid_token(val);
break;
case MACRO_ARG_META:
s += get_macrostep_metas(val);
break;
case MACRO_ARG_DELAY:
//s += itoa(val, buffer, 10);
sprintf(buffer, "%d", val);
s += string(buffer);
break;
default:
s += "INVALID";
break;
}
return s;
}
int process_layerblock(const uint8_t* buf, const uint8_t* bufend)
{
const uint8_t* p = buf;
fprintf(fout, "layerblock\n");
if ( bufend - p < 1 ) {
fprintf(fout, "# ERROR: block truncated\n");
return 1;
}
uint8_t n = *p++;
fprintf(fout, "# count: %d\n", n);
if ( bufend - p != (int)n * 2 ) {
fprintf(fout, "# ERROR: block size mismatch\n");
return 1;
}
for ( int i = 0; i < n; ++i ) {
uint8_t fn = *p++;
uint8_t layer = *p++;
fprintf(fout, "\t");
int b = 1;
while ( fn ) {
if ( fn & 1 ) {
fprintf(fout, "fn%d ", b);
}
++b;
fn = fn >> 1;
}
fprintf(fout, "%d\n", layer);
}
return 0;
}
int process_remapblock(const uint8_t* buf, const uint8_t* bufend)
{
const uint8_t* p = buf;
fprintf(fout, "remapblock\n");
if ( bufend - p < 2 ) {
fprintf(fout, "# ERROR: block truncated\n");
return 1;
}
uint8_t layer = *p++;
fprintf(fout, "layer %d\n", layer);
uint8_t n = *p++;
fprintf(fout, "# count: %d\n", n);
if ( bufend - p != (int)n * 2 ) {
fprintf(fout, "# ERROR: block size mismatch\n");
return 1;
}
for ( int i = 0; i < n; ++i ) {
uint8_t from_hid = *p++;
uint8_t to_hid = *p++;
fprintf(fout, "\t%s %s\n", lookup_hid_token(from_hid), lookup_hid_token(to_hid));
}
return 0;
}
int process_macro(const uint8_t* buf, const uint8_t* /*bufend*/)
{
// todo: use bufend to check length
const uint8_t* p = buf;
uint8_t hid_code = *p++;
uint8_t desired_meta = *p++;
uint8_t matched_meta = *p++;
uint8_t press_flags = *p++;
uint8_t release_flags = *p++;
size_t press_length = press_flags & 0x3F;
size_t release_length = release_flags & 0x3F;
string s = get_macro_match_metas(desired_meta, matched_meta);
fprintf(fout, "macro %s %s # %02X %02X\n", lookup_hid_token(hid_code), s.c_str(), desired_meta, matched_meta);
for ( int i = 0; i < (int)press_length; ++i ) {
uint8_t cmd = *p++;
uint8_t val = *p++;
fprintf(fout, "\t%s\n", get_macrostep(cmd, val).c_str());
}
if ( release_length ) {
fprintf(fout, "onbreak%s\n", (release_flags & 0x40) ? "" : " norestoremeta");
for ( int i = 0; i < (int)release_length; ++i ) {
uint8_t cmd = *p++;
uint8_t val = *p++;
fprintf(fout, "\t%s\n", get_macrostep(cmd, val).c_str());
}
}
fprintf(fout, "endmacro\n");
return 0;
}
int process_macroblock(const uint8_t* buf, const uint8_t* bufend)
{
const uint8_t* p = buf;
fprintf(fout, "macroblock\n");
if ( bufend - p < 1 ) {
fprintf(fout, "# ERROR: block truncated\n");
return 1;
}
uint8_t n = *p++;
fprintf(fout, "# macro count: %d\n", n);
for ( int i = 0; i < n; ++i ) {
if ( bufend - p < 5 ) {
fprintf(fout, "# ERROR: block truncated\n");
return 1;
}
int press_length = p[3] & 0x3F;
int release_length = p[4] & 0x3F;
int macro_length = 5 + 2 * (press_length + release_length);
if ( bufend - p < macro_length ) {
fprintf(fout, "# ERROR: block truncated\n");
return 1;
}
process_macro(p, p + macro_length);
p += macro_length;
}
return 0;
}
int process_block(const uint8_t* buf, size_t buflen)
{
const uint8_t* p = buf;
const uint8_t* bufend = buf + buflen;
if ( bufend - p < 2 ) {
fprintf(fout, "# ERROR: block truncated\n");
return 1;
}
fprintf(fout, "\n# block length: %d\n", *p++);
uint8_t blktype = *p & 0x07;
uint8_t blksel = (*p >> 3) & 0x07;
uint8_t has_set = (*p & 0x40) ? 1 : 0;
uint8_t has_id = (*p & 0x80) ? 2 : 0;
++p;
if ( bufend - p < has_set + has_id ) {
fprintf(fout, "# ERROR: block truncated\n");
return 1;
}
uint8_t blkset = 0;
if ( has_set ) {
blkset = *p++;
}
uint16_t blkid = 0;
if ( has_id ) {
blkid = (uint16_t)(*p++);
blkid |= ((uint16_t)(*p++) << 8);
}
fprintf(fout, "ifset %s\n", get_ifset(blkset).c_str());
if ( has_id ) {
fprintf(fout, "ifkeyboard %04X\n", blkid);
} else {
fprintf(fout, "ifkeyboard any\n");
}
if ( blksel ) {
fprintf(fout, "ifselect %d\n", blksel);
} else {
fprintf(fout, "ifselect any\n");
}
// fprintf(fout, "%s\n", get_block_type(blktype));
int retval = 1;
switch ( blktype ) {
case BLOCK_LAYERDEF: retval = process_layerblock(p, bufend); break;
case BLOCK_REMAP: retval = process_remapblock(p, bufend); break;
case BLOCK_MACRO: retval = process_macroblock(p, bufend); break;
}
fprintf(fout, "endblock\n");
return retval;
}
int process_file(const uint8_t* buf, size_t buflen)
{
const uint8_t* p = buf;
fprintf(fout, "# length: %u\n", buflen);
// header...
uint8_t sig1 = *p++;
uint8_t sig2 = *p++;
fprintf(fout, "# signature: %c %c\n", sig1, sig2);
uint8_t ver1 = *p++;
uint8_t ver2 = *p++;
fprintf(fout, "# version: %d %d\n", ver1, ver2);
if ( *p & 0x0F ) {
fprintf(fout, "force %s\n", get_force_set(*p));
}
if ( *p & 0xF0 ) {
fprintf(fout, "force %s\n", get_force_protocol(*p));
}
++p; // force
++p; // reserved
// blocks...
int err = 0;
const uint8_t* pend = buf + buflen;
while ( p < pend ) {
uint8_t blklen = *p;
if ( !blklen ) {
fprintf(fout, "ERROR: block length is zero!\n");
return 1;
}
err |= process_block(p, blklen);
p += blklen;
}
return err;
}
int main(int argc, char** argv)
{
printf("scdis v1.10\n");
if ( argc != 2 && argc != 3 ) {
fprintf(stderr, "usage: scdis <binary_config> [<text_config>]\n");
return 1;
}
const size_t bufsize = 16384;
static uint8_t buf[bufsize];
FILE* f = fopen(argv[1], "rb");
if ( !f ) {
fprintf(stderr, "error: could not open input file %s\n", argv[1]);
return 1;
}
size_t buflen = fread(buf, 1, bufsize, f);
fclose(f);
if ( argc == 3 ) {
fout = fopen(argv[2], "wt");
if ( !fout ) {
fprintf(stderr, "error: could not open output file %s\n", argv[2]);
return 1;
}
}
int err = process_file(buf, buflen);
if ( fout != stdout ) {
fclose(fout);
}
if ( err ) {
fprintf(stderr, "errors encountered, see output file\n");
return 1;
}
return 0;
}

21
source/scdis/scdis.sln Executable file
View File

@ -0,0 +1,21 @@
Microsoft Visual Studio Solution File, Format Version 8.00
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "scdis", "scdis.vcproj", "{81871EED-13AF-42FF-BB7F-88F93647B45B}"
ProjectSection(ProjectDependencies) = postProject
EndProjectSection
EndProject
Global
GlobalSection(SolutionConfiguration) = preSolution
Debug = Debug
Release = Release
EndGlobalSection
GlobalSection(ProjectConfiguration) = postSolution
{81871EED-13AF-42FF-BB7F-88F93647B45B}.Debug.ActiveCfg = Debug|Win32
{81871EED-13AF-42FF-BB7F-88F93647B45B}.Debug.Build.0 = Debug|Win32
{81871EED-13AF-42FF-BB7F-88F93647B45B}.Release.ActiveCfg = Release|Win32
{81871EED-13AF-42FF-BB7F-88F93647B45B}.Release.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
EndGlobalSection
GlobalSection(ExtensibilityAddIns) = postSolution
EndGlobalSection
EndGlobal

147
source/scdis/scdis.vcproj Executable file
View File

@ -0,0 +1,147 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="7.10"
Name="scdis"
ProjectGUID="{81871EED-13AF-42FF-BB7F-88F93647B45B}"
Keyword="Win32Proj">
<Platforms>
<Platform
Name="Win32"/>
</Platforms>
<Configurations>
<Configuration
Name="Debug|Win32"
OutputDirectory="Debug"
IntermediateDirectory="Debug"
ConfigurationType="1"
CharacterSet="2">
<Tool
Name="VCCLCompilerTool"
Optimization="0"
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
MinimalRebuild="TRUE"
BasicRuntimeChecks="3"
RuntimeLibrary="5"
UsePrecompiledHeader="0"
WarningLevel="3"
Detect64BitPortabilityProblems="TRUE"
DebugInformationFormat="4"/>
<Tool
Name="VCCustomBuildTool"/>
<Tool
Name="VCLinkerTool"
OutputFile="$(OutDir)/scdis.exe"
LinkIncremental="2"
GenerateDebugInformation="TRUE"
ProgramDatabaseFile="$(OutDir)/scdis.pdb"
SubSystem="1"
TargetMachine="1"/>
<Tool
Name="VCMIDLTool"/>
<Tool
Name="VCPostBuildEventTool"/>
<Tool
Name="VCPreBuildEventTool"/>
<Tool
Name="VCPreLinkEventTool"/>
<Tool
Name="VCResourceCompilerTool"/>
<Tool
Name="VCWebServiceProxyGeneratorTool"/>
<Tool
Name="VCXMLDataGeneratorTool"/>
<Tool
Name="VCWebDeploymentTool"/>
<Tool
Name="VCManagedWrapperGeneratorTool"/>
<Tool
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
</Configuration>
<Configuration
Name="Release|Win32"
OutputDirectory="../bin"
IntermediateDirectory="Release"
ConfigurationType="1"
CharacterSet="2">
<Tool
Name="VCCLCompilerTool"
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
RuntimeLibrary="4"
UsePrecompiledHeader="0"
WarningLevel="4"
Detect64BitPortabilityProblems="TRUE"
DebugInformationFormat="3"/>
<Tool
Name="VCCustomBuildTool"/>
<Tool
Name="VCLinkerTool"
OutputFile="$(OutDir)/scdis.exe"
LinkIncremental="1"
GenerateDebugInformation="FALSE"
SubSystem="1"
OptimizeReferences="2"
EnableCOMDATFolding="2"
TargetMachine="1"/>
<Tool
Name="VCMIDLTool"/>
<Tool
Name="VCPostBuildEventTool"/>
<Tool
Name="VCPreBuildEventTool"/>
<Tool
Name="VCPreLinkEventTool"/>
<Tool
Name="VCResourceCompilerTool"/>
<Tool
Name="VCWebServiceProxyGeneratorTool"/>
<Tool
Name="VCXMLDataGeneratorTool"/>
<Tool
Name="VCWebDeploymentTool"/>
<Tool
Name="VCManagedWrapperGeneratorTool"/>
<Tool
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
</Configuration>
</Configurations>
<References>
</References>
<Files>
<Filter
Name="Source Files"
Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
<File
RelativePath="..\common\hid_tokens.cpp">
</File>
<File
RelativePath="..\common\macro_tokens.cpp">
</File>
<File
RelativePath=".\scdis.cpp">
</File>
</Filter>
<Filter
Name="Header Files"
Filter="h;hpp;hxx;hm;inl;inc;xsd"
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
<File
RelativePath="..\common\global.h">
</File>
<File
RelativePath="..\common\hid_tokens.h">
</File>
<File
RelativePath="..\common\macro_tokens.h">
</File>
</Filter>
<Filter
Name="Resource Files"
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}">
</Filter>
</Files>
<Globals>
</Globals>
</VisualStudioProject>

8
source/scinfo/Makefile Executable file
View File

@ -0,0 +1,8 @@
PROG = scinfo
OBJS = $(PROG).o
include ../build/Makefile_hidprog.inc

Some files were not shown because too many files have changed in this diff Show More