NES模擬器開發-CPU筆記

  個人項目XNES已經開始動手編碼了,目前的進度大概是cpu的模擬完成了大概10~20%左右.簡單記錄一下CPU模擬過程當中遇到的問題和思考.git

原理:

  cpu模擬實際就是模擬cpu處理opcode的過程,經過每條指令,來計算CPU的pc,寄存器,棧來實現軟件對硬件的模擬.github

寄存器:

  主要有A,X,Y,C,Z,I,D,B,V,N這麼幾個狀態/標誌寄存器,我看到其餘幾款模擬器和一個調試器中有在中間插入一個U(Unused)寄存器?難道只爲了狀態補齊?目前從資料中還未發現爲何要在中間插入個U,目前個人作法是在最後補了一個Reserved(內存對齊).數組

2015-09-15:編碼

/*********************************
 status register
 7 6 5 4 3 2 1 0
 N V   B D I Z C
*********************************/

  最終仍是插入了一個U.調試

指令/操做碼:

  6502是個8位cpu,理論來講因該只有不超過58種指令,目前我記錄到的是57種(在頭文件def.h中定義).cpu有13種尋址方式,不一樣的指令和尋址方式二者組合就有不少種操做碼(00-FF,定義在__ops數組中).目前完成了大約10條指令的模擬.code

調試:

  由於是從零開始實現,所以一個良好的調試器是必備的,不然第一條指令是寫對了仍是寫錯了都沒法知道,只能盲寫.對比了幾個調試器發現FCEUX不錯,主要是它能夠停在入口點(FFFC),從第一條指令開始單步.強烈推薦.調試的過程當中發現前幾條指令我都模擬正確了,運行了大概10條指令後程序就進入了一個循環(LDA->BPL),調試器運行到這裏循環點運行能過去,我猜想是過程當中觸發了某個中斷,下一步就是模擬中斷的實現.blog

2015-09-15:內存

  繼續往下走了,有沒有觸發中斷不肯定,LDA指令讀的是0x2002地址,查了一下這個地址是ppu的狀態地址,看來那幾條指令是在等ppu狀態同步.暫時手工往內存裏寫點狀態字讓程序往下執行.原本計劃模擬完cpu在處理ppu,看來必須一同實現了?get

中斷:

  待實現.同步

相關文章
相關標籤/搜索