Estás de suerte, ¡porque estoy trabajando en una PC Arduino ahora mismo! Sin embargo, no es mucho, solo el primer modelo. El firmware también es muy simple y tiene un pequeño conjunto de API. Pero, la cosa funciona! No es lo suficientemente bueno para editar BASIC (o cualquier idioma excepto el propio), pero este es solo el primer modelo. La placa madre es bastante simple, y que utiliza este . Aquí está el firmware que utilicé:
#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;
}
}
}
}
La descripción del método es difícil de explicar, pero el código se almacena como bytes sin formato. Debería tener el software de desarrollo pronto ... Espero que esto ayude. Si alguna vez quiere usar esto para algún proyecto, DEBE TENER UN archivo BIOS.mk8 en el directorio raíz de la SD o el sistema no funcionará.