stm32basic, почти МК85 с клавиатурой PS/2

После поисков форм-фактора и удобства работы с клавиатурой в разных экспериментах stm32basic выкристаллизовался в идею использования старой PS/2 клавиатуры как самым удобным устройством ввода из тех, что доступны "из помойки".

Данное железо получило официальное название V1.0 (Breadboard Edition), проект выложен на Гитхабе.
stm32basic V1.0 #1stm32basic V1.0 #2stm32basic V1.0 #3

Пока из готовых к использования программ на Гитхабе лежит лишь NQUEENS.BAS, причем в версии с 1 циклом. Для прогона 100 циклов надо сделать изменения, далее цитата из Гитхаба:

...Copy file to the card and load the program, e.g.:

LOAD "NQUEENS"

NQUEENS.BAS is a progam used for Calculator Speed Benchmark using the N-Queens Problem. The stm32basic is quite fast for measuring it visually with just one loop. It is better to run e.g. 100 lops and then divide the time by 100. One can modify the code on NQUEENS.BAS as following:

45  <- delete line 45 DIM A(9)
12 DIM A(9)
15 FOR X=0 to 100
205 NEXT X

Running of such modified program takes about 69 sec on my system, it gives 0.69 sec. In the above Benchmark list the stm32basic comes between those models:

 -       0.770     ClassPad 300+     CPLua 0.8 / Bytecode / Fast Mode x1.4 (29.5->59 MHz)
 -       0.673     FX-9860GII-2      C.Basic 2.37 / Integer Mode
Метки публикаций: 

Комментарии

Только что добавил в stm32basic функцию

ABS()

из backlog-списка. Выше в тесте вместо ABS() были

if ...then

. Результат: 0.56 сек вместо 0.69 сек.

Поздравляю! В SB4, кстати, можно добавлять в Бейсик функции средствами самого языка. Причём есть возможность при необходимости делать меняющееся число параметров, как у printf(). И даже несколько возвращаемых значений.

Спасибо!
Но, похоже, уперся в ограничения объема флеш-памяти в STM32F103C8T6 "синей таблетки" - объем бинарника уже впритык. Многое из backlog-списка не влезет, хотя удалось добавить

ABS(), SQR(), SIN(), COS(), TAN()

Поэтому оставлю stm32basic V1.0 как сейчас, и буду потихоньку переползать на V2.0 - платка на STM32F103RET6 (RAM: 64K, FLASH: 512K) c TFT экраном 320x240, поддержку TFT экрана 320х240 на ILI9341 чипе с уважаемым Astranome потихоньку допилили:
stm32basic on DSO138

Что можно перенести в BASIC-библиотечку stm32basic из классического и нетленного?
Пока там лежит только классический N-QUEENS.

Самая классика, конечно, Стартрек. В электронном виде у меня его нет, но должен гуглиться.

Где-то по сусекам могу наскрести Тетрис, который я делал с учениками во Дворце пионеров. Он, правда, на QBasic’е. Так что придётся деградировать исходник до номеров строк и GOSUB’ов.

К самому QBasic’у было несколько игр, прямо в дистрибутиве MS-DOS’а. Всё это, в теории, может вызвать проблемы с авторскими правами. С другой стороны, может во FreeDOS’е есть что-то полезное по Бейсику. Давно в нём не копался.

Да, Стартрек это классика. Но все это в железо HW 1.0 не влезет, с его экраном 20x4.
Надо что-то калькуляторно-мелкое.

Поищи вот такую книгу:
https://en.wikipedia.org/wiki/BASIC_Computer_Games

Она выдержала много изданий, программы оттуда переводили на более современные Бейсики и другие языки. Вот первая попавшаяся ссылка из этой статьи на Википедии:
https://www.atariarchives.org/basicgames/

В этой книге много игр, причём именно для такого антикварного чуда с номерами строк. А вот и pdf’ку нагуглил:
https://annarchive.com/files/Basic_Computer_Games_Microcomputer_Edition.pdf

Качнул PDF-ку. Будет интересно что-то набить из этого

Есть ещё отечественные книги по Бейсику. Более 300 прикладных программ на Бейсике эпохи нумерованных строк, видимо как развитие справочника по ПМК, есть в:

Дьяконов В. П. Справочник по алгоритмам и программам на языке бейсик для персональных ЭВМ: Справочник. — М.: Наука. Гл. ред. физ.-мат. лит., 1987. — 240 с., тираж 300 000 экз., ББК 22.18 Д93 УДК 519.6(083), ИБ № 32350, Д 1702070000—126 / 053(02)-87 48-87

Да, профессор последовательно писал «бейсик» с маленькой буквы.

В той ПДФ-ке, похоже, нашлась игра, которая влезает в экран 20х4 :)

awari

Что в данном случае делает оператор DATA в строке 10?
data

