From 63c6cce181f89d19da92f343b1925a6c7efeca45 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E9=98=B3=E5=85=89=E5=B0=91=E5=B9=B4?= <849317537@qq.com>
Date: Mon, 29 Apr 2024 16:30:40 +0800
Subject: [PATCH] =?UTF-8?q?=E5=87=BD=E6=95=B0=E8=B0=83=E7=94=A8=20?=
=?UTF-8?q?=E5=AE=8C=E6=88=90?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
ROM.bin | 192 +++++++++++++++++++++++++--------------------------
assembly.py | 57 ++++++++++++++-
compiler.py | 2 +
cpu.circ | 134 +++++++++++++++++++++++------------
program.bin | 12 ++--
test_mov.asm | 42 +++++------
6 files changed, 272 insertions(+), 167 deletions(-)
diff --git a/ROM.bin b/ROM.bin
index 7076271..08c16f2 100644
--- a/ROM.bin
+++ b/ROM.bin
@@ -31,38 +31,38 @@ v3.0 hex words addressed
00e8: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
00f0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
00f8: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-0100: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
-0108: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-0110: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
-0118: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-0120: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
-0128: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-0130: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
-0138: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-0140: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
-0148: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-0150: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
-0158: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-0160: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
-0168: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-0170: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
-0178: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-0180: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
-0188: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-0190: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
-0198: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-01a0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
-01a8: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-01b0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
-01b8: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-01c0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
-01c8: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-01d0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
-01d8: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-01e0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
-01e8: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-01f0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
-01f8: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
+0100: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 0000004e 00000032
+0108: 0000c004 0000010e 001401c0 00000030 40000000 40000000 40000000 40000000
+0110: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 0000004e 00000032
+0118: 0000c004 0000010e 001401c0 00000030 40000000 40000000 40000000 40000000
+0120: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 0000004e 00000032
+0128: 0000c004 0000010e 001401c0 00000030 40000000 40000000 40000000 40000000
+0130: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 0000004e 00000032
+0138: 0000c004 0000010e 001401c0 00000030 40000000 40000000 40000000 40000000
+0140: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 0000004e 00000032
+0148: 0000c004 0000010e 001401c0 00000030 40000000 40000000 40000000 40000000
+0150: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 0000004e 00000032
+0158: 0000c004 0000010e 001401c0 00000030 40000000 40000000 40000000 40000000
+0160: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 0000004e 00000032
+0168: 0000c004 0000010e 001401c0 00000030 40000000 40000000 40000000 40000000
+0170: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 0000004e 00000032
+0178: 0000c004 0000010e 001401c0 00000030 40000000 40000000 40000000 40000000
+0180: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 0000004e 00000032
+0188: 0000c004 0000010e 001401c0 00000030 40000000 40000000 40000000 40000000
+0190: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 0000004e 00000032
+0198: 0000c004 0000010e 001401c0 00000030 40000000 40000000 40000000 40000000
+01a0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 0000004e 00000032
+01a8: 0000c004 0000010e 001401c0 00000030 40000000 40000000 40000000 40000000
+01b0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 0000004e 00000032
+01b8: 0000c004 0000010e 001401c0 00000030 40000000 40000000 40000000 40000000
+01c0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 0000004e 00000032
+01c8: 0000c004 0000010e 001401c0 00000030 40000000 40000000 40000000 40000000
+01d0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 0000004e 00000032
+01d8: 0000c004 0000010e 001401c0 00000030 40000000 40000000 40000000 40000000
+01e0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 0000004e 00000032
+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
@@ -3583,70 +3583,70 @@ v3.0 hex words addressed
6fe8: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
6ff0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
6ff8: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-7000: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
-7008: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-7010: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
-7018: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-7020: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
-7028: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-7030: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
-7038: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-7040: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
-7048: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-7050: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
-7058: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-7060: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
-7068: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-7070: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
-7078: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-7080: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
-7088: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-7090: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
-7098: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-70a0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
-70a8: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-70b0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
-70b8: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-70c0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
-70c8: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-70d0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
-70d8: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-70e0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
-70e8: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-70f0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
-70f8: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-7100: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
-7108: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-7110: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
-7118: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-7120: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
-7128: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-7130: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
-7138: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-7140: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
-7148: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-7150: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
-7158: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-7160: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
-7168: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-7170: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
-7178: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-7180: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
-7188: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-7190: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
-7198: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-71a0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
-71a8: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-71b0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
-71b8: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-71c0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
-71c8: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-71d0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
-71d8: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-71e0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
-71e8: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
-71f0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
-71f8: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
+7000: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 0000010e 001601c0
+7008: 0000004e 00000032 00008080 0000c006 00000030 40000000 40000000 40000000
+7010: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 0000010e 001601c0
+7018: 0000004e 00000032 00008080 0000c006 00000030 40000000 40000000 40000000
+7020: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 0000010e 001601c0
+7028: 0000004e 00000032 00008080 0000c006 00000030 40000000 40000000 40000000
+7030: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 0000010e 001601c0
+7038: 0000004e 00000032 00008080 0000c006 00000030 40000000 40000000 40000000
+7040: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 0000010e 001601c0
+7048: 0000004e 00000032 00008080 0000c006 00000030 40000000 40000000 40000000
+7050: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 0000010e 001601c0
+7058: 0000004e 00000032 00008080 0000c006 00000030 40000000 40000000 40000000
+7060: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 0000010e 001601c0
+7068: 0000004e 00000032 00008080 0000c006 00000030 40000000 40000000 40000000
+7070: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 0000010e 001601c0
+7078: 0000004e 00000032 00008080 0000c006 00000030 40000000 40000000 40000000
+7080: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 0000010e 001601c0
+7088: 0000004e 00000032 00008080 0000c006 00000030 40000000 40000000 40000000
+7090: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 0000010e 001601c0
+7098: 0000004e 00000032 00008080 0000c006 00000030 40000000 40000000 40000000
+70a0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 0000010e 001601c0
+70a8: 0000004e 00000032 00008080 0000c006 00000030 40000000 40000000 40000000
+70b0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 0000010e 001601c0
+70b8: 0000004e 00000032 00008080 0000c006 00000030 40000000 40000000 40000000
+70c0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 0000010e 001601c0
+70c8: 0000004e 00000032 00008080 0000c006 00000030 40000000 40000000 40000000
+70d0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 0000010e 001601c0
+70d8: 0000004e 00000032 00008080 0000c006 00000030 40000000 40000000 40000000
+70e0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 0000010e 001601c0
+70e8: 0000004e 00000032 00008080 0000c006 00000030 40000000 40000000 40000000
+70f0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 0000010e 001601c0
+70f8: 0000004e 00000032 00008080 0000c006 00000030 40000000 40000000 40000000
+7100: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 0000010e 001601c0
+7108: 0000004e 00000032 00008080 00001000 0000c000 00000030 40000000 40000000
+7110: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 0000010e 001601c0
+7118: 0000004e 00000032 00008080 00001000 0000c000 00000030 40000000 40000000
+7120: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 0000010e 001601c0
+7128: 0000004e 00000032 00008080 00001000 0000c000 00000030 40000000 40000000
+7130: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 0000010e 001601c0
+7138: 0000004e 00000032 00008080 00001000 0000c000 00000030 40000000 40000000
+7140: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 0000010e 001601c0
+7148: 0000004e 00000032 00008080 00001000 0000c000 00000030 40000000 40000000
+7150: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 0000010e 001601c0
+7158: 0000004e 00000032 00008080 00001000 0000c000 00000030 40000000 40000000
+7160: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 0000010e 001601c0
+7168: 0000004e 00000032 00008080 00001000 0000c000 00000030 40000000 40000000
+7170: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 0000010e 001601c0
+7178: 0000004e 00000032 00008080 00001000 0000c000 00000030 40000000 40000000
+7180: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 0000010e 001601c0
+7188: 0000004e 00000032 00008080 00001000 0000c000 00000030 40000000 40000000
+7190: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 0000010e 001601c0
+7198: 0000004e 00000032 00008080 00001000 0000c000 00000030 40000000 40000000
+71a0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 0000010e 001601c0
+71a8: 0000004e 00000032 00008080 00001000 0000c000 00000030 40000000 40000000
+71b0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 0000010e 001601c0
+71b8: 0000004e 00000032 00008080 00001000 0000c000 00000030 40000000 40000000
+71c0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 0000010e 001601c0
+71c8: 0000004e 00000032 00008080 00001000 0000c000 00000030 40000000 40000000
+71d0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 0000010e 001601c0
+71d8: 0000004e 00000032 00008080 00001000 0000c000 00000030 40000000 40000000
+71e0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 0000010e 001601c0
+71e8: 0000004e 00000032 00008080 00001000 0000c000 00000030 40000000 40000000
+71f0: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 0000010e 001601c0
+71f8: 0000004e 00000032 00008080 00001000 0000c000 00000030 40000000 40000000
7200: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
7208: 40000000 40000000 40000000 40000000 40000000 40000000 40000000 40000000
7210: 00008040 0001c0a4 00008040 0001c0c4 00008040 0001c0e4 40000000 40000000
diff --git a/assembly.py b/assembly.py
index 225a647..e53354e 100644
--- a/assembly.py
+++ b/assembly.py
@@ -20,7 +20,6 @@ AND = 4 << pin.ADDR_2_SHIFT | pin.ADDR_2
OR = 5 << pin.ADDR_2_SHIFT | pin.ADDR_2
XOR = 6 << pin.ADDR_2_SHIFT | pin.ADDR_2
-
INC = 0 << pin.ADDR_1_SHIFT | pin.ADDR_1
DEC = 1 << pin.ADDR_1_SHIFT | pin.ADDR_1
NOT = 2 << pin.ADDR_1_SHIFT | pin.ADDR_1
@@ -36,8 +35,11 @@ JNP = 9 << pin.ADDR_1_SHIFT | pin.ADDR_1 # 偶数跳转
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
+
NOP = 0b0
+RET = 0b1
HLT = 0b11_1111
@@ -277,7 +279,6 @@ INSTRUCTIONS = {
},
POP: {
pin.AM_REG: [ # pop d
-
# 修改段地址和偏移地址
pin.SP_OUT | pin.MAR_IN,
pin.SS_OUT | pin.MSR_IN,
@@ -290,9 +291,43 @@ INSTRUCTIONS = {
# 恢复 msr
pin.CS_OUT | pin.MSR_IN,
+ ]
+ },
+ CALL: {
+ pin.AM_INS: [ # call 0x5
+ # 先把当前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.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,
]
- }
+ },
},
0: {
NOP: [
@@ -300,6 +335,22 @@ INSTRUCTIONS = {
],
HLT: [
pin.HLT,
+ ],
+ RET: [
+ # 修改段地址和偏移地址
+ 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,
+
]
}
}
diff --git a/compiler.py b/compiler.py
index 7916b9c..2375c06 100644
--- a/compiler.py
+++ b/compiler.py
@@ -38,11 +38,13 @@ OP1_STR_MAP = {
"jnp": ASM.JNP,
"push": ASM.PUSH,
"pop": ASM.POP,
+ "call": ASM.CALL,
}
OP0_STR_MAP = {
"nop": ASM.NOP,
"hlt": ASM.HLT,
+ "ret": ASM.RET,
}
OP2_VALUE_SET = set(OP2_STR_MAP.values())
diff --git a/cpu.circ b/cpu.circ
index bf97505..c47550c 100644
--- a/cpu.circ
+++ b/cpu.circ
@@ -3855,7 +3855,7 @@
-
+
@@ -4043,20 +4043,32 @@
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 4*40000000 8040 1c0a4 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 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 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 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 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 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 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 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
@@ -5655,34 +5667,70 @@ 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 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 c006 30 40000000 40000000 40000000
+8040 1c0a4 8040 1c0c4 8040 1c0e4 10e 1601c0
+4e 32 8080 c006 30 40000000 40000000 40000000
+8040 1c0a4 8040 1c0c4 8040 1c0e4 10e 1601c0
+4e 32 8080 c006 30 40000000 40000000 40000000
+8040 1c0a4 8040 1c0c4 8040 1c0e4 10e 1601c0
+4e 32 8080 c006 30 40000000 40000000 40000000
+8040 1c0a4 8040 1c0c4 8040 1c0e4 10e 1601c0
+4e 32 8080 c006 30 40000000 40000000 40000000
+8040 1c0a4 8040 1c0c4 8040 1c0e4 10e 1601c0
+4e 32 8080 c006 30 40000000 40000000 40000000
+8040 1c0a4 8040 1c0c4 8040 1c0e4 10e 1601c0
+4e 32 8080 c006 30 40000000 40000000 40000000
+8040 1c0a4 8040 1c0c4 8040 1c0e4 10e 1601c0
+4e 32 8080 c006 30 40000000 40000000 40000000
+8040 1c0a4 8040 1c0c4 8040 1c0e4 10e 1601c0
+4e 32 8080 c006 30 40000000 40000000 40000000
+8040 1c0a4 8040 1c0c4 8040 1c0e4 10e 1601c0
+4e 32 8080 c006 30 40000000 40000000 40000000
+8040 1c0a4 8040 1c0c4 8040 1c0e4 10e 1601c0
+4e 32 8080 c006 30 40000000 40000000 40000000
+8040 1c0a4 8040 1c0c4 8040 1c0e4 10e 1601c0
+4e 32 8080 c006 30 40000000 40000000 40000000
+8040 1c0a4 8040 1c0c4 8040 1c0e4 10e 1601c0
+4e 32 8080 c006 30 40000000 40000000 40000000
+8040 1c0a4 8040 1c0c4 8040 1c0e4 10e 1601c0
+4e 32 8080 c006 30 40000000 40000000 40000000
+8040 1c0a4 8040 1c0c4 8040 1c0e4 10e 1601c0
+4e 32 8080 c006 30 40000000 40000000 40000000
+8040 1c0a4 8040 1c0c4 8040 1c0e4 10e 1601c0
+4e 32 8080 c006 30 40000000 40000000 40000000
+8040 1c0a4 8040 1c0c4 8040 1c0e4 10e 1601c0
+4e 32 8080 1000 c000 30 40000000 40000000
+8040 1c0a4 8040 1c0c4 8040 1c0e4 10e 1601c0
+4e 32 8080 1000 c000 30 40000000 40000000
+8040 1c0a4 8040 1c0c4 8040 1c0e4 10e 1601c0
+4e 32 8080 1000 c000 30 40000000 40000000
+8040 1c0a4 8040 1c0c4 8040 1c0e4 10e 1601c0
+4e 32 8080 1000 c000 30 40000000 40000000
+8040 1c0a4 8040 1c0c4 8040 1c0e4 10e 1601c0
+4e 32 8080 1000 c000 30 40000000 40000000
+8040 1c0a4 8040 1c0c4 8040 1c0e4 10e 1601c0
+4e 32 8080 1000 c000 30 40000000 40000000
+8040 1c0a4 8040 1c0c4 8040 1c0e4 10e 1601c0
+4e 32 8080 1000 c000 30 40000000 40000000
+8040 1c0a4 8040 1c0c4 8040 1c0e4 10e 1601c0
+4e 32 8080 1000 c000 30 40000000 40000000
+8040 1c0a4 8040 1c0c4 8040 1c0e4 10e 1601c0
+4e 32 8080 1000 c000 30 40000000 40000000
+8040 1c0a4 8040 1c0c4 8040 1c0e4 10e 1601c0
+4e 32 8080 1000 c000 30 40000000 40000000
+8040 1c0a4 8040 1c0c4 8040 1c0e4 10e 1601c0
+4e 32 8080 1000 c000 30 40000000 40000000
+8040 1c0a4 8040 1c0c4 8040 1c0e4 10e 1601c0
+4e 32 8080 1000 c000 30 40000000 40000000
+8040 1c0a4 8040 1c0c4 8040 1c0e4 10e 1601c0
+4e 32 8080 1000 c000 30 40000000 40000000
+8040 1c0a4 8040 1c0c4 8040 1c0e4 10e 1601c0
+4e 32 8080 1000 c000 30 40000000 40000000
+8040 1c0a4 8040 1c0c4 8040 1c0e4 10e 1601c0
+4e 32 8080 1000 c000 30 40000000 40000000
+8040 1c0a4 8040 1c0c4 8040 1c0e4 10e 1601c0
+4e 32 8080 1000 c000 30 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
diff --git a/program.bin b/program.bin
index 4a5b9b3..adcab7a 100644
--- a/program.bin
+++ b/program.bin
@@ -1,6 +1,8 @@
v3.0 hex words addressed
-0000: 84 12 01 84 0e 10 84 0a
-0008: f9 84 0b 9f 69 0a 00 69
-0010: 0b 00 6d 0a 00 6d 0b 00
-0018: 68 10 00 68 01 00 3f 00
-0020: 00 3f 00 00
+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
diff --git a/test_mov.asm b/test_mov.asm
index 6e36390..436b625 100644
--- a/test_mov.asm
+++ b/test_mov.asm
@@ -1,28 +1,30 @@
-; 测试的代码
-;mov a, 0x0f ; 写入0x0f到A寄存器
-;mov d, a
-;mov a, [0x05]
-;mov b, [a]
-;nop
+ mov ss, 1
+ mov sp, 0x10 ; 从 0x00 ~ 0xf 是栈的空间 0x10 - 1 = 0xf
+ jmp start
-; mov [0x0], 0xff
+init_d:
+ mov d, 0x10
+ ret
-;mov a, 0xff
-;mov [0x0], a
+increase_d:
+ inc d
+ cmp d, 0x15
+ jz increase_d_end
+ jmp increase_d
-; 栈测试
-mov ss, 1
-mov sp, 0x10 ; 从 0x00 ~ 0x09 是栈的空间
+ increase_d_end:
+ ret
+start:
+ call init_d
+ call increase_d
-mov c, 0xf9
-mov d, 0x9f
-push c
-push d
-pop c
-pop d
-push 0x10 ; 现在栈应该被下面俩覆盖了, 且c和d交换位置了
-push 0x01
+ ; 下面是查看栈是否回归正常
+ push 0xf0
+ push 0xf1
+ push 0xf2
+ push 0xf3
hlt
+