diff --git a/ROM.bin b/ROM.bin
index 08c16f2..846e1ee 100644
--- a/ROM.bin
+++ b/ROM.bin
@@ -63,101 +63,101 @@ v3.0 hex words addressed
01e8: 0000c004 0000010e 001401c0 00000030 40000000 40000000 40000000 40000000
01f0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 0000004e 00000032
01f8: 0000c004 0000010e 001401c0 00000030 40000000 40000000 40000000 40000000
-0200: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
-0208: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-0210: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
-0218: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-0220: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
-0228: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-0230: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
-0238: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-0240: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
-0248: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-0250: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
-0258: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-0260: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
-0268: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-0270: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
-0278: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-0280: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
-0288: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-0290: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
-0298: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-02a0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
-02a8: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-02b0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
-02b8: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-02c0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
-02c8: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-02d0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
-02d8: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-02e0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
-02e8: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-02f0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
-02f8: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-0300: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
+0200: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 0000004e 00000032
+0208: 0000c004 0000010e 001401c0 00000030 00600000 40000000 40000000 40000000
+0210: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 0000004e 00000032
+0218: 0000c004 0000010e 001401c0 00000030 00600000 40000000 40000000 40000000
+0220: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 0000004e 00000032
+0228: 0000c004 0000010e 001401c0 00000030 00600000 40000000 40000000 40000000
+0230: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 0000004e 00000032
+0238: 0000c004 0000010e 001401c0 00000030 00600000 40000000 40000000 40000000
+0240: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 0000004e 00000032
+0248: 0000c004 0000010e 001401c0 00000030 00600000 40000000 40000000 40000000
+0250: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 0000004e 00000032
+0258: 0000c004 0000010e 001401c0 00000030 00600000 40000000 40000000 40000000
+0260: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 0000004e 00000032
+0268: 0000c004 0000010e 001401c0 00000030 00600000 40000000 40000000 40000000
+0270: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 0000004e 00000032
+0278: 0000c004 0000010e 001401c0 00000030 00600000 40000000 40000000 40000000
+0280: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 0000004e 00000032
+0288: 0000c004 0000010e 001401c0 00000030 00600000 40000000 40000000 40000000
+0290: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 0000004e 00000032
+0298: 0000c004 0000010e 001401c0 00000030 00600000 40000000 40000000 40000000
+02a0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 0000004e 00000032
+02a8: 0000c004 0000010e 001401c0 00000030 00600000 40000000 40000000 40000000
+02b0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 0000004e 00000032
+02b8: 0000c004 0000010e 001401c0 00000030 00600000 40000000 40000000 40000000
+02c0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 0000004e 00000032
+02c8: 0000c004 0000010e 001401c0 00000030 00600000 40000000 40000000 40000000
+02d0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 0000004e 00000032
+02d8: 0000c004 0000010e 001401c0 00000030 00600000 40000000 40000000 40000000
+02e0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 0000004e 00000032
+02e8: 0000c004 0000010e 001401c0 00000030 00600000 40000000 40000000 40000000
+02f0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 0000004e 00000032
+02f8: 0000c004 0000010e 001401c0 00000030 00600000 40000000 40000000 40000000
+0300: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 00600000 40000000
0308: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-0310: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
+0310: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 00600000 40000000
0318: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-0320: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
+0320: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 00600000 40000000
0328: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-0330: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
+0330: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 00600000 40000000
0338: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-0340: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
+0340: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 00600000 40000000
0348: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-0350: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
+0350: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 00600000 40000000
0358: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-0360: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
+0360: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 00600000 40000000
0368: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-0370: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
+0370: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 00600000 40000000
0378: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-0380: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
+0380: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 00600000 40000000
0388: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-0390: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
+0390: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 00600000 40000000
0398: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-03a0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
+03a0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 00600000 40000000
03a8: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-03b0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
+03b0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 00600000 40000000
03b8: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-03c0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
+03c0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 00600000 40000000
03c8: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-03d0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
+03d0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 00600000 40000000
03d8: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-03e0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
+03e0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 00600000 40000000
03e8: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-03f0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
+03f0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 00600000 40000000
03f8: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-0400: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
+0400: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 00e00000 40000000
0408: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-0410: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
+0410: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 00e00000 40000000
0418: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-0420: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
+0420: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 00e00000 40000000
0428: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-0430: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
+0430: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 00e00000 40000000
0438: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-0440: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
+0440: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 00e00000 40000000
0448: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-0450: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
+0450: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 00e00000 40000000
0458: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-0460: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
+0460: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 00e00000 40000000
0468: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-0470: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
+0470: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 00e00000 40000000
0478: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-0480: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
+0480: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 00e00000 40000000
0488: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-0490: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
+0490: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 00e00000 40000000
0498: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-04a0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
+04a0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 00e00000 40000000
04a8: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-04b0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
+04b0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 00e00000 40000000
04b8: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-04c0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
+04c0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 00e00000 40000000
04c8: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-04d0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
+04d0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 00e00000 40000000
04d8: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-04e0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
+04e0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 00e00000 40000000
04e8: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-04f0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
+04f0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 00e00000 40000000
04f8: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
0500: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
0508: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
@@ -3727,22 +3727,22 @@ v3.0 hex words addressed
7468: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
7470: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
7478: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-7480: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
-7488: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-7490: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
-7498: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-74a0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
-74a8: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-74b0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
-74b8: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-74c0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
-74c8: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-74d0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
-74d8: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-74e0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
-74e8: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-74f0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
-74f8: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
+7480: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 0000010e 001601c0
+7488: 0000004e 00000032 00008080 0000c006 00000030 00e00000 40000000 40000000
+7490: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 0000010e 001601c0
+7498: 0000004e 00000032 00008080 0000c006 00000030 00e00000 40000000 40000000
+74a0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 0000010e 001601c0
+74a8: 0000004e 00000032 00008080 0000c006 00000030 00e00000 40000000 40000000
+74b0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 0000010e 001601c0
+74b8: 0000004e 00000032 00008080 0000c006 00000030 00e00000 40000000 40000000
+74c0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 0000010e 001601c0
+74c8: 0000004e 00000032 00008080 0000c006 00000030 00e00000 40000000 40000000
+74d0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 0000010e 001601c0
+74d8: 0000004e 00000032 00008080 0000c006 00000030 00e00000 40000000 40000000
+74e0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 0000010e 001601c0
+74e8: 0000004e 00000032 00008080 0000c006 00000030 00e00000 40000000 40000000
+74f0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 0000010e 001601c0
+74f8: 0000004e 00000032 00008080 0000c006 00000030 00e00000 40000000 40000000
7500: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
7508: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
7510: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
@@ -3759,22 +3759,22 @@ v3.0 hex words addressed
7568: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
7570: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
7578: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-7580: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
-7588: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-7590: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
-7598: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-75a0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
-75a8: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-75b0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
-75b8: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-75c0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
-75c8: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-75d0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
-75d8: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-75e0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
-75e8: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-75f0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
-75f8: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
+7580: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 0000010e 001601c0
+7588: 0000004e 00000032 00008080 00001000 0000c000 00000030 00e00000 40000000
+7590: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 0000010e 001601c0
+7598: 0000004e 00000032 00008080 00001000 0000c000 00000030 00e00000 40000000
+75a0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 0000010e 001601c0
+75a8: 0000004e 00000032 00008080 00001000 0000c000 00000030 00e00000 40000000
+75b0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 0000010e 001601c0
+75b8: 0000004e 00000032 00008080 00001000 0000c000 00000030 00e00000 40000000
+75c0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 0000010e 001601c0
+75c8: 0000004e 00000032 00008080 00001000 0000c000 00000030 00e00000 40000000
+75d0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 0000010e 001601c0
+75d8: 0000004e 00000032 00008080 00001000 0000c000 00000030 00e00000 40000000
+75e0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 0000010e 001601c0
+75e8: 0000004e 00000032 00008080 00001000 0000c000 00000030 00e00000 40000000
+75f0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 0000010e 001601c0
+75f8: 0000004e 00000032 00008080 00001000 0000c000 00000030 00e00000 40000000
7600: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
7608: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
7610: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
diff --git a/assembly.py b/assembly.py
index e53354e..3be622b 100644
--- a/assembly.py
+++ b/assembly.py
@@ -36,10 +36,14 @@ PUSH = 10 << pin.ADDR_1_SHIFT | pin.ADDR_1
POP = 11 << pin.ADDR_1_SHIFT | pin.ADDR_1
CALL = 12 << pin.ADDR_1_SHIFT | pin.ADDR_1
+INT = 13 << pin.ADDR_1_SHIFT | pin.ADDR_1 # 中断
NOP = 0b0
-RET = 0b1
+RET = 0b1 # 中断
+IRET = 0b10 # 中断返回
+STI = 0b11 # 打开中断
+CLI = 0b100 # 关闭中断
HLT = 0b11_1111
@@ -328,6 +332,47 @@ INSTRUCTIONS = {
pin.MSR_IN | pin.CS_OUT,
]
},
+ INT: {
+ pin.AM_INS: [ # int 0x5 触发5号中断
+ # 先把当前pc压栈
+ pin.SP_OUT | pin.A_IN,
+ pin.OP_DEC | pin.ALU_OUT | pin.SP_IN, # sp减去1回写到sp
+
+ pin.SP_OUT | pin.MAR_IN, # 修改 mar偏移寄存器
+ # 修改 msr段地址寄存器
+ pin.SS_OUT | pin.MSR_IN,
+
+ # 根据 msr段地址 和mar偏移地址 控制内存写, 把当前PC 压栈
+ pin.RAM_IN | pin.PC_OUT,
+
+ # 修改PC为 DST
+ pin.DST_OUT | pin.PC_IN,
+
+ # 修改msr即可, mar会被pc修改
+ pin.MSR_IN | pin.CS_OUT,
+
+ # 进入中断处理函数之前, 需要关闭中断
+ pin.ALU_PSW | pin.ALU_CLI
+ ],
+ pin.AM_REG: [ # call b
+ pin.SP_OUT | pin.A_IN,
+ pin.OP_DEC | pin.ALU_OUT | pin.SP_IN,
+
+ pin.SP_OUT | pin.MAR_IN,
+ # 修改 msr段地址寄存器
+ pin.SS_OUT | pin.MSR_IN,
+
+ # 当前pc压栈
+ pin.RAM_IN | pin.PC_OUT,
+ # 修改PC为 DST
+ pin.DST_R, pin.PC_IN,
+
+ pin.MSR_IN | pin.CS_OUT,
+
+ # 进入中断处理函数之前, 需要关闭中断
+ pin.ALU_PSW | pin.ALU_CLI
+ ]
+ },
},
0: {
NOP: [
@@ -351,6 +396,30 @@ INSTRUCTIONS = {
# 恢复 msr
pin.CS_OUT | pin.MSR_IN,
+ ],
+ IRET: [
+ # 修改段地址和偏移地址
+ pin.SP_OUT | pin.MAR_IN,
+ pin.SS_OUT | pin.MSR_IN,
+
+ # 直接把栈顶的值读到PC(这个值保存的事call的时候, PC的值)
+ pin.RAM_OUT | pin.PC_IN,
+
+ # 对sp增加1
+ pin.SP_OUT | pin.A_IN,
+ pin.OP_INC | pin.ALU_OUT | pin.SP_IN,
+
+ # 恢复 msr
+ pin.CS_OUT | pin.MSR_IN,
+
+ # 恢复中断
+ pin.ALU_PSW | pin.ALU_STI
+ ],
+ STI: [
+ pin.ALU_PSW | pin.ALU_STI
+ ],
+ CLI: [
+ pin.ALU_PSW | pin.ALU_CLI
]
}
}
diff --git a/compiler.py b/compiler.py
index 2375c06..aeb0ff5 100644
--- a/compiler.py
+++ b/compiler.py
@@ -39,12 +39,16 @@ OP1_STR_MAP = {
"push": ASM.PUSH,
"pop": ASM.POP,
"call": ASM.CALL,
+ "int": ASM.INT,
}
OP0_STR_MAP = {
"nop": ASM.NOP,
"hlt": ASM.HLT,
"ret": ASM.RET,
+ "iret": ASM.IRET,
+ "sti": ASM.STI,
+ "cli": ASM.CLI,
}
OP2_VALUE_SET = set(OP2_STR_MAP.values())
diff --git a/controller.py b/controller.py
index 9b1e76c..a906c25 100644
--- a/controller.py
+++ b/controller.py
@@ -100,6 +100,14 @@ def get_condition_jump(EXEC, op, psw):
return [pin.CYC]
+def get_interrupt(EXEC, op, psw):
+ allow_int = psw & 0b1000 # 如果是中断有效位的rom内存区域
+
+ if allow_int:
+ return EXEC
+ else:
+ return [pin.CYC]
+
def compile_addr1(addr, ir, psw, idx):
# 01xxxx[aa]
@@ -123,6 +131,10 @@ def compile_addr1(addr, ir, psw, idx):
if op in CJMPS:
EXEC = get_condition_jump(EXEC, op, psw)
+ # 中断
+ if op == ASM.INT:
+ EXEC = get_interrupt(EXEC, op, psw)
+
# 当前指令周期 长度塞不下了
if idx < len(EXEC):
# print(f"{hex(addr)} 写入指令: {bin(EXEC[idx])}")
diff --git a/cpu.circ b/cpu.circ
index c47550c..63eae99 100644
--- a/cpu.circ
+++ b/cpu.circ
@@ -4069,48 +4069,70 @@ c004 10e 1401c0 30 4*40000000 8040 1c0a4 8040
8040 1c0c4 8040 1c0e4 4e 32 c004 10e
1401c0 30 4*40000000 8040 1c0a4 8040 1c0c4 8040
1c0e4 4e 32 c004 10e 1401c0 30 4*40000000
-8040 1c0a4 8040 1c0c4 8040 1c0e4 10*40000000 8040
-1c0a4 8040 1c0c4 8040 1c0e4 10*40000000 8040 1c0a4
-8040 1c0c4 8040 1c0e4 10*40000000 8040 1c0a4 8040
-1c0c4 8040 1c0e4 10*40000000 8040 1c0a4 8040 1c0c4
-8040 1c0e4 10*40000000 8040 1c0a4 8040 1c0c4 8040
-1c0e4 10*40000000 8040 1c0a4 8040 1c0c4 8040 1c0e4
-10*40000000 8040 1c0a4 8040 1c0c4 8040 1c0e4 10*40000000
-8040 1c0a4 8040 1c0c4 8040 1c0e4 10*40000000 8040
-1c0a4 8040 1c0c4 8040 1c0e4 10*40000000 8040 1c0a4
-8040 1c0c4 8040 1c0e4 10*40000000 8040 1c0a4 8040
-1c0c4 8040 1c0e4 10*40000000 8040 1c0a4 8040 1c0c4
-8040 1c0e4 10*40000000 8040 1c0a4 8040 1c0c4 8040
-1c0e4 10*40000000 8040 1c0a4 8040 1c0c4 8040 1c0e4
-10*40000000 8040 1c0a4 8040 1c0c4 8040 1c0e4 10*40000000
-8040 1c0a4 8040 1c0c4 8040 1c0e4 10*40000000 8040
-1c0a4 8040 1c0c4 8040 1c0e4 10*40000000 8040 1c0a4
-8040 1c0c4 8040 1c0e4 10*40000000 8040 1c0a4 8040
-1c0c4 8040 1c0e4 10*40000000 8040 1c0a4 8040 1c0c4
-8040 1c0e4 10*40000000 8040 1c0a4 8040 1c0c4 8040
-1c0e4 10*40000000 8040 1c0a4 8040 1c0c4 8040 1c0e4
-10*40000000 8040 1c0a4 8040 1c0c4 8040 1c0e4 10*40000000
-8040 1c0a4 8040 1c0c4 8040 1c0e4 10*40000000 8040
-1c0a4 8040 1c0c4 8040 1c0e4 10*40000000 8040 1c0a4
-8040 1c0c4 8040 1c0e4 10*40000000 8040 1c0a4 8040
-1c0c4 8040 1c0e4 10*40000000 8040 1c0a4 8040 1c0c4
-8040 1c0e4 10*40000000 8040 1c0a4 8040 1c0c4 8040
-1c0e4 10*40000000 8040 1c0a4 8040 1c0c4 8040 1c0e4
-10*40000000 8040 1c0a4 8040 1c0c4 8040 1c0e4 10*40000000
-8040 1c0a4 8040 1c0c4 8040 1c0e4 10*40000000 8040
-1c0a4 8040 1c0c4 8040 1c0e4 10*40000000 8040 1c0a4
-8040 1c0c4 8040 1c0e4 10*40000000 8040 1c0a4 8040
-1c0c4 8040 1c0e4 10*40000000 8040 1c0a4 8040 1c0c4
-8040 1c0e4 10*40000000 8040 1c0a4 8040 1c0c4 8040
-1c0e4 10*40000000 8040 1c0a4 8040 1c0c4 8040 1c0e4
-10*40000000 8040 1c0a4 8040 1c0c4 8040 1c0e4 10*40000000
-8040 1c0a4 8040 1c0c4 8040 1c0e4 10*40000000 8040
-1c0a4 8040 1c0c4 8040 1c0e4 10*40000000 8040 1c0a4
-8040 1c0c4 8040 1c0e4 10*40000000 8040 1c0a4 8040
-1c0c4 8040 1c0e4 10*40000000 8040 1c0a4 8040 1c0c4
-8040 1c0e4 10*40000000 8040 1c0a4 8040 1c0c4 8040
-1c0e4 10*40000000 8040 1c0a4 8040 1c0c4 8040 1c0e4
-10*40000000 8040 1c0a4 8040 1c0c4 8040 1c0e4 10*40000000
+8040 1c0a4 8040 1c0c4 8040 1c0e4 4e 32
+c004 10e 1401c0 30 600000 40000000 40000000 40000000
+8040 1c0a4 8040 1c0c4 8040 1c0e4 4e 32
+c004 10e 1401c0 30 600000 40000000 40000000 40000000
+8040 1c0a4 8040 1c0c4 8040 1c0e4 4e 32
+c004 10e 1401c0 30 600000 40000000 40000000 40000000
+8040 1c0a4 8040 1c0c4 8040 1c0e4 4e 32
+c004 10e 1401c0 30 600000 40000000 40000000 40000000
+8040 1c0a4 8040 1c0c4 8040 1c0e4 4e 32
+c004 10e 1401c0 30 600000 40000000 40000000 40000000
+8040 1c0a4 8040 1c0c4 8040 1c0e4 4e 32
+c004 10e 1401c0 30 600000 40000000 40000000 40000000
+8040 1c0a4 8040 1c0c4 8040 1c0e4 4e 32
+c004 10e 1401c0 30 600000 40000000 40000000 40000000
+8040 1c0a4 8040 1c0c4 8040 1c0e4 4e 32
+c004 10e 1401c0 30 600000 40000000 40000000 40000000
+8040 1c0a4 8040 1c0c4 8040 1c0e4 4e 32
+c004 10e 1401c0 30 600000 40000000 40000000 40000000
+8040 1c0a4 8040 1c0c4 8040 1c0e4 4e 32
+c004 10e 1401c0 30 600000 40000000 40000000 40000000
+8040 1c0a4 8040 1c0c4 8040 1c0e4 4e 32
+c004 10e 1401c0 30 600000 40000000 40000000 40000000
+8040 1c0a4 8040 1c0c4 8040 1c0e4 4e 32
+c004 10e 1401c0 30 600000 40000000 40000000 40000000
+8040 1c0a4 8040 1c0c4 8040 1c0e4 4e 32
+c004 10e 1401c0 30 600000 40000000 40000000 40000000
+8040 1c0a4 8040 1c0c4 8040 1c0e4 4e 32
+c004 10e 1401c0 30 600000 40000000 40000000 40000000
+8040 1c0a4 8040 1c0c4 8040 1c0e4 4e 32
+c004 10e 1401c0 30 600000 40000000 40000000 40000000
+8040 1c0a4 8040 1c0c4 8040 1c0e4 4e 32
+c004 10e 1401c0 30 600000 40000000 40000000 40000000
+8040 1c0a4 8040 1c0c4 8040 1c0e4 600000 9*40000000
+8040 1c0a4 8040 1c0c4 8040 1c0e4 600000 9*40000000
+8040 1c0a4 8040 1c0c4 8040 1c0e4 600000 9*40000000
+8040 1c0a4 8040 1c0c4 8040 1c0e4 600000 9*40000000
+8040 1c0a4 8040 1c0c4 8040 1c0e4 600000 9*40000000
+8040 1c0a4 8040 1c0c4 8040 1c0e4 600000 9*40000000
+8040 1c0a4 8040 1c0c4 8040 1c0e4 600000 9*40000000
+8040 1c0a4 8040 1c0c4 8040 1c0e4 600000 9*40000000
+8040 1c0a4 8040 1c0c4 8040 1c0e4 600000 9*40000000
+8040 1c0a4 8040 1c0c4 8040 1c0e4 600000 9*40000000
+8040 1c0a4 8040 1c0c4 8040 1c0e4 600000 9*40000000
+8040 1c0a4 8040 1c0c4 8040 1c0e4 600000 9*40000000
+8040 1c0a4 8040 1c0c4 8040 1c0e4 600000 9*40000000
+8040 1c0a4 8040 1c0c4 8040 1c0e4 600000 9*40000000
+8040 1c0a4 8040 1c0c4 8040 1c0e4 600000 9*40000000
+8040 1c0a4 8040 1c0c4 8040 1c0e4 600000 9*40000000
+8040 1c0a4 8040 1c0c4 8040 1c0e4 e00000 9*40000000
+8040 1c0a4 8040 1c0c4 8040 1c0e4 e00000 9*40000000
+8040 1c0a4 8040 1c0c4 8040 1c0e4 e00000 9*40000000
+8040 1c0a4 8040 1c0c4 8040 1c0e4 e00000 9*40000000
+8040 1c0a4 8040 1c0c4 8040 1c0e4 e00000 9*40000000
+8040 1c0a4 8040 1c0c4 8040 1c0e4 e00000 9*40000000
+8040 1c0a4 8040 1c0c4 8040 1c0e4 e00000 9*40000000
+8040 1c0a4 8040 1c0c4 8040 1c0e4 e00000 9*40000000
+8040 1c0a4 8040 1c0c4 8040 1c0e4 e00000 9*40000000
+8040 1c0a4 8040 1c0c4 8040 1c0e4 e00000 9*40000000
+8040 1c0a4 8040 1c0c4 8040 1c0e4 e00000 9*40000000
+8040 1c0a4 8040 1c0c4 8040 1c0e4 e00000 9*40000000
+8040 1c0a4 8040 1c0c4 8040 1c0e4 e00000 9*40000000
+8040 1c0a4 8040 1c0c4 8040 1c0e4 e00000 9*40000000
+8040 1c0a4 8040 1c0c4 8040 1c0e4 e00000 9*40000000
+8040 1c0a4 8040 1c0c4 8040 1c0e4 e00000 9*40000000
8040 1c0a4 8040 1c0c4 8040 1c0e4 10*40000000 8040
1c0a4 8040 1c0c4 8040 1c0e4 10*40000000 8040 1c0a4
8040 1c0c4 8040 1c0e4 10*40000000 8040 1c0a4 8040
@@ -5766,6 +5788,22 @@ c006 9*40000000 8040 1c0a4 8040 1c0c4 8040 1c0e4
8040 1c0e4 10*40000000 8040 1c0a4 8040 1c0c4 8040
1c0e4 10*40000000 8040 1c0a4 8040 1c0c4 8040 1c0e4
10*40000000 8040 1c0a4 8040 1c0c4 8040 1c0e4 10*40000000
+8040 1c0a4 8040 1c0c4 8040 1c0e4 10e 1601c0
+4e 32 8080 c006 30 e00000 40000000 40000000
+8040 1c0a4 8040 1c0c4 8040 1c0e4 10e 1601c0
+4e 32 8080 c006 30 e00000 40000000 40000000
+8040 1c0a4 8040 1c0c4 8040 1c0e4 10e 1601c0
+4e 32 8080 c006 30 e00000 40000000 40000000
+8040 1c0a4 8040 1c0c4 8040 1c0e4 10e 1601c0
+4e 32 8080 c006 30 e00000 40000000 40000000
+8040 1c0a4 8040 1c0c4 8040 1c0e4 10e 1601c0
+4e 32 8080 c006 30 e00000 40000000 40000000
+8040 1c0a4 8040 1c0c4 8040 1c0e4 10e 1601c0
+4e 32 8080 c006 30 e00000 40000000 40000000
+8040 1c0a4 8040 1c0c4 8040 1c0e4 10e 1601c0
+4e 32 8080 c006 30 e00000 40000000 40000000
+8040 1c0a4 8040 1c0c4 8040 1c0e4 10e 1601c0
+4e 32 8080 c006 30 e00000 40000000 40000000
8040 1c0a4 8040 1c0c4 8040 1c0e4 10*40000000 8040
1c0a4 8040 1c0c4 8040 1c0e4 10*40000000 8040 1c0a4
8040 1c0c4 8040 1c0e4 10*40000000 8040 1c0a4 8040
@@ -5773,20 +5811,22 @@ c006 9*40000000 8040 1c0a4 8040 1c0c4 8040 1c0e4
8040 1c0e4 10*40000000 8040 1c0a4 8040 1c0c4 8040
1c0e4 10*40000000 8040 1c0a4 8040 1c0c4 8040 1c0e4
10*40000000 8040 1c0a4 8040 1c0c4 8040 1c0e4 10*40000000
-8040 1c0a4 8040 1c0c4 8040 1c0e4 10*40000000 8040
-1c0a4 8040 1c0c4 8040 1c0e4 10*40000000 8040 1c0a4
-8040 1c0c4 8040 1c0e4 10*40000000 8040 1c0a4 8040
-1c0c4 8040 1c0e4 10*40000000 8040 1c0a4 8040 1c0c4
-8040 1c0e4 10*40000000 8040 1c0a4 8040 1c0c4 8040
-1c0e4 10*40000000 8040 1c0a4 8040 1c0c4 8040 1c0e4
-10*40000000 8040 1c0a4 8040 1c0c4 8040 1c0e4 10*40000000
-8040 1c0a4 8040 1c0c4 8040 1c0e4 10*40000000 8040
-1c0a4 8040 1c0c4 8040 1c0e4 10*40000000 8040 1c0a4
-8040 1c0c4 8040 1c0e4 10*40000000 8040 1c0a4 8040
-1c0c4 8040 1c0e4 10*40000000 8040 1c0a4 8040 1c0c4
-8040 1c0e4 10*40000000 8040 1c0a4 8040 1c0c4 8040
-1c0e4 10*40000000 8040 1c0a4 8040 1c0c4 8040 1c0e4
-10*40000000 8040 1c0a4 8040 1c0c4 8040 1c0e4 10*40000000
+8040 1c0a4 8040 1c0c4 8040 1c0e4 10e 1601c0
+4e 32 8080 1000 c000 30 e00000 40000000
+8040 1c0a4 8040 1c0c4 8040 1c0e4 10e 1601c0
+4e 32 8080 1000 c000 30 e00000 40000000
+8040 1c0a4 8040 1c0c4 8040 1c0e4 10e 1601c0
+4e 32 8080 1000 c000 30 e00000 40000000
+8040 1c0a4 8040 1c0c4 8040 1c0e4 10e 1601c0
+4e 32 8080 1000 c000 30 e00000 40000000
+8040 1c0a4 8040 1c0c4 8040 1c0e4 10e 1601c0
+4e 32 8080 1000 c000 30 e00000 40000000
+8040 1c0a4 8040 1c0c4 8040 1c0e4 10e 1601c0
+4e 32 8080 1000 c000 30 e00000 40000000
+8040 1c0a4 8040 1c0c4 8040 1c0e4 10e 1601c0
+4e 32 8080 1000 c000 30 e00000 40000000
+8040 1c0a4 8040 1c0c4 8040 1c0e4 10e 1601c0
+4e 32 8080 1000 c000 30 e00000 40000000
8040 1c0a4 8040 1c0c4 8040 1c0e4 10*40000000 8040
1c0a4 8040 1c0c4 8040 1c0e4 10*40000000 8040 1c0a4
8040 1c0c4 8040 1c0e4 10*40000000 8040 1c0a4 8040
@@ -12555,7 +12595,7 @@ c006 9*40000000 8040 1c0a4 8040 1c0c4 8040 1c0e4
-
+
a
@@ -12622,7 +12662,7 @@ c006 9*40000000 8040 1c0a4 8040 1c0c4 8040 1c0e4
-
+
@@ -12731,6 +12771,7 @@ c006 9*40000000 8040 1c0a4 8040 1c0c4 8040 1c0e4
+
@@ -12780,31 +12821,34 @@ c006 9*40000000 8040 1c0a4 8040 1c0c4 8040 1c0e4
+
+
+
-
-
-
-
-
-
-
+
-
+
+
+
+
-
+
-
+
+
+
+
-
+
@@ -12813,6 +12857,7 @@ c006 9*40000000 8040 1c0a4 8040 1c0c4 8040 1c0e4
+
@@ -12861,11 +12906,14 @@ c006 9*40000000 8040 1c0a4 8040 1c0c4 8040 1c0e4
-
-
-
-
-
+
+
+
+
+
+
+
+
@@ -12880,6 +12928,10 @@ c006 9*40000000 8040 1c0a4 8040 1c0c4 8040 1c0e4
+
+
+
+
@@ -12888,6 +12940,8 @@ c006 9*40000000 8040 1c0a4 8040 1c0c4 8040 1c0e4
+
+
@@ -12912,6 +12966,9 @@ c006 9*40000000 8040 1c0a4 8040 1c0c4 8040 1c0e4
+
+
+
@@ -12931,6 +12988,8 @@ c006 9*40000000 8040 1c0a4 8040 1c0c4 8040 1c0e4
+
+
@@ -12944,14 +13003,14 @@ c006 9*40000000 8040 1c0a4 8040 1c0c4 8040 1c0e4
+
+
-
-
diff --git a/pin.py b/pin.py
index 8e82198..6baa85d 100644
--- a/pin.py
+++ b/pin.py
@@ -99,6 +99,11 @@ OP_NOT = 7 << _OP_SHIFT
ALU_OUT = 1 << 20
ALU_PSW = 1 << 21
+ALU_INT_W = 1 << 22 # 中断有效
+ALU_INT = 1 << 23 # 中断无效(他在电路中, 会把上次的中断状态保存下来)
+
+ALU_STI = ALU_INT_W # 中断有效, 默认开启中断了
+ALU_CLI = ALU_INT_W | ALU_INT # 开启中断, 并 使中断无效
CYC = 1 << 30 # 当前指令周期 清零, 执行下一个指令周期
diff --git a/program.bin b/program.bin
index adcab7a..f0eff80 100644
--- a/program.bin
+++ b/program.bin
@@ -2,7 +2,8 @@ v3.0 hex words addressed
0000: 84 12 01 84 0e 10 4c 1e
0008: 00 84 0b 10 01 00 00 41
0010: 0b 00 b4 0b 15 58 1b 00
-0018: 4c 0f 00 01 00 00 70 09
-0020: 00 70 0f 00 68 f0 00 68
-0028: f1 00 68 f2 00 68 f3 00
-0030: 3f 00 00 3f 00 00
+0018: 4c 0f 00 02 00 00 70 09
+0020: 00 04 00 00 74 0f 00 03
+0028: 00 00 68 f0 00 68 f1 00
+0030: 68 f2 00 68 f3 00 3f 00
+0038: 00 3f 00 00
diff --git a/test_mov.asm b/test_mov.asm
index 436b625..aab8ee2 100644
--- a/test_mov.asm
+++ b/test_mov.asm
@@ -15,11 +15,13 @@ increase_d:
jmp increase_d
increase_d_end:
- ret
+ iret
start:
call init_d
- call increase_d
+ cli
+ int increase_d ; 这个函数就不再执行了
+ sti
; 下面是查看栈是否回归正常
push 0xf0