Anda beruntung, semacam, karena saya benar-benar bekerja pada PC Arduino sekarang! Itu tidak banyak, hanya model pertama. Firmware juga sangat sederhana, dan memiliki satu set API kecil. Tapi, masalahnya berhasil! Tidak cukup baik untuk mengedit BASIC (atau bahasa apa pun kecuali bahasa sendiri), tetapi ini hanya model pertama. Mobo cukup sederhana, dan saya menggunakan ini . Berikut adalah firmware yang saya gunakan:
#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;
}
}
}
}
Deskripsi metode sulit dijelaskan, tetapi kode disimpan sebagai byte mentah. Saya harus segera mengembangkan perangkat lunak ... Semoga ini bisa membantu! Jika Anda pernah ingin menggunakan ini untuk proyek apa pun, ANDA HARUS MEMILIKI file BIOS.mk8 pada direktori root SD atau sistem tidak akan berfungsi.