ソースを参照

Add wiiec from https://github.com/csBlueChip/FlipperZero_WiiEC

git-subtree-dir: wiiec
git-subtree-mainline: 73e1d5c495c5ba34a0b5b118a3bce2fb19271e51
git-subtree-split: 8ff921b4f8b69fdf60737bdd2b170f0726b719cc
Willy-JL 2 年 前
コミット
46fa1a64e5
100 ファイル変更2239 行追加0 行削除
  1. 1 0
      wiiec/.gitsubtree
  2. 21 0
      wiiec/LICENSE
  3. 233 0
      wiiec/README.md
  4. 67 0
      wiiec/README.txt
  5. BIN
      wiiec/WiiEC.png
  6. 21 0
      wiiec/_image_tool/LICENSE
  7. 30 0
      wiiec/_image_tool/README
  8. 138 0
      wiiec/_image_tool/_convert.c
  9. 79 0
      wiiec/_image_tool/_convert.sh
  10. 141 0
      wiiec/_image_tool/_convert_images.c
  11. 53 0
      wiiec/_image_tool/_convert_images.h
  12. 59 0
      wiiec/_image_tool/_convert_test.c
  13. BIN
      wiiec/_images/CLASSIC.png
  14. BIN
      wiiec/_images/CLASSIC_N.png
  15. BIN
      wiiec/_images/DEBUG.png
  16. BIN
      wiiec/_images/DUMP.png
  17. BIN
      wiiec/_images/GIMP/Nunchuck_acc.xcf
  18. BIN
      wiiec/_images/GIMP/RIP.xcf
  19. BIN
      wiiec/_images/GIMP/Wiring.xcf
  20. BIN
      wiiec/_images/GIMP/classic.xcf
  21. BIN
      wiiec/_images/GIMP/csLogo.xcf
  22. BIN
      wiiec/_images/GIMP/fonts.xcf
  23. BIN
      wiiec/_images/GIMP/frame.xcf
  24. BIN
      wiiec/_images/GIMP/port.xcf
  25. BIN
      wiiec/_images/GIMP/social.xcf
  26. BIN
      wiiec/_images/NUNCHUCK.png
  27. BIN
      wiiec/_images/NUNCHUCK_acc.png
  28. BIN
      wiiec/_images/NUNCHUCK_anal.png
  29. BIN
      wiiec/_images/NUNCHUCK_cal.gif
  30. BIN
      wiiec/_images/NUNCHUCK_cal.png
  31. BIN
      wiiec/_images/Nunchucky.png
  32. BIN
      wiiec/_images/RIP.png
  33. BIN
      wiiec/_images/SPLASH.png
  34. BIN
      wiiec/_images/WAIT.png
  35. BIN
      wiiec/_images/WiiChuck.png
  36. BIN
      wiiec/_images/Wiring.png
  37. BIN
      wiiec/_images/plug.png
  38. BIN
      wiiec/_images/social.png
  39. 36 0
      wiiec/application.fam
  40. 70 0
      wiiec/bc_logging.h
  41. 69 0
      wiiec/err.h
  42. 141 0
      wiiec/gfx/images.c
  43. 134 0
      wiiec/gfx/images.h
  44. 11 0
      wiiec/gfx/img_3x5_0.c
  45. 11 0
      wiiec/gfx/img_3x5_1.c
  46. 11 0
      wiiec/gfx/img_3x5_2.c
  47. 11 0
      wiiec/gfx/img_3x5_3.c
  48. 11 0
      wiiec/gfx/img_3x5_4.c
  49. 11 0
      wiiec/gfx/img_3x5_5.c
  50. 11 0
      wiiec/gfx/img_3x5_6.c
  51. 11 0
      wiiec/gfx/img_3x5_7.c
  52. 11 0
      wiiec/gfx/img_3x5_8.c
  53. 11 0
      wiiec/gfx/img_3x5_9.c
  54. 11 0
      wiiec/gfx/img_3x5_v.c
  55. 13 0
      wiiec/gfx/img_5x7_0.c
  56. 13 0
      wiiec/gfx/img_5x7_1.c
  57. 13 0
      wiiec/gfx/img_5x7_2.c
  58. 13 0
      wiiec/gfx/img_5x7_3.c
  59. 13 0
      wiiec/gfx/img_5x7_4.c
  60. 13 0
      wiiec/gfx/img_5x7_5.c
  61. 13 0
      wiiec/gfx/img_5x7_6.c
  62. 13 0
      wiiec/gfx/img_5x7_7.c
  63. 13 0
      wiiec/gfx/img_5x7_8.c
  64. 13 0
      wiiec/gfx/img_5x7_9.c
  65. 13 0
      wiiec/gfx/img_5x7_A.c
  66. 13 0
      wiiec/gfx/img_5x7_B.c
  67. 13 0
      wiiec/gfx/img_5x7_C.c
  68. 13 0
      wiiec/gfx/img_5x7_D.c
  69. 13 0
      wiiec/gfx/img_5x7_E.c
  70. 13 0
      wiiec/gfx/img_5x7_F.c
  71. 14 0
      wiiec/gfx/img_6x8_0.c
  72. 14 0
      wiiec/gfx/img_6x8_1.c
  73. 14 0
      wiiec/gfx/img_6x8_2.c
  74. 14 0
      wiiec/gfx/img_6x8_3.c
  75. 14 0
      wiiec/gfx/img_6x8_4.c
  76. 14 0
      wiiec/gfx/img_6x8_5.c
  77. 14 0
      wiiec/gfx/img_6x8_6.c
  78. 14 0
      wiiec/gfx/img_6x8_7.c
  79. 14 0
      wiiec/gfx/img_6x8_8.c
  80. 14 0
      wiiec/gfx/img_6x8_9.c
  81. 14 0
      wiiec/gfx/img_6x8_A.c
  82. 14 0
      wiiec/gfx/img_6x8_B.c
  83. 14 0
      wiiec/gfx/img_6x8_C.c
  84. 14 0
      wiiec/gfx/img_6x8_D.c
  85. 14 0
      wiiec/gfx/img_6x8_E.c
  86. 14 0
      wiiec/gfx/img_6x8_F.c
  87. 14 0
      wiiec/gfx/img_6x8_G.c
  88. 14 0
      wiiec/gfx/img_6x8_X.c
  89. 14 0
      wiiec/gfx/img_6x8_Y.c
  90. 14 0
      wiiec/gfx/img_6x8_Z.c
  91. 14 0
      wiiec/gfx/img_6x8_d_.c
  92. 14 0
      wiiec/gfx/img_6x8_n_.c
  93. 14 0
      wiiec/gfx/img_6x8_v_.c
  94. 122 0
      wiiec/gfx/img_RIP.c
  95. 17 0
      wiiec/gfx/img_cc_Cable.c
  96. 25 0
      wiiec/gfx/img_cc_Joy.c
  97. 92 0
      wiiec/gfx/img_cc_Main.c
  98. 13 0
      wiiec/gfx/img_cc_btn_A1.c
  99. 13 0
      wiiec/gfx/img_cc_btn_B1.c
  100. 13 0
      wiiec/gfx/img_cc_btn_X1.c

+ 1 - 0
wiiec/.gitsubtree

@@ -0,0 +1 @@
+https://github.com/csBlueChip/FlipperZero_WiiEC main

+ 21 - 0
wiiec/LICENSE

@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2022 BlueChip
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.

+ 233 - 0
wiiec/README.md