Помогает обнулить N в строке 15. Но может и ещё что-то значить, в зависимости от остального текста программы.

Ну, и в stm32basic нет пока DATA оператора.

Запустил в PC-Basic:

10 DATA 4,6                                                                     
20 READ N,X1                                                                    
30 PRINT N,X1                                                                   
Ok                                                                              
RUN                                                                             
 4             6                                                                
Ok  

Добавил в Backlog-список:

[ ] BASIC: add DATA, READ operators

Можно переписать программу без DATA, это всего лишь оператор присваивания. Можно эмулировать READ, считывая значения DATA из большого массива. Но самое интересное, это как операторы READ, DATA и RESTORE развивались и какие они сейчас. Вот здесь описание READ, DATA и RESTORE в SB4, на английском:

https://sup4.smilebasic.com/en/doku.php?id=reference:Other

Самое мощное там почти не упоминается. Сейчас READ может считать из DATA целый массив. Очень удобно для инициализации массивов. Но в «Калахе» наверняка всё проще.

Но цель в stm32basic - быть как можно ближе к "классикам", чтобы можно было старые программы переносить без переделки.
Спасибо за ссылку, отличный reference

В классике были только RESTORE и RESTORE с номером строки. Номер строки был числом, вычислять его было нельзя. Никаких RESTORE PUSH/POP. Никаких меток, слотов и совместно исполняющихся программ.

Для инициализации массива из DATA приходилось писать цикл.

Еше то удовольствие продираться через BASIC в наше время.
И еще там похоже баги.
Вот кто может сказать, глядя в листинг игры AWARI, где в строке 230 должен находиться оператор NEXT I? В листинге его нет. PC-BASIC ругается на строку 230

Это не баги, а очень извращённый код. Видимо, ради оптимизации в условиях крайне ограниченных ресурсов. Строку 235 можно заменить на NEXT I:RETURN

Конечно, если PC-BASIC не позволяет выход из цикла с помощью RETURN, строку 230 надо будет переписать чуть похитрей. Можно вообще раскрыть FOR…NEXT (в том числе в строках 215-220) с помощью двух присваиваний, сравнения и условного перехода.

Возможно, PC-BASIC ещё корёжит от того, что новый цикл по переменной I начинается без явного завершения предыдущего цикла по той же переменной. Неявный GOTO в строке 215 аварийно выходит из предыдущего цикла. Хорошим стилем программирования всё это не назовёшь, но в те дикие времена все строили из себя суперменов и как только не извращались.

По нынешним меркам страшно представить, что в то время так писали и промышленные вещи.

С заменой строки 235 программа заработала, но ход игры отличается от тестового примера из книги. Вот первые два шага из книги:
Awari 2 steps

А вот первые два шага в PC-BASIC:

load "AWARI2"
Ok 
run
                                 AWARI
              CREATIVE COMPUTING MORRISTOWN, NEW JERSEY
 
 
 
      3   3   3   3   3   3 
  0                           0 
      3   3   3   3   3   3 
 
YOUR MOVE? 5
 
      3   3   3   3   3   4 
  0                           1 
      3   3   3   3   0   4 
 
MY MOVE IS 6
      0   3   3   3   3   4 
  1                           1 
      4   4   3   3   0   4 

Если у кого есть желание понять, что за ерунда происходит, то вот текст AWARI2.BAS, скопипастить в текстовый файл с таким же именем, и можно загружать в PC-BASIC:

