fix(saolei): 修显存窗口译码 + 段间空洞填 NOP; 新增无显示器调试台(仿真截图)

- cpu21_mmio.v: sel_fb 原写成 addr[12] && !addr[11](那是 0x1000-0x17FF),
  导致 0x2000+ 的显存读写全不命中, 而鼠标/显示寄存器写反而落进显存。
  改为 bit13=1 && bit12=0 && bit11=0 后扫雷画面才正常:
  修复前仿真 fb_we 只有 6 次写(画面全空), 修复后开始界面 1246 次、进关卡后 2775 次
- cpu21_board_top.v: 新增 POINTER_SAMPLE_DIV 参数(默认仍为上板的 50000),
  仿真传 50 即可让按键在几十微秒内被识别(defparam 对 generate 块内实例无效)
- saolei/tools/elf2hex.py: .text.isr1/2/3 之间的空洞(0 字)填 NOP —— objcopy 留下的
  0x00000000 在本 CPU 上等同自跳指令, PC 掉进去就出不来
- saolei/tools/fb2png.py + srcs/tb/tb_saolei.v: 无 VGA 显示器的调试台 —— 跑板级顶层、
  按键当鼠标、把 40x30 显存 dump 成文本, 再按 cpu21_vga.v 的字库/调色板还原 PNG,
  并附 ASCII 图 + RAM 变量视图 + PC 热点直方图
