Вам повезло, вроде как, потому что я сейчас работаю на Arduino PC! Это не так много, только первая модель. Прошивка также очень проста и имеет небольшой набор API. Но вещь работает! Недостаточно хорошо для редактирования BASIC (или любого языка, кроме его собственного), но это только первая модель. Мобо довольно прост, и я использовал это . Вот прошивка, которую я использовал:
#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;
}
}
}
}
Описание метода сложно объяснить, но код хранится в виде необработанных байтов. Я должен скоро разработать программное обеспечение ... Надеюсь, это поможет! Если вы когда-либо захотите использовать это для каких-либо проектов, вы ДОЛЖНЫ ИМЕТЬ файл BIOS.mk8 в корневом каталоге SD, иначе система не будет работать.