он то может и возьмет, но кто будет повторять, если это больших денег стоит? К тому же сейчас в России надо начинать с вопроса "а можно ли это привезти или достать?"
Как показала практика, если при разработке чего-то с FPGA чип был выбран под конкретную реализацию, то поменять на более ёмкий обычно крайне затруднительно - и проблема будет с разводкой платы.
Я такое пробовал делать (поставить FPGA с в два раза большем количеством макроячеек) - пришлось резать дорожки и бросать МГТФ-ом порядка 10 пинов - развлечение так себе. Перепилить прошивку (при наличи исходников - в моём случае всё было проще, так как я был автором исходников) менее сложно (ну естествнно, при наличии опыта разработки под FPGA)
Бывают чипы и некоторые пределы емкости, где попиново совместима замена
Ключевое слово - бывают.
И, если я правильно нашёл инфу, в нём стоит Xilinx XC6SLX9 - я с Xilinx не работал и практически наверняка не буду работать, так что - ничего не могу сказать - есть ли более ёмкие по пин совместимые. Ну и поскольку не работал (и врят ли буду) - ждать от меня PDP-11X на Xilinx не стоит.
Я к тому, что нефиг говорить то про что "не шаришь". Практически любой проект на плисе при смене внешних устройств (или самой плис) требует доработки "напильником". Как следствие: можно запустить Project Oberon на ЛЮБОЙ современной плис при наличии нужной периферии (чтоб не переделывать софт). То что у меня нет цели найти плату со статической памятью - это не отрицает моей цели запустить оный проект на ДДР. Увы реалии таковы что мне приходится пахать на работе, что б прокормить близких. "Пустословить это вам не мешки ворочить".
AlexG, вообще тема с ПЛИС была поднята чтобы попробовать показать Хунте себя в зеркало. Я не претендую.
Но раз уж Вы всплыли, то расскажите чем занимаетесь. Есть какие-то подвижки в освоении Project Oberon?
- - - Добавлено - - -
Про "пашу на работе" понял...
Ага, значит у меня всё же есть "поделка", которую не стыдно предложить другим? А то ты ранее пи#дел, что я не достиг никаких [значимых для тебя] результатов. Так что зеркало подразумевает показать тебе, что ты не достиг никаких [значимых для меня] результатов. Всё. И не надо обесценивать то, что тебе даже не очень понятно.
- - - Добавлено - - -
Хунта, у нас с тобой был нейтралитет. Я не лезу к тебе и не учу тебя как тебе что делать. Ты не лезешь ко мне. Но тебя такой расклад не устроил. Так что ты ещё ожидал?
Вот Кряха приплёлся в группу по Оберону. Понятно, что кряхино время не стоит и трёх копеек за сутки, так что ему его не жалко. Но хочется оградить от этого хлама тех людей, чьё время ценнее.
- - - Добавлено - - -
Защищать идеи, положенные в основу Оберона, не значит "навязывать всем свою поделку". Ты не путай.
Для начала, процитирую написанное мной полностью, а не выдранное дятлом.
А теперь цитата от дятла
То есть всё, что не по дятлу - "страдать фигнёй", а надо было "заняться, наконец, Обероном".
Ну чё, логично.
- - - Добавлено - - -
Ну пусть ТС страдает дальше своей "фигней", дальше не интересно
Ещё одна попытка. Защищать философию языка - не значит его навязывать. Всё никак не врубишься?
Это была ироничная отповедь на это странное утверждение дятла:
Мало ли куда и зачем я сунулся. Может я играть пришёл. Или просто комментировать. Но ирония ответа от тебя явно ускользнула. У тебя чувство юмора как у топора, Хунта.
- - - Добавлено - - -
[стоит с табличкой "Смеяться здесь"]
Слив Оберона засчитан.
Это слив всего, что делал или когда-либо будет делать Хунта - засчитан. Это не более чем форма самоудовлетворения.
- - - Добавлено - - -
Но видишь, ты наехал не только на меня, а вообще на Оберон. А чуть раньше ты требовал 10 цитат, что это не Оберон плохой, а я странный ;)
Ну понятно, бла-бла-бла. Кря-кря.
Извините, если вопрос по теме)
>Мощная среда ZXDev для разработки НА ПЯТИ ЯЗЫКАХ для ZX готова к тестированию
Я всё стесняюсь спросить с 2012 года, а какие 5 языков (еще и большими буквами)? Оберон - раз, Си - как промежуточный, с натяжкой, два. А еще три какие?
И, Олег, ты же можешь сделать кодогенерацию в какой-нибудь пи-код (java, например), чтоб из него потом на разные платформы раздавать. Почему не делаешь? Пи-код проще, чем ассемблер.
Почему это "Си с натяжкой как промежуточный"? Ты можешь использовать его в связке с Оберонами как полновесный язык. Можешь в модуль на Обероне вставлять куски кода на Си, подключать хидеры и внешние сишные файлы, делать сишные тела для отдельных процедур и т.д. То же самое про асм.
Было: Оберон, Оберон-2, Си, асм. На момент создания темы я думал, что в SDCC ещё и поддержка C++ есть (которым сам не пользовался). Потом выяснилось, что нету, не поддерживается. Был введён в заблуждение исполняемым файлом sdcpp.exe, который оказался просто внешним препроцессором.
Сейчас: Оберон (1990), Оберон-2, Оберон-3 (мой собственный диалект, адаптированный для 8- и 16-битной разработки), Оберон-07/16 (последняя виртовская редакция Оберона), Компонентный Паскаль, Си, асм.
Включены некоторые расширения из GPCP и Дубовых требований. Планируются, но пока не реализованы расширения Oberon-X.
Да, за эти десять лет было сделано дофига хорошей работы, чтобы сделать XDev более удобной для ретро-разработки.
Не предлагай мне свои пути, Андрей. Пи-код, не пи-код, асм, машкод - это твоя стезя. Юзать java для ZX хоть в каком-то смысле - такое себе. Ну вот тебе странного хочется, а мне давно уже нет. В чём вообще польза java? 32- и 64-битность. Все целые типы со знаком. Стековая машина, без регистров. Классы. Динамическая память. Ты в курсе, что java нельзя статически выделять хоть те же классы? Оно подходит для 8 бит как сова для натягивания на глобус.
Если ты имел в виду "что-то типа java, но более скромное", это уже теплее. Но опять же, заморачиваться. Зачем? Кто оценит? Кому надо? Придут ещё и потопчутся по святому. Спасибо, но не надо. Может для себя я что-то такое когда-нибудь и запилю, но упаси господи пытаться угодить "сообществу".
Разве возможно перенести С-Lang(LLVM) на 8 битки? Или нужно делать другую виртуальную машину специально для 8-битных систем? А на ней тогда и С, и С++ и все остальное.
С-Lang(LLVM) не влезут :) Но если Вы имеете в виду "адаптировать для генерации кода для восьмибитных процев", то есть пример успешных бэк-эндов для Z80 и 6502 (неизвестной степени готовности и стабильности).
Видимо, в ВМ нет особого смысла, т.к. это тормоза. А если подобную LLVM, заточенную чисто под оптимизацию, то сил сообщества не хватит сделать настолько сложную штуку. Тут хоть бы бэк-энды для готовой LLVM запилили. А то вот PDP-11 нет.
C и C++ не столь хорошо подходят для 8-битных процев. Надо смотреть в сторону C--, Cowgol и PL/M. Или сделать более сурово: чтобы по умолчанию размер арифметических операций был 8 бит, не разрешать рекурсию, ограничить разгул локальных переменных, и тогда можно уже смотреть в сторону Си, Модулы, Паскаля или Оберона. Но не знаю есть ли в этом высокий смысл.
Я уже понял, что народу надо "шашечки". Им просто нравится идея генерации в машкод. При этом за бортом остаётся даже генерация в асм, т.е. подходы ZX Like Pascal, SDCC или даже Free Pascal.
Если бы надо было "ехать", то ехали бы. XDev вполне хорошо и через Си работает.
Что тогда остается? Портировать игры на каждую платформу индивидуально? Да, понятно, что стек 8 битки поддерживают намного хуже, чем всякие хитрые манипуляции через регистры. А что такое байткод при "приземлении" на конкретную платформу? Он разве не может это делать с учетом проца? Выход ассемблера в расчете на какой-то ассемблер или группу ассемблеров? Если на группу, то действительно наверное лучше сразу код исполняемый
и оптимизированный генерить. А то юзверю придется разбираться в особенностях разных ассемблеров, и мучится с выбором ключа.
ну если прежде не ехали, то не значит, что в будущем не поедут. Куда спешить? Возможно до конца "эры программистов" 20 лет, а возможно 200. XDev вполне можно использовать. Кому надо пусть оптимизирует выдаваемый С код. Кому не надо - пусть пишет хоть на Basic-е, хоть на asm-е, хоть на pl/m. Это смотря какие библиотеки есть. Самому все писать на asm-е (без использования биос-а или библиотек) очень непросто. Код надо структурировать и комментировать, иначе и сам спустя какое-то время не разберешься.
Смотря какие возможность заложены в ассемблер и смотря какая система команд.
Да неужели? Проблема только в том, что существует большая группа программистов (не только на ретро-платформы), которым на это насрать - и им не поможет никакой вундерязык.
- - - Добавлено - - -
Кому надо ехать - они едут. На любом языке, который сочли подходящим. Что бы им не толдычили "адепты" "правильных" языков.
Пример из C# (причём тут, по сути, даже не возможности языка, а возможности реализации его окружения)
На вход - массив (сырых) байт, на выходе - вполне себе объекты. Причём OneWayMapper-у фиолетово - что за объект (какого класса) надо создать - всё берётся из описания класса. Причём размеры конкретного поля могут быть не фиксированы - и браться из другого поля этого или родительского объекта.Код:[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);
}
И в этом вариант мне не надо писать парсер сырых байт под ещё один описанный класс объекта - всё делается ОДНОЙ строчкой
И при таком подходе на цепляние к моему дизассемблеру ещё одного формата файла мне поднадобилось пол дня - на описание классов и на разборки с тем - как же это всё таки в байтах хранится - ибо документации - кот наплакал и некоторые вещи были определены опытным путём.Код:private static void CILImageDescription(SmartArray<byte> sarr)
{
cilHeader = new CILHeader(sarr);
- - - Добавлено - - -
А, да, для возможности создавать образы, в которых была бы одна из ФС операционок с PDP-11, понадобился мне двунаправленный маппинг. Ок, пример. Тут несколько замороченней описание класса, но я пока не разобрался, как в run-time создать прокси-класс-наследник, поэтому пока так. Может, как руки дойдут - переделаю.
В этом примере свойство ExtraBytes - массив переменной длины и его длина (если он вообще будет) берётся из другого поля родительского объекта. И при записе какого-либо поля объекта - моментальное изменение в байтовом массиве. Так что инициализация и наполнение ФС становится тривиальным делом.Код:[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)
};
Может всё байт-код, о чем я Олегу и твержу. Я даже пробовал байт-код java в асм Z80 конвертить, нормально получается (на Дельфи писал намётки пост-процессора, с потоками java, как положено). И даже думал в ZX Like Pascal встроить. Только нужно времени много.
Сейчас в ZX Like Pascal выдуманный мной пи-код, который внутри конвертится в асм. Описывал здесь
- - - Добавлено - - -
Да, оно. Так и делай для себя, с прицелом на облегчение написания своих программ/игр.
Любая сцепка фронт-энда и бэк-энда подразумевает промежуточный язык. Хотя бы в том, что фронт будет вызывать процедуры бэка с параметрами для генерации кода. Запишите эти вызовы в столбик и будет язык. Назовите его как хотите. Можете назвать пи-код или как-то иначе.
Впихивать стековую виртуальную машину в Z80, повторюсь, такое себе. Получится вполне тормознутая хрень с очень ограниченным применением. Даже не совсем понятно каким. Текстовые игры? Ну может быть.
Да, Хунта, да. И на "правильных" языках тоже можно разные штуки делать.
Тебе надо - ты и делай? У нас как-то иначе было когда-то?
На форуме каждый человек волен написать в любую тему. Если я неправ, пусть одмины поправят. Это только ты почему-то решил, что там надо впахивать, и только доступным тебе способом. Чьё это горе?
См. выше.
Я ж не ДЛ, расслабься. Я даже не понял чего ты от меня опять хочешь.
Потому что ты неадекватен. См. ниже.
У меня накопились риторические вопросы к джерри. джерри, можешь не отвечать, они риторические.
1. Почему жерри решил, что он может что-то от меня требовать? Если по всем канонам морали имеет право только лишь просить, и то вежливо.
2. Почему он берёт меня на слабо как школьника?
3. Почему я должен что-то ему доказывать?
4. Почему любые идеи писать для ретро на чём-то, кроме Бейсика/ассемблера, вызывает приступы ярости у жерри и иже с ним?
5. Почему каждый должен стать профи-игроделом, как жерри? Иначе фу.
6. Почему жерри ничего не требует от других участников форума? В чём причина такого неравнодушия?
7. Почему надо обязательно впахивать тем способом, который нравится жерри? Иначе жизнь прожита здря
8. Зачем жерри туториалы и мастеркласс по тому, что он не будет использовать, а будет только фукать и фикать, потому что ему сам подход не нравится.
9. жерри вообще нормальный? Может уже пора ему провериться у психиатора?
Так, мысли вслух.
Проанализируем фразу.
Это надо понимать как "на Обероне не сделали ничего, что шыни считает путним". Но шыни далеко не в теме. Ну пойди расскажи Савелию Иванкову, что он и его игры - отстой.
Нет, шыни, ты намного больший отстой со своими жалкими демками. А Оберон - он на века.
- - - Добавлено - - -
Есть моральное право пиарить Оберон в ретро-среде хотя бы потому, что он лучше Бейсика. Любого. Да, надо писать низкоуровневую обвязку и для этого знать платформы. Ну а где это устроено как-то иначе? Но он лучше. Производительнее. И переносимый. На нём благодаря моим усилиям, которые никогда не оценят жерышыны, - можно писать практически для любой ретро-платформы. Для любой. А на асме все писать не будут.
А моральное право пиарить PL/M - в том, что это объективно лучший компилятор с некоего ЯВУ для 8080-машин. Объективно. Лучший. Где тут любители хороших компиляторов? Что сидят по углам и за печкой?
А торчки на асме нам много не накодят; мало того, что они делают всякую хрень, так их способности даже нельзя взять и использовать произвольно, чтобы сделать что-то хорошее. Так что компилятор PL/M однозначно лучше призывов "всем на асм", "асм или умри" и прочей фигни.
- - - Добавлено - - -
Так что, раз "на Обероне ничего путного не сделали", а на Бейсике типо сделали, а Оберон лучше Бейсика, то чьё это горе? "Покажи нам готовое, тогда мы может быть сделаем что-то готовое [но это не точно; скорее всего, нет]". Где я вам возьму готовое? Берите что есть.
https://i.pinimg.com/736x/8a/64/02/8...7baec83a39.jpg
- - - Добавлено - - -
а, стоп, не заметил сразу
вотоночо, значит, плм и прочие обероны просто предназначены торчков
которые, что логично, не могут в асм, поскольку торчки
ну вот, всё и встало наконец на свои места :D
А ты не мог бы изъясняться как-то более связно, что ли? Торчки в хорошем смысле, радуйся, борцун "за всё эффективное"
Торчки в нашем понимании это хорошие ассемблерщики, делающие свою работу хорошо, а не спускающиеся с подиума наркоманы, полные эйфории. Или это как-то связано?
Понятно. По существу сказать нечего, поэтому придрался к словам.
Слушай. Почему я не могу заниматься на форуме тем, что мне нравится? Это связано с тематикой форума напрямую. И всё из-за пары утырков, людей странных в своём роде и повёрнутых на своём величии.
Ты делай что хочешь, я не мешаю.
Не нашёл отдельной темы по паскалю, спрошу здесь. Как включить в программу на турбопаскале 3.0 массив-константу известного размера? И чтобы при этом самому не указывать размер. Пусть компилятор сам посчитает запятые.
Иными словами, надо тупо сделать INCBIN. Конкретно - звуки для AY (afx).
Версия 3.0 не понимает открытых массивов (безразмерных 'array of byte'), но для Z80 - других нет.
Через array это делается так:
И т.п. Максимальный индекс (= 5) надо указывать руками. Если массив большой, то неудобно.Код:const
fx1:array[1..5] of byte = ($EA,$AB,0,0,$AA);
Как сделать чтобы компилятор сам посчитал кол-во байт в скобках? Хотелось бы 'sizeof (fx1)', но не работает.
Директива {$R} не помогает. Где-то читал, что это можно обойти, но не помню где.
Через inline (1/2/3/4/5) можно вставить что угодно любой длины, но как получить указатель на эти данные? Можно добавить в начало ld hl,$+4 : ret, но это изврат.
Предположу, что в Турбо Паскале 3 такой фишки нет. Придётся указывать руками.
Можно написать небольшую утилиту, которая будет бинарик конвертить в такой массив с указанием размера.
- - - Добавлено - - -
Да, ИИ подтверждают, что так и есть.
https://bitsavers.trailing-edge.com/...anual_1986.pdf
Цитата:
Сообщение от DeepSeek
В третьем турбопаскале это не будет работать. Оно понимает "byte" как объект размером 4 байта, в который входит сам байт, адрес его хранения и ещё что-то. Я делал патчер по *.crk файлу - и напоролся. Пришлось городить сарай из blockread / blockwrite с указателями на буфер (который там всегда 128 байт). Здесь виртуализация только мешает.
Вот пример использования звуков на AY из паскаля.
Утилита, понятно же, не для третьего Турбо Паскаля. Или Вы хотите вести разработку всенепременно под CP/M?
Ага, а они типа на Бейсике. Нутак, чья вина, что нет ничего подобного на Обероне или ПЛ/М ? Может потому что вы постарались?
жерри,
давай пройдёмся по основам. Я думал, что это понимают все, но, видимо, нет.
У каждого человека есть круг своих интересов. Мои интересы - это языки программирования и поиск способов упростить ретро-разработку и снизить барьер вхождения в неё. Вот тогда и игры будут на ПЛ/М и Обероне. Я не интересуюсь асм-разработкой. Асм для меня просто неизбежное зло. Я не претендую на экспертное мнение в знании ретро-платформ. Напротив.
Я не обязан разрабатывать игры, половина форумчан этого не делает. Ты почему до сих пор не выколол им глаза? Нет, ты неравнодушен почему-то именно ко мне. Ну вот что с тобой не так? Я могу писать игры, но не должен, особенно потому, что тебе так хочется. Ты жаждешь конкуренции со мной? Забудь.
- - - Добавлено - - -
Ещё, жерри, меня очень интересует разработка переносимых между ретро-платформами игр. Область почти фантастическая. И асм здесь никак не поможет.
Да, возможно, я никогда не найду никакого решения, но думать и мечтать об этом мне нравится. А тут ты со своими грубыми лапами и грязными намёками про твои ассемблерные таланты и отсутствие моих. Что мне за дело до этого.