我第二個建議使用LCC。我在這個自制的16位RISC項目中使用它:http://fpgacpu.org/xsoc/cc.html。
我認爲不管你是否構建8位變體並使用3個隨附攜帶來增加IP或24位變體並在硬件中完成整個事情,這應該會有很大的區別。你可以隱藏你的彙編器的差異。
如果你看看我上面的文章,或者更簡單的CPU:http://fpgacpu.org/papers/soc-gr0040-paper.pdf你會看到你真的不需要那麼多的操作符/指令來覆蓋整數C repetoire。事實上,有一個lcc實用程序(ops)可以打印給定機器的min操作符集。
欲瞭解更多信息,請參閱上LCC移植到新的機器在這裏我的文章:http://www.fpgacpu.org/usenet/lcc.html
有一次,我移植LCC,我寫了一個彙編程序,它的合成,從實驗室的基本指令的大repetoire。例如,我的機器有負載字節無符號而不是負載字節的簽名,所以我發出這個順序:
lbs rd,imm(rs) ->
lbu rd,imm(rs)
lea r1,0x80
xor rd,r1
sub rd,r1
所以我認爲你可以操作這個分蓋度日:
registers
load register with constant
load rd = *rs
store *rs1 = rs2
+ - (w/ w/o carry) // actually can to + with - and^
>> 1 // << 1 is just +
&^ // (synthesize ~ from ^, | from & and ^)
jump-and-link rd,rs // rd = pc, pc = rs
skip-z/nz/n/nn rs // skip next insn on rs==0, !=0, <0, >=0
更簡單的是沒有寄存器(或者等效地將寄存器與內存模糊 - 所有寄存器都有內存地址)。
爲SP預留一個寄存器,並在編譯器中編寫函數prolog/epilog處理程序,您不必擔心堆棧指令。只有代碼存儲每個被調用者保存寄存器,按幀大小調整SP,等等。
中斷(以及從中斷返回)很簡單。你只需要在指令寄存器中強制一個跳轉鏈接指令。如果您選擇的位模式爲0,並將正確的地址放入源寄存器rs(特別是如果它是r0),則可以使用觸發器復位輸入或額外的力 - 0和門。我在上面的第二篇論文中使用了類似的技巧。
有趣的項目。我看到一個TTL/7400比賽正在進行中,我在想自己機器的簡單程度是否可以避免,並且將32 KB或128 KB的異步SRAM添加到機器以保存代碼和數據會是一種欺騙行爲。
無論如何,快樂的黑客!
p.s.
1)你會想要決定每個整數類型有多大。如果你願意的話,你可以使char,short,int,long,long long等等大小相同,一個24b的單詞,儘管它在最小表示範圍內不符合。
2)雖然我專注於lcc這裏,但您是在問C++。我建議首先說服C。一旦你想出了C,包括軟件中的*,/,%運算符等,無論是LLVM還是GCC,都應該更容易轉移到完整的C++。 C和C++之間的區別僅僅是「處理虛函數調用,指向成員解引用,動態轉換,靜態構造函數,異常處理所需的額外vtables和RTTI表和代碼序列(完全構建在原始C整數運算符repetoire之外)處理等。
這可能是一個天真的問題,但爲什麼你必須實現所有的C++的功能?難道你不能只用寫一個新的LLVM目標體系結構,並且Clang會毫無問題地編譯C++嗎? –
@Dan Cecile這正是我要做的。但是您可以看到,爲具有24位內存空間的8位CPU編寫LLVM後端可能有點不重要。 – BarsMonster
所以你有4個部分;弄清楚如何實現[LLVM彙編語言](http://llvm.org/docs/LangRef.html)與您的硬件一起工作,複製和修改[現有的LLVM目標](https://github.com/earl)/llvm-mirror/tree/master/lib/Target)與你的硬件一起工作,弄清楚如何讓Clang [產生8位LLVM字節碼](http://clang.llvm.org/doxygen/classclang_1_1TargetInfo.html )([指針大小是可配置的](http://clang-developers.42468.n3.nabble.com/Re-targeting-clang-to-a-new-architecture-tp761920p762813.html)),然後將您的硬件更改爲更合適。 –