2 REM AWARI_2
5 PRINT TAB(34);"AWARI"
7 PRINT TAB(15);"CREATIVE COMPUTING MORRISTOWN, NEW JERSEY"
10 DATA 0
15 DIM B(13),G(13),F(50):READ N
20 PRINT:PRINT:E=0
25 FOR I=0 TO 12:B(I)=3:NEXT I
30 C=0:F(N)=0:B(13)=0:B(6)=0
35 GOSUB 500
40 PRINT "YOUR MOVE";:GOSUB 110
45 IF E=0 THEN 80
50 IF M=H THEN GOSUB 100
55 IF E=0 THEN 80
60 PRINT "MY MOVE IS ";:GOSUB 800
65 IF E=0 THEN 80
70 IF M=H THEN PRINT ",";:GOSUB 800
75 IF E>0 THEN 35
80 PRINT:PRINT "GAME OVER"
85 D=B(6)-B(13):IF D<0 THEN PRINT "I WIN BY";-D;"POINTS":GOTO 20
90 N=N+1:IF D=0 THEN PRINT "DRAWN GAME":GOTO 20
95 PRINT "YOU WIN BY";D;"POINTS":GOTO 20
100 PRINT "AGAIN";
110 INPUT M:IF M<7 THEN IF M>0 THEN M=M-1:GOTO 130
120 PRINT "ILLEGAL MOVE": GOTO 100
130 IF B(M)=0 THEN 120
140 H=6:GOSUB 200
150 GOTO 500
200 K=M:GOSUB 600
205 E=0:IF K>6 THEN K=K-7
210 C=C+1:IF C<9 THEN F(N)=F(N)*6+K
215 FOR I=0 TO 5:IF B(I)<>0 THEN 230
220 NEXT I
225 RETURN
230 FOR I=7 TO 12:IF B(I)<>0 THEN E=1:RETURN
235 NEXT I:RETURN
500 PRINT:PRINT "    ";
505 FOR I=12 TO 7 STEP -1:GOSUB 580
510 NEXT I
515 PRINT:I=13:GOSUB 580
520 PRINT "                         ";:PRINT B(6):PRINT "    ";
525 FOR I=0 TO 5:GOSUB 580
530 NEXT I
535 PRINT:PRINT:RETURN
580 IF B(I)<10 THEN PRINT " ";
585 PRINT B(I);:RETURN
600 P=B(M):B(M)=0
605 FOR P=P TO 1 STEP -1
606 M=M+1:IF M>13 THEN M=M-14
610 B(M)=B(M)+1:NEXT P
615 IF B(M)=1 THEN IF M<>6 THEN IF M<>13 THEN IF B(12-M)<>0 THEN 625
620 RETURN
625 B(H)=B(H)+B(12-M)+1:B(M)=0:B(12-M)=0:RETURN
800 D=-99:H=13
805 FOR I=0 TO 13:G(I)=B(I):NEXT I
810 FOR J=7 TO 12:IF B(J)=0 THEN 885
815 G=0:M=J:GOSUB 600
820 FOR I=0 TO 5:IF B(I)=0 THEN 845
825 L=B(I)+I:R=0
830 IF L>13 THEN L=L-14:R=1:GOTO 830
835 IF B(L)=0 THEN IF L<>6 THEN IF L<>13 THEN R=B(12-L)+R
840 IF R>Q THEN Q=R
845 NEXT I
850  Q=B(13)-B(6)-Q:IF C>B THEN 875
855 K=J:IF K>6 THEN K=K-7
860 FOR I=0 TO N-1:IF F(N)*6+K=INT(F(I)/6^(7-C)+.1) THEN Q=Q-2
870 NEXT I
875 FOR I=0 TO 13:B(I)=G(I):NEXT I
880 IF 0>=D THEN A=J:D=Q
885 NEXT J
890 M=A:PRINT CHR$(42+M);:GOTO 200
900 FOR I=0 TO N-1:PRINT B(I):NEXT I
999 END

В начале строки 850 лишний пробел. В строке 7 после COMPUTING два пробела. В строке 500 в кавычках 3 пробела, а не 4. В строке 520 в первом PRINT два лишних пробела.

В строке 880, на мой взгляд, всёж Q>=D.

880я строка, конечно же, косяк! Теперь тестовый пример прошел:
awari test passed

Спасибо! Есть работающая игра для портирования на stm32basic HW 1.0
Правда, она особо никому не нужна, так как автор почему-то в качестве примера опубликовал выигрышный вариант прохождения :D

P.S. Обнаружил, что в stm32basic нет экспоненциального оператора "^", надо добавить, чтобы руками не писать возведение в степень.

На Гитхабе нашлась неплохая коллекция софта для PC-BASIC-а.

Например, подраздел Sky And Telescope.

stm32basic HW 2.0, подключение дисплея 320x240 через шину SPI:
stm32basic HW 2.02

Далее ожидается I2C клавиатура с алиэкспресса

Платы на данном контроллере:

Отладочная плата на базе нового высокопроизводительного двухъядерного 32-бит микроконтроллера STM32H745 c ядром ARM Cortex-M7 работающим на частоте до 480 МГц и ядром Cortex-M4 с частотой до 240 МГц. Оба ядра имеют модуль с плавающей запятой (FPU), который поддерживает операции ARM одинарной и двойной точности (ядро Cortex-M7) и преобразования (совместимость с IEEE 754), включая полный набор инструкций DSP и блок защиты памяти (MPU) для повышения безопасности приложений.

Например в "Чип и Дип"
https://www.chipdip.ru/product/nucleo-h745zi-q-stm

или на Ali https://www.aliexpress.com/item/4000835323680.html

P.S. Думаю, что для Semico данное железо за пределами сохранения "непорочности" их синусов в МК-161 :)

но пока немножко перебор как по цене (35 евро), так и по мощности.

Я остановился на следующем железе:

  • STM32F103RET6 (72 МГц, 64К ОЗУ, 512 К флэш)
  • ILI9341 SPI TFT 320x240 (он на фото выше, с работающим тестом)
  • I2C клавиатура от M5STACK

hw 2.0

Я думаю, весь комплект будет дешевле той платы на STM32H745.

В новом чипе побольше памяти для BASIC-а:
basic HW 2.0