Не могу понять что не так с if not exist. Без модулей все в порядке, в модуле не совсем. Проверял с 18.2 и 19
Вид для печати
Не могу понять что не так с if not exist. Без модулей все в порядке, в модуле не совсем. Проверял с 18.2 и 19
Наверное ped7g сюда больше не заходит, сделал иссуе на гитхабе, очень уж охота переопределяемость в асме без дефайнов.
sorry, busy with a newborn baby, so I didn't notice there's new post. Github surely works better. ( https://github.com/z00m128/sjasmplus/issues/177 )
But this issue is a bit puzzling to me, not sure what to do about it, technically it works "as designed", but in your example it is very counter-intuitive and feels wrong...
Also I'm a bit confused what you mean "Без модулей все в порядке"
If I do in empty asm file this:
it will do the conditional block only in first pass, creating the label "non_mod_l1", but not doing `ds 1` in pass 2 and 3, so this is broken logic even without modules.Код:IF !exist non_mod_l1
non_mod_l1 ds 1
ENDIF
(but the `exist` was not meant to be used like this, for conditional "linking" there is `IFUSED` which works a bit differently, and for replacing default definitions with external code I would suggest DEFINE + IFDEF)
Поздравляю с приятными хлопотами, рад за вас.
У меня была идея использовать в виде именно переопределяемых процедур и данных, возможно я немного не так подошел к функционалу. Допустим есть тематический модуль, но мы хотим изменить процедуру или данные в нем не переписывая его. Раньше я делал такое через define но exist показался прямо предназначенным для этого.
Возможно тут применима логика когда фактически exist проверяется только на первом проходе, слежение за ссылками вперед оставим на писателя, тут мне кажется это не применимо. Но в целом я понял, буду использовать define, если есть обходной путь овчинка не стоит выделки.
То что у меня сработало без модуля перепроверю, вполне возможно я ошибся.
I have been thinking about the issue for few more hours, and I think it will stay as is.
While your example is quite logical on first read, and I would sweat a bit to explain to new assembler users why this is a problem, it *is* a problem.
Generally assemblers collect symbol values over several passes, before they start emitting machine code, at that point the symbol values should be stable. So it's impossible to reset values before each pass, and EXIST targets symbols. (contrary to that DEFINEs are reset before each pass, and are re-created each pass, so IFDEF + DEFINE works the way how you expect).
Thinking about it, the assembler working like mdlz80optimizer doing lazy evaluation of labels and "single pass" (I think, not sure about how exactly it works, but it's not N-pass) would probably work for your example, but that's completely different architecture, not going there with sjasmplus.
(and for general library, the IFUSED can be used, although I personally prefer to have full source of project together, so even when I use some "library", I first copy the library source to the project, so I can then easily modify it only for the particular project and I don't need to worry about other projects using the same base library)
Ограничение на длину строки в 128 байт для BYTE/DB/DC является очень важным, или лимит можно увеличить?
All internal buffers are fixed size. read-line is 2048, define-substitution two buffers 2048, emit-bytes-values inside BYTE/DB/DC/DZ directive is 128+2, etc...
You can raise limits of all those buffers (and hope that you did find all relevant ones) and build version which will accept more, but there will be always some hard limit unless you rewrite the code to use dynamic memory allocation per line.
But even to reach 128 items in DB it must be super long source-code line which is difficult to read+edit in text editor, so I don't see 128 limit as an issue (in my own source I'm often limiting number values to 16 or 32 per line and quoted text to 64 chars).
For binary data like gfx consider `INCBIN` instead of converting it to source code, or patch the convertor to split it into multiple lines.
https://github.com/z00m128/sjasmplus...es/tag/v1.20.0
- Lua: upgrade to 5.4, replacing tolua++ bindings with LuaBridge2.6 library, extending some bindings
- Lua: bindings slightly modified (required by upgrade), refreshed docs, added test coverage
- Lua: the 3rd party extensions (BTW not working for many years) are obsolete in 5.4 and removed
- Lua: more accurate errors/warning location reported even in complex cases
- warnings: added -Wall, --help=warnings shows on/off status, rdlow off by default
- Added HIGH mode to relocation data generator (MSB-only relocation mode)
- many open-file "fatal" errors become "non-fatal", assembling will continue
- deprecated features removed: --syntax=m, label abs in expressions
- --color=auto will stay no-color when env.var. NO_COLOR is defined
- refactorings, improving some error messages and parsing, small fixes in parsing logic
- fix listing of Lua's sj.parse_code (eol-comments), minor memory leaks fixed
- fix relocation of temporary labels in expressions
- invalid CLI options are reported as regular errors (also changing exit code)
- errors are colored similarly to gcc (only keyword has color), console input name is <stdin>
Please be aware the upgrade of Lua may break some older scripts:
- the sjasmplus bindings had been restricted to only documented API, removing some of the secret optional arguments (hopefully not used by many people, in case you did use them, use instead the _pl/_pc function producing required asm line as string and letting sjasmplus to parse it as regular piece of code).
- Lua 5.4 has several incompatible syntax changes compared to 5.1, some stuff is quite subtle (for example _pc("ld a," .. 4/2) will produce string "ld a,2.0" which will cause "Unexpected: .0" error in parser)
- check the docs and tests to see how I adjusted old source to assemble again in similar cases
вопрос: можно ли как то переназначать переменную компилятора __DATE__. её формат YYYY-MM-DD не удобен.
https://devrant.com/rants/1791863/a-...r-a-programmer
I can't imagine which else format would you want, the YYYY-MM-DD is perfect.
If you need different format, there are no string operators in sjasmplus, so Lua for the rescue:
but that's just wrong.Код:LUA ALLPASS
date = sj.get_define("__DATE__")
year = date:sub(2,5)
month = date:sub(7,8)
day = date:sub(10,11)
wrong_format = "\""..day.."."..month.."."..year.."\""
sj.insert_define("WRONG_FORMATTED_DATE", wrong_format)
ENDLUA
DISPLAY WRONG_FORMATTED_DATE
Ped7g, вроде был простой вопрос и тут посыпались wrong, не wrong, для чего это навязывание своих стандартов? у вас дата с года рисуется, у нас день месяц год. куда лучше смотрелось бы переопределение формата. или ключём через аргументы или в листинге кода. Lua тут костыль (хоть и рабочий).
Ped7g, Нет. Скомпилировать SJASM+ я не могу.
128+2 байт хватает, когда DB используется для стандартных сценариев. Но не хватает, когда пишутся или адаптируются под sjasm+ игровые скрипты, особенно содержащие в себе много текста. Тогда приходится проделывать множество ручной работы, компилируя скрипты, выявляя строки, не укладывающиеся в ограничения по длине и в ручную ограничивая их длину.
Почему нельзя задать буфер под DB с некоторым запасом например 512+2 или 1024+2 ? Это снимет все вопросы к данной директиве раз и на всегда.
У современных конфигураций компьютеров память может исчисляться десятками гигабайт и лишняя пара килобайт ничего не значит.
Так делается для того (в том числе), что если у тебя есть куча файлов с названием в формате YYYY-MM-DD, и вывести их список, сортируя по имени, они выведутся, к тому же, в правильном хронологическом порядке. Если называть файлы в формате DD-MM-YYYY, то при выполении dir в директории с миллиардом файлов в подобном формате, получим (при сортировке по имени) чушь, в которой сложно ориентироваться.
vsКод:Directory of D:\test
17.06.2022 20:37 <DIR> .
17.06.2022 20:37 <DIR> ..
17.06.2022 20:34 0 01-01-2020.txt
17.06.2022 20:34 0 01-01-2021.txt
17.06.2022 20:34 0 01-01-2022.txt
17.06.2022 20:34 0 02-01-2020.txt
17.06.2022 20:34 0 02-01-2021.txt
17.06.2022 20:34 0 02-01-2022.txt
17.06.2022 20:34 0 03-01-2020.txt
17.06.2022 20:34 0 03-01-2021.txt
17.06.2022 20:34 0 03-02-2022.txt
Лично я полностью согласен, что DD-MM-YYYY is wrong, хотя у нас так исторически почему-то сложилось. Но, если у тебя есть дата, ты можешь отформатировать её в любом формате, что и показал Peg7g LUA-скриптом.Код:17.06.2022 20:40 <DIR> .
17.06.2022 20:40 <DIR> ..
17.06.2022 20:38 0 2020-01-01.txt
17.06.2022 20:38 0 2020-01-02.txt
17.06.2022 20:38 0 2020-01-03.txt
17.06.2022 20:38 0 2021-01-01.txt
17.06.2022 20:38 0 2021-01-02.txt
17.06.2022 20:38 0 2021-01-03.txt
17.06.2022 20:38 0 2021-01-04.txt
17.06.2022 20:38 0 2022-01-01.txt
17.06.2022 20:38 0 2022-01-02.txt
17.06.2022 20:38 0 2022-01-03.txt
17.06.2022 20:38 0 2022-01-04.txt
17.06.2022 20:38 0 2022-01-05.txt
0xDEAD, во1х, причём тут имена файлов, атрибут времени и ассемблер?
во2х, ты спутал разные понятия - атрибут времени и имя файла. твоя проблема решается сортировкой.
в3х, я говорил про ассемблер, компилятор. то. что оно wrong, оно только в разных странах по разному. у нас оно принято DD.MM.YYYY. и чтобы записать внутри собранного файла дату и вывести её на экран, мне нужен такой порядок. а ты полез в какие то дебри. мало ли для каких целей это нужно.
LUA скрипт не удобен. нет желания прибегать к нему.
1. Ассемблер тут притом, что он применяет формат даты, который уже устоялся. По многим причинам.
2. А у меня проблем нет. А твоя проблема решается переформатированием даты, хотя бы, с помощью скрипта. Но он для тебя неудобен.
3. И я о том же говорил. Про ассемблер, компилятор. Да - в разных странах оно по-разному, у нас получилось DD-MM-YYYY, и по-моему мнению (и по мнению 3/4 планеты), это wrong. А для тебя YYYY-MM-DD wrong. И, в связи с этим, как раз не у меня проблемы возникли.
Истины ради, не 3/4, а сильно меньше. Есть довольно распространённый MM-DD-YYYY, который ещё более нелогичный чем DD-MM-YYYY. А единственный рациональный и дружественный логике и соответственно компутерам YYYY-MM-DD (который используется повсеместно в IT) не особо «традиционен».
Вообще несмотря на нечастость надобности странных форматов даты было бы неплохо встроить функцию с human-readable строкой. Есть же стандартная функция форматирования. Просто её подцепить, с дюжиной пресетов. Скрипт - хорошо что есть и работает (отчасти), но это все-таки костыль.
(Лично мне для спектрума и YYYY-MM-DD ни разу не пригождался. Я вообще считаю что у сабжа достаточно куда более существенных недоработок и помимо «формата даты»)
0xDEAD,
1. Ассемблер, точнее компилятор данного языка - это, инструмент, в первую очередь. применять он может разные форматы, данные и прочее. для этого есть его директивы и аргументы ком.строки.
1.1. где там что устоялось? https://ru.wikipedia.org/wiki/%D0%9A...BE%D0%B4%D0%B0.
ознакомься с устоями даты.
2. у меня тоже проблем нет. ни с сортировкой файлов ни тут с датой. я могу тупо build.exe использовать. но это внешний инструмент, так же как и LUA. sjasm+ единственный компилятор, который применяет данный костыль. использование данного костыля усложняет переносимость исходных текстов. это же очевидно, что тут не понятного может быть?
3. у нас принят формат даты как DD.MM.YYYY, через точку, если быть точнее. но это уже детали. с точки зрения хранения данных на компе, дата занимает 4 байта (в BIN формате). не имеет значения в каком формате она хранится.
тебе поспорить хочется или как? добавить в исходнике компилятора переопределение переменной невозможная задача? "не смешите мои тапочки" (с).
когда дело доходит до реализации какой то мелкой бредни, которой пользуются полтора человека на всей планете - автор тут как тут. как реализовать адекватный функционал - начинаются песни и танцы. я прекрасно помню отмазки вокруг формата REL и подобных... так и щас.
Дело хозяйское. Проблем нет, но проблема есть.
для тех у кого с восприятием проблемы, я ещё раз повторяю:
1. дату в программах выводят в удобном для местного населения формате. у нас в РФ принят формат даты, который по мнению 0xDEAD и Ped7g является wrong.
2. есть понятие - переносимость кода/исходников. LUA сильно сокращает эту самую переносимость.
3. автор компилятора жив, на связи, с исходниками на руках. в чём проблема добавить возможность переопределять?
вроде очевидные вещи пишу, нет, надо зайти и срач на пустом месте поднять.
Sayman, тебе хотя бы костыль предложили и он работает. А в моем случае (выгрузка меток и метаинформации по типам данных) даже и костыльного варианта СОВСЕМ нет.
Dexus, так выгрузка меток вроде была, через какой то экспорт?! или это другое? в evo sdk такое применяли.
- - - Добавлено - - -
ещё про дату. чтобы вопросов про формат не возникало, достаточно ввести переменные, вроде: __DATE__DAY__, __DATE__MONTH__, __DATE__YEAR__ и вопросы у всех исчезнут. каждый сможет реализовать дату в том формате, в котором ему лично хочется. а так, придётся залезать в исходник компилятора...
Sayman, речь про xmap для xpeccy. Там нужно чтобы сохранялись типы db/dw и всякое такое. Свой компилятор из-за этого не очень хочется делать. Issue в трекере с прошлого года висит.
If you are experienced programmer, you know the YYYY-MM-DD is the only correct format. Czech and Slovak national formats are also wrong and confusing, just like Russian form. They are all wrong, and I'm right. It's so simple. People being wrong and me being right - story of my life. :)
About other changes to sjasmplus ... :v2_confu:
I do what I need for my own projects, or what I find enough fun or critical.
I really don't see any issue with 128 limit for DB, I don't understand how you can have problem with it. For specific text entering system supporting also non-programmers you can produce your own solution, there was somebody writing lot of dialogs for game, and we devised some lua script helping with that: https://github.com/z00m128/sjasmplus...ua_inctext.asm https://github.com/z00m128/sjasmplus...ua_inctext.lua
In similar way you can devise your own custom solution, without adjusting sjasmplus. Or just `sed` one-liner splitting long lines into multiple DB statements.
Dexus has issue which seems difficult to implement, haven't got simple idea how to do it, and doesn't seem very important to me.
Why can't you develop your own changes - I don't know, I did need changes, I did changes. Also I have seen bugs, so I fixed bugs. Now you can profit from my fixed version of sjasmplus, as I'm sharing it with everyone. Of course my usual way of developing things and my needs may not cater 100% for your ways and needs, but well, that's not my problem. My problem is, that I spent about 2 years of life fixing Z80 assembler, and now I need to fix my life... :)
ты не понимаешь, что тебе говорят? я разве говорил о том, что нужно файлы какие то хранить в формате даты (чтобы потом с сортировкой не парится) или что? я говорю про отображение даты текстом. вроде того, что при запуске идёт вывод в консоль приветствия от автора и версия программы. и вот тут отображается дата. и вот она как раз отображается в том формате, в котором привычно видеть глазу в той или иной стране. у себя вы там можете выводить в каком угодно формате. это ваше право. наше право выводить в нашем формате. машине (виндовс, компилятору и другим программам) всё ровно в каком виде хранится дата. это просто набор байт и бит для неё.
при этом ты предлагаешь использовать LUA, которого нет в других компиляторах. т.е. переносимость кода между разными машинами и компиляторами просто не возможна. например, без использования LUA я спокойно могу перенести исходник с sjasm+ под спринтер, на его компилятор orgasm. и всё хорошо компилируется. но стоит только заюзать lua и всё, досвидос остальные компиляторы.
если не хочешь делать. так и скажи - "идите нафиг со своими хотелками", все вопросы отпадут...
Уже проходили. 640кб хватит всем. :)
Это если алгоритм не завязан на структуру. К примеру, в байт больше 256 значений не засунешь. :)
P.S.
Я просто поболтать, исходники ассемблера не смотрел.
- - - Добавлено - - -
Хуже этого только месяц-день-год и АМ/РМ время.
мне больше нечего тут добавить.Код:Microsoft Windows [Version 10.0.19042.1288]
(c) Корпорация Майкрософт (Microsoft Corporation). Все права защищены.
C:\WINDOWS\system32>date /T
20.06.2022
build.bat
source.asm:Код:date /T > bdate.txt
sjasmplus source.asm
BTW, orgasm does have `__DATE__`?Код:...
build_date_txt:
INCBIN "bdate.txt"
; maybe extra DB 0
...
BTW2: you don't understand. You should even display YYYY-MM-DD to users, to educate them about the best date format. :)
yes, there's ton of SW which does it wrong. Even GCC `__DATE__` is like "Feb 12 2022".
As I wrote, it's quite common that many people are wrong and I am right, I'm used to it. :)
Ped7g, И как ты получишь следующий день, за данным? Сначала прибавишь единицу к дню, то есть начнёшь с конца.
Почему-же в Z80 "LD (8000),HL" запишет (8000):=L; (8001):=H ? Потому что начинать арифметические операции естественнее с младших байтов.
Да, операции сравнения, больше-меньше, часто быстрее выполнять со старших байтов. Но это не делает запись от старшего к младшему единственно верной записью.
Do not implement your standards where they are not needed.
- - - Добавлено - - -
Что-то вас не туда понесло. Эта переменная банальная строка формата 'YYYY-MM-DD".
Задается такой строчкой.
Самый простой вариант, если лень реализовывать задаваемый пользователем формат даты, банально завести еще одну переменную с другим форматом. (но это так моё имхо, сильно в исходники не углублялся).Код:SPRINTF3(dateBuffer, 30, "\"%04d-%02d-%02d\"", now_tm.tm_year + 1900, now_tm.tm_mon + 1, now_tm.tm_mday);
А для расчета следующего дня (а нафик это надо в компиляторе?) к значению времени банально прибавляется 86400 секунд и всё.
это запись как string, в данном случае мне нужно как EQU. при этом если мне потребуется записать как стринг, я всегда смогу взять значение в кавычки. в общем build.bat не тот вариант.
я живу в России, у нас принят другой формат даты. Любой Русский пользователь будет матом крыть автора программы, который показывает дату в иностранном формате, чуждый Русскому человеку.Цитата:
You should even display YYYY-MM-DD to users, to educate them about the best date format.
Ой зря в политоту, да еще и с такой агрессией полез. Никто тебе ничего не обязан. Делай свой форк, и правь как тебе надо. До этих пор эти даты вообще никого не волновали.
Ровно эта же текстовая форма (yyyy-mm-dd) во всех основных СУБД используется по-дефолту. Это международный ANSI стандарт.
Dexus, это он полез, а не я. он начал "вы все должны за нами повторять".
про ANSI - я уже написал для чего это нужно. причём тут субд, причём тут файлы и команда dir, блин...
я вижу
явная провокация политического срача (про последствия подобного надеюсь объяснять не надо?)Цитата:
я живу в России, у нас принят другой формат даты. Любой Русский пользователь будет матом крыть автора программы, который показывает дату в иностранном формате, чуждый Русскому человеку.
причем абсолютно на ровном месте!
ответ уже дан
Цитата:
If you are experienced programmer, you know the YYYY-MM-DD is the only correct format
Заканчивайте уже про дату. Автор не хочет вносить данные изменения и смотреть откуда вы там - с Китая или с России, и я его вполне понимаю. Сконвертить дату из YYYY-MM-DD сложностей не представляет вообще никаких, в линухе прям в командной строке можно через sed.
плохо видите:
https://zx-pk.ru/threads/30314-sjasm...=1#post1156351Цитата:
BTW2: you don't understand. You should even display YYYY-MM-DD to users, to educate them about the best date format.
не моё.
и ещё раз. ответ дан на что? на формат "ANSI"?
ещё раз, вот текст:
Вложение 77486
так понятнее будет? я не в Швеции и не в Польше живу. мне не нужен такой формат даты.
мне не интересны СУБД на асме писать, всё смешалось - люди, кони.
с другой стороны, скачал исходник, сам воткну что надо. без форков...
It's really irrelevant what are the national customs. The YYYY-MM-DD is technically superior to any other format, and I'm on my quest to change the world.
Also usually it may help to remember that I may be trolling a bit and exaggerating... Usually when I sound serious I'm making a joke, and when it looks like I'm joking, I'm dead serious. Usually.
With regard to sjasmplus, it really is part of the package, that it should be easy to compile yourself, and patch some simple things yourself, that's one of the major points of FOSS license. You are assembler programmers, a bit of C/C++/Lua/... can't stop you. :)
And I really need to wind down time spent on sjasmplus, I think it's now very stable and quite "mature" tool. I don't have any big plans for v1.x and I don't see myself committing to work on "v2.x" any time soon. I'm still interested to improve sjasmplus over time, but the general issues affecting many users have higher priority than single-project customisation.
Also if you have particular Z80 asm project which is open source and has some issues with sjasmplus, send me git/svn/... url and I may try to help to patch the asm to work well with sjasmplus.