@@ -0,0 +1,233 @@
+# [FlipperZero] Wii Extension Controller Protocol Analyser
+This Protocol Analyser offers a full Test and Calibrate system for Wii Extension Controllers.
+
+__Disclaimer:__ *Use of this plugin, and notably connecting an Extension Controller to the FlipperZero is performed entirely at your own risk.*
+
+# Notes
+This plugin has (todate) only been tested with official Nintendo Nunchucks and Classic Controllers - namely Nunchucks and Classic Controllers.
+
+# Encryption
+This plugin has SOME code to handle encryption, but it it unused, untested, and some of it is known to un-work.
+
+This plugin (currently) only works with Extension Controllers which implement the encryption-bypass strategy. IE. `i2c_write(0xf0, 0x55) ; i2c_write(0xfb, 0x00)`
+
+If you need this functionality, either raise an Issue or, better still, a Pull Request.
+
+# Screen: SPLASH
+<img src="_images/SPLASH.png" width="256"/><br/>
+The SPLASH Screen is displayed when the Plugin starts. It can be cleared by pressing any key, else it will auto-clear after 3.5 seconds.
+
+# Screen: WAIT
+<img src="_images/WAIT.png" width="256"/>&nbsp;&nbsp;&nbsp;<img src="_images/Wiring.png" width="512"/><br/><br/>
+The WAIT screen will display which pins you need to connect between the flipper and the Wii Extension Controller.
+
+__Disclaimer:__ Use of this plugin, and notably connecting the Controller to the FlipperZero is performed entirely at your own risk.
+
+Looking in to the exposed side of the Extension Controller plug, with the notch on the bottom
+
+| EC Pin # | EC Position | EC Pin ID | Pin Function | FZ GPIO Pin Name | FZ GPIO Pin # |
+| :---: | :---: | :---: | :---: | :---: | :---: |
+| 1 | top-left | +3v3 | Power | 3v3 | 9 |
+| 2 | bottom-left | SCL | i2c clock | C0 | 16 |
+| 3 | top-centre | EN | ¿detect? | | |
+| 4 | bottom-centre | -x- | -none- | | |
+| 5 | top-right | SDA | i2c data | C1 | 15 |
+| 6 | bottom-right | Gnd | Power | Gnd | 18 |
+
+Keys:
+* Left - Show splash screen
+* Back - exit plugin
+
+The easiest way to connect a Wii Extension Controller to a FlipperZero is arguably with a ["WiiChuck"](https://www.ebay.co.uk/sch/?_nkw=wiichuck) or a ["Nunchucky"](https://www.solarbotics.com/product/31040)<br/><br/>
+<table style="border:none">
+  <tr><td><img src="_images/WiiChuck.png" width="166"/></td>
+      <td><img src="_images/Nunchucky.png" width="128"/></td></tr>
+  <tr><td align="center"><a href="https://www.ebay.co.uk/sch/?_nkw=wiichuck">WiiChuck</a></td>
+      <td align="center"><a href="https://www.solarbotics.com/product/31040">Nunchucky</a></td></tr>
+</table>
+
+### ** WARNING **
+Neither the WiiChuck, nor the Nunchucky have a pin polarisation mechanism.<br/>
+If you plug the adaptor in the wrong way around you WILL apply voltage to the Controller the wrong way round!!<br/>
+I have no idea if THIS WILL PERMANENTLY KILL THE CONTROLLER ...Who wants to try it?
+
+On all the WiiChucks I have seen:
+* The WiiChuck has THREE connectors on one side, and TWO connectors on the other.
+* The side with TWO connectors should go against the side of the Controller plug with the big indent.
+```
++-------------+
+|  _________  |
+| | =  =  = | |
+| |_=_____=_| | <-- notice missing pin
+|     ___     |
+|    |   |    | <-- notice indent
++----+   +----+
+```
+<img src="_images/plug.png" width="128"/><br/>
+
+...BUT I *highly* recommend you check the pins on your adaptor to make sure everything goes well.
+
+I believe the unconnected pin on the top is a "presence detect" function, but I have not (yet) verified this.<br/>
+This feature is NOT required by this plugin, as the detection is performed by means of an i2c handshake.
+
+When a device is connected it will be immediately recognised. If it is not, either:
+* The Controller is not correctly connected<br/>
+...This may be as simple as a broken wire.
+* The controller board in the Controller is faulty.<br/>
+...Repair of which is beyond the scope of this document.
+
+To get the list of "known" Controllers, run `./info.sh`<br/>
+As of writing this, that returns:
+```c
+[PID_UNKNOWN    ] = { {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, "Unknown Perhipheral", SCENE_DUMP,
+[PID_NUNCHUCK   ] = { {0x00, 0x00, 0xA4, 0x20, 0x00, 0x00}, "Nunchuck", SCENE_NUNCHUCK,
+[PID_CLASSIC    ] = { {0x00, 0x00, 0xA4, 0x20, 0x01, 0x01}, "Classic Controller", SCENE_CLASSIC,
+[PID_BALANCE    ] = { {0x00, 0x00, 0xA4, 0x20, 0x04, 0x02}, "Balance Board", SCENE_DUMP,
+[PID_GH_GUITAR  ] = { {0x00, 0x00, 0xA4, 0x20, 0x01, 0x03}, "Guitar Hero Guitar", SCENE_DUMP,
+[PID_GH_DRUMS   ] = { {0x01, 0x00, 0xA4, 0x20, 0x01, 0x03}, "Guitar Hero World Tour Drums", SCENE_DUMP,
+[PID_TURNTABLE  ] = { {0x03, 0x00, 0xA4, 0x20, 0x01, 0x03}, "DJ Hero Turntable", SCENE_DUMP,
+[PID_TAIKO_DRUMS] = { {0x00, 0x00, 0xA4, 0x20, 0x01, 0x11}, "Taiko Drum Controller)", SCENE_DUMP,
+
+```
+
+You can see that there are EIGHT known devices. One is the default for an unknown controller; SEVEN devices are known by name; and TWO (of those seven) have bespoke "scenes" (ie. SCENE_NUNCHUCK & SCENE_CLASSIC).
+
+# Screen: NUNCHUCK - MAIN
+<img src="_images/NUNCHUCK.png" width="256"/><br/>
+When you connect a Nunchuck, you will see a screen displaying:
+* Accelerometer{X,Y,Z} values
+* Joystick{X,Y} values
+* Joystick graphic
+* Button{C,Z}
+
+Keys:
+* Left       - Go to the DUMP screen
+* Right      - Go to the NUNCHUCK_ACC accelerometers screen
+* Up/Down/OK - [qv. Peak Meters]
+* Short-Back - Reset controller
+* Long-Back  - Exit plugin
+
+# Screen: NUNCHUCK - ACCELEROMETERS
+
+<img src="_images/NUNCHUCK_anal.png" width="256" align="top"/>&nbsp;&nbsp;&nbsp;<img src="_images/NUNCHUCK_acc.png" width="200"/><br/>
+
+| Axis | Movement | Lower | Higher |
+| :---: | :---: | :---: | :---: |
+| X | Left / Right | Left | Right |
+| Y | Fwd / Bkwd   | Fwd  | Bkwd |
+| Z | Down / Up    | Down | Up |
+
+* Movement in the direction of an axis changes that axis reading
+* Twisting/tilting around an axis changes the other two readings
+* EG. 
+  * Move left (along the X axis) will effect X
+  * Turn left (a rotation around the Y axis) will effect X and Z
+
+Keys:
+* Left       - go to the main NUNCHUCK screen
+* Up
+  * Auto-Pause Disabled --> Enable Auto-Pause
+  * Paused at the end of a page --> Restart scanner
+  * Running with Auto-Pause Enabled --> Disable Auto-Pause
+* Nunchuck-Z - Toggle pause
+* Nunchuck-C - Toggle auto-pause
+* Long-OK    - Enter Software Calibration mode [qv. Calibration]
+  * Calibration mode on the Accelerometer screen will ONLY calibrate the accelerometer
+* Short-OK   - Leave Software Calibration mode *and* Calibrate CENTRE position(s)
+* Short-Back - Reset controller
+* Long-Back  - Exit plugin
+
+<sub>NB. Code DOES exist to scroll the display, but the LCD refresh rate is too low, and it looks awful</sub>
+
+# Screen: CLASSIC
+<img src="_images/CLASSIC.png" width="256"/><img src="_images/CLASSIC_N.png" width="256"/><br/>
+When you connect a Classic Controller [Pro], you will see a screen displaying a Classic Controller
+* The Classic Controller will animate in line with controller events 
+* The scan rate is set to 30fps, but in reality there is a bit of lag with the LCD screen, so YMMV.
+
+Keys:
+* Left       - go to the DUMP screen
+* Right      - show analogue readings (Left to hide them again)
+* Up/Down/OK - [qv. Peak Meters]
+* Short-Back - Reset controller
+* Long-Back  - Exit plugin
+
+# Screen: DUMP
+<img src="_images/DUMP.png" width="256"/><br/>
+The Dump screen will show you the raw readings from the device.<br/>
+If you connect a device which does not have a bespoke `_decode()` function (etc.), you will see (only) this screen.
+* SID - String ID - human-readable name (from the `info` table)
+* PID - Peripheral ID - The 6 bytes which identify the device.
+* Cal - Calibration data - 16 bytes
+* The bottom row of hex shows the SIX bytes of Controller data
+  * Below each hex digit is the binary representation of that digit
+  * By example. With a Nunchuck connected, click the Z button, and watch the bit on the far right
+
+Keys:
+* Right      - return to controller-specific screen (if there is one)
+* Short-Back - Reset controller
+* Long-Back  - Exit plugin
+
+# Peak Meters (Calibration values)
+
+On any Controller-specific screen with a Peak/Trough menu displayed:
+* Up       - [toggle] only show peak values
+* Down     - [toggle] only show trough values
+* Long-OK  - Enter Software Calibration mode [qv. Calibration]
+* Short-OK - Leave Software Calibration mode / Calibrate CENTRE position(s)
+
+# Calibration
+<img src="_images/NUNCHUCK_cal.gif" width="256"/><br/>
+
+Digital buttons do NOT require Calibration.
+
+Some controllers have Calibration data which is calculated at the factory, and stored in memory (¿OTP?) on the Controller.
+EG. Classic Controller HAS Calibration data, but Classic Controller Pro does NOT!
+
+Each device has a different way to interpret the Calibration Data.<br/>
+EG. A Nunchuck has one joystick, and an accelerometer ...whereas a Classic Controller has 2 joysticks and 2 analogue buttons.
+
+I have personally found the calibration data to be inaccurate (when compared to actual readings), I guess Controllers drift over the years‽
+If the factory-values LIMIT movement, this is easily resolved - by expanding them on-the-fly.<br/>
+BUT, I have seen Controllers with factory calibration data that suggests the limits are FURTHER than the joystick can reach ...and this requires a full re-calibration of the Controller!
+
+Probably the best way to calibrate is to:
+* Take a/some reading(s) while the Controller is 'at rest', IE. perfectly still and level.
+* Move the Controller to all extremes and store the extreme {peak/trough} values.
+
+Nintendo (allegedly) take the 'at rest' reading immediately after the Controller is connected, and a 're-calibration' can be performed at any time by pressing {`A`, `B`, `+`, `-`} at the same time, for at least 3 seconds.  Although I have no details on what this actually does.
+
+### This tool calibrates as such:
+* When the Controller is first recognised
+  * The factory Calibration data is used to decide the Centre/Middle position and extreme values (eg. far-left & far-right) for each analogue Control
+* Long-OK button press (on the FlipperZero) ...Do NOT touch ANY of the analogue controllers while you are pressing Long-OK
+  * Start the calibrate button flashing
+  * Take the current reading as the Centre position
+  * Set the range limits to "no range"
+  * You must now move the Control between its extremes, so the code can work out the new Calibration/range/peak+trough values
+  * When done, press Short-OK to end Software Calibration mode
+* Short-OK button press (on the FlipperZero) ...Do NOT touch ANY of the analogue controllers while you are pressing Short-OK
+  * Stop the calibrate button flashing
+  * Calibrate the centre position of all analogue controls (accelerometers not supported (yet))
+
+# Screen: DEBUG
+<img src="_images/DEBUG.png" width="256"/><br/>
+On any screen (except SPLASH) you may press Long-Down to enter Debug mode.
+
+You can (at any time) attach to the FlipperZero (via USB) with a serial console {`minicom`, `putty`, whatever} and start the `log` function to see the debug messages.
+
+When you enter the DEBUG screen, the real-time scanner will be stopped. And the following keys made available:
+* Up - Attempt to initialise the attached Controller
+* OK - Take a reading from the attached Controller
+* Long-Down - Restart the real-time scanner and return to the WAIT screen
+
+You can limit the messages at compile-time [see `./info.sh`], or at runtime [FZ->Settings->System->LogLevel]<br/>
+
+[This is probably irrelevant since the introduction of FAP support]<br/>
+If you have memory issues, limiting the messages at compile-time will make the plugin smaller.<br/>
+But (¿obviously?) the more you limit the messsages, the less debug information will be sent to the logger.
+
+# TODO
+
+* FZ Bug: At the time of writing this, there are problems with the i2c FZ functions [qv `i2c_workaround.c`]
+

+ 67 - 0
wiiec/README.txt

@@ -0,0 +1,67 @@
+    ,-------.
+---(  Files  )---
+    `-------'
+
+	README.md           - User Manual : Body [github markdown]
+	_images/            - User Manual : Images
+	_images/GIMP/       - User Manual : GIMP image masters
+
+	LICENSE             - Tech Docs : MIT Licence file
+	README.txt          - Tech Docs : Dev notes
+	notes.txt           - Tech Docs : Random dev notes
+	info.sh             - Tech Docs : Retrieve info from source code
+
+	application.fam     - FAP : Header file
+	WiiEC.png           - FAP : Icon {10x10}
+
+	gfx/                - Analyser : Images [generated by bc_image_tool]
+	wii_anal.c|h        - Analyser : Main application
+	wii_anal_ec.c|h     - Analyser : Extension controller actions
+	wii_anal_keys.c|h   - Analyser : Keyboard handling
+	wii_anal_lcd.c|h    - Analyser : LCD handling
+
+	i2c_workaround.h    - Temporary workaround for i2c bug in FZ code
+	err.h               - Errors
+	bc_logging.h        - Logging macros - especially LOG_LEVEL
+
+	wii_i2c.c|h         - i2c functionality
+
+	wii_ec.c|h          - Extension Controller basic functions
+	wii_ec_macros.h     - Bespoke Extension Controller handy-dandy MACROs
+	wii_ec_classic.c|h  - EC: Classic Controller Pro scene
+	wii_ec_nunchuck.c|h - EC: Nunchuck scene
+	wii_ec_udraw.c|h    - EC: UDraw scene - not written
+
+    ,----------------------------------.
+---(  Adding a new Extension Controller )---
+    `----------------------------------'
+
+//! I'll finish this when I write the UDraw code
+
+Create a new Extension Controller called "mydev"
+
+Create  wii_ec_mydev.c  and  wii_ec_mydev.h
+
+In  wii_ec_mydev.c|h
+	Create the functions [& prototypes]
+		bool  mydev_init   (wiiEC_t* const) ;                            // Additional initialisation code
+		void  mydev_decode (wiiEC_t* const) ;                            // Decode controller input data
+		void  mydev_msg    (wiiEC_t* const,  FuriMessageQueue* const) ;  // Put event messages in the event queue
+		void  mydev_calib  (wiiEC_t* const,  ecCalib_t) ;                // Controller calibration function
+		void  mydev_show   (Canvas* const,  state_t* const) ;            // Scene LCD display
+		bool  mydev_key    (const eventMsg_t* const,  state_t* const) ;  // Scene key controls
+
+In  wii_ec.h
+	Include the new header
+		#include  "wii_ec_mydev.h"
+	Add a perhipheral id to  enum ecPid
+		PID_MYDEV
+
+In  wii_anal.h
+	As a scene name to  enum scene
+		SCENE_MYDEV
+
+In  wii_ec.c
+	Add the device definition to the  ecId[]  array
+	[PID_MYDEV] = { {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, "My Device", SCENE_MYDEV,
+	                mydev_init, mydev_decode, mydev_msg, mydev_calib, mydev_show, mydev_key },

BIN
wiiec/WiiEC.png


+ 21 - 0
wiiec/_image_tool/LICENSE

@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2022 BlueChip
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.

+ 30 - 0
wiiec/_image_tool/README

@@ -0,0 +1,30 @@
+1.	Prepare the image
+	a. 	Open your *black and white* image in GIMP
+	b. 	File -> Export As
+			filename: EXAMPLE.c
+			Type    : "C source code"
+		[Export]
+			prefixed name: gimp_image
+			Comment      : <any>
+			[x] Use GLib types
+			[ ] <<all other options>>
+			Opacity      : 100%
+		[Export]
+
+2.	Prepare conversion tool [stored in (eg.) /path/]
+	a.	cp  _convert*.*  /path/
+	b.	cp  EXAMPLE.c    /path/
+
+3.	Run the conversion tool
+	a.	cd  /path/
+	b.	./_convert.sh  EXAMPLE.c
+
+4.	All being well, you will see an ascii version of your image.
+	If not, then you're gonna have to submit a bug report <shrug>
+
+5.	You should now have a directory called img_/
+	In that directory should be
+		img_EXAMPLE.c - The data for your new image
+		img_*.c       - The data for other images
+		images.h      - A header for ALL images that have been created in this directory
+		images.c      - A sample FlipperZero show() function [not optimised]

+ 138 - 0
wiiec/_image_tool/_convert.c

@@ -0,0 +1,138 @@
+#include <stdint.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+int  main (int argc,  char* argv[])
+{
+	const unsigned char*  pp       = NULL;
+	uint32_t              pix      = 0;
+	int                   bit      = 0;
+
+	uint8_t               b        = 0;
+	uint8_t               bcnt     = 0;
+
+	unsigned int          lcnt     = 0;
+	static const int      lmax     = 16;  // max hex values per line
+
+	uint8_t*              buf      = NULL;
+	uint8_t*              bp       = NULL;
+	unsigned int          blen     = 0;
+
+	uint8_t*              cmp      = NULL;
+	uint8_t*              cp       = NULL;
+	unsigned int          clen     = 0;
+	uint8_t               ctag     = 0xFF;
+	uint32_t              tag[256] = {0};
+	uint32_t              tmax     = UINT32_MAX;
+
+	unsigned int          x, y, z;
+
+	const char*           name     = argv[1];
+	FILE*                 fh       = fopen(argv[2], "wb");
+
+	uint32_t              white    = 0xFF;
+
+	int                   rv       = 0;  // assume success
+
+	// allocate buffers
+	blen = ((img.w * img.h) +0x7) >>3;
+	bp = (buf = calloc(blen +1, 1));
+	cp = (cmp = calloc(blen +4, 1));
+
+	// sanity check
+	if (!fh || !buf || !cmp) {
+		printf("! fopen() or malloc() fail.\n");
+		rv = 255;
+		goto bail;
+	}
+
+	// Find white value
+	for (x = 1;  x < img.bpp;  x++)
+		white = (white << 8) | 0xFF ;
+
+	// build bit pattern
+	// create the comment as we go
+	for (pp = img.b,  y = 0;  y < img.h;  y++) {
+		fprintf(fh, "// ");
+		for (x = 0;  x < img.w;  x++) {
+			// read pixel
+			for (pix = 0,  z = 0;  z < img.bpp;  pix = (pix << 8) | *pp++, z++) ;
+			// get bit and draw
+			if (pix < white) {
+				b = (b << 1) | 1;
+				fprintf(fh, "##");
+			} else {
+				b <<= 1;
+				fprintf(fh, "..");
+			}
+			// got byte
+			if ((++bcnt) == 8) {
+				*bp++ = b;
+				tag[b]++;
+				bcnt = (b = 0);
+			}
+		}
+		fprintf(fh, "\n");
+	}
+	fprintf(fh, "\n");
+	// padding
+	if (bcnt) {
+		b <<= (bcnt = 8 - bcnt);
+		*bp++ = b;
+		tag[b]++;
+	}
+	// Kill the compression
+	*bp = ~bp[-1];  // https://youtube.com/clip/Ugkx-JZIr16hETy7hz_H6yIdKPtxVe8C5w_V
+
+	// Byte run length compression
+	// Find a good tag
+	for (x = 0;  tmax && (x < 256);  x++) {
+		if (tag[x] < tmax) {
+			tmax = tag[x];
+			ctag = x;
+		}
+	}
+
+	// compress the data
+	for (bp = buf,  x = 0;  (clen < blen) && (x < blen);  x++) {
+		// need at least 4 the same to be worth it
+		// must compress tag (if it occurs)
+		if ((bp[x] == bp[x+1]) && (bp[x] == bp[x+2]) && (bp[x] == bp[x+3]) || (bp[x] == ctag)) {
+			for (y = 1;  (y < 255) && (bp[x] == bp[x+y]); y++) ;
+			*cp++  = ctag;   // tag
+			*cp++  = y;      // length
+			*cp++  = bp[x];  // byte
+			x     += y -1;
+			clen  += 3;
+		} else {
+			*cp++ = bp[x];
+			clen++;
+		}
+	}
+
+	// create struct
+	fprintf(fh, "#include \"images.h\"\n\n");
+	fprintf(fh, "const image_t  img_%s = { %d, %d, ", name, img.w, img.h);
+
+	if (clen < blen) {  // dump compressed?
+		fprintf(fh, "true, %d, 0x%02X, {  // orig:%d, comp:%.2f%%\n\t", 
+		            clen, ctag, blen, 100.0-((clen*100.0)/blen));
+		for (x = 0;  x < clen;  x++)
+			if (x == clen -1)  fprintf(fh, "0x%02X\n}};\n", cmp[x]) ;
+			else               fprintf(fh, "0x%02X%s", cmp[x], (!((x+1)%16)) ? ",\n\t" : ", ") ;
+
+	} else {  // dump UNcompressed
+		fprintf(fh, "false, %d, 0, {\n\t", blen);
+		for (x = 0;  x < blen;  x++)
+			if (x == blen -1)  fprintf(fh, "0x%02X\n}};\n", buf[x]) ;
+			else               fprintf(fh, "0x%02X%s", buf[x], (!((x+1)%16)) ? ",\n\t" : ", ") ;
+	}
+
+bail:
+	if (fh)   fclose(fh) ;
+	if (buf)  free(buf) ;
+	if (cmp)  free(cmp) ;
+
+	return rv;
+}

+ 79 - 0
wiiec/_image_tool/_convert.sh

@@ -0,0 +1,79 @@
+#!/bin/bash
+
+[ -z $1 ] && {
+	echo "Specify an image"
+	echo "gimp -> export -> c source file -> [x] gunit names"
+	exit 2
+}
+
+echo $*
+
+for N in $* ; do
+
+	[ ! -f $N ] && {
+		echo "!! File missing $N"
+		continue
+	}
+
+	# filename (sans extension)
+	FN=$(basename -- "$N")
+	EXT="${FN##*.}"
+	NAME="${FN%.*}"
+
+	OUTDIR=img_/
+	mkdir -p ${OUTDIR}
+
+	HDR=${OUTDIR}/images.h
+	SRC=${OUTDIR}/images.c
+
+	OUT=${OUTDIR}/img_${NAME}.c
+
+	echo -e "\n¦${N}¦  ==  ¦${NAME}¦  ->  ¦${OUT}¦"
+
+	TESTX=test_${NAME}
+	TESTC=test_${NAME}.c
+
+	# compile name
+	CONV=${NAME}_
+
+	# clean up gimp output
+	sed -e "s/gimp_image/img/g" \
+		-e 's/guint8/unsigned char/g' \
+		-e 's/width/w/g' \
+		-e 's/height/h/g' \
+		-e 's/bytes_per_pixel/bpp/g' \
+		-e 's/pixel_data/b/g' \
+		-e 's/guint/unsigned int/g' \
+		$N \
+		| grep -v ^/ \
+		| grep -v ^$ \
+		> ${CONV}.c
+
+	# append conversion code
+	cat _convert.c >> ${CONV}.c
+
+	# compile & run converter
+	rm -f ${CONV}
+	gcc ${CONV}.c -DIMGTEST -o ${CONV}
+	./${CONV} ${NAME} ${OUT}
+	rm -f ${CONV} ${CONV}.c
+
+	# (create &) update header
+	[[ ! -f ${HDR} ]] && cp _convert_images.h ${HDR}
+	sed -i "/ img_${NAME};/d" ${HDR}
+	sed -i "s#//\[TAG\]#//\[TAG\]\nextern  const image_t  img_${NAME};#" ${HDR}
+
+	# sample FZ code
+	[[ ! -f images.c ]] && cp _convert_images.c ${SRC}
+
+	# test
+	ROOT=${PWD}
+	pushd ${OUTDIR} >/dev/null
+	sed  "s/zzz/${NAME}/" ${ROOT}/_convert_test.c  > ${TESTC}
+	rm -f ${TESTX}
+	gcc  ${TESTC}  ${OUT##*/}  -DIMGTEST  -o ${TESTX}
+	./${TESTX}
+	rm -f ${TESTX} ${TESTC}
+	popd >/dev/null
+
+done

+ 141 - 0
wiiec/_image_tool/_convert_images.c

@@ -0,0 +1,141 @@
+#include  <gui/gui.h>      // GUI (screen/keyboard) API
+
+#include  "images.h"
+
+//----------------------------------------------------------------------------- ----------------------------------------
+static Canvas*         _canvas;
+static uint8_t         _tlx;
+static uint8_t         _tly;
+
+static uint8_t         _x;
+static uint8_t         _y;
+
+static const image_t*  _img;
+
+static bool            _blk;
+static Color           _set;
+static Color           _clr;
+
+//+============================================================================
+static
+void  _showByteSet (const uint8_t b)
+{
+	for (uint8_t m = 0x80;  m;  m >>= 1) {
+		if (b & m)  // plot only SET bits
+			canvas_draw_dot(_canvas, (_tlx +_x), (_tly +_y)) ;
+		if ( ((++_x) == _img->w) && !(_x = 0) && ((++_y) == _img->h) )  break ;
+	}
+}
+
+//+============================================================================
+static
+void  _showByteClr (const uint8_t b)
+{
+	for (uint8_t m = 0x80;  m;  m >>= 1) {
+		if (!(b & m))  // plot only CLR bits
+			canvas_draw_dot(_canvas, (_tlx +_x), (_tly +_y)) ;
+		if ( ((++_x) == _img->w) && !(_x = 0) && ((++_y) == _img->h) )  break ;
+	}
+}
+
+//+============================================================================
+static
+void  _showByteAll (const uint8_t b)
+{
+	for (uint8_t m = 0x80;  m;  m >>= 1) {
+		if ((!!(b & m)) ^ _blk) { // Change colour only when required
+			canvas_set_color(_canvas, ((b & m) ? _set : _clr));
+			_blk = !_blk;
+		}
+		canvas_draw_dot(_canvas, (_tlx +_x), (_tly +_y)) ;
+		if ( ((++_x) == _img->w) && !(_x = 0) && ((++_y) == _img->h) )  break ;
+	}
+}
+
+//+============================================================================
+// available modes are SHOW_SET_BLK - plot image pixels that are  SET in BLACK
+//                     SHOW_XOR     - same as SET_BLACK
+//                     SHOW_SET_WHT - plot image pixels that are  SET in WHITE
+//                     SHOW_CLR_BLK - plot image pixels that are CLEAR in BLACK
+//                     SHOW_CLR_WHT - plot image pixels that are CLEAR in WHITE
+//                     SHOW_ALL     - plot all images pixels as they are
+//                     SHOW_ALL_INV - plot all images pixels inverted
+//
+void  show (Canvas* const  canvas,  const uint8_t tlx,  const uint8_t tly,
+            const image_t* img,     const showMode_t mode)
+{
+	void(*fnShow)(const uint8_t) = NULL;
+
+	const uint8_t*  bp = img->data;
+
+	// code size optimisation
+	switch (mode & SHOW_INV_) {
+		case SHOW_NRM_:
+			_set = ColorBlack;
+			_clr = ColorWhite;
+			break;
+
+		case SHOW_INV_:
+			_set = ColorWhite;
+			_clr = ColorBlack;
+			break;
+
+		case SHOW_BLK_:
+			canvas_set_color(canvas, ColorBlack);
+			break;
+
+		case SHOW_WHT_:
+			canvas_set_color(canvas, ColorWhite);
+			break;
+
+	}
+	switch (mode & SHOW_INV_) {
+		case SHOW_NRM_:
+		case SHOW_INV_:
+			fnShow = _showByteAll;
+			canvas_set_color(canvas, ColorWhite);
+			_blk = 0;
+			break;
+
+		case SHOW_BLK_:
+		case SHOW_WHT_:
+			switch (mode & SHOW_ALL_) {
+				case SHOW_SET_:
+					fnShow = _showByteSet;
+					break;
+				case SHOW_CLR_:
+					fnShow = _showByteClr;
+					break;
+			}
+			break;
+	}
+	furi_check(fnShow);
+
+	// I want nested functions!
+	_canvas = canvas;
+	_img    = img;
+	_tlx    = tlx;
+	_tly    = tly;
+	_x      = 0;
+	_y      = 0;
+
+	// Compressed
+	if (img->c) {
+		for (unsigned int i = 0;  i < img->len;  i++, bp++) {
+			// Compressed data? {tag, length, value}
+			if (*bp == img->tag) {
+				for (uint16_t c = 0;  c < bp[1];  c++)  fnShow(bp[2]) ;
+				bp += 3 -1;
+				i  += 3 -1;
+
+			// Uncompressed byte
+			} else {
+				fnShow(*bp);
+			}
+		}
+
+	// Not compressed
+	} else {
+		for (unsigned int i = 0;  i < img->len;  i++, bp++)  fnShow(*bp) ;
+	}
+}

+ 53 - 0
wiiec/_image_tool/_convert_images.h

@@ -0,0 +1,53 @@
+#ifndef  IMAGES_H_
+#define  IMAGES_H_
+
+#include <stdint.h>
+#include <stdbool.h>
+
+//----------------------------------------------------------------------------- ----------------------------------------
+typedef
+	enum showMode {
+		// {INV:--:WHT:BLK::--:--:CLR:SET}
+		SHOW_SET_    = 0x01,
+		SHOW_CLR_    = 0x02,
+		SHOW_ALL_    = SHOW_SET_ | SHOW_CLR_,
+
+		SHOW_BLK_    = 0x10,
+		SHOW_WHT_    = 0x20,
+		SHOW_NRM_    = 0x00,
+		SHOW_INV_    = SHOW_BLK_ | SHOW_WHT_,
+
+		SHOW_SET_BLK = SHOW_SET_ | SHOW_BLK_,
+		SHOW_SET_WHT = SHOW_SET_ | SHOW_WHT_,
+
+		SHOW_CLR_BLK = SHOW_CLR_ | SHOW_BLK_,
+		SHOW_CLR_WHT = SHOW_CLR_ | SHOW_WHT_,
+
+		SHOW_ALL     = SHOW_ALL_ | SHOW_NRM_,
+		SHOW_ALL_INV = SHOW_ALL_ | SHOW_INV_,
+	}
+showMode_t;
+
+//----------------------------------------------------------------------------- ----------------------------------------
+typedef
+	struct image {
+		uint8_t   w;       // width
+		uint8_t   h;       // height
+		bool      c;       // compressed?
+		uint16_t  len;     // image data length
+		uint8_t   tag;     // rle tag
+		uint8_t   data[];  // image data
+	} 
+image_t;
+
+//----------------------------------------------------------------------------- ----------------------------------------
+//[TAG]
+
+//----------------------------------------------------------------------------- ----------------------------------------
+#ifndef IMGTEST
+#	include <gui/gui.h>
+	void  show (Canvas* const  canvas,  const uint8_t tlx,  const uint8_t tly,
+	            const image_t* img,     const showMode_t mode) ;
+#endif
+
+#endif //IMAGES_H_

+ 59 - 0
wiiec/_image_tool/_convert_test.c

@@ -0,0 +1,59 @@
+#include  <stdint.h>
+#include  <stdio.h>
+
+#include  "images.h"
+
+//-----------------------------------------------------------------------------
+// This will be the plot function out of your graphics library
+//
+#define  PLOT(x,y,c) do { \
+	printf("%s", (c ? "#" : "."));       \
+	if (x == img->w -1)  printf("\n") ;  \
+}while(0)
+
+//+============================================================================
+// The pain we endure to avoid code duplication cleanly
+//
+#define  PLOTBYTE(b)  do { \
+	for (uint8_t m = 0x80;  m;  m>>=1) {                                    \
+		PLOT(x,y, (b & m));                                                 \
+		if ( ((++x) == img->w) && !(x = 0) && ((++y) == img->h) )  break ;  \
+	}                                                                       \
+}while(0)
+
+void  show (const image_t*  img)
+{
+	// Some variables
+	const uint8_t*  bp = img->data;
+	unsigned int    x  = 0;
+	unsigned int    y  = 0;
+
+	// Compressed
+	if (img->c) {
+		for (unsigned int i = 0;  i < img->len;  i++, bp++) {
+			// Compressed data? {tag, length, value}
+			if (*bp == img->tag) {
+				for (uint16_t c = 0;  c < bp[1];  c++)  PLOTBYTE(bp[2]) ;
+				bp += 3 -1;
+				i  += 3 -1;
+
+			// Uncompressed byte
+			} else {
+				PLOTBYTE(*bp);
+			}
+		}
+
+	// Not compressed
+	} else {
+		for (unsigned int i = 0;  i < img->len;  i++, bp++)  PLOTBYTE(*bp) ;
+	}
+}
+
+#undef  PLOTBYTE
+
+//+============================================================================
+int  main (void)
+{
+	show(&img_zzz);
+	return 0;
+}

BIN
wiiec/_images/CLASSIC.png


BIN
wiiec/_images/CLASSIC_N.png


BIN
wiiec/_images/DEBUG.png


BIN
wiiec/_images/DUMP.png


BIN
wiiec/_images/GIMP/Nunchuck_acc.xcf


BIN
wiiec/_images/GIMP/RIP.xcf


BIN
wiiec/_images/GIMP/Wiring.xcf


BIN
wiiec/_images/GIMP/classic.xcf


BIN
wiiec/_images/GIMP/csLogo.xcf


BIN
wiiec/_images/GIMP/fonts.xcf


BIN
wiiec/_images/GIMP/frame.xcf


BIN
wiiec/_images/GIMP/port.xcf


BIN
wiiec/_images/GIMP/social.xcf


BIN
wiiec/_images/NUNCHUCK.png


BIN
wiiec/_images/NUNCHUCK_acc.png


BIN
wiiec/_images/NUNCHUCK_anal.png


BIN
wiiec/_images/NUNCHUCK_cal.gif


BIN
wiiec/_images/NUNCHUCK_cal.png


BIN
wiiec/_images/Nunchucky.png


BIN
wiiec/_images/RIP.png


BIN
wiiec/_images/SPLASH.png


BIN
wiiec/_images/WAIT.png


BIN
wiiec/_images/WiiChuck.png


BIN
wiiec/_images/Wiring.png


BIN
wiiec/_images/plug.png


BIN
wiiec/_images/social.png


+ 36 - 0
wiiec/application.fam

@@ -0,0 +1,36 @@
+# qv. https://github.com/flipperdevices/flipperzero-firmware/blob/dev/documentation/AppManifests.md
+
+App(
+	# --- App Info
+	appid="wii_ec_anal",
+	name="Wii EC Analyser",
+
+	# --- Entry point
+	apptype=FlipperAppType.EXTERNAL,
+	entry_point="wii_ec_anal",
+
+	# --- Interaction
+	cdefines=["APP_WII_EC_ANAL"],
+	requires=[
+		"gui",
+	],
+
+#	conflicts="",
+#	sdk_headers="",
+
+	# --- Run-time info
+	stack_size=2 * 1024,
+	order=20,
+
+	# --- FAP details
+	sources=["wii_*.c", "gfx/*.c"],
+
+#	fap_weburl="https://github.com/csBlueChip/FlipperZero_plugin_WiiChuck/",
+#	fap_author="BlueChip",
+
+#	fap_description="Wii Extension Controller Protocol Analyser",
+#	fap_version=(1,0),
+
+	fap_icon="WiiEC.png",
+	fap_category="Cyborg Systems",
+)

+ 70 - 0
wiiec/bc_logging.h

@@ -0,0 +1,70 @@
+#ifndef  BC_LOGGING_H_
+#define  BC_LOGGING_H_
+
+#include <furi.h>
+#include "err.h"  // appName
+
+//!  WARNING: There is a bug in Furi such that if you crank LOG_LEVEL up to 6=TRACE
+//!           AND you have menu->settings->system->logLevel = trace
+//!           THEN this program will cause the FZ to crash when the plugin exits!
+#define  LOG_LEVEL  4
+
+//----------------------------------------------------------------------------- ----------------------------------------
+// The FlipperZero Settings->System menu allows you to set the logging level at RUN-time
+// ... LOG_LEVEL lets you limit it at COMPILE-time
+//
+// FURI logging has 6 levels (numbered 1 thru 6}
+//    1.  None
+//    2.  Errors       FURI_LOG_E
+//    3.  Warnings     FURI_LOG_W
+//    4.  Information  FURI_LOG_I
+//    5.  Debug        FURI_LOG_D
+//    6.  Trace        FURI_LOG_T
+//
+// --> furi/core/log.h
+//
+
+// The FlipperZero Settings->System menu allows you to set the logging level at RUN-time
+// This lets you limit it at COMPILE-time
+#ifndef LOG_LEVEL
+#	define  LOG_LEVEL 6  // default = full logging
+#endif
+
+#if (LOG_LEVEL < 2)
+#	undef   FURI_LOG_E
+#	define  FURI_LOG_E(tag, fmt, ...)
+#endif
+
+#if (LOG_LEVEL < 3)
+#	undef   FURI_LOG_W
+#	define  FURI_LOG_W(tag, fmt, ...)
+#endif
+
+#if (LOG_LEVEL < 4)
+#	undef   FURI_LOG_I
+#	define  FURI_LOG_I(tag, fmt, ...)
+#endif
+
+#if (LOG_LEVEL < 5)
+#	undef   FURI_LOG_D
+#	define  FURI_LOG_D(tag, fmt, ...)
+#endif
+
+#if (LOG_LEVEL < 6)
+#	undef   FURI_LOG_T
+#	define  FURI_LOG_T(tag, fmt, ...)
+#endif
+
+//----------------------------------------------------------
+// Logging helper macros
+//
+#define  ERROR(fmt, ...)  FURI_LOG_E(appName, fmt __VA_OPT__(,) __VA_ARGS__)
+#define  WARN(fmt, ...)   FURI_LOG_W(appName, fmt __VA_OPT__(,) __VA_ARGS__)
+#define  INFO(fmt, ...)   FURI_LOG_I(appName, fmt __VA_OPT__(,) __VA_ARGS__)
+#define  DEBUG(fmt, ...)  FURI_LOG_D(appName, fmt __VA_OPT__(,) __VA_ARGS__)
+#define  TRACE(fmt, ...)  FURI_LOG_T(appName, fmt __VA_OPT__(,) __VA_ARGS__)
+
+#define  ENTER  TRACE("(+) %s", __func__)
+#define  LEAVE  TRACE("(-) %s", __func__)
+
+#endif //BC_LOGGING_H_

+ 69 - 0
wiiec/err.h

@@ -0,0 +1,69 @@
+// Avoid circular/nested/mulitple inclusion
+#ifndef  ERR_H_
+#define  ERR_H_
+
+//----------------------------------------------------------------------------- ----------------------------------------
+// Application name
+//
+static const char* const  appName = "Wii_i2c";  //$ Name used in log files
+
+//----------------------------------------------------------------------------- ----------------------------------------
+// Error codes and messages
+//
+
+// You should only ever (need to) edit this list
+// ...Watch out for extraneous whitespace after the terminating backslashes
+#define  FOREACH_ES(esPrial) \
+	/* The first line MUST define 'ERR_OK = 0' */ \
+	esPrial( 0, ERR_OK             , "OK (no error)") \
+\
+	esPrial( 1, ERR_MALLOC_QUEUE   , "malloc() fail - queue") \
+	esPrial( 2, ERR_MALLOC_STATE   , "malloc() fail - state") \
+	esPrial( 3, ERR_MALLOC_TEXT    , "malloc() fail - text") \
+	esPrial( 4, ERR_MALLOC_VIEW    , "malloc() fail - viewport") \
+	esPrial( 5, ERR_NO_MUTEX       , "Cannot create mutex") \
+	esPrial( 6, ERR_NO_GUI         , "Cannot open GUI") \
+	esPrial( 7, ERR_NO_TIMER       , "Cannot create timer") \
+	esPrial( 8, ERR_NO_NOTIFY      , "Cannot acquire notifications handle") \
+\
+	esPrial(10, ERR_MUTEX_BLOCK    , "Mutex block failed") \
+	esPrial(11, ERR_MUTEX_RELEASE  , "Mutex release failed") \
+\
+	esPrial(20, ERR_QUEUE_RTOS     , "queue - Undefined RTOS error") \
+	esPrial(21, DEBUG_QUEUE_TIMEOUT, "queue - Timeout") \
+	esPrial(22, ERR_QUEUE_RESOURCE , "queue - Resource not available") \
+	esPrial(23, ERR_QUEUE_BADPRM   , "queue - Bad parameter") \
+	esPrial(24, ERR_QUEUE_NOMEM    , "queue - Out of memory") \
+	esPrial(25, ERR_QUEUE_ISR      , "queue - Banned in ISR") \
+	esPrial(26, ERR_QUEUE_UNK      , "queue - Unknown") \
+\
+	esPrial(30, WARN_SCAN_START    , "Scan - Already started") \
+	esPrial(31, WARN_SCAN_STOP     , "Scan - Already stopped") \
+	esPrial(32, ERR_TIMER_START    , "Scan - Cannot start timer") \
+	esPrial(33, ERR_TIMER_STOP     , "Scan - Cannot stop timer") \
+//[EOT]
+
+// Declare list extraction macros
+#define  ES_ENUM(num, ename, string)    ename = num,
+#define  ES_STRING(num, ename, string)  string"\r\n",
+
+// Build the enum
+typedef
+	enum err  { FOREACH_ES(ES_ENUM) }
+err_t ;
+
+// You need to '#define ERR_C_' in precisely ONE source file
+#ifdef ERR_C_
+	// Build the string list
+	const char* const  wii_errs[] = { FOREACH_ES(ES_STRING) };
+#else
+	// Give access to string list
+	extern  const char* const  wii_errs[];
+#endif
+
+// This is a header file, clean up
+#undef  ES_ENUM
+#undef  ES_STRING
+#undef  FOREACH_ES
+
+#endif // ERR_H_

+ 141 - 0
wiiec/gfx/images.c

@@ -0,0 +1,141 @@
+#include  <gui/gui.h>      // GUI (screen/keyboard) API
+
+#include  "images.h"
+
+//----------------------------------------------------------------------------- ----------------------------------------
+static Canvas*         _canvas;
+static uint8_t         _tlx;
+static uint8_t         _tly;
+
+static uint8_t         _x;
+static uint8_t         _y;
+
+static const image_t*  _img;
+
+static bool            _blk;
+static Color           _set;
+static Color           _clr;
+
+//+============================================================================
+static
+void  _showByteSet (const uint8_t b)
+{
+	for (uint8_t m = 0x80;  m;  m >>= 1) {
+		if (b & m)  // plot only SET bits
+			canvas_draw_dot(_canvas, (_tlx +_x), (_tly +_y)) ;
+		if ( ((++_x) == _img->w) && !(_x = 0) && ((++_y) == _img->h) )  break ;
+	}
+}
+
+//+============================================================================
+static
+void  _showByteClr (const uint8_t b)
+{
+	for (uint8_t m = 0x80;  m;  m >>= 1) {
+		if (!(b & m))  // plot only CLR bits
+			canvas_draw_dot(_canvas, (_tlx +_x), (_tly +_y)) ;
+		if ( ((++_x) == _img->w) && !(_x = 0) && ((++_y) == _img->h) )  break ;
+	}
+}
+
+//+============================================================================
+static
+void  _showByteAll (const uint8_t b)
+{
+	for (uint8_t m = 0x80;  m;  m >>= 1) {
+		if ((!!(b & m)) ^ _blk) { // Change colour only when required
+			canvas_set_color(_canvas, ((b & m) ? _set : _clr));
+			_blk = !_blk;
+		}
+		canvas_draw_dot(_canvas, (_tlx +_x), (_tly +_y)) ;
+		if ( ((++_x) == _img->w) && !(_x = 0) && ((++_y) == _img->h) )  break ;
+	}
+}
+
+//+============================================================================
+// available modes are SHOW_SET_BLK - plot image pixels that are  SET in BLACK
+//                     SHOW_XOR     - same as SET_BLACK
+//                     SHOW_SET_WHT - plot image pixels that are  SET in WHITE
+//                     SHOW_CLR_BLK - plot image pixels that are CLEAR in BLACK
+//                     SHOW_CLR_WHT - plot image pixels that are CLEAR in WHITE
+//                     SHOW_ALL     - plot all images pixels as they are
+//                     SHOW_ALL_INV - plot all images pixels inverted
+//
+void  show (Canvas* const  canvas,  const uint8_t tlx,  const uint8_t tly,
+            const image_t* img,     const showMode_t mode)
+{
+	void(*fnShow)(const uint8_t) = NULL;
+
+	const uint8_t*  bp = img->data;
+
+	// code size optimisation
+	switch (mode & SHOW_INV_) {
+		case SHOW_NRM_:
+			_set = ColorBlack;
+			_clr = ColorWhite;
+			break;
+
+		case SHOW_INV_:
+			_set = ColorWhite;
+			_clr = ColorBlack;
+			break;
+
+		case SHOW_BLK_:
+			canvas_set_color(canvas, ColorBlack);
+			break;
+
+		case SHOW_WHT_:
+			canvas_set_color(canvas, ColorWhite);
+			break;
+
+	}
+	switch (mode & SHOW_INV_) {
+		case SHOW_NRM_:
+		case SHOW_INV_:
+			fnShow = _showByteAll;
+			canvas_set_color(canvas, ColorWhite);
+			_blk = 0;
+			break;
+
+		case SHOW_BLK_:
+		case SHOW_WHT_:
+			switch (mode & SHOW_ALL_) {
+				case SHOW_SET_:
+					fnShow = _showByteSet;
+					break;
+				case SHOW_CLR_:
+					fnShow = _showByteClr;
+					break;
+			}
+			break;
+	}
+	furi_check(fnShow);
+
+	// I want nested functions!
+	_canvas = canvas;
+	_img    = img;
+	_tlx    = tlx;
+	_tly    = tly;
+	_x      = 0;
+	_y      = 0;
+
+	// Compressed
+	if (img->c) {
+		for (unsigned int i = 0;  i < img->len;  i++, bp++) {
+			// Compressed data? {tag, length, value}
+			if (*bp == img->tag) {
+				for (uint16_t c = 0;  c < bp[1];  c++)  fnShow(bp[2]) ;
+				bp += 3 -1;
+				i  += 3 -1;
+
+			// Uncompressed byte
+			} else {
+				fnShow(*bp);
+			}
+		}
+
+	// Not compressed
+	} else {
+		for (unsigned int i = 0;  i < img->len;  i++, bp++)  fnShow(*bp) ;
+	}
+}

+ 134 - 0
wiiec/gfx/images.h

@@ -0,0 +1,134 @@
+#ifndef  IMAGES_H_
+#define  IMAGES_H_
+
+#include <stdint.h>
+#include <stdbool.h>
+
+//----------------------------------------------------------------------------- ----------------------------------------
+typedef
+	enum showMode {
+		// {INV:--:WHT:BLK::--:--:CLR:SET} 
+		SHOW_SET_    = 0x01,
+		SHOW_CLR_    = 0x02,
+		SHOW_ALL_    = SHOW_SET_ | SHOW_CLR_,
+
+		SHOW_BLK_    = 0x10,
+		SHOW_WHT_    = 0x20,
+		SHOW_NRM_    = 0x00,
+		SHOW_INV_    = SHOW_BLK_ | SHOW_WHT_,
+
+		SHOW_SET_BLK = SHOW_SET_ | SHOW_BLK_,
+		SHOW_SET_WHT = SHOW_SET_ | SHOW_WHT_,
+
+		SHOW_CLR_BLK = SHOW_CLR_ | SHOW_BLK_,
+		SHOW_CLR_WHT = SHOW_CLR_ | SHOW_WHT_,
+
+		SHOW_ALL     = SHOW_ALL_ | SHOW_NRM_,
+		SHOW_ALL_INV = SHOW_ALL_ | SHOW_INV_,
+	}
+showMode_t;
+
+//----------------------------------------------------------------------------- ----------------------------------------
+typedef
+	struct image {
+		uint8_t   w;       // width
+		uint8_t   h;       // height
+		bool      c;       // compressed?
+		uint16_t  len;     // image data length
+		uint8_t   tag;     // rle tag
+		uint8_t   data[];  // image data
+	} 
+image_t;
+
+//----------------------------------------------------------------------------- ----------------------------------------
+//[TAG]
+extern  const image_t  img_csLogo_Small;
+extern  const image_t  img_3x5_v;
+extern  const image_t  img_3x5_9;
+extern  const image_t  img_3x5_8;
+extern  const image_t  img_3x5_7;
+extern  const image_t  img_3x5_6;
+extern  const image_t  img_3x5_5;
+extern  const image_t  img_3x5_4;
+extern  const image_t  img_3x5_3;
+extern  const image_t  img_3x5_2;
+extern  const image_t  img_3x5_1;
+extern  const image_t  img_3x5_0;
+extern  const image_t  img_key_Ui;
+extern  const image_t  img_key_OKi;
+extern  const image_t  img_RIP;
+extern  const image_t  img_cc_trg_R4;
+extern  const image_t  img_cc_trg_R3;
+extern  const image_t  img_cc_trg_R2;
+extern  const image_t  img_cc_trg_R1;
+extern  const image_t  img_cc_trg_L4;
+extern  const image_t  img_cc_trg_L3;
+extern  const image_t  img_cc_trg_L2;
+extern  const image_t  img_cc_trg_L1;
+extern  const image_t  img_cc_Joy;
+extern  const image_t  img_cc_Main;
+extern  const image_t  img_cc_Cable;
+extern  const image_t  img_key_Back;
+extern  const image_t  img_key_OK;
+extern  const image_t  img_6x8_Z;
+extern  const image_t  img_6x8_Y;
+extern  const image_t  img_6x8_X;
+extern  const image_t  img_key_U;
+extern  const image_t  img_key_D;
+extern  const image_t  img_csLogo_FULL;
+extern  const image_t  img_6x8_7;
+extern  const image_t  img_key_R;
+extern  const image_t  img_key_L;
+extern  const image_t  img_5x7_7;
+extern  const image_t  img_5x7_F;
+extern  const image_t  img_5x7_E;
+extern  const image_t  img_5x7_D;
+extern  const image_t  img_5x7_C;
+extern  const image_t  img_5x7_B;
+extern  const image_t  img_5x7_A;
+extern  const image_t  img_5x7_9;
+extern  const image_t  img_5x7_8;
+extern  const image_t  img_5x7_6;
+extern  const image_t  img_5x7_5;
+extern  const image_t  img_5x7_4;
+extern  const image_t  img_5x7_3;
+extern  const image_t  img_5x7_2;
+extern  const image_t  img_5x7_1;
+extern  const image_t  img_5x7_0;
+extern  const image_t  img_6x8_v;
+extern  const image_t  img_6x8_n;
+extern  const image_t  img_6x8_G;
+extern  const image_t  img_6x8_F;
+extern  const image_t  img_6x8_E;
+extern  const image_t  img_6x8_d;
+extern  const image_t  img_6x8_C;
+extern  const image_t  img_6x8_B;
+extern  const image_t  img_6x8_A;
+extern  const image_t  img_6x8_9;
+extern  const image_t  img_6x8_8;
+extern  const image_t  img_6x8_6;
+extern  const image_t  img_6x8_5;
+extern  const image_t  img_6x8_4;
+extern  const image_t  img_6x8_3;
+extern  const image_t  img_6x8_2;
+extern  const image_t  img_6x8_1;
+extern  const image_t  img_6x8_0;
+extern  const image_t  img_ecp_SDA;
+extern  const image_t  img_ecp_SCL;
+extern  const image_t  img_ecp_port;
+extern  const image_t  img_cc_pad_UD1;
+extern  const image_t  img_cc_pad_LR1;
+extern  const image_t  img_cc_btn_Y1;
+extern  const image_t  img_cc_btn_X1;
+extern  const image_t  img_cc_btn_B1;
+extern  const image_t  img_cc_btn_A1;
+extern  const image_t  img_6x8_D;
+
+//----------------------------------------------------------------------------- ----------------------------------------
+#ifndef IMGTEST
+#	include <gui/gui.h>
+	void  show (Canvas* const  canvas,  const uint8_t tlx,  const uint8_t tly,
+	            const image_t* img,     const showMode_t mode) ;
+#endif
+
+#endif //IMAGES_H_

+ 11 - 0
wiiec/gfx/img_3x5_0.c

@@ -0,0 +1,11 @@
+// ######
+// ##..##
+// ##..##
+// ##..##
+// ######
+
+#include "images.h"
+
+const image_t  img_3x5_0 = { 3, 5, false, 2, 0, {
+	0xF6, 0xDE
+}};

+ 11 - 0
wiiec/gfx/img_3x5_1.c

@@ -0,0 +1,11 @@
+// ####..
+// ..##..
+// ..##..
+// ..##..
+// ######
+
+#include "images.h"
+
+const image_t  img_3x5_1 = { 3, 5, false, 2, 0, {
+	0xC9, 0x2E
+}};

+ 11 - 0
wiiec/gfx/img_3x5_2.c

@@ -0,0 +1,11 @@
+// ######
+// ....##
+// ######
+// ##....
+// ######
+
+#include "images.h"
+
+const image_t  img_3x5_2 = { 3, 5, false, 2, 0, {
+	0xE7, 0xCE
+}};

+ 11 - 0
wiiec/gfx/img_3x5_3.c

@@ -0,0 +1,11 @@
+// ######
+// ....##
+// ..####
+// ....##
+// ######
+
+#include "images.h"
+
+const image_t  img_3x5_3 = { 3, 5, false, 2, 0, {
+	0xE5, 0x9E
+}};

+ 11 - 0
wiiec/gfx/img_3x5_4.c

@@ -0,0 +1,11 @@
+// ##....
+// ##..##
+// ######
+// ....##
+// ....##
+
+#include "images.h"
+
+const image_t  img_3x5_4 = { 3, 5, false, 2, 0, {
+	0x97, 0x92
+}};

+ 11 - 0
wiiec/gfx/img_3x5_5.c

@@ -0,0 +1,11 @@
+// ######
+// ##....
+// ######
+// ....##
+// ######
+
+#include "images.h"
+
+const image_t  img_3x5_5 = { 3, 5, false, 2, 0, {
+	0xF3, 0x9E
+}};

+ 11 - 0
wiiec/gfx/img_3x5_6.c

@@ -0,0 +1,11 @@
+// ####..
+// ##....
+// ######
+// ##..##
+// ######
+
+#include "images.h"
+
+const image_t  img_3x5_6 = { 3, 5, false, 2, 0, {
+	0xD3, 0xDE
+}};

+ 11 - 0
wiiec/gfx/img_3x5_7.c

@@ -0,0 +1,11 @@
+// ######
+// ....##
+// ..##..
+// ..##..
+// ..##..
+
+#include "images.h"
+
+const image_t  img_3x5_7 = { 3, 5, false, 2, 0, {
+	0xE5, 0x24
+}};

+ 11 - 0
wiiec/gfx/img_3x5_8.c

@@ -0,0 +1,11 @@
+// ######
+// ##..##
+// ######
+// ##..##
+// ######
+
+#include "images.h"
+
+const image_t  img_3x5_8 = { 3, 5, false, 2, 0, {
+	0xF7, 0xDE
+}};

+ 11 - 0
wiiec/gfx/img_3x5_9.c

@@ -0,0 +1,11 @@
+// ######
+// ##..##
+// ######
+// ....##
+// ..####
+
+#include "images.h"
+
+const image_t  img_3x5_9 = { 3, 5, false, 2, 0, {
+	0xF7, 0x96
+}};

+ 11 - 0
wiiec/gfx/img_3x5_v.c

@@ -0,0 +1,11 @@
+// ......
+// ......
+// ##..##
+// ##..##
+// ..##..
+
+#include "images.h"
+
+const image_t  img_3x5_v = { 3, 5, false, 2, 0, {
+	0x02, 0xD4
+}};

+ 13 - 0
wiiec/gfx/img_5x7_0.c

@@ -0,0 +1,13 @@
+// ..######..
+// ##......##
+// ##....####
+// ##..##..##
+// ####....##
+// ##......##
+// ..######..
+
+#include "images.h"
+
+const image_t  img_5x7_0 = { 5, 7, false, 5, 0, {
+	0x74, 0x67, 0x5C, 0xC5, 0xC0
+}};

+ 13 - 0
wiiec/gfx/img_5x7_1.c

@@ -0,0 +1,13 @@
+// ..####....
+// ##..##....
+// ....##....
+// ....##....
+// ....##....
+// ....##....
+// ##########
+
+#include "images.h"
+
+const image_t  img_5x7_1 = { 5, 7, false, 5, 0, {
+	0x65, 0x08, 0x42, 0x13, 0xE0
+}};

+ 13 - 0
wiiec/gfx/img_5x7_2.c

@@ -0,0 +1,13 @@
+// ..######..
+// ##......##
+// ........##
+// ......##..
+// ....##....
+// ..##......
+// ##########
+
+#include "images.h"
+
+const image_t  img_5x7_2 = { 5, 7, false, 5, 0, {
+	0x74, 0x42, 0x22, 0x23, 0xE0
+}};

+ 13 - 0
wiiec/gfx/img_5x7_3.c

@@ -0,0 +1,13 @@
+// ..######..
+// ##......##
+// ........##
+// ....####..
+// ........##
+// ##......##
+// ..######..
+
+#include "images.h"
+
+const image_t  img_5x7_3 = { 5, 7, false, 5, 0, {
+	0x74, 0x42, 0x60, 0xC5, 0xC0
+}};

+ 13 - 0
wiiec/gfx/img_5x7_4.c

@@ -0,0 +1,13 @@
+// ##........
+// ##........
+// ##....##..
+// ##....##..
+// ##########
+// ......##..
+// ......##..
+
+#include "images.h"
+
+const image_t  img_5x7_4 = { 5, 7, false, 5, 0, {
+	0x84, 0x25, 0x2F, 0x88, 0x40
+}};

+ 13 - 0
wiiec/gfx/img_5x7_5.c

@@ -0,0 +1,13 @@
+// ##########
+// ##........
+// ##........
+// ########..
+// ........##
+// ........##
+// ########..
+
+#include "images.h"
+
+const image_t  img_5x7_5 = { 5, 7, false, 5, 0, {
+	0xFC, 0x21, 0xE0, 0x87, 0xC0
+}};

+ 13 - 0
wiiec/gfx/img_5x7_6.c

@@ -0,0 +1,13 @@
+// ..######..
+// ##........
+// ##........
+// ########..
+// ##......##
+// ##......##
+// ..######..
+
+#include "images.h"
+
+const image_t  img_5x7_6 = { 5, 7, false, 5, 0, {
+	0x74, 0x21, 0xE8, 0xC5, 0xC0
+}};

+ 13 - 0
wiiec/gfx/img_5x7_7.c

@@ -0,0 +1,13 @@
+// ##########
+// ........##
+// ......##..
+// ......##..
+// ....##....
+// ....##....
+// ....##....
+
+#include "images.h"
+
+const image_t  img_5x7_7 = { 5, 7, false, 5, 0, {
+	0xF8, 0x44, 0x22, 0x10, 0x80
+}};

+ 13 - 0
wiiec/gfx/img_5x7_8.c

@@ -0,0 +1,13 @@
+// ..######..
+// ##......##
+// ##......##
+// ..######..
+// ##......##
+// ##......##
+// ..######..
+
+#include "images.h"
+
+const image_t  img_5x7_8 = { 5, 7, false, 5, 0, {
+	0x74, 0x62, 0xE8, 0xC5, 0xC0
+}};

+ 13 - 0
wiiec/gfx/img_5x7_9.c

@@ -0,0 +1,13 @@
+// ..######..
+// ##......##
+// ##......##
+// ..########
+// ........##
+// ........##
+// ..######..
+
+#include "images.h"
+
+const image_t  img_5x7_9 = { 5, 7, false, 5, 0, {
+	0x74, 0x62, 0xF0, 0x85, 0xC0
+}};

+ 13 - 0
wiiec/gfx/img_5x7_A.c

@@ -0,0 +1,13 @@
+// ..######..
+// ##......##
+// ##......##
+// ##########
+// ##......##
+// ##......##
+// ##......##
+
+#include "images.h"
+
+const image_t  img_5x7_A = { 5, 7, false, 5, 0, {
+	0x74, 0x63, 0xF8, 0xC6, 0x20
+}};

+ 13 - 0
wiiec/gfx/img_5x7_B.c

@@ -0,0 +1,13 @@
+// ########..
+// ##......##
+// ##......##
+// ##..####..
+// ##......##
+// ##......##
+// ########..
+
+#include "images.h"
+
+const image_t  img_5x7_B = { 5, 7, false, 5, 0, {
+	0xF4, 0x63, 0x68, 0xC7, 0xC0
+}};

+ 13 - 0
wiiec/gfx/img_5x7_C.c

@@ -0,0 +1,13 @@
+// ..######..
+// ##......##
+// ##........
+// ##........
+// ##........
+// ##......##
+// ..######..
+
+#include "images.h"
+
+const image_t  img_5x7_C = { 5, 7, false, 5, 0, {
+	0x74, 0x61, 0x08, 0x45, 0xC0
+}};

+ 13 - 0
wiiec/gfx/img_5x7_D.c

@@ -0,0 +1,13 @@
+// ..######..
+// ##..##..##
+// ....##..##
+// ....##..##
+// ....##..##
+// ##..##..##
+// ..######..
+
+#include "images.h"
+
+const image_t  img_5x7_D = { 5, 7, false, 5, 0, {
+	0x75, 0x4A, 0x52, 0xD5, 0xC0
+}};

+ 13 - 0
wiiec/gfx/img_5x7_E.c

@@ -0,0 +1,13 @@
+// ##########
+// ##........
+// ##........
+// ######....
+// ##........
+// ##........
+// ##########
+
+#include "images.h"
+
+const image_t  img_5x7_E = { 5, 7, false, 5, 0, {
+	0xFC, 0x21, 0xC8, 0x43, 0xE0
+}};

+ 13 - 0
wiiec/gfx/img_5x7_F.c

@@ -0,0 +1,13 @@
+// ##########
+// ##........
+// ##........
+// ######....
+// ##........
+// ##........
+// ##........
+
+#include "images.h"
+
+const image_t  img_5x7_F = { 5, 7, false, 5, 0, {
+	0xFC, 0x21, 0xC8, 0x42, 0x00
+}};

+ 14 - 0
wiiec/gfx/img_6x8_0.c

@@ -0,0 +1,14 @@
+// ..########..
+// ############
+// ####....####
+// ####....####
+// ####....####
+// ####....####
+// ############
+// ..########..
+
+#include "images.h"
+
+const image_t  img_6x8_0 = { 6, 8, false, 6, 0, {
+	0x7B, 0xFC, 0xF3, 0xCF, 0x3F, 0xDE
+}};

+ 14 - 0
wiiec/gfx/img_6x8_1.c

@@ -0,0 +1,14 @@
+// ..######....
+// ########....
+// ....####....
+// ....####....
+// ....####....
+// ....####....
+// ############
+// ############
+
+#include "images.h"
+
+const image_t  img_6x8_1 = { 6, 8, false, 6, 0, {
+	0x73, 0xC3, 0x0C, 0x30, 0xCF, 0xFF
+}};

+ 14 - 0
wiiec/gfx/img_6x8_2.c

@@ -0,0 +1,14 @@
+// ..########..
+// ############
+// ........####
+// ......######
+// ....####....
+// ..####......
+// ############
+// ############
+
+#include "images.h"
+
+const image_t  img_6x8_2 = { 6, 8, false, 6, 0, {
+	0x7B, 0xF0, 0xC7, 0x31, 0x8F, 0xFF
+}};

+ 14 - 0
wiiec/gfx/img_6x8_3.c

@@ -0,0 +1,14 @@
+// ..########..
+// ############
+// ........####
+// ....########
+// ....########
+// ........####
+// ############
+// ..########..
+
+#include "images.h"
+
+const image_t  img_6x8_3 = { 6, 8, false, 6, 0, {
+	0x7B, 0xF0, 0xCF, 0x3C, 0x3F, 0xDE
+}};

+ 14 - 0
wiiec/gfx/img_6x8_4.c

@@ -0,0 +1,14 @@
+// ####........
+// ####........
+// ####..####..
+// ####..####..
+// ############
+// ############
+// ......####..
+// ......####..
+
+#include "images.h"
+
+const image_t  img_6x8_4 = { 6, 8, false, 6, 0, {
+	0xC3, 0x0D, 0xB6, 0xFF, 0xF1, 0x86
+}};

+ 14 - 0
wiiec/gfx/img_6x8_5.c

@@ -0,0 +1,14 @@
+// ############
+// ############
+// ####........
+// ##########..
+// ############
+// ........####
+// ############
+// ##########..
+
+#include "images.h"
+
+const image_t  img_6x8_5 = { 6, 8, false, 6, 0, {
+	0xFF, 0xFC, 0x3E, 0xFC, 0x3F, 0xFE
+}};

+ 14 - 0
wiiec/gfx/img_6x8_6.c

@@ -0,0 +1,14 @@
+// ..########..
+// ##########..
+// ####........
+// ##########..
+// ############
+// ####....####
+// ############
+// ..########..
+
+#include "images.h"
+
+const image_t  img_6x8_6 = { 6, 8, false, 6, 0, {
+	0x7B, 0xEC, 0x3E, 0xFF, 0x3F, 0xDE
+}};

+ 14 - 0
wiiec/gfx/img_6x8_7.c

@@ -0,0 +1,14 @@
+// ############
+// ############
+// ........####
+// ......####..
+// ......####..
+// ....####....
+// ....####....
+// ....####....
+
+#include "images.h"
+
+const image_t  img_6x8_7 = { 6, 8, false, 6, 0, {
+	0xFF, 0xF0, 0xC6, 0x18, 0xC3, 0x0C
+}};

+ 14 - 0
wiiec/gfx/img_6x8_8.c

@@ -0,0 +1,14 @@
+// ..########..
+// ############
+// ####....####
+// ..########..
+// ############
+// ####....####
+// ############
+// ..########..
+
+#include "images.h"
+
+const image_t  img_6x8_8 = { 6, 8, false, 6, 0, {
+	0x7B, 0xFC, 0xDE, 0xFF, 0x3F, 0xDE
+}};

+ 14 - 0
wiiec/gfx/img_6x8_9.c

@@ -0,0 +1,14 @@
+// ..########..
+// ############
+// ####....####
+// ############
+// ..##########
+// ........####
+// ..##########
+// ..########..
+
+#include "images.h"
+
+const image_t  img_6x8_9 = { 6, 8, false, 6, 0, {
+	0x7B, 0xFC, 0xFF, 0x7C, 0x37, 0xDE
+}};

+ 14 - 0
wiiec/gfx/img_6x8_A.c

@@ -0,0 +1,14 @@
+// ..########..
+// ############
+// ####....####
+// ####....####
+// ############
+// ############
+// ####....####
+// ####....####
+
+#include "images.h"
+
+const image_t  img_6x8_A = { 6, 8, false, 6, 0, {
+	0x7B, 0xFC, 0xF3, 0xFF, 0xFC, 0xF3
+}};

+ 14 - 0
wiiec/gfx/img_6x8_B.c

@@ -0,0 +1,14 @@
+// ##########..
+// ############
+// ####....####
+// ##########..
+// ##########..
+// ####....####
+// ############
+// ##########..
+
+#include "images.h"
+
+const image_t  img_6x8_B = { 6, 8, false, 6, 0, {
+	0xFB, 0xFC, 0xFE, 0xFB, 0x3F, 0xFE
+}};

+ 14 - 0
wiiec/gfx/img_6x8_C.c

@@ -0,0 +1,14 @@
+// ..##########
+// ############
+// ####........
+// ####........
+// ####........
+// ####........
+// ############
+// ..##########
+
+#include "images.h"
+
+const image_t  img_6x8_C = { 6, 8, false, 6, 0, {
+	0x7F, 0xFC, 0x30, 0xC3, 0x0F, 0xDF
+}};

+ 14 - 0
wiiec/gfx/img_6x8_D.c

@@ -0,0 +1,14 @@
+// ##########..
+// ############
+// ..####..####
+// ..####..####
+// ..####..####
+// ..####..####
+// ############
+// ##########..
+
+#include "images.h"
+
+const image_t  img_6x8_D = { 6, 8, false, 6, 0, {
+	0xFB, 0xF6, 0xDB, 0x6D, 0xBF, 0xFE
+}};

+ 14 - 0
wiiec/gfx/img_6x8_E.c

@@ -0,0 +1,14 @@
+// ############
+// ############
+// ####........
+// ########....
+// ########....
+// ####........
+// ############
+// ############
+
+#include "images.h"
+
+const image_t  img_6x8_E = { 6, 8, false, 6, 0, {
+	0xFF, 0xFC, 0x3C, 0xF3, 0x0F, 0xFF
+}};

+ 14 - 0
wiiec/gfx/img_6x8_F.c

@@ -0,0 +1,14 @@
+// ############
+// ############
+// ####........
+// ########....
+// ########....
+// ####........
+// ####........
+// ####........
+
+#include "images.h"
+
+const image_t  img_6x8_F = { 6, 8, false, 6, 0, {
+	0xFF, 0xFC, 0x3C, 0xF3, 0x0C, 0x30
+}};

+ 14 - 0
wiiec/gfx/img_6x8_G.c

@@ -0,0 +1,14 @@
+// ..##########
+// ############
+// ####........
+// ####........
+// ####..######
+// ####....####
+// ############
+// ..##########
+
+#include "images.h"
+
+const image_t  img_6x8_G = { 6, 8, false, 6, 0, {
+	0x7F, 0xFC, 0x30, 0xDF, 0x3F, 0xDF
+}};

+ 14 - 0
wiiec/gfx/img_6x8_X.c

@@ -0,0 +1,14 @@
+// ####....####
+// ####....####
+// ..####..##..
+// ....######..
+// ..######....
+// ..##..####..
+// ####....####
+// ####....####
+
+#include "images.h"
+
+const image_t  img_6x8_X = { 6, 8, false, 6, 0, {
+	0xCF, 0x36, 0x8E, 0x71, 0x6C, 0xF3
+}};

+ 14 - 0
wiiec/gfx/img_6x8_Y.c

@@ -0,0 +1,14 @@
+// ####....####
+// ####....####
+// ####....####
+// ####....####
+// ..########..
+// ....####....
+// ....####....
+// ....####....
+
+#include "images.h"
+
+const image_t  img_6x8_Y = { 6, 8, false, 6, 0, {
+	0xCF, 0x3C, 0xF3, 0x78, 0xC3, 0x0C
+}};

+ 14 - 0
wiiec/gfx/img_6x8_Z.c

@@ -0,0 +1,14 @@
+// ############
+// ############
+// ........####
+// ......####..
+// ....####....
+// ..####......
+// ############
+// ############
+
+#include "images.h"
+
+const image_t  img_6x8_Z = { 6, 8, false, 6, 0, {
+	0xFF, 0xF0, 0xC6, 0x31, 0x8F, 0xFF
+}};

+ 14 - 0
wiiec/gfx/img_6x8_d_.c

@@ -0,0 +1,14 @@
+// ........####
+// ........####
+// ........####
+// ..##########
+// ############
+// ####....####
+// ############
+// ..##########
+
+#include "images.h"
+
+const image_t  img_6x8_d = { 6, 8, false, 6, 0, {
+	0x0C, 0x30, 0xDF, 0xFF, 0x3F, 0xDF
+}};

+ 14 - 0
wiiec/gfx/img_6x8_n_.c

@@ -0,0 +1,14 @@
+// ............
+// ............
+// ..########..
+// ############
+// ####....####
+// ####....####
+// ####....####
+// ####....####
+
+#include "images.h"
+
+const image_t  img_6x8_n = { 6, 8, false, 6, 0, {
+	0x00, 0x07, 0xBF, 0xCF, 0x3C, 0xF3
+}};

+ 14 - 0
wiiec/gfx/img_6x8_v_.c

@@ -0,0 +1,14 @@
+// ............
+// ............
+// ##........##
+// ####....####
+// ####....####
+// ############
+// ..########..
+// ....####....
+
+#include "images.h"
+
+const image_t  img_6x8_v = { 6, 8, false, 6, 0, {
+	0x00, 0x08, 0x73, 0xCF, 0xF7, 0x8C
+}};

+ 122 - 0
wiiec/gfx/img_RIP.c

@@ -0,0 +1,122 @@
+// ################################################################################################################################################################################################################################################################
+// ################################################################################################################################################################################################################################################################
+// ####........................................................................................................................................................................................................................................................####
+// ####..##..##........................................................................................................................................................................................................................................##..##..####
+// ####....##....................##############..........########........##################........................##############......##..........##......##############......##############......##############......##############....................##....####
+// ####..##..##..................##############............######..........################........................##############....######......######....##############......##############......##############......##############..................##..##..####
+// ####....................................######..........##..##......................######....................####........######..######......######..####........######..######......######..............######..######......######........................####
+// ####........................######......######..........##..##..........######......##..##....................######......##..##..##..##......##..##..######......######..######......######..######......######..######......##..##........................####
+// ####........................######......##..##..........##..##..........######......##..##....................##..##......######..##..##......##..##..######......##..##..##..##......##..##..######......##..##..##..##......##..##........................####
+// ####........................##..##......##..##..........##..##..........##..##......##..##....................##..##..............##..##......##..##..##..##......##..##..##..##......##..##..##..##......##..##..##..##......##..##........................####
+// ####........................##..##......##..##..........##..##..........##..##......##..##....................##..##..............##..##......##..##..##..##......##..##..##..##......##..##..##..##......##..##..##..##......######........................####
+// ####........................##..##......######..........##..##..........##..##......######....................##..##..............##..##......##..##..##..##......######..##..##..##..##..##..##..##......######..##..##....................................####
+// ####........................##..##########..............##..##..........##..##########........................##..##..............######......######..##..##########......##..##......##..##..##..##########......##..##....................................####
+// ####........................##..##########..............##..##..........##..##########........................##..##................##############....##..##########......##..##......##..##..##..##########......##..##..########..........................####
+// ####........................##..##....######............##..##..........##..##................................##..##..................####..####......##..##......######..##..##..##..##..##..##..##....######....##..##..##########........................####
+// ####........................##..##....##..##............##..##..........##..##................................##..##....................##..##........##..##......##..##..##..##......##..##..##..##....##..##....##..##......##..##........................####
+// ####........................##..##....##..##............##..##..........##..##................................##..##....................##..##........##..##......##..##..##..##......##..##..##..##....##..##....##..##......##..##........................####
+// ####........................##..##....##..##............##..##..........##..##................................######......######........##..##........##..##......##..##..##..##......##..##..##..##....##..##....######......##..##........................####
+// ####........................##..##....##..##............##..##..........##..##................................######......##..##........##..##........######......######..######......######..##..##....##..##....######......##..##........................####
+// ####........................##..##....##..##............##..##..........##..##................................####........######........######........######......######..######......######..##..##....##..##....####........######........................####
+// ####........................######....######....####....######..####....######..####............................##############..........######..........##############......##############....######....######......##############..........................####
+// ####........................######......######..####..########..####..########..####............................##############........##########........##############......##############....######......######....##############..........................####
+// ####........................................................................................................................................................................................................................................................####
+// ####........................................................................................................................................................................................................................................................####
+// ####..........................................................................................................................................................................................####......####..............##############....................####
+// ####......................................................................................................................................##................................................##....##..##....##........####..............####................####
+// ####..........######..##..##..######......######..##..##..######..######..######..####..####..######......##......##..######..##....##..##..######......######..######......................####..##..####..##......##......................##..............####
+// ####............##....##..##..##..........##......##..##..##........##....##......##..##..##..##..........##......##..##..##..####..##........##........##..##..##............................####......####......##......##########..........##............####
+// ####............##....######..####........######....##....######....##....####....##..##..##..######......##..##..##..##..##..##..####........##........####....####..............................##..##........##......##..........##........##............####
+// ####............##....##..##..##..............##....##........##....##....##......##......##......##......##..##..##..##..##..##....##........##........##..##..##..................................##..........##....##..............##......##............####
+// ####............##....##..##..######......######....##....######....##....######..##......##..######......####..####..######..##....##........##........######..######............................######........##....##......####....##......##............####
+// ####............................................................................................................................................................................................##......##......##....##....##....##..##......##............####
+// ####..........................................................................................................................................................................................##........##......##....##....##..##....##......##............####
+// ####..........................................................................................................................................................................................##........##......##....##....##........##......##............####
+// ####..........######..##..##..######......######..######..####..####..######......##......##..######..######..##..##..######..##..##..######......##..##..######..##..##........................##........######......##......########......##..............####
+// ####............##....##..##..##..........##......##..##..##..##..##..##..........##......##....##......##....##..##..##..##..##..##....##........##..##..##..##..##..##........................##..............##......##..................####............####
+// ####............##....######..####........######..######..##..##..##..####........##..##..##....##......##....######..##..##..##..##....##..........##....##..##..##..##..........................##..............##########..............##....##..........####
+// ####............##....##..##..##..............##..##..##..##......##..##..........##..##..##....##......##....##..##..##..##..##..##....##..........##....##..##..##..##..........................##......................################........##........####
+// ####............##....##..##..######......######..##..##..##......##..######......####..####..######....##....##..##..######..######....##..........##....######..######............................####..........................................##........####
+// ####....................................................................................................................................................................................................##########################################..........####
+// ####........................................................................................................................................................................................................................................................####
+// ####........................................................................................................................................................................................................................................................####
+// ####......................................##########......##############......##############......##############............................##############......##############......##############......##############......................................####
+// ####......................................##########......##############......##############......##############............................##############......##############......##############......##############......................................####
+// ####......................................##..##..##....######......######..######......######..######......######........................######......######..######......######..######......######..######......######....................................####
+// ####..........................................##..##....######......######..##..##......######..######......######........................##..##......##..##..######......######..##..##......##..##..##..##......##..##....................................####
+// ####..........................................##..##....##..##......##..##..######......##..##..##..##......##..##........................######......##..##..##..##......##..##..######......##..##..######......##..##....................................####
+// ####..........................................##..##....##..##......##..##..............##..##..##..##......##..##....................................##..##..##..##......##..##..............##..##..............##..##....................................####
+// ####..........................................##..##....##..##......##..##..............##..##..##..##....####..##....................................##..##..##..##....####..##..............##..##..............##..##....................................####
+// ####..........................................##..##....######......##..##..............######..##..##....####..##....................................######..##..##....####..##..............######..............######....................................####
+// ####..........................................######........##########..##..............######..##..##..##..##..##....################........############....##..##..##..##..##......############........############......................................####
+// ####..........................................######........##########..##..........######......##..##..##..##..##....##............##......############......##..##..##..##..##....############........############........................................####
+// ####..........................................##..##................##..##..........######......##..####....##..##....################....######..............##..####....##..##..######..............######................................................####
+// ####..........................................##..##................##..##..........##..##......##..####....##..##........................##..##..............##..####....##..##..##..##..............##..##................................................####
+// ####..........................................##..##................##..##..........##..##......##..##......##..##........................##..##..............##..##......##..##..##..##..............##..##................................................####
+// ####..........................................##..##................##..##..........##..##......##..##......##..##........................##..##..............##..##......##..##..##..##..............##..##................................................####
+// ####..........................................##..##................######..........##..##......######......######........................##..##..............######......######..##..##..............##..##................................................####
+// ####..........................................##..##................######..........##..##......######......######........................##..##........####..######......######..##..##........####..##..##........####....................................####
+// ####..##..##..............................##############....############............######........##############..........................##################....##############....##################..##################............................##..##..####
+// ####....##..............................##################..############............######........##############..........................##################....##############....##################..##################..............................##....####
+// ####..##..##........................................................................................................................................................................................................................................##..##..####
+// ####........................................................................................................................................................................................................................................................####
+// ################################################################################################################################################################################################################################################################
+// ################################################################################################################################################################################################################################################################
+
+#include "images.h"
+
+const image_t  img_RIP = { 128, 64, true, 837, 0x06, {  // orig:1024, comp:18.26%
+	0x06, 0x20, 0xFF, 0xC0, 0x06, 0x0E, 0x00, 0x03, 0xD4, 0x06, 0x0E, 0x00, 0x2B, 0xC8, 0x01, 0xFC,
+	0x1E, 0x1F, 0xF0, 0x00, 0xFE, 0x20, 0x8F, 0xE3, 0xF8, 0xFE, 0x3F, 0x80, 0x13, 0xD4, 0x01, 0xFC,
+	0x0E, 0x0F, 0xF0, 0x00, 0xFE, 0x71, 0xCF, 0xE3, 0xF8, 0xFE, 0x3F, 0x80, 0x2B, 0xC0, 0x00, 0x0E,
+	0x0A, 0x00, 0x38, 0x01, 0x87, 0x71, 0xD8, 0x77, 0x1C, 0x07, 0x71, 0xC0, 0x03, 0xC0, 0x03, 0x8E,
+	0x0A, 0x0E, 0x28, 0x01, 0xC5, 0x51, 0x5C, 0x77, 0x1D, 0xC7, 0x71, 0x40, 0x03, 0xC0, 0x03, 0x8A,
+	0x0A, 0x0E, 0x28, 0x01, 0x47, 0x51, 0x5C, 0x55, 0x15, 0xC5, 0x51, 0x40, 0x03, 0xC0, 0x02, 0x8A,
+	0x0A, 0x0A, 0x28, 0x01, 0x40, 0x51, 0x54, 0x55, 0x15, 0x45, 0x51, 0x40, 0x03, 0xC0, 0x02, 0x8A,
+	0x0A, 0x0A, 0x28, 0x01, 0x40, 0x51, 0x54, 0x55, 0x15, 0x45, 0x51, 0xC0, 0x03, 0xC0, 0x02, 0x8E,
+	0x0A, 0x0A, 0x38, 0x01, 0x40, 0x51, 0x54, 0x75, 0x55, 0x47, 0x50, 0x00, 0x03, 0xC0, 0x02, 0xF8,
+	0x0A, 0x0B, 0xE0, 0x01, 0x40, 0x71, 0xD7, 0xC5, 0x15, 0x7C, 0x50, 0x00, 0x03, 0xC0, 0x02, 0xF8,
+	0x0A, 0x0B, 0xE0, 0x01, 0x40, 0x3F, 0x97, 0xC5, 0x15, 0x7C, 0x57, 0x80, 0x03, 0xC0, 0x02, 0x9C,
+	0x0A, 0x0A, 0x00, 0x01, 0x40, 0x1B, 0x14, 0x75, 0x55, 0x4E, 0x57, 0xC0, 0x03, 0xC0, 0x02, 0x94,
+	0x0A, 0x0A, 0x00, 0x01, 0x40, 0x0A, 0x14, 0x55, 0x15, 0x4A, 0x51, 0x40, 0x03, 0xC0, 0x02, 0x94,
+	0x0A, 0x0A, 0x00, 0x01, 0x40, 0x0A, 0x14, 0x55, 0x15, 0x4A, 0x51, 0x40, 0x03, 0xC0, 0x02, 0x94,
+	0x0A, 0x0A, 0x00, 0x01, 0xC7, 0x0A, 0x14, 0x55, 0x15, 0x4A, 0x71, 0x40, 0x03, 0xC0, 0x02, 0x94,
+	0x0A, 0x0A, 0x00, 0x01, 0xC5, 0x0A, 0x1C, 0x77, 0x1D, 0x4A, 0x71, 0x40, 0x03, 0xC0, 0x02, 0x94,
+	0x0A, 0x0A, 0x00, 0x01, 0x87, 0x0E, 0x1C, 0x77, 0x1D, 0x4A, 0x61, 0xC0, 0x03, 0xC0, 0x03, 0x9C,
+	0xCE, 0xCE, 0xC0, 0x00, 0xFE, 0x0E, 0x0F, 0xE3, 0xF9, 0xCE, 0x3F, 0x80, 0x03, 0xC0, 0x03, 0x8E,
+	0xDE, 0xDE, 0xC0, 0x00, 0xFE, 0x1F, 0x0F, 0xE3, 0xF9, 0xC7, 0x3F, 0x80, 0x03, 0xC0, 0x06, 0x0E,
+	0x00, 0x03, 0xC0, 0x06, 0x0E, 0x00, 0x03, 0xC0, 0x06, 0x0A, 0x00, 0x01, 0x8C, 0x07, 0xF0, 0x03,
+	0xC0, 0x06, 0x07, 0x00, 0x04, 0x00, 0x00, 0x02, 0x52, 0x18, 0x0C, 0x03, 0xC1, 0xD5, 0xC7, 0x57,
+	0x77, 0x6D, 0xC4, 0x5D, 0x2B, 0x8E, 0xE0, 0x03, 0x5A, 0x20, 0x02, 0x03, 0xC0, 0x95, 0x04, 0x54,
+	0x24, 0x55, 0x04, 0x55, 0xA1, 0x0A, 0x80, 0x01, 0x8C, 0x47, 0xC1, 0x03, 0xC0, 0x9D, 0x87, 0x27,
+	0x26, 0x55, 0xC5, 0x55, 0x61, 0x0C, 0xC0, 0x00, 0x50, 0x88, 0x21, 0x03, 0xC0, 0x95, 0x01, 0x21,
+	0x24, 0x44, 0x45, 0x55, 0x21, 0x0A, 0x80, 0x00, 0x20, 0x90, 0x11, 0x03, 0xC0, 0x95, 0xC7, 0x27,
+	0x27, 0x45, 0xC6, 0xDD, 0x21, 0x0E, 0xE0, 0x00, 0x70, 0x91, 0x91, 0x03, 0xC0, 0x06, 0x0B, 0x00,
+	0x88, 0x92, 0x51, 0x03, 0xC0, 0x06, 0x0A, 0x00, 0x01, 0x08, 0x92, 0x91, 0x03, 0xC0, 0x06, 0x0A,
+	0x00, 0x01, 0x08, 0x92, 0x11, 0x03, 0xC1, 0xD5, 0xC7, 0x76, 0xDC, 0x45, 0xDD, 0x5D, 0x5C, 0x57,
+	0x50, 0x00, 0x87, 0x11, 0xE2, 0x03, 0xC0, 0x95, 0x04, 0x55, 0x50, 0x44, 0x89, 0x55, 0x48, 0x55,
+	0x50, 0x00, 0x80, 0x88, 0x03, 0x03, 0xC0, 0x9D, 0x87, 0x75, 0x58, 0x54, 0x89, 0xD5, 0x48, 0x25,
+	0x50, 0x00, 0x40, 0x7C, 0x04, 0x83, 0xC0, 0x95, 0x01, 0x54, 0x50, 0x54, 0x89, 0x55, 0x48, 0x25,
+	0x50, 0x00, 0x40, 0x07, 0xF8, 0x43, 0xC0, 0x95, 0xC7, 0x54, 0x5C, 0x6D, 0xC9, 0x5D, 0xC8, 0x27,
+	0x70, 0x00, 0x30, 0x00, 0x00, 0x43, 0xC0, 0x06, 0x0B, 0x00, 0x0F, 0xFF, 0xFF, 0x83, 0xC0, 0x06,
+	0x0E, 0x00, 0x03, 0xC0, 0x06, 0x0E, 0x00, 0x03, 0xC0, 0x00, 0x07, 0xC7, 0xF1, 0xFC, 0x7F, 0x00,
+	0x03, 0xF8, 0xFE, 0x3F, 0x8F, 0xE0, 0x00, 0x03, 0xC0, 0x00, 0x07, 0xC7, 0xF1, 0xFC, 0x7F, 0x00,
+	0x03, 0xF8, 0xFE, 0x3F, 0x8F, 0xE0, 0x00, 0x03, 0xC0, 0x00, 0x05, 0x4E, 0x3B, 0x8E, 0xE3, 0x80,
+	0x07, 0x1D, 0xC7, 0x71, 0xDC, 0x70, 0x00, 0x03, 0xC0, 0x00, 0x01, 0x4E, 0x3A, 0x8E, 0xE3, 0x80,
+	0x05, 0x15, 0xC7, 0x51, 0x54, 0x50, 0x00, 0x03, 0xC0, 0x00, 0x01, 0x4A, 0x2B, 0x8A, 0xA2, 0x80,
+	0x07, 0x15, 0x45, 0x71, 0x5C, 0x50, 0x00, 0x03, 0xC0, 0x00, 0x01, 0x4A, 0x28, 0x0A, 0xA2, 0x80,
+	0x00, 0x15, 0x45, 0x01, 0x40, 0x50, 0x00, 0x03, 0xC0, 0x00, 0x01, 0x4A, 0x28, 0x0A, 0xA6, 0x80,
+	0x00, 0x15, 0x4D, 0x01, 0x40, 0x50, 0x00, 0x03, 0xC0, 0x00, 0x01, 0x4E, 0x28, 0x0E, 0xA6, 0x80,
+	0x00, 0x1D, 0x4D, 0x01, 0xC0, 0x70, 0x00, 0x03, 0xC0, 0x00, 0x01, 0xC3, 0xE8, 0x0E, 0xAA, 0x9F,
+	0xE1, 0xF9, 0x55, 0x1F, 0x87, 0xE0, 0x00, 0x03, 0xC0, 0x00, 0x01, 0xC3, 0xE8, 0x38, 0xAA, 0x90,
+	0x23, 0xF1, 0x55, 0x3F, 0x0F, 0xC0, 0x00, 0x03, 0xC0, 0x00, 0x01, 0x40, 0x28, 0x38, 0xB2, 0x9F,
+	0xE7, 0x01, 0x65, 0x70, 0x1C, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x01, 0x40, 0x28, 0x28, 0xB2, 0x80,
+	0x05, 0x01, 0x65, 0x50, 0x14, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x01, 0x40, 0x28, 0x28, 0xA2, 0x80,
+	0x05, 0x01, 0x45, 0x50, 0x14, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x01, 0x40, 0x28, 0x28, 0xA2, 0x80,
+	0x05, 0x01, 0x45, 0x50, 0x14, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x01, 0x40, 0x38, 0x28, 0xE3, 0x80,
+	0x05, 0x01, 0xC7, 0x50, 0x14, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x01, 0x40, 0x38, 0x28, 0xE3, 0x80,
+	0x05, 0x0D, 0xC7, 0x50, 0xD4, 0x30, 0x00, 0x03, 0xD4, 0x00, 0x07, 0xF3, 0xF0, 0x38, 0x7F, 0x00,
+	0x07, 0xFC, 0xFE, 0x7F, 0xDF, 0xF0, 0x00, 0x2B, 0xC8, 0x00, 0x0F, 0xFB, 0xF0, 0x38, 0x7F, 0x00,
+	0x07, 0xFC, 0xFE, 0x7F, 0xDF, 0xF0, 0x00, 0x13, 0xD4, 0x06, 0x0E, 0x00, 0x2B, 0xC0, 0x06, 0x0E,
+	0x00, 0x03, 0x06, 0x20, 0xFF
+}};

+ 17 - 0
wiiec/gfx/img_cc_Cable.c

@@ -0,0 +1,17 @@
+// ####..##
+// ##..####
+// ####..##
+// ##..####
+// ####..##
+// ##..####
+// ####..##
+// ##..####
+// ####..##
+// ##..####
+// ####..##
+
+#include "images.h"
+
+const image_t  img_cc_Cable = { 4, 11, true, 4, 0x00, {  // orig:6, comp:33.33%
+	0x00, 0x05, 0xDB, 0xD0
+}};

+ 25 - 0
wiiec/gfx/img_cc_Joy.c

@@ -0,0 +1,25 @@
+// ................##................
+// ............##########............
+// ....############..############....
+// ....######..............######....
+// ....####..................####....
+// ....##......................##....
+// ..####......................####..
+// ..####......................####..
+// ####..........................####
+// ..####......................####..
+// ..####......................####..
+// ....##......................##....
+// ....####..................####....
+// ....######..............######....
+// ....############..############....
+// ............##########............
+// ................##................
+
+#include "images.h"
+
+const image_t  img_cc_Joy = { 17, 17, false, 37, 0, {
+	0x00, 0x80, 0x01, 0xF0, 0x0F, 0xDF, 0x87, 0x01, 0xC3, 0x00, 0x61, 0x00, 0x11, 0x80, 0x0C, 0xC0,
+	0x06, 0xC0, 0x01, 0xB0, 0x01, 0x98, 0x00, 0xC4, 0x00, 0x43, 0x00, 0x61, 0xC0, 0x70, 0xFD, 0xF8,
+	0x07, 0xC0, 0x00, 0x80, 0x00
+}};

+ 92 - 0
wiiec/gfx/img_cc_Main.c

@@ -0,0 +1,92 @@
+// ..................................................##################................................................................................................##################..................................................
+// ......................................############................##............##########....................................................##########............##................############......................................
+// ..................................####............................##..........##..........##......................####......................##..........##..........##............................####..................................
+// ................................##................................##############..........####################################################..........##############................................##................................
+// ............................######................................##..........##..........##......................####......................##..........##..........##................................######............................
+// ..........................##..##....................################..........##..........##......................####......................##..........##..........################....................##..##..........................
+// ........................##....##........############............................##########....................................................##########............................############........##....##........................
+// ......................##......##########........................................................................................................................................................##########......##......................
+// ....................##..........########################################################################################################################################################################..........##....................
+// ..................##......########....................................................................................................................................................................########......##..................
+// ................##....######................................................................................................................................................................................######....##................
+// ..............##....####........................................................................................................................................................................................####....##..............
+// ............##########............................................................................................................................................................................................##########............
+// ............######......................................................................................####......####..####..####....................................................................................######............
+// ..........######......................##################................................................####..##..####..................................................................######..........................######..........
+// ..........####........................##################................................................####..##..####..####..####....................................................##########..........................####..........
+// ........####..........................####..........####................................................####..##..####..####..####..................................................####......####..........................####........
+// ......######..........................####..........####..................................................####..####....####..####................................................####..........####........................######......
+// ......####............................####....##....####........................................................................................................................####....##..##....####........................####......
+// ......##..............................####....##....####........................................................................................................................####......##......####..........................####....
+// ....####..............................####....##....####........................................................................................................................####....##..##....####..........................####....
+// ....##..................##################..........##################............................................................................................######..........####..........####..........######..............##....
+// ..####..................##################..........##################..........................................................................................##########..........####......####..........##########............####..
+// ..##....................####......................................####..........................########........########........########......................####......####..........##########..........####......####............##..
+// ..##....................####......................................####........................####....####....####....####....####....####..................####..........####..........######..........####....##....####..........##..
+// ####....................####....######..................######....####........................##........##....##........##....##........##................####....##..##....####......................####....##..##....####........####
+// ##......................####......................................####........................##........##....##........##....##........##................####....######....####......................####....######....####..........##
+// ##......................####......................................####........................####....####....####....####....####....####................####........##....####......................####....##..##....####..........##
+// ##......................##################..........##################..........................########........########........########....................####....##....####..........######..........####..........####............##
+// ##......................##################..........##################........................................................................................####......####..........##########..........####......####..............##
+// ##....................................####....##....####........................................................................................................##########..........####......####..........##########................##
+// ##....................................####....##....####..........................................................................................................######..........####..##......####..........######..................##
+// ##....................................####....##....####........................................................................................................................####....##........####................................##
+// ##....................................####..........####........................................................................................................................####....####......####................................##
+// ##....................................####..........####........................................................................................................................####....##..##....####................................##
+// ####..................................##################..........................................................................................................................####....####..####................................####
+// ..##..................................##################............................................................................................................................####......####..................................##..
+// ..##..................................................................................................................................................................................##########....................................##..
+// ..####..................................................................................................................................................................................######....................................####..
+// ....##............................................................................................................................................................................................................................##....
+// ....##............................................................................................................................................................................................................................##....
+// ....####........................................................................................................................................................................................................................####....
+// ......##........................................................................................................................................................................................................................##......
+// ......####....................................................................................................................................................................................................................####......
+// ........####................................................................................................................................................................................................................####........
+// ..........####............................................................................................................................................................................................................####..........
+// ............####........................................................................................................................................................................................................####............
+// ..............####....................................................................................................................................................................................................####..............
+// ................######............................................................................................................................................................................................######................
+// ....................####........................................................................................................................................................................................####....................
+// ......................######................................................................................................................................................................................######......................
+// ..........................########....................................................................................................................................................................########..........................
+// ................................########################################################################################################################################################################................................
+
+#include "images.h"
+
+const image_t  img_cc_Main = { 116, 53, true, 542, 0x05, {  // orig:769, comp:29.52%
+	0x00, 0x00, 0x00, 0x7F, 0xC0, 0x05, 0x05, 0x00, 0x3F, 0xE0, 0x05, 0x04, 0x00, 0x01, 0xF8, 0x04,
+	0x0F, 0x80, 0x00, 0x00, 0x1F, 0x02, 0x01, 0xF8, 0x05, 0x04, 0x00, 0x60, 0x00, 0x41, 0x04, 0x00,
+	0x60, 0x02, 0x08, 0x20, 0x00, 0x60, 0x00, 0x00, 0x00, 0x08, 0x00, 0x07, 0xF0, 0x7F, 0xFF, 0xFF,
+	0xE0, 0xFE, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x41, 0x04, 0x00, 0x60, 0x02, 0x08,
+	0x20, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x50, 0x03, 0xFC, 0x10, 0x40, 0x06, 0x00, 0x20, 0x83, 0xFC,
+	0x00, 0xA0, 0x00, 0x00, 0x09, 0x0F, 0xC0, 0x00, 0xF8, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x3F, 0x09,
+	0x00, 0x00, 0x01, 0x1F, 0x05, 0x09, 0x00, 0x0F, 0x88, 0x00, 0x00, 0x20, 0x05, 0x0A, 0xFF, 0xF0,
+	0x40, 0x00, 0x04, 0x78, 0x05, 0x09, 0x00, 0x01, 0xE2, 0x00, 0x00, 0x9C, 0x05, 0x0A, 0x00, 0x03,
+	0x90, 0x00, 0x13, 0x05, 0x0B, 0x00, 0x0C, 0x80, 0x03, 0xE0, 0x05, 0x0B, 0x00, 0x7C, 0x00, 0x38,
+	0x05, 0x05, 0x00, 0xC6, 0xD8, 0x05, 0x04, 0x00, 0x01, 0xC0, 0x07, 0x00, 0x1F, 0xF0, 0x00, 0x00,
+	0x0D, 0x60, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x60, 0x01, 0xFF, 0x00, 0x00, 0x00, 0xD6,
+	0xD8, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x60, 0x0C, 0x00, 0x18, 0x30, 0x00, 0x00, 0x0D, 0x6D, 0x80,
+	0x00, 0x00, 0x31, 0x80, 0x03, 0x01, 0xC0, 0x01, 0x83, 0x00, 0x00, 0x00, 0x6C, 0xD8, 0x00, 0x00,
+	0x06, 0x0C, 0x00, 0x38, 0x18, 0x00, 0x19, 0x30, 0x05, 0x07, 0x00, 0xCA, 0x60, 0x01, 0x81, 0x00,
+	0x01, 0x93, 0x05, 0x07, 0x00, 0x0C, 0x46, 0x00, 0x0C, 0x30, 0x00, 0x19, 0x30, 0x05, 0x07, 0x00,
+	0xCA, 0x60, 0x00, 0xC2, 0x00, 0xFF, 0x83, 0xFE, 0x05, 0x05, 0x00, 0x07, 0x06, 0x0C, 0x1C, 0x04,
+	0x60, 0x0F, 0xF8, 0x3F, 0xE0, 0x05, 0x05, 0x00, 0xF8, 0x31, 0x83, 0xE0, 0x64, 0x00, 0xC0, 0x00,
+	0x06, 0x00, 0x0F, 0x0F, 0x0F, 0x00, 0x18, 0xC1, 0xF0, 0x63, 0x02, 0x40, 0x0C, 0x00, 0x00, 0x60,
+	0x01, 0x99, 0x99, 0x98, 0x03, 0x06, 0x0E, 0x0C, 0x98, 0x2C, 0x00, 0xCE, 0x00, 0xE6, 0x00, 0x10,
+	0x90, 0x90, 0x80, 0x65, 0x30, 0x01, 0x94, 0xC3, 0x80, 0x0C, 0x00, 0x00, 0x60, 0x01, 0x09, 0x09,
+	0x08, 0x06, 0x73, 0x00, 0x19, 0xCC, 0x18, 0x00, 0xC0, 0x00, 0x06, 0x00, 0x19, 0x99, 0x99, 0x80,
+	0x61, 0x30, 0x01, 0x94, 0xC1, 0x80, 0x0F, 0xF8, 0x3F, 0xE0, 0x00, 0xF0, 0xF0, 0xF0, 0x03, 0x26,
+	0x0E, 0x0C, 0x18, 0x18, 0x00, 0xFF, 0x83, 0xFE, 0x05, 0x05, 0x00, 0x18, 0xC1, 0xF0, 0x63, 0x01,
+	0x80, 0x00, 0x19, 0x30, 0x05, 0x06, 0x00, 0xF8, 0x31, 0x83, 0xE0, 0x18, 0x00, 0x01, 0x93, 0x05,
+	0x06, 0x00, 0x07, 0x06, 0x8C, 0x1C, 0x01, 0x80, 0x00, 0x19, 0x30, 0x05, 0x07, 0x00, 0xC8, 0x60,
+	0x00, 0x18, 0x00, 0x01, 0x83, 0x05, 0x07, 0x00, 0x0C, 0xC6, 0x00, 0x01, 0x80, 0x00, 0x18, 0x30,
+	0x05, 0x07, 0x00, 0xCA, 0x60, 0x00, 0x1C, 0x00, 0x01, 0xFF, 0x05, 0x07, 0x00, 0x06, 0x6C, 0x00,
+	0x03, 0x40, 0x00, 0x1F, 0xF0, 0x05, 0x07, 0x00, 0x31, 0x80, 0x00, 0x24, 0x05, 0x0A, 0x00, 0x01,
+	0xF0, 0x00, 0x02, 0x60, 0x05, 0x0A, 0x00, 0x0E, 0x00, 0x00, 0x62, 0x05, 0x0D, 0x00, 0x04, 0x20,
+	0x05, 0x0D, 0x00, 0x43, 0x05, 0x0D, 0x00, 0x0C, 0x10, 0x05, 0x0D, 0x00, 0x81, 0x80, 0x05, 0x0C,
+	0x00, 0x18, 0x0C, 0x05, 0x0C, 0x00, 0x03, 0x00, 0x60, 0x05, 0x0C, 0x00, 0x60, 0x03, 0x05, 0x0C,
+	0x00, 0x0C, 0x00, 0x18, 0x05, 0x0B, 0x00, 0x01, 0x80, 0x00, 0xE0, 0x05, 0x0B, 0x00, 0x70, 0x00,
+	0x03, 0x05, 0x0B, 0x00, 0x0C, 0x00, 0x00, 0x1C, 0x05, 0x0A, 0x00, 0x03, 0x80, 0x00, 0x00, 0x78,
+	0x05, 0x09, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x05, 0x0A, 0xFF, 0xF0, 0x00, 0x00
+}};

+ 13 - 0
wiiec/gfx/img_cc_btn_A1.c

@@ -0,0 +1,13 @@
+// ##############
+// ######..######
+// ####..##..####
+// ####......####
+// ####..##..####
+// ##############
+// ##############
+
+#include "images.h"
+
+const image_t  img_cc_btn_A1 = { 7, 7, false, 7, 0, {
+	0xFF, 0xDF, 0x5E, 0x3D, 0x7F, 0xFF, 0x80
+}};

+ 13 - 0
wiiec/gfx/img_cc_btn_B1.c

@@ -0,0 +1,13 @@
+// ##############
+// ####..########
+// ####..########
+// ####....######
+// ####..##..####
+// ######....####
+// ##############
+
+#include "images.h"
+
+const image_t  img_cc_btn_B1 = { 7, 7, false, 7, 0, {
+	0xFF, 0xBF, 0x7E, 0x7D, 0x7C, 0xFF, 0x80
+}};

+ 13 - 0
wiiec/gfx/img_cc_btn_X1.c

@@ -0,0 +1,13 @@
+// ##############
+// ##############
+// ####..##..####
+// ######..######
+// ####..##..####
+// ##############
+// ##############
+
+#include "images.h"
+
+const image_t  img_cc_btn_X1 = { 7, 7, false, 7, 0, {
+	0xFF, 0xFF, 0x5F, 0x7D, 0x7F, 0xFF, 0x80
+}};

この差分においてかなりの量のファイルが変更されているため、一部のファイルを表示していません