日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

挖个大坑:挑战用纯micropython写一个nes模拟器(一)

發布時間:2023/12/20 python 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 挖个大坑:挑战用纯micropython写一个nes模拟器(一) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

驅動類的micropython程序基本都已經會了,現在給自己挖個大坑:挑戰用純micropython寫個nes模擬器。
為啥干這個事兒,其實從小就對模擬器特別又興趣,很好奇是怎么做到的,在30歲終于動手干了,難度很大,不知道自己能不能完成,全網沒有,搜了,有很多c的,沒有mpy的,從思路開始一步一步從頭寫:
第一步是最簡單基本的讀取rom:
通過資料研究學習了nes的rom格式:
簡單說:開始16字節是頭文件,后面每16k一個程序文件,每8k一個圖像文件。
頭文件:0-4字節,必定為b’NES\x1a’,如不是則說明了不是nes rom文件
5字節:rom中有幾個程序文件
6字節:rom中有幾個圖像文件
好了按這個需求讀文件并分割數據,不難
然后是讀圖像文件:兩個8bytes單色圖像組合,形成一個8x8,有四種顏色可能的圖像文件,所以每個8k的圖像庫有512塊圖像,讀然后自己給定4種顏色,打印到屏幕,成功了,也側面證明我寫的讀rom文件沒有錯誤,上圖和文件:

import framebuf import lcd screen=lcd.tftdef loadrom():global programlist,spritelistwith open('1.nes', 'rb') as file:rom_bytes = file.read()checkhead=rom_bytes[0:4]programsum=rom_bytes[4]imagesum=rom_bytes[5]romsettings=rom_bytes[6:8]headothers=rom_bytes[8:16]if checkhead==b'NES\x1a':programend=16+16*1024*programsumprogrambytes=rom_bytes[16:16+programend]imagebytes=rom_bytes[programend:programend+8*1024*imagesum]programlist=[]imagelist=[]spritelist=[]for i in range(0,programsum):programlist.append(programbytes[i*16*1024:i*16*1024+16*1024])for i in range(0,imagesum):imagelist.append(imagebytes[i*8*1024:i*8*1024+8*1024])for i in range(0,512):spritelist.append(imagelist[0][i*16:i*16+16])else:print('wrong nes rom')def drawsprite(bufsp):color1=b'\xff\xff' #whitecolor2=b'\xf8\x00' #rcolor3=b'\x07\x70' #gcolor4=b'\x70\x1f' #by=0for x,data in enumerate(bufsp):newspirite=b''for i in range(0,8):for j in range(0,8):res=(bbit(data[i],(8-j-1))<<1)|bbit(data[i+8],(8-j-1))if res==0:newspirite+=color1elif res==1:newspirite+=color2elif res==2:newspirite+=color3elif res==3:newspirite+=color4fbsprite=framebuf.FrameBuffer(bytearray(newspirite),8,8,framebuf.RGB565)if (x%32)!=0:screen.blit_buffer(fbsprite,8*(x%32),y,8,8)else:y+=8x=0screen.blit_buffer(fbsprite,8*(x%32),y,8,8) def bbit(bdata,index): trsdata=0trsdata=bdata&(1<<index)if trsdata!=0:return 1else:return 0loadrom() drawsprite(spritelist)

用這個測序一下經典的mario rom,mario游戲有兩個程序文件,一個圖像文件,測試一下圖像文件是否正常:

沒毛病,第一關過了,后面還有無數大坑等著我,有空我就慢慢填
2022.9.26 宣布:本坑已棄了,有人已經移植了nes模擬器,我就不搞了,但是中間學了好多知識到現在都印象深刻。

總結

以上是生活随笔為你收集整理的挖个大坑:挑战用纯micropython写一个nes模拟器(一)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。