Недавно я собрал первую версию своего устройства, но не смотря на небольшой срок программа имеет множество изменений, доработок и улучшений. В предыдущей статье я кратко рассказал о том как собрать ESPspectrum https://habr.com/ru/articles/783778/. В этой как и планировалось, я расскажу и работе программы ( т.е. операционной системе ESPspectrum ).
На данном этапе для работы с файлами, я использую SPIFFS. В следующей версии будет SD карты( уже заказал все необходимое ) .
На момент выхода следующих статьей, устройство перейдет на новый уровень и их содержимое станет поинтересней.
Основной файл скетча
В нем объявляются функции и переменные, осуществляется подключение библиотек и загрузка устройства.
void menuOC();
void freereadKeyboard();
void kalculator();
//files
void file_mode();
void file_read();
String filename();
String write_data();
void file_del();
void file_create();
//games
void snake_game(); //можно удалить, работает без этой строчки
void game_menu();
/*==============================================*/
#define CLOCK 16 //D-
#define DATA 17 //D+
const char keymap[] = {
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, '`', 0,
0, 0 , 0 , 0, 0, 'q', '1', 0,
0, 0, 'z', 's', 'a', 'w', '2', 0,
0, 'c', 'x', 'd', 'e', '4', '3', 0,
0, ' ', 'v', 'f', 't', 'r', '5', 0,
0, 'n', 'b', 'h', 'g', 'y', '6', 0,
0, 0, 'm', 'j', 'u', '7', '8', 0,
0, ',', 'k', 'i', 'o', '0', '9', 0,
0, '.', '/', 'l', ';', 'p', '-', 0,
0, 0, '\'', 0, '[', '=', 0, 0,
0, 0, 13, ']', 0, '\\', 0, 0,
0, 0, 0, 0, 0, 0, 127, 0,
0, '1', 0, '4', '7', 0, 0, 0,
'0', '.', '2', '5', '6', '8', 0, 0,
0, '+', '3', '-', '*', '9', 0, 0,
0, 0, 0, 0
};
int lastscan;
String txt_keys;
/*==============================================*/
#include <ESP32Lib.h>
#include <Ressources/Font6x8.h>
#include <Ressources/CodePage437_8x8.h>
#include <Ressources/CodePage437_8x14.h>
#include <Ressources/CodePage437_8x16.h>
// одинаковые резисторы на R G B!!!!!!
//pin configuration
const int redPin = 33;
const int greenPin = 14;
const int bluePin = 12;
const int hsyncPin = 2;
const int vsyncPin = 4;
//VGA Device
VGA3Bit vga;
/*==============================================*/
#include "FS.h"
#include "SPIFFS.h"
// Создаем объект класса «File» для манипуляции с файлом:
File myFile;
/*==============================================*/
void setup()
{
Serial.begin(115200);
//initializing vga at the specified pins
pinMode(CLOCK, INPUT_PULLUP); //пины клавиатуры
pinMode(DATA, INPUT_PULLUP);
vga.init(vga.MODE320x240, redPin, greenPin, bluePin, hsyncPin, vsyncPin);
vga.setFont(CodePage437_8x16);
vga.setCursor(2, 5);
vga.println("Starting...");
vga.setCursor(2, 25);
vga.println("ESPspectrum V1");
vga.setFont(CodePage437_8x14);
vga.setCursor(2, 100);
vga.println("created on 2023");
delay(5000);
vga.clear(vga.RGB(0, 0, 0));
delay(1000);
vga.setCursor(0, 0);
if(!SPIFFS.begin(true)){ // Инициализируем / "Ошибка при монтировании SPIFFS"
Serial.println("Error while mounting SPIFFS"); vga.println("Error while mounting SPIFFS");
delay(2000); vga.clear(vga.RGB(0, 0, 0)); vga.setCursor(0, 0); return; }
}
int menu = 0;
void loop() {
menuOC(); Serial.println(txt_keys);
}
Меню OC
В данной вкладке происходит перемещение по меню: команды, калькулятор, игровое меню, файловое меню и свободная печать. Перемещение происходит при нажатии клавиш 1 - 5.
Если требуется то можно легко добавить еще вкладки.
void menuOC(){
vga.setCursor(2, 2);
vga.println("1 - Work with files");
vga.println("2 - Calculator");
vga.println("3 - Free printing");
vga.println("4 - View the commands");
vga.println("5 - Games");
/*==================================================*/
int scanval = 0;
for(int i = 0; i<11; i++)
{
while(digitalRead(CLOCK));
scanval |= digitalRead(DATA) << i;
while(!digitalRead(CLOCK));
}
scanval >>= 1;
scanval &= 0xFF;
Serial.println(scanval, HEX);
if(lastscan != 0xF0 && scanval != 0xF0)
{
if(scanval != 0x5A and scanval != 0xE0)
{
txt_keys = txt_keys + keymap[scanval];
Serial.println(keymap[scanval]);
}
//системные клавиши, чтобы не было напечатано непонятных символов
if(scanval == 0x76){vga.clear(vga.RGB(0,0,0)); vga.setCursor(0, 0);}
if(scanval == 0x5A){vga.clear(vga.RGB(0,0,0)); menu = 0;}
if(scanval == 0xE0){vga.clear(vga.RGB(0,0,0)); menu = 0;}
if(scanval == 0x16){menu = 1;}
if(scanval == 0x1E){menu = 2;}
if(scanval == 0x26){menu = 3;}
if(scanval == 0x25){menu = 4;}
if(scanval == 0x2E){menu = 5;}
//если адрес == "" то переменная меню равна ""
}
lastscan = scanval;
/*========================================================*/
if(menu == 0){ txt_keys = ""; }
//если пересенная меню равна "" то открываем ""
if(menu == 1){ txt_keys = ""; vga.clear(vga.RGB(0,0,0)); vga.setCursor(0, 0); file_mode();}
if(menu == 2){ txt_keys = ""; vga.clear(vga.RGB(0,0,0)); vga.setCursor(0, 0); kalculator();}
if(menu == 3){ txt_keys = ""; vga.clear(vga.RGB(0,0,0)); vga.setCursor(0, 0); freereadKeyboard(); }
if(menu == 4)
{
txt_keys = ""; vga.clear(vga.RGB(0,0,0)); vga.setCursor(0, 0);
vga.print("instructions for use can be found in the README file"); //инструкция в файле README
delay(5000); vga.clear(vga.RGB(0,0,0)); vga.setCursor(0, 0);
}
if(menu == 5){ txt_keys = "";vga.clear(vga.RGB(0,0,0)); game_menu();}
Serial.print("menu = ");Serial.println(menu);
}
Свободная печать
Режим очень полезен если требуется узнать адрес клавиши или проверить клавиатуру
/*==================================*/
void freereadKeyboard(){
while(true){
int scanval = 0;
for(int i = 0; i<11; i++)
{
while(digitalRead(CLOCK));
scanval |= digitalRead(DATA) << i;
while(!digitalRead(CLOCK));
}
scanval >>= 1;
scanval &= 0xFF;
Serial.println(scanval, HEX);
if(lastscan != 0xF0 && scanval != 0xF0)
{
if(scanval != 0x5A and scanval != 0xE0)
{
txt_keys = txt_keys + keymap[scanval];
Serial.println(keymap[scanval]);
vga.print(keymap[scanval]);
}
//системные клавиши, чтобы не было напечатано непонятных символов
if(scanval == 0x76){vga.clear(vga.RGB(0,0,0)); vga.setCursor(0, 0);}
if(scanval == 0x5A){vga.println(""); }
if(scanval == 0xE0){vga.clear(vga.RGB(0,0,0)); menu = 0; return;}
}
lastscan = scanval;
}
}
Калькулятор
Первая версия не имеет много возможностей, но простые операции выполняет. Возможна работа с дробными числами.
Работает функция сложения, умножения, вычитания, деления и сравнивания(123,22225 = 123,22 ?)
void kalculator() {
String sing = "=";
String s1 = "";
String s2 = "";
int s12 = 1;
vga.println("Calculator");
/*==================================================*/
while(true){
int scanval = 0;
for(int i = 0; i<11; i++)
{
while(digitalRead(CLOCK));
scanval |= digitalRead(DATA) << i;
while(!digitalRead(CLOCK));
}
scanval >>= 1;
scanval &= 0xFF;
Serial.println(scanval, HEX);
if(lastscan != 0xF0 && scanval != 0xF0)
{
if(scanval != 0xE0){
if( keymap[scanval] == '='){sing = "=";}
if( keymap[scanval] == '+'){sing = "+";}
if( keymap[scanval] == '-'){sing = "-";}
if( keymap[scanval] == '*'){sing = "*";}
if( keymap[scanval] == '/'){sing = "/";}
if( keymap[scanval] == '=' or keymap[scanval] == '+' or keymap[scanval] == '-' or keymap[scanval] == '*' or keymap[scanval] == '/' or scanval == 0x5A ){
if(s12 == 1){ s1 = txt_keys; txt_keys = ""; s12 = 2;}
else{s2 = txt_keys; txt_keys = ""; s12 = 1;}
}
else{txt_keys = txt_keys + keymap[scanval];}
if(scanval != 0xE0 and scanval != 0x5A){ Serial.println(keymap[scanval]); vga.print(keymap[scanval]); }
}
//системные клавиши, чтобы не было напечатано непонятных символов
if(scanval == 0x76){vga.clear(vga.RGB(0,0,0)); vga.setCursor(0, 0); vga.println("Kalculator"); s1 = ""; s2 = ""; txt_keys = "";}
//ответ
if(scanval == 0x5A){vga.println("");
if(sing == "="){vga.println(s1.toFloat() == s2.toFloat());}
if(sing == "+"){vga.println(s1.toFloat() + s2.toFloat() );}
if(sing == "-"){vga.println(s1.toFloat() - s2.toFloat() );}
if(sing == "*"){vga.println(s1.toFloat() * s2.toFloat() );}
if(sing == "/"){vga.println(s1.toFloat() / s2.toFloat() );}
s1 = ""; s2 = ""; txt_keys = "";
}
if(scanval == 0xE0){vga.clear(vga.RGB(0,0,0)); menu = 0; return;}
}
lastscan = scanval;
/*========================================================*/
Serial.print("s1 = ");Serial.println(s1);
Serial.print("s2 = ");Serial.println(s2);
}
}
Работа с файлами
В этой вкладке есть свое меню действий при работе с файлами: чтение, создание/перезапись, удаление.
Чтобы прочитать файл, надо ввести имя нужного файла. Формат указывать не требуется( пример test1). Для удаления потребуется тоже ввести имя нужного файла. Но чтобы создать или изменить по мимо ввода имени файла требуется ввести содержимое.
String write_data(){
String str = " <no data> ";
while(true){
int scanval = 0;
for(int i = 0; i<11; i++)
{
while(digitalRead(CLOCK));
scanval |= digitalRead(DATA) << i;
while(!digitalRead(CLOCK));
}
scanval >>= 1;
scanval &= 0xFF;
Serial.println(scanval, HEX);
if(lastscan != 0xF0 && scanval != 0xF0)
{
if(scanval != 0x5A and scanval != 0xE0)
{
txt_keys = txt_keys + keymap[scanval];
Serial.println(keymap[scanval]);
vga.print(keymap[scanval]);
}
//системные клавиши, чтобы не было напечатано непонятных символов
if(scanval == 0x76){vga.clear(vga.RGB(0,0,0)); vga.setCursor(0, 0); txt_keys = ""; }
if(scanval == 0x5A){
str = txt_keys;
vga.setCursor(0, 0);
vga.clear(vga.RGB(0,0,0));
txt_keys = "";
return(str);
}
if(scanval == 0xE0){vga.clear(vga.RGB(0,0,0)); vga.setCursor(0, 0); txt_keys = ""; }
}
lastscan = scanval;
}
}
String filename(){
String str;
while(true){
int scanval = 0;
for(int i = 0; i<11; i++)
{
while(digitalRead(CLOCK));
scanval |= digitalRead(DATA) << i;
while(!digitalRead(CLOCK));
}
scanval >>= 1;
scanval &= 0xFF;
Serial.println(scanval, HEX);
if(lastscan != 0xF0 && scanval != 0xF0)
{
if(scanval != 0x5A and scanval != 0xE0)
{
txt_keys = txt_keys + keymap[scanval];
Serial.println(keymap[scanval]);
vga.print(keymap[scanval]);
}
//системные клавиши, чтобы не было напечатано непонятных символов
if(scanval == 0x76){vga.clear(vga.RGB(0,0,0)); vga.setCursor(0, 0); txt_keys = ""; str = "";}
if(scanval == 0x5A){
str = "/" + txt_keys + ".txt";
vga.setCursor(0, 0);
vga.clear(vga.RGB(0,0,0));
txt_keys = "";
return(str);
}
if(scanval == 0xE0){vga.clear(vga.RGB(0,0,0)); vga.setCursor(0, 0); txt_keys = ""; str = "";}
}
lastscan = scanval;
}
}
/*==================== mode =========================*/
void file_mode(){
int filemode = 0;
while(true){
vga.setCursor(2, 2);
vga.println("1 - Read");
vga.println("2 - Create new / owerwrite");
vga.println("3 - Delete");
int scanval = 0;
for(int i = 0; i<11; i++)
{
while(digitalRead(CLOCK));
scanval |= digitalRead(DATA) << i;
while(!digitalRead(CLOCK));
}
scanval >>= 1;
scanval &= 0xFF;
Serial.println(scanval, HEX);
if(lastscan != 0xF0 && scanval != 0xF0)
{
if(scanval != 0x5A and scanval != 0xE0){ txt_keys = txt_keys + keymap[scanval]; Serial.println(keymap[scanval]);}
//системные клавиши
if(scanval == 0x76){vga.clear(vga.RGB(0,0,0)); vga.setCursor(0, 0);}
if(scanval == 0x5A){vga.clear(vga.RGB(0,0,0)); filemode = 0;}
if(scanval == 0xE0){vga.clear(vga.RGB(0,0,0)); menu = 0; return;}
if(scanval == 0x16){filemode = 1;}
if(scanval == 0x1E){filemode = 2;}
if(scanval == 0x26){filemode = 3;}
if(scanval == 0x25){filemode = 4;}
if(scanval == 0x2E){filemode = 5;}
}
lastscan = scanval;
if(filemode == 1){ txt_keys = ""; vga.clear(vga.RGB(0,0,0)); vga.setCursor(0, 0); file_read(); }
if(filemode == 2){ txt_keys = ""; vga.clear(vga.RGB(0,0,0)); vga.setCursor(0, 0); file_create();}
if(filemode == 3){ txt_keys = ""; vga.clear(vga.RGB(0,0,0)); vga.setCursor(0, 0); file_del(); }
Serial.print("filemode = ");Serial.println(filemode);
}
}
/*===================== read files ==========================*/
void file_read() // Читаем содержимое файла:
{
int del = 20;
char inByte = 0;
String n = filename();
myFile = SPIFFS.open(n, FILE_READ);
vga.print("File size:");
vga.println(myFile.size()); delay(1000); vga.clear(vga.RGB(0,0,0)); vga.setCursor(0, 0); //size
if(myFile.size() == 0){vga.print("an error is likely, press end"); }
while(myFile.available()) {
inByte = (char)myFile.read();
vga.print((char)inByte); // ascii converter
delay(del);
}
delay(500);
while(true){
int scanval = 0;
for(int i = 0; i<11; i++)
{
while(digitalRead(CLOCK));
scanval |= digitalRead(DATA) << i;
while(!digitalRead(CLOCK));
}
scanval >>= 1;
scanval &= 0xFF;
Serial.println(scanval, HEX);
if(lastscan != 0xF0 && scanval != 0xF0)
{
if(scanval == 0xE0){vga.clear(vga.RGB(0,0,0)); menu = 0; return;}
}
lastscan = scanval;
delay(100);
}
myFile.close();
vga.clear(vga.RGB(0,0,0));
vga.setCursor(0, 0);
}
/*================= delete =====================================*/
void file_del()
{
String n = filename();
if(SPIFFS.remove(n)){
Serial.println("File successfully deleted");
vga.println("File successfully deleted");
}
else{
Serial.print("Deleting file failed!");
vga.print("Deleting file failed!");
// "Не удалось удалить файл!"
}
delay(2000);
vga.clear(vga.RGB(0,0,0));
vga.setCursor(0, 0);
}
/*================= create =====================================*/
void file_create()
{
String n = filename();
String dataf = write_data();
myFile = SPIFFS.open(n, FILE_WRITE);
if (myFile.print(dataf))
{
Serial.println("Message successfully written");
vga.print("Message successfully written");
}
else{Serial.print("Writing message failed!!"); vga.print("Writing message failed!!");}
delay(2500);
myFile.close();
vga.clear(vga.RGB(0,0,0));
vga.setCursor(0, 0);
}
Игры
Самое сложное в данном компьютере, но при этом очень интересное. Переписать или создать игру это довольно долгое занятие, но оно развивает творчество. Как свою первую игру на это устройство я переделал змейку.
В начале данной вкладки добавляется игра - #include "games/SnakeGame.h"
В меню выбора нужно добавить название новой игры, которая находится по адресу Documents\Arduino\ESPspectrum\ESPspectrum_V1\games. Туда копируется игра.
#include "games/SnakeGame.h"
//#include "games/'название игры'.h"
void game_menu()
{
int gamemode = 0;
while(true){
vga.setCursor(2, 2);
vga.println("1 - Snake");
vga.println("2 - Add");
//печать названия и номера игр
int scanval = 0;
for(int i = 0; i<11; i++)
{
while(digitalRead(CLOCK));
scanval |= digitalRead(DATA) << i;
while(!digitalRead(CLOCK));
}
scanval >>= 1;
scanval &= 0xFF;
if(lastscan != 0xF0 && scanval != 0xF0)
{
if(scanval != 0x5A and scanval != 0xE0){ txt_keys = txt_keys + keymap[scanval]; Serial.println(keymap[scanval]);}
//системные клавиши
if(scanval == 0x76){vga.clear(vga.RGB(0,0,0)); vga.setCursor(0, 0);}
if(scanval == 0x5A){vga.clear(vga.RGB(0,0,0)); gamemode = 0;}
if(scanval == 0xE0){vga.clear(vga.RGB(0,0,0)); menu = 0; return;}
if(scanval == 0x16){gamemode = 1;}
if(scanval == 0x1E){gamemode = 2;}
if(scanval == 0x26){gamemode = 3;}
if(scanval == 0x25){gamemode = 4;}
if(scanval == 0x2E){gamemode = 5;}
}
lastscan = scanval;
//если переменная = "" то открываем игру ""
if(gamemode == 1){ txt_keys = ""; vga.clear(vga.RGB(0,0,0)); vga.setCursor(0, 0); snake_game(); }
Serial.print("gamemode = ");Serial.println(gamemode);
}
}
USB
Я нашел вариант с подключением USB а не PC/2 клавиатуры. Код выглядит так
#define CLOCK 16 //D-
#define DATA 17 //D+
const char keymap[] = {
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, '`', 0,
0, 0 , 0 , 0, 0, 'q','1', 0,
0, 0, 'z','s','a','w','2', 0,
0,'c','x','d','e','4','3', 0,
0,' ','v','f','t','r','5', 0,
0,'n','b','h','g','y','6', 0,
0, 0, 'm','j','u','7','8', 0,
0,',','k','i','o','0','9', 0,
0,'.','/','l',';','p','-', 0,
0, 0,'\'', 0,'[', '=', 0, 0,
0, 0,13, ']', 0, '\\', 0, 0,
0, 0, 0, 0, 0, 0, 127, 0,
0,'1', 0,'4','7', 0, 0, 0,
'0','.','2','5','6','8', 0, 0,
0,'+','3','-','*','9', 0, 0,
0, 0, 0, 0 };
void setup()
{
Serial.begin(115200);
pinMode(CLOCK, INPUT_PULLUP); //пины клавиатуры
pinMode(DATA, INPUT_PULLUP);
}
uint8_t lastscan;
uint8_t line = 0, col = 0;
void loop()
{
uint16_t scanval = 0;
for(int i = 0; i<11; i++)
{
while(digitalRead(CLOCK));
scanval |= digitalRead(DATA) << i;
while(!digitalRead(CLOCK));
}
scanval >>= 1;
scanval &= 0xFF;
Serial.println(scanval, HEX);
if(lastscan != 0xF0 && scanval != 0xF0)
{
Serial.println(keymap[scanval]);
}
lastscan = scanval;
}
Самым лучшим вариантом увидеть как это работает - это собрать самому или связаться со мной на сервере дискорд. А в данной статье я решил показать код программы.
Архив с прошивкой и схемой: https://disk.yandex.ru/d/22eXr-gerhFaXA
Почему esp32 https://www.alexcube.ru/blog/2021/11/53-dnya-do-2022-goda-zx-spectrum-iz-arduino/
Вопросы, помощь проекту: https://discord.gg/nd6K7sbR
Комментарии (59)
tormozedison
03.01.2024 19:28+2Как первый проект, сделанный никуда не подглядывая - пойдёт более чем.
Hasthur
03.01.2024 19:28+313 лет? Серьёзно? Ну тогда всё это очень и очень здорово. Вы молодец! Не останавливайтесь. А сеньоры тут конечно чуть поворчат, но зато может полезное что-нибудь подскажут. На перспективу
Господа сеньоры, терпимее, пожалуйста )
Alexandr_Yagupov Автор
03.01.2024 19:28+1Спасибо!! Полезное подсказывают и прошлую статью с помощью критики доработал
voldemar_d
03.01.2024 19:28+2По-английски калькулятор называется всё-таки Calculator.
Только хотел задать вопрос, при чем тут вообще Спектрум, но выше уже в комментариях отметили, что ни при чем. За начинание респект, удачи в дальнейшей разработке.
CyrK
03.01.2024 19:28+1Автор, а не хотите ли создать что-то более полезное. Например, кассовый терминал?
Alexandr_Yagupov Автор
03.01.2024 19:28Будет, но позже. Я на основе ESPspectrum сделаю аппарат для развития детей, который за правильный ответ дает например конфетку.
j-b
03.01.2024 19:28+1Дайте вы уже наконец источник-ссылку, от куда вы научились с usb как с rx/tx работать.
Я уже не поленюсь, и проверю вашу программу. Т.к. у меня в наличии как раз есть 2 клавиатуры, одна с поддержкой ps/2 а вторая чисто usb.
Alexandr_Yagupov Автор
03.01.2024 19:28Источник не найти. Перечитал кучу статей и сделал сам... Заработает на любой Ардуино
j-b
03.01.2024 19:28Мне тоже лень искать конкретный пример для ESP.
Но вот вам принцип работы PS/2 клавиатуры.
https://habr.com/ru/articles/693784/
Для передачи по DATA от клавиатуры в компьютер потребуется соблюсти следующие требования:
Ожидать, пока по линии CLOCK не появится логическая «1» в районе 50 мкс, далее, последовательно;
Передать по DATA старт-бит (всегда 1);
Передать последовательно 8 бит данных;
Передать бит четности;
Передать стоп-бит (всегда 1).
Хотя-бы это и ваш кусок кода "for(int i = 0; i<11; i++)" вам о чем нибудь говорят? (1+8+1+1 бит)
j-b
03.01.2024 19:28и да, искать долго не надо:
https://forum.arduino.ru/t/podklyuchenie-usb-klaviatury-k-arduino/11359
“There seem to be some newer USB keyboards around, that no more support the PS/2 protocol, though.”
Alexandr_Yagupov Автор
03.01.2024 19:28Эта статья была в основе, но я не копировал полностью, посмотрите
tormozedison
03.01.2024 19:28Из-за того, что USB-клавиатур с обратной совместимостью с PS/2 всё меньше, а настоящий USB реализовать может производительности не хватить, многие разработчики переходят к подключению непосредственно клавиатурных матриц.
j-b
03.01.2024 19:28И в догонку, https://www.youtube.com/watch?v=WPlPRkPx1_8 вот видосик по работе с USB-HID клавиатурой и мышкой )))
tormozedison
03.01.2024 19:28Оказывается, существует некий CH559 с аппаратным USB-хостом.
JordanCpp
03.01.2024 19:28Самым лучшим вариантом увидеть как это работает - это собрать самому или связаться со мной на сервере дискорд. А в данной статье я решил показать код программы.
А чë так можно было? :)
Alexandr_Yagupov Автор
03.01.2024 19:28или вы про то что можно связаться?
JordanCpp
03.01.2024 19:28Я о статье на чиле. Типа вот код собирайте.
Alexandr_Yagupov Автор
03.01.2024 19:28???? Не, писать статью для меня сложнее чем собрать, разработать или придумать
Anonym
От Спектрума только название.
Код без слёз читать невозможно.
За пиар 2, за стремление 5.
Alexandr_Yagupov Автор
Не хотел этого говорить, но мне 13 лет. В направлении клонов и компьютеров Spectrum я около двух недель. Опыт небольшой, но желание продолжать, улучшать и делать огромное...
Anonym
Я бы посоветовал сменить название проекта. Или вы делаете клон Спектрума, но тогда он должен работать как Спектрум и поддерживать софт Спектрума. Или вы делаете свою поделку, но тогда и назовите ее как-то иначе, чтобы не вводить в заблуждение.
Ну и выложите на гитхаб что-ли.
Alexandr_Yagupov Автор
Называется ESPspectrum так как есть схожесть в назначении, а так работает мое устройство совершенно по другому. На гитхаб выложу, но позже(есть что подделать)
voldemar_d
Чтобы не вводить людей в заблуждение, где-нибудь в статье добавьте про это, если уж не хотите название проекта изменять.
RomanKu
Поддерживаю, я ещё в первой статье ждал загрузки игр с касет. Тут схожесть может и есть, но через пару лет активной разработки, пока хороший пет проект для того, чтобы самостоятельно пройти весь путь
Alexandr_Yagupov Автор
Я писал, что я пока не могу это сделать сейчас, а позже, если найду этот проигрыватель то постараюсь сделать. Но уже буквально через несколько дней будут чтение SD карт
voldemar_d
Просто для информации - был уже вот такой проект, например:
https://habr.com/ru/articles/412325/
Вот это можно словом "Спектрум" назвать. В статье всякие полезные ссылки есть.
tormozedison
Тут автор принципиально хочет отсутствие прослойки в виде эмулятора. Ибо схему взял от железки, где эмулятор изначально был.
Alexandr_Yagupov Автор
Проект Алекса можно в принципе запустить на ESPspectrum. Я пишу все с нуля так как в отличие от проекта Алекса у меня легко можно поменять содержимое программы. И до эмулятора я еще не дошел
voldemar_d
Что значит "легко можно поменять содержимое программы"? Перепрошил контроллер - вот и поменял содержимое. Или о чем речь?
Alexandr_Yagupov Автор
Он прошивал через ЕСП uploader или как то похоже. Прошивка находится в файлах .bin, изменение содержимого будет не таким простым как в ESPspectrum то есть через Arduino ide.
voldemar_d
При чем здесь способ прошивки? Это никак не влияет на суть того, как оно работает.
Alexandr_Yagupov Автор
Суть в том что мою версию легко доработать внешними модулями, я сейчас и занят травлением новой платы с возможностью подключить SD карты
voldemar_d
К любой схеме на любом МК легко добавить что SD shield, что другой внешний модуль.
Alexandr_Yagupov Автор
Программу вы как в файле .bin поменяете? Я не знаю как это сделать, а Ардуино Ide мне давно знакома....
voldemar_d
Вы собираетесь весь код, эмулирующий Спектрум, самостоятельно в Arduino IDE на c++ написать?
Alexandr_Yagupov Автор
Я уже это сделал, в этой статье все есть
voldemar_d
Что есть? Игра "Змейка" и калькулятор в кодах Z80 исполняются? Хоть одна игра со Спектрума запускается?
Alexandr_Yagupov Автор
нет, так как я использую библиотеку для VGA подкдючения
voldemar_d
Есть куча железных эмуляторов Спектрума с VGA-выходом. В современных эмуляторах никто не стремится повторить RGB-выход для подключения к советскому телевизору.
voldemar_d
Не очень понял, как можно на микроконтроллере запустить Спектрум без эмуляции. Либо я вообще мысль не понял.
Alexandr_Yagupov Автор
Там нет спектрума вообще. Операционка написана в Arduino ide.
voldemar_d
А у вас будем прямо Спектрум? С процессором Z80? И что значит "нет Спектрума", если игры со Спектрума запускаются и работают?
Alexandr_Yagupov Автор
Рекомендую прочитать статьи. ESPspectrum на есп32
voldemar_d
Звучит как "идите в гугл, там всё есть". Ссылку можете дать на что-то конкретное?
Alexandr_Yagupov Автор
https://habr.com/ru/articles/783778/
voldemar_d
Вы про какой проект - на который я дал ссылку выше?
Alexandr_Yagupov Автор
прочитайте первую статью про ESPspectrum, там рассказано из чего я его сделал
tormozedison
Так автору и не нужен Спектрум. А нужна платформа с VGA-выходом, которую можно программировать на «ардуинном языке». Потому что это его первый язык программирования.
Чем он и отличается от айтишников «свитерно-бородатого» периода, стремящихся приделать к любой железке интерпретатор Бейсика. Или эмулятор чего-нибудь, где интерпретатор Бейсика уже есть. Потому что это их первый язык программирования. Таких проектов десятки уже.
Alexandr_Yagupov Автор
Да, спасибо что помогли пояснить
voldemar_d
Из-за того, что в названии есть слово Spectrum, а от самого Спектрума ничего нет, я и не могу понять, что это такое. Тем более, что, действительно, подобных проектов уже много.
Что значит "Ардуинный язык", если это c++ (пусть и с ограничениями платформы)?
Alexandr_Yagupov Автор
Spectrum есть т. к. есть схожее применение. "Ардуинный язык" - упрощенный C++ только для плат Ардуино, espшек и т.д.
tormozedison
13 лет, и такой аккуратный ЛУТ - повод только радоваться за вас.
Разъём VGA так подключён, потому что сверлить не стали?
Alexandr_Yagupov Автор
да, все верно, на днях еще одну вытравлю, постараюсь сделать с отверстиями