我的項目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,看來必須一同實現了?
中斷:
待實現.