diff --git a/bricks/execall.cs b/bricks/execall.cs
index 0283858..e814117 100644
--- a/bricks/execall.cs
+++ b/bricks/execall.cs
@@ -23,6 +23,7 @@ exec("./outputs/Pixel3.cs");
 exec("./outputs/TextBrick2.cs");
 
 exec("./special/EventGate.cs");
+exec("./special/rom.cs");
 
 exec("./big/cpu1.cs");
 exec("./big/ram8x12.cs");
diff --git a/bricks/gen/execall.cs b/bricks/gen/execall.cs
index 837f791..e494f06 100644
--- a/bricks/gen/execall.cs
+++ b/bricks/gen/execall.cs
@@ -271,3 +271,4 @@ exec("./newcode/Demux 5 Bit.cs");
 exec("./newcode/Demux 5 Bit Vertical.cs");
 exec("./newcode/Demux 6 Bit.cs");
 exec("./newcode/Demux 6 Bit Vertical.cs");
+exec("./newcode/ROM 16x16.cs");
diff --git a/bricks/gen/newbricks/ROM 16x16.blb b/bricks/gen/newbricks/ROM 16x16.blb
new file mode 100644
index 0000000..3003d38
--- /dev/null
+++ b/bricks/gen/newbricks/ROM 16x16.blb	
@@ -0,0 +1,1220 @@
+16 16 1
+SPECIAL
+
+bbbbbbbbbbbbbbbb
+
+bbbbbbbbbbbbbbbb
+
+bbbbbbbbbbbbbbbb
+
+bbbbbbbbbbbbbbbb
+
+bbbbbbbbbbbbbbbb
+
+bbbbbbbbbbbbbbbb
+
+bbbbbbbbbbbbbbbb
+
+bbbbbbbbbbbbbbbb
+
+bbbbbbbbbbbbbbbb
+
+bbbbbbbbbbbbbbbb
+
+bbbbbbbbbbbbbbbb
+
+bbbbbbbbbbbbbbbb
+
+bbbbbbbbbbbbbbbb
+
+bbbbbbbbbbbbbbbb
+
+bbbbbbbbbbbbbbbb
+
+bbbbbbbbbbbbbbbb
+
+1
+
+0 0 0
+16 16 1
+COVERAGE:
+1 : 256
+1 : 256
+1 : 16
+1 : 16
+1 : 16
+1 : 16
+----------------top quads:
+1
+
+TEX:PRINT
+POSITION:
+8 8 0.5
+8 -8 0.5
+-8 -8 0.5
+-8 8 0.5
+UV COORDS:
+1 0
+1 1
+0 1
+0 0
+NORMALS:
+0 0 1
+0 0 1
+0 0 1
+0 0 1
+----------------bottom quads:
+5
+
+TEX:BOTTOMLOOP
+POSITION:
+7.5 -7.5 -0.5
+7.5 7.5 -0.5
+-7.5 7.5 -0.5
+-7.5 -7.5 -0.5
+UV COORDS:
+0 0
+0 15
+15 15
+15 0
+NORMALS:
+0 0 -1
+0 0 -1
+0 0 -1
+0 0 -1
+
+TEX:BOTTOMEDGE
+POSITION:
+-8 -8 -0.5
+8 -8 -0.5
+7.5 -7.5 -0.5
+-7.5 -7.5 -0.5
+UV COORDS:
+-0.5 0
+15.5 0
+15 0.5
+0 0.5
+NORMALS:
+0 0 -1
+0 0 -1
+0 0 -1
+0 0 -1
+
+TEX:BOTTOMEDGE
+POSITION:
+8 8 -0.5
+-8 8 -0.5
+-7.5 7.5 -0.5
+7.5 7.5 -0.5
+UV COORDS:
+-0.5 0
+15.5 0
+15 0.5
+0 0.5
+NORMALS:
+0 0 -1
+0 0 -1
+0 0 -1
+0 0 -1
+
+TEX:BOTTOMEDGE
+POSITION:
+8 -8 -0.5
+8 8 -0.5
+7.5 7.5 -0.5
+7.5 -7.5 -0.5
+UV COORDS:
+-0.5 0
+15.5 0
+15 0.5
+0 0.5
+NORMALS:
+0 0 -1
+0 0 -1
+0 0 -1
+0 0 -1
+
+TEX:BOTTOMEDGE
+POSITION:
+-8 8 -0.5
+-8 -8 -0.5
+-7.5 -7.5 -0.5
+-7.5 7.5 -0.5
+UV COORDS:
+-0.5 0
+15.5 0
+15 0.5
+0 0.5
+NORMALS:
+0 0 -1
+0 0 -1
+0 0 -1
+0 0 -1
+----------------north quads:
+6
+
+TEX:SIDE
+POSITION:
+-8 8 0.5
+-8 8 -0.5
+8 8 -0.5
+8 8 0.5
+UV COORDS:
+0.981201171875 -0.0859375
+0.981201171875 1.0859375
+0.018798828125 1.0859375
+0.018798828125 -0.0859375
+NORMALS:
+0 1 0
+0 1 0
+0 1 0
+0 1 0
+
+TEX:SIDE
+POSITION:
+7.82 8.25 -0.24
+7.18 8.25 -0.24
+7.1 8 -0.3
+7.9 8 -0.3
+UV COORDS:
+0.5 0.5
+0.5 0.5
+0.5 0.5
+0.5 0.5
+COLORS:
+1 1 1 1
+1 1 1 1
+1 1 1 1
+1 1 1 1
+NORMALS:
+-0 0.095561 -0.995424
+-0 0.095561 -0.995424
+-0 0.095561 -0.995424
+-0 0.095561 -0.995424
+
+TEX:SIDE
+POSITION:
+7.82 8.25 -0.24
+7.82 8.25 0.24
+7.18 8.25 0.24
+7.18 8.25 -0.24
+UV COORDS:
+0.5 0.5
+0.5 0.5
+0.5 0.5
+0.5 0.5
+COLORS:
+1 1 1 1
+1 1 1 1
+1 1 1 1
+1 1 1 1
+NORMALS:
+0 1 0
+0 1 0
+0 1 0
+0 1 0
+
+TEX:SIDE
+POSITION:
+7.18 8.25 0.24
+7.82 8.25 0.24
+7.9 8 0.3
+7.1 8 0.3
+UV COORDS:
+0.5 0.5
+0.5 0.5
+0.5 0.5
+0.5 0.5
+COLORS:
+1 1 1 1
+1 1 1 1
+1 1 1 1
+1 1 1 1
+NORMALS:
+-0 0.095561 0.995424
+-0 0.095561 0.995424
+-0 0.095561 0.995424
+-0 0.095561 0.995424
+
+TEX:SIDE
+POSITION:
+7.18 8.25 -0.24
+7.18 8.25 0.24
+7.1 8 0.3
+7.1 8 -0.3
+UV COORDS:
+0.5 0.5
+0.5 0.5
+0.5 0.5
+0.5 0.5
+COLORS:
+1 1 1 1
+1 1 1 1
+1 1 1 1
+1 1 1 1
+NORMALS:
+-0.952424 0.304776 0
+-0.952424 0.304776 0
+-0.952424 0.304776 0
+-0.952424 0.304776 0
+
+TEX:SIDE
+POSITION:
+7.82 8.25 0.24
+7.82 8.25 -0.24
+7.9 8 -0.3
+7.9 8 0.3
+UV COORDS:
+0.5 0.5
+0.5 0.5
+0.5 0.5
+0.5 0.5
+COLORS:
+1 1 1 1
+1 1 1 1
+1 1 1 1
+1 1 1 1
+NORMALS:
+0.952424 0.304776 0
+0.952424 0.304776 0
+0.952424 0.304776 0
+0.952424 0.304776 0
+----------------east quads:
+1
+
+TEX:SIDE
+POSITION:
+8 -8 0.5
+8 8 0.5
+8 8 -0.5
+8 -8 -0.5
+UV COORDS:
+0.018798828125 -0.0859375
+0.981201171875 -0.0859375
+0.981201171875 1.0859375
+0.018798828125 1.0859375
+NORMALS:
+1 0 0
+1 0 0
+1 0 0
+1 0 0
+----------------south quads:
+41
+
+TEX:SIDE
+POSITION:
+8 -8 0.5
+8 -8 -0.5
+-8 -8 -0.5
+-8 -8 0.5
+UV COORDS:
+0.981201171875 -0.0859375
+0.981201171875 1.0859375
+0.018798828125 1.0859375
+0.018798828125 -0.0859375
+NORMALS:
+0 -1 0
+0 -1 0
+0 -1 0
+0 -1 0
+
+TEX:SIDE
+POSITION:
+7.1 -8.14 -0.3
+7.9 -8.14 -0.3
+7.9 -8 -0.3
+7.1 -8 -0.3
+UV COORDS:
+0.5 0.5
+0.5 0.5
+0.5 0.5
+0.5 0.5
+COLORS:
+1 1 1 1
+1 1 1 1
+1 1 1 1
+1 1 1 1
+NORMALS:
+0 0 -1
+0 0 -1
+0 0 -1
+0 0 -1
+
+TEX:SIDE
+POSITION:
+7.1 -8.14 -0.3
+7.1 -8.14 0.3
+7.9 -8.14 0.3
+7.9 -8.14 -0.3
+UV COORDS:
+0.5 0.5
+0.5 0.5
+0.5 0.5
+0.5 0.5
+COLORS:
+1 1 1 1
+1 1 1 1
+1 1 1 1
+1 1 1 1
+NORMALS:
+0 -1 0
+0 -1 0
+0 -1 0
+0 -1 0
+
+TEX:SIDE
+POSITION:
+7.9 -8.14 0.3
+7.1 -8.14 0.3
+7.1 -8 0.3
+7.9 -8 0.3
+UV COORDS:
+0.5 0.5
+0.5 0.5
+0.5 0.5
+0.5 0.5
+COLORS:
+1 1 1 1
+1 1 1 1
+1 1 1 1
+1 1 1 1
+NORMALS:
+0 0 1
+0 0 1
+0 0 1
+0 0 1
+
+TEX:SIDE
+POSITION:
+7.9 -8.14 -0.3
+7.9 -8.14 0.3
+7.9 -8 0.3
+7.9 -8 -0.3
+UV COORDS:
+0.5 0.5
+0.5 0.5
+0.5 0.5
+0.5 0.5
+COLORS:
+1 1 1 1
+1 1 1 1
+1 1 1 1
+1 1 1 1
+NORMALS:
+1 0 0
+1 0 0
+1 0 0
+1 0 0
+
+TEX:SIDE
+POSITION:
+7.1 -8.14 0.3
+7.1 -8.14 -0.3
+7.1 -8 -0.3
+7.1 -8 0.3
+UV COORDS:
+0.5 0.5
+0.5 0.5
+0.5 0.5
+0.5 0.5
+COLORS:
+1 1 1 1
+1 1 1 1
+1 1 1 1
+1 1 1 1
+NORMALS:
+-1 0 0
+-1 0 0
+-1 0 0
+-1 0 0
+
+TEX:SIDE
+POSITION:
+6.1 -8.14 -0.3
+6.9 -8.14 -0.3
+6.9 -8 -0.3
+6.1 -8 -0.3
+UV COORDS:
+0.5 0.5
+0.5 0.5
+0.5 0.5
+0.5 0.5
+COLORS:
+1 1 1 1
+1 1 1 1
+1 1 1 1
+1 1 1 1
+NORMALS:
+0 0 -1
+0 0 -1
+0 0 -1
+0 0 -1
+
+TEX:SIDE
+POSITION:
+6.1 -8.14 -0.3
+6.1 -8.14 0.3
+6.9 -8.14 0.3
+6.9 -8.14 -0.3
+UV COORDS:
+0.5 0.5
+0.5 0.5
+0.5 0.5
+0.5 0.5
+COLORS:
+1 1 1 1
+1 1 1 1
+1 1 1 1
+1 1 1 1
+NORMALS:
+0 -1 0
+0 -1 0
+0 -1 0
+0 -1 0
+
+TEX:SIDE
+POSITION:
+6.9 -8.14 0.3
+6.1 -8.14 0.3
+6.1 -8 0.3
+6.9 -8 0.3
+UV COORDS:
+0.5 0.5
+0.5 0.5
+0.5 0.5
+0.5 0.5
+COLORS:
+1 1 1 1
+1 1 1 1
+1 1 1 1
+1 1 1 1
+NORMALS:
+0 0 1
+0 0 1
+0 0 1
+0 0 1
+
+TEX:SIDE
+POSITION:
+6.9 -8.14 -0.3
+6.9 -8.14 0.3
+6.9 -8 0.3
+6.9 -8 -0.3
+UV COORDS:
+0.5 0.5
+0.5 0.5
+0.5 0.5
+0.5 0.5
+COLORS:
+1 1 1 1
+1 1 1 1
+1 1 1 1
+1 1 1 1
+NORMALS:
+1 0 0
+1 0 0
+1 0 0
+1 0 0
+
+TEX:SIDE
+POSITION:
+6.1 -8.14 0.3
+6.1 -8.14 -0.3
+6.1 -8 -0.3
+6.1 -8 0.3
+UV COORDS:
+0.5 0.5
+0.5 0.5
+0.5 0.5
+0.5 0.5
+COLORS:
+1 1 1 1
+1 1 1 1
+1 1 1 1
+1 1 1 1
+NORMALS:
+-1 0 0
+-1 0 0
+-1 0 0
+-1 0 0
+
+TEX:SIDE
+POSITION:
+5.1 -8.14 -0.3
+5.9 -8.14 -0.3
+5.9 -8 -0.3
+5.1 -8 -0.3
+UV COORDS:
+0.5 0.5
+0.5 0.5
+0.5 0.5
+0.5 0.5
+COLORS:
+1 1 1 1
+1 1 1 1
+1 1 1 1
+1 1 1 1
+NORMALS:
+0 0 -1
+0 0 -1
+0 0 -1
+0 0 -1
+
+TEX:SIDE
+POSITION:
+5.1 -8.14 -0.3
+5.1 -8.14 0.3
+5.9 -8.14 0.3
+5.9 -8.14 -0.3
+UV COORDS:
+0.5 0.5
+0.5 0.5
+0.5 0.5
+0.5 0.5
+COLORS:
+1 1 1 1
+1 1 1 1
+1 1 1 1
+1 1 1 1
+NORMALS:
+0 -1 0
+0 -1 0
+0 -1 0
+0 -1 0
+
+TEX:SIDE
+POSITION:
+5.9 -8.14 0.3
+5.1 -8.14 0.3
+5.1 -8 0.3
+5.9 -8 0.3
+UV COORDS:
+0.5 0.5
+0.5 0.5
+0.5 0.5
+0.5 0.5
+COLORS:
+1 1 1 1
+1 1 1 1
+1 1 1 1
+1 1 1 1
+NORMALS:
+0 0 1
+0 0 1
+0 0 1
+0 0 1
+
+TEX:SIDE
+POSITION:
+5.9 -8.14 -0.3
+5.9 -8.14 0.3
+5.9 -8 0.3
+5.9 -8 -0.3
+UV COORDS:
+0.5 0.5
+0.5 0.5
+0.5 0.5
+0.5 0.5
+COLORS:
+1 1 1 1
+1 1 1 1
+1 1 1 1
+1 1 1 1
+NORMALS:
+1 0 0
+1 0 0
+1 0 0
+1 0 0
+
+TEX:SIDE
+POSITION:
+5.1 -8.14 0.3
+5.1 -8.14 -0.3
+5.1 -8 -0.3
+5.1 -8 0.3
+UV COORDS:
+0.5 0.5
+0.5 0.5
+0.5 0.5
+0.5 0.5
+COLORS:
+1 1 1 1
+1 1 1 1
+1 1 1 1
+1 1 1 1
+NORMALS:
+-1 0 0
+-1 0 0
+-1 0 0
+-1 0 0
+
+TEX:SIDE
+POSITION:
+4.1 -8.14 -0.3
+4.9 -8.14 -0.3
+4.9 -8 -0.3
+4.1 -8 -0.3
+UV COORDS:
+0.5 0.5
+0.5 0.5
+0.5 0.5
+0.5 0.5
+COLORS:
+1 1 1 1
+1 1 1 1
+1 1 1 1
+1 1 1 1
+NORMALS:
+0 0 -1
+0 0 -1
+0 0 -1
+0 0 -1
+
+TEX:SIDE
+POSITION:
+4.1 -8.14 -0.3
+4.1 -8.14 0.3
+4.9 -8.14 0.3
+4.9 -8.14 -0.3
+UV COORDS:
+0.5 0.5
+0.5 0.5
+0.5 0.5
+0.5 0.5
+COLORS:
+1 1 1 1
+1 1 1 1
+1 1 1 1
+1 1 1 1
+NORMALS:
+0 -1 0
+0 -1 0
+0 -1 0
+0 -1 0
+
+TEX:SIDE
+POSITION:
+4.9 -8.14 0.3
+4.1 -8.14 0.3
+4.1 -8 0.3
+4.9 -8 0.3
+UV COORDS:
+0.5 0.5
+0.5 0.5
+0.5 0.5
+0.5 0.5
+COLORS:
+1 1 1 1
+1 1 1 1
+1 1 1 1
+1 1 1 1
+NORMALS:
+0 0 1
+0 0 1
+0 0 1
+0 0 1
+
+TEX:SIDE
+POSITION:
+4.9 -8.14 -0.3
+4.9 -8.14 0.3
+4.9 -8 0.3
+4.9 -8 -0.3
+UV COORDS:
+0.5 0.5
+0.5 0.5
+0.5 0.5
+0.5 0.5
+COLORS:
+1 1 1 1
+1 1 1 1
+1 1 1 1
+1 1 1 1
+NORMALS:
+1 0 0
+1 0 0
+1 0 0
+1 0 0
+
+TEX:SIDE
+POSITION:
+4.1 -8.14 0.3
+4.1 -8.14 -0.3
+4.1 -8 -0.3
+4.1 -8 0.3
+UV COORDS:
+0.5 0.5
+0.5 0.5
+0.5 0.5
+0.5 0.5
+COLORS:
+1 1 1 1
+1 1 1 1
+1 1 1 1
+1 1 1 1
+NORMALS:
+-1 0 0
+-1 0 0
+-1 0 0
+-1 0 0
+
+TEX:SIDE
+POSITION:
+3.1 -8.14 -0.3
+3.9 -8.14 -0.3
+3.9 -8 -0.3
+3.1 -8 -0.3
+UV COORDS:
+0.5 0.5
+0.5 0.5
+0.5 0.5
+0.5 0.5
+COLORS:
+1 1 1 1
+1 1 1 1
+1 1 1 1
+1 1 1 1
+NORMALS:
+0 0 -1
+0 0 -1
+0 0 -1
+0 0 -1
+
+TEX:SIDE
+POSITION:
+3.1 -8.14 -0.3
+3.1 -8.14 0.3
+3.9 -8.14 0.3
+3.9 -8.14 -0.3
+UV COORDS:
+0.5 0.5
+0.5 0.5
+0.5 0.5
+0.5 0.5
+COLORS:
+1 1 1 1
+1 1 1 1
+1 1 1 1
+1 1 1 1
+NORMALS:
+0 -1 0
+0 -1 0
+0 -1 0
+0 -1 0
+
+TEX:SIDE
+POSITION:
+3.9 -8.14 0.3
+3.1 -8.14 0.3
+3.1 -8 0.3
+3.9 -8 0.3
+UV COORDS:
+0.5 0.5
+0.5 0.5
+0.5 0.5
+0.5 0.5
+COLORS:
+1 1 1 1
+1 1 1 1
+1 1 1 1
+1 1 1 1
+NORMALS:
+0 0 1
+0 0 1
+0 0 1
+0 0 1
+
+TEX:SIDE
+POSITION:
+3.9 -8.14 -0.3
+3.9 -8.14 0.3
+3.9 -8 0.3
+3.9 -8 -0.3
+UV COORDS:
+0.5 0.5
+0.5 0.5
+0.5 0.5
+0.5 0.5
+COLORS:
+1 1 1 1
+1 1 1 1
+1 1 1 1
+1 1 1 1
+NORMALS:
+1 0 0
+1 0 0
+1 0 0
+1 0 0
+
+TEX:SIDE
+POSITION:
+3.1 -8.14 0.3
+3.1 -8.14 -0.3
+3.1 -8 -0.3
+3.1 -8 0.3
+UV COORDS:
+0.5 0.5
+0.5 0.5
+0.5 0.5
+0.5 0.5
+COLORS:
+1 1 1 1
+1 1 1 1
+1 1 1 1
+1 1 1 1
+NORMALS:
+-1 0 0
+-1 0 0
+-1 0 0
+-1 0 0
+
+TEX:SIDE
+POSITION:
+2.1 -8.14 -0.3
+2.9 -8.14 -0.3
+2.9 -8 -0.3
+2.1 -8 -0.3
+UV COORDS:
+0.5 0.5
+0.5 0.5
+0.5 0.5
+0.5 0.5
+COLORS:
+1 1 1 1
+1 1 1 1
+1 1 1 1
+1 1 1 1
+NORMALS:
+0 0 -1
+0 0 -1
+0 0 -1
+0 0 -1
+
+TEX:SIDE
+POSITION:
+2.1 -8.14 -0.3
+2.1 -8.14 0.3
+2.9 -8.14 0.3
+2.9 -8.14 -0.3
+UV COORDS:
+0.5 0.5
+0.5 0.5
+0.5 0.5
+0.5 0.5
+COLORS:
+1 1 1 1
+1 1 1 1
+1 1 1 1
+1 1 1 1
+NORMALS:
+0 -1 0
+0 -1 0
+0 -1 0
+0 -1 0
+
+TEX:SIDE
+POSITION:
+2.9 -8.14 0.3
+2.1 -8.14 0.3
+2.1 -8 0.3
+2.9 -8 0.3
+UV COORDS:
+0.5 0.5
+0.5 0.5
+0.5 0.5
+0.5 0.5
+COLORS:
+1 1 1 1
+1 1 1 1
+1 1 1 1
+1 1 1 1
+NORMALS:
+0 0 1
+0 0 1
+0 0 1
+0 0 1
+
+TEX:SIDE
+POSITION:
+2.9 -8.14 -0.3
+2.9 -8.14 0.3
+2.9 -8 0.3
+2.9 -8 -0.3
+UV COORDS:
+0.5 0.5
+0.5 0.5
+0.5 0.5
+0.5 0.5
+COLORS:
+1 1 1 1
+1 1 1 1
+1 1 1 1
+1 1 1 1
+NORMALS:
+1 0 0
+1 0 0
+1 0 0
+1 0 0
+
+TEX:SIDE
+POSITION:
+2.1 -8.14 0.3
+2.1 -8.14 -0.3
+2.1 -8 -0.3
+2.1 -8 0.3
+UV COORDS:
+0.5 0.5
+0.5 0.5
+0.5 0.5
+0.5 0.5
+COLORS:
+1 1 1 1
+1 1 1 1
+1 1 1 1
+1 1 1 1
+NORMALS:
+-1 0 0
+-1 0 0
+-1 0 0
+-1 0 0
+
+TEX:SIDE
+POSITION:
+1.1 -8.14 -0.3
+1.9 -8.14 -0.3
+1.9 -8 -0.3
+1.1 -8 -0.3
+UV COORDS:
+0.5 0.5
+0.5 0.5
+0.5 0.5
+0.5 0.5
+COLORS:
+1 1 1 1
+1 1 1 1
+1 1 1 1
+1 1 1 1
+NORMALS:
+0 0 -1
+0 0 -1
+0 0 -1
+0 0 -1
+
+TEX:SIDE
+POSITION:
+1.1 -8.14 -0.3
+1.1 -8.14 0.3
+1.9 -8.14 0.3
+1.9 -8.14 -0.3
+UV COORDS:
+0.5 0.5
+0.5 0.5
+0.5 0.5
+0.5 0.5
+COLORS:
+1 1 1 1
+1 1 1 1
+1 1 1 1
+1 1 1 1
+NORMALS:
+0 -1 0
+0 -1 0
+0 -1 0
+0 -1 0
+
+TEX:SIDE
+POSITION:
+1.9 -8.14 0.3
+1.1 -8.14 0.3
+1.1 -8 0.3
+1.9 -8 0.3
+UV COORDS:
+0.5 0.5
+0.5 0.5
+0.5 0.5
+0.5 0.5
+COLORS:
+1 1 1 1
+1 1 1 1
+1 1 1 1
+1 1 1 1
+NORMALS:
+0 0 1
+0 0 1
+0 0 1
+0 0 1
+
+TEX:SIDE
+POSITION:
+1.9 -8.14 -0.3
+1.9 -8.14 0.3
+1.9 -8 0.3
+1.9 -8 -0.3
+UV COORDS:
+0.5 0.5
+0.5 0.5
+0.5 0.5
+0.5 0.5
+COLORS:
+1 1 1 1
+1 1 1 1
+1 1 1 1
+1 1 1 1
+NORMALS:
+1 0 0
+1 0 0
+1 0 0
+1 0 0
+
+TEX:SIDE
+POSITION:
+1.1 -8.14 0.3
+1.1 -8.14 -0.3
+1.1 -8 -0.3
+1.1 -8 0.3
+UV COORDS:
+0.5 0.5
+0.5 0.5
+0.5 0.5
+0.5 0.5
+COLORS:
+1 1 1 1
+1 1 1 1
+1 1 1 1
+1 1 1 1
+NORMALS:
+-1 0 0
+-1 0 0
+-1 0 0
+-1 0 0
+
+TEX:SIDE
+POSITION:
+0.1 -8.14 -0.3
+0.9 -8.14 -0.3
+0.9 -8 -0.3
+0.1 -8 -0.3
+UV COORDS:
+0.5 0.5
+0.5 0.5
+0.5 0.5
+0.5 0.5
+COLORS:
+1 1 1 1
+1 1 1 1
+1 1 1 1
+1 1 1 1
+NORMALS:
+0 0 -1
+0 0 -1
+0 0 -1
+0 0 -1
+
+TEX:SIDE
+POSITION:
+0.1 -8.14 -0.3
+0.1 -8.14 0.3
+0.9 -8.14 0.3
+0.9 -8.14 -0.3
+UV COORDS:
+0.5 0.5
+0.5 0.5
+0.5 0.5
+0.5 0.5
+COLORS:
+1 1 1 1
+1 1 1 1
+1 1 1 1
+1 1 1 1
+NORMALS:
+0 -1 0
+0 -1 0
+0 -1 0
+0 -1 0
+
+TEX:SIDE
+POSITION:
+0.9 -8.14 0.3
+0.1 -8.14 0.3
+0.1 -8 0.3
+0.9 -8 0.3
+UV COORDS:
+0.5 0.5
+0.5 0.5
+0.5 0.5
+0.5 0.5
+COLORS:
+1 1 1 1
+1 1 1 1
+1 1 1 1
+1 1 1 1
+NORMALS:
+0 0 1
+0 0 1
+0 0 1
+0 0 1
+
+TEX:SIDE
+POSITION:
+0.9 -8.14 -0.3
+0.9 -8.14 0.3
+0.9 -8 0.3
+0.9 -8 -0.3
+UV COORDS:
+0.5 0.5
+0.5 0.5
+0.5 0.5
+0.5 0.5
+COLORS:
+1 1 1 1
+1 1 1 1
+1 1 1 1
+1 1 1 1
+NORMALS:
+1 0 0
+1 0 0
+1 0 0
+1 0 0
+
+TEX:SIDE
+POSITION:
+0.1 -8.14 0.3
+0.1 -8.14 -0.3
+0.1 -8 -0.3
+0.1 -8 0.3
+UV COORDS:
+0.5 0.5
+0.5 0.5
+0.5 0.5
+0.5 0.5
+COLORS:
+1 1 1 1
+1 1 1 1
+1 1 1 1
+1 1 1 1
+NORMALS:
+-1 0 0
+-1 0 0
+-1 0 0
+-1 0 0
+----------------west quads:
+1
+
+TEX:SIDE
+POSITION:
+-8 -8 -0.5
+-8 8 -0.5
+-8 8 0.5
+-8 -8 0.5
+UV COORDS:
+0.981201171875 1.0859375
+0.018798828125 1.0859375
+0.018798828125 -0.0859375
+0.981201171875 -0.0859375
+NORMALS:
+-1 0 0
+-1 0 0
+-1 0 0
+-1 0 0
+----------------omni quads:
+0
\ No newline at end of file
diff --git a/bricks/gen/newcode/ROM 16x16.cs b/bricks/gen/newcode/ROM 16x16.cs
new file mode 100644
index 0000000..f872bb1
--- /dev/null
+++ b/bricks/gen/newcode/ROM 16x16.cs	
@@ -0,0 +1,118 @@
+
+datablock fxDtsBrickData(LogicGate_Rom16x16_Data){
+	brickFile = $LuaLogic::Path @ "bricks/gen/newbricks/ROM 16x16.blb";
+	iconName = $LuaLogic::Path @ "bricks/gen/newicons/ROM 16x16";
+	
+	category = "Logic Bricks";
+	subCategory = "Special I/O";
+	uiName = "ROM 16x16";
+	logicUIName = "ROM 16x16";
+	logicUIDesc = "";
+	
+	hasPrint = 1;
+	printAspectRatio = "Logic";
+	
+	logicBrickSize = "16 16 1";
+	orientationFix = 3;
+	
+	isLogic = true;
+	isLogicGate = true;
+	isLogicInput = false;
+	
+	logicInit = 
+		"return function(gate) " @
+		"	gate.romdata = {} " @
+		"	for i = 0, 255 do " @
+		"		gate.romdata[i] = false " @
+		"	end " @
+		"end"
+	;
+	logicInput = 
+		"return function(gate, args) " @
+		"	local data = args[1] " @
+		"	for i = 1, #data do " @
+		"		local c = data:sub(i, i) " @
+		"		gate.romdata[i-1] = (c==\"1\") " @
+		"	end " @
+		"	Gate.queue(gate, 0) " @
+		"end"
+	;
+	logicUpdate = 
+		"return function(gate) " @
+		"	local addr = (Gate.getportstate(gate, 1) and 1 or 0) " @
+		"		+ (Gate.getportstate(gate, 2) and 2 or 0) " @
+		"		+ (Gate.getportstate(gate, 3) and 4 or 0) " @
+		"		+ (Gate.getportstate(gate, 4) and 8 or 0) " @
+		"		+ (Gate.getportstate(gate, 5) and 16 or 0) " @
+		"		+ (Gate.getportstate(gate, 6) and 32 or 0) " @
+		"		+ (Gate.getportstate(gate, 7) and 64 or 0) " @
+		"		+ (Gate.getportstate(gate, 8) and 128 or 0) " @
+		"	Gate.setportstate(gate, 9, gate.romdata[addr]) " @
+		"end"
+	;
+	logicGlobal = "";
+	
+	numLogicPorts = 9;
+	
+	isLogicRom = true;
+	logicRomY = 16;
+	logicRomX = 16;
+	
+	logicPortType[0] = 1;
+	logicPortPos[0] = "15 -15 0";
+	logicPortDir[0] = 3;
+	logicPortUIName[0] = "Addr0";
+	logicPortCauseUpdate[0] = true;
+	
+	logicPortType[1] = 1;
+	logicPortPos[1] = "13 -15 0";
+	logicPortDir[1] = 3;
+	logicPortUIName[1] = "Addr1";
+	logicPortCauseUpdate[1] = true;
+	
+	logicPortType[2] = 1;
+	logicPortPos[2] = "11 -15 0";
+	logicPortDir[2] = 3;
+	logicPortUIName[2] = "Addr2";
+	logicPortCauseUpdate[2] = true;
+	
+	logicPortType[3] = 1;
+	logicPortPos[3] = "9 -15 0";
+	logicPortDir[3] = 3;
+	logicPortUIName[3] = "Addr3";
+	logicPortCauseUpdate[3] = true;
+	
+	logicPortType[4] = 1;
+	logicPortPos[4] = "7 -15 0";
+	logicPortDir[4] = 3;
+	logicPortUIName[4] = "Addr4";
+	logicPortCauseUpdate[4] = true;
+	
+	logicPortType[5] = 1;
+	logicPortPos[5] = "5 -15 0";
+	logicPortDir[5] = 3;
+	logicPortUIName[5] = "Addr5";
+	logicPortCauseUpdate[5] = true;
+	
+	logicPortType[6] = 1;
+	logicPortPos[6] = "3 -15 0";
+	logicPortDir[6] = 3;
+	logicPortUIName[6] = "Addr6";
+	logicPortCauseUpdate[6] = true;
+	
+	logicPortType[7] = 1;
+	logicPortPos[7] = "1 -15 0";
+	logicPortDir[7] = 3;
+	logicPortUIName[7] = "Addr7";
+	logicPortCauseUpdate[7] = true;
+	
+	logicPortType[8] = 0;
+	logicPortPos[8] = "15 15 0";
+	logicPortDir[8] = 1;
+	logicPortUIName[8] = "Out";
+	
+};
+
+function LogicGate_Rom16x16_Data::Logic_onAdd(%data, %brick) {
+	lualogic_rom_updatedata(%brick);
+}
diff --git a/bricks/gen/newicons/ROM 16x16.png b/bricks/gen/newicons/ROM 16x16.png
new file mode 100644
index 0000000..afaff61
Binary files /dev/null and b/bricks/gen/newicons/ROM 16x16.png differ
diff --git a/bricks/inputs/keyboard.cs b/bricks/inputs/keyboard.cs
index 190333d..1d258aa 100644
--- a/bricks/inputs/keyboard.cs
+++ b/bricks/inputs/keyboard.cs
@@ -2,7 +2,7 @@
 datablock fxDTSBrickData(LogicGate_Keyboard_Data){
 	brickFile = $LuaLogic::Path @ "bricks/blb/keyboardgate.blb";
 	category = "Logic Bricks";
-	subCategory = "Inputs";
+	subCategory = "Special I/O";
 	uiName = "Input Keyboard";
 	iconName = $LuaLogic::Path @ "icons/Input Keyboard";
 	orientationFix = 3;
diff --git a/bricks/special/rom.cs b/bricks/special/rom.cs
new file mode 100644
index 0000000..7aa697f
--- /dev/null
+++ b/bricks/special/rom.cs
@@ -0,0 +1,150 @@
+
+function rom_reload() {
+	exec($Con::File);
+	exec($LuaLogic::Path @ "bricks/gen/newcode/ROM 16x16.cs");
+}
+
+package lualogic_rom_update {
+	function fxDtsBrick::onPlant(%brick) {
+		parent::onPlant(%brick);
+		lualogic_rom_createbrick(%brick);
+	}
+	function fxDtsBrick::onLoadPlant(%brick) {
+		parent::onLoadPlant(%brick);
+		lualogic_rom_createbrick(%brick);
+	}
+	function fxDTSBrick::onDeath(%brick) {
+		parent::onDeath(%brick);
+		if(%brick.lualogic_rom_affects) {
+			lualogic_rom_deletebrick(%brick);
+		}
+	}
+	function fxDTSBrick::onRemove(%brick) {
+		parent::onRemove(%brick);
+		if(%brick.lualogic_rom_affects) {
+			lualogic_rom_deletebrick(%brick);
+		}
+	}
+	function fxDtsBrick::setRaycasting(%brick, %val) {
+		parent::setRaycasting(%brick, %val);
+		if(%brick.lualogic_rom_affects) {
+			lualogic_rom_updatercbrick(%brick);
+		}
+	}
+};
+schedule(0, 0, activatePackage, lualogic_rom_update);
+
+// lualogic_rom_affects: whether this brick is on top of a rom brick
+// lualogic_rom_is: whether this brick is a rom brick
+
+function lualogic_rom_createbrick(%brick) {
+	%brick.lualogic_rom_delete = 0;
+	
+	//if rom: set is, set affects on any up bricks, compute data
+	if(%brick.getdatablock().isLogicRom) {
+		%brick.lualogic_rom_is = 1;
+		
+		%nub = 0;
+		for(%i=0; %i<%nub; %i++) {
+			%upbrick = %brick.getUpBrick(%i);
+			%upbrick.lualogic_rom_affects = 1;
+		}
+		
+		lualogic_rom_updatedata(%brick);
+	}
+	
+	// update any rom down bricks; if there are any, set affects
+	%ndb = %brick.getNumDownBricks();
+	for(%i=0; %i<%ndb; %i++) {
+		%downbrick = %brick.getDownBrick(%i);
+		if(%downbrick.lualogic_rom_is) {
+			%brick.lualogic_rom_affects = 1;
+			lualogic_rom_updatedata(%downbrick);
+		}
+	}
+}
+function lualogic_rom_deletebrick(%brick) {
+	// update any rom down bricks
+	%brick.lualogic_rom_delete = 1;
+	%ndb = %brick.getNumDownBricks();
+	for(%i=0; %i<%ndb; %i++) {
+		%downbrick = %brick.getDownBrick(%i);
+		if(%downbrick.lualogic_rom_is) {
+			lualogic_rom_updatedata(%downbrick);
+		}
+	}
+}
+function lualogic_rom_updatercbrick(%brick) {
+	// update any rom down bricks
+	%ndb = %brick.getNumDownBricks();
+	for(%i=0; %i<%ndb; %i++) {
+		%downbrick = %brick.getDownBrick(%i);
+		if(%downbrick.lualogic_rom_is) {
+			lualogic_rom_updatedata(%downbrick);
+		}
+	}
+}
+
+function lualogic_rom_rotate(%pos, %rot) {
+	%x = getWord(%pos, 0);
+	%y = getWord(%pos, 1);
+	%z = getWord(%pos, 2);
+	
+	%rot = %rot % 4;
+	if       (%rot==0) {
+		return %x SPC %y SPC %z;
+	} else if(%rot==1) {
+		return %y SPC -%x SPC %z;
+	} else if(%rot==2) {
+		return -%x SPC -%y SPC %z;
+	} else if(%rot==3) {
+		return -%y SPC %x SPC %z;
+	}
+}
+
+function lualogic_rom_updatedata(%brick) {
+	if(!%brick.lualogic_rom_updatedata_scheduled) {
+		schedule(1, 0, lualogic_rom_updatedata_final, %brick);
+		%brick.lualogic_rom_updatedata_scheduled = 1;
+	}
+}
+
+function lualogic_rom_updatedata_final(%brick) {
+	if(!isObject(%brick) || %brick.lualogic_rom_delete) return;
+	
+	%brick.lualogic_rom_updatedata_scheduled = 0;
+	
+	%data = %brick.getDatablock();
+	
+	%rx = %data.logicRomX;
+	%ry = %data.logicRomY;
+	
+	%brickpos = %brick.getPosition();
+	%rot = (%brick.angleId + 1)%4;
+	
+	%data_str = "";
+	
+	for(%x=0; %x<%rx; %x++) {
+		%line_str = "";
+		for(%y=0; %y<%ry; %y++) {
+			%pos = (%x*0.5 - %rx/4 + 0.25) SPC (%y*0.5 - %ry/4 + 0.25) SPC 0;
+			%pos = lualogic_rom_rotate(%pos, %rot);
+			%pos = vectorAdd(%brickpos, %pos);
+			%ray = containerRaycast(
+				%pos,
+				vectorAdd(%pos, "0 0 0.2"),
+				$TypeMasks::FxBrickObjectType,
+				%brick
+			);
+			%hit = getWord(%ray, 0);
+			if(isObject(%hit) && !%hit.lualogic_rom_delete && %hit.isRaycasting()) {
+				%line_str = %line_str @ "1";
+			} else {
+				%line_str = %line_str @ "0";
+			}
+		}
+		%data_str = %data_str @ %line_str;
+	}
+	
+	lualogic_sendinput(%brick, 1, %data_str);
+}