Внезапно, это нормальный синтаксис для чего-то почтенно архаичного, не помню уже, чего конкретно (pasmo?). Но, да, соглашусь, синтаксис странный, кто и зачем такое придумал...
Вид для печати
Кстати, я тут проверил от нечего делать. sjasm-то этот синтаксис всё ещё понимает. Ругается, но понимает.
В смысле, что значит всё ещё ? И почему это он не должен ругаться если ктото не читает инструкцию и использует команды языка вопреки его правилам и грамматики ? На такое вообще любой компилятор ругаться будет.
Какие в этом претензии к SjASMplus ?
Замени endm на endr , как положено в правилах, и не будет никакой ругни, всё замечательно компилируется.
Ну, а IRPC сделает?
Код:BXlt equ 0a5h
DBS. MACRO str,stre
IRPC x,<str>
db '&x&' xor BXlt
ENDM
db '&stre&' or 128 xor BXlt
ENDM
5D33 OpNum: DspStr
5D33 DF + rst 18h
dbs. <operator:>,< >
5D34 CA + db 'o' xor BXlt
5D35 D5 + db 'p' xor BXlt
5D36 C0 + db 'e' xor BXlt
5D37 D7 + db 'r' xor BXlt
5D38 C4 + db 'a' xor BXlt
5D39 D1 + db 't' xor BXlt
5D3A CA + db 'o' xor BXlt
5D3B D7 + db 'r' xor BXlt
5D3C 9F + db ':' xor BXlt
5D3D 05 + db ' ' or 128 xor BXlt
Насколько знаю IRP и IRPC готовых аналогов в SjASMplus нет, while есть, а этих не видел.
Если очень нужно чтото подобное, то можно как-то выкрутиться используя lua-скрипты, и даже более хитрую обработку строки провернуть, но это будет посложнее конечно, хотя и более универсально.
Но если честно я особо не припоминаю подобных функций и в других популярных у нас спектрумовских ассемблерах. И на практике даже и не знал что чтото такое зачемто нужно ))
Вообще в теме время от времени присутствует разработчик Ped7g, может быть если удастся обосновать необходимость данных фичь, то сможете уговорить их реализовать ))
Мне, если честно, более интересно было бы появление в SjASMplus возможности создания макросов с неопределённым количеством параметров, чтобы такой макрос можно было бы вызвать как вообще без параметра, так и с любым количеством.
Пусть это будет не macro , а например macro@ или macro$ или как-то по другому, параметры чтоб имели какое-то фиксированное название с порядковым номером, один со специальным именем (или нулевым номером) указывал номер последнего переданного, и их также можно было бы в lua перенаправить.
Вот тут можно было-бы неплохо развернуться. И тот же IRP например реализовать внешней библиотекой через lua, и много другого ))
sjasmplus doesn't have IRPC, you can get same machine code in some different way.
One of the options is to use virtual memory of DEVICE to post-process the string with xor like this:
which assembles as this listing shows (notice the memory at 5D34 written twice, first getting regular ASCII chars, second time being xor-ed):Код:BXlt equ 0a5h
DEVICE ZXSPECTRUM48 ; switch virtual device memory mode on
ORG $5D33 ; first do regular ASCII string
OpNum: rst $18 ; the "C literal suffix means
.str: DB "operator: "C ; to tag last byte with "or 128"
; now go over the ASCII string again and xor each byte:
.length equ $ - .str ; length for dot-repeater
ORG .str ; go back in virtual memory to start of str
.(.length) DB {b $} ^ BXlt ; .length-many-times xor content of virtual memory
SAVEBIN "temp.bin", OpNum, $-OpNum ; save resulting machine code
and hexa dump of saved binary file:Код:1 0000 BXlt equ 0a5h
2 0000 DEVICE ZXSPECTRUM48 ; switch virtual device memory mode on
3 0000 ORG $5D33 ; first do regular ASCII string
4 5D33 DF OpNum: rst $18 ; the "C literal suffix means
5 5D34 6F 70 65 72 .str: DB "operator: "C ; to tag last byte with "or 128"
5 5D38 61 74 6F 72
5 5D3C 3A A0
6 5D3E ; now go over the ASCII string again and xor each byte:
7 5D3E .length equ $ - .str ; length for dot-repeater
8 5D3E ORG .str ; go back in virtual memory to start of str
9 5D34 CA > DB {b $} ^ BXlt ; .length-many-times xor content of virtual memory
9 5D35 D5 > DB {b $} ^ BXlt
9 5D36 C0 > DB {b $} ^ BXlt
9 5D37 D7 > DB {b $} ^ BXlt
9 5D38 C4 > DB {b $} ^ BXlt
9 5D39 D1 > DB {b $} ^ BXlt
9 5D3A CA > DB {b $} ^ BXlt
9 5D3B D7 > DB {b $} ^ BXlt
9 5D3C 9F > DB {b $} ^ BXlt
9 5D3D 05 > DB {b $} ^ BXlt
There are for sure more possible ways, but not a simple way to replicate the exact syntax of your example, you need to convert that source for sjasmplus, sorry.Код:$ hd ~/zx/ped/scratch/temp.bin
00000000 df ca d5 c0 d7 c4 d1 ca d7 9f 05 |...........|
0000000b
Спасибо Ped7g за ваше внимание.
Я начал работать с M80 с конца 80-х и тогда других вариантов не было. А уже ближе к 2000-м начал подумывать об использовании чего нибудь посовременнее. Но, тогда уже было много наработок на M80 с его IRP/IRPC, и требовалось много изменений. Тем более, что основная заповедь гласит: "работает, не трожь!" И даже сейчас, с вашим SjASMPlus, видно что это не просто.
Да, спасибо @Ped7g.
P.S. как я понимаю, накрутить что-то подобное irp достаточно легко и с помощью DEFARRAY, там добавить локальные имена и всё, но можно и без этого. Синтаксис другой, менее удобный, но делать будет примерно то же самое, даже похожее макро можно набросать. А вот с irpc засада. Если я ничего не путаю, типа данных «массив байт» и, соответственно, выражения, имеющего такое значение нет.
- - - Добавлено - - -
Я тут заинтересовался, откуда есть пошли IRP[C] и при чём там макросы. Конечно, не настоящее исследование но, вдруг кому интересно:
В общем, почитал документацию. В M80 всё оказалось логично, там REPT -- макро, поэтому оно ENDM и заканчивается. Сначала я подумал, что это у них там «как всегда», но потом что-то такое всплыло в памяти. Порылся в архиве и интернете (педивикия загажена сектой свидетелей святого x86, там ничего ценного не осталось, похоже). В общем, самое раннее, что я смог быстро найти -- 1975. Конечно, DEC. У них тоже IRP, IRPC и REPT, почему-то, макросами считаются. Для IRP? оно, наверное, некоторый смысл имеет. Но, для REPT оно не только меня смущало, но и авторов MACRO-11. Там для REPT есть ENDR, помимо допустимого ENDM.
Вот придумали это всё в DEC или ещё откуда скопировали, я сходу найти не смог. Наверное, скопировали, пара ENDR|ENDM для REPT намекает. В IBM'овском Autocoder'е эта штука, вроде, называлась CHAIN и была очень примитивной. Интересно, что там было для PDP-5 или 8...
Тоже не скажу.
Собственно, моё программирование для компов, а не для программируемых калькуляторов, началось именно с (аналога) PDP-11, там это было уже как данность.
Ну и всё это было настолько развито, что с использованием макросов, условной копиляции и блоков повторения позволило - первоначально разработчикам из DEC - создать набор структурных операторов-макросов (IF, DO, WHILE, REPEAT и так далее), а мне позже допилить. Основной плюс - стало меньше необходиомсти в метках и структура программы смотрится прозрачней. Плюс скорость написания повысилась примерно на порядок. Плата за удобства - копмилируется медленней.
С чем связано, что переменная макроса не преобразуется, если стоит точка после неё? Использование @ не помогает.Код:MyMacros MyVar, MyStructure
;-------------------------------------------
MyMacros MACROS Name1, Name2
Name1_Addr EQU $
; its work (result: MyVar_Addr)
Name1.Addr EQU $
;not work (result: Name1.Addr)
Name1_Addr EQU Name2.SomeAddr
; not work (Name2.SomeLabels not replace Name2)
ENDM
точка недопустимый символ для имени, поэтому имя идет до точки, а дальше непонятный синтаксис
You are another person asking about this: https://github.com/z00m128/sjasmplus/issues/257
it's by design, macro arguments are similar to DEFINE, so they are substituted in raw text of line before parser starts parsing it as assembly, they are similar to C preprocessor stage. And the substitution is looking only for full name of macro argument/define, or for sub-word delimited by underscore `_`. Sub-words delimited by dot are not considered.
I'm considering to add substitution operator `_` to concatenate two sides during preprocessing step, so `Name2 _ .SomeAddr` would be then possible (at least one side of `_` would have to be actual define or macro argument name, otherwise the `_` would be considered regular char, so `ld hl,_` would still work as before, looking for symbol `_`. But I haven't even started with such enhancement.
Meanwhile there is new release, v1.21.0:
https://github.com/z00m128/sjasmplus...es/tag/v1.21.0
- - - Updated - - -
Biland: but I'm a bit confused what do you need it for, I would expect such need to be rare and there is maybe some other way how to write your source to get desired result with reasonable simplicity, if you want to share bigger example of your problem and why you want macro like that, maybe I can propose some different way how to write the code with what sjasmplus offers (already now, without waiting for future enhancements).
В моём случае, я пытаюсь работать со структурами и макросами. Было бы удобнее использовать Object.X, Object.Y, Object.Size и так далее, чем Object_X, Object_Y, Object_Size. Но в моём случае, как я написал, я работаю со структурами и при присвоении [<label>] <struct_name> - я могу использовать смещения по имени структуры (<struct_name>.MyLabel). И хотел указать минимум для [<label>], например, Size, End, Start. Приходится делать после выполнения макроса [<label>].Size, [<label>].End, [<label>].Start. Хотя было бы удобнее в макросе.
При создании переменных было бы лучше через точку. Вариант, где было бы наглядней визуально, как в языках высокого уровня:
Ещё, вопрос. Если я, например, вызову макрос с одной переменной SETVAR MyVar, то компилятор будет ругаться. Внутри макроса другие компиляторы позволяют проверять не переданные параметры, через IFNB и IFB. Это вызывает проблемы при адаптации исходников для sjasm.Код:SETVAR MACRO NAME, NAMESIZE
NAME EQU INITVAR
IF NAMESIZE >= 0
NAME_Size EQU NAMESIZE
NAME_PEnd EQU INITVAR +NAMESIZE
INITVAR= INITVAR +NAMESIZE
ELSE
NAME_Size EQU 1
INITVAR= INITVAR +1
ENDIF
NAME_CurAdr EQU $
ENDM
Вопрос, скорее, в качестве разминки для ума, так как я сам сходу могу придумать минимум два способа решения (lua и «чистый asm», навеянный дискуссией о IRPC). Но, интересно будет узнать другие решения, если они есть.
Итак, задача – самостоятельно генерировать PLUS3DOS заголовок, ну, который 128 байт в начале файла для +3DOS. Понятно, что вопрос, по сути, сводится к «как посчитать контрольную сумму?» Lua – ответ очевидный, а вот какие ещё вашидоказательстваварианты?
P.S. свой вариант на «чистом» asm пока не привожу, там, скорее идея – работать оно, почему-то, работает, но не так, как я ожидал.
Я тоже засел как-то с алгоритмом из-за того, что "SUB A,B" превратились этим ассемблером в два опкода - "SUB A" и затем "SUB B", что было ФАТАЛЬНО не тем, что мне нужно было. Главное, такие ошибки довольно трудно-отлавливаемые. Нахрена такие "фичи" добавлять, не понятно. Такие фичи должны быть включаемыми и по умолчанию выключенными, а не включенными и хрен знает как выключаемыми. Ну или они ХОТЯ БЫ должны быть корректно реализованы. В данном случае, по моему мнению, реализованы они некорректно, потому что мнемоникой предполагается синтаксис SUB [A,]B, и если конкретный ассемблер sjasm хочет как-то расширить синтаксис в этом месте, то должен учитывать необязательный неявный "A," вначале списка, а не тупо собирать кучу команд по списку регистров. Это мое мнение. Считаю, что здесь все же ошибка реализации. Вначале нужно удалить A из начала списка, затем уже реализовывать свои фантазии, и проблем ни у кого не возникло бы. И если кому-то нужно будет зачем-то получить ряд инструкций, начиная с регистра A (понятия не имею, зачем), то пусть пишет SUB A,A,B,C,D, и так далее, на здоровье, сколько угодно (т.е. все ноль раз), а не я вместе со всеми должен страдать, выискивая дизасмом, почему корректный алгоритм не работает. Ped7g пишет, что
но вместо того, чтобы помочь мне, программисту, создал еще больше проблем. Да нормальный тут у Зилога синтаксис. В SUB, AND, OR, XOR, CP не указывается A, потому что нет одноименных инструкций, работающих не с A. А у ADD, ADC, SBC указывается A, потому что есть еще ADD|ADC|SBC rp,rp, и возникла бы неопределенность. Обязан ли я помнить такие моменты, что SBC надо писать с A, а SUB - без A? Не обязан. Тут скорее неправильное трактование этого официального синтаксиса автором ассемблера, который В ПЕРВУЮ ОЧЕРЕДЬ должен был ПОМОЧЬ программисту с написанием программы, либо убрав "A,", либо, в крайнем случае, подсказывая ему о таких моментах предупреждениями или ошибками. Уж точно не мешать своими "фичами", трактуя код как-то по-своему, как какой-то сумасшедший. Ну два возможных варианта, автор. Тут не предусмотрено варианта - наассемблировать какой-то херни. Своими такими вот "фичами" "помогать" ассемблер должен где-то в десятую очередь, и то, если такой запрос поступил. А у нас тут в этом месте происходит конкретное такое вредительство, и иначе это не назвать. И, главное, куча человек уже написали о проблемах в этом месте, все опытные, уже с 30+ опытом программирования, но нет, "я - художник, я так вижу". Браво.
Решение проблемы двойными запятыми - костыльное, но да, работает. Добавил "OPT --syntax=abf", как рекомендует Ped7g, это работает. Но это костыль, потому что проблема, на мой взгляд, как я сказал, в реализации "фичи", а не в количестве запятых. Не понимаю, почему я должен добавлять какую-то хрень в код, чтобы наконец-таки получить чистый ассемблер. Ну окей, я свои личные проблемы решил добавлением директивы, но в ассемблере так и осталась некорректная реализация фичи. Ну это такова в целом философия автора, которая идет вразрез с моей философией. Я считаю, что база должна работать из коробки, а автор, очевидно, считает, что я вначале обязан использовать его выдуманные директивы, указать устройство, чтобы хотя бы что-то начало работать, например, зачем-то указать NOSLOT, чтобы ассемблировать по нулевому адресу, и что-то еще указывать, чтобы начать получать в итоге базовую базу, а не чьи-то фантазии на тему SUB A: SUB B.
И чего еще мне не хватило - это добавления \x## (16-чное 2-разрядное число) последовательностей в строковых параметрах для указания управляющих символов. И это для Спектрума, где куча управляющих символов, всякие управляющие AT, INK, PAPER, и т.д. Это я не понял, почему было не добавить. Серьезно, никому в голову не пришло сделать?! Очевидная же штука, казалось бы. Но нет.
В остальном, все супер, но я макросы не использовал, много в какие дебри не лез. ALIGN попользовал для выравнивания кода в паре мест - отлично подошло, DISP отлично работает. Какими-то другими изысками не пользовался. Половинками индексных регистров тоже, мне сподручнее было написать DEFB #FD и LD L,A, чем пользоваться фейками. В общем, мне вообще мало что нужно для счастья, так что я скорее всем доволен.
I don't understand the:
DEFB #FD : LD L,A
vs normal instruction
LD IYL,A ; or LD YL,A or LD LY,A, whichever way you prefer
Or how does it relates to "fakes"? These are regular undocumented opcodes. "fake" instructions are something different: https://z00m128.github.io/sjasmplus/...e_instructions.
The \x escapes are somewhere on my TODO list.
About default syntax... :shrug: I didn't design it, I'm not happy with multi-arg for `sub` myself. I may eventually switch defaults in some major-major version, but considering how much whining I get whenever I change something, I'm not in a hurry...
Подскажите SjASMPlus работает в Windows10 ?
Тогда как правильно настроить SjASMPlus (в Windows10) ?
Для редактирования текста на ассемблере использую NOTEPAD++, в нём по F5 запускаю .bat файл
В файле .bat для компиляции текста написано следующее:
start "" C:\DownLoad\QASW\sjasmplus.exe main107sova.asm
В тексте main107sova.asm вконце написано следующее:
SAVESNA "C:\DownLoad\ku.sna"
В итоге после запуска по F5 ничего не получается - файла ku.sna нет.
Похоже я что-то напутал или неправильно записал, подскажите как нужно сделать ?
Сделай dir >a и посмотри, сколько уровней у тебя до корневого директория, где расположен sjasmplus.exe .
Например, у меня исходник на ассемблере здесь h:\SJASMPLUS\zxcc
И поэтому мой командник compile.bat , расположенный в моем директории h:\SJASMPLUS\zxcc делает это
в конце файла .asm должно бытьКод:..\sjasmplus output.asm 1>err1
pause
SAVESNA "output.sna", main
если он начинается так
Если у тебя исходник расположен глубже - количество ..\ увеличивается.Код:DEVICE ZXSPECTRUM48
org 32768
main:
...
ld a, 2
...
Других команд добавлять не требуется. Можешь конечно прописать path к sjasmplus и тогда просто запускать ассемблирование по
sjasmplus имя твоего исходника.asm
Ну куда уж проще, запусти командную строку с путём где у тебя лежит твой исходник и прям там запусти свой батник или прямо в ней напиши «sjasmplus "имя твоего исходника.asm"».
Если есть какие-то проблемы с запуском, нехваткой библиотек итд, сразу увидишь. А так можно гадать до второго пришествия.
Именно так я и делаю :)
Видно что появляется окно и тут же исчезает, поэтому узнать что там не так не получается.
- - - Добавлено - - -
Меня вот это настораживает:
Цитата из описания к SjASMPlus: "SjASMPlus — это кросс-компилятор языка ассемблера Z80. Он доступен для систем Win32"
Обзор от ИИ: "Да, файл Win32 (32-разрядный) может работать в 64-разрядной версии Windows, но не всегда. 64-разрядные версии Windows включают среду совместимости под названием WoW64, которая позволяет запускать 32-разрядные приложения. Однако, есть некоторые ограничения и случаи, когда 32-разрядные приложения могут не работать или работать некорректно на 64-разрядной системе. "
Может ли так быть что у кого-то SjASMPlus работает в Windows10 а у кого-то нет ?
Пробуем разобраться.
1. создаём новую папочку
2. кладём в папочку sjasm (взятый здесь https://github.com/z00m128/sjasmplus...es/tag/v1.21.0 , нужен только sjasmplus.exe файл)
3. и файлик с исходником, который хотим компилить, например, mygame.asm
4. запускаем командную строку (в поиски винды пишем cmd , выскочит диалог выбора, там должно быть cmd.exe)
5. в появившемся чёрном окне с текстовым режимом переходим в нашу папочку
- узнать текущее место и рядом находящиеся файлы/папки можно написав команду dir и нажав enter
- перейти в папку при помощи cd имяпапки (если имя папки содержит пробел, то нужно писать в двойных кавычках)
- перейти на уровень выше при помощи cd .. (две точки)
- можно сразу перейти в нужное место, например cd "C:\work\my project"
6. находясь в нашей папочке даём команду sjasmplus.exe mygame.asm
7. наблюдаем, что ассемблер выплюнул в окно - там могут быть как сообщение, что всё хорошо, так и ошибки
8. если всё хорошо, рядом с исходником должен появиться скомпилированный файлКод:SjASMPlus Z80 Cross-Assembler v1.21.0 (https://github.com/z00m128/sjasmplus)
Pass 1 complete (0 errors)
Pass 2 complete (0 errors)
Pass 3 complete
Errors: 0, warnings: 0, compiled: 15 lines, work time: 0.000 seconds
P.S.
отключить лишний вывод при компиляции можно таким образом
sjasmplus.exe --msg=war --nologo mygame.asm
P.P.S.
пример исходника:
Код:DEVICE ZXSPECTRUM48
org $8000
start:
ld hl, $4000
ld b, 0
loop:
ld (hl), l
inc hl
djnz loop
jr $
SAVESNA "mygame.sna", start
Дело пошло лучше :)
Выдаёт следующее:
C:\DownLoad\sjasm> sjasmplus.exe output.asm
SjASMPlus Z80 Cross-Assembler v1.21.0 (https://github.com/z00m128/sjasmplus)
Pass 1 complete (0 errors)
Pass 2 complete (0 errors)
output.asm(1): error: Unrecognized instruction: ZXSPECTRUM48
output.asm(13): error: SAVESNA only allowed in real device emulation mode (See DEVICE)
Pass 3 complete
Errors: 2, warnings: 0, compiled: 13 lines, work time: 0.000 seconds
C:\DownLoad\sjasm>
файла .sna попрежнему нет
- - - Добавлено - - -
заменил DEVICE ZXSPECTRUM48 на device zxspectrum48
и всё получилось !! :) Спасибо всем кто помогал !!
- - - Добавлено - - -
До этого по сути делал тоже самое - только без информации компилятора.
Вот может кому-то пригодится - если вы используете оболочку например UnrealCommander или TotalCommander,
то там можно всё сделать быстрее (только при этом информации sjasmplus не выдаёт)
навести курсор на sjasmplus.exe и нажать Ctrl+Enter (в командной строке оболочки например UnrealCommander появится sjasmplus.exe),
потом навести курсор на ваш файл исходник name.asm и нажать Ctrl+Enter (в командной строке оболочки появится name.asm),
и далее нажать Enter - произойдёт компиляция и появится файл .sna
Просто DEVICE ZXSPECTRUM48 не должно начинаться в нулевом столбце. А регистр роли не играет. Для чего так сделано - это вопрос к разработчикам SJASMPLUS.
потому что с 0 столбца расположена метка.
Можно скрипты прилепить без .bat, могу скинуть (модифицированные немного, через выделение имени) или в инете найти можно стандартные.
Но лучше переходи на vscode, намного удобнее, notepad++ и 10-ой части не делает. Если интересно, то могу скинуть настройки в vscode, самых дурных опций и скрипты запуска проекта.
Для vscode.
Установить не сложно, в документации к DeZog есть рекомендации, какие надстройки подходят.
Актуальные надстройки
DeZog
To use DeZog in Visual Studio Code, simply install the "DeZog" extension (maziac.dezog) from the Visual Studio Code Marketplace. Although not required, there are several other helpful extensions available, including:
ASM Code Lens, which provides syntax highlighting for Z80 assembler, as well as completions, references, jump to label, and renaming functionality.
Z80 Instruction Set, which displays opcode, affected flags, and a description when hovering over a Z80 instruction.
Hex Hover Converter, which converts numbers to decimal, hexadecimal, and binary formats when hovering over them.
ZX SNA File Viewer/ZX NEX File Viewer, which allow viewing of ZX Spectrum snapshot (.sna) and ZX Spectrum Next (.nex) files (search for "snafile" and "nexfile" in the Marketplace).
ZX81 BASIC to P-File Converter and P-File Viewer, which converts ZX81 P-Files (.p) to ZX81 BASIC (.bas) and vice versa.[свернуть]
В приложении, скрипты, для запуска разных вариантов эмуляторов, с переключением страниц (64 страницы) для ZSim (ZSim Custom Memory), для режима debug. Псевдо-порты переключения страниц, прописаны в скриптах. Нужно только поменять пути к файлу запуска проекта и путь к sjasm.
Опции самого vscode:
Editor: Quick Suggestions Delay
Управляет длительностью задержки (в мс) перед отображением кратких предложений. (1000)
Editor › Hover: Delay
Определяет время задержки в миллисекундах перед отображением наведения. (1000)
Ctrl + Shift + P
Configure Display Language
Editor: Auto Closing Comments
Определяет, должен ли редактор автоматически закрывать комментарии,
при добавлении пользователем открывающего комментария. (never)
Autohide
Определяет, скрыта ли мини-карта автоматически. (Enable)
Editor: Selection Highlight
Определяет, должен ли редактор выделять совпадения, аналогичные выбранному фрагменту. (disable)
Editor: Occurrences Highlight
Определяет, следует ли выделять вхождения в открытых файлах. (off)
Editor: Color Decorators
Определяет, должны ли в редакторе отображаться внутренние декораторы цвета и средство выбора цвета. (disable)
(если написать текст и набрать позже #NNNNNN, то он прибавляет квадрат к тексту, где можно выбирать палитру)
[свернуть]
Для Notepadplus.
Т.к. у меня исходники и бинарники разложены по разным папкам, стандартный скрипт не может уловить путь откуда запускать скомпилированный файл. Пришлось пойти на хитрость и просто выделять этот путь перед компиляцией и запуском. Пример, SAVESNA "..//BIN//main.sna" - здесь выделяется отрезок ..//BIN. Т.к. Notepadplus используется очень редко, то это не критично.
Compile-SJAsm
Код:// [Ctrl+F9] Скрипт компиляции проекта
// Сохраняем все файлы
//REM/ npp_saveall
npp_save
// Сохраняем путь текущего редактируемого файла
set current = $(FULL_CURRENT_PATH)
// Переключаемся на основной файл проекта (должен быть открыт в 1-ой вкладке!)
//REM/ npp_switch $(#1)
// Получаем полные имена файла меток и основного файла проекта
set symbol_name = "$(CURRENT_DIRECTORY)/$(SELECTED_TEXT)/$(NAME_PART).sym"
set project_full_name = "$(FULL_CURRENT_PATH)"
// возвращаемся на ранее открытую вкладку
//REM/ npp_switch $(current)
// компилируем проект
cd $(project_full_name)
"$(NPP_DIRECTORY)/../SJAsm/sjasmplus.exe" --fullpath --sym=$(symbol_name) $(project_full_name)
[свернуть]
sna-SJAsm-Unreal
Код:// [F9] Скрипт компиляции и запуска проекта
// Сохраняем все файлы
//REM/ npp_saveall
npp_save
// Сохраняем путь текущего редактируемого файла
set current = $(FULL_CURRENT_PATH)
// Переключаемся на основной файл проекта (должен быть открыт в 1-ой вкладке!)
//REM/ npp_switch $(#1)
// Получаем необходимые имена файлов
//REM/ set image_name = "$(CURRENT_DIRECTORY)\$(NAME_PART).trd"
set image_name = "$(CURRENT_DIRECTORY)/$(SELECTED_TEXT)/$(NAME_PART).sna"
set image_dir = "$(CURRENT_DIRECTORY)/$(SELECTED_TEXT)/"
set symbol_name = "$(CURRENT_DIRECTORY)/$(SELECTED_TEXT)/$(NAME_PART).sym"
set project_full_name = "$(FULL_CURRENT_PATH)"
// Возвращаемся на ранее открытую вкладку
//REM/ npp_switch $(current)
// Компилируем проект
cd $(project_full_name)
"$(NPP_DIRECTORY)/../SJAsm/sjasmplus.exe" --fullpath --sym=$(symbol_name) $(project_full_name)
// запускаем откомпилированный проект
cd $(image_dir)
"$(NPP_DIRECTORY)/../Unreal/unreal.exe" $(image_name)
[свернуть]
Unreal-Run-a80
Код:// [F10] Скрипт запуска проекта
// Сохраняем путь текущего редактируемого файла
set current = $(FULL_CURRENT_PATH)
// переключаемся на основной файл проекта (должен быть открыт в 1-ой вкладке!)
//REM/ npp_switch $(#1)
// Получаем полное имя образа диска с откомпилированным проектом для запуска
// (если вы компилируете в sna, поменяйте расширение на нужное)
set image_name = "$(CURRENT_DIRECTORY)/$(SELECTED_TEXT)/$(NAME_PART).sna"
set image_dir = "$(CURRENT_DIRECTORY)/$(SELECTED_TEXT)/"
// Возвращаемся на ранее открытую вкладку
//REM/ npp_switch $(current)
// Запускаем откомпилированный проект
cd $(image_dir)
"$(NPP_DIRECTORY)/../Unreal/unreal.exe" $(image_name)
[свернуть]
Ped7g , а можете реализовать поддержку особых макросов с неопределённым количеством параметров, чтоб от ни одного до много-много ? ;)
Я тут подумал - в ZASM, в макрос можно передавать неопределённое количество параметров или не передавать вовсе, при этом доступ к ним осуществляется через =1 , =2 и т.д. Пример:
NAME macro : ld hl,=1 : ld de,=2 :endm
но там из-за многих ограничений эта фича преимуществ не даёт. А вот в SjASMplus с его Lua scripting , можно будет реализовывать довольно гибкие макросы, например реализовать какую-либо особую перекодировку строк символов в стиле записи в формате DEFB. Или что-то более сложное.
У нас конечно знак '=' не подойдёт, да и чтобы не ломать проверки, этот макрос лучше оформлять отдельной командой . Например использовать слово 'macro$' или 'macro+' или что-то подобное.
Типа :
Чтобы данный макрос можно было бы использовать как без параметров, так и с параметрами, количество которых не ограничено.Код:macro$ <name>
....
endm
Пусть например введённые параметры принимают имена по порядку p1 , p2 , ... , p10 , p11 , ... , p100 ... и так далее, а p0 , как в bash скриптах, показывает номер последнего параметра.
А если две запятые идут друг за другом или через пробел, то значит параметр пустая строка (без кавычек)
Lua функция sj.get_define("name", true) при отсутствии параметра в таком макросе пусть не орёт про ошибку, а выдаёт обычный nil
Как смотрите на такое возможное дополнение ?
Столкнулся с дурацкой ситуацией, которую пока не знаю как правильно решить. Прошу помощи!
Я переделывал код Z80 в код i8080. Отсутствующие у i8080 заменял макросами. А чтобы не плодить огромную кучу похожих макросов я сделал универсальные макросы, которые принимают на вход имя регистра. Внутри макроса по имени переданного регистра я выполняю определённые действия. Но проблема в том, что я не нашёл как делать условия правильно, чтобы оно срабатывало с передаваемым именем.
Пример:
Ни одно из условий не выполнится. Я пробовал и кавычки и много чего ещё. Чаще всего получаю ошибку на отсутствующую метку.Код:macro instr reg1, reg2
if reg1 == A
; some code
if reg2 == H
; some code
endm
instr A, C
В итоге после череды всевозможных проб и ошибок закостылил так:
Вот так работает, но в итоге имеем лишних 7 байт на константы. Причём в конец кода их перекинуть нельзя, так как они должны находится перед первым вызовом макроса.Код:macro instr reg1, reg2
if reg1 == A
; some code
if reg2 == H
; some code
endm
A: db "A"
B: db "B"
C: db "C"
D: db "D"
E: db "E"
H: db "H"
L: db "L"
instr A, C
Имена регистров, в данном случае, как символы не определены. Во втором случае им будут соответствовать адреса букв. Сравнивать можно только числа. Определи имена регистров как числа от 0 до 7. Удобнее будет если B=0, C=1, и т.д., тогда их можно будет прямо к коду операции 8080 добавлять.