|
nedoPC.orgCommunity for electronics hobbyists, established in 2002 |
|
[SDK] Старая тема про nedoPC SDK (август 2004)
Author |
Message |
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 23469 Location: Silicon Valley
|
Список поддерживаемых на данный момент процессоров и компов:
- i8080 - ассембер rasm, системы RADIO, ORION, SPEC (Специалист), SPECCY (Спектрум с магнитофоном - TAP) и NULL (для либ);
- z80 - ассемблер zmac, системы SPECCY (Спектрум с дисководом - TRD), SPRINTER и NULL (для либ);
- m68k - есть очень поверхностные наработки с тех времён, когда я экспериментировал с PALM (никогда не релизилось).
Во-первых, надо переименовать SPEC в SPETS (специалист), а также разделить SPRINTER на SPRINT (текстовый режим) и SPRING (графический режим), ну и может NULL переименовать скажем в LIB, чтобы было понятнее.
Во-вторых, надо добавить процессор i8086 и две системы - текстовый дос (скажем PCTXT) и графический дос (скажем PCEGA).
В-третьих, надо добавить микроконтроллеры pic12, pic16, pic17 и, возможно микропроцессор 6502...
В-четвёртых, поддержать 4-битную систему Лавра и т.д.
Last edited by Shaos on 20 Nov 2014 08:37, edited 4 times in total.
|
19 Nov 2014 20:15 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 23469 Location: Silicon Valley
|
| | | | Shaos wrote: P.P.S. Немного истории (добавлено 19 ноября 2014 года): 28.04.2001 RW1P2 v1.0 (орион, спектрум) 15.05.2001 RW1P2 v1.1 (орион, спектрум) 16.01.2002 RW1P2 v1.2 (орион, спектрум, рк86) 18.01.2002 RW1P2 v1.2.1 (орион, спектрум, рк86) 20.01.2002 RW1P2 v1.3 (орион, спектрум, рк86, специалист) 12.06.2002 RW1P2 v1.4 (орион, спектрум, рк86, специалист + z80 спектрум и z80 спринтер + Linux порт) 26.04.2003 RW1P2 v1.5 beta aka Sprinter SDK (только z80 спринтер, только под Windows)... | | | | |
Выдержка из README от RW1P2 версии 1.4:
|
19 Nov 2014 21:54 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 23469 Location: Silicon Valley
|
Наверное надо ограничиться двумя платформами - DOS и LINUX (точнее исхода будут собираемыми в любой *NIX-системе включая MacOS X)
|
14 Jun 2016 06:44 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 23469 Location: Silicon Valley
|
Итак, в прошлом году я принял решение переименовать язык RW1 в Robby (см. http://www.nedopc.org/forum/viewtopic.php?f=46&t=11565) поэтому в nedoPC SDK будет так: rw1c -> robbyc (Robby Compiler) rw0comp -> robbycc (Robby Cross Compiler) *.RW1 -> *.R (исходник на языке Robby) *.RW0 -> *.RO (скомпилированный байткод Robby) *.RWI -> INC/*.R (Robby макросы для включения в исходники программ на языке Robby до функции main) *.RWL -> LIB/*.R (Robby библиотеки для включения в исходники программ на языке Robby после функции main) *.A -> *.A (исходники и промежуточный код для RoboAssembler) shjob -> nedo (думал сначала переименовать в nedomake, но потом подумалось, что это всё-таки не make) *.shj -> *.ne (скрипты для сборки недопроектов) ну и виртуальная машина будет называться RobbyVM (а исполняемый файл интерпретатора байткода наверное таки будет называться просто robby): http://www.nedopc.org/forum/viewtopic.php?f=46&t=11565P.S. Как я и писал выше, пока предполагается работа nedoPC SDK только на двух платформах - консольный Linux (в виде исходников собери сам) и 16-битный DOS (бинарный дистрибутив), а потом может и ShaOS подтянется
|
14 Feb 2017 18:29 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 23469 Location: Silicon Valley
|
Планирую создать репу nedoPC SDK на гитхабе - соберу туда всё, что актуально с SourceForge, а также из незарелизенного RW1P2/SprinterSDK...
|
12 Apr 2018 19:10 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 23469 Location: Silicon Valley
|
Заявил прожэкт на Hackaday: https://hackaday.io/project/158426-nedopc-sdkМожет это сильнее подтолкнёт меня к завершению начатого в 2001 году...
|
18 May 2018 18:22 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 23469 Location: Silicon Valley
|
Нашёл способ импортировать исходники из CVS (SourceForge) в GitHub со ВСЕЙ историей изменений! Кроме того накидал все версии RW1P2 - теперь можно отследить как оно менялось со временем...
|
19 May 2018 22:48 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 23469 Location: Silicon Valley
|
| | | | Shaos wrote: Итак, в прошлом году я принял решение переименовать язык RW1 в Robby (см. http://www.nedopc.org/forum/viewtopic.php?f=46&t=11565) поэтому в nedoPC SDK будет так: rw1c -> robbyc (Robby Compiler) rw0comp -> robbycc (Robby Cross Compiler) *.RW1 -> *.R (исходник на языке Robby) *.RW0 -> *.RO (скомпилированный байткод Robby) *.RWI -> INC/*.R (Robby макросы для включения в исходники программ на языке Robby до функции main) *.RWL -> LIB/*.R (Robby библиотеки для включения в исходники программ на языке Robby после функции main) *.A -> *.A (исходники и промежуточный код для RoboAssembler) shjob -> nedo (думал сначала переименовать в nedomake, но потом подумалось, что это всё-таки не make) *.shj -> *.ne (скрипты для сборки недопроектов) ну и виртуальная машина будет называться RobbyVM (а исполняемый файл интерпретатора байткода наверное таки будет называться просто robby): http://www.nedopc.org/forum/viewtopic.php?f=46&t=11565P.S. Как я и писал выше, пока предполагается работа nedoPC SDK только на двух платформах - консольный Linux (в виде исходников собери сам) и 16-битный DOS (бинарный дистрибутив), а потом может и ShaOS подтянется | | | | |
Первая часть задачи выполнена - RW1C переименован в ROBBYC https://gitlab.com/nedopc/sdk/-/tree/master/robbyc (живёт на гитлабе с июня 2018)P.S. и оно даже работает P.P.S. Вижу что в nedo (бывший shjob) надо бы сделать условное выполнение (чтобы иметь один файл на все платформы, а не как сейчас - для каждой платформы свой файл), а также засунуть команды addbin (склеивание бинарей) и leadzero (убирание нулевой области из начала бинарного файла) - только назвать их соответственно \glue и \ltrim (а также за компанию сделать \rtrim) P.P.P.S. Например аргументы скрипта могут использоваться как ${1}, ${2} и т.д. Добавляем команду \if которая может проверять наличие переменных и сравнивать строки (а также \elif, \else и \endif), например: \if ${1} $mach=${1} \else $mach=ORION \endif \if $mach==ORION ... \endif для сравнения строк ещё можно != поддержать (не равно) а в случае <,>,<=,>= можно переводить строковые значения в числа и сравнивать их как числа... P.S. более сложные условия поди тоже надо поддержать - типа && и II, хотя это всё можно сымитировать многочисленными ифами с дополнительными переменными... P.P.S. или таки оставить название утилиты shjob?... P.P.P.S. хотя ладно - пусть будет nedoкстати вместо аргументов командной строки можно диалоговый режим устроить - сначала вывести варианты через новую команду печати на экране: \say 1.ORION \say 2.SPETSIALIST \say 3.ZX-SPECTRUM а потом вызвать новую команду, ожидающую нажатия на кнопку: \wait $user \if $user==1 и т.д.
|
20 May 2018 10:39 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 23469 Location: Silicon Valley
|
А теперь немного о том, как устроен 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++ после // и далее файл поделён на секции, разделяемые звёздочками - слова после звёздочки дают секции название (а звёздочка без названия просто закрывает предыдущую секцию). Наиболее часто встречаемые секции - это правила трансляции байткода - когда после звёздочки следует шестнадцатиричное число, например: Здесь можно видеть 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: P.P.S. По большому счёту с помощью такой системы правил можно транслировать не только ROBBY-байткод во что-то, но и вообще что угодно во что угодно (при необходимости добавляя новые спец-идентификаторы и спец-коды в транслятор), например из кода 8080 в PDP-11 и т.д.
|
22 May 2018 20:43 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 23469 Location: Silicon Valley
|
Обана - оказывается про RW1P2 писали в книжке 2009 года Вот собственно упоминание: P.S. 536-я ссылка это оказывается не мой сайт, а какие-то 2 левых сайта, в данный момент уже несуществующих... P.P.S. Первая ссылка нашлась в вебархиве 2009 года - и это оказалась... страничка этой же самой книжки
|
22 May 2018 21:34 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 23469 Location: Silicon Valley
|
В данный момент то, что генерится на выходе SDK, может работать только из ОЗУ т.к. представляет из себя мешанину из кода и данных - надо бы вынести все данные библиотек в область "регистров" (однобуквенных переменных), чтобы была возможность пускаться из ПЗУ (для того же nedoPC-85 например или внешнего картриджа для ZX-Spectrum). Кроме того надо бы ещё платформы побить на более мелкие вещи - чтобы например можно было собираться для работы с ZX-ПЗУ (когда печать идёт через встроенные команды) либо для работы из внешнего ПЗУ, который полностью подменяет спектрум-бейсик...
|
24 May 2018 20:35 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 23469 Location: Silicon Valley
|
Интересная картина наблюдается, если посмотреть мою гитхабовскую активность начиная с 2010 года - Bipolar Disorder в действии
|
25 May 2018 17:20 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 23469 Location: Silicon Valley
|
Вот пример с циклами: и вот во что они превращаются после препроцессора: после компиляции в байткод: и после кросс-копиляции в код 8080: | | | | Code: \ Generated by RW0COMP v2.0 (part of NedoPC SDK, see http://www.nedopc.org) \ Copyright (c) 2001-2005, Alexander Shabarshin <shaos@mail.ru>
ORG #0000 @BASE EQU #4000 @REGS EQU 16448 @REG_X EQU 16448 @REG_Y EQU 16450 \REG_D @REG_N EQU 16454 \REG_K @REG_R EQU 16458 @REG_T EQU 16460 \REG_E \REG_M \REG_I @REG_A EQU 16468 @REG_B EQU 16470 @REG_C EQU 16472 \REG_P @REG_L EQU 16476 \REG_S @RAND EQU 1000 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 \ ERASE FROM BASE TO REGS+32 LHLD _L_BASE XCHG LHLD _L_REGS LXI_B, 32 DAD_B XCHG MVI_C, 0 _STD_1: MOV_M,C INX_H MOV_A,H CMP_D JNZ _STD_1 MOV_A,L CMP_E JNZ _STD_1 \ SET SP & SAVE RETADDR POP_D LHLD _L_STAK SPHL PUSH_D _START: \ *0x20 0x01 0x0A 0xFF %m2 _j0000: LXI_H, #0000 SHLD @REG_A \ *0x40 _j0007: \ 0xF5 PUSH_H LXI_H, #FF0E \ 0xF5 PUSH_H LXI_H, #FF0A \ 0xF3 MVI_A, #FF CMP_H JNZ _l0001 \ REGISTER CALL _R_GET JMP _l0002 _l0001: NOP \ VARIABLE CALL _B_GET _l0002: NOP \ 0xF5 PUSH_H LXI_H, #0014 \ 0x93 POP_D CALL CCLT \ 0xF4 POP_D XCHG MVI_A, #FF CMP_H JNZ _l0003 \ REGISTER CALL _R_SET JMP _l0004 _l0003: NOP \ VARIABLE CALL _B_SET _l0004: NOP POP_H \ *0x42 0x01 0x0E 0xFF 0x00 %w1 _j0015: LDA @REG_L ORA_A JZ _j006A \ *0x20 0x01 0x0B 0xFF %m2 _j001C: LXI_H, #0000 SHLD @REG_B \ *0x40 _j0023: \ 0xF5 PUSH_H LXI_H, #FF0E \ 0xF5 PUSH_H LXI_H, #FF0B \ 0xF3 MVI_A, #FF CMP_H JNZ _l0005 \ REGISTER CALL _R_GET JMP _l0006 _l0005: NOP \ VARIABLE CALL _B_GET _l0006: NOP \ 0xF5 PUSH_H LXI_H, #000A \ 0x93 POP_D CALL CCLT \ 0xF4 POP_D XCHG MVI_A, #FF CMP_H JNZ _l0007 \ REGISTER CALL _R_SET JMP _l0008 _l0007: NOP \ VARIABLE CALL _B_SET _l0008: NOP POP_H \ *0x42 0x01 0x0E 0xFF 0x00 %w1 _j0031: LDA @REG_L ORA_A JZ _j0058 \ *0x69 %m1 %m2 _j0038: LXI_H, #000A CALL _R_GET PUSH_H LXI_H, #000B CALL _R_GET POP_D MOV_A,E STA _CURX MOV_A,L STA _CURY \ *0x6A 0x00 %w1 0x00 0x00 0x00 _j003F: LXI_H, #2000 CALL _SET \ *0x40 _j0046: \ 0xF5 PUSH_H LXI_H, #FF0B \ 0xF5 PUSH_H LXI_H, #FF0B \ 0xF3 MVI_A, #FF CMP_H JNZ _l0009 \ REGISTER CALL _R_GET JMP _l0010 _l0009: NOP \ VARIABLE CALL _B_GET _l0010: NOP \ 0xF5 PUSH_H LXI_H, #0001 \ 0xA0 POP_D DAD_D \ 0xF4 POP_D XCHG MVI_A, #FF CMP_H JNZ _l0011 \ REGISTER CALL _R_SET JMP _l0012 _l0011: NOP \ VARIABLE CALL _B_SET _l0012: NOP POP_H \ *0x43 0x00 %w1 _j0054: JMP _j0023 \ *0x40 _j0058: \ 0xF5 PUSH_H LXI_H, #FF0A \ 0xF5 PUSH_H LXI_H, #FF0A \ 0xF3 MVI_A, #FF CMP_H JNZ _l0013 \ REGISTER CALL _R_GET JMP _l0014 _l0013: NOP \ VARIABLE CALL _B_GET _l0014: NOP \ 0xF5 PUSH_H LXI_H, #0001 \ 0xA0 POP_D DAD_D \ 0xF4 POP_D XCHG MVI_A, #FF CMP_H JNZ _l0015 \ REGISTER CALL _R_SET JMP _l0016 _l0015: NOP \ VARIABLE CALL _B_SET _l0016: NOP POP_H \ *0x43 0x00 %w1 _j0066: JMP _j0007 \ *0x00 _j006A: \ NOP is empty operation \ *0xFF _j006B: +./LIB/I8080/ORION +./LIB/I8080/_CLIB +./LIB/I8080/_VARS +./LIB/I8080/_PLATF2 +./LIB/I8080/NULL_
| | | | |
путём добавления более оптимального кода для A=0, B=0, C=0, A<N, A=A+1 и т.д. в __RULES можно сделать более опитимальное представление этого кода для 8080 (и соответственно более быстрое) P.S. про то как выглядит цикл на SmallC (правда один цикл, а не два вложенных), можно у нас почитать вот тут
|
30 May 2018 17:58 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 23469 Location: Silicon Valley
|
NOP-ы после меток в нагенерённом коде выше из-за того, что это я так в данный момент пытаюсь обойти только что обнаруженную багу в моём старом добром робоассемблере RASM - если после метки стоит комментарий, то метка почему-то исчезает, а во все места её использования подставляются нули...
|
31 May 2018 01:28 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 23469 Location: Silicon Valley
|
|
03 Jun 2018 18:10 |
|
|
Who is online |
Users browsing this forum: Google [Bot] and 1 guest |
|
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
|
|