Важная информация

User Tag List

Страница 91 из 91 ПерваяПервая ... 8788899091
Показано с 901 по 907 из 907

Тема: Мощная среда ZXDev для разработки НА ПЯТИ ЯЗЫКАХ для ZX готова к тестированию

  1. #901
    Veteran Аватар для Oleg N. Cher
    Регистрация
    24.08.2007
    Адрес
    Днепропетровская обл.
    Сообщений
    1,609
    Спасибо Благодарностей отдано 
    2,173
    Спасибо Благодарностей получено 
    133
    Поблагодарили
    99 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Andrew771 Посмотреть сообщение
    Я всё стесняюсь спросить с 2012 года, а какие 5 языков (еще и большими буквами)? Оберон - раз, Си - как промежуточный, с натяжкой, два. А еще три какие?
    Почему это "Си с натяжкой как промежуточный"? Ты можешь использовать его в связке с Оберонами как полновесный язык. Можешь в модуль на Обероне вставлять куски кода на Си, подключать хидеры и внешние сишные файлы, делать сишные тела для отдельных процедур и т.д. То же самое про асм.

    Было: Оберон, Оберон-2, Си, асм. На момент создания темы я думал, что в SDCC ещё и поддержка C++ есть (которым сам не пользовался). Потом выяснилось, что нету, не поддерживается. Был введён в заблуждение исполняемым файлом sdcpp.exe, который оказался просто внешним препроцессором.

    Сейчас: Оберон (1990), Оберон-2, Оберон-3 (мой собственный диалект, адаптированный для 8- и 16-битной разработки), Оберон-07/16 (последняя виртовская редакция Оберона), Компонентный Паскаль, Си, асм.
    Включены некоторые расширения из GPCP и Дубовых требований. Планируются, но пока не реализованы расширения Oberon-X.

    Да, за эти десять лет было сделано дофига хорошей работы, чтобы сделать XDev более удобной для ретро-разработки.

    Цитата Сообщение от Andrew771 Посмотреть сообщение
    И, Олег, ты же можешь сделать кодогенерацию в какой-нибудь пи-код (java, например), чтоб из него потом на разные платформы раздавать. Почему не делаешь? Пи-код проще, чем ассемблер.
    Не предлагай мне свои пути, Андрей. Пи-код, не пи-код, асм, машкод - это твоя стезя. Юзать java для ZX хоть в каком-то смысле - такое себе. Ну вот тебе странного хочется, а мне давно уже нет. В чём вообще польза java? 32- и 64-битность. Все целые типы со знаком. Стековая машина, без регистров. Классы. Динамическая память. Ты в курсе, что java нельзя статически выделять хоть те же классы? Оно подходит для 8 бит как сова для натягивания на глобус.

    Если ты имел в виду "что-то типа java, но более скромное", это уже теплее. Но опять же, заморачиваться. Зачем? Кто оценит? Кому надо? Придут ещё и потопчутся по святому. Спасибо, но не надо. Может для себя я что-то такое когда-нибудь и запилю, но упаси господи пытаться угодить "сообществу".

  2. #901
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #902
    Guru Аватар для andrews
    Регистрация
    20.04.2006
    Адрес
    Санкт-Петербург
    Сообщений
    2,670
    Спасибо Благодарностей отдано 
    413
    Спасибо Благодарностей получено 
    192
    Поблагодарили
    170 сообщений
    Mentioned
    3 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Разве возможно перенести С-Lang(LLVM) на 8 битки? Или нужно делать другую виртуальную машину специально для 8-битных систем? А на ней тогда и С, и С++ и все остальное.

  4. #903
    Veteran Аватар для Oleg N. Cher
    Регистрация
    24.08.2007
    Адрес
    Днепропетровская обл.
    Сообщений
    1,609
    Спасибо Благодарностей отдано 
    2,173
    Спасибо Благодарностей получено 
    133
    Поблагодарили
    99 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от andrews Посмотреть сообщение
    Разве возможно перенести С-Lang(LLVM) на 8 битки?
    С-Lang(LLVM) не влезут Но если Вы имеете в виду "адаптировать для генерации кода для восьмибитных процев", то есть пример успешных бэк-эндов для Z80 и 6502 (неизвестной степени готовности и стабильности).

    Цитата Сообщение от andrews Посмотреть сообщение
    Или нужно делать другую виртуальную машину специально для 8-битных систем?
    Видимо, в ВМ нет особого смысла, т.к. это тормоза. А если подобную LLVM, заточенную чисто под оптимизацию, то сил сообщества не хватит сделать настолько сложную штуку. Тут хоть бы бэк-энды для готовой LLVM запилили. А то вот PDP-11 нет.

    Цитата Сообщение от andrews Посмотреть сообщение
    А на ней тогда и С, и С++ и все остальное.
    C и C++ не столь хорошо подходят для 8-битных процев. Надо смотреть в сторону C--, Cowgol и PL/M. Или сделать более сурово: чтобы по умолчанию размер арифметических операций был 8 бит, не разрешать рекурсию, ограничить разгул локальных переменных, и тогда можно уже смотреть в сторону Си, Модулы, Паскаля или Оберона. Но не знаю есть ли в этом высокий смысл.

    Я уже понял, что народу надо "шашечки". Им просто нравится идея генерации в машкод. При этом за бортом остаётся даже генерация в асм, т.е. подходы ZX Like Pascal, SDCC или даже Free Pascal.

    Если бы надо было "ехать", то ехали бы. XDev вполне хорошо и через Си работает.

  5. #904
    Guru Аватар для andrews
    Регистрация
    20.04.2006
    Адрес
    Санкт-Петербург
    Сообщений
    2,670
    Спасибо Благодарностей отдано 
    413
    Спасибо Благодарностей получено 
    192
    Поблагодарили
    170 сообщений
    Mentioned
    3 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Что тогда остается? Портировать игры на каждую платформу индивидуально? Да, понятно, что стек 8 битки поддерживают намного хуже, чем всякие хитрые манипуляции через регистры. А что такое байткод при "приземлении" на конкретную платформу? Он разве не может это делать с учетом проца? Выход ассемблера в расчете на какой-то ассемблер или группу ассемблеров? Если на группу, то действительно наверное лучше сразу код исполняемый
    и оптимизированный генерить. А то юзверю придется разбираться в особенностях разных ассемблеров, и мучится с выбором ключа.
    Цитата Сообщение от Oleg N. Cher Посмотреть сообщение
    Если бы надо было "ехать", то ехали бы
    ну если прежде не ехали, то не значит, что в будущем не поедут. Куда спешить? Возможно до конца "эры программистов" 20 лет, а возможно 200. XDev вполне можно использовать. Кому надо пусть оптимизирует выдаваемый С код. Кому не надо - пусть пишет хоть на Basic-е, хоть на asm-е, хоть на pl/m. Это смотря какие библиотеки есть. Самому все писать на asm-е (без использования биос-а или библиотек) очень непросто. Код надо структурировать и комментировать, иначе и сам спустя какое-то время не разберешься.
    Последний раз редактировалось andrews; 28.01.2024 в 19:25.

  6. Этот пользователь поблагодарил andrews за это полезное сообщение:

    Oleg N. Cher (29.01.2024)

  7. #905
    Guru
    Регистрация
    30.11.2015
    Адрес
    г. Самара
    Сообщений
    6,993
    Спасибо Благодарностей отдано 
    285
    Спасибо Благодарностей получено 
    631
    Поблагодарили
    531 сообщений
    Mentioned
    13 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от andrews Посмотреть сообщение
    Самому все писать на asm-е (без использования биос-а или библиотек) очень непросто.
    Смотря какие возможность заложены в ассемблер и смотря какая система команд.

    Цитата Сообщение от andrews Посмотреть сообщение
    Код надо структурировать и комментировать
    Да неужели? Проблема только в том, что существует большая группа программистов (не только на ретро-платформы), которым на это насрать - и им не поможет никакой вундерязык.

    - - - Добавлено - - -

    Цитата Сообщение от Oleg N. Cher Посмотреть сообщение
    Если бы надо было "ехать", то ехали бы
    Кому надо ехать - они едут. На любом языке, который сочли подходящим. Что бы им не толдычили "адепты" "правильных" языков.
    Пример из C# (причём тут, по сути, даже не возможности языка, а возможности реализации его окружения)
    Код:
      [Serializable]
      [Macro(".CILHD")]
      public class CILHeader
      {
        [Map(".CLCOD: .BLKB 1")] public byte             Code;    // HeaderCode
        [Map(".CLLEN: .BLKB 1")] public byte             Length;  // HeaderLength
        [Map(".CHTIM: .BLKW 2")] public DOS11Time        Time;
        [Map(".CHDAT: .BLKW 1")] public DOS11Date        Date;
        [Map(".CHBSZ: .BLKW 1")] public UInt16           BlockSize;
        [Map(".CHIMC: .BLKW 1")] public UInt16           ImageCount;
        [Map(".CHHSZ: .BLKW 1")] public UInt16           HeaderSize;
        [Map(".CHFS0: .BLKW 1")] public UInt16           FileSize0;
        [Map(".CHFS1: .BLKW 1")] public UInt16           FileSize1;
        [Map(".CHFS2: .BLKW 1")] public UInt16           FileSize2;
        [Map(".CHFS3: .BLKW 1")] public UInt16           FileSize3;
                                 public SmartArray<byte> RAWData;
                                 public COMD[]           COMDs;
    
        static CILHeader()
          => Helpers.StaticFieldsValueUpdater<CILHeader>();
    
        public CILHeader(IArray<byte> data, int baseOffset = 0)
          => this.OneWayMapper(data, baseOffset);
      }
    
      [Serializable]
      [Macro(".COMD")]
      public class COMD
      {
        [Map(".CLCOD: .BLKB 1")]                    public byte             Code;                // COMDCode
        [Map(".CLLEN: .BLKB 1")]                    public byte             Length;              // COMDLength
        [Map(".CDLA:  .BLKW 1")]                    public UInt16           ProgramLoadAddress;  // Program load address
        [Map(".CDPSZ: .BLKW 1")]                    public UInt16           ProgramSize;         // Program size in bytes
        [Map(".CDXFR: .BLKW 1")]                    public UInt16           XFRAddress;          // Program transfer address
        [Map(".CDODT: .BLKW 1")]                    public UInt16           ODTXFRAddress;       // ODT(debugger) transfer address
        [Map(".CDRBN: .BLKW 1")]                    public UInt16           RelativeBlockNumber; // Relative block# within the file
        [Map(".CDPNM: .BLKW 2", PDP11Type.Radix50)] public string           Name;                // RAD50 program name
        [Map(".CDIDN: .BLKW 2", PDP11Type.Radix50)] public string           Ident;               // RAD50 .IDENT of the program 
        [Map(".CDTIM: .BLKW 2")]                    public DOS11Time        Time;                // Program creation time, in ticks
        [Map(".CDDAT: .BLKW 1")]                    public DOS11Date        Date;                // Program creation date
                                                    public SmartArray<byte> RAWData;
    
        static COMD()
          => Helpers.StaticFieldsValueUpdater<COMD>();
    
        public COMD(IArray<byte> data, int baseOffset = 0)
          => this.OneWayMapper(data, baseOffset);
      }
    На вход - массив (сырых) байт, на выходе - вполне себе объекты. Причём OneWayMapper-у фиолетово - что за объект (какого класса) надо создать - всё берётся из описания класса. Причём размеры конкретного поля могут быть не фиксированы - и браться из другого поля этого или родительского объекта.
    И в этом вариант мне не надо писать парсер сырых байт под ещё один описанный класс объекта - всё делается ОДНОЙ строчкой
    Код:
        private static void CILImageDescription(SmartArray<byte> sarr)
        {
          cilHeader = new CILHeader(sarr);
    И при таком подходе на цепляние к моему дизассемблеру ещё одного формата файла мне поднадобилось пол дня - на описание классов и на разборки с тем - как же это всё таки в байтах хранится - ибо документации - кот наплакал и некоторые вещи были определены опытным путём.

    - - - Добавлено - - -

    А, да, для возможности создавать образы, в которых была бы одна из ФС операционок с PDP-11, понадобился мне двунаправленный маппинг. Ок, пример. Тут несколько замороченней описание класса, но я пока не разобрался, как в run-time создать прокси-класс-наследник, поэтому пока так. Может, как руки дойдут - переделаю.
    Код:
      [Serializable]
      [Macro(".DIEDF")] public class DirectoryEntry_S : BaseMappedClass                                // directory entry definition
      {
        [Map("E.STAT: .BLKW 1")]                    public F_ESTAT      Status
          { get => (F_ESTAT)this.GetValue(nameof(Status)); set => this.SetValue(nameof(Status), value); }        // entry status word
        [Map("E.NAME: .BLKW 3", PDP11Type.Radix50)] public string       FullName
          { get => (string)this.GetValue(nameof(FullName)); set => this.SetValue(nameof(FullName), value); }     // RAD50 file name and extension
        [Set(".=.-6")]
        [Map("E.FNAM: .BLKW 2", PDP11Type.Radix50)] public string       Name
          { get => (string)this.GetValue(nameof(Name)); set => this.SetValue(nameof(Name), value); }             // RAD50 file name
        [Map("E.FEXT: .BLKW 1", PDP11Type.Radix50)] public string       Extension
          { get => (string)this.GetValue(nameof(Extension)); set => this.SetValue(nameof(Extension), value); }   // RAD50 file extension
        [Map("E.LENG: .BLKW 1")]                    public RT11BlockNum FileSize
          { get => (RT11BlockNum)this.GetValue(nameof(FileSize)); set => this.SetValue(nameof(FileSize), value); }  // size of area described, in blocks
        [Map("E.TIME: .BLKW 1")]                    public TPDP11Word   Time
          { get => (TPDP11Word)this.GetValue(nameof(Time)); set => this.SetValue(nameof(Time), value); }         // time of file closing(seconds/3 since midnight) <fut>
        [Set(".=.-2")]
        [Map("E.USED: .BLKW 1")]                    public TPDP11Word   Used
        { get => (TPDP11Word)this.GetValue(nameof(Used)); set => this.SetValue(nameof(Used), value); }           // <res> if not TENT
        [Set(".=.-2")]
        [Map("E.CHAN: .BLKB 1")]                    public byte         Channel
          { get => (byte)this.GetValue(nameof(Channel)); set => this.SetValue(nameof(Channel), value); }         // channel number for tentative file
        [Map("E.JNUM: .BLKB 1")]                    public byte         JobNum
          { get => (byte)this.GetValue(nameof(JobNum)); set => this.SetValue(nameof(JobNum), value); }           // job number for tentative file
        [Map("E.DATE: .BLKW 1")]                    public RT11Date     Date
          { get => (RT11Date)this.GetValue(nameof(Date)); set => this.SetValue(nameof(Date), value); }           // creation date
        [Map("E.EXBT: .BLKB ?.DIHD/D.EXTR")]       public IArray<byte>  ExtraBytes
          { get => (IArray<byte>)this.GetValue(nameof(ExtraBytes)); set => this.SetValue(nameof(ExtraBytes), value); } // header extra bytes
        //[Map("E.ELEN:")] public static readonly TPDP11Word Length;  // basic entry len
    
        static DirectoryEntry_S()
          => Helpers.StaticFieldsValueUpdater<DirectoryEntry_S>();
    
        public DirectoryEntry_S(MappedToByteArray data, int baseOffset = 0)
          : base(data, baseOffset)
        {}
    
        public DirectoryEntry_S()
          => this.TwoWayMapper();
      }
    
    ...
          DirectoryEntry_S temp = new()
          {
              Status = F_ESTAT.E_EMPTY
            //, FullName = ""
            , Name = "TEST"
            , Extension = "TXT"
            , FileSize = 0
            , Time = 0
            , Used = 0
            , Channel = 0
            , JobNum = 0
            , Date = new(0)
          };
    В этом примере свойство ExtraBytes - массив переменной длины и его длина (если он вообще будет) берётся из другого поля родительского объекта. И при записе какого-либо поля объекта - моментальное изменение в байтовом массиве. Так что инициализация и наполнение ФС становится тривиальным делом.

  8. #906
    Veteran
    Регистрация
    29.12.2010
    Адрес
    Москва
    Сообщений
    1,858
    Спасибо Благодарностей отдано 
    131
    Спасибо Благодарностей получено 
    104
    Поблагодарили
    62 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от andrews Посмотреть сообщение
    А что такое байткод при "приземлении" на конкретную платформу? Он разве не может это делать с учетом проца? Выход ассемблера в расчете на какой-то ассемблер или группу ассемблеров? Если на группу, то действительно наверное лучше сразу код исполняемый
    и оптимизированный генерить. А то юзверю придется разбираться в особенностях разных ассемблеров, и мучится с выбором ключа.
    Может всё байт-код, о чем я Олегу и твержу. Я даже пробовал байт-код java в асм Z80 конвертить, нормально получается (на Дельфи писал намётки пост-процессора, с потоками java, как положено). И даже думал в ZX Like Pascal встроить. Только нужно времени много.

    Сейчас в ZX Like Pascal выдуманный мной пи-код, который внутри конвертится в асм. Описывал здесь

    - - - Добавлено - - -

    Цитата Сообщение от Oleg N. Cher Посмотреть сообщение
    Если ты имел в виду "что-то типа java, но более скромное", это уже теплее. Но опять же, заморачиваться. Зачем? Кто оценит? Кому надо? Придут ещё и потопчутся по святому. Спасибо, но не надо. Может для себя я что-то такое когда-нибудь и запилю, но упаси господи пытаться угодить "сообществу".
    Да, оно. Так и делай для себя, с прицелом на облегчение написания своих программ/игр.
    Последний раз редактировалось Andrew771; 28.01.2024 в 22:20.

  9. #907
    Veteran Аватар для Oleg N. Cher
    Регистрация
    24.08.2007
    Адрес
    Днепропетровская обл.
    Сообщений
    1,609
    Спасибо Благодарностей отдано 
    2,173
    Спасибо Благодарностей получено 
    133
    Поблагодарили
    99 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Любая сцепка фронт-энда и бэк-энда подразумевает промежуточный язык. Хотя бы в том, что фронт будет вызывать процедуры бэка с параметрами для генерации кода. Запишите эти вызовы в столбик и будет язык. Назовите его как хотите. Можете назвать пи-код или как-то иначе.

    Впихивать стековую виртуальную машину в Z80, повторюсь, такое себе. Получится вполне тормознутая хрень с очень ограниченным применением. Даже не совсем понятно каким. Текстовые игры? Ну может быть.

    Да, Хунта, да. И на "правильных" языках тоже можно разные штуки делать.

    Цитата Сообщение от Andrew771 Посмотреть сообщение
    Так и делай для себя, с прицелом на облегчение написания своих программ/игр.
    Тебе надо - ты и делай? У нас как-то иначе было когда-то?
    Последний раз редактировалось Oleg N. Cher; 29.01.2024 в 07:32.

Страница 91 из 91 ПерваяПервая ... 8788899091

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. мощная игрушка
    от ZEman в разделе Игры
    Ответов: 129
    Последнее: 23.03.2024, 17:05
  2. Ответов: 5
    Последнее: 20.06.2011, 03:18
  3. Видеоконтроллер из пяти микросхем
    от zx-kit в разделе Изображение
    Ответов: 20
    Последнее: 31.03.2011, 14:48

Метки этой темы

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •