Sie haben Glück, weil ich gerade an einem Arduino-PC arbeite! Es ist aber nicht viel, nur das erste Modell. Die Firmware ist auch sehr einfach und hat einen kleinen API-Satz. Aber das Ding funktioniert! Nicht gut genug, um BASIC (oder eine andere Sprache als die eigene) zu bearbeiten, aber dies ist nur das erste Modell. Die Mobo ist ganz einfach, und ich dies . Hier ist die Firmware, die ich verwendet habe:
#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;
}
}
}
}
Die Methodenbeschreibung ist schwer zu erklären, aber der Code wird als Rohbyte gespeichert. Ich sollte bald Entwicklungssoftware haben ... Hoffe das hilft! Wenn Sie dies jemals für Projekte verwenden möchten, MÜSSEN SIE EINE BIOS.mk8-Datei im Stammverzeichnis der SD haben, sonst funktioniert das System nicht.