Я на линуксе. Нашел уже.
Вид для печати
По ошибке есть прогресс ?
Код:# sh compile.sh
SjASMPlus Z80 Cross-Assembler v1.07 RC8 (build 06-11-2008)
Pass 1 complete (0 errors)
Pass 2 complete (0 errors)
Code.a80(92): error: Label not found: AER.MainCode.Logo.rnd
Pass 3 complete
Errors: 1, warnings: 0, compiled: 452 lines, work time: 0.003 seconds
Код:# grep rnd AER.sym AER.sym.orig
AER.sym:AER.boot.Logo.rnd: equ 0x00005D9D
AER.sym:rnd: equ 0x00000000
AER.sym:AER.MainCode.Logo.rnd: equ 0x00000000
AER.sym:Logo.rnd: equ 0x00000000
AER.sym.orig:Logo.rnd: equ 0x00005D9D
AER.sym.orig:rnd: equ 0x00000000
AER.sym.orig:MainCode.Logo.rnd: equ 0x00000000
Нет баги - нет прогресса.
Данная бага не была отмечена на моем форке проекта на гитхабе, а значит не существует, уж извините.
Vitamin, у меня к тебе предложение. Можешь добавить команды SAVETAP и SAVESCL в Sjasm? Сурцов сторонних утилит полно, сам знаешь, наверное не так сложно сделать. А то каждый свои глюки плодит, утомило.
Говоря откровенно- это бред. Компилятор всего лишь должен создавать бинарь из текста. А что с этим бинарем делать- вопрос отдельный и решается отдельными утилитами. Нужно четкое разделение обязанностей компонентов- редактор, компилятор, компрессор, линковщик, архиватор, конвертер.
У тебя кстати два бага в багтрекере год висят. Я подозреваю, тут дело не в том, что это хрень...
Я вообще считаю, что это всего лишь запись бинарника в разные места. Принципиальной разницы между бинарником в контейнере и бинарником в папке я собственно не вижу.
Вот один баг (про условия в макросах) - как раз последствия недоработок в ядре. Так просто не лечится. А второй- далекая от меня область (системные переменные). Проверить нормально не смогу.
А потом прикрутить встроенный компрессор, встроенный архиватор зипа, 7зипа и рара и т.п. Ну а фигли? Принципиальной разницы же нет.
Строчка в первом посте этой темы.
1.07rc8
Только что столкнулся с такой штукой - INCLUDE (наверное, INCBIN и похожие тоже) непривычно работает с относительными путями. Полный путь рассчитывается не от текущего файла, а от директории запуска sjasmplus. Например:
main.asm : INCLUDE "gamedata/data.asm"
gamedata/data.asm : INCLUDE "items.asm"
Сначала я полагал, что items.asm тоже должен лежать в gamedata, а нифига - не видит он его при таком обращении.
ПС : всю тему не читал. Если это где-то исправлено, скажите версию и где её взять.
Ага, вот валяются инклуды неизвестно где, почему-то кодеры забывают выложить исходники разом..
Я из комстроки работаю, как сейчас мне вообще неудобно. Я запускаю sjasmplus main.asm и ожидаю, что все инклюды в инклюдах там сработают так же, как при работе gcc.
Может, я плохо объясняю, но вот пример - инклюд из инклюда из вложеной директории. При попытке скомпилить main.asm идёт ругань на несуществующий items.asm:А если выйти на уровень выше и сделать sjasmplus project/main.asm, то он вообще ни одного инклюда не обработает.Код:sam@debian:~/data/temp/project$ sjasmplus main.asm
SjASMPlus Z80 Cross-Assembler v1.07 RC8 (build 06-11-2008)
gamedata/data.asm(6): error: Error opening file: items.asm
В принципе для всех, кто работает как сейчас, ничего не поменяется по-моему от того, если сделать инклюды как предлагает Sam Style.
В общем, поскольку 99% людей пользуется сборщиками (make, bat), а если и запускают - ходят в папку с проектом перед запуском - то это действительно несколько странный запрос. Несложно ж сделать мейк и не думать через год, чего там как собирается, разве не так?
SAM style, я посмотрел и придерживаюсь старой точки зрения. Если все библиотеки лежат в "include\...", логично что ты все библиотеки так именно и включаешь. Си имеет систему дополнительных папок, типа lib, которые прибиты гвоздями, сорри, считаются по относительным путям от экзешника. По идее, такие доп. пути сделали бы то, что тебе хочется.
Чтобы чётче прозвучало: я очень люблю проекты со 100500 файлами разбросанными по папкам, т.е. я очень активно использую и include, и incbin. Но то, что тебе хочется сделать, кажется мне актуальным только если гонять файлы из папки в папку. Обычно мне не хочется это сделать. Ты уверен, что ты именно что хочешь это сделать?
Я не очень люблю кучу файлов, а ещё больше не люблю, когда в огромных файлах каша из тонн кода и данных. Но проект разбух до такой степени, что неизбежно появится либо одно, либо другое.
Если сравнивать с Си, то Сджасмовские инклюды куда ближе к #include "file", чем к #include <file>. В первом случае никаких дополнительных путей не надо - путь у файлу рассчитывается относительно директории файла, из которого он подключен. Внезапно подумалось, что и здесь действует такой же подход, а нет...
introspec, а ты можешь припомнить другие тулзы, обрабатывающие инклюды относительно не текущего файла, а относительно текущей директории?
Нет. Это свойство процесса.
http://linux.die.net/man/3/getcwd
В с/с++ правила несколько сложнее.
http://gcc.gnu.org/onlinedocs/cpp/Search-Path.html
http://msdn.microsoft.com/ru-ru/library/36k2cdd4.aspxЦитата:
GCC looks for headers requested with #include "file" first in the directory containing the current file, then in the directories as specified by -iquote options, then in the same places it would have looked for a header requested with angle brackets. For example, if /usr/include/sys/stat.h contains #include "types.h", GCC looks for types.h first in /usr/include/sys, then in its usual search path.
Как видно, "текущий каталог процесса" тут никоим боком не присутствует, зато присутствует путь текущего файла.Цитата:
Препроцессор ищет включаемые файлы в следующем порядке:
В том же каталоге, где находится файл с оператором #include.
В каталогах открытых в данный момент включаемых файлов (в порядке, обратном тому, в котором они открывались). Поиск начинается в каталоге родительского включаемого файла, а затем выполняется в каталогах всех включаемых файлов-прародителей.
По путям, заданным всеми параметрами компилятора /I.
По путям, заданным в переменной среды INCLUDE.
Ну да, а как называется наш процесс при сборке из батника? "cmd"! Вот поэтому поведение компилятора си и кажется не до конца логичным: оно может работать только в рамках одной программы или пакета вместе написанных программ. При сборке лапшой из разного кода это не работает.
Подскажите, можно ли создать новую метку в макросе ?
что-то типа такого (это перебежал в PASM)
получаем такоеКод:macro xx, nn,hh,value
fn_ ## nn ## _h ## hh ## _i0:
ld a,value
jp do_fill
fn_ ## nn ## _h ## hh ## _i1:
ld a,value XOR 0xff
jp do_fill
endm
do_fill:
xx '1','0',11110000b
xx '2','0',01111000b
xx '3','0',00111100b
xx '4','0',00011110b
xx '5','0',00001111b
т.е конструируем имя теки из параметров.Код:do_fill EQU 00000H
fn_1_h0_i0 EQU 00000H
fn_1_h0_i1 EQU 00005H
fn_2_h0_i0 EQU 0000AH
fn_2_h0_i1 EQU 0000FH
fn_3_h0_i0 EQU 00014H
fn_3_h0_i1 EQU 00019H
fn_4_h0_i0 EQU 0001EH
fn_4_h0_i1 EQU 00023H
fn_5_h0_i0 EQU 00028H
fn_5_h0_i1 EQU 0002DH
такое еще m80 81года рождения умел.
---------- Post added at 16:37 ---------- Previous post was at 16:36 ----------
и заодно, можно ли в LUA скрипт параметр передать (типа как луа как макрос с параметром)
примеров в доке ЖУТКО не хватает.
спасибо, а вызывать как ?
пример бы
огромное спасибо!
с одной стороны круто иметь встроенный язык
с другой - выглядит со стороны это как ... что-то пришитое сбоку :(
И снова я с тупыми вопросами. Попытался вникнуть в структуры:На выхлопе получаюКод:DEVICE ZXSPECTRUM128
STRUCT SCOLOR
RED BYTE 0
GREEN WORD 0
BLUE WORD 0
ENDS
org 0x6000
Loop jr Loop
Table SCOLOR 1,2,3
SCOLOR 4,5,6
SAVESNA "test.sna",0x6000
Т.е выделение памяти под структуру с меткой проходит, а без метки - ошибка. Хотя в мануале Example 6.4. описывает таблицу структур:Код:main.asm(14): error: Unrecognized instruction: SCOLOR 4,5,6
WTF?Код:Or without label:
COLORTABLE
SCOLOR 0,0,0
SCOLOR 1,2,3
SCOLOR ,2
; etc.
Нормальные вопросы.
Для начала пример рабочей структуры:
Этим мы создали ТИП ДАННЫХ "структура BMHD".Код:STRUCT BMHD,0
_W WORD 0
_H WORD 0
_X WORD 0
_Y WORD 0
nPlanes BYTE 0
masking BYTE 0
compress BYTE 0
pad BYTE 0
transparency WORD 0
xAspectRatio BYTE 0
yAspectRatio BYTE 0
PageWidth WORD 0
PageHeight WORD 0
ENDS
А это объявление конкретной переменной этого типа:
В данном случае она пустая, потому что данные в неё будут считаны из файла.Код:@MyBMHD: DS BMHD,0
Если тебе надо её проинициализировать "статично", то вместо ds надо использовать соответствено DB и DW и т.п.
Например:
Теперь для обращения к элементам структуры можно пользоваться их именами.Код:@MyBMHD: DW 1,2,3,4
DB 5,6,7,8
DW 9
DB 10,11
DW 12,13
Например:
Если что не понятно, спрашивай.Код:LD IX,MyBMHD
LD A,(IX+BMHD.nPlanes)
...
LD L,(IX+BMHD._W+1)
LD H,(IX+BMHD._W)
Нет, как оно работает, я вкурил. Вопрос в том, почему нельзя сделать таблицу структур, не присобачивая к каждой метку (пусть и временную).
В документации расписано, что конструкция <ИМЯ_СТРУКТУРЫ> [значения полей,...] должно выделять в памяти область под структуру и заполнять её значениями, то есть можно указать так:и всё должно быть хорошо, пропущенные поля инициализируются значениями по умолчанию.Код:BMHD 5,6,7,8
Но, оказывается, разместить такую конструкцию без метки в начале строки нельзя:Имеющуюся у меня документацию прилагаю. См. Chapter 6. Structures, особенно Example 6.4. - реальное поведение сджасма не совпадает с документированным.Код:Label BMHD 5,6,7,8 ; это скомпилируется, выделит память, заполнит её и даже потом можно обращаться к элементам через Label._W, Label._H итд
BHMD 5,6,7,8 ; а это - не скомпилируется
А-аааааааа! Всё ПРАПАЛО! ПОДСТАВА! ИЗМЕНА! НАС ПРЕДАЛИ!!!
Опция "--raw=<filename>" не работает! Я так понял, она должна "насильно" сохранять результат компиляций в бинарник с заданным именем, - ничего подобного - файл получается пустой, длина = 0.
Кто может пофиксить? А то эта бага мне автоматизацию ломает :(