<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>http://w.arbores.tech/w/index.php?action=history&amp;feed=atom&amp;title=Moshiboard</id>
	<title>Moshiboard - Revision history</title>
	<link rel="self" type="application/atom+xml" href="http://w.arbores.tech/w/index.php?action=history&amp;feed=atom&amp;title=Moshiboard"/>
	<link rel="alternate" type="text/html" href="http://w.arbores.tech/w/index.php?title=Moshiboard&amp;action=history"/>
	<updated>2026-04-10T19:56:16Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.39.11</generator>
	<entry>
		<id>http://w.arbores.tech/w/index.php?title=Moshiboard&amp;diff=16310&amp;oldid=prev</id>
		<title>Daniel K. Schneider: Text replacement - &quot;$&quot; to &quot;
{{edutechwiki}}&quot;</title>
		<link rel="alternate" type="text/html" href="http://w.arbores.tech/w/index.php?title=Moshiboard&amp;diff=16310&amp;oldid=prev"/>
		<updated>2021-04-10T00:19:18Z</updated>

		<summary type="html">&lt;p&gt;Text replacement - &amp;quot;$&amp;quot; to &amp;quot; {{edutechwiki}}&amp;quot;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 02:19, 10 April 2021&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l133&quot;&gt;Line 133:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 133:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[category: laser cutting]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[category: laser cutting]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;{{edutechwiki}}&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Daniel K. Schneider</name></author>
	</entry>
	<entry>
		<id>http://w.arbores.tech/w/index.php?title=Moshiboard&amp;diff=15931&amp;oldid=prev</id>
		<title>Daniel K. Schneider: 1 revision imported</title>
		<link rel="alternate" type="text/html" href="http://w.arbores.tech/w/index.php?title=Moshiboard&amp;diff=15931&amp;oldid=prev"/>
		<updated>2021-04-09T23:01:42Z</updated>

		<summary type="html">&lt;p&gt;1 revision imported&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 01:01, 10 April 2021&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;en&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Daniel K. Schneider</name></author>
	</entry>
	<entry>
		<id>http://w.arbores.tech/w/index.php?title=Moshiboard&amp;diff=15930&amp;oldid=prev</id>
		<title>edutechwiki_en&gt;Tatarize at 05:35, 4 August 2020</title>
		<link rel="alternate" type="text/html" href="http://w.arbores.tech/w/index.php?title=Moshiboard&amp;diff=15930&amp;oldid=prev"/>
		<updated>2020-08-04T05:35:37Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= Moshiboard =&lt;br /&gt;
&lt;br /&gt;
The Moshiboard laser cutter board is a proprietary controller with proprietary software. In the case of Moshiboard this software is called `MoshiDraw`. Like most proprietary laser cutting software intended for a specific board it has significant disadvantages and the only open source solutions are attempts at reverse engineering.&lt;br /&gt;
&lt;br /&gt;
== USB Protocol ==&lt;br /&gt;
&lt;br /&gt;
The USB plug on the board is connected directly to the CH341A communications chip and configured in parallel port (EPP19) mode.  This gives it the same Vendor id and product id as other things like the M2 Nano.&lt;br /&gt;
&lt;br /&gt;
The usb device is located at vendor 0x1a86 with a PID of 0x5512&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Swizzling ==&lt;br /&gt;
&lt;br /&gt;
Like many different boards there is some light swizzling for some bytes in this case the command bytes are swizzled. Half of the command byte has random data (random distribution) and the other half is control code. This gives us 4 bits of command code, 4 random bytes. The swizzling can actually thus be interpreted in several ways, but we&amp;#039;ll put the first four bits as command and the last 4 bits as random.&lt;br /&gt;
&lt;br /&gt;
The algorithm from unswizzled to swizzled form is:&lt;br /&gt;
&lt;br /&gt;
    def swizzle(b, b0, b1, b2, b3, b4, b5, b6, b7):&lt;br /&gt;
        return ((b &amp;gt;&amp;gt; 0) &amp;amp; 1) &amp;lt;&amp;lt; b7 | ((b &amp;gt;&amp;gt; 1) &amp;amp; 1) &amp;lt;&amp;lt; b6 | \&lt;br /&gt;
               ((b &amp;gt;&amp;gt; 2) &amp;amp; 1) &amp;lt;&amp;lt; b5 | ((b &amp;gt;&amp;gt; 3) &amp;amp; 1) &amp;lt;&amp;lt; b4 | \&lt;br /&gt;
               ((b &amp;gt;&amp;gt; 4) &amp;amp; 1) &amp;lt;&amp;lt; b3 | ((b &amp;gt;&amp;gt; 5) &amp;amp; 1) &amp;lt;&amp;lt; b2 | \&lt;br /&gt;
               ((b &amp;gt;&amp;gt; 6) &amp;amp; 1) &amp;lt;&amp;lt; b1 | ((b &amp;gt;&amp;gt; 7) &amp;amp; 1) &amp;lt;&amp;lt; b0&lt;br /&gt;
