Просто DEVICE ZXSPECTRUM48 не должно начинаться в нулевом столбце. А регистр роли не играет. Для чего так сделано - это вопрос к разработчикам SJASMPLUS.
Просто DEVICE ZXSPECTRUM48 не должно начинаться в нулевом столбце. А регистр роли не играет. Для чего так сделано - это вопрос к разработчикам SJASMPLUS.
Последний раз редактировалось andrews; 17.06.2025 в 13:15.
metamorpho(17.06.2025)
потому что с 0 столбца расположена метка.
Личка заполнена! И чистить я ее не буду! Пользуйтесь адекватными средствами связи! Спасибо.
Seamos realistas y hagamos lo imposible!
Ernesto Che GuevaraПереехал сюда: SteinBlume (ex ATM CP/M Explorer)
http://era-cg.su
metamorpho(17.06.2025)
Можно скрипты прилепить без .bat, могу скинуть (модифицированные немного, через выделение имени) или в инете найти можно стандартные.
Но лучше переходи на vscode, намного удобнее, notepad++ и 10-ой части не делает. Если интересно, то могу скинуть настройки в vscode, самых дурных опций и скрипты запуска проекта.
metamorpho(17.06.2025)
Личка заполнена! И чистить я ее не буду! Пользуйтесь адекватными средствами связи! Спасибо.
Seamos realistas y hagamos lo imposible!
Ernesto Che GuevaraПереехал сюда: SteinBlume (ex ATM CP/M Explorer)
http://era-cg.su
Для 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)[свернуть]
Последний раз редактировалось Biland; 18.06.2025 в 15:07.
metamorpho(18.06.2025)
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
Вектор-06Ц reboothttp://metamorpho-games.blogspot.com/p/blog-page.html
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
Как смотрите на такое возможное дополнение ?
Последний раз редактировалось Dart Alver; 18.06.2025 в 22:38. Причина: --
Столкнулся с дурацкой ситуацией, которую пока не знаю как правильно решить. Прошу помощи!
Я переделывал код 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 добавлять.
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)