This commit is contained in:
2026-09-19 19:26:26 +08:00
parent 4ef3960553
commit 3f765ae4c5
6 changed files with 599 additions and 148 deletions
+144 -144
View File
@@ -5,65 +5,65 @@
rom[2] = 32'h000012B7;
rom[3] = 32'hE3028293;
rom[4] = 32'h00028067;
rom[5] = 32'h00000000;
rom[6] = 32'h00000000;
rom[7] = 32'h00000000;
rom[8] = 32'h00000000;
rom[9] = 32'h00000000;
rom[10] = 32'h00000000;
rom[11] = 32'h00000000;
rom[12] = 32'h00000000;
rom[13] = 32'h00000000;
rom[14] = 32'h00000000;
rom[15] = 32'h00000000;
rom[16] = 32'h00000000;
rom[17] = 32'h00000000;
rom[18] = 32'h00000000;
rom[19] = 32'h00000000;
rom[20] = 32'h00000000;
rom[21] = 32'h00000000;
rom[22] = 32'h00000000;
rom[23] = 32'h00000000;
rom[24] = 32'h00000000;
rom[25] = 32'h00000000;
rom[26] = 32'h00000000;
rom[27] = 32'h00000000;
rom[28] = 32'h00000000;
rom[29] = 32'h00000000;
rom[30] = 32'h00000000;
rom[31] = 32'h00000000;
rom[32] = 32'h00000000;
rom[33] = 32'h00000000;
rom[34] = 32'h00000000;
rom[35] = 32'h00000000;
rom[36] = 32'h00000000;
rom[37] = 32'h00000000;
rom[38] = 32'h00000000;
rom[39] = 32'h00000000;
rom[40] = 32'h00000000;
rom[41] = 32'h00000000;
rom[42] = 32'h00000000;
rom[43] = 32'h00000000;
rom[44] = 32'h00000000;
rom[45] = 32'h00000000;
rom[46] = 32'h00000000;
rom[47] = 32'h00000000;
rom[48] = 32'h00000000;
rom[49] = 32'h00000000;
rom[50] = 32'h00000000;
rom[51] = 32'h00000000;
rom[52] = 32'h00000000;
rom[53] = 32'h00000000;
rom[54] = 32'h00000000;
rom[55] = 32'h00000000;
rom[56] = 32'h00000000;
rom[57] = 32'h00000000;
rom[58] = 32'h00000000;
rom[59] = 32'h00000000;
rom[60] = 32'h00000000;
rom[61] = 32'h00000000;
rom[62] = 32'h00000000;
rom[63] = 32'h00000000;
rom[5] = 32'h00000013;
rom[6] = 32'h00000013;
rom[7] = 32'h00000013;
rom[8] = 32'h00000013;
rom[9] = 32'h00000013;
rom[10] = 32'h00000013;
rom[11] = 32'h00000013;
rom[12] = 32'h00000013;
rom[13] = 32'h00000013;
rom[14] = 32'h00000013;
rom[15] = 32'h00000013;
rom[16] = 32'h00000013;
rom[17] = 32'h00000013;
rom[18] = 32'h00000013;
rom[19] = 32'h00000013;
rom[20] = 32'h00000013;
rom[21] = 32'h00000013;
rom[22] = 32'h00000013;
rom[23] = 32'h00000013;
rom[24] = 32'h00000013;
rom[25] = 32'h00000013;
rom[26] = 32'h00000013;
rom[27] = 32'h00000013;
rom[28] = 32'h00000013;
rom[29] = 32'h00000013;
rom[30] = 32'h00000013;
rom[31] = 32'h00000013;
rom[32] = 32'h00000013;
rom[33] = 32'h00000013;
rom[34] = 32'h00000013;
rom[35] = 32'h00000013;
rom[36] = 32'h00000013;
rom[37] = 32'h00000013;
rom[38] = 32'h00000013;
rom[39] = 32'h00000013;
rom[40] = 32'h00000013;
rom[41] = 32'h00000013;
rom[42] = 32'h00000013;
rom[43] = 32'h00000013;
rom[44] = 32'h00000013;
rom[45] = 32'h00000013;
rom[46] = 32'h00000013;
rom[47] = 32'h00000013;
rom[48] = 32'h00000013;
rom[49] = 32'h00000013;
rom[50] = 32'h00000013;
rom[51] = 32'h00000013;
rom[52] = 32'h00000013;
rom[53] = 32'h00000013;
rom[54] = 32'h00000013;
rom[55] = 32'h00000013;
rom[56] = 32'h00000013;
rom[57] = 32'h00000013;
rom[58] = 32'h00000013;
rom[59] = 32'h00000013;
rom[60] = 32'h00000013;
rom[61] = 32'h00000013;
rom[62] = 32'h00000013;
rom[63] = 32'h00000013;
rom[64] = 32'hFC010113;
rom[65] = 32'h00112023;
rom[66] = 32'h00512223;
@@ -101,97 +101,97 @@
rom[98] = 32'h00012083;
rom[99] = 32'h04010113;
rom[100] = 32'h00200073;
rom[101] = 32'h00000000;
rom[102] = 32'h00000000;
rom[103] = 32'h00000000;
rom[104] = 32'h00000000;
rom[105] = 32'h00000000;
rom[106] = 32'h00000000;
rom[107] = 32'h00000000;
rom[108] = 32'h00000000;
rom[109] = 32'h00000000;
rom[110] = 32'h00000000;
rom[111] = 32'h00000000;
rom[112] = 32'h00000000;
rom[113] = 32'h00000000;
rom[114] = 32'h00000000;
rom[115] = 32'h00000000;
rom[116] = 32'h00000000;
rom[117] = 32'h00000000;
rom[118] = 32'h00000000;
rom[119] = 32'h00000000;
rom[120] = 32'h00000000;
rom[121] = 32'h00000000;
rom[122] = 32'h00000000;
rom[123] = 32'h00000000;
rom[124] = 32'h00000000;
rom[125] = 32'h00000000;
rom[126] = 32'h00000000;
rom[127] = 32'h00000000;
rom[101] = 32'h00000013;
rom[102] = 32'h00000013;
rom[103] = 32'h00000013;
rom[104] = 32'h00000013;
rom[105] = 32'h00000013;
rom[106] = 32'h00000013;
rom[107] = 32'h00000013;
rom[108] = 32'h00000013;
rom[109] = 32'h00000013;
rom[110] = 32'h00000013;
rom[111] = 32'h00000013;
rom[112] = 32'h00000013;
rom[113] = 32'h00000013;
rom[114] = 32'h00000013;
rom[115] = 32'h00000013;
rom[116] = 32'h00000013;
rom[117] = 32'h00000013;
rom[118] = 32'h00000013;
rom[119] = 32'h00000013;
rom[120] = 32'h00000013;
rom[121] = 32'h00000013;
rom[122] = 32'h00000013;
rom[123] = 32'h00000013;
rom[124] = 32'h00000013;
rom[125] = 32'h00000013;
rom[126] = 32'h00000013;
rom[127] = 32'h00000013;
rom[128] = 32'hFF810113;
rom[129] = 32'h00112023;
rom[130] = 32'h4A1000EF;
rom[131] = 32'h00012083;
rom[132] = 32'h00810113;
rom[133] = 32'h00200073;
rom[134] = 32'h00000000;
rom[135] = 32'h00000000;
rom[136] = 32'h00000000;
rom[137] = 32'h00000000;
rom[138] = 32'h00000000;
rom[139] = 32'h00000000;
rom[140] = 32'h00000000;
rom[141] = 32'h00000000;
rom[142] = 32'h00000000;
rom[143] = 32'h00000000;
rom[144] = 32'h00000000;
rom[145] = 32'h00000000;
rom[146] = 32'h00000000;
rom[147] = 32'h00000000;
rom[148] = 32'h00000000;
rom[149] = 32'h00000000;
rom[150] = 32'h00000000;
rom[151] = 32'h00000000;
rom[152] = 32'h00000000;
rom[153] = 32'h00000000;
rom[154] = 32'h00000000;
rom[155] = 32'h00000000;
rom[156] = 32'h00000000;
rom[157] = 32'h00000000;
rom[158] = 32'h00000000;
rom[159] = 32'h00000000;
rom[160] = 32'h00000000;
rom[161] = 32'h00000000;
rom[162] = 32'h00000000;
rom[163] = 32'h00000000;
rom[164] = 32'h00000000;
rom[165] = 32'h00000000;
rom[166] = 32'h00000000;
rom[167] = 32'h00000000;
rom[168] = 32'h00000000;
rom[169] = 32'h00000000;
rom[170] = 32'h00000000;
rom[171] = 32'h00000000;
rom[172] = 32'h00000000;
rom[173] = 32'h00000000;
rom[174] = 32'h00000000;
rom[175] = 32'h00000000;
rom[176] = 32'h00000000;
rom[177] = 32'h00000000;
rom[178] = 32'h00000000;
rom[179] = 32'h00000000;
rom[180] = 32'h00000000;
rom[181] = 32'h00000000;
rom[182] = 32'h00000000;
rom[183] = 32'h00000000;
rom[184] = 32'h00000000;
rom[185] = 32'h00000000;
rom[186] = 32'h00000000;
rom[187] = 32'h00000000;
rom[188] = 32'h00000000;
rom[189] = 32'h00000000;
rom[190] = 32'h00000000;
rom[191] = 32'h00000000;
rom[134] = 32'h00000013;
rom[135] = 32'h00000013;
rom[136] = 32'h00000013;
rom[137] = 32'h00000013;
rom[138] = 32'h00000013;
rom[139] = 32'h00000013;
rom[140] = 32'h00000013;
rom[141] = 32'h00000013;
rom[142] = 32'h00000013;
rom[143] = 32'h00000013;
rom[144] = 32'h00000013;
rom[145] = 32'h00000013;
rom[146] = 32'h00000013;
rom[147] = 32'h00000013;
rom[148] = 32'h00000013;
rom[149] = 32'h00000013;
rom[150] = 32'h00000013;
rom[151] = 32'h00000013;
rom[152] = 32'h00000013;
rom[153] = 32'h00000013;
rom[154] = 32'h00000013;
rom[155] = 32'h00000013;
rom[156] = 32'h00000013;
rom[157] = 32'h00000013;
rom[158] = 32'h00000013;
rom[159] = 32'h00000013;
rom[160] = 32'h00000013;
rom[161] = 32'h00000013;
rom[162] = 32'h00000013;
rom[163] = 32'h00000013;
rom[164] = 32'h00000013;
rom[165] = 32'h00000013;
rom[166] = 32'h00000013;
rom[167] = 32'h00000013;
rom[168] = 32'h00000013;
rom[169] = 32'h00000013;
rom[170] = 32'h00000013;
rom[171] = 32'h00000013;
rom[172] = 32'h00000013;
rom[173] = 32'h00000013;
rom[174] = 32'h00000013;
rom[175] = 32'h00000013;
rom[176] = 32'h00000013;
rom[177] = 32'h00000013;
rom[178] = 32'h00000013;
rom[179] = 32'h00000013;
rom[180] = 32'h00000013;
rom[181] = 32'h00000013;
rom[182] = 32'h00000013;
rom[183] = 32'h00000013;
rom[184] = 32'h00000013;
rom[185] = 32'h00000013;
rom[186] = 32'h00000013;
rom[187] = 32'h00000013;
rom[188] = 32'h00000013;
rom[189] = 32'h00000013;
rom[190] = 32'h00000013;
rom[191] = 32'h00000013;
rom[192] = 32'h00200073;
rom[193] = 32'h00000793;
rom[194] = 32'h59C00713;