Bạn thật may mắn, vì tôi thực sự đang làm việc trên một PC arduino ngay bây giờ! Nó không phải là nhiều mặc dù, chỉ có mô hình đầu tiên. Phần sụn cũng rất đơn giản và có một bộ API nhỏ. Nhưng, điều này hoạt động! Không đủ tốt để chỉnh sửa BASIC (hoặc bất kỳ ngôn ngữ nào ngoại trừ ngôn ngữ của chính nó), nhưng đây chỉ là mô hình đầu tiên. Mobo khá đơn giản, và tôi đã sử dụng nó . Đây là phần sụn tôi đã sử dụng:
#include <LCD4884.h>
#include <SD.h>
#include <SPI.h>
#include <SoftwareSerial.h>
void setup() {
lcd.LCD_init();
lcd.LCD_clear();
lcd.LCD_write_string_big(0, 0, "Gilbert", MENU_NORMAL);
pinMode(10, OUTPUT);
delay(3000);
}
byte line = 10;
SoftwareSerial FC(8,9);
byte RAM[501];
byte Error = 0;
char tempString[15];
void loop() {
// <editor-fold defaultstate="collapsed" desc="Initilization">
FC.begin(4800);
if (!FC.available()) {
lcd.LCD_clear();
lcd.LCD_write_string(0, 0, "FC Failed!", MENU_NORMAL);
delay(1000);
}
int address = 1;
lcd.LCD_clear();
lcd.LCD_write_string(0, 0, "SD Init...", MENU_NORMAL);
if (!SD.begin(10)) {
lcd.LCD_clear();
lcd.LCD_write_string(0, 0, "SD Failed!", MENU_NORMAL);
while (true) {
;
}
}
lcd.LCD_clear();
lcd.LCD_write_string(0, 0, "Loading...", MENU_NORMAL);
File file;
file = SD.open("BIOS.mk8", FILE_READ);
RAM[0] = 53;
RAM[file.read()] = 8;
while (file.available()) {
RAM[address] = file.read();
address++;
}
address++;
RAM[address] = 55;
long loops = 0;
long time1 = 0;
long time2 = 0;
address = 0;
byte instruction = 0;
int exeaddress;
byte tempbyte;
lcd.LCD_clear();
lcd.LCD_write_string(0, 0, "EMU. Started", MENU_NORMAL);// </editor-fold>
//emulation loop
while(true){
switch(RAM[address]){
// <editor-fold defaultstate="collapsed" desc="Codes 1-10">
case 1:
{//getCycleCount[intvar i]
tempbyte = (loops) / ((time2 - time1) / 1000);
convert(address + 1);
writeInt(exeaddress, tempbyte);
break;
}
case 2:
{//getTemp[intvar i]
tempbyte = (((analogRead(A1) / 1024.0) * 5.0) - .5) * 100;
convert(address + 1);
writeInt(exeaddress, tempbyte);
break;
}
case 3:
{//getKey[intvar i]
//Up 745
//Down 332
//Left 0
//Right 509
//Center 145
switch (analogRead(A0)) {
case 745:
{
tempbyte = 1;
break;
}
case 332:
{
tempbyte = 2;
break;
}
case 0:
{
tempbyte = 3;
break;
}
case 509:
{
tempbyte = 4;
break;
}
case 145:
{
tempbyte = 5;
break;
}
}
convert(address + 1);
writeInt(exeaddress, tempbyte);
break;
}
case 4:
{//printLine[variable v]
if (line > 70) {
lcd.LCD_clear();
line = 0;
}
switch(RAM[address + 1]){
case 9:{
tempbyte = RAM[address + 1];
tempString[0] = char(tempbyte);
break;
}
case 15:{
convert(address + 1);
break;
}
}
lcd.LCD_write_string(0, line, tempString, MENU_NORMAL);
line += 10;
break;
}
case 5:
{//exe detector
exeaddress = address;
break;
}
case 7:
{//lcdClear
lcd.LCD_clear();
line = 0;
break;
}
case 10:
{//declareInteger[string name]
convert(address + 1);
tempbyte = 0;
while (tempbyte != 15) {
RAM[address + tempbyte + 1] = tempString[tempbyte];
}
break;
}// </editor-fold>
case 11:{//getError[intvar i]
tempbyte = Error;
Error = 0;
convert(address + 1);
writeInt(exeaddress, tempbyte);
break;
}
case 12:{//deadlock
while(true){;}
break;
}
case 13:{//assignInteger[int value, intvar i]
tempbyte = RAM[address + 1];
convert(address + 2);
writeInt(exeaddress, tempbyte);
break;
}
case 14:{//transferInteger[intvar i1, intvar i2]
convert(address + 1);
writeInt(exeaddress, RAM[getIntAddr(exeaddress)]);
break;
}
}
// <editor-fold defaultstate="collapsed" desc="post loop process">
address++;
time2 = millis();
loops++;
if (loops < 0) {
loops = 0;
}// </editor-fold>
}
}
void convert(int startAddress){
byte charadd = 0;
while(RAM[startAddress] != 6){
tempString[charadd] = RAM[startAddress];
charadd++;
startAddress++;
}
}
void writeInt(int exeStart, byte value){
byte count = 0;
char compare[15];
while(true){
if (RAM[exeStart] == 9) {
exeStart++;
while (count != 15) {
compare[count] = RAM[exeStart];
exeStart++;
count++;
}
if(compare == tempString){
RAM[exeStart + 2] = value;
break;
}else{
exeStart += 3;
}
if(RAM[exeStart] == 8){
Error = 1;
}
}
}
}
int getIntAddr(int exeStart){
byte count = 0;
char compare[15];
while(true){
if (RAM[exeStart] == 9) {
exeStart++;
while (count != 15) {
compare[count] = RAM[exeStart];
exeStart++;
count++;
}
if(compare == tempString){
return RAM[exeStart + 2];
break;
}else{
exeStart += 3;
}
if(RAM[exeStart] == 8){
Error = 1;
}
}
}
}
Mô tả phương thức khó giải thích, nhưng mã được lưu trữ dưới dạng byte thô. Tôi nên sớm phát triển phần mềm ... Hy vọng điều này sẽ giúp! Nếu bạn muốn sử dụng nó cho bất kỳ dự án nào, BẠN PHẢI CÓ tệp BIOS.mk8 trên thư mục gốc của SD hoặc hệ thống sẽ không hoạt động.