From 7e13571744f6a7d3af5b86b3d3a8554031beb522 Mon Sep 17 00:00:00 2001 From: Alex-create-beep <2965312221@qq.com> Date: Wed, 23 Sep 2026 20:54:28 +0800 Subject: [PATCH] =?UTF-8?q?fix(saolei):=20=E4=BF=AE=E6=98=BE=E7=A4=BA/?= =?UTF-8?q?=E9=9A=BE=E5=BA=A6/=E6=95=B0=E5=AD=97=E4=B8=89=E5=A4=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98=EF=BC=88=E5=8F=AA=E6=9C=AC=E5=9C=B0=E6=8F=90?= =?UTF-8?q?=E4=BA=A4=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1) 显示:VGA 的像素色 = 字模点 ? 字符色 : 背景色,而背景是黑的,所以 START 按钮上 那几个 C_BLACK 字母的字形点和空白处全黑,整格看不见。改成黄色。 2) 难度:三档改成微软扫雷的真实尺寸 9x9/10、16x16/40、30x16/99(原来三档都是 16x16,只有雷数不同)。棋盘尺寸由编译期常量改成运行期变量 (g_bw/g_bh/g_board_r0/g_board_c0),所有索引改用 mul/divu/remu(这颗核都有), 棋盘自动居中;BFS 加 seen_bm 去重,避免重复入队把队列撑满丢格。 3) RTL:cpu21_riscv_redirect_int_bpb 例化 cpu21_mmio 时漏传 FB_WORDS,mmio 用默认 300,fb_ok 把显存写卡在前 300 字(前 15 行),屏幕下半部分永远刷不出来。 补上 .FB_WORDS(FB_WORDS) 并给顶层加参数,mmio 默认值也改成 600。 验证: - build.ps1:编译 + check_isa 指令白名单全部通过(新增的 mul/divu/remu 都合法) - 棋盘逻辑(PC 上 gcc 跑 _tmp/logic,不改仓库):三档 x 40 局 x 全部格子, count_adj 与独立重算逐格一致,雷数、首点 3x3 安全区都正确 -> 数字与雷位没有逻辑矛盾,看到的 3 旁边 4 个雷 应是显示层问题 --- pipelined-cpu/srcs/board/cpu21_saolei_rom.vh | 2212 ++++++++--------- pipelined-cpu/srcs/rtl/cpu21_mmio.v | 2 +- .../srcs/rtl/cpu21_riscv_redirect_int_bpb.v | 11 +- saolei/sw/saolei.c | 202 +- 4 files changed, 1236 insertions(+), 1191 deletions(-) diff --git a/pipelined-cpu/srcs/board/cpu21_saolei_rom.vh b/pipelined-cpu/srcs/board/cpu21_saolei_rom.vh index bf6f7de..edc6684 100644 --- a/pipelined-cpu/srcs/board/cpu21_saolei_rom.vh +++ b/pipelined-cpu/srcs/board/cpu21_saolei_rom.vh @@ -1,9 +1,9 @@ // 由 tools/elf2hex.py 生成,请勿手工编辑 - // 源文件:D:\Xilinx\Project\risc-v\saolei\build\saolei.bin(1116 个字,其余填 NOP) + // 源文件:D:\Desktop\risc-v-cpu\saolei\build\saolei.bin(1296 个字,其余填 NOP) rom[0] = 32'h00001137; rom[1] = 32'hFFC10113; rom[2] = 32'h000012B7; - rom[3] = 32'h03428293; + rom[3] = 32'h2E428293; rom[4] = 32'h00028067; rom[5] = 32'h00000013; rom[6] = 32'h00000013; @@ -82,7 +82,7 @@ rom[79] = 32'h03012C23; rom[80] = 32'h03112E23; rom[81] = 32'h0040E073; - rom[82] = 32'h4C5000EF; + rom[82] = 32'h6E1000EF; rom[83] = 32'h03C12883; rom[84] = 32'h03812803; rom[85] = 32'h03412783; @@ -130,7 +130,7 @@ rom[127] = 32'h00000013; rom[128] = 32'hFF810113; rom[129] = 32'h00112023; - rom[130] = 32'h6A9000EF; + rom[130] = 32'h168010EF; rom[131] = 32'h00012083; rom[132] = 32'h00810113; rom[133] = 32'h00200073; @@ -193,1109 +193,1109 @@ rom[190] = 32'h00000013; rom[191] = 32'h00000013; rom[192] = 32'h00200073; - rom[193] = 32'h00000793; - rom[194] = 32'h5A400713; - rom[195] = 32'h00E7E463; - rom[196] = 32'h00008067; - rom[197] = 32'h0007A023; - rom[198] = 32'h00478793; - rom[199] = 32'hFF1FF06F; - rom[200] = 32'h00151513; - rom[201] = 32'h000027B7; - rom[202] = 32'h00F507B3; - rom[203] = 32'h03F5F593; - rom[204] = 32'h00B78023; - rom[205] = 32'h000027B7; - rom[206] = 32'h00178793; - rom[207] = 32'h00F50533; - rom[208] = 32'h00C50023; - rom[209] = 32'h00008067; - rom[210] = 32'h0055D793; - rom[211] = 32'h00279793; - rom[212] = 32'h00F50533; - rom[213] = 32'h00052503; - rom[214] = 32'h00B55533; - rom[215] = 32'h00157513; - rom[216] = 32'h00008067; - rom[217] = 32'h0055D793; - rom[218] = 32'h00279793; - rom[219] = 32'h00F50533; - rom[220] = 32'h00100793; - rom[221] = 32'h00B797B3; - rom[222] = 32'h00052583; - rom[223] = 32'h00F5E5B3; - rom[224] = 32'h00B52023; - rom[225] = 32'h00008067; - rom[226] = 32'h02800793; - rom[227] = 32'h00750513; - rom[228] = 32'h02F50533; - rom[229] = 32'h00C58793; - rom[230] = 32'h00060593; - rom[231] = 32'h00068613; - rom[232] = 32'h00F50533; - rom[233] = 32'hF7DFF06F; - rom[234] = 32'hFE010113; - rom[235] = 32'h00812C23; - rom[236] = 32'h00112E23; - rom[237] = 32'h00000513; - rom[238] = 32'h4B000413; - rom[239] = 32'h00000613; - rom[240] = 32'h00000593; - rom[241] = 32'h00A12623; - rom[242] = 32'hF59FF0EF; - rom[243] = 32'h00C12503; - rom[244] = 32'h00150513; - rom[245] = 32'hFE8514E3; - rom[246] = 32'h01C12083; - rom[247] = 32'h01812403; - rom[248] = 32'h02010113; - rom[249] = 32'h00008067; - rom[250] = 32'h41802783; - rom[251] = 32'h41402703; - rom[252] = 32'h01F7F793; - rom[253] = 32'h00879793; - rom[254] = 32'h01F77713; - rom[255] = 32'h00E7E7B3; - rom[256] = 32'h00001737; - rom[257] = 32'h14F72223; - rom[258] = 32'h00008067; - rom[259] = 32'h41402783; - rom[260] = 32'h00F585B3; - rom[261] = 32'h01C00793; - rom[262] = 32'h00B7D463; - rom[263] = 32'h00078593; - rom[264] = 32'h00B00793; - rom[265] = 32'h00F5D463; - rom[266] = 32'h00078593; - rom[267] = 32'h41802783; - rom[268] = 32'h00A78533; - rom[269] = 32'h01700793; - rom[270] = 32'h00A7D463; - rom[271] = 32'h00078513; - rom[272] = 32'h00600793; - rom[273] = 32'h00F55463; - rom[274] = 32'h00078513; - rom[275] = 32'h40A02C23; - rom[276] = 32'h40B02A23; - rom[277] = 32'hF95FF06F; - rom[278] = 32'h41402783; - rom[279] = 32'h00F585B3; - rom[280] = 32'h02700793; - rom[281] = 32'h02B7D863; - rom[282] = 32'h00078593; - rom[283] = 32'h41802783; - rom[284] = 32'h00A787B3; - rom[285] = 32'h01D00513; - rom[286] = 32'h00F54863; - rom[287] = 32'hFFF7C513; - rom[288] = 32'h41F55513; - rom[289] = 32'h00A7F533; - rom[290] = 32'h40A02C23; - rom[291] = 32'h40B02A23; - rom[292] = 32'hF59FF06F; - rom[293] = 32'hFFF5C793; - rom[294] = 32'h41F7D793; - rom[295] = 32'h00F5F5B3; - rom[296] = 32'hFCDFF06F; - rom[297] = 32'h41802783; - rom[298] = 32'h00F00713; - rom[299] = 32'h00000513; - rom[300] = 32'hFF978793; - rom[301] = 32'h00F76863; - rom[302] = 32'h41402503; - rom[303] = 32'hFF450513; - rom[304] = 32'h01053513; + rom[193] = 32'h00001737; + rom[194] = 32'h00000793; + rom[195] = 32'h9CC70713; + rom[196] = 32'h00E7E463; + rom[197] = 32'h00008067; + rom[198] = 32'h0007A023; + rom[199] = 32'h00478793; + rom[200] = 32'hFF1FF06F; + rom[201] = 32'h00151513; + rom[202] = 32'h000027B7; + rom[203] = 32'h00F507B3; + rom[204] = 32'h03F5F593; + rom[205] = 32'h00B78023; + rom[206] = 32'h000027B7; + rom[207] = 32'h00178793; + rom[208] = 32'h00F50533; + rom[209] = 32'h00C50023; + rom[210] = 32'h00008067; + rom[211] = 32'h0055D793; + rom[212] = 32'h00279793; + rom[213] = 32'h00F50533; + rom[214] = 32'h00052503; + rom[215] = 32'h00B55533; + rom[216] = 32'h00157513; + rom[217] = 32'h00008067; + rom[218] = 32'h0055D793; + rom[219] = 32'h00279793; + rom[220] = 32'h00F50533; + rom[221] = 32'h00100793; + rom[222] = 32'h00B797B3; + rom[223] = 32'h00052583; + rom[224] = 32'h00F5E5B3; + rom[225] = 32'h00B52023; + rom[226] = 32'h00008067; + rom[227] = 32'h000017B7; + rom[228] = 32'h8AC7A783; + rom[229] = 32'h00F50533; + rom[230] = 32'h02800793; + rom[231] = 32'h02F50533; + rom[232] = 32'h000017B7; + rom[233] = 32'h8A87A783; + rom[234] = 32'h00F587B3; + rom[235] = 32'h00060593; + rom[236] = 32'h00068613; + rom[237] = 32'h00F50533; + rom[238] = 32'hF6DFF06F; + rom[239] = 32'h00001737; + rom[240] = 32'h8AC72703; + rom[241] = 32'h79802783; + rom[242] = 32'h40E787B3; + rom[243] = 32'h00001737; + rom[244] = 32'h8BC72703; + rom[245] = 32'h02E787B3; + rom[246] = 32'h79402503; + rom[247] = 32'h00001737; + rom[248] = 32'h8A872703; + rom[249] = 32'h40E50533; + rom[250] = 32'h00A78533; + rom[251] = 32'h00008067; + rom[252] = 32'h06050C63; + rom[253] = 32'h00200793; + rom[254] = 32'h08F50063; + rom[255] = 32'h01000793; + rom[256] = 32'h00078693; + rom[257] = 32'h02800713; + rom[258] = 32'h7AA02023; + rom[259] = 32'h00001637; + rom[260] = 32'h8AF62E23; + rom[261] = 32'h00001637; + rom[262] = 32'h8AD62C23; + rom[263] = 32'h7AE02223; + rom[264] = 32'h02F68733; + rom[265] = 32'h00001637; + rom[266] = 32'h8AE62A23; + rom[267] = 32'h01F70713; + rom[268] = 32'h00575713; + rom[269] = 32'h00001637; + rom[270] = 32'h8AE62823; + rom[271] = 32'h02800713; + rom[272] = 32'h40F707B3; + rom[273] = 32'h0017D793; + rom[274] = 32'h00001737; + rom[275] = 32'h8AF72423; + rom[276] = 32'h01E00793; + rom[277] = 32'h40D787B3; + rom[278] = 32'h0017D793; + rom[279] = 32'h00001737; + rom[280] = 32'h8AF72623; + rom[281] = 32'h00008067; + rom[282] = 32'h00900793; + rom[283] = 32'h00078693; + rom[284] = 32'h00A00713; + rom[285] = 32'hF95FF06F; + rom[286] = 32'h01E00793; + rom[287] = 32'h01000693; + rom[288] = 32'h06300713; + rom[289] = 32'hF85FF06F; + rom[290] = 32'hFE010113; + rom[291] = 32'h00812C23; + rom[292] = 32'h00112E23; + rom[293] = 32'h00000513; + rom[294] = 32'h4B000413; + rom[295] = 32'h00000613; + rom[296] = 32'h00000593; + rom[297] = 32'h00A12623; + rom[298] = 32'hE7DFF0EF; + rom[299] = 32'h00C12503; + rom[300] = 32'h00150513; + rom[301] = 32'hFE8514E3; + rom[302] = 32'h01C12083; + rom[303] = 32'h01812403; + rom[304] = 32'h02010113; rom[305] = 32'h00008067; - rom[306] = 32'hFF010113; - rom[307] = 32'h00812423; - rom[308] = 32'h00912223; - rom[309] = 32'h00112623; - rom[310] = 32'hED1FF0EF; - rom[311] = 32'h000027B7; - rom[312] = 32'h01C00593; - rom[313] = 32'h20B78223; - rom[314] = 32'h00078713; - rom[315] = 32'h00400793; - rom[316] = 32'h20F702A3; - rom[317] = 32'h01800693; - rom[318] = 32'h20D70323; - rom[319] = 32'h20F703A3; - rom[320] = 32'h01D00613; - rom[321] = 32'h20C70423; - rom[322] = 32'h20F704A3; - rom[323] = 32'h00070693; - rom[324] = 32'h01400713; - rom[325] = 32'h20E68523; - rom[326] = 32'h20F685A3; - rom[327] = 32'h02200513; - rom[328] = 32'h20A68623; - rom[329] = 32'h20F686A3; - rom[330] = 32'h42002783; - rom[331] = 32'h00002837; - rom[332] = 32'h48E80223; - rom[333] = 32'h00F037B3; - rom[334] = 32'h00678793; - rom[335] = 32'h48F802A3; - rom[336] = 32'h01000713; - rom[337] = 32'h48E80323; - rom[338] = 32'h48F803A3; - rom[339] = 32'h48A80423; - rom[340] = 32'h48F804A3; - rom[341] = 32'h00080513; - rom[342] = 32'h02800813; - rom[343] = 32'h49050523; - rom[344] = 32'h48F505A3; - rom[345] = 32'h42002783; - rom[346] = 32'h52C50023; - rom[347] = 32'h00050613; - rom[348] = 32'hFFF78793; - rom[349] = 32'h00F037B3; - rom[350] = 32'h00678793; - rom[351] = 32'h52F500A3; - rom[352] = 32'h01E00513; - rom[353] = 32'h52A60123; - rom[354] = 32'h52F601A3; - rom[355] = 32'h00060513; - rom[356] = 32'h02100613; - rom[357] = 32'h52C50223; - rom[358] = 32'h52F502A3; - rom[359] = 32'h52B50323; - rom[360] = 32'h52F503A3; - rom[361] = 32'h52E50423; - rom[362] = 32'h00050593; - rom[363] = 32'h52F504A3; - rom[364] = 32'h01B00513; - rom[365] = 32'h52A58523; - rom[366] = 32'h52F585A3; - rom[367] = 32'h42002783; - rom[368] = 32'h00058693; - rom[369] = 32'h01700593; - rom[370] = 32'hFFE78793; - rom[371] = 32'h00F037B3; - rom[372] = 32'h5CB68223; - rom[373] = 32'h00678793; - rom[374] = 32'h5CF682A3; - rom[375] = 32'h5CE68323; - rom[376] = 32'h5CF683A3; - rom[377] = 32'h5CC68423; - rom[378] = 32'h00068713; - rom[379] = 32'h5CF684A3; - rom[380] = 32'h01300693; - rom[381] = 32'h5CD70523; - rom[382] = 32'h5CF705A3; - rom[383] = 32'h30900413; - rom[384] = 32'h30F00493; - rom[385] = 32'h00040513; - rom[386] = 32'h00600613; - rom[387] = 32'h00E00593; - rom[388] = 32'hD11FF0EF; - rom[389] = 32'h02840513; - rom[390] = 32'h00200613; - rom[391] = 32'h00F00593; - rom[392] = 32'hD01FF0EF; - rom[393] = 32'h05040513; - rom[394] = 32'h00600613; - rom[395] = 32'h00E00593; - rom[396] = 32'h00140413; - rom[397] = 32'hCEDFF0EF; - rom[398] = 32'hFC9416E3; - rom[399] = 32'h000027B7; - rom[400] = 32'h02200713; - rom[401] = 32'h66E78123; - rom[402] = 32'h660781A3; - rom[403] = 32'h00078713; - rom[404] = 32'h02300793; - rom[405] = 32'h66F70223; - rom[406] = 32'h660702A3; - rom[407] = 32'h01000693; - rom[408] = 32'h66D70323; - rom[409] = 32'h660703A3; - rom[410] = 32'h02100693; - rom[411] = 32'h66D70423; - rom[412] = 32'h660704A3; - rom[413] = 32'h66F70523; - rom[414] = 32'h660705A3; - rom[415] = 32'h3CC00413; - rom[416] = 32'h3DC00493; - rom[417] = 32'h00040513; - rom[418] = 32'h00300613; - rom[419] = 32'h00E00593; - rom[420] = 32'h00140413; - rom[421] = 32'hC8DFF0EF; - rom[422] = 32'hFE9416E3; - rom[423] = 32'h00100413; - rom[424] = 32'h000017B7; - rom[425] = 32'h1487A023; - rom[426] = 32'h01400713; - rom[427] = 32'h40E02C23; - rom[428] = 32'h01300713; - rom[429] = 32'h40E02A23; - rom[430] = 32'hD31FF0EF; - rom[431] = 32'h000017B7; - rom[432] = 32'h0087A023; - rom[433] = 32'h00C12083; - rom[434] = 32'h00812403; - rom[435] = 32'h0007A223; - rom[436] = 32'h00412483; - rom[437] = 32'h01010113; - rom[438] = 32'h00008067; - rom[439] = 32'hFD010113; - rom[440] = 32'h02112623; - rom[441] = 32'h02812423; - rom[442] = 32'h02912223; - rom[443] = 32'h03212023; - rom[444] = 32'h01312E23; - rom[445] = 32'h01412C23; - rom[446] = 32'hDADFF0EF; - rom[447] = 32'h08050C63; - rom[448] = 32'h41802483; - rom[449] = 32'h41402903; - rom[450] = 32'hFF948493; - rom[451] = 32'h00449593; - rom[452] = 32'hFF490913; - rom[453] = 32'h012585B3; - rom[454] = 32'h45800513; - rom[455] = 32'h00B12623; - rom[456] = 32'hC29FF0EF; - rom[457] = 32'h06051863; - rom[458] = 32'h00C12583; - rom[459] = 32'h43800513; - rom[460] = 32'hC19FF0EF; - rom[461] = 32'h43002403; - rom[462] = 32'h00C12583; - rom[463] = 32'h06050C63; - rom[464] = 32'h0055D793; - rom[465] = 32'h00279793; - rom[466] = 32'h43800993; - rom[467] = 32'h013787B3; - rom[468] = 32'h0007A683; - rom[469] = 32'h00100713; - rom[470] = 32'h00B71733; - rom[471] = 32'hFFF74713; - rom[472] = 32'h00E6F733; - rom[473] = 32'hFFF40413; - rom[474] = 32'h00E7A023; - rom[475] = 32'h42802823; - rom[476] = 32'h00700693; - rom[477] = 32'h00900613; - rom[478] = 32'h00090593; - rom[479] = 32'h00048513; - rom[480] = 32'hC09FF0EF; - rom[481] = 32'h42402783; - rom[482] = 32'h00001737; - rom[483] = 32'h408787B3; - rom[484] = 32'h00F72023; - rom[485] = 32'h02C12083; - rom[486] = 32'h02812403; - rom[487] = 32'h02412483; - rom[488] = 32'h02012903; - rom[489] = 32'h01C12983; - rom[490] = 32'h01812A03; - rom[491] = 32'h03010113; - rom[492] = 32'h00008067; - rom[493] = 32'h43800513; - rom[494] = 32'hBADFF0EF; - rom[495] = 32'h00140413; - rom[496] = 32'h42802823; - rom[497] = 32'h00600693; - rom[498] = 32'h00A00613; - rom[499] = 32'hFADFF06F; - rom[500] = 32'hFA010113; - rom[501] = 32'h04912A23; - rom[502] = 32'h00855713; - rom[503] = 32'h01055793; - rom[504] = 32'h0FF57493; - rom[505] = 32'h04112E23; - rom[506] = 32'h04812C23; - rom[507] = 32'h05212823; - rom[508] = 32'h05312623; - rom[509] = 32'h05412423; - rom[510] = 32'h05512223; - rom[511] = 32'h05612023; - rom[512] = 32'h03712E23; - rom[513] = 32'h03812C23; - rom[514] = 32'h03912A23; - rom[515] = 32'h03A12823; - rom[516] = 32'h03B12623; - rom[517] = 32'h08057513; - rom[518] = 32'h00050463; - rom[519] = 32'hF0048493; - rom[520] = 32'h0FF77413; - rom[521] = 32'h08077713; - rom[522] = 32'h00070463; - rom[523] = 32'hF0040413; - rom[524] = 32'h00001737; - rom[525] = 32'h11072703; - rom[526] = 32'h0017F693; - rom[527] = 32'h4E068263; - rom[528] = 32'h41802403; - rom[529] = 32'h00802783; - rom[530] = 32'h0E079A63; - rom[531] = 32'h00E00793; - rom[532] = 32'h04F41263; - rom[533] = 32'h42002023; - rom[534] = 32'h05812403; - rom[535] = 32'h05C12083; - rom[536] = 32'h05412483; - rom[537] = 32'h05012903; - rom[538] = 32'h04C12983; - rom[539] = 32'h04812A03; - rom[540] = 32'h04412A83; - rom[541] = 32'h04012B03; - rom[542] = 32'h03C12B83; - rom[543] = 32'h03812C03; - rom[544] = 32'h03412C83; - rom[545] = 32'h03012D03; - rom[546] = 32'h02C12D83; - rom[547] = 32'h06010113; - rom[548] = 32'hC39FF06F; - rom[549] = 32'h01000793; - rom[550] = 32'h00F41863; - rom[551] = 32'h00100713; - rom[552] = 32'h42E02023; - rom[553] = 32'hFB5FF06F; - rom[554] = 32'h01200793; - rom[555] = 32'h00F41663; - rom[556] = 32'h00200713; - rom[557] = 32'hFEDFF06F; - rom[558] = 32'h01400793; - rom[559] = 32'h04F41263; - rom[560] = 32'h41402783; - rom[561] = 32'h00500713; - rom[562] = 32'hFEF78793; - rom[563] = 32'h02F76A63; - rom[564] = 32'h00100793; - rom[565] = 32'h00F02423; - rom[566] = 32'h42002783; - rom[567] = 32'h00078A63; - rom[568] = 32'h00200713; - rom[569] = 32'h03C00413; - rom[570] = 32'h00E78463; - rom[571] = 32'h02800413; - rom[572] = 32'h42802223; - rom[573] = 32'h00100713; - rom[574] = 32'h000017B7; - rom[575] = 32'h12E7A023; - rom[576] = 32'h05C12083; - rom[577] = 32'h05812403; - rom[578] = 32'h05412483; - rom[579] = 32'h05012903; - rom[580] = 32'h04C12983; - rom[581] = 32'h04812A03; - rom[582] = 32'h04412A83; - rom[583] = 32'h04012B03; - rom[584] = 32'h03C12B83; - rom[585] = 32'h03812C03; - rom[586] = 32'h03412C83; - rom[587] = 32'h03012D03; - rom[588] = 32'h02C12D83; - rom[589] = 32'h06010113; - rom[590] = 32'h00008067; - rom[591] = 32'h00600793; - rom[592] = 32'h00F41E63; - rom[593] = 32'h41402683; - rom[594] = 32'h00B00793; - rom[595] = 32'h00F69863; - rom[596] = 32'h00100713; - rom[597] = 32'h00E02223; - rom[598] = 32'hFA9FF06F; - rom[599] = 32'h00977793; - rom[600] = 32'h04078063; - rom[601] = 32'h05812403; - rom[602] = 32'h05C12083; - rom[603] = 32'h05412483; - rom[604] = 32'h05012903; - rom[605] = 32'h04C12983; - rom[606] = 32'h04812A03; - rom[607] = 32'h04412A83; - rom[608] = 32'h04012B03; - rom[609] = 32'h03C12B83; - rom[610] = 32'h03812C03; - rom[611] = 32'h03412C83; - rom[612] = 32'h03012D03; - rom[613] = 32'h02C12D83; - rom[614] = 32'h06010113; - rom[615] = 32'hD41FF06F; - rom[616] = 32'hB05FF0EF; - rom[617] = 32'h00050493; - rom[618] = 32'hF4050CE3; - rom[619] = 32'h41402783; - rom[620] = 32'hFF940413; - rom[621] = 32'h00441413; - rom[622] = 32'hFF478793; - rom[623] = 32'h00F40433; - rom[624] = 32'h00040593; - rom[625] = 32'h43800513; - rom[626] = 32'h981FF0EF; - rom[627] = 32'hF2051AE3; - rom[628] = 32'h42802D03; - rom[629] = 32'h020D1C63; - rom[630] = 32'h00445B13; - rom[631] = 32'h41C659B7; - rom[632] = 32'h00003A37; - rom[633] = 32'h47800793; - rom[634] = 32'h00F47B93; - rom[635] = 32'hE6D98993; - rom[636] = 32'h039A0A13; - rom[637] = 32'h00F12423; - rom[638] = 32'h001B0C93; - rom[639] = 32'h42402783; - rom[640] = 32'h0AFD6263; - rom[641] = 32'h00100793; - rom[642] = 32'h42F02423; - rom[643] = 32'h00040593; - rom[644] = 32'h45800513; - rom[645] = 32'h935FF0EF; - rom[646] = 32'hEE0514E3; - rom[647] = 32'h00040593; - rom[648] = 32'h43800513; - rom[649] = 32'h925FF0EF; - rom[650] = 32'h00050993; - rom[651] = 32'hEC051AE3; - rom[652] = 32'h00040593; - rom[653] = 32'h47800513; - rom[654] = 32'h911FF0EF; - rom[655] = 32'h00050A13; - rom[656] = 32'h0E050463; - rom[657] = 32'h47800A93; - rom[658] = 32'h43800913; - rom[659] = 32'h00F47493; - rom[660] = 32'h00445A13; - rom[661] = 32'h00098593; - rom[662] = 32'h000A8513; - rom[663] = 32'h8EDFF0EF; - rom[664] = 32'h00050E63; - rom[665] = 32'h0B341063; - rom[666] = 32'h00400693; - rom[667] = 32'h00C00613; - rom[668] = 32'h00048593; - rom[669] = 32'h000A0513; - rom[670] = 32'h911FF0EF; - rom[671] = 32'h00198993; - rom[672] = 32'h10000793; - rom[673] = 32'hFCF998E3; - rom[674] = 32'h0000E7B7; - rom[675] = 32'h00001737; - rom[676] = 32'hEAD78793; - rom[677] = 32'h00F72023; - rom[678] = 32'h00200713; - rom[679] = 32'h42E02623; - rom[680] = 32'hE61FF06F; - rom[681] = 32'h41C02783; - rom[682] = 32'h033787B3; - rom[683] = 32'h014787B3; - rom[684] = 32'h40F02E23; - rom[685] = 32'h0107D793; - rom[686] = 32'h0FF7F593; - rom[687] = 32'h0045D713; - rom[688] = 32'h00170693; - rom[689] = 32'h0166EE63; - rom[690] = 32'h00ECEC63; - rom[691] = 32'h00F7F793; - rom[692] = 32'h00178713; - rom[693] = 32'h01776663; - rom[694] = 32'h001B8713; - rom[695] = 32'hF2F770E3; - rom[696] = 32'h00812503; - rom[697] = 32'h00B12623; - rom[698] = 32'h861FF0EF; - rom[699] = 32'hF00518E3; - rom[700] = 32'h00C12583; - rom[701] = 32'h00812503; - rom[702] = 32'h001D0D13; - rom[703] = 32'h869FF0EF; - rom[704] = 32'hEFDFF06F; - rom[705] = 32'h00098593; - rom[706] = 32'h00090513; - rom[707] = 32'h83DFF0EF; - rom[708] = 32'hF60516E3; - rom[709] = 32'h00400693; - rom[710] = 32'h00B00613; - rom[711] = 32'h00F9F593; - rom[712] = 32'h0049D513; - rom[713] = 32'hF55FF06F; - rom[714] = 32'h00C00913; - rom[715] = 32'h45800793; - rom[716] = 32'h00892023; - rom[717] = 32'h00090C13; - rom[718] = 32'h00000B93; - rom[719] = 32'h00F12623; - rom[720] = 32'h000C2C83; - rom[721] = 32'h00C12503; - rom[722] = 32'h001B8B93; - rom[723] = 32'h000C8593; - rom[724] = 32'hFF8FF0EF; - rom[725] = 32'h00050413; - rom[726] = 32'h16051263; - rom[727] = 32'h43402D83; - rom[728] = 32'h00C12503; - rom[729] = 32'h000C8593; - rom[730] = 32'h004CDD13; - rom[731] = 32'hFF8FF0EF; - rom[732] = 32'h001D8D93; - rom[733] = 32'h43B02A23; - rom[734] = 32'h01A03733; - rom[735] = 32'h001D0313; - rom[736] = 32'h00F00793; - rom[737] = 32'h00FCFC93; - rom[738] = 32'h40ED09B3; - rom[739] = 32'h0067F463; - rom[740] = 32'h00078313; - rom[741] = 32'h01903B33; - rom[742] = 32'h416C87B3; - rom[743] = 32'h00F12423; - rom[744] = 32'h001C8B13; - rom[745] = 32'h00F00793; - rom[746] = 32'h0167F463; - rom[747] = 32'h00078B13; - rom[748] = 32'h00098793; - rom[749] = 32'h04F36E63; - rom[750] = 32'h00812D83; - rom[751] = 32'h40FD0633; - rom[752] = 32'h00479693; - rom[753] = 32'h0400006F; - rom[754] = 32'h01BC9463; - rom[755] = 32'h02060A63; - rom[756] = 32'h00F12C23; - rom[757] = 32'h01B685B3; - rom[758] = 32'h47800513; - rom[759] = 32'h00C12E23; - rom[760] = 32'h00612A23; - rom[761] = 32'h00D12823; - rom[762] = 32'hF60FF0EF; - rom[763] = 32'h01C12603; - rom[764] = 32'h01812783; - rom[765] = 32'h01412303; - rom[766] = 32'h01012683; - rom[767] = 32'h00A40433; - rom[768] = 32'h001D8D93; - rom[769] = 32'hFDBB72E3; - rom[770] = 32'h00178793; - rom[771] = 32'hFA9FF06F; - rom[772] = 32'h00100793; - rom[773] = 32'h00040693; - rom[774] = 32'h04F40063; - rom[775] = 32'h00200793; - rom[776] = 32'h02F40C63; - rom[777] = 32'h00400793; - rom[778] = 32'h00300613; - rom[779] = 32'h00078693; - rom[780] = 32'h02C40463; - rom[781] = 32'h00500593; - rom[782] = 32'h00058693; - rom[783] = 32'h00F40E63; - rom[784] = 32'h00600793; - rom[785] = 32'h00078693; - rom[786] = 32'h00B40863; - rom[787] = 32'h00060693; - rom[788] = 32'h00F40463; - rom[789] = 32'h00700693; - rom[790] = 32'h00040613; - rom[791] = 32'h000C8593; - rom[792] = 32'h000D0513; - rom[793] = 32'h00612823; - rom[794] = 32'hF20FF0EF; - rom[795] = 32'h04041863; - rom[796] = 32'h01012303; - rom[797] = 32'h05336463; - rom[798] = 32'h00812783; - rom[799] = 32'h41A985B3; - rom[800] = 32'h00499613; - rom[801] = 32'h02C0006F; - rom[802] = 32'h01979463; - rom[803] = 32'h02058063; - rom[804] = 32'h0FF00713; - rom[805] = 32'h00976C63; - rom[806] = 32'h00249693; - rom[807] = 32'h00D906B3; - rom[808] = 32'h00C78533; - rom[809] = 32'h00A6A023; - rom[810] = 32'h00148493; - rom[811] = 32'h00178793; - rom[812] = 32'hFCFB7CE3; - rom[813] = 32'h00198993; - rom[814] = 32'hFBDFF06F; - rom[815] = 32'h004C0C13; - rom[816] = 32'hE89BE0E3; - rom[817] = 32'h42402783; - rom[818] = 32'h43402703; - rom[819] = 32'h10000413; - rom[820] = 32'h40F407B3; - rom[821] = 32'hC2E796E3; - rom[822] = 32'h47800A93; - rom[823] = 32'h000A0593; - rom[824] = 32'h000A8513; - rom[825] = 32'hE64FF0EF; - rom[826] = 32'h00050C63; - rom[827] = 32'h00600693; - rom[828] = 32'h00A00613; - rom[829] = 32'h00FA7593; - rom[830] = 32'h004A5513; - rom[831] = 32'hE8CFF0EF; - rom[832] = 32'h001A0A13; - rom[833] = 32'hFC8A1CE3; - rom[834] = 32'h0000F7B7; - rom[835] = 32'h00001737; - rom[836] = 32'h00D78793; - rom[837] = 32'h00F72023; - rom[838] = 32'h00100713; - rom[839] = 32'hD81FF06F; - rom[840] = 32'h0027F793; - rom[841] = 32'h00078863; - rom[842] = 32'h00802783; - rom[843] = 32'hBC078AE3; - rom[844] = 32'hC35FF06F; - rom[845] = 32'h41002783; - rom[846] = 32'h00700A13; - rom[847] = 32'h00F484B3; - rom[848] = 32'h40C02783; - rom[849] = 32'h40902823; - rom[850] = 32'h00F40433; - rom[851] = 32'h40802623; - rom[852] = 32'h029A4E63; - rom[853] = 32'hFF900A13; - rom[854] = 32'h0544CE63; - rom[855] = 32'h00700493; - rom[856] = 32'h0684CE63; - rom[857] = 32'hFF900493; - rom[858] = 32'hB8945CE3; - rom[859] = 32'h00802783; - rom[860] = 32'h00000593; - rom[861] = 32'hFFF00513; - rom[862] = 32'h08078663; - rom[863] = 32'hE90FF0EF; - rom[864] = 32'h00840413; - rom[865] = 32'h40802623; - rom[866] = 32'hFE1FF06F; - rom[867] = 32'h00802783; - rom[868] = 32'h00100593; - rom[869] = 32'h00000513; - rom[870] = 32'h00078A63; - rom[871] = 32'hE70FF0EF; - rom[872] = 32'hFF848493; - rom[873] = 32'h40902823; - rom[874] = 32'hFA9FF06F; - rom[875] = 32'hEACFF0EF; - rom[876] = 32'hFF1FF06F; - rom[877] = 32'h00802783; - rom[878] = 32'hFFF00593; - rom[879] = 32'h00000513; - rom[880] = 32'h00078A63; - rom[881] = 32'hE48FF0EF; - rom[882] = 32'h00848493; - rom[883] = 32'h40902823; - rom[884] = 32'hF89FF06F; - rom[885] = 32'hE84FF0EF; - rom[886] = 32'hFF1FF06F; - rom[887] = 32'h00802783; - rom[888] = 32'h00000593; - rom[889] = 32'h00100513; - rom[890] = 32'h00078A63; - rom[891] = 32'hE20FF0EF; - rom[892] = 32'hFF840413; - rom[893] = 32'h40802623; - rom[894] = 32'hF69FF06F; - rom[895] = 32'hE5CFF0EF; - rom[896] = 32'hFF1FF06F; - rom[897] = 32'hE54FF0EF; - rom[898] = 32'hF79FF06F; - rom[899] = 32'hFE010113; - rom[900] = 32'h00112E23; - rom[901] = 32'h00812C23; - rom[902] = 32'h00912A23; - rom[903] = 32'h01212823; - rom[904] = 32'h01312623; - rom[905] = 32'h01412423; - rom[906] = 32'h01512223; - rom[907] = 32'h01612023; - rom[908] = 32'h00000793; - rom[909] = 32'h47800613; - rom[910] = 32'h45800693; - rom[911] = 32'h43800713; - rom[912] = 32'h02000593; - rom[913] = 32'h00C78533; - rom[914] = 32'h00052023; - rom[915] = 32'h00D78533; - rom[916] = 32'h00052023; - rom[917] = 32'h00E78533; - rom[918] = 32'h00052023; - rom[919] = 32'h00478793; - rom[920] = 32'hFEB792E3; - rom[921] = 32'h42002A23; - rom[922] = 32'h42002823; - rom[923] = 32'h42002423; - rom[924] = 32'h40002823; - rom[925] = 32'h40002623; - rom[926] = 32'h00F00713; - rom[927] = 32'h40E02C23; - rom[928] = 32'h01400713; - rom[929] = 32'h42002623; - rom[930] = 32'h00002223; - rom[931] = 32'h40E02A23; - rom[932] = 32'h0FB00913; - rom[933] = 32'hD14FF0EF; - rom[934] = 32'h10D00993; - rom[935] = 32'h00090513; - rom[936] = 32'h00300613; - rom[937] = 32'h00F00593; - rom[938] = 32'hC78FF0EF; - rom[939] = 32'h2A890513; - rom[940] = 32'h00300613; - rom[941] = 32'h00F00593; - rom[942] = 32'h00190913; - rom[943] = 32'hC64FF0EF; - rom[944] = 32'hFD391EE3; - rom[945] = 32'h0FB00913; - rom[946] = 32'h3CB00993; - rom[947] = 32'h00090513; - rom[948] = 32'h00300613; - rom[949] = 32'h00F00593; - rom[950] = 32'hC48FF0EF; - rom[951] = 32'h01190513; - rom[952] = 32'h00300613; - rom[953] = 32'h00F00593; - rom[954] = 32'h02890913; - rom[955] = 32'hC34FF0EF; - rom[956] = 32'hFD391EE3; - rom[957] = 32'h00000913; - rom[958] = 32'h01000993; - rom[959] = 32'h00000A13; - rom[960] = 32'h000A0593; - rom[961] = 32'h00700693; - rom[962] = 32'h00900613; - rom[963] = 32'h00090513; - rom[964] = 32'h001A0A13; - rom[965] = 32'hC74FF0EF; - rom[966] = 32'hFF3A14E3; - rom[967] = 32'h00190913; - rom[968] = 32'hFD491EE3; - rom[969] = 32'h000027B7; - rom[970] = 32'h00E00713; - rom[971] = 32'h1EE78B23; - rom[972] = 32'h00600713; - rom[973] = 32'h1EE78BA3; - rom[974] = 32'h00100913; - rom[975] = 32'h000017B7; - rom[976] = 32'h1527A023; - rom[977] = 32'hCA4FF0EF; - rom[978] = 32'h42402683; - rom[979] = 32'h00001737; - rom[980] = 32'h00D72023; - rom[981] = 32'h42402703; - rom[982] = 32'h000017B7; - rom[983] = 32'h00E7A223; - rom[984] = 32'h11878A13; - rom[985] = 32'h4A400A93; - rom[986] = 32'h00402783; - rom[987] = 32'h02078C63; - rom[988] = 32'h01812403; - rom[989] = 32'h000017B7; - rom[990] = 32'h1207A023; - rom[991] = 32'h01C12083; - rom[992] = 32'h01412483; - rom[993] = 32'h01012903; - rom[994] = 32'h00C12983; - rom[995] = 32'h00812A03; - rom[996] = 32'h00412A83; - rom[997] = 32'h00012B03; - rom[998] = 32'h00002423; - rom[999] = 32'h02010113; - rom[1000] = 32'hD28FF06F; - rom[1001] = 32'h4A002683; - rom[1002] = 32'h49C02783; - rom[1003] = 32'h42C02703; - rom[1004] = 32'h04F68063; - rom[1005] = 32'h4A002783; - rom[1006] = 32'h00279793; - rom[1007] = 32'h00FA87B3; - rom[1008] = 32'h0007A503; - rom[1009] = 32'h4A002783; - rom[1010] = 32'h00178793; - rom[1011] = 32'h03F7F793; - rom[1012] = 32'h4AF02023; - rom[1013] = 32'h00071663; - rom[1014] = 32'hFF8FF0EF; - rom[1015] = 32'hF8DFF06F; - rom[1016] = 32'h00F51793; - rom[1017] = 32'hF807D2E3; - rom[1018] = 32'h01202223; - rom[1019] = 32'hF7DFF06F; - rom[1020] = 32'hF6070CE3; - rom[1021] = 32'h000A2783; - rom[1022] = 32'h01F7F793; - rom[1023] = 32'hF60796E3; - rom[1024] = 32'h00002783; - rom[1025] = 32'h0017C613; - rom[1026] = 32'h00C02023; - rom[1027] = 32'h00100693; - rom[1028] = 32'h00D78C63; - rom[1029] = 32'h00400793; - rom[1030] = 32'h00D71463; - rom[1031] = 32'h00200793; - rom[1032] = 32'h00479793; - rom[1033] = 32'h0017E793; - rom[1034] = 32'h00001737; - rom[1035] = 32'h14F72023; - rom[1036] = 32'hF39FF06F; - rom[1037] = 32'hFF010113; - rom[1038] = 32'h00112623; - rom[1039] = 32'h00812423; - rom[1040] = 32'h00912223; - rom[1041] = 32'h01212023; - rom[1042] = 32'hABCFF0EF; - rom[1043] = 32'h000017B7; - rom[1044] = 32'h1147A783; - rom[1045] = 32'h0017E793; - rom[1046] = 32'h40F02E23; - rom[1047] = 32'h00100793; - rom[1048] = 32'h42F02023; - rom[1049] = 32'h00001737; - rom[1050] = 32'h10F72623; - rom[1051] = 32'h12072023; - rom[1052] = 32'h00002423; - rom[1053] = 32'hC54FF0EF; - rom[1054] = 32'h4A400493; - rom[1055] = 32'h4A002703; - rom[1056] = 32'h49C02783; - rom[1057] = 32'hFEF70CE3; - rom[1058] = 32'h4A002783; - rom[1059] = 32'h00279793; - rom[1060] = 32'h00F487B3; - rom[1061] = 32'h0007A503; - rom[1062] = 32'h4A002783; - rom[1063] = 32'h00178793; - rom[1064] = 32'h03F7F793; - rom[1065] = 32'h4AF02023; - rom[1066] = 32'hF28FF0EF; - rom[1067] = 32'hFD1FF06F; - rom[1068] = 32'hFD010113; - rom[1069] = 32'h03212223; - rom[1070] = 32'h03312023; - rom[1071] = 32'h01512C23; - rom[1072] = 32'h00001937; - rom[1073] = 32'h000019B7; - rom[1074] = 32'h01412E23; - rom[1075] = 32'h01612A23; - rom[1076] = 32'h01712823; - rom[1077] = 32'h02812623; - rom[1078] = 32'h02912423; - rom[1079] = 32'h01812623; - rom[1080] = 32'h10090913; - rom[1081] = 32'h10498993; - rom[1082] = 32'h4A400A93; - rom[1083] = 32'h00092403; - rom[1084] = 32'h00147413; - rom[1085] = 32'h02041863; - rom[1086] = 32'h02C12403; - rom[1087] = 32'h02812483; - rom[1088] = 32'h02412903; - rom[1089] = 32'h02012983; - rom[1090] = 32'h01C12A03; - rom[1091] = 32'h01812A83; - rom[1092] = 32'h01412B03; - rom[1093] = 32'h01012B83; - rom[1094] = 32'h00C12C03; - rom[1095] = 32'h03010113; - rom[1096] = 32'h00008067; - rom[1097] = 32'h0009AC03; - rom[1098] = 32'h49C02403; - rom[1099] = 32'h4A002483; - rom[1100] = 32'h00140413; - rom[1101] = 32'h03F47413; - rom[1102] = 32'h02848463; - rom[1103] = 32'h49C02483; - rom[1104] = 32'h00249493; - rom[1105] = 32'h009A84B3; - rom[1106] = 32'h0184A023; - rom[1107] = 32'h48802E23; - rom[1108] = 32'h00001437; - rom[1109] = 32'h00100493; - rom[1110] = 32'h10942423; - rom[1111] = 32'hF91FF06F; - rom[1112] = 32'h49802403; - rom[1113] = 32'h00140413; - rom[1114] = 32'h48802C23; - rom[1115] = 32'hFE5FF06F; - rom[1116] = 32'h00000013; - rom[1117] = 32'h00000013; - rom[1118] = 32'h00000013; - rom[1119] = 32'h00000013; - rom[1120] = 32'h00000013; - rom[1121] = 32'h00000013; - rom[1122] = 32'h00000013; - rom[1123] = 32'h00000013; - rom[1124] = 32'h00000013; - rom[1125] = 32'h00000013; - rom[1126] = 32'h00000013; - rom[1127] = 32'h00000013; - rom[1128] = 32'h00000013; - rom[1129] = 32'h00000013; - rom[1130] = 32'h00000013; - rom[1131] = 32'h00000013; - rom[1132] = 32'h00000013; - rom[1133] = 32'h00000013; - rom[1134] = 32'h00000013; - rom[1135] = 32'h00000013; - rom[1136] = 32'h00000013; - rom[1137] = 32'h00000013; - rom[1138] = 32'h00000013; - rom[1139] = 32'h00000013; - rom[1140] = 32'h00000013; - rom[1141] = 32'h00000013; - rom[1142] = 32'h00000013; - rom[1143] = 32'h00000013; - rom[1144] = 32'h00000013; - rom[1145] = 32'h00000013; - rom[1146] = 32'h00000013; - rom[1147] = 32'h00000013; - rom[1148] = 32'h00000013; - rom[1149] = 32'h00000013; - rom[1150] = 32'h00000013; - rom[1151] = 32'h00000013; - rom[1152] = 32'h00000013; - rom[1153] = 32'h00000013; - rom[1154] = 32'h00000013; - rom[1155] = 32'h00000013; - rom[1156] = 32'h00000013; - rom[1157] = 32'h00000013; - rom[1158] = 32'h00000013; - rom[1159] = 32'h00000013; - rom[1160] = 32'h00000013; - rom[1161] = 32'h00000013; - rom[1162] = 32'h00000013; - rom[1163] = 32'h00000013; - rom[1164] = 32'h00000013; - rom[1165] = 32'h00000013; - rom[1166] = 32'h00000013; - rom[1167] = 32'h00000013; - rom[1168] = 32'h00000013; - rom[1169] = 32'h00000013; - rom[1170] = 32'h00000013; - rom[1171] = 32'h00000013; - rom[1172] = 32'h00000013; - rom[1173] = 32'h00000013; - rom[1174] = 32'h00000013; - rom[1175] = 32'h00000013; - rom[1176] = 32'h00000013; - rom[1177] = 32'h00000013; - rom[1178] = 32'h00000013; - rom[1179] = 32'h00000013; - rom[1180] = 32'h00000013; - rom[1181] = 32'h00000013; - rom[1182] = 32'h00000013; - rom[1183] = 32'h00000013; - rom[1184] = 32'h00000013; - rom[1185] = 32'h00000013; - rom[1186] = 32'h00000013; - rom[1187] = 32'h00000013; - rom[1188] = 32'h00000013; - rom[1189] = 32'h00000013; - rom[1190] = 32'h00000013; - rom[1191] = 32'h00000013; - rom[1192] = 32'h00000013; - rom[1193] = 32'h00000013; - rom[1194] = 32'h00000013; - rom[1195] = 32'h00000013; - rom[1196] = 32'h00000013; - rom[1197] = 32'h00000013; - rom[1198] = 32'h00000013; - rom[1199] = 32'h00000013; - rom[1200] = 32'h00000013; - rom[1201] = 32'h00000013; - rom[1202] = 32'h00000013; - rom[1203] = 32'h00000013; - rom[1204] = 32'h00000013; - rom[1205] = 32'h00000013; - rom[1206] = 32'h00000013; - rom[1207] = 32'h00000013; - rom[1208] = 32'h00000013; - rom[1209] = 32'h00000013; - rom[1210] = 32'h00000013; - rom[1211] = 32'h00000013; - rom[1212] = 32'h00000013; - rom[1213] = 32'h00000013; - rom[1214] = 32'h00000013; - rom[1215] = 32'h00000013; - rom[1216] = 32'h00000013; - rom[1217] = 32'h00000013; - rom[1218] = 32'h00000013; - rom[1219] = 32'h00000013; - rom[1220] = 32'h00000013; - rom[1221] = 32'h00000013; - rom[1222] = 32'h00000013; - rom[1223] = 32'h00000013; - rom[1224] = 32'h00000013; - rom[1225] = 32'h00000013; - rom[1226] = 32'h00000013; - rom[1227] = 32'h00000013; - rom[1228] = 32'h00000013; - rom[1229] = 32'h00000013; - rom[1230] = 32'h00000013; - rom[1231] = 32'h00000013; - rom[1232] = 32'h00000013; - rom[1233] = 32'h00000013; - rom[1234] = 32'h00000013; - rom[1235] = 32'h00000013; - rom[1236] = 32'h00000013; - rom[1237] = 32'h00000013; - rom[1238] = 32'h00000013; - rom[1239] = 32'h00000013; - rom[1240] = 32'h00000013; - rom[1241] = 32'h00000013; - rom[1242] = 32'h00000013; - rom[1243] = 32'h00000013; - rom[1244] = 32'h00000013; - rom[1245] = 32'h00000013; - rom[1246] = 32'h00000013; - rom[1247] = 32'h00000013; - rom[1248] = 32'h00000013; - rom[1249] = 32'h00000013; - rom[1250] = 32'h00000013; - rom[1251] = 32'h00000013; - rom[1252] = 32'h00000013; - rom[1253] = 32'h00000013; - rom[1254] = 32'h00000013; - rom[1255] = 32'h00000013; - rom[1256] = 32'h00000013; - rom[1257] = 32'h00000013; - rom[1258] = 32'h00000013; - rom[1259] = 32'h00000013; - rom[1260] = 32'h00000013; - rom[1261] = 32'h00000013; - rom[1262] = 32'h00000013; - rom[1263] = 32'h00000013; - rom[1264] = 32'h00000013; - rom[1265] = 32'h00000013; - rom[1266] = 32'h00000013; - rom[1267] = 32'h00000013; - rom[1268] = 32'h00000013; - rom[1269] = 32'h00000013; - rom[1270] = 32'h00000013; - rom[1271] = 32'h00000013; - rom[1272] = 32'h00000013; - rom[1273] = 32'h00000013; - rom[1274] = 32'h00000013; - rom[1275] = 32'h00000013; - rom[1276] = 32'h00000013; - rom[1277] = 32'h00000013; - rom[1278] = 32'h00000013; - rom[1279] = 32'h00000013; - rom[1280] = 32'h00000013; - rom[1281] = 32'h00000013; - rom[1282] = 32'h00000013; - rom[1283] = 32'h00000013; - rom[1284] = 32'h00000013; - rom[1285] = 32'h00000013; - rom[1286] = 32'h00000013; - rom[1287] = 32'h00000013; - rom[1288] = 32'h00000013; - rom[1289] = 32'h00000013; - rom[1290] = 32'h00000013; - rom[1291] = 32'h00000013; - rom[1292] = 32'h00000013; - rom[1293] = 32'h00000013; - rom[1294] = 32'h00000013; - rom[1295] = 32'h00000013; + rom[306] = 32'h79802783; + rom[307] = 32'h79402703; + rom[308] = 32'h01F7F793; + rom[309] = 32'h00879793; + rom[310] = 32'h01F77713; + rom[311] = 32'h00E7E7B3; + rom[312] = 32'h00001737; + rom[313] = 32'h14F72223; + rom[314] = 32'h00008067; + rom[315] = 32'h00001737; + rom[316] = 32'h8A872703; + rom[317] = 32'h79402803; + rom[318] = 32'h000017B7; + rom[319] = 32'hFFF70613; + rom[320] = 32'h010585B3; + rom[321] = 32'h8AC7A783; + rom[322] = 32'h00C5D463; + rom[323] = 32'h00060593; + rom[324] = 32'h00001637; + rom[325] = 32'h8BC62603; + rom[326] = 32'h00C70733; + rom[327] = 32'h00B75463; + rom[328] = 32'h00070593; + rom[329] = 32'h79802803; + rom[330] = 32'hFFF78613; + rom[331] = 32'h01050533; + rom[332] = 32'h00C55463; + rom[333] = 32'h00060513; + rom[334] = 32'h00001637; + rom[335] = 32'h8B862603; + rom[336] = 32'h00C787B3; + rom[337] = 32'h00A7D463; + rom[338] = 32'h00078513; + rom[339] = 32'h78A02C23; + rom[340] = 32'h78B02A23; + rom[341] = 32'hF75FF06F; + rom[342] = 32'h79402783; + rom[343] = 32'h00F585B3; + rom[344] = 32'h02700793; + rom[345] = 32'h02B7D863; + rom[346] = 32'h00078593; + rom[347] = 32'h79802783; + rom[348] = 32'h00A787B3; + rom[349] = 32'h01D00513; + rom[350] = 32'h00F54863; + rom[351] = 32'hFFF7C513; + rom[352] = 32'h41F55513; + rom[353] = 32'h00A7F533; + rom[354] = 32'h78A02C23; + rom[355] = 32'h78B02A23; + rom[356] = 32'hF39FF06F; + rom[357] = 32'hFFF5C793; + rom[358] = 32'h41F7D793; + rom[359] = 32'h00F5F5B3; + rom[360] = 32'hFCDFF06F; + rom[361] = 32'h79802703; + rom[362] = 32'h000017B7; + rom[363] = 32'h8AC7A783; + rom[364] = 32'h00000513; + rom[365] = 32'h02F76A63; + rom[366] = 32'h000016B7; + rom[367] = 32'h8B86A683; + rom[368] = 32'h00D787B3; + rom[369] = 32'h02F77263; + rom[370] = 32'h79402703; + rom[371] = 32'h000017B7; + rom[372] = 32'h8A87A783; + rom[373] = 32'h00F76A63; + rom[374] = 32'h000016B7; + rom[375] = 32'h8BC6A683; + rom[376] = 32'h00D787B3; + rom[377] = 32'h00F73533; + rom[378] = 32'h00008067; + rom[379] = 32'hFD010113; + rom[380] = 32'h02112623; + rom[381] = 32'h02812423; + rom[382] = 32'h02912223; + rom[383] = 32'h03212023; + rom[384] = 32'h01312E23; + rom[385] = 32'h01412C23; + rom[386] = 32'hF9DFF0EF; + rom[387] = 32'h0A050663; + rom[388] = 32'hDADFF0EF; + rom[389] = 32'h00050593; + rom[390] = 32'h00A12623; + rom[391] = 32'h00001537; + rom[392] = 32'h83050513; + rom[393] = 32'hD29FF0EF; + rom[394] = 32'h08051863; + rom[395] = 32'h79802703; + rom[396] = 32'h000017B7; + rom[397] = 32'h8AC7A783; + rom[398] = 32'h00C12583; + rom[399] = 32'h40F709B3; + rom[400] = 32'h79402703; + rom[401] = 32'h000017B7; + rom[402] = 32'h8A87A783; + rom[403] = 32'h7F400513; + rom[404] = 32'h40F70A33; + rom[405] = 32'hCF9FF0EF; + rom[406] = 32'h00C12583; + rom[407] = 32'h7B002403; + rom[408] = 32'h06050C63; + rom[409] = 32'h0055D793; + rom[410] = 32'h00279793; + rom[411] = 32'h7F400493; + rom[412] = 32'h009787B3; + rom[413] = 32'h0007A683; + rom[414] = 32'h00100713; + rom[415] = 32'h00B71733; + rom[416] = 32'hFFF74713; + rom[417] = 32'h00E6F733; + rom[418] = 32'hFFF40413; + rom[419] = 32'h00E7A023; + rom[420] = 32'h7A802823; + rom[421] = 32'h00700693; + rom[422] = 32'h00900613; + rom[423] = 32'h000A0593; + rom[424] = 32'h00098513; + rom[425] = 32'hCE9FF0EF; + rom[426] = 32'h7A402783; + rom[427] = 32'h00001737; + rom[428] = 32'h408787B3; + rom[429] = 32'h00F72023; + rom[430] = 32'h02C12083; + rom[431] = 32'h02812403; + rom[432] = 32'h02412483; + rom[433] = 32'h02012903; + rom[434] = 32'h01C12983; + rom[435] = 32'h01812A03; + rom[436] = 32'h03010113; + rom[437] = 32'h00008067; + rom[438] = 32'h7F400513; + rom[439] = 32'hC8DFF0EF; + rom[440] = 32'h00140413; + rom[441] = 32'h7A802823; + rom[442] = 32'h00600693; + rom[443] = 32'h00A00613; + rom[444] = 32'hFADFF06F; + rom[445] = 32'hFF010113; + rom[446] = 32'h00812423; + rom[447] = 32'h00912223; + rom[448] = 32'h00112623; + rom[449] = 32'hD85FF0EF; + rom[450] = 32'h000027B7; + rom[451] = 32'h01C00593; + rom[452] = 32'h20B78223; + rom[453] = 32'h00078713; + rom[454] = 32'h00400793; + rom[455] = 32'h20F702A3; + rom[456] = 32'h01800693; + rom[457] = 32'h20D70323; + rom[458] = 32'h20F703A3; + rom[459] = 32'h01D00613; + rom[460] = 32'h20C70423; + rom[461] = 32'h20F704A3; + rom[462] = 32'h00070693; + rom[463] = 32'h01400713; + rom[464] = 32'h20E68523; + rom[465] = 32'h20F685A3; + rom[466] = 32'h02200513; + rom[467] = 32'h20A68623; + rom[468] = 32'h20F686A3; + rom[469] = 32'h7A002783; + rom[470] = 32'h00002837; + rom[471] = 32'h48E80223; + rom[472] = 32'h00F037B3; + rom[473] = 32'h00678793; + rom[474] = 32'h48F802A3; + rom[475] = 32'h01000713; + rom[476] = 32'h48E80323; + rom[477] = 32'h48F803A3; + rom[478] = 32'h48A80423; + rom[479] = 32'h48F804A3; + rom[480] = 32'h00080513; + rom[481] = 32'h02800813; + rom[482] = 32'h49050523; + rom[483] = 32'h48F505A3; + rom[484] = 32'h7A002783; + rom[485] = 32'h52C50023; + rom[486] = 32'h00050613; + rom[487] = 32'hFFF78793; + rom[488] = 32'h00F037B3; + rom[489] = 32'h00678793; + rom[490] = 32'h52F500A3; + rom[491] = 32'h01E00513; + rom[492] = 32'h52A60123; + rom[493] = 32'h52F601A3; + rom[494] = 32'h00060513; + rom[495] = 32'h02100613; + rom[496] = 32'h52C50223; + rom[497] = 32'h52F502A3; + rom[498] = 32'h52B50323; + rom[499] = 32'h52F503A3; + rom[500] = 32'h52E50423; + rom[501] = 32'h00050593; + rom[502] = 32'h52F504A3; + rom[503] = 32'h01B00513; + rom[504] = 32'h52A58523; + rom[505] = 32'h52F585A3; + rom[506] = 32'h7A002783; + rom[507] = 32'h00058693; + rom[508] = 32'h01700593; + rom[509] = 32'hFFE78793; + rom[510] = 32'h00F037B3; + rom[511] = 32'h5CB68223; + rom[512] = 32'h00678793; + rom[513] = 32'h5CF682A3; + rom[514] = 32'h5CE68323; + rom[515] = 32'h5CF683A3; + rom[516] = 32'h5CC68423; + rom[517] = 32'h00068713; + rom[518] = 32'h5CF684A3; + rom[519] = 32'h01300693; + rom[520] = 32'h5CD70523; + rom[521] = 32'h5CF705A3; + rom[522] = 32'h30900413; + rom[523] = 32'h30F00493; + rom[524] = 32'h00040513; + rom[525] = 32'h00600613; + rom[526] = 32'h00E00593; + rom[527] = 32'hAE9FF0EF; + rom[528] = 32'h02840513; + rom[529] = 32'h00200613; + rom[530] = 32'h00F00593; + rom[531] = 32'hAD9FF0EF; + rom[532] = 32'h05040513; + rom[533] = 32'h00600613; + rom[534] = 32'h00E00593; + rom[535] = 32'h00140413; + rom[536] = 32'hAC5FF0EF; + rom[537] = 32'hFC9416E3; + rom[538] = 32'h000027B7; + rom[539] = 32'h02200713; + rom[540] = 32'h66E78123; + rom[541] = 32'h00078713; + rom[542] = 32'h00600793; + rom[543] = 32'h66F701A3; + rom[544] = 32'h00070693; + rom[545] = 32'h02300713; + rom[546] = 32'h66E68223; + rom[547] = 32'h66F682A3; + rom[548] = 32'h01000613; + rom[549] = 32'h66C68323; + rom[550] = 32'h66F683A3; + rom[551] = 32'h02100613; + rom[552] = 32'h66C68423; + rom[553] = 32'h66F684A3; + rom[554] = 32'h66E68523; + rom[555] = 32'h66F685A3; + rom[556] = 32'h3CC00413; + rom[557] = 32'h3DC00493; + rom[558] = 32'h00040513; + rom[559] = 32'h00300613; + rom[560] = 32'h00E00593; + rom[561] = 32'h00140413; + rom[562] = 32'hA5DFF0EF; + rom[563] = 32'hFE9416E3; + rom[564] = 32'h00100413; + rom[565] = 32'h000017B7; + rom[566] = 32'h1487A023; + rom[567] = 32'h01400713; + rom[568] = 32'h78E02C23; + rom[569] = 32'h01300713; + rom[570] = 32'h78E02A23; + rom[571] = 32'hBDDFF0EF; + rom[572] = 32'h000017B7; + rom[573] = 32'h0087A023; + rom[574] = 32'h00C12083; + rom[575] = 32'h00812403; + rom[576] = 32'h0007A223; + rom[577] = 32'h00412483; + rom[578] = 32'h01010113; + rom[579] = 32'h00008067; + rom[580] = 32'hF9010113; + rom[581] = 32'h06912223; + rom[582] = 32'h00855713; + rom[583] = 32'h01055793; + rom[584] = 32'h0FF57493; + rom[585] = 32'h06112623; + rom[586] = 32'h06812423; + rom[587] = 32'h07212023; + rom[588] = 32'h05312E23; + rom[589] = 32'h05412C23; + rom[590] = 32'h05512A23; + rom[591] = 32'h05612823; + rom[592] = 32'h05712623; + rom[593] = 32'h05812423; + rom[594] = 32'h05912223; + rom[595] = 32'h05A12023; + rom[596] = 32'h03B12E23; + rom[597] = 32'h08057513; + rom[598] = 32'h00050463; + rom[599] = 32'hF0048493; + rom[600] = 32'h0FF77413; + rom[601] = 32'h08077713; + rom[602] = 32'h00070463; + rom[603] = 32'hF0040413; + rom[604] = 32'h00001737; + rom[605] = 32'h11072703; + rom[606] = 32'h0017F693; + rom[607] = 32'h5C068063; + rom[608] = 32'h00802603; + rom[609] = 32'h79802783; + rom[610] = 32'h0C061663; + rom[611] = 32'h00E00713; + rom[612] = 32'h00000513; + rom[613] = 32'h00E78863; + rom[614] = 32'h01000713; + rom[615] = 32'h04E79463; + rom[616] = 32'h00100513; + rom[617] = 32'hA4DFF0EF; + rom[618] = 32'h06812403; + rom[619] = 32'h06C12083; + rom[620] = 32'h06412483; + rom[621] = 32'h06012903; + rom[622] = 32'h05C12983; + rom[623] = 32'h05812A03; + rom[624] = 32'h05412A83; + rom[625] = 32'h05012B03; + rom[626] = 32'h04C12B83; + rom[627] = 32'h04812C03; + rom[628] = 32'h04412C83; + rom[629] = 32'h04012D03; + rom[630] = 32'h03C12D83; + rom[631] = 32'h07010113; + rom[632] = 32'hD15FF06F; + rom[633] = 32'h01200713; + rom[634] = 32'h00200513; + rom[635] = 32'hFAE78CE3; + rom[636] = 32'h01400713; + rom[637] = 32'h02E79263; + rom[638] = 32'h79402783; + rom[639] = 32'h00500713; + rom[640] = 32'hFEF78793; + rom[641] = 32'h00F76A63; + rom[642] = 32'h00100793; + rom[643] = 32'h00F02423; + rom[644] = 32'h00001737; + rom[645] = 32'h12F72023; + rom[646] = 32'h06C12083; + rom[647] = 32'h06812403; + rom[648] = 32'h06412483; + rom[649] = 32'h06012903; + rom[650] = 32'h05C12983; + rom[651] = 32'h05812A03; + rom[652] = 32'h05412A83; + rom[653] = 32'h05012B03; + rom[654] = 32'h04C12B83; + rom[655] = 32'h04812C03; + rom[656] = 32'h04412C83; + rom[657] = 32'h04012D03; + rom[658] = 32'h03C12D83; + rom[659] = 32'h07010113; + rom[660] = 32'h00008067; + rom[661] = 32'h000016B7; + rom[662] = 32'h8AC6A683; + rom[663] = 32'hFFF68693; + rom[664] = 32'h02F69263; + rom[665] = 32'h000017B7; + rom[666] = 32'h8A87A783; + rom[667] = 32'h79402683; + rom[668] = 32'hFFF78793; + rom[669] = 32'h00D79863; + rom[670] = 32'h00100713; + rom[671] = 32'h00E02223; + rom[672] = 32'hF99FF06F; + rom[673] = 32'h00977793; + rom[674] = 32'h04078063; + rom[675] = 32'h06812403; + rom[676] = 32'h06C12083; + rom[677] = 32'h06412483; + rom[678] = 32'h06012903; + rom[679] = 32'h05C12983; + rom[680] = 32'h05812A03; + rom[681] = 32'h05412A83; + rom[682] = 32'h05012B03; + rom[683] = 32'h04C12B83; + rom[684] = 32'h04812C03; + rom[685] = 32'h04412C83; + rom[686] = 32'h04012D03; + rom[687] = 32'h03C12D83; + rom[688] = 32'h07010113; + rom[689] = 32'hB29FF06F; + rom[690] = 32'hADDFF0EF; + rom[691] = 32'h00050993; + rom[692] = 32'hF40504E3; + rom[693] = 32'h8E9FF0EF; + rom[694] = 32'h00050413; + rom[695] = 32'h00050593; + rom[696] = 32'h7F400513; + rom[697] = 32'h869FF0EF; + rom[698] = 32'hF20518E3; + rom[699] = 32'h7A802D83; + rom[700] = 32'h040D9263; + rom[701] = 32'h000017B7; + rom[702] = 32'h8BC7AB03; + rom[703] = 32'h41C65937; + rom[704] = 32'h00003AB7; + rom[705] = 32'h036457B3; + rom[706] = 32'h000014B7; + rom[707] = 32'hE6D90913; + rom[708] = 32'h039A8A93; + rom[709] = 32'h00001D37; + rom[710] = 32'h86C48493; + rom[711] = 32'h03647C33; + rom[712] = 32'h00F12223; + rom[713] = 32'h7A402683; + rom[714] = 32'h08DDE063; + rom[715] = 32'h00100793; + rom[716] = 32'h7AF02423; + rom[717] = 32'h00001BB7; + rom[718] = 32'h00040593; + rom[719] = 32'h830B8513; + rom[720] = 32'h80DFF0EF; + rom[721] = 32'hEC051AE3; + rom[722] = 32'h00040593; + rom[723] = 32'h7F400513; + rom[724] = 32'hFFCFF0EF; + rom[725] = 32'h00050A93; + rom[726] = 32'hEC0510E3; + rom[727] = 32'h00001937; + rom[728] = 32'h00040593; + rom[729] = 32'h86C90513; + rom[730] = 32'hFE4FF0EF; + rom[731] = 32'h00050493; + rom[732] = 32'h0A050263; + rom[733] = 32'h000014B7; + rom[734] = 32'h86C90913; + rom[735] = 32'h7F400A13; + rom[736] = 32'h000019B7; + rom[737] = 32'h8B44A783; + rom[738] = 32'h18FAE063; + rom[739] = 32'h0000E7B7; + rom[740] = 32'h00001737; + rom[741] = 32'hEAD78793; + rom[742] = 32'h00F72023; + rom[743] = 32'h00200713; + rom[744] = 32'h7AE02623; + rom[745] = 32'hE75FF06F; + rom[746] = 32'h79C02583; + rom[747] = 32'h8B4D2683; + rom[748] = 32'h00412783; + rom[749] = 32'h032585B3; + rom[750] = 32'h015585B3; + rom[751] = 32'h78B02E23; + rom[752] = 32'h0105D593; + rom[753] = 32'h02D5F5B3; + rom[754] = 32'h0365D6B3; + rom[755] = 32'h00168613; + rom[756] = 32'h02F66063; + rom[757] = 32'h00178613; + rom[758] = 32'h00D66C63; + rom[759] = 32'h0365F6B3; + rom[760] = 32'h00168613; + rom[761] = 32'h01866663; + rom[762] = 32'h001C0613; + rom[763] = 32'hF2D67CE3; + rom[764] = 32'h00048513; + rom[765] = 32'h00B12423; + rom[766] = 32'hF54FF0EF; + rom[767] = 32'hF20514E3; + rom[768] = 32'h00812583; + rom[769] = 32'h00048513; + rom[770] = 32'h001D8D93; + rom[771] = 32'hF5CFF0EF; + rom[772] = 32'hF15FF06F; + rom[773] = 32'h000017B7; + rom[774] = 32'h8B07A683; + rom[775] = 32'h7B800713; + rom[776] = 32'h00000793; + rom[777] = 32'h14D79263; + rom[778] = 32'h00C00B13; + rom[779] = 32'h00040593; + rom[780] = 32'h7B800513; + rom[781] = 32'h008B2023; + rom[782] = 32'hF30FF0EF; + rom[783] = 32'h830B8793; + rom[784] = 32'h00F12623; + rom[785] = 32'h7B800793; + rom[786] = 32'h00F12A23; + rom[787] = 32'h7F400793; + rom[788] = 32'h01612223; + rom[789] = 32'h00012423; + rom[790] = 32'h00F12E23; + rom[791] = 32'h00412783; + rom[792] = 32'h00C12503; + rom[793] = 32'h0007A403; + rom[794] = 32'h00812783; + rom[795] = 32'h00040593; + rom[796] = 32'h00178793; + rom[797] = 32'h00F12423; + rom[798] = 32'hED4FF0EF; + rom[799] = 32'h00050B93; + rom[800] = 32'h22051E63; + rom[801] = 32'h00C12503; + rom[802] = 32'h7B402A03; + rom[803] = 32'h00040593; + rom[804] = 32'hED8FF0EF; + rom[805] = 32'h001A0A13; + rom[806] = 32'h000017B7; + rom[807] = 32'h7B402A23; + rom[808] = 32'h8BC7AA03; + rom[809] = 32'h000017B7; + rom[810] = 32'h8B87A783; + rom[811] = 32'h03445C33; + rom[812] = 32'h03447AB3; + rom[813] = 32'h01443433; + rom[814] = 32'h00143413; + rom[815] = 32'h001C0D13; + rom[816] = 32'h408C0433; + rom[817] = 32'h00FD6463; + rom[818] = 32'hFFF78D13; + rom[819] = 32'h015037B3; + rom[820] = 32'h40FA87B3; + rom[821] = 32'h00F12823; + rom[822] = 32'h001A8D93; + rom[823] = 32'h014DE463; + rom[824] = 32'hFFFA0D93; + rom[825] = 32'h86C90793; + rom[826] = 32'h00040713; + rom[827] = 32'h00F12C23; + rom[828] = 32'h028A0CB3; + rom[829] = 32'h000C8693; + rom[830] = 32'h0CED6663; + rom[831] = 32'h01012783; + rom[832] = 32'h40EC0833; + rom[833] = 32'h0B00006F; + rom[834] = 32'h000A8593; + rom[835] = 32'h00090513; + rom[836] = 32'hE3CFF0EF; + rom[837] = 32'h02050263; + rom[838] = 32'h03541463; + rom[839] = 32'h000017B7; + rom[840] = 32'h8BC7A503; + rom[841] = 32'h00400693; + rom[842] = 32'h00C00613; + rom[843] = 32'h02A475B3; + rom[844] = 32'h02A45533; + rom[845] = 32'hE58FF0EF; + rom[846] = 32'h001A8A93; + rom[847] = 32'hE49FF06F; + rom[848] = 32'h000A8593; + rom[849] = 32'h000A0513; + rom[850] = 32'hE04FF0EF; + rom[851] = 32'hFE0516E3; + rom[852] = 32'h8BC9A503; + rom[853] = 32'h00400693; + rom[854] = 32'h00B00613; + rom[855] = 32'h02AAF5B3; + rom[856] = 32'h02AAD533; + rom[857] = 32'hFD1FF06F; + rom[858] = 32'h00072023; + rom[859] = 32'h00178793; + rom[860] = 32'h00470713; + rom[861] = 32'hEB1FF06F; + rom[862] = 32'h00FA9463; + rom[863] = 32'h02080A63; + rom[864] = 32'h01812503; + rom[865] = 32'h00D785B3; + rom[866] = 32'h03012623; + rom[867] = 32'h02E12423; + rom[868] = 32'h02D12223; + rom[869] = 32'h02F12023; + rom[870] = 32'hDB4FF0EF; + rom[871] = 32'h02C12803; + rom[872] = 32'h02812703; + rom[873] = 32'h02412683; + rom[874] = 32'h02012783; + rom[875] = 32'h00AB8BB3; + rom[876] = 32'h00178793; + rom[877] = 32'hFCFDF2E3; + rom[878] = 32'h00170713; + rom[879] = 32'h014686B3; + rom[880] = 32'hF39FF06F; + rom[881] = 32'h00100793; + rom[882] = 32'h000B8693; + rom[883] = 32'h04FB8063; + rom[884] = 32'h00200793; + rom[885] = 32'h02FB8C63; + rom[886] = 32'h00400793; + rom[887] = 32'h00300713; + rom[888] = 32'h00078693; + rom[889] = 32'h02EB8463; + rom[890] = 32'h00500593; + rom[891] = 32'h00058693; + rom[892] = 32'h00FB8E63; + rom[893] = 32'h00600793; + rom[894] = 32'h00078693; + rom[895] = 32'h00BB8863; + rom[896] = 32'h00070693; + rom[897] = 32'h00FB8463; + rom[898] = 32'h00700693; + rom[899] = 32'h000B8613; + rom[900] = 32'h000A8593; + rom[901] = 32'h000C0513; + rom[902] = 32'hD74FF0EF; + rom[903] = 32'h0A0B9063; + rom[904] = 32'h088D6E63; + rom[905] = 32'h418407B3; + rom[906] = 32'h01012B83; + rom[907] = 32'h00F12C23; + rom[908] = 32'h07C0006F; + rom[909] = 32'h015B9663; + rom[910] = 32'h01812783; + rom[911] = 32'h06078663; + rom[912] = 32'h01412503; + rom[913] = 32'h017C87B3; + rom[914] = 32'h00078593; + rom[915] = 32'h02F12023; + rom[916] = 32'hCFCFF0EF; + rom[917] = 32'h04051A63; + rom[918] = 32'h00C12503; + rom[919] = 32'h017C85B3; + rom[920] = 32'hCECFF0EF; + rom[921] = 32'h04051263; + rom[922] = 32'h01C12503; + rom[923] = 32'h017C85B3; + rom[924] = 32'hCDCFF0EF; + rom[925] = 32'h01F51793; + rom[926] = 32'h01F7D513; + rom[927] = 32'h02051663; + rom[928] = 32'h1E09B793; + rom[929] = 32'h02078263; + rom[930] = 32'h01412503; + rom[931] = 32'h017C85B3; + rom[932] = 32'hCD8FF0EF; + rom[933] = 32'h00299793; + rom[934] = 32'h00FB07B3; + rom[935] = 32'h017C8733; + rom[936] = 32'h00E7A023; + rom[937] = 32'h00198993; + rom[938] = 32'h001B8B93; + rom[939] = 32'hF97DF4E3; + rom[940] = 32'h00140413; + rom[941] = 32'h014C8CB3; + rom[942] = 32'hF69FF06F; + rom[943] = 32'h00412783; + rom[944] = 32'h00478793; + rom[945] = 32'h00F12223; + rom[946] = 32'h00812783; + rom[947] = 32'hD937E8E3; + rom[948] = 32'h000017B7; + rom[949] = 32'h8B47A403; + rom[950] = 32'h7A402783; + rom[951] = 32'h7B402703; + rom[952] = 32'h40F407B3; + rom[953] = 32'hB2E79AE3; + rom[954] = 32'h86C90913; + rom[955] = 32'h000019B7; + rom[956] = 32'h00941E63; + rom[957] = 32'h0000F7B7; + rom[958] = 32'h00001737; + rom[959] = 32'h00D78793; + rom[960] = 32'h00F72023; + rom[961] = 32'h00100713; + rom[962] = 32'hC99FF06F; + rom[963] = 32'h00048593; + rom[964] = 32'h00090513; + rom[965] = 32'hC38FF0EF; + rom[966] = 32'h00050E63; + rom[967] = 32'h8BC9A503; + rom[968] = 32'h00600693; + rom[969] = 32'h00A00613; + rom[970] = 32'h02A4F5B3; + rom[971] = 32'h02A4D533; + rom[972] = 32'hC5CFF0EF; + rom[973] = 32'h00148493; + rom[974] = 32'hFB9FF06F; + rom[975] = 32'h0027F793; + rom[976] = 32'h00078863; + rom[977] = 32'h00802783; + rom[978] = 32'hAC0788E3; + rom[979] = 32'hB41FF06F; + rom[980] = 32'h79002783; + rom[981] = 32'h00700A13; + rom[982] = 32'h00F484B3; + rom[983] = 32'h78C02783; + rom[984] = 32'h78902823; + rom[985] = 32'h00F40433; + rom[986] = 32'h78802623; + rom[987] = 32'h029A4E63; + rom[988] = 32'hFF900A13; + rom[989] = 32'h0544CE63; + rom[990] = 32'h00700493; + rom[991] = 32'h0684CE63; + rom[992] = 32'hFF900493; + rom[993] = 32'hA8945AE3; + rom[994] = 32'h00802783; + rom[995] = 32'h00000593; + rom[996] = 32'hFFF00513; + rom[997] = 32'h08078663; + rom[998] = 32'hD54FF0EF; + rom[999] = 32'h00840413; + rom[1000] = 32'h78802623; + rom[1001] = 32'hFE1FF06F; + rom[1002] = 32'h00802783; + rom[1003] = 32'h00100593; + rom[1004] = 32'h00000513; + rom[1005] = 32'h00078A63; + rom[1006] = 32'hD34FF0EF; + rom[1007] = 32'hFF848493; + rom[1008] = 32'h78902823; + rom[1009] = 32'hFA9FF06F; + rom[1010] = 32'hD90FF0EF; + rom[1011] = 32'hFF1FF06F; + rom[1012] = 32'h00802783; + rom[1013] = 32'hFFF00593; + rom[1014] = 32'h00000513; + rom[1015] = 32'h00078A63; + rom[1016] = 32'hD0CFF0EF; + rom[1017] = 32'h00848493; + rom[1018] = 32'h78902823; + rom[1019] = 32'hF89FF06F; + rom[1020] = 32'hD68FF0EF; + rom[1021] = 32'hFF1FF06F; + rom[1022] = 32'h00802783; + rom[1023] = 32'h00000593; + rom[1024] = 32'h00100513; + rom[1025] = 32'h00078A63; + rom[1026] = 32'hCE4FF0EF; + rom[1027] = 32'hFF840413; + rom[1028] = 32'h78802623; + rom[1029] = 32'hF69FF06F; + rom[1030] = 32'hD40FF0EF; + rom[1031] = 32'hFF1FF06F; + rom[1032] = 32'hD38FF0EF; + rom[1033] = 32'hF79FF06F; + rom[1034] = 32'h000017B7; + rom[1035] = 32'h8B07A703; + rom[1036] = 32'hFD010113; + rom[1037] = 32'h000016B7; + rom[1038] = 32'h00001637; + rom[1039] = 32'h02112623; + rom[1040] = 32'h02812423; + rom[1041] = 32'h02912223; + rom[1042] = 32'h03212023; + rom[1043] = 32'h01312E23; + rom[1044] = 32'h01412C23; + rom[1045] = 32'h01512A23; + rom[1046] = 32'h01612823; + rom[1047] = 32'h01712623; + rom[1048] = 32'h01812423; + rom[1049] = 32'h01912223; + rom[1050] = 32'h01A12023; + rom[1051] = 32'h00271713; + rom[1052] = 32'h00000793; + rom[1053] = 32'h86C68693; + rom[1054] = 32'h83060613; + rom[1055] = 32'h7F400593; + rom[1056] = 32'h7B800513; + rom[1057] = 32'h12F71463; + rom[1058] = 32'h7A002A23; + rom[1059] = 32'h7A002823; + rom[1060] = 32'h7A002423; + rom[1061] = 32'h78002823; + rom[1062] = 32'h78002623; + rom[1063] = 32'h000017B7; + rom[1064] = 32'h8B87AB03; + rom[1065] = 32'h000017B7; + rom[1066] = 32'h8AC7A403; + rom[1067] = 32'h001B5793; + rom[1068] = 32'h008787B3; + rom[1069] = 32'h78F02C23; + rom[1070] = 32'h000017B7; + rom[1071] = 32'h8BC7AB83; + rom[1072] = 32'h000017B7; + rom[1073] = 32'h8A87AD03; + rom[1074] = 32'h001BD793; + rom[1075] = 32'h01A787B3; + rom[1076] = 32'h78F02A23; + rom[1077] = 32'h7A002623; + rom[1078] = 32'h00002223; + rom[1079] = 32'hBACFF0EF; + rom[1080] = 32'hFFF40993; + rom[1081] = 32'h02800793; + rom[1082] = 32'h008B0433; + rom[1083] = 32'h02F98C33; + rom[1084] = 32'hFFFD0A93; + rom[1085] = 32'h000A8A13; + rom[1086] = 32'h01AB8D33; + rom[1087] = 32'h02F40CB3; + rom[1088] = 32'h0D4D7A63; + rom[1089] = 32'h02800C93; + rom[1090] = 32'h0F347A63; + rom[1091] = 32'h00000413; + rom[1092] = 32'h128B1E63; + rom[1093] = 32'h018A8533; + rom[1094] = 32'h00600613; + rom[1095] = 32'h00E00593; + rom[1096] = 32'hA04FF0EF; + rom[1097] = 32'h000017B7; + rom[1098] = 32'h00100413; + rom[1099] = 32'h1487A023; + rom[1100] = 32'hB98FF0EF; + rom[1101] = 32'h7A402683; + rom[1102] = 32'h00001737; + rom[1103] = 32'h00001AB7; + rom[1104] = 32'h00D72023; + rom[1105] = 32'h7A402703; + rom[1106] = 32'h000017B7; + rom[1107] = 32'h000019B7; + rom[1108] = 32'h00E7A223; + rom[1109] = 32'h00001B37; + rom[1110] = 32'h11878A13; + rom[1111] = 32'h8CCA8A93; + rom[1112] = 32'h00402783; + rom[1113] = 32'h0E078863; + rom[1114] = 32'h02812403; + rom[1115] = 32'h000017B7; + rom[1116] = 32'h1207A023; + rom[1117] = 32'h02C12083; + rom[1118] = 32'h02412483; + rom[1119] = 32'h02012903; + rom[1120] = 32'h01C12983; + rom[1121] = 32'h01812A03; + rom[1122] = 32'h01412A83; + rom[1123] = 32'h01012B03; + rom[1124] = 32'h00C12B83; + rom[1125] = 32'h00812C03; + rom[1126] = 32'h00412C83; + rom[1127] = 32'h00012D03; + rom[1128] = 32'h00002423; + rom[1129] = 32'h03010113; + rom[1130] = 32'hD4CFF06F; + rom[1131] = 32'h00D78833; + rom[1132] = 32'h00082023; + rom[1133] = 32'h00C78833; + rom[1134] = 32'h00082023; + rom[1135] = 32'h00B78833; + rom[1136] = 32'h00082023; + rom[1137] = 32'h00A78833; + rom[1138] = 32'h00082023; + rom[1139] = 32'h00478793; + rom[1140] = 32'hEB5FF06F; + rom[1141] = 32'h018A0533; + rom[1142] = 32'h00300613; + rom[1143] = 32'h00F00593; + rom[1144] = 32'h944FF0EF; + rom[1145] = 32'h019A0533; + rom[1146] = 32'h00300613; + rom[1147] = 32'h00F00593; + rom[1148] = 32'h934FF0EF; + rom[1149] = 32'h001A0A13; + rom[1150] = 32'hF09FF06F; + rom[1151] = 32'h03998A33; + rom[1152] = 32'h00300613; + rom[1153] = 32'h00F00593; + rom[1154] = 32'h00198993; + rom[1155] = 32'h015A0533; + rom[1156] = 32'h914FF0EF; + rom[1157] = 32'h00300613; + rom[1158] = 32'h00F00593; + rom[1159] = 32'h01AA0533; + rom[1160] = 32'h904FF0EF; + rom[1161] = 32'hEE5FF06F; + rom[1162] = 32'h00098593; + rom[1163] = 32'h00700693; + rom[1164] = 32'h00900613; + rom[1165] = 32'h00040513; + rom[1166] = 32'h954FF0EF; + rom[1167] = 32'h00198993; + rom[1168] = 32'hFF3B94E3; + rom[1169] = 32'h00140413; + rom[1170] = 32'hEC9FF06F; + rom[1171] = 32'h00000993; + rom[1172] = 32'hFF1FF06F; + rom[1173] = 32'h8C89A683; + rom[1174] = 32'h8C4B2783; + rom[1175] = 32'h7AC02703; + rom[1176] = 32'h04F68063; + rom[1177] = 32'h8C89A783; + rom[1178] = 32'h00279793; + rom[1179] = 32'h00FA87B3; + rom[1180] = 32'h0007A503; + rom[1181] = 32'h8C89A783; + rom[1182] = 32'h00178793; + rom[1183] = 32'h03F7F793; + rom[1184] = 32'h8CF9A423; + rom[1185] = 32'h00071663; + rom[1186] = 32'hE88FF0EF; + rom[1187] = 32'hED5FF06F; + rom[1188] = 32'h00F51793; + rom[1189] = 32'hEC07D6E3; + rom[1190] = 32'h00802223; + rom[1191] = 32'hEC5FF06F; + rom[1192] = 32'hEC0700E3; + rom[1193] = 32'h000A2783; + rom[1194] = 32'h01F7F793; + rom[1195] = 32'hEA079AE3; + rom[1196] = 32'h00002783; + rom[1197] = 32'h0017C613; + rom[1198] = 32'h00C02023; + rom[1199] = 32'h00100693; + rom[1200] = 32'h00D78C63; + rom[1201] = 32'h00400793; + rom[1202] = 32'h00D71463; + rom[1203] = 32'h00200793; + rom[1204] = 32'h00479793; + rom[1205] = 32'h0017E793; + rom[1206] = 32'h00001737; + rom[1207] = 32'h14F72023; + rom[1208] = 32'hE81FF06F; + rom[1209] = 32'hFF010113; + rom[1210] = 32'h00112623; + rom[1211] = 32'h00812423; + rom[1212] = 32'h00912223; + rom[1213] = 32'h01212023; + rom[1214] = 32'h80CFF0EF; + rom[1215] = 32'h000017B7; + rom[1216] = 32'h1147A783; + rom[1217] = 32'h00100513; + rom[1218] = 32'h0017E793; + rom[1219] = 32'h78F02E23; + rom[1220] = 32'h8E0FF0EF; + rom[1221] = 32'h000017B7; + rom[1222] = 32'h00100713; + rom[1223] = 32'h10E7A623; + rom[1224] = 32'h1207A023; + rom[1225] = 32'h000014B7; + rom[1226] = 32'h00002423; + rom[1227] = 32'h00001437; + rom[1228] = 32'hBC4FF0EF; + rom[1229] = 32'h00001937; + rom[1230] = 32'h8CC48493; + rom[1231] = 32'h8C842703; + rom[1232] = 32'h8C492783; + rom[1233] = 32'hFEF70CE3; + rom[1234] = 32'h8C842783; + rom[1235] = 32'h00279793; + rom[1236] = 32'h00F487B3; + rom[1237] = 32'h0007A503; + rom[1238] = 32'h8C842783; + rom[1239] = 32'h00178793; + rom[1240] = 32'h03F7F793; + rom[1241] = 32'h8CF42423; + rom[1242] = 32'hDA8FF0EF; + rom[1243] = 32'hFD1FF06F; + rom[1244] = 32'hFD010113; + rom[1245] = 32'h03212223; + rom[1246] = 32'h03312023; + rom[1247] = 32'h01512C23; + rom[1248] = 32'h00001937; + rom[1249] = 32'h000019B7; + rom[1250] = 32'h00001AB7; + rom[1251] = 32'h01412E23; + rom[1252] = 32'h01612A23; + rom[1253] = 32'h01712823; + rom[1254] = 32'h02812623; + rom[1255] = 32'h02912423; + rom[1256] = 32'h01812623; + rom[1257] = 32'h10090913; + rom[1258] = 32'h10498993; + rom[1259] = 32'h00001A37; + rom[1260] = 32'h00001BB7; + rom[1261] = 32'h00001B37; + rom[1262] = 32'h8CCA8A93; + rom[1263] = 32'h00092403; + rom[1264] = 32'h00147413; + rom[1265] = 32'h02041863; + rom[1266] = 32'h02C12403; + rom[1267] = 32'h02812483; + rom[1268] = 32'h02412903; + rom[1269] = 32'h02012983; + rom[1270] = 32'h01C12A03; + rom[1271] = 32'h01812A83; + rom[1272] = 32'h01412B03; + rom[1273] = 32'h01012B83; + rom[1274] = 32'h00C12C03; + rom[1275] = 32'h03010113; + rom[1276] = 32'h00008067; + rom[1277] = 32'h0009AC03; + rom[1278] = 32'h8C4A2403; + rom[1279] = 32'h8C8BA483; + rom[1280] = 32'h00140413; + rom[1281] = 32'h03F47413; + rom[1282] = 32'h02848463; + rom[1283] = 32'h8C4A2483; + rom[1284] = 32'h00249493; + rom[1285] = 32'h009A84B3; + rom[1286] = 32'h0184A023; + rom[1287] = 32'h8C8A2223; + rom[1288] = 32'h00001437; + rom[1289] = 32'h00100493; + rom[1290] = 32'h10942423; + rom[1291] = 32'hF91FF06F; + rom[1292] = 32'h8C0B2403; + rom[1293] = 32'h00140413; + rom[1294] = 32'h8C8B2023; + rom[1295] = 32'hFE5FF06F; rom[1296] = 32'h00000013; rom[1297] = 32'h00000013; rom[1298] = 32'h00000013; diff --git a/pipelined-cpu/srcs/rtl/cpu21_mmio.v b/pipelined-cpu/srcs/rtl/cpu21_mmio.v index 61aaf65..5090b90 100644 --- a/pipelined-cpu/srcs/rtl/cpu21_mmio.v +++ b/pipelined-cpu/srcs/rtl/cpu21_mmio.v @@ -42,7 +42,7 @@ // ----------------------------------------------------------------------------- module cpu21_mmio #( parameter [31:0] LED_ADDR = 32'h0000_1000, - parameter integer FB_WORDS = 300, + parameter integer FB_WORDS = 600, // 600 字 = 2400 字节(40x30 格,每格 2 字节) parameter integer FIFO_DEPTH = 16 ) ( input wire clk, diff --git a/pipelined-cpu/srcs/rtl/cpu21_riscv_redirect_int_bpb.v b/pipelined-cpu/srcs/rtl/cpu21_riscv_redirect_int_bpb.v index 0497c2b..4e74bc8 100644 --- a/pipelined-cpu/srcs/rtl/cpu21_riscv_redirect_int_bpb.v +++ b/pipelined-cpu/srcs/rtl/cpu21_riscv_redirect_int_bpb.v @@ -48,7 +48,11 @@ module cpu21_riscv_redirect_int_bpb #( // MMIO:LED 数据寄存器地址(默认 0x0000_1000,位于 4 KB 数据 RAM 之外)。 parameter [31:0] LED_ADDR = 32'h0000_1000, // ustatus 复位值。详见 cpu21_riscv_irq_ctrl 中的说明。 - parameter [31:0] USTATUS_INIT = 32'h0000_0001 + parameter [31:0] USTATUS_INIT = 32'h0000_0001, + // 显存字数:600 字 = 2400 字节 = 40x30 格、每格 2 字节(字形 + 颜色)。 + // 必须传给 cpu21_mmio:它的 fb_ok 是 (fb_widx < FB_WORDS),不传就会 + // 把显存写卡在前 300 字(前 15 行),屏幕下半部分永远刷不出来。 + parameter integer FB_WORDS = 600 ) ( input wire clk, input wire reset, @@ -69,7 +73,7 @@ module cpu21_riscv_redirect_int_bpb #( output wire [31:0] seg_data_o, // 七段数码管:8 位十六进制数 output wire seg_valid_o, output wire fb_we_o, // 显存写端口(板级顶层的双口 RAM) - output wire [ 9:0] fb_waddr_o, // 显存字地址(0..299) + output wire [ 9:0] fb_waddr_o, // 显存字地址(0..599) output wire [31:0] fb_wdata_o, output wire [ 3:0] fb_wstrb_o, input wire [31:0] fb_rdata_i, // 显存读回(组合) @@ -479,7 +483,8 @@ module cpu21_riscv_redirect_int_bpb #( wire mmio_rdata_hit; cpu21_mmio #( - .LED_ADDR(LED_ADDR) + .LED_ADDR(LED_ADDR), + .FB_WORDS(FB_WORDS) ) u_mmio ( .clk (clk), .reset (reset), diff --git a/saolei/sw/saolei.c b/saolei/sw/saolei.c index 669f9c8..c9bd06e 100644 --- a/saolei/sw/saolei.c +++ b/saolei/sw/saolei.c @@ -18,13 +18,24 @@ * ---------------------------------------------------------------------------*/ #include "mmio.h" -#define BW 16u /* 棋盘宽(格) */ -#define BH 16u /* 棋盘高(格) */ -#define NCELLS (BW * BH) /* 256 */ -#define BM_WORDS (NCELLS / 32u) /* 8 */ +/* 三档难度完全照微软扫雷:初级 9x9/10 雷、中级 16x16/40 雷、高级 30x16/99 雷。 + * 棋盘尺寸是运行期变量(三档各不相同),所以位图与队列都按最大尺寸分配。 */ +#define BW_MAX 30u /* 最大棋盘宽(高级) */ +#define BH_MAX 16u /* 最大棋盘高 */ +#define NCELLS_MAX (BW_MAX * BH_MAX) /* 480 */ +#define BM_WORDS_MAX ((NCELLS_MAX + 31u) / 32u) /* 15 */ -#define BOARD_C0 12u /* 棋盘左上角在网格里的列 */ -#define BOARD_R0 7u /* 棋盘左上角在网格里的行 */ +/* 当前难度下的棋盘参数(由 set_difficulty() 设定) */ +static unsigned g_bw, g_bh; /* 棋盘宽、高(格) */ +static unsigned g_ncells; /* g_bw * g_bh */ +static unsigned g_bm_words; /* 位图字数 */ +static unsigned g_board_r0; /* 棋盘左上角在网格里的行(居中) */ +static unsigned g_board_c0; /* 棋盘左上角在网格里的列(居中) */ + +/* 格索引 <-> (行, 列)。这颗核有无符号除法 divu/remu,直接用;虽然多周期, + * 但一局游戏这点开销无所谓。 */ +#define IDX_R(i) ((i) / g_bw) +#define IDX_C(i) ((i) % g_bw) /* 游戏状态 */ #define ST_PLAY 0u @@ -32,9 +43,10 @@ #define ST_LOSE 2u /* ---- 棋盘状态:3 个位图,每个 8 个字(256 位) ---- */ -static unsigned mine_bm[BM_WORDS]; -static unsigned open_bm[BM_WORDS]; -static unsigned flag_bm[BM_WORDS]; +static unsigned mine_bm[BM_WORDS_MAX]; +static unsigned open_bm[BM_WORDS_MAX]; +static unsigned flag_bm[BM_WORDS_MAX]; +static unsigned seen_bm[BM_WORDS_MAX]; /* BFS:已经入过队的格子,避免重复入队把队列撑满 */ /* 其它全局状态(全部进 .bss,靠 start.c 清零) */ static unsigned opened_cnt; @@ -46,7 +58,7 @@ static unsigned g_difficulty; static unsigned rnd_state; static unsigned cur_r, cur_c; /* 光标所在的网格格 */ static int acc_x, acc_y; /* 指针累积量(1/8 格,有符号) */ -static unsigned bfs_q[NCELLS]; /* 揭开用的队列 */ +static unsigned bfs_q[NCELLS_MAX]; /* 揭开用的队列(按最大棋盘分配) */ /* ============================ 小工具 ============================ */ @@ -74,7 +86,7 @@ static void draw_cell(unsigned gr, unsigned gc, unsigned glyph, unsigned color) /* 把棋盘格 (r,c) 画出来 */ static void draw_tile(unsigned r, unsigned c, unsigned glyph, unsigned color) { - draw_cell(BOARD_R0 + r, BOARD_C0 + c, glyph, color); + draw_cell(g_board_r0 + r, g_board_c0 + c, glyph, color); } static unsigned num_color(unsigned n) @@ -96,20 +108,20 @@ static unsigned num_color(unsigned n) static unsigned in_board(void) { - if (cur_r < BOARD_R0) + if (cur_r < g_board_r0) return 0u; - if (cur_r >= (BOARD_R0 + BH)) + if (cur_r >= (g_board_r0 + g_bh)) return 0u; - if (cur_c < BOARD_C0) + if (cur_c < g_board_c0) return 0u; - if (cur_c >= (BOARD_C0 + BW)) + if (cur_c >= (g_board_c0 + g_bw)) return 0u; return 1u; } static unsigned cur_index(void) { - return ((cur_r - BOARD_R0) << 4) + (cur_c - BOARD_C0); /* *BW(=16) 用移位 */ + return ((cur_r - g_board_r0) * g_bw) + (cur_c - g_board_c0); } /* LCG 随机数:只用 mul/add/移位 */ @@ -119,13 +131,32 @@ static unsigned rnd_next(void) return rnd_state >> 16; } -static unsigned difficulty_mines(unsigned difficulty) +/* 设定难度:棋盘尺寸 + 雷数 + 居中位置,三档完全照微软扫雷。 */ +static void set_difficulty(unsigned difficulty) { - if (difficulty == 0u) - return 20u; - if (difficulty == 2u) - return 60u; - return 40u; + g_difficulty = difficulty; + if (difficulty == 0u) /* 初级:9x9,10 雷 */ + { + g_bw = 9u; + g_bh = 9u; + g_mines = 10u; + } + else if (difficulty == 2u) /* 高级:30x16,99 雷 */ + { + g_bw = 30u; + g_bh = 16u; + g_mines = 99u; + } + else /* 中级:16x16,40 雷 */ + { + g_bw = 16u; + g_bh = 16u; + g_mines = 40u; + } + g_ncells = g_bw * g_bh; + g_bm_words = (g_ncells + 31u) / 32u; + g_board_c0 = (GRID_COLS - g_bw) / 2u; /* 棋盘居中 */ + g_board_r0 = (GRID_ROWS - g_bh) / 2u; } /* ============================ 画面 ============================ */ @@ -142,24 +173,24 @@ static void clear_screen(void) static void draw_frame(void) { unsigned gc, gr; - for (gc = (BOARD_C0 - 1u); gc <= (BOARD_C0 + BW); gc = gc + 1u) + for (gc = (g_board_c0 - 1u); gc <= (g_board_c0 + g_bw); gc = gc + 1u) { - draw_cell(BOARD_R0 - 1u, gc, G_SOLID, C_CYAN); - draw_cell(BOARD_R0 + BH, gc, G_SOLID, C_CYAN); + draw_cell(g_board_r0 - 1u, gc, G_SOLID, C_CYAN); + draw_cell(g_board_r0 + g_bh, gc, G_SOLID, C_CYAN); } - for (gr = (BOARD_R0 - 1u); gr <= (BOARD_R0 + BH); gr = gr + 1u) + for (gr = (g_board_r0 - 1u); gr <= (g_board_r0 + g_bh); gr = gr + 1u) { - draw_cell(gr, BOARD_C0 - 1u, G_SOLID, C_CYAN); - draw_cell(gr, BOARD_C0 + BW, G_SOLID, C_CYAN); + draw_cell(gr, g_board_c0 - 1u, G_SOLID, C_CYAN); + draw_cell(gr, g_board_c0 + g_bw, G_SOLID, C_CYAN); } } static void draw_all_covered(void) { unsigned r, c; - for (r = 0u; r < BH; r = r + 1u) + for (r = 0u; r < g_bh; r = r + 1u) { - for (c = 0u; c < BW; c = c + 1u) + for (c = 0u; c < g_bw; c = c + 1u) { draw_tile(r, c, G_COVER, C_GRAY); } @@ -180,11 +211,11 @@ static void set_bg(unsigned color) static unsigned count_adj(unsigned i) { - unsigned r = i >> 4, c = i & 15u, n = 0u, rr, cc; + unsigned r = IDX_R(i), c = IDX_C(i), n = 0u, rr, cc; unsigned r0 = (r == 0u) ? 0u : (r - 1u); - unsigned r1 = (r + 1u >= BH) ? (BH - 1u) : (r + 1u); + unsigned r1 = (r + 1u >= g_bh) ? (g_bh - 1u) : (r + 1u); unsigned c0 = (c == 0u) ? 0u : (c - 1u); - unsigned c1 = (c + 1u >= BW) ? (BW - 1u) : (c + 1u); + unsigned c1 = (c + 1u >= g_bw) ? (g_bw - 1u) : (c + 1u); for (rr = r0; rr <= r1; rr = rr + 1u) { @@ -192,7 +223,7 @@ static unsigned count_adj(unsigned i) { if ((rr == r) && (cc == c)) continue; - n = n + bget(mine_bm, (rr << 4) + cc); + n = n + bget(mine_bm, (rr * g_bw) + cc); } } return n; @@ -201,17 +232,17 @@ static unsigned count_adj(unsigned i) static void lose(unsigned hit) { unsigned k; - for (k = 0u; k < NCELLS; k = k + 1u) + for (k = 0u; k < g_ncells; k = k + 1u) { if (bget(mine_bm, k)) { if (k == hit) { - draw_tile(k >> 4, k & 15u, G_BOOM, C_RED); + draw_tile(IDX_R(k), IDX_C(k), G_BOOM, C_RED); } else if (!bget(flag_bm, k)) { - draw_tile(k >> 4, k & 15u, G_MINE, C_RED); + draw_tile(IDX_R(k), IDX_C(k), G_MINE, C_RED); } } } @@ -222,11 +253,11 @@ static void lose(unsigned hit) static void win(void) { unsigned k; - for (k = 0u; k < NCELLS; k = k + 1u) + for (k = 0u; k < g_ncells; k = k + 1u) { if (bget(mine_bm, k)) { - draw_tile(k >> 4, k & 15u, G_FLAG, C_YELLOW); + draw_tile(IDX_R(k), IDX_C(k), G_FLAG, C_YELLOW); } } REG_W(LED_ADDR) = 0xF00Du; @@ -236,7 +267,7 @@ static void win(void) static void reveal_at(unsigned i) { unsigned qh = 0u, qt = 0u, cur, n, r, c, rr, cc, ni; - unsigned r0, r1, c0, c1; + unsigned r0, r1, c0, c1, k; if (bget(open_bm, i) || bget(flag_bm, i)) return; @@ -246,8 +277,12 @@ static void reveal_at(unsigned i) return; } + for (k = 0u; k < g_bm_words; k = k + 1u) + seen_bm[k] = 0u; + bfs_q[qt] = i; qt = qt + 1u; + bset(seen_bm, i); while (qh < qt) { @@ -260,27 +295,30 @@ static void reveal_at(unsigned i) opened_cnt = opened_cnt + 1u; n = count_adj(cur); - draw_tile(cur >> 4, cur & 15u, n, num_color(n)); + draw_tile(IDX_R(cur), IDX_C(cur), n, num_color(n)); if (n != 0u) continue; - /* 空白格:把周围 8 格入队(队列有界,满了就丢,不会越界) */ - r = cur >> 4; - c = cur & 15u; + /* 空白格:把周围 8 格入队(已入过队的跳过,队列不会溢出) */ + r = IDX_R(cur); + c = IDX_C(cur); r0 = (r == 0u) ? 0u : (r - 1u); - r1 = (r + 1u >= BH) ? (BH - 1u) : (r + 1u); + r1 = (r + 1u >= g_bh) ? (g_bh - 1u) : (r + 1u); c0 = (c == 0u) ? 0u : (c - 1u); - c1 = (c + 1u >= BW) ? (BW - 1u) : (c + 1u); + c1 = (c + 1u >= g_bw) ? (g_bw - 1u) : (c + 1u); for (rr = r0; rr <= r1; rr = rr + 1u) { for (cc = c0; cc <= c1; cc = cc + 1u) { if ((rr == r) && (cc == c)) continue; - ni = (rr << 4) + cc; - if (qt < NCELLS) + ni = (rr * g_bw) + cc; + if (bget(seen_bm, ni) || bget(open_bm, ni) || bget(flag_bm, ni)) + continue; + if (qt < NCELLS_MAX) { + bset(seen_bm, ni); bfs_q[qt] = ni; qt = qt + 1u; } @@ -288,21 +326,21 @@ static void reveal_at(unsigned i) } } - if (opened_cnt == (NCELLS - g_mines)) + if (opened_cnt == (g_ncells - g_mines)) win(); } static void place_mines(unsigned safe) { unsigned placed = 0u, i, r, c; - unsigned sr = safe >> 4; - unsigned sc = safe & 15u; + unsigned sr = IDX_R(safe); + unsigned sc = IDX_C(safe); while (placed < g_mines) { - i = rnd_next() & 255u; /* NCELLS = 256,正好 2 的幂,不需要取模 */ - r = i >> 4; - c = i & 15u; + i = rnd_next() % g_ncells; /* 尺寸不再是 2 的幂,用 remu 取模 */ + r = IDX_R(i); + c = IDX_C(i); /* 首点及其 8 邻居不放雷,保证第一次点击一定能展开 */ if ((r + 1u >= sr) && (r <= (sr + 1u)) && (c + 1u >= sc) && (c <= (sc + 1u))) @@ -342,8 +380,8 @@ static void toggle_flag(void) if (bget(open_bm, i)) return; - r = cur_r - BOARD_R0; - c = cur_c - BOARD_C0; + r = cur_r - g_board_r0; + c = cur_c - g_board_c0; if (bget(flag_bm, i)) { @@ -368,14 +406,14 @@ static void move_cursor(int dr, int dc) int nr = (int)cur_r + dr; int nc = (int)cur_c + dc; - if (nr < (int)(BOARD_R0 - 1u)) - nr = (int)(BOARD_R0 - 1u); - if (nr > (int)(BOARD_R0 + BH)) - nr = (int)(BOARD_R0 + BH); - if (nc < (int)(BOARD_C0 - 1u)) - nc = (int)(BOARD_C0 - 1u); - if (nc > (int)(BOARD_C0 + BW)) - nc = (int)(BOARD_C0 + BW); + if (nr < (int)(g_board_r0 - 1u)) + nr = (int)(g_board_r0 - 1u); + if (nr > (int)(g_board_r0 + g_bh)) + nr = (int)(g_board_r0 + g_bh); + if (nc < (int)(g_board_c0 - 1u)) + nc = (int)(g_board_c0 - 1u); + if (nc > (int)(g_board_c0 + g_bw)) + nc = (int)(g_board_c0 + g_bw); cur_r = (unsigned)nr; cur_c = (unsigned)nc; @@ -437,19 +475,19 @@ static void handle_event(unsigned ev) { if (cur_r == DIFF_EASY_R) { - g_difficulty = 0u; + set_difficulty(0u); draw_start_screen(); return; } if (cur_r == DIFF_NORMAL_R) { - g_difficulty = 1u; + set_difficulty(1u); draw_start_screen(); return; } if (cur_r == DIFF_HARD_R) { - g_difficulty = 2u; + set_difficulty(2u); draw_start_screen(); return; } @@ -457,11 +495,10 @@ static void handle_event(unsigned ev) if ((cur_r == START_R) && (cur_c >= START_C0) && (cur_c <= START_C1)) { g_in_level = 1u; /* 关卡程序返回时自己清 0 */ - g_mines = difficulty_mines(g_difficulty); REG_W(REG_LEVEL) = 1u; } } - else if ((cur_r == (BOARD_R0 - 1u)) && (cur_c == (BOARD_C0 - 1u))) + else if ((cur_r == (g_board_r0 - 1u)) && (cur_c == (g_board_c0 - 1u))) { g_exit = 1u; /* 关卡:点左上角黄格 = 返回上一层 */ } @@ -568,11 +605,14 @@ static void draw_start_screen(void) draw_cell(START_R, i, G_SOLID, C_GREEN); draw_cell(START_R + 1u, i, G_BAR, C_YELLOW); } - draw_cell(START_R, 17u, G_S, C_BLACK); - draw_cell(START_R, 18u, G_T, C_BLACK); - draw_cell(START_R, 19u, G_A, C_BLACK); - draw_cell(START_R, 20u, G_R, C_BLACK); - draw_cell(START_R, 21u, G_T, C_BLACK); + /* 按钮上的字母不能用 C_BLACK:VGA 里像素色 = 字模点 ? 字符色 : 背景色, + * 而背景是黑的,所以“黑字”的字形点和空白处全黑 —— 整格完全看不见。 + * 这里用黄色:黑底黄字,和上下的黄线框也更呼应。 */ + draw_cell(START_R, 17u, G_S, C_YELLOW); + draw_cell(START_R, 18u, G_T, C_YELLOW); + draw_cell(START_R, 19u, G_A, C_YELLOW); + draw_cell(START_R, 20u, G_R, C_YELLOW); + draw_cell(START_R, 21u, G_T, C_YELLOW); /* 下方提示条 */ for (i = 12u; i <= 27u; i = i + 1u) @@ -598,19 +638,19 @@ static void draw_start_screen(void) * -> 点左上角黄格 = 返回:清 LEVEL、return -> isr1_entry 恢复现场并 uret * -> 回到背景程序被打断的那条指令,继续等下一次"开始"。 * ========================================================================== */ -#define RET_R (BOARD_R0 - 1u) -#define RET_C (BOARD_C0 - 1u) +/* 关卡里“返回上一层”的黄格 = 棋盘左上角外面一格(随难度尺寸移动) */ void level_main(void) { unsigned r; /* ---- 关卡初始化 ---- */ - for (r = 0u; r < BM_WORDS; r = r + 1u) + for (r = 0u; r < g_bm_words; r = r + 1u) { mine_bm[r] = 0u; open_bm[r] = 0u; flag_bm[r] = 0u; + seen_bm[r] = 0u; } opened_cnt = 0u; flags_cnt = 0u; @@ -619,13 +659,13 @@ void level_main(void) g_exit = 0u; acc_x = 0; acc_y = 0; - cur_r = BOARD_R0 + 8u; - cur_c = BOARD_C0 + 8u; + cur_r = g_board_r0 + (g_bh / 2u); /* 光标从棋盘中心开始 */ + cur_c = g_board_c0 + (g_bw / 2u); clear_screen(); draw_frame(); draw_all_covered(); - draw_cell(RET_R, RET_C, G_BAR, C_YELLOW); /* 左上角黄格 = 返回 */ + draw_cell(g_board_r0 - 1u, g_board_c0 - 1u, G_BAR, C_YELLOW); /* 左上角黄格 = 返回 */ set_bg(C_BLACK); update_cursor_reg(); REG_W(LED_ADDR) = g_mines; @@ -680,7 +720,7 @@ int main(void) crt_zero_bss(); /* 清 .bss(上电 RAM 本来就是 0,保险起见) */ rnd_state = REG_R(REG_TIME) | 1u; /* 用自由计数器当随机种子 */ - g_difficulty = 1u; /* 默认普通:40 颗雷 */ + set_difficulty(1u); /* 默认中级:16x16,40 颗雷 */ REG_W(REG_MCTRL) = 1u; /* 打开鼠标中断(IRQ2,入口 0x200) */ REG_W(REG_LEVEL) = 0u; /* 清关卡软中断 */