&lt;br /&gt;
    def convert(q):&lt;br /&gt;
        if q &amp;amp; 1:&lt;br /&gt;
            return swizzle(q, 7, 6, 2, 4, 3, 5, 1, 0)&lt;br /&gt;
        else:&lt;br /&gt;
            return swizzle(q, 5, 1, 7, 2, 4, 3, 6, 0)&lt;br /&gt;
&lt;br /&gt;
Note that each lowest bit triggers a different type of swizzle. So every other bit is swizzled in a different form. The last bit remains in the same position in both so these different swizzles perfectly intermingle.&lt;br /&gt;
&lt;br /&gt;
=== Swizzle LUT ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! CMD !! 0x00 !! 0x01 !! 0x02 !! 0x03 !! 0x04 !! 0x05 !! 0x06 !! 0x07 !! 0x08 !! 0x09 !! 0x0A !! 0x0B !! 0x0C !! 0x0D !! 0x0E !! 0x0F&lt;br /&gt;
|-&lt;br /&gt;
| 0x0? || 0x00 || 0x01 || 0x40 || 0x03 || 0x10 || 0x21 || 0x50 || 0x23 || 0x04 || 0x09 || 0x44 || 0x0b || 0x14 || 0x29 || 0x54 || 0x2b&lt;br /&gt;
|-&lt;br /&gt;
| 0x1? || 0x08 || 0x11 || 0x48 || 0x13 || 0x18 || 0x31 || 0x58 || 0x33 || 0x0c || 0x19 || 0x4c || 0x1b || 0x1c || 0x39 || 0x5c || 0x3b&lt;br /&gt;
|-&lt;br /&gt;
| 0x2? || 0x80 || 0x05 || 0xc0 || 0x07 || 0x90 || 0x25 || 0xd0 || 0x27 || 0x84 || 0x0d || 0xc4 || 0x0f || 0x94 || 0x2d || 0xd4 || 0x2f&lt;br /&gt;
|-&lt;br /&gt;
| 0x3? || 0x88 || 0x15 || 0xc8 || 0x17 || 0x98 || 0x35 || 0xd8 || 0x37 || 0x8c || 0x1d || 0xcc || 0x1f || 0x9c || 0x3d || 0xdc || 0x3f&lt;br /&gt;
|-&lt;br /&gt;
| 0x4? || 0x02 || 0x41 || 0x42 || 0x43 || 0x12 || 0x61 || 0x52 || 0x63 || 0x06 || 0x49 || 0x46 || 0x4b || 0x16 || 0x69 || 0x56 || 0x6b&lt;br /&gt;
|-&lt;br /&gt;
| 0x5? || 0x0a || 0x51 || 0x4a || 0x53 || 0x1a || 0x71 || 0x5a || 0x73 || 0x0e || 0x59 || 0x4e || 0x5b || 0x1e || 0x79 || 0x5e || 0x7b&lt;br /&gt;
|-&lt;br /&gt;
| 0x6? || 0x82 || 0x45 || 0xc2 || 0x47 || 0x92 || 0x65 || 0xd2 || 0x67 || 0x86 || 0x4d || 0xc6 || 0x4f || 0x96 || 0x6d || 0xd6 || 0x6f&lt;br /&gt;
|-&lt;br /&gt;
| 0x7? || 0x8a || 0x55 || 0xca || 0x57 || 0x9a || 0x75 || 0xda || 0x77 || 0x8e || 0x5d || 0xce || 0x5f || 0x9e || 0x7d || 0xde || 0x7f&lt;br /&gt;
|-&lt;br /&gt;
| 0x8? || 0x20 || 0x81 || 0x60 || 0x83 || 0x30 || 0xa1 || 0x70 || 0xa3 || 0x24 || 0x89 || 0x64 || 0x8b || 0x34 || 0xa9 || 0x74 || 0xab&lt;br /&gt;
|-&lt;br /&gt;
| 0x9? || 0x28 || 0x91 || 0x68 || 0x93 || 0x38 || 0xb1 || 0x78 || 0xb3 || 0x2c || 0x99 || 0x6c || 0x9b || 0x3c || 0xb9 || 0x7c || 0xbb&lt;br /&gt;
|-&lt;br /&gt;
| 0xA? || 0xa0 || 0x85 || 0xe0 || 0x87 || 0xb0 || 0xa5 || 0xf0 || 0xa7 || 0xa4 || 0x8d || 0xe4 || 0x8f || 0xb4 || 0xad || 0xf4 || 0xaf&lt;br /&gt;
|-&lt;br /&gt;
| 0xB? || 0xa8 || 0x95 || 0xe8 || 0x97 || 0xb8 || 0xb5 || 0xf8 || 0xb7 || 0xac || 0x9d || 0xec || 0x9f || 0xbc || 0xbd || 0xfc || 0xbf&lt;br /&gt;
|-&lt;br /&gt;
| 0xC? || 0x22 || 0xc1 || 0x62 || 0xc3 || 0x32 || 0xe1 || 0x72 || 0xe3 || 0x26 || 0xc9 || 0x66 || 0xcb || 0x36 || 0xe9 || 0x76 || 0xeb&lt;br /&gt;
|-&lt;br /&gt;
| 0xD? || 0x2a || 0xd1 || 0x6a || 0xd3 || 0x3a || 0xf1 || 0x7a || 0xf3 || 0x2e || 0xd9 || 0x6e || 0xdb || 0x3e || 0xf9 || 0x7e || 0xfb&lt;br /&gt;
|-&lt;br /&gt;
| 0xE? || 0xa2 || 0xc5 || 0xe2 || 0xc7 || 0xb2 || 0xe5 || 0xf2 || 0xe7 || 0xa6 || 0xcd || 0xe6 || 0xcf || 0xb6 || 0xed || 0xf6 || 0xef&lt;br /&gt;
|-&lt;br /&gt;
| 0xF? || 0xaa || 0xd5 || 0xea || 0xd7 || 0xba || 0xf5 || 0xfa || 0xf7 || 0xae || 0xdd || 0xee || 0xdf || 0xbe || 0xfd || 0xfe || 0xff&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
All commands will be referenced by the first 4 bits. The remaining 4 bits fit a random distribution. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Moshiboard Commands ==&lt;br /&gt;
&lt;br /&gt;
Since command bytes have 4 bits there can only be 16 of them.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Command !! Length !! Code !! Parameters&lt;br /&gt;
|-&lt;br /&gt;
| 2nd CMD For Jump  || 0 || 0x0? || (2 bytes) (2 bytes) (2 bytes)&lt;br /&gt;
|-&lt;br /&gt;
| UNKNOWN || 1 || 0x1? || unknown&lt;br /&gt;
|-&lt;br /&gt;
| Terminal Commands || 1 || 0x2? || nothing. (occurs in 6 bytes increments)&lt;br /&gt;
|-&lt;br /&gt;
| Move_Y_ABS || 1 || 0x3? || (2 byte ABS Y)&lt;br /&gt;
|-&lt;br /&gt;
| UNKNOWN || 1 || 0x4? || unknown&lt;br /&gt;
|-&lt;br /&gt;
| Header Start || 1 || 0x5? || (2 bytes unknown)&lt;br /&gt;
|-&lt;br /&gt;
| Move_X_ABS || 1 || 0x6? || (2 byte ABS X)&lt;br /&gt;
|-&lt;br /&gt;
| Move_XY_ABS || 1 || 0x7? || (2 byte ABS X) (2 byte ABS Y)&lt;br /&gt;
|-&lt;br /&gt;
| UNKNOWN || 1 || 0x8? || unknown&lt;br /&gt;
|-&lt;br /&gt;
| UNKNOWN || 1 || 0x9? || unknown&lt;br /&gt;
|-&lt;br /&gt;
| UNKNOWN || 1 || 0xA? || unknown&lt;br /&gt;
|-&lt;br /&gt;
| Cut_Y_ABS || 1 || 0xB? || (2 byte ABS Y)&lt;br /&gt;
|-&lt;br /&gt;
| UNKNOWN || 1 || 0xC? || unknown&lt;br /&gt;
|-&lt;br /&gt;
| UNKNOWN || 1 || 0xD? || unknown&lt;br /&gt;
|-&lt;br /&gt;
| Cut_X_ABS || 1 || 0xE? || (2 byte ABS X)&lt;br /&gt;
|-&lt;br /&gt;
| Cut_XY_ABS || 1 || 0xF? || (2 byte ABS X) (2 byte ABS Y)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Bitwise this implies our flags for our 4 data bytes are: Laser, X-Value, Unknown, Y-Value&lt;br /&gt;
&lt;br /&gt;
== Reverse engineering resources. ==&lt;br /&gt;
&lt;br /&gt;
* The MeerK40t project has done some initial work reverse engineering the Moshiboard. https://github.com/meerk40t/moshi&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
&lt;br /&gt;
== Official ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.moshidraw.com/English/Product/software/ Moshidraw]&lt;br /&gt;
&lt;br /&gt;
== Other Sources ==&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/meerk40t/moshi MeerK40t moshi project] MeerK40t Moshi Project&lt;br /&gt;
* [https://github.com/meerk40t/moshi/wiki MeerK40t moshi wiki] MeerK40t Moshi Wiki&lt;br /&gt;
&lt;br /&gt;
[[category: laser cutting]]&lt;/div&gt;</summary>
		<author><name>edutechwiki_en&gt;Tatarize</name></author>
	</entry>
</feed>