nedoPC.org

Electronics hobbyists community established in 2002
Atom Feed | View unanswered posts | View active topics It is currently 28 Mar 2024 13:48



Reply to topic  [ 48 posts ]  Go to page Previous  1, 2, 3, 4
nedoPC SDK 
Author Message
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22412
Location: Silicon Valley
Reply with quote
Через 19 лет "Virtual TR-DOS" обнаружил мой Тетрис 2002 года, переписанный с GPL-ного сишного на RW1 :)

Quote:
- Just another Tetris RW1 от Shaos'а. Ну Тетрис и Тетрис, минималистичный. Но! Есть версия для Спринтера :)
https://vtrd.in/

Там даже TRD можно в онлайне поиграть :rotate:

Забыли написать правда, что это GPL-ный софт и есть исходники :)

Надо реанимировать nedoPC SDK, чтобы этот Тетрис там снова собирался :mrgreen:

_________________
:dj: https://mastodon.social/@Shaos


08 May 2021 17:48
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22412
Location: Silicon Valley
Reply with quote
Shaos wrote:
А теперь немного о том, как устроен nedoPC SDK (точнее его дедушка RW1P2):
- на верхнем уровне есть 2 каталога - INC и LIB:
-- в INC находятся инклудники с константами для языка роботов (инклудятся до функции main)
-- в LIB находятся инклудники с описанием функций для языка роботов (инклудятся после функции main), а также подкаталоги с названием процессоров (сейчас только I8080 и Z80), в каждом из которых есть:
--- файл __RULES с описанием правил трансляции байткода роботов в ассемблер выбранного процессора
--- файлы подсистем на ассемблере для выбранного процессора как _SAY.A, _CLIB.A и т.д.
--- файлы основных системо-зависимых ассемблерных подпрограмм для всех поддерживаемых систем с выбранным процессором (например RADIO.A, ORION.A и т.д.)
--- опциональные подкаталоги с именами поддерживаемых систем, где могут лежать дополнительные файлы (заголовки бинарных файлов типа EXE, заглушки для TAP и т.д.)

Наибольший интерес вызывает файл __RULES: https://gitlab.com/nedopc/sdk/-/blob/master/sdk/LIB/I8080/__RULES (живёт на гитлабе с июня 2018)
Комментарии в нём идут как в C++ после // и далее файл поделён на секции, разделяемые звёздочками - слова после звёздочки дают секции название (а звёздочка без названия просто закрывает предыдущую секцию). Наиболее часто встречаемые секции - это правила трансляции байткода - когда после звёздочки следует шестнадцатиричное число, например:
Code:
// 0x68 M // COLOR varn // set current color
*0x68 0x00 %w1
        MVI_A, %w1
        STA    _COLOR
*0x68 %m1
#mem1
        MOV_A,L
        STA    _COLOR
*

Здесь можно видеть 2 секции - обе относятся к трансляции байткода 0x68 (COLOR), но первая секция более детальная, а вторая - более общая (общая секция сработает, если ни одна детальная не прошла проверку - точнее секции вычитываются одна за другой и срабатывает первая, которая подошла, поэтому более общие секции надо ставить после детальных). Спец-идентификаторы %wN (где N - порядковый номер) означают 2-байтовое слово, %mN означают переменную языка Robby (может занимать от 2 до 5 байт), ещё бывают %aN для адресов и %bN для байтов. Они далее используются прямо как есть (MVI_A, %w1) либо путём вставки спец-кода для расшифровки переменных языка Robby - #memN где N это порядковый номер переменной, соответствующий %mN. С решётки начинаются и другие спец-коды (не только #memN) - ещё бывают #addsub (для указания кросс-компилятору какие файлы с подпрограммами нужно инклудить в результирующий исходик), #error (для прекращения работы кросс-компилятора с рапортованием ошибки), #genlab (для генерации временных меток в месте вставки кода) и т.д.

Кроме того секции выделяемые звёздочками могут быть специальными - например секция *ASM TABLE предназначена для скармливания ассемблеру RASM в качестве таблицы трансляции, *COMMENT указывает, что используется в качестве отделителя комментария в выбранном ассемблере, *EXPR 0x?? используется для трансляции байткодов стековой машины (скомпилированные длинные выражения) и т.д.

Вобщем вот как-то так...

