NES模擬器開發-CPU筆記


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

原理:

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

寄存器:

  主要有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條指令的模擬.

調試:

  因為是從零開始實現,因此一個良好的調試器是必備的,否則第一條指令是寫對了還是寫錯了都無法知道,只能盲寫.對比了幾個調試器發現FCEUX不錯,主要是它可以停在入口點(FFFC),從第一條指令開始單步.強烈推薦.調試的過程中發現前幾條指令我都模擬正確了,運行了大概10條指令后程序就進入了一個循環(LDA->BPL),調試器運行到這里循環點運行能過去,我猜測是過程中觸發了某個中斷,下一步就是模擬中斷的實現.

2015-09-15:

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

中斷:

  待實現.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM