G-Code is a very good human readable way of representing commands to a 3D printer. Though it is big, many times larger than it needs to be to do its job. I have taken a very close look at this while I write what is going to be the release version of my 3D printer firmware.

Microcontrollers have limited RAM, this is well known. As such G-Code is a huge pain, as it has to be loaded while being used.

My solution is to create a binary control language. As I comment my code to show what works so far, here is a simple outline of my control language, extracted from the comments in its parser source code:
Code:
'Command processor.
'This uses a simple set of byte commands.
{The Commands are one byte folowed by one or two bytes of data.
 The current commands are:
 
 00nnnn = Move X, forward.
 01nnnn = Move Y forward.
 02nnnn = Move Z forward.
 04nnnn = Move X reverse.
 05nnnn = Move Y reverse.
 06nnnn = Move Z reverse.
 08nn   = Set Current X Speed.
 09nn   = Set Current Y Speed.
 0Ann   = Set Current Z Speed.
 0Bnn   = Set Current Extrusion Speed.
 0Fnn   = Set Current Extruder Temperature.

 10 = Zero X.
 11 = Zero Y.
 12 = Zero Z
 14 = Set current X position as Zero.
 15 = Set current Y position as Zero.
 16 = Set current Z position as Zero.
 18nnnn = Set current X position as nnnn.
 19nnnn = Set current Y position as nnnn.
 1Annnn = Set current Z position to nnnn.
 1Cnnnn = Set Maximum X position to nnnn.
 1Dnnnn = Set Maximum Y position to nnnn.
 1Ennnn = Set Maximum Z position to nnnn.

 20nn = Select Extruder.
 21nn = Set Current Feed Rate.
 22nn = Set Heat for current Extruder.

 30 = Set Simulation Mode (does all the X/Y/Z movements, with the extruder turned off).
 31 = UnSet Simulation Mode (back to regular print mode).

 80nnnn = Set repeat counter.
 81nnnn  = Decrease repeat counter by one and go back up to 65535 bytes if repeat counter not zero.
 84nn   = Set small repeat counter.
 85nn   = Decrease Small Repeat Counter and go back up to 255 bytes if small repeat counter is not zero.
  
 F0 = All Stop.
 FF = Print Done (Turn off extruder(s), zero X and Y, move Z to maximum)..

}
Likely this does not show how much is saved. Obviously the more repeated layers the more that is saved.

Here is a commented hex dump of a 57 Byte cube measuring 256 units cubed in this new command language, that works with my 3D printer:
Code:
CUBE: HEX DUMP Commented.
21:00:22:72:  ;Setup extruder, wait for heatup.
10:11:12:     ;Zero XYZ.
00:00:10:     ;Set X start pos .
01:00:10:     ;Set y Start Position.


80:00:40:     ;Setup number of repeating layers (64 in this).
;Next draw a solid square:
21:7A:        ;Start extruder.
84:40:        ;Setup small repeat 64 times.
00:01:00:     ;Draw 256 steps X.
01:00:04:     ;4 steps Plus Y.
04:01:00:     ;256 Steps negitive X.
01:00:04:     ;4 steps plus Y.
85:0C:        ;Small Repeat last 12 bytes 64 times.
;Now add a layer.
02:00:08:     ;Raise Z by 8 steps.
84:40:        ;Setup small repeat 64 times.
00:01:00:     ;Draw 256 steps X.
05:00:04:     ;4 steps -Y.
04:01:00:     ;256 Steps -X.
05:00:04:     ;4 steps -Y.
85:0C:        ;Small Repeat last 12 bytes 64 times.
81:00:23      ;Repeat last 35 bytes, 64 times.

FF            ;Print complete.
Pretty good.

Now the calibration cube that some 3D printer companies provide (with the 5 steps diagonally by five teared steps), that is only 861 bytes in size using this binary command language. That is 54 times smaller than the G-Code version.

The idea is to create a program to convert G-Code into this new command language, to get started. Then eventually create slicers that directly produce this command language instead of G-Code. Either way it will not take long to get this into use.


This coding format is open to anyone to use, no warranty of any kind.