P.S. Оказывается у меня есть нереализованные спец-коды, например передача управления по адресу из массива #atable:
Code:
//-0x43 M      // GOTO var
*0x43 0x00 %w1
        JMP %j1
*0x43 %m1
#mem1
#atable
   PCHL
*

//-0x44 M      // CALL var
*0x44 0x00 %w1
        CALL %j1
*0x44 %m1
#genlab %l2
   LXI_H,   %l2
   PUSH_H
#mem1
#atable
   PCHL
%l2
*


P.P.S. По большому счёту с помощью такой системы правил можно транслировать не только ROBBY-байткод во что-то, но и вообще что угодно во что угодно (при необходимости добавляя новые спец-идентификаторы и спец-коды в транслятор), например из кода 8080 в PDP-11 и т.д.

Когда 5 лет назад делал это описание __RULES, то забыл написать про секцию *BEGIN - это то, что всегда копируется в начало генерируемого ассемблерного текстового файла - там например заведены области системных переменных, в которых в частности хранятся адреса начала областей памяти программы на Robby, регистров Robby и стэка, а также инициализирующий код:
Code:
        JMP     HEADER
        \ DATA
_L_BASE DW  @BASE
_L_REGS DW  @REGS
_L_STAK DW  @REGS
CHX     DB  0
CHY     DB  0
CHS     DB  4
CHB     DB  0
_NPLANE DW  0
_ANGLE  DB  0
_COLOR  DB  0
_CURX   DB  0
_CURY   DB  0
_SAYX   DB  0
_SAYY   DB  0
_SAYC   DB  2
_ATRS   DB  0
HEADER: \ INIT SYSTEM
        CALL    INIT
        \ SET _SAYX & _SAYY
        XRA_A
        STA     _SAYX
        MVI_A,  @DY
        DCR_A
        STA     _SAYY
...

Адрес начала области регистров может быть использован скажем для обмена данными между программой на языке Robby и ассемблерной вставкой - скажем через регистр A (смещённый от начала блока регистров на 20 байтов):
Code:
 ...
 for(A=0;A<32767;A++) // 9.4 sec (3486 циклов в секунду)
 {
   say "\! LHLD _L_REGS"
   say "\! LXI_B, 20"
   say "\! DAD_B"
   say "\! MOV_A,M" // считываем младший байт регистра A
   say "\! OUT #FE" // выводим его значение в бордюр
 }
 say "\! MVI_A, 2"
 say "\! OUT #FE" // выводим в бордюр 2
 say "\! CALL #9000" // вызываем кодовый блок, который компилировался отдельно
 ...

(надо будет вместо трюка say "\! ..." добавить поддержу команды asm "...")


Attachments:
FONTS_2.png
FONTS_2.png [ 2.01 KiB | Viewed 4238 times ]

_________________
:dj: https://mastodon.social/@Shaos
23 Jan 2023 00:23
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22412
Location: Silicon Valley
Reply with quote
Научился делать CI/CD на GitLab - это когда на каждый коммит сервером запускается специальный скрипт, который компилирует и запускает тесты:
https://gitlab.com/nedopc/sdk/-/blob/master/.gitlab-ci.yml
Пока начал с RASM в котором запускаются давно существующие 2 теста - для 8080 и для 8086 - вот например содержимое файла TEST86:
Code:
../rasm TEST86.A -t../i8086.tab
cp TEST86.BIN TEST86.COM
rm TEST86.BIN
md5sum -c TEST86.MD5
в TEST86.MD5 сидит строка с хэшом бинаря, который должен получиться:
Code:
e0431b180b92f24627bd3547dfe61672  TEST86.COM
если файл не сассэмблируется или хэш не сойдётся, то задача CI/CD зафейлится, заставив гитлаб послать емейл

ну и плюс ещё индикатор на первой странице репозитория есть для последнего коммита - типа зелёный кружочек это SUCCESS, а красный - FAILURE:


Attachments:
Screenshot from 2023-09-05 23-34-06.png
Screenshot from 2023-09-05 23-34-06.png [ 51.5 KiB | Viewed 3628 times ]

_________________
:dj: https://mastodon.social/@Shaos
05 Sep 2023 23:32
Profile WWW
Display posts from previous:  Sort by  
Reply to topic   [ 48 posts ]  Go to page Previous  1, 2, 3, 4

Who is online

Users browsing this forum: No registered users and 25 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.