Просмотр полной версии : SjASMPlus Z80 кросс ассемблер
Страницы :
1
2
3
4
[
5]
6
7
SAM style
14.07.2014, 01:34
А где его брать-то? - у меня rc7 :(
Я его сам себе под линукс собрал из этого - https://github.com/mkoloberdin/sjasmplus
Он выводит SjASMPlus Z80 Cross-Assembler v1.07 RC8 (build 06-11-2008).
Как перегнать файл tasma (вложен) в asm (для cjASM+)
Как перегнать файл tasma (вложен) в asm (для cjASM+)
С помощью Far Manager + theX (http://thex.untergrund.net/) открыть, и сохранить как текстовый файл.
COLOR EQU 12
KOR_Y EQU 10
KOR_X EQU 15
ORG #8000
LD HL,KOR_Y*256+KOR_X
LD A,H
AND 7
RRCA
RRCA
RRCA
ADD A,L
LD L,A
LD A,H
RRA
RRA
RRA
AND 3
OR #58
LD H,A
LD (HL),COLOR
RET
Shadow Maker
13.11.2014, 23:59
Запускаешь http://logtech.ru/far.zip и жмешь ентер на нужном файле, потом F5 оттуда или выделяешь и вставляешь куда надо текст...
Запускаешь http://logtech.ru/far.zip и жмешь ентер
Сразу пишет :
Указанному файлу не сопоставлено ни одно приложение для выполнения данной оерации
Shadow Maker
14.11.2014, 00:28
Ну надо было или хобету, или TRD или SCL открывать с этим файлом. Far-то откуда знает, что это у тебя тасм. Возьми тот образ, откуда ты его выковырял, внутрь зайди и нажми ентер на этом файле.
Ну надо было или хобету, или TRD или SCL открывать с этим файлом. Far-то откуда знает, что это у тебя тасм. Возьми тот образ, откуда ты его выковырял, внутрь зайди и нажми ентер на этом файле.
Я так и делаю
он у тебя внутрь TRD заходит?
ты точно заюзал версию FAR на которую ссылку тебе ShadowMaker дал?
Разобрался. Всем Большое спасибо.
SAM style
02.12.2014, 17:37
Снова я со своими извращениями. Можно ли в sjasm+ получить длину определенного файла? Суть такова: у меня есть куча файлов, которые в программе должны подгружаться в память, и надо составить таблицу длин (в секторах) этих файлов. Пока сообразил только такую конструкцию:
org 0xc000
incbin "overlay00.bin"
align 256
ovr00Size equ high $ - 0xc0А хотелось бы как-то проще.
Shadow Maker
02.12.2014, 18:57
Ну я тоже примерно так же считаю
sp_in INCBIN "_packed/sp_intr.bin"
sp_in_
ld a,high (sp_in_-sp_in+255)
странные макросы - одна из причин почему я соскочил с sjasm+ на zmac
(может я не умею его готовить?)
на нем это на раз
я так понимаю это будет работать и в m80
x macro name,lenlabel
local .a
.a equ $
incbin name
lenlabel equ $-.a
endm
x "test.asm",len1
x "dd/test.cas",len2
x "dd/test.cim",len3
dw len1
dw len2
dw len3
end
с "разворотом" макросов
1:
2: x macro name,lenlabel
3: local .a
4: .a equ $
5: incbin name
6: lenlabel equ $-.a
7: endm
8:
9: - 0000 x "test.asm",len1
9: - 0000 ?c0000 equ $
9: - 0000 .. 00DB incbin "test.asm"
9: - 00DC len1 equ $-?c0000
9: - 00DC endm
10: - 00DC x "dd/test.cas",len2
10: - 00DC ?c0001 equ $
10: - 00DC .. 02ED incbin "dd/test.cas"
10: - 0212 len2 equ $-?c0001
10: - 02EE endm
11: - 02EE x "dd/test.cim",len3
11: - 02EE ?c0002 equ $
11: - 02EE .. 03CF incbin "dd/test.cim"
11: - 00E2 len3 equ $-?c0002
11: - 03D0 endm
12:
13: - 03D0 DC00 dw len1
14: - 03D2 1202 dw len2
15: - 03D4 E200 dw len3
16:
17: - 03D6 end
Statistics:
4 passes
0 jr promotions
6 symbols
982 bytes
3 macro calls
54 macro bytes
12 invented symbols
Symbol Table:
?c0000 = 0
?c0001 = dc
?c0002 = 2ee
len1 = dc
len2 = 212
len3 = e2
SAM style
02.12.2014, 20:55
эмммм... а тебе зачем?
Автосборку большого проекта делаю. Хочется автоматизации, чтобы не править руками в нескольких местах, если один из файлов станет длинее/короче.
я так понимаю это будет работать и в m80Одно отличие - мне не надо держать файлы в памяти, мне надо просто таблицу их длин, причем не в байтах, а в секторах. Сами файлы будут запиханы в trd-образ.
Намонстрячил уже на баше генерилку нужной таблицы...
# build script & gfx overlays & generate overlays size table
echo "; Nocturne overlays size table\n" > ovrtable.asm
for NUM in 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36; do
if [ -d ovl/ovl${NUM} ]; then
make -C ovl/ovl${NUM}
fi
if [ -e ovl/bin/ovl${NUM}c.hr1 ]; then
SIZE=`stat -c %s ovl/bin/ovl${NUM}c.hr1`
if [ $((${SIZE} & 255)) -gt 0 ]; then
CSZ=$((${SIZE}/256 + 1))
else
CSZ=$((${SIZE}/256))
fi
else
CSZ=0
fi
if [ -e ovl/bin/ovl${NUM}g.bin ]; then
SIZE=`stat -c %s ovl/bin/ovl${NUM}g.bin`
if [ $((${SIZE} & 255)) -gt 0 ]; then
GSZ=$((${SIZE}/256 + 1))
else
GSZ=$((${SIZE}/256))
fi
else
GSZ=0
fi
echo "\tdb ${CSZ}, ${GSZ}, 0, 0\t\t;${NUM}" >> ovrtable.asm
done
так а чем вариант шадомахера не подошёл? через в ДБ-табличку я думаю там тоже всё нормально запилится...
SAM style
02.12.2014, 21:26
так а чем вариант шадомахера не подошёл? через в ДБ-табличку я думаю там тоже всё нормально запилится...Почти то же, что я вначале писал - грузим, замеряем, главное загруженное в выхлоп не включать. Нормально, когда файлов немного, но когда их больше 30...
Shadow Maker
02.12.2014, 21:38
Почти то же, что я вначале писал - грузим, замеряем, главное загруженное в выхлоп не включать. Нормально, когда файлов немного, но когда их больше 30...
Ну используй луа-скрипт тогда для генерации. Левые какие-то генерилки на баше - не кошерно.
Хотя по-моему у тебя для вызова все равно надо передавать имя файла, разницы тогда? Один раз себе текст накопипастил типа как я до этого написал и забыл, не? Ты ж не в каждом проекте это будешь делать. У меня например есть php-скрипт, который генерит мне фигню типа:
page 0
org #4000
dehrust
INCBIN "dehrust.bin"
dehrust_
SAVETRD "bloodwych.trd","dehrust.C",dehrust,dehrust_-dehrust
dehrust_len equ dehrust_-dehrust
page 0
org #4000
mode48
INCBIN "Files/mode48.bin"
mode48_
SAVETRD "bloodwych.trd","mode48.C",mode48,mode48_-mode48
mode48_len equ mode48_-mode48
page 0
org #4000
loadscr
INCBIN "Files/loadscr.bin"
loadscr_
SAVETRD "bloodwych.trd","loadscr.C",loadscr,loadscr_-loadscr
loadscr_len equ loadscr_-loadscr
которую я потом инклюжу (или не инклюжу, если там никакие файлы не меняются).
SAM style
02.12.2014, 21:56
Ты ж не в каждом проекте это будешь делать.Это единоразово, старое копаю...
Shadow Maker
02.12.2014, 23:24
Ну тем более, чего больно заморачиваться, один раз накопипастил вон фигней и всё. И что-то давно не слышно про новое - когда демка-то будет?
SAM style
02.12.2014, 23:41
И что-то давно не слышно про новое - когда демка-то будет?Какая демка? Всё готово, только музыку жду и финалкат придумываю:
http://samstyle.narod.ru/project/fght01.png
А по теме:
device zxspectrum128
org 0x8000
disp 0
dw t1
dw t2
dw t3
t1 ds 6912
t2 ds 8922
t3 ds 10222
siz equ $
ent
savebin "out",0x8000,siz
sjasmplus валится, хотя бинарник сохраняет. С device zxspectrum48 отрабатывает без аварий.
Снова я со своими извращениями. Можно ли в sjasm+ получить длину определенного файла? Суть такова: у меня есть куча файлов, которые в программе должны подгружаться в память, и надо составить таблицу длин (в секторах) этих файлов. Пока сообразил только такую конструкцию:
org 0xc000
incbin "overlay00.bin"
align 256
ovr00Size equ high $ - 0xc0А хотелось бы как-то проще.
У меня получилось как-то так:
device zxspectrum48
org 0x4000
LUA ALLPASS
function filesize(filename, varname)
local fp = assert(io.open(filename, "rb"))
local size = fp:seek("end")
sj.parse_line(varname .. " DW " .. tostring(size))
end
ENDLUA
LUA ALLPASS
filesize("test.asm", "mysize")
ENDLUA
denpopov
03.12.2014, 07:12
э?
device zxspectrum128
ORG #6000
begin
end
display /d,end-begin
savesna "!void.sna",begin
Shadow Maker
03.12.2014, 11:52
Какая демка? Всё готово, только музыку жду и финалкат придумываю:
Демка для поддержания интереса же и рекламы.
А по теме: sjasmplus валится, хотя бинарник сохраняет. С device zxspectrum48 отрабатывает без аварий.
Ну да, есть такая фигня.
Демка для поддержания интереса же и рекламы.Да там игра у него уже готовая.... если только видео небольшое запилить, или слайдшой под музыку...
Shadow Maker
03.12.2014, 14:15
Ну и? Предысторию можно на пару локаций запилить. Короче забыли, ладно.
Ну и? Предысторию можно на пару локаций запилить. Короче забыли, ладно.я чтоли делать буду? если автору нада будет - сам запилит....
SAM style
09.12.2014, 14:35
Далее...
Запятую внутри кавычек sjasm+ считает разделителем параметров макроса:
MACRO tPosText x,y,txt
db 2,x,y,txt,0
ENDM
tPosText 8,10,"текст, с запятой"
tPosText 8,10,<"текст, с запятой">
По первому применению - error: Too many arguments for macro: tPosText
По второму - всё гладко.
Компилю с device zxspectrum48
sjasmplus выдаёт: warning: [SAVESNA] RAM <0x4000-0x4001> will be overriden due to 48k snapshot imperfect format.
Ну ладно, понял я что первые два байта экрана будут заюзаны для адреса старта, ладно.
А вот как отключить чтоб не было этого warning?
При "холостом" запуске сжасм выдаёт (среди прочего)
--msg=error Show only error messages
Но если заюзать этот "--msg=error" - то пишет: Unrecognized option: msg
Как быть-то?
Alex Rider
27.12.2014, 20:32
Как быть-то?
Мой вариант - потратить сразу n-цать минут на написание загрузчика с trd, благо эмули умеют его грузить мгновенно. Тогда можно сразу тестить на разных клонах в эмуляторе.
Мой вариант - потратить сразу n-цать минут на написание загрузчика с trd, благо эмули умеют его грузить мгновенно. Тогда можно сразу тестить на разных клонах в эмуляторе.
Не, мне так не подходит.
Мне нужно чтоб в sna (потому что файл при компиляции ещё и автоматом в qsave1.sna кидается в папку с анрилом. чтобы если надо по alt-f3 быстро вызвать изначальный вид, так сказать).
denpopov
27.12.2014, 21:17
ещё и автоматом в qsave1.sna кидается в папку с анрилом.
поставь Spectaculator и не люби мозги. снапшот открывается все же.
поставь Spectaculator и не люби мозги. снапшот открывается все же.
Да причём тут спектракулятор (к тому же мне он не нравится)
Анрил тоже снапшот открывает.
Речь о том как warning у sjasmplus отключить, эмули тут побоку.
Shadow Maker
28.12.2014, 02:43
Компилю с device zxspectrum48
sjasmplus выдаёт: warning: [SAVESNA] RAM <0x4000-0x4001> will be overriden due to 48k snapshot imperfect format.
Ну ладно, понял я что первые два байта экрана будут заюзаны для адреса старта, ладно.
А вот как отключить чтоб не было этого warning?
При "холостом" запуске сжасм выдаёт (среди прочего)
--msg=error Show only error messages
Но если заюзать этот "--msg=error" - то пишет: Unrecognized option: msg
Как быть-то?
А сохранить в 128к снапшот? Религия чтоли не позволяет?
SAM style
28.12.2014, 02:49
Компилю с device zxspectrum48
sjasmplus выдаёт: warning: [SAVESNA] RAM <0x4000-0x4001> will be overriden due to 48k snapshot imperfect format.
Ну ладно, понял я что первые два байта экрана будут заюзаны для адреса старта, ладно.Кстати, какого хрена? WOS (http://www.worldofspectrum.org/faq/reference/formats.htm#File) утверждает, что в 48К снапшотах PC сохраняется на стеке.
А сохранить в 128к снапшот? Религия чтоли не позволяет?
Да можно, конечно, просто 48 и весит меньше, да и вообще какого тогда DEVICE SPECTRUM48 прикручивали?
В общем пробую всякие возможности (раньше юзал только SPECTRUM128).
Да и к тому-же затеял очередную НГ-открытку, 48онли, ну и решил снапшот по-честному 48 юзить :)
---------- Post added at 03:07 ---------- Previous post was at 03:04 ----------
Кстати, какого хрена? WOS утверждает, что в 48К снапшотах PC сохраняется на стеке.
В предыдущих версиях sjasm вообще было (хоть 128, хоть 48) - в начале экрана (#4000) стояла JP start_adr
Т.е. даже три байта тратилось, ну щас уже два, прогресс :)
Или это я устаревший sjasmplus юзаю?
SjASMPlus Z80 Cross-Assembler v1.07 RC7 (build 02-04-2008)
Может и новей есть, но попробуй там разберись не зная английского...
Кстати, какого хрена? WOS (http://www.worldofspectrum.org/faq/reference/formats.htm#File) утверждает, что в 48К снапшотах PC сохраняется на стеке.
В fuse и unreal оно работает
Я так и генерел снапшот48 руками для дизасма ексолона
В 48 нет поля для пц
В 48 нет поля для пц
По-ходу получается PC на стеке, всё-таки.
А вот сам стек - на #4002
(только что проверил)
Как боротся с этим - хз, но пока я всё-таки про warning хочу узнать (как отключить, или почему msg не работает)
SAM style
28.12.2014, 03:42
В предыдущих версиях sjasm вообще было (хоть 128, хоть 48) - в начале экрана (#4000) стояла JP start_adr
Т.е. даже три байта тратилось, ну щас уже два, прогресс :)
Или это я устаревший sjasmplus юзаю?
SjASMPlus Z80 Cross-Assembler v1.07 RC7 (build 02-04-2008)
Может и новей есть, но попробуй там разберись не зная английского...
SjASMPlus Z80 Cross-Assembler v1.07 RC8 (build 06-11-2008)
Адрес хранится на стеке, но тоже через зад - возврат делается через 2 точки в 48-м бейсике: 33b1 (pop hl,de:ret) и 004d (pop de,bc,hl,af:ret). Т.е чихать на регистры в заголовке - сохраним их ещё и на стеке! Кстати, при компиляции положение самого стека никак не задаётся, но в снапшоте он сохраняется (парадоксЪ).
Самим сджасмом кто-нибудь сейчас занимается? Есть мысль расширить SAVESNA - добавить ещё 1 параметр, адрес стека.
SjASMPlus Z80 Cross-Assembler v1.07 RC8 (build 06-11-2008)
Адрес хранится на стеке, но тоже через зад - врзврат делается через 2 точки в 48-м бейсике: 33b1 (pop hl,de:ret) и 004d (pop de,bc,hl,af:ret). Т.е чихать на регистры в заголовке - сохраним их ещё и на стеке! Кстати, при компиляции положение самого стека никак не задаётся, но в снапшоте он сохраняется (парадоксЪ).
Всё это здорово, а ссыль на этот самый RC8 можно?
---------- Post added at 03:44 ---------- Previous post was at 03:43 ----------
(может хоть он поймёт чтоб error only, без "внимания")
SAM style
28.12.2014, 03:53
Всё это здорово, а ссыль на этот самый RC8 можно?
---------- Post added at 03:44 ---------- Previous post was at 03:43 ----------
(может хоть он поймёт чтоб error only, без "внимания")
Знаю только исходники: https://github.com/mkoloberdin/sjasmplus - в первом посте указано.
Собранные выше rc7 не видел
Собранные выше rc7 не видел
Ну как соберут и если увидишь - свистни если не трудно.
(счаз не с руки разбиратся как эти сборки делаются и т.д. - с открыткой бы успеть, а дальше сам знаешь 3д заждалось :) )
Alex Rider
06.01.2015, 20:06
Нда, чудеса... Не прошло и вечности, как индеец Зоркий Глаз заметил, что пример из инструкции по структурам:
Or without label:
COLORTABLE
SCOLOR 0,0,0
SCOLOR 1,2,3
SCOLOR ,2
; etc.
не компилится потому что структуры без меток не перевариваются (1.07RC7). А Зоркий Глаз очень надеялся попользоваться структурами... Есть кто живой для фикса? Или самому?
---------- Post added at 20:06 ---------- Previous post was at 20:03 ----------
Чот вспомнилось такое винрарное:
Указание начинающему программисту: Если вы с первого раза сумели написать программу, в которой транслятор не обнаружил ни одной ошибки, сообщите об этом системному программисту. Он исправит ошибки в трансляторе.
denpopov
06.01.2015, 20:22
сообщите об этом системному программисту. Он исправит ошибки в трансляторе.
Вроде бы взрослый человек, а все в сказки верит:)
SAM style
06.01.2015, 20:27
Нда, чудеса... Не прошло и вечности, как индеец Зоркий Глаз заметил, что пример из инструкции по структурамДейстивтельно... http://zx-pk.ru/showpost.php?p=723673&postcount=1013
Alex Rider
06.01.2015, 22:24
Дейстивтельно... http://zx-pk.ru/showpost.php?p=723673&postcount=1013
Ну так на то он и Зоркий глаз :D Видимо, когда читал тот твой пост, думал, что уж мне-то структуры никогда не понадобятся.
Пока накопал только, что структуры, похоже, были прикостылены сбоку. Поскольку отрабатываются в той же процедуре, что и метки. Подумаю ща как сделать их в человечьем виде.
---------- Post added at 22:00 ---------- Previous post was at 21:01 ----------
Короче, либо я не разобрался в коде SjAsm (что весьма вероятно), либо я выловил багу. В parser.cpp есть функция ParseMacro(). В ней такой кусок:
if (!(r = MacroTable.Emit(n, p)))
{
//do none
}
else
if (r == 2)
{
return 1; //return 1
}
else
if (StructureTable.Emit(n, 0, p, gl) || !gl)
{
return 1;
};
return 0;
Как я понял, смысл его примерно такой: если макрос не впендюрился (результат впендюривания не 0), то выходим из функции с 0 в результате. А вот если макрос впендюрился с результатом 0, то проверяем результат на равенсто на 2 (!), если не 2, то пытаемся впендюрить структуру, но строка уже кончилась, поэтому ничего не сломается и вообще даже не случится.
Я починил на такое:
if (!(r = MacroTable.Emit(n, p))) {
if (r == 2){
return 1;
}
else
if (StructureTable.Emit(n, 0, p, gl)) {
lp = p;
return 1;
}
}
Тут логика такая: если макрос впендюрился с кодом 0 или 2, то вернуть 1, иначе попробовать впендюрить структуру и вернуть 1 если получилось. На самом деле ParseMacro зовется только из ParseLine без анализа результата, так что можно хоть номер телефона из него возвращать :)
Я это все к чему. Я буду проверять у себя фикс на своих старых сырцах (с макросами) и на Саботере, а мой фикс неплохо бы отправить гуру во внутренностях SjAsm на предмет оценки кошерности и впиливание в репозиторий. Только я не знаю кому отправлять.
---------- Post added at 22:24 ---------- Previous post was at 22:00 ----------
Все я попутал. MacroTable.Emit возвращает 0 если не нашла макрос, 1 если ошибка в параметрах и 2 если все ok. Тогда фикс получается более такой:
if (!(r = MacroTable.Emit(n, p))) {
if (StructureTable.Emit(n, 0, p, gl)){
lp = p;
return 1;
}
}
else
if (r == 2){
return 1;
}
return 0;
perestoronin
06.01.2015, 22:44
Если есть желание - лучше не к автору взывать, а создать свой репозитарий, клонировав авторский или какой-либо иной с sjasm+ на github и затем внести в него желаемую правку.
На деле sjasm+ очень бажный и написан в лучших традициях. Замечу, что оригинальный sjasm не прибегает к лучшим традициям, но в нем нет нужных модных фич.
Alex Rider
06.01.2015, 23:17
Если есть желание - лучше не к автору взывать, а создать свой репозитарий,
Не согласен. Если каждый для затычки очередного бага будет клонировать репозитарий, то наплодится куча неполноценных бажных никому не нужных версий. Жеоательно все же фиксы рассовывать в существующие репозитарии.
На деле sjasm+ очень бажный и написан в лучших традициях. Замечу, что оригинальный sjasm не прибегает к лучшим традициям, но в нем нет нужных модных фич.
"Качеством" тамошнего кода я очень проникся. Особенно, с учетом того, что чтобы понять как сделать фикс на 10 строк пришлось продебажить кучу всего и въехать в работу этого "кучи всего".
Предлагаю Витамину добавить тебя в коммитеры своей репы.
Alex Rider
07.01.2015, 00:25
Предлагаю Витамину добавить тебя в коммитеры своей репы.
Излишне. C++ я знаю в режиме "read-only", так что саппортить не буду все равно. Тут я напрягся потому что ахтунг совсем возник - без структур дизасм саботера пришлось бы переделывать чуть более, чем весь. Если что и буду еще править, проще сюда сложить, хозяева живых бранчей растащат если им оно надо.
---------- Post added at 00:25 ---------- Previous post was at 00:21 ----------
Олсо у меня нет VS2010 и тем более неWindows. Есть VS2013, но выкладывать в public правки, сделанные в ней, я слегка очкую.
Тады пусь сабж сам померджит кот и вылажыт.
Alex Rider
07.01.2015, 08:03
Тады пусь сабж сам померджит кот и вылажыт.
Мой код требует анализа от просвещенных и тестирования от юзеров. Я сделал "фикс вслепую". Вроде как, после обработки сырцов регэкспами (для достижения совместимости по структурам с тем асмом, для которого декомпилил), количество ошибок в дизасме Саботёра 2 снизилось с ~5000 до ~500 (уже не по структурам). Но аутентичного бинаря еще нет. И да, я вломился в emit макросов, в дизасме их тоже нет, а на старых сорцах с макросами еще не проверял.
Alex Rider
16.01.2015, 21:46
Вроде как, накопал еще одну багу.
Суть: Если внутри модуля есть INCLUDE, внутри которого тоже есть модуль, ужасм ингода падает во время компиляции. Маловероятно, что это наведено моим предыдущим фиксом со структурами без меток.
В общем, в directives.cpp, dirMODULE() было так:
ModuleName = (char*)realloc(ModuleName,strlen(n)+strlen(ModuleN ame)+2);
if (ModuleName == NULL) {
Error("Not enough memory!", 0, FATAL);
}
STRCAT(ModuleName, sizeof("."), ".");
STRCAT(ModuleName, sizeof(n), n);
Падало в STRCAT (дебажная версия говорила, что стринг не заканчивается null'ом).
Стало так:
ModuleName = (char*)realloc(ModuleName, strlen(n) + strlen(ModuleName) + 200);
if (ModuleName == NULL) {
Error("Not enough memory!", 0, FATAL);
}
strcat(ModuleName, ".");
strcat(ModuleName, n);
Так не падает и вроде как компилит. Просьба к сишника и авторам репозиториев оценить фикс. Я не знаю разницы между STRCAT и strcat, оно помогло. Я тоже потестирую исправление.
Падало в STRCAT (дебажная версия говорила, что стринг не заканчивается null'ом).
const int totalSize = strlen(n)+strlen(ModuleName)+2;
ModuleName = (char*)realloc(ModuleName,totalSize);
if (ModuleName == NULL) {
Error("Not enough memory!", 0, FATAL);
}
STRCAT(ModuleName, totalSize, ".");
STRCAT(ModuleName, totalSize, n);
Непонятно, на кой хрен юзать сишные строки из говна и палок указателей в программе на С++?
Alex Rider
17.01.2015, 19:06
Ну ты принимаешь мой фикс в свою репу? Али иначе как-то надо пофискить? Олсо +200 зря написал. Работают те же +2.
Add: Попроюбую твой фикс завтра.
Ну ты принимаешь мой фикс в свою репу? Али иначе как-то надо пофискить? Олсо +200 зря написал. Работают те же +2.
Напиши тест, показывающий проблему. Я сам пофикшу тогда.
SAM style
22.01.2015, 01:57
LABELSLIST для меток с адресами C000..FFFF кладёт на банку, в которой эта метка была создана, и ставит туда 00:
DEVICE ZXSPECTRUM128
org 0x8000,0
l8000_0 nop
ret
org 0xc000,0
lc000_0 nop
ret
org 0xc000,1
lc000_1 nop
ret
LABELSLIST "labels"...даст...
02:0000 l8000_0
00:0000 lc000_0
00:0000 lc000_1
А метки с адреса ниже #4000 вообще не сохраняются. Между делом, это может быть не только адрес, но и длина какой-то структуры (или он EQU тут не обрабатывает?)
А где сейчас актуальный репозиторий располагается? Откуда тянуть исходники, чтобы под MacOSX и под Linux собрать?
https://github.com/vitamin-caig/sjasmplus
Vitamin, можешь в релизы сборки/бинарники добавить? (для разных систем).
Vitamin, можешь в релизы сборки/бинарники добавить? (для разных систем).
Это для каких?
Это для каких?
Ну, стандартно: Windows, Linux, MacOSX/FreeBSD. (Чем больше - тем лучше =)
Ну, стандартно: Windows, Linux, MacOSX/FreeBSD. (Чем больше - тем лучше =)
Под рукой есть только винда (да и то, не проверял на ней сборку) и archlinux (билды под который мало кому пригодятся). Так что ой.
Так шта предлагаю основному майнтейнеру (mkoloberdin) просто затянуть мои фиксы (их немного).
Под рукой есть только винда (да и то, не проверял на ней сборку) и archlinux (билды под который мало кому пригодятся). Так что ой.
Так шта предлагаю основному майнтейнеру (mkoloberdin) просто затянуть мои фиксы (их немного).
Да брось, последний коммит в его репозитории - 4 года назад, и в релизах у него также пусто :)
На макось доступ дать не проблема (это, разумеется, если у тебя есть желание и/или возможность =) достаточно же будет SSH? (недостающий софт ставится через brew (типа маковский apt-get)).
На Ubuntu Linux Server 14 LTS тоже без проблем - только скажи =)
Да брось последний коммит в его репозитории - 4 года назад, и в релизах у него также пусто
У гитхаба хреново эти самые релизы сделаны, на мой взгляд.
достаточно же будет SSH? (недостающий софт ставится через brew (типа маковский apt-get)).
Не хочу завязываться на сторонние ресурсы.
Имхо, юзеры линукса обладают достаточным инструментарием и квалификацией для сборки, насчет мака не знаю. Для пользователей винды попробую завтра собрать, если руки дойдут.
У гитхаба хреново эти самые релизы сделаны, на мой взгляд.
Не хочу завязываться на сторонние ресурсы.
Имхо, юзеры линукса обладают достаточным инструментарием и квалификацией для сборки, насчет мака не знаю. Для пользователей винды попробую завтра собрать, если руки дойдут.
Под маком собралось без проблем: бинарник тут -> https://github.com/oisee/sjasmplus/releases
а вот под убунтой make вываливается с ошибками.
---------- Post added at 01:58 ---------- Previous post was at 01:09 ----------
Под маком собралось без проблем: бинарник тут -> https://github.com/oisee/sjasmplus/releases
а вот под убунтой make вываливается с ошибками.
Пофиксил:
Нужно заменить в Makefile строку на:
#for Linux
LDFLAGS=-Wl,--no-as-needed -ldl
бинарник выложил туда же.
Осталась только версия под Windows =)
SAM style
23.01.2015, 03:32
а вот под убунтой make вываливается с ошибками.Собрался на дебиане - завалил только кучей предупреждений типа
deprecated conversion from string constant to ‘char*’ (на вызовах разных функций)
лог stderr прилагается
Никто не против, если поддержка WinCE будет выпилена КЕМ?
В общем, актуальные бинарники для основных платформ лежат тут:
https://github.com/oisee/sjasmplus/releases/tag/bin
MacOSX, Linux (Ubuntu/Debian), Windows.
SAM style
24.01.2015, 21:21
Витаминовский sjasm+ не компилит Wanderers - вываливает кучу "Duplicate label", хотя исходный (https://github.com/mkoloberdin/sjasmplus) собирает без ошибок. Пока не могу сообразить простой пример для повторения бага...
Витаминовский sjasm+ не компилит Wanderers - вываливает кучу "Duplicate label", хотя исходный (https://github.com/mkoloberdin/sjasmplus) собирает без ошибок. Пока не могу сообразить простой пример для повторения бага...
Сделай дамп всех меток и посмотри на предмет аномалий- корявые символы, например. Другого ничего в голову не приходит.
SAM style, а на какие метки ругается?
он же пишет.
может строчные/заглавные буквы?
SAM style
25.01.2015, 00:19
Сделай дамп всех меток и посмотри на предмет аномалий- корявые символы, например. Другого ничего в голову не приходит.Все на английском, ничего сверхестественного не используется. Самое главное - предыдущая версия ведь собирает!
SAM style, а на какие метки ругается?
он же пишет.
может строчные/заглавные буквы?
По ходу, на все. Выхлоп прилагаю. Как ни пытался это повторить руками, не получается.
Странно как-то...
А ещё не заметил ни одного "warning: Label has different value", который при реально дублирующейся метке должен вылезать:
lab nop
lab retВыплёвывает
SjASMPlus Z80 Cross-Assembler v1.07 RC8 (build 06-11-2008)
main.asm(2): error: Duplicate label: lab
Pass 1 complete (1 errors)
Pass 2 complete (1 errors)
main.asm(1): warning: Label has different value in pass 3: previous value 1 not equal 0
main.asm(2): warning: Label has different value in pass 3: previous value 0 not equal 1
Pass 3 complete
Errors: 1, warnings: 2, compiled: 3 lines, work time: 0.000 seconds
А можешь весь проект для сборки выложить?
---------- Post added at 00:54 ---------- Previous post was at 00:40 ----------
Выплёвывает
Вообще, правильно выплевывает. И в обновленной версии абсолютно то же самое.
SAM style
25.01.2015, 00:55
А можешь весь проект для сборки выложить?Ещё интересное наблюдение. LABELSLIST:
00:0000 scriptAdr
0/:0020 gameScript
00:0002 npcTabAdr
0/:154F npcTable
00:0004 elmTabAdr
0/:2222 elmTable
00:0006 itemTabAdr
0/:02BB itemTable
00:0008 doorTabAdr
0/:0186 doorTable
00:000A zoneTabAdr
0/:2EA5 zoneTable
00:000C batlTabAdr
0/:3070 batlTable
00:000E magTabAdr
0/:053B magicTableГон идёт на те метки, у которых 0/ вместо банки. Предыдущий sjasm+ такого не выдаёт.
Ссылка на сорцы в личке.
PS: Ага. Это происходит с метками, к которым сначала идёт обращение, а потом они определяются - например, jr вперёд. Удалось повторить:
org 0x8000
nop
jr label
nop
label retрезультат:
SjASMPlus Z80 Cross-Assembler v1.07 RC8 (build 06-11-2008)
main.asm(8): error: Duplicate label: label
Pass 1 complete (1 errors)
Pass 2 complete (1 errors)
Pass 3 complete
Errors: 1, warnings: 0, compiled: 10 lines
Ага. Это происходит с метками, к которым сначала идёт обращение, а потом они определяются - например, jr вперёд. Удалось повторить:
org 0x8000
nop
jr label
nop
label retрезультат:
SjASMPlus Z80 Cross-Assembler v1.07 RC8 (build 06-11-2008)
main.asm(8): error: Duplicate label: label
Pass 1 complete (1 errors)
Pass 2 complete (1 errors)
Pass 3 complete
Errors: 1, warnings: 0, compiled: 10 lines
Это определенно бага.
denpopov
25.01.2015, 12:14
если использую в снапшоте ужясма rst10, то программа сбрасывается.
до этого ставлю вызов:
ld a,2
call 1601
не помогает.
Есть идеи, как проинициализировать системные переменные?
PS: Ага. Это происходит с метками, к которым сначала идёт обращение, а потом они определяются - например, jr вперёд. Удалось повторить:
Ага, поймал. Предлагаю пока юзать старую версию, если в новой пока нет значимых фиксов.
Уже накопилось много переделок, но они не меняют поведение программы- просто разгребание конюшен. А вот с багами надо быть аккуратнее и набрать базу тестов. Твой как раз туда пойдет:)
---------- Post added at 14:18 ---------- Previous post was at 13:03 ----------
Залил фикс в develop.
Не компилится под линукс. Линковщик ругается. Кто скажет, что не так?
g++ -o sjasmplus "-ldl" -O2 -DLUA_USE_LINUX -DMAX_PATH=PATH_MAX -Ilua5.1 -Itolua++ -g sjasm/devices.o sjasm/directives.o sjasm/io_snapshots.o sjasm/io_trd.o sjasm/io_tape.o sjasm/lua_lpack.o sjasm/lua_sjasm.o sjasm/parser.o sjasm/reader.o sjasm/sjasm.o sjasm/sjio.o sjasm/support.o sjasm/tables.o sjasm/z80.o lua5.1/lapi.o lua5.1/lauxlib.o lua5.1/lbaselib.o lua5.1/lcode.o lua5.1/ldblib.o lua5.1/ldebug.o lua5.1/ldo.o lua5.1/ldump.o lua5.1/lfunc.o lua5.1/lgc.o lua5.1/linit.o lua5.1/liolib.o lua5.1/llex.o lua5.1/lmathlib.o lua5.1/lmem.o lua5.1/loadlib.o lua5.1/lobject.o lua5.1/lopcodes.o lua5.1/loslib.o lua5.1/lparser.o lua5.1/lstate.o lua5.1/lstring.o lua5.1/lstrlib.o lua5.1/ltable.o lua5.1/ltablib.o lua5.1/ltm.o lua5.1/lundump.o lua5.1/lvm.o lua5.1/lzio.o tolua++/tolua_event.o tolua++/tolua_is.o tolua++/tolua_map.o tolua++/tolua_push.o tolua++/tolua_to.o
lua5.1/loadlib.o: In function `ll_sym':
/home/kgbplus/sjasmsrc/sjasmplus/lua5.1/loadlib.c:80: undefined reference to `dlsym'
/home/kgbplus/sjasmsrc/sjasmplus/lua5.1/loadlib.c:81: undefined reference to `dlerror'
lua5.1/loadlib.o: In function `ll_load':
/home/kgbplus/sjasmsrc/sjasmplus/lua5.1/loadlib.c:73: undefined reference to `dlopen'
/home/kgbplus/sjasmsrc/sjasmplus/lua5.1/loadlib.c:74: undefined reference to `dlerror'
lua5.1/loadlib.o: In function `ll_unloadlib':
/home/kgbplus/sjasmsrc/sjasmplus/lua5.1/loadlib.c:68: undefined reference to `dlclose'
collect2: error: ld returned 1 exit status
make: *** [all] Ошибка 1
Линковщик ругается. Кто скажет, что не так?
Кавычки вокруг -ldl в Makefile убери. Некоторые шеллы ругаются.
Не помогло. Может быть кто нибудь скомпилит мне бинарник? )
g++ -o sjasmplus -ldl -O2 -DLUA_USE_LINUX -DMAX_PATH=PATH_MAX -Ilua5.1 -Itolua++ -g sjasm/devices.o sjasm/directives.o sjasm/io_snapshots.o sjasm/io_trd.o sjasm/io_tape.o sjasm/lua_lpack.o sjasm/lua_sjasm.o sjasm/parser.o sjasm/reader.o sjasm/sjasm.o sjasm/sjio.o sjasm/support.o sjasm/tables.o sjasm/z80.o lua5.1/lapi.o lua5.1/lauxlib.o lua5.1/lbaselib.o lua5.1/lcode.o lua5.1/ldblib.o lua5.1/ldebug.o lua5.1/ldo.o lua5.1/ldump.o lua5.1/lfunc.o lua5.1/lgc.o lua5.1/linit.o lua5.1/liolib.o lua5.1/llex.o lua5.1/lmathlib.o lua5.1/lmem.o lua5.1/loadlib.o lua5.1/lobject.o lua5.1/lopcodes.o lua5.1/loslib.o lua5.1/lparser.o lua5.1/lstate.o lua5.1/lstring.o lua5.1/lstrlib.o lua5.1/ltable.o lua5.1/ltablib.o lua5.1/ltm.o lua5.1/lundump.o lua5.1/lvm.o lua5.1/lzio.o tolua++/tolua_event.o tolua++/tolua_is.o tolua++/tolua_map.o tolua++/tolua_push.o tolua++/tolua_to.o
lua5.1/loadlib.o: In function `ll_sym':
/home/kgbplus/sjasmsrc/sjasmplus/lua5.1/loadlib.c:80: undefined reference to `dlsym'
/home/kgbplus/sjasmsrc/sjasmplus/lua5.1/loadlib.c:81: undefined reference to `dlerror'
lua5.1/loadlib.o: In function `ll_load':
/home/kgbplus/sjasmsrc/sjasmplus/lua5.1/loadlib.c:73: undefined reference to `dlopen'
/home/kgbplus/sjasmsrc/sjasmplus/lua5.1/loadlib.c:74: undefined reference to `dlerror'
lua5.1/loadlib.o: In function `ll_unloadlib':
/home/kgbplus/sjasmsrc/sjasmplus/lua5.1/loadlib.c:68: undefined reference to `dlclose'
collect2: error: ld returned 1 exit status
Не помогло. Может быть кто нибудь скомпилит мне бинарник? )
https://github.com/oisee/sjasmplus/commit/1eb7a7b138fa292a26f8770dfd119049c2dc760f
denpopov
25.01.2015, 20:00
господа, по моему вопросу найдется знаток?
https://github.com/oisee/sjasmplus/commit/1eb7a7b138fa292a26f8770dfd119049c2dc760f
Помогло, спасибо!!!
Вопрос к пользователям sjasm: пользуетесь ли вы директивой OUTPUT и ключом командной строки --raw примерно для того же самого?
Суть в том, что эта директива работает неправильно при использовании директивы ORG. Есть идея выпилить ее нафиг, изрядно упростив код.
Vitamin, а что делает эта директива?
Vitamin, а что делает эта директива?
Указывает имя файла, в который происходит дамп сгенерированного кода.
SAM style
30.01.2015, 12:50
Вопрос к пользователям sjasm: пользуетесь ли вы директивой OUTPUT и ключом командной строки --raw примерно для того же самого?
Суть в том, что эта директива работает неправильно при использовании директивы ORG. Есть идея выпилить ее нафиг, изрядно упростив код.
Пользуюсь OUTPUT, но только потому, что --raw нормально не работает. Для автоматической сборки скриптом --raw был бы предпочтительнее.
Пользуюсь OUTPUT, но только потому, что --raw нормально не работает. Для автоматической сборки скриптом --raw был бы предпочтительнее.
А как же ORG? OUTPUT не учитывает возникающие дырки или перекрытия.
--raw начинает работать если есть хоть одна директива OUTPUT вроде.
SAM style
30.01.2015, 13:40
А как же ORG? OUTPUT не учитывает возникающие дырки или перекрытия.
--raw начинает работать если есть хоть одна директива OUTPUT вроде.С новым ORG-ом руками указывать новый файл для вывода OUTPUT. Дырки делать DS/ALIGN - их-то он обрабатывает? А перекрытие - это как? Скомпилить кусок кода, а потом поверх ещё кусок, затирая предыдущий? Это уже какое-то извращение.
А вообще, на край есть ещё и SAVEBIN.
С новым ORG-ом руками указывать новый файл для вывода OUTPUT.
Неконтролируемо. ORG может быть неявный (в макросе/дефайне).
Дырки делать DS/ALIGN - их-то он обрабатывает?
Да.
А перекрытие - это как? Скомпилить кусок кода, а потом поверх ещё кусок, затирая предыдущий? Это уже какое-то извращение.
Ну почему же. При разворачивании циклов вполне себе ок:
dup 8
ld a,(hl)
ld (de),a
inc h
inc d
edup
org $-2
...
А вообще, на край есть ещё и SAVEBIN.
Ну он свою задачу делает. Правда лично у меня некоторая неприязнь к смешиванию функций генератора кода и билдсистемы.
http://bash.im/quote/432151
xxx: "Если ваша программа заработала с первого раза, обратитесь к системному программисту — он исправит ошибку в компиляторе."
xxx: В общем, SjASM для Z80 не компилит структуры без меток.
xxx: Но это у всех. У меня теперь компилит.
yyy: Поправил компилятор потому что он не компилит то, что ты хочешь? Красава!
Alex Rider
30.01.2015, 16:55
Это я с товарищем обсуждал :)
Alex Rider
30.01.2015, 17:43
известность !
У меня там еще две есть, одна даже на лурк перекочевала. Уже не так волнующе :)
Идем далее:)
Кто пользуется директивами MAP/ENDMAP и полями? Судя по документации, это какой-то треш,угар и содомия аналог структур для бедных.
Alex Rider
30.01.2015, 20:38
Судя по документации, это какой-то треш,угар и содомия аналог структур для бедных
Поддерживаю. Нах не надо.
shurik-ua
30.01.2015, 22:48
пользуетесь ли вы директивой OUTPUT
Да - активно пользуюсь, например если нужно ассемблировать z80 код, но не для спектрума.
Типичное начало кода:
output rom.bin
display "Size of ROM is: ",/a,endprog
MACRO PORG addr
IF $ < addr
BLOCK addr-$
ENDIF
ORG addr
ENDM
PORG 0
jp reset
PORG $38
MIH ;main interrupt handler
reti
PORG $66 ;NMI handler
retn
PORG $100
reset
di
ld sp,$3fff
...
Суть в том, что эта директива работает неправильно при использовании директивы ORG. Есть идея выпилить ее нафиг, изрядно упростив код.
В чём именно проявляется ? - я много пользовался косяков не заметил.
В чём именно проявляется ? - я много пользовался косяков не заметил.
В своем примере убери использование директивы BLOCK из макроса PORG и увидишь.
shurik-ua
31.01.2015, 22:55
Это директива ORG работает не так как привыкли пользователи других ассемблеров для z80, а именно она не дополняет нулями пространство между ORG'ами. Кстати этот макрос и написан в доке как раз для того чтобы поведение директивы ORG сделать более "привычным".
Кстати такое же поведение директивы ORG есть и в ассемблере NASM для х86 машин.
Так как в доке к sjasm про это ничего не написано, приведу ссылку на доки к NASM, там этот момент более освещён.
http://www.nasm.us/xdoc/2.11.06/html/nasmdoc7.html#section-7.1.1
Это директива ORG работает не так как привыкли пользователи других ассемблеров для z80, а именно она не дополняет нулями пространство между ORG'ами. Кстати этот макрос и написан в доке как раз для того чтобы поведение директивы ORG сделать более "привычным".
Кстати такое же поведение директивы ORG есть и в ассемблере NASM для х86 машин.
Так как в доке к sjasm про это ничего не написано, приведу ссылку на доки к NASM, там этот момент более освещён.
Не знаю как там для других платформ, но для всех спековских ассемблеров директива ORG просто меняет физический адрес генерации кода (причем, совсем не обязательно что вперед). Собственно, это ты и подтверждаешь сам, используя ее внутри макроса PORG.
SAM style
21.02.2015, 03:06
Снова я со своими извращениями. Можно ли в sjasm+ получить длину определенного файла? Суть такова:...
Я таки окончательно извратился. Для загрузчиков это будет полезно - присваивает метке длину в секторах указаного файла:
MACRO fileSect lb,nm
org 0x8000
incbin nm
align 256
lb equ high $ - 0x80
ENDM
; пример использования
fileSect p3size,"obj/page3.hr1"
Проверил, работает... Память, конечно, портит.
Shadow Maker
21.02.2015, 09:42
То есть вот так у тебя прям никак не прокатывало?
ld b, high (dehrust_len+255)
А, я понял, ты ж в трд пишешь своим mctrd. Я-то запихиваю прямо средствами sjasm, чтобы работало везде, после того, как загрузчик скомпилился и записался (т.е. пофиг на память уже)...
page 0
org #4000
dehrust
INSERT "dehrust.bin"
dehrust_
SAVETRD "SIP.trd","dehrust.C",dehrust,dehrust_-dehrust
dehrust_len equ dehrust_-dehrust
SAM style
21.02.2015, 12:22
А, я понял, ты ж в трд пишешь своим mctrd.И в trd, и в scl, и в tap. sjasm-ом получаю только незапакованные блоки, пакуются и запихиваются они отдельно.
А кстати, бейсики SJASM+ в образы запихивает?
Alex Rider
21.02.2015, 14:34
А кстати, бейсики SJASM+ в образы запихивает?
Да, только без автостарта. RC7 по крайней мере.
denpopov
21.02.2015, 15:03
Да, только без автостарта. RC7 по крайней мере.
вроде как rc7 может правильный бейсик записать. немного манипуляций и все готово.
Alex Rider
21.02.2015, 15:20
вроде как rc7 может правильный бейсик записать. немного манипуляций и все готово.
Ну я, по крайней мере, сходу не соображу как так изголиться, чтобы SAVETRD создал в каталоге файл длиной n байтов и записал в него n + 3 байта. Если только внешней тулой. У RC8 есть возможность писать бэйсики с автостартом, но сам он у меня не взлетел.
Я, кстати, обычно в процессе отладки пишу бэйсик "boot.B", а перед релизом обрабатываю trd напильником.
denpopov
21.02.2015, 15:23
Ну я, по крайней мере, сходу не соображу как так изголиться, чтобы SAVETRD создал в каталоге файл длиной n байтов и записал в него n + 3 байта.
на zx-spectrum.ru был вариант, но не обходилось без правки заголовка.
а где скочять без СМС RC8 ?
Shadow Maker
24.02.2015, 11:45
И в trd, и в scl, и в tap. sjasm-ом получаю только незапакованные блоки, пакуются и запихиваются они отдельно.
А кстати, бейсики SJASM+ в образы запихивает?
Всё запихивает по методу тасма. Что нагенерил = то и запихал. У меня всё так собирается, кроссплатформенно работает, удобно, без дополнительных манипуляций.
Автостарт да, Rc7 не пишет. Но вот как раз автостарт не главное, я его перед релизом своей тулзой трд обрабатываю, которая как раз прописывает автостарт и блоки в один .B собирает. Главное что сборка сама кроссплатформенная, без дополнительный программ.
---------- Post added at 11:45 ---------- Previous post was at 11:45 ----------
на zx-spectrum.ru был вариант, но не обходилось без правки заголовка.
а где скочять без СМС RC8 ?
Он только в разобранном виде вроде был.
Ну он свою задачу делает. Правда лично у меня некоторая неприязнь к смешиванию функций генератора кода и билдсистемы.
поддерживаю, было бы неплохо вообще выпилить всякие savebin, trd, sna и тп из генератора кода - это делает невозможным использование ассемблера для полноценных билд скриптов. Такие вещи лучше перенести в опции линкера
Как пример, одно время нужно было часто компилить код в разные форматы, приходилось каждый раз править исходник.
Shadow Maker
24.02.2015, 12:05
Раз вы не делаете под спектрум - лучше себе заведите отдельную ветку для таких модификаций типа SjasmMinus и выпиливайте там. Не надо это в основной тащить, где все привыкли и к Луа, и к savetrd.
Раз вы не делаете под спектрум - лучше себе заведите отдельную ветку для таких модификаций типа SjasmMinus и выпиливайте там. Не надо это в основной тащить, где все привыкли и к Луа, и к savetrd.
именно под спектрум :)
Была идея сделать некое подобие студии под sjasm, с билд скриптами. Но вот наличие всех этих savetrd вгоняет в ступор, как это совместить с привычным управлением билда через параметры непонятно, не делать же парсер исходников с модификацией на лету во время компиляции?
получается перемешивание исходного кода и билд скриптов. когда исходник вмешивается в процесс билда это ограничивает возможности линкера. отсутствие таких конструкций в исходнике дает большую гибкость при сборке, зачем модифицировать исходник, когда можно просто указать параметры сборки?
Можно конечно в ассемблер добавить директивы для запуска эмулятора, для имитации нажатия кнопок, но зачем всем этим захламлять исходный код, ведь гораздо удобнее иметь один исходник и отдельные скрипты для разных конфигураций билда
С другой стороны все эти примочки захламляют код компилятора, повышая количество багов. ведь чем проще код, тем надежнее и лучше он работает. На мой взгляд логично было бы разделить задачу сборки билда и задачу генерации кода. Решать эти задачи по отдельности гораздо проще и дает большую гибкость
Жизненный пример: нужно один и тот-же исходник скомпилить с разными параметрами в разные трд. Вместо того чтобы указать эту логику в билд скрипте, приходится модифицировать исходнники...
Shadow Maker
24.02.2015, 12:33
Пойми, вас таких сборщиков на студиях по пальцам одной руки пересчитать. Остальным надо включил, текст написал, асму скормил - sna/trd получил. Всё. Это у вас с Витамином профессиональная деформация. Кто-то например в тыще файлов код пишет, потому что он так привык. Кто-то например к Action Script 3 привык, тоже не нравится ни так ни так.
Большинство людей, пишущих на асм, привыкли к спектрумскому асму как раз. И как в спектрумских асмах привыкли - так sjasmplus и работает. Всё правильно, так и должно быть. Делайте отдельные ветки, если вас так не устраивает, не надо лезть туда, где уже всё и так хорошо. Баги лучше поправьте.
denpopov
24.02.2015, 12:46
Большинство людей, пишущих на асм, привыкли к спектрумскому асму как раз. И как в спектрумских асмах привыкли - так sjasmplus и работает
Может, ассемблеры подсадили? например, pasmo давится на любых сырках.
Shtorm отчасти можно адаптировать к ужясму.
Как пример, одно время нужно было часто компилить код в разные форматы, приходилось каждый раз править исходник.
Долго думал как обрулить это. Надо поддержать передачу define через командную строку, как в нормальных компиляторах.
---------- Post added at 13:06 ---------- Previous post was at 13:04 ----------
И как в спектрумских асмах привыкли - так sjasmplus и работает.
В спековских асмах это было сделано от бедности. И в sjasm этого изначального не было.
Shadow Maker
24.02.2015, 13:40
Ну, так дорабатывайте изначальный sjasm, верно? Или сделай опцию, которая отключается эти б-гомерзкие команды.
SAM style
24.02.2015, 13:58
...которая отключается эти б-гомерзкие команды.А что мешает их просто не использовать? Пущай будут, а пользоваться ими или нет - решает кодер. Я кроме SAVEBIN почти ничего не трогаю, остальное "б-гомерзкое" лежит и не мешает.
denpopov
24.02.2015, 14:01
"б-гомерзкое" лежит и не мешает.
LUA?:)
SAM style
24.02.2015, 14:05
LUA?:)
Не пользую. Я ж почти чистокровный арийский ассемблерщик, на данный момент максимум - макросы.
denpopov
24.02.2015, 14:13
Не пользую. Я ж почти чистокровный арийский ассемблерщик, на данный момент максимум - макросы.
ну да, по мне те же макросы, что работают, но в идеале - макросы, которые компилятся, о чем нельзя сказать об общем кроссассемблере.
perestoronin
24.02.2015, 14:18
В проекте очень нужен ключ -DUSE_LUA, очень настаиваю :), т.к. давно использую lua-5.3.0 и по этой причине есть проблемы со сборкой sjasmplus :(
Shadow Maker
24.02.2015, 14:31
А что мешает их просто не использовать? Пущай будут, а пользоваться ими или нет - решает кодер. Я кроме SAVEBIN почти ничего не трогаю, остальное "б-гомерзкое" лежит и не мешает.
Это ж не ко мне вопрос, а к ZXMAK с Витамином :)
Пущай будут, а пользоваться ими или нет - решает кодер.
Все упирается в поддержку. Чем меньше и проще софт, тем проще его поддерживать.
В случае сабжа, в студенческий наколеночный проект напихали всякой херни и продолжают кричать, что все сделано правильно и надо "лучше фиксить баги".
denpopov
24.02.2015, 17:01
Все упирается в поддержку. Чем меньше и проще софт, тем проще его поддерживать
да, для тебя лучше придуманная система плагинов.
Shadow Maker
24.02.2015, 17:48
Все упирается в поддержку. Чем меньше и проще софт, тем проще его поддерживать.
В случае сабжа, в студенческий наколеночный проект напихали всякой херни и продолжают кричать, что все сделано правильно и надо "лучше фиксить баги".
Ну ты ж не хочешь фиксить баги, потому что там всё переписывать надо, твои же слова. А ломать не строить, выкинуть - дело пяти минут. Причем от того, что ты выкинешь "всякую херню" - компилять лучше не станет и баги сами собой не исчезнут. Так зачем заниматься какой-то херней по выпиливанию нужных (для 90% асмокодеров, не кодящих на сях профессионально) вещей, вместо того, чтобы зафиксить действительно важные баги?
Ну ты ж не хочешь фиксить баги, потому что там всё переписывать надо, твои же слова.
Насчет "все переписывать" согласен (уже понемногу в процессе). На тему "не хочешь" - пруф, пожалста.
А ломать не строить, выкинуть - дело пяти минут.
Пока наблюдается обратная картина: вхерачить- не разбираться, дело одного часа (с каждым разом все дольше и дольше, но кто следит за такими мелочами, правда же?)
Shadow Maker
24.02.2015, 17:53
Насчет "все переписывать" согласен (уже понемногу в процессе). На тему "не хочешь" - пруф, пожалста.
Да тут где-то в этой же теме ты писал, что тебе лениво, потому что много всего надо делать.
Просто я против выпиливания вещей, которые уже существуют в компиляторе. От бедности их туда добавили или еще почему - дело десятое. Сейчас все про них знают и ими пользуются.
Да тут где-то в этой же теме ты писал, что тебе лениво, потому что много всего надо делать.
Конкретную цитату можно? Ну чтоб было понятно, что дело именно в лени.
Просто я против выпиливания вещей, которые уже существуют в компиляторе. От бедности их туда добавили или еще почему - дело десятое. Сейчас все про них знают и ими пользуются.
Я уже выпилил поддержку WinCE и директивы MAP/ENDMAP. Ты про них знаешь и пользуешься?
Shadow Maker
24.02.2015, 18:11
Конкретную цитату можно? Ну чтоб было понятно, что дело именно в лени.
Не, ну а смысл? Это было года 2 назад :) Какие еще варианты, кроме "другие приоритеты/некогда/работаю" (они же "лень")?
WinCE мне пофигу. MAP/ENDMAP знаю, но ими не пользуюсь, по очевидным причинам что я не пользуюсь структурами в подобном ключе вообще. Но возможно кто-то привык и пользуется, зачем выпилил? Это продиктовано необходимостью для реализации чего-то еще?
Да тут где-то в этой же теме ты писал, что тебе лениво, потому что много всего надо делать.
Просто я против выпиливания вещей, которые уже существуют в компиляторе. От бедности их туда добавили или еще почему - дело десятое. Сейчас все про них знают и ими пользуются.
Дак пользуются потому что нормальной альтернативы нет :)
Я вот тоже savebin юзаю, хоть это и неудобно, а что делать - на безрыбье и рак рыба :)
Пока вручную компиляцию вызываешь это сильно не мешает, а вот если нужно автоматом вызвать sjasm указав ему параметры компиляции и список входных/выходных файлов, тут уже прийдется задуматься, т.к. savebin будет только мешать
Пока вручную компиляцию вызываешь это сильно не мешает, а вот если нужно автоматом вызвать sjasm указав ему параметры компиляции и список входных/выходных файлов, тут уже прийдется задуматься, т.к. savebin будет только мешать
В принципе, решается весьма просто. Все savebin/savetrd выносятся в отдельные исходники, указываемые в качестве дополнительного источника сборки:
;buildtrd.asm
savetrd game.trd,game.C,32768,32768
;buildtap.asm
savetap "game.tap",32768
;buildsna.asm
savesna "game.sna",32768
сборка в разных режимах:
trd:
sjasm game.asm buildtrd.asm
tap:
sjasm game.asm buildtap.asm
sna:
sjasm game.asm buildsna.asm
---------- Post added at 10:05 ---------- Previous post was at 10:03 ----------
"другие приоритеты/некогда/работаю" (они же "лень")
Значит и тебе лень тоже. Чего тогда возмущаешься, а не баги фиксишь?
Это продиктовано необходимостью для реализации чего-то еще?
Это продиктовано здравым смыслом. Зачем нужны две похожие функциональности, практически полностью друг друга повторяющие?
---------- Post added at 10:08 ---------- Previous post was at 10:05 ----------
А ломать не строить, выкинуть - дело пяти минут.
Что-то можно за пять минут выкинуть, а на что-то полдня может уйти.
Так зачем заниматься какой-то херней по выпиливанию нужных (для 90% асмокодеров, не кодящих на сях профессионально) вещей, вместо того, чтобы зафиксить действительно важные баги?
"Сопровождамость? Не, не слышал"
Shadow Maker
25.02.2015, 11:54
Значит и тебе лень тоже. Чего тогда возмущаешься, а не баги фиксишь?
Дык я в си++ как свинья в апельсинах. И даже если я его вдруг выучил бы, мои "фиксы" были бы на уровне тех же школьных поделок, то есть бесполезные. Тут опытный человек нужен, ты сам это понимаешь.
Это продиктовано здравым смыслом. Зачем нужны две похожие функциональности, практически полностью друг друга повторяющие?
Ну в общем-то да.
"Сопровождамость? Не, не слышал"
Слышал. Но почему у тебя "сопровождаемость" упирается в savetrd и прочие такие команды - мне непонятно. Ты хочешь сказать, что это такие убер-команды, которые рушат на корню всё остальное? Или как они тебе так помешали сопровождать код? Баги что, в savetrd находятся?
---------- Post added at 11:54 ---------- Previous post was at 11:51 ----------
Пока вручную компиляцию вызываешь это сильно не мешает, а вот если нужно автоматом вызвать sjasm указав ему параметры компиляции и список входных/выходных файлов, тут уже прийдется задуматься, т.к. savebin будет только мешать
Ну я это решаю при помощи внешнего скрипта, который собственно и делает на основе входного параметра инклуд с savebin/savesna/savetrd в виде текста. Витамин предложил то же самое, как я понимаю.
Дык я в си++ как свинья в апельсинах. И даже если я его вдруг выучил бы, мои "фиксы" были бы на уровне тех же школьных поделок, то есть бесполезные. Тут опытный человек нужен, ты сам это понимаешь.
Прекрасно. Предполагаю, что ты разбираешься в разработке, поэтому расскажу свой взгляд на дела в компиляторе на программистском языке.
Куча старого кода. Неактуального, либо имеющего более удобные аналоги.
Полуметровый геморрой в виде поддержки старых систем (dos, wince). Возможно, из-за них практически не используется стандартная библиотека С++, а пишутся велосипеды и работа с ресурсами (памятью, файлами) врукопашную по-джедайски "для экономии", что приводит как раз к постоянным утечкам этих самых ресурсов и загадочным багам (https://github.com/vitamin-caig/sjasmplus/issues/1).
Использование глобальных переменных где надо и где не надо, из-за чего размазывается логика и возникают непредсказуемые побочные эффекты.
Новый функционал зачастую вхерачен абы как.
Это только то, что я смог слету вспомнить. Не говоря уже более тонких вещах.
Слышал. Но почему у тебя "сопровождаемость" упирается в savetrd и прочие такие команды - мне непонятно. Ты хочешь сказать, что это такие убер-команды, которые рушат на корню всё остальное? Или как они тебе так помешали сопровождать код? Баги что, в savetrd находятся?
Во-первых, находятся. Во-вторых, кто тебе сказал, что я буду вырезать функции save*?
Shadow Maker
25.02.2015, 14:28
Прекрасно. Предполагаю, что ты разбираешься в разработке, поэтому расскажу свой взгляд на дела в компиляторе на программистском языке.
Куча старого кода. Неактуального, либо имеющего более удобные аналоги.
Полуметровый геморрой в виде поддержки старых систем (dos, wince). Возможно, из-за них практически не используется стандартная библиотека С++, а пишутся велосипеды и работа с ресурсами (памятью, файлами) врукопашную по-джедайски "для экономии", что приводит как раз к постоянным утечкам этих самых ресурсов и загадочным багам (https://github.com/vitamin-caig/sjasmplus/issues/1).
Использование глобальных переменных где надо и где не надо, из-за чего размазывается логика и возникают непредсказуемые побочные эффекты.
Новый функционал зачастую вхерачен абы как.
Это только то, что я смог слету вспомнить. Не говоря уже более тонких вещах.
Ну да, я уверен, что ты во всем этом прав. И я понимаю, что возможно кучу всего лучше переписать, нежели поддерживать в том самом адовом виде. Однако это потребует дофига времени и желания, а поскольку ты сам, как я понимаю, ассемблером этим практически не пользуешься, то мотивации у тебя маловато для такой глобальной работы. Всё так?
Во-первых, находятся. Во-вторых, кто тебе сказал, что я буду вырезать функции save*?
Видел призывы вынести их в отдельную тулзу. То есть два программы вместо одной. Не так?
Однако это потребует дофига времени и желания, а поскольку ты сам, как я понимаю, ассемблером этим практически не пользуешься, то мотивации у тебя маловато для такой глобальной работы. Всё так?
Понемногу процесс идет. В свободное время.
Видел призывы вынести их в отдельную тулзу. То есть два программы вместо одной. Не так?
Ну я же не сказал, что буду следовать этим призывам. По крайней мере, поначалу. А что плохого в использовании нескольких программ?
Shadow Maker
25.02.2015, 23:52
В голову пришло пока то, что:
1. Исчезнет обратная совместимость
2. Опять будет "один сломал, второй потерял, концов не нашли"
3. Нельзя будет скомпилировать просто sjasm 1.asm, придётся какие-то баш-скрипты/батники/етц изобретать, не все это умеют/хотят.
Наверняка есть и другие минусы.
В голову пришло пока то, что:
1. Исчезнет обратная совместимость
2. Опять будет "один сломал, второй потерял, концов не нашли"
3. Нельзя будет скомпилировать просто sjasm 1.asm, придётся какие-то баш-скрипты/батники/етц изобретать, не все это умеют/хотят.
Наверняка есть и другие минусы.
1. Единственная проблема. Вполне решаемая.
2. Не понял
3. Если автор вхерачил в этот самый 1.asm сохранение в тап, то переделать это на трд/сна "не все умеют/хотят"
Вот странность-то какая. То, что используются отдельные программы для редактирования, компиляции и запуска- никого не смущает. А вот необходимость юзать отдельную программу для сжатия (что и так как бы есть) или засовывания файла в трдшник- "бида-бида, ниасиливаем батники и мейкфайлы!"
3. Нельзя будет скомпилировать просто sjasm 1.asm, придётся какие-то баш-скрипты/батники/етц изобретать, не все это умеют/хотят.
Почему нельзя? Дописал в командной строке опцию линкеру что выходной формат trd с таким-то именем, такимито параметрами и все...
Shadow Maker
27.02.2015, 14:15
Ну хорош уже, ну. Спросили мое мнение - я сказал. Если для вас это "мелочи", то для многих - вообще не мелочи.
Я редактирую текст в FAR и им же запускаю. Поскольку FAR это по сути консоль, то можно сказать, что я не использую сторонних приложений (ну "типа" не использую), то есть мне не надо ничего там прописывать для компиляций, я просто запускаю .exe 1.asm и всё. С разделениями файлов на линкеры и прочее это будет нифига не так просто и удобно.
И вообще, 1 файл на всё - это круто. Тчк.
С разделениями файлов на линкеры и прочее это будет нифига не так просто и удобно.
Да кто тебе такое сказал?
я просто запускаю .exe 1.asm и всё
А кто-то просто запускает
build_release.bat
и все. Где проще?
И вообще, 1 файл на всё - это круто. Тчк.
Ага. Чтоб и редактировал и компилял и линковал и за пивом бегал эмулировал.
По моим наблюдениям, народ до конца не в курсе всех возможностей одного лишь компилятора (а они стоят кода и соответственно времени на сопровождение), чего уж говорить о супер-пупер навороченной-системе-для-всего-в-одном-экзешнике.
Alex Rider
27.02.2015, 15:27
А кто-то просто запускает
build_release.bat
Это если ведешь проект. А если надо подсказать новичку что-то или проверить код из "Этюдов" или быстренько сделать trd-версию, делать build_release.bat" совсем не хочется.
Это если ведешь проект. А если надо подсказать новичку что-то или проверить код из "Этюдов" или быстренько сделать trd-версию, делать build_release.bat" совсем не хочется.
Пипец.
Писать SAVETRD в исходниках (желательно в самой жопе, чтоб враг не догадался) - это нормально. А вот писать SAVETRD в мейкфайле - это типа западло.
Shadow Maker
27.02.2015, 16:58
Кто мне сказал? Я сказал. Мне лично неудобно, пробовал в 90х асмить на всяких там тасмах/масмах. Лютая ересь эта ваша заливная рыба. Ты сам ничего на сжасме не пишешь, зато всё надо переделать нахрен, поделить и вынести, ага. Слава Алоне покоя не дает чтоли? Тот тоже очень любил всё переделать так, что никто не пользуется этим потом, кроме него.
Мнение такое, что не надо переделывать, зато надо зафиксить баги. И всё в одном файле. Вынеси в опцию компилирования себе линкер или еще как, раз тебе так удобнее сопровождать, главное чтобы в итоге оставался 1 бинарник для компиляции/линковки/етц. со всем командами, которые есть сейчас.
Ты сам ничего на сжасме не пишешь, зато всё надо переделать нахрен, поделить и вынести, ага. Слава Алоне покоя не дает чтоли? Тот тоже очень любил всё переделать так, что никто не пользуется этим потом, кроме него.
Ага. Не дает. А еще не дает покоя то, что тот же Sam Style пишет игру, но пользуется простейшей мейксистемой, а Shadow Maker требует "все в одном", но нихрена не пишет.
Это если ведешь проект.
Вот посмотри, что сейчас творится в main.asm для проекта CLI2:
; define buildLoader ; Сборка загрузчика системы (плагин для WC)
; define buildKernel ; Сборка всей системы
define buildRes ; Сборка файлов ресурсов (Pal, Cur, Fnt)
; define buildTest ; Сборка тестового приложения test
; define buildEcho ; Сборка команды echo
; define buildLoadPal ; Сборка утилиты loadpal
; define buildLoadFont ; Сборка утилиты loadfont
; define buildSleep ; Сборка команды sleep
; define buildType ; Сборка команды type
; define buildKeyScan ; Сборка утилиты keyscan
; define buildLoadMod ; Сборка утилиты loadmod
; define buildMiceTest ; Сборка утилиты micetest
; define buildGliTest ; Сборка утилиты glitest
; define buildLoadSxg ; Сборка утилиты loadsxg
; define buildNvram ; Сборка утилиты nvram
; define buildHello ; Сборка тестового приложения hello
; define buildBoing ; Сборка тестовой демки boing
; define buildMkdir ; Сборка команды mkdir
; define buildTestSave ; Сборка тестового приложения testsave
; define buildTestFile ; Сборка тестового приложения testfile
; define buildScreenFX ; Сборка приложения screenFX
; define buildDisk2trd ; Сборка приложения disk2trd
; define buildLoadres ; Сборка приложения loadres
; define buildResTest1 ; Сборка резидента restest1
;-------------------------------------------------------------------------
ifdef buildLoader
; CLi² Loader
DISPLAY "Start build: Loader..."
include "cliloader/main.asm"
endif
;-------------- загрузчик или ядро системы -------------------------------
ifdef buildKernel
DISPLAY "Start build: Kernel..."
;-------------------------------------------------------------------------
; Используется, если собирается только система (без приложения)
include "system/constants.asm"
;-------------------------------------------------------------------------
include "system/main.asm" ; CLi² Kernel
include "drivers/main.asm" ; CLi² Drivers
include "libs/gli.asm" ; CLi² Graphics Library
include "libs/res.asm" ; CLi² Programms residents
;-------------------------------------------------------------------------
; Используется, если собирается только система (без приложения)
include "system/errorcodes.asm"
include "system/api.h.asm"
include "drivers/drivers.h.asm"
include "libs/gli.h.asm"
include "libs/res.h.asm"
;-------------------------------------------------------------------------
endif
ifdef buildRes
DISPLAY "Start build: Resources..."
include "res/cli.pal.asm" ; CLi² 16 colors palette for text mode (CLi colors)
include "res/zx.pal.asm" ; CLi² 16 colors palette for text mode (ZX colors)
include "res/default.cur.asm" ; CLi² default cursor
include "res/default.fnt.asm" ; CLi² default fonts
endif
;-------------------------------------------------------------------------
ifndef buildKernel
ifdef buildTest
; CLi² test application
DISPLAY "Start build: Test..."
include "app/test.asm"
endif
и далее ещё матрас на 5 экранов!! Что это всё делает в сорцах? Если это опции для сборки?
А если надо подсказать новичку что-то или проверить код из "Этюдов"…
то берётся старая версия и не лохматиться бабушка.
Писать SAVETRD в исходниках…
Адовая ересь! Сжечь за это! Лучше бы уж ключи сделали.
Vitamin, оставь плиз ключ тупо выгрузки bin файла для страждущих.
Shadow Maker
27.02.2015, 18:10
ShM делает всякие там тырдос адаптации. Пользуясь как раз записью в трд, emptytrd и прочими командами. А некий Vitamin хочет продвигать какую-то систему с линкером, которая не нужна лично мне совсем.
---------- Post added at 18:10 ---------- Previous post was at 18:03 ----------
то берётся старая версия и не лохматиться бабушка.
Так исправьте баги сначала в старой версии, потом пилите/выкидывайте/делайтедругуюветку! Сто раз уже говорили.
Адовая ересь! Сжечь за это! Лучше бы уж ключи сделали.
Ключами не отделаешься- в процессе сборки может родиться несколько бинарников в разных областях памяти.
Vitamin, оставь плиз ключ тупо выгрузки bin файла для страждущих.
Он уже есть, но некорректно работает при наличии более одного org в файле.
ShM делает всякие там тырдос адаптации. Пользуясь как раз записью в трд, emptytrd и прочими командами. А некий Vitamin хочет продвигать какую-то систему с линкером, которая не нужна лично мне совсем.
Еще раз повторю вопрос: кто тебе сказал, что я собираюсь выкинуть SAVEBIN/SAVETRD?
Так исправьте баги сначала в старой версии, потом пилите/выкидывайте/делайтедругуюветку! Сто раз уже говорили.
А я тебе в сто первый раз говорю: прежде чем вносить изменения, надо навести порядок.
Ей-богу, как херовый менеджер: "Поехали, потом заведешься".
Каждый раз народ наступает на одни и те же грабли проблем сопровождения софта, писанного в традициях "ересь все эти нововведения, наши деды всю жизнь так делали", но десять сантиметров лобовой брони и затылочная кость не воспринимают уроков.
Alex Rider
27.02.2015, 19:45
Вот посмотри, что сейчас творится в main.asm для проекта CLI2:
А зачем так? Я бы охренел такое поддерживать. Я вот делал морозу смотрелку картинок под биперную музыку. Имен и количество картинок и музык я заранее не знал, картинки надо было жать, собирать tap и trd. Так вот, чтобы там не было такого лютого ада с комментированием дефайнов, я инклюдил в основной файл исходник params.a80, а в него из батника сборочного писал нужные дефайны, инклюды и константы. Использовался только SAVEBIN, разумеется, и линк-тулы для сборки tap и trd. И это было весьма оправдано потому что проект не на 5 минут.
то берётся старая версия и не лохматиться бабушка.
Ага, после отладки упаковывается в архив, выкладывается как ответ новичку, снабжается URL'ами линк-тулов для скачки и пишется портянка, рассказывающая что там за оверхед к одной-единственной процедуре и как со всем этим взлететь.
кто тебе сказал, что я собираюсь выкинуть SAVEBIN/SAVETRD?
Это есть гуд, дело.
А зачем так? Я бы охренел такое поддерживать.
в том-то и суть, что все привыкли писать проекты не больше пары строк, а потом удивляются зачем такие «сложности» городить?
Shadow Maker
28.02.2015, 03:01
Ну короче, если никто не хочет слышать чужое мнение, нахрена тогда спрашивать? Уперлись рогом и хоть об стенку...
Не будет работать как раньше - придётся класть на эту хз когда еще будущую версию болт и пользоваться старой. Я не понимаю, почему нельзя сделать 1 бинарь, и если так нужно - сделать внутри разделение, как ты хочешь.
Одепты линуха чтоли собрались?
Ну хорош уже, ну. Спросили мое мнение - я сказал. Если для вас это "мелочи", то для многих - вообще не мелочи.
Я редактирую текст в FAR и им же запускаю. Поскольку FAR это по сути консоль, то можно сказать, что я не использую сторонних приложений (ну "типа" не использую), то есть мне не надо ничего там прописывать для компиляций, я просто запускаю .exe 1.asm и всё. С разделениями файлов на линкеры и прочее это будет нифига не так просто и удобно.
И вообще, 1 файл на всё - это круто. Тчк.
Кто мешает в настройках ассоциации файлов дописать дополнительный параметр? Настроек для sjasm в фаре по дефолту нет они всеравно вручную добавляются. Будешь точно также звпускать, ничего не поменяется
Shadow Maker
28.02.2015, 22:55
Если всё будет в одном файле - это ок. Но я не хочу стотыщ разных программ, линкеры, записывальщики бинарников, создатели басиков... Хочу чтобы работало как сейчас, понимаете? Если вы прикрутите себе какие-то опции - да пожалуйста, не жалко же. Главное старые вариант чтобы работал как раньше и по дефолту.
Q-Master
02.03.2015, 23:18
Пипец.
Писать SAVETRD в исходниках (желательно в самой жопе, чтоб враг не догадался) - это нормально. А вот писать SAVETRD в мейкфайле - это типа западло.
Конечно западло. Не только лишь все умеют нормально оформлять свои проекты. Многие привыкли к кнопочке "сделать очень хорошо" под которую городится куча костылищ неподдерживаемых в принципе, ибо через неделю уже даже сам аффтар не помнит чего он там на*****кодил.
Смысл в том чтобы вынести все эти сажетрд в мэйкфайл есть 146%.
NovaStorm
05.07.2015, 13:15
Vitamin, собрал sjasmplus-develop (она же последняя?)
var_4test db 0
macro test var
ld a,(var_4test)
endm
test zzz
error: Label not found: zzz_4test
Без _ работает.
NovaStorm, а в чем сокровенная суть параметра макроса?
Разница в поведении с подчеркиванием и без - подозреваю, последствия костыля http://zx-pk.ru/showpost.php?p=159487&postcount=264
NovaStorm
05.07.2015, 16:35
Это ж рафинированный пример, просто у меня вот так совпали имя параметра и часть имени переменной.
Пока пользуюсь v1.07 RC7 (build 02-04-2008), вот, захотел обновиться =)
Костыль костылём, а лепить например имена меток из параметров хотелось бы.
Костыль костылём, а лепить например имена меток из параметров хотелось бы.
Костыль- не то, ЧТО сделано (имена меток из параметров), а КАК сделано.
Bedazzle
12.07.2015, 11:42
Прочитал всю ветку. Весело тут у вас. :)
Так и не понял, планируется ли поддерживать проект (в любом виде, хоть с балканизацией линкера, хоть без).
На текущий момент последняя версия устраивает (т.к. использую минимум функционала), но пугает перспектива в будущем поисков альтернативы умершему.
Bedazzle
17.07.2015, 14:03
Компилю с device zxspectrum48
sjasmplus выдаёт: warning: [SAVESNA] RAM <0x4000-0x4001> will be overriden due to 48k snapshot imperfect format.
Я плюнул, и в виде быстрого фикса хекс эдитором забил сообщение пробелами.
Shadow Maker
18.07.2015, 18:25
Все вопросы к мистеру Витамину, он тут один остался, кто хоть что-то делает в направлении sjasm.
Поможите люди добрые ,здесь мы не местные
была в спековских АСМах такая фишка
LAMER DW #C000
LD H,LAMER[
Загрузка половинки в регистр,а как это сделать в ужасме?
Shadow Maker
18.07.2015, 22:19
Поможите люди добрые ,здесь мы не местные
была в спековских АСМах такая фишка
LAMER DW #C000
LD H,LAMER[
Загрузка половинки в регистр,а как это сделать в ужасме?
В документации написано же. high LAMER
EQU ?
моя вашу не понимает )
это я сначала подумал про присвоение
Поможите люди добрые ,здесь мы не местные
была в спековских АСМах такая фишка
LAMER DW #C000
LD H,LAMER[
Загрузка половинки в регистр,а как это сделать в ужасме?
LAMER EQU #C000
LD H,high LAMER
denpopov
22.07.2015, 08:55
или LAMER/256
Bedazzle
23.07.2015, 11:23
При выгрузке в *.sna можно как-то задать состояние регистров?
При выгрузке в *.sna можно как-то задать состояние регистров?
Всё текущее и выгружается
формат sna - https://valker.wordpress.com/2007/01/11/sna-%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%82-%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2-%D0%B4%D0%BB%D1%8F-zx-spectrum-%D1%8D%D0%BC%D1%83%D0%BB%D1%8F%D1%82%D0%BE%D1%80%D 0%BE%D0%B2/
Всё текущее и выгружается
Ты ассемблер с эмулятором не спутал?
При выгрузке в *.sna можно как-то задать состояние регистров?
Нет. Только стартовый адрес. Автоматически выставляются регистры HL'=0x2758, IY=0x5c3a, SP=0x6000, для 48 памяти и все остальные- I=0x3f, DE'=0x369b, BC'=0, AF'=0x0044, HL=0x2d2b, DE=0x5cdc, BC=0, IX=0xff3c, AF=0x0054, SP - как-то хитро.
Ты ассемблер с эмулятором не спутал?
Нет. Только стартовый адрес. Автоматически выставляются регистры HL'=0x2758, IY=0x5c3a, SP=0x6000, для 48 памяти и все остальные- I=0x3f, DE'=0x369b, BC'=0, AF'=0x0044, HL=0x2d2b, DE=0x5cdc, BC=0, IX=0xff3c, AF=0x0054, SP - как-то хитро.
Может и спутал :)
А в готовом sna поменять нельзя?
denpopov
23.07.2015, 12:29
Кажется, я писал програмку, которая патчит данные для SNA, и забросил прогу.
Bedazzle
24.07.2015, 15:45
Всё текущее и выгружается
Не, мы же в теме про SjASM. Про него вопрос и был, мне там Витамин уже ниже ответил.
---------- Post added at 15:38 ---------- Previous post was at 15:37 ----------
А в готовом sna поменять нельзя?
Ну я так и стал патчить. Костыли вы мои, костыли...
---------- Post added at 15:45 ---------- Previous post was at 15:38 ----------
SP - как-то хитро.
Это видать, связано с тем, что запуск SNA идёт через стек, т.е. в него по идее, должен пушиться необходимый PC, и делаться RET.
Shadow Maker
27.07.2015, 12:51
Ну я так и стал патчить. Костыли вы мои, костыли...
Ну я вместе с кодом ассемблирую запускатор например в #4000, где делаю инит нужных мне регистров и джамп на собственно саму программу. Сам SNA запускает #4000, естественно. Что мешает сделать таким же образом? Да и всяко удобнее чем параметры плодить к SNA или отдельно ее патчить.
Bedazzle
27.07.2015, 21:34
Ну я вместе с кодом ассемблирую запускатор например в #4000, где делаю инит нужных мне регистров и джамп на собственно саму программу. Сам SNA запускает #4000, естественно. Что мешает сделать таким же образом? Да и всяко удобнее чем параметры плодить к SNA или отдельно ее патчить.
Мне удобно делать побайтную сверку того, что было в эмуляторе с тем, что я насобирал. Конечно, можно добавить запускатор, и эти байты игнорить, но тогда надо рассчитать тот же R в обратную сторону. :) А я разве умею. :)
Shadow Maker
27.07.2015, 21:42
Зачем? В запускном последней командой R и добавишь, ну с учетом джампа. Тем более запускной код в одном месте, а основной в другом, не вижу проблем в побайтовой сверке (но зачем побайтово сверять? за ассемблером проверяешь?).
Bedazzle
28.07.2015, 10:15
(но зачем побайтово сверять? за ассемблером проверяешь?).
Чтобы дизассемблерный листинг собирался в оригинал после правок моими прямыми руками. :)
Народ, кто-нибудь может пофиксить сабж, чтобы запускаемый из консоли он мог записывать результат компиляции в бинарный файл? А то ключик есть, а толку от него - нет.
Народ, кто-нибудь может пофиксить сабж, чтобы запускаемый из консоли он мог записывать результат компиляции в бинарный файл? А то ключик есть, а толку от него - нет.
Что должно быть в бинарном файле по результатам компиляции следующего исходника (его размер и данные внутри)?
org #8000
db 0
org $-1
org #6000
db 1
org #c000,7
incbin 'somefile.bin',16
Vitamin, это у тебя не скомпилится - не указана машина под которую компилить
Vitamin, это у тебя не скомпилится - не указана машина под которую компилить
Не суть важно. Пусть 128к будет акцентирования последнего теста.
под 128 никак - нет непрерывного поля данных или сохранять страницы отдельно
а если под 48 то надо сохранять кусок с #6000 по #с007
а если под 48 то надо сохранять кусок с #6000 по #с007
А если под 48 не будет последнего куска с incbin?
kowalski
28.07.2015, 18:05
Единица и 8Кб нулей?
Bedazzle
28.07.2015, 20:01
Единица и 8Кб нулей?
По мне - единица, потом 24.5 кб нулей, потом данные из инклуда. :)
Shadow Maker
28.07.2015, 21:57
Чтобы дизассемблерный листинг собирался в оригинал после правок моими прямыми руками. :)
И за чем же дело стало? В конец исходника добавляешь savebin "blabla",start, end-start и сверяй сколько влезет. Я так делал.
Bedazzle
28.07.2015, 22:09
И за чем же дело стало? В конец исходника добавляешь savebin "blabla",start, end-start и сверяй сколько влезет. Я так делал.
Ну, ума-то мне не хватило, что можно два файла сохранять. :)
Спасибо за подсказку. :)
kowalski
28.07.2015, 22:09
Единица и 8Кб нулей?
По мне - единица, потом 24.5 кб нулей, потом данные из инклуда. :)
Ради интереса скормил pasmo оба варианта (с последним org/incbin и без), у него так и получается.
Кстати говоря, подскажите, а константы из командной строки можно как-нибудь дефайнить?
denpopov
29.07.2015, 05:10
В конец исходника добавляешь savebin "blabla",start, end-start и сверяй сколько влезет. Я так делал.
случайно забыл указать end-start, вышло, что бинарник сохранился с 24576 размером 40960 байт.
Что должно быть в бинарном файле по результатам компиляции следующего исходника (его размер и данные внутри)?
org #8000
db 0
org $-1
org #6000
db 1
org #c000,7
incbin 'somefile.bin',16
Вроде бы, на этот вопрос за меня уже ответили. Кроме того, параметры бинарника, как правило, задаются в самом исходнике. Типа SAVESNA, SAVEBIN и т.п.
Уточняю проблему: можно ли пофиксить работу ключика --raw.
Или, может, уже работает, - в прошлом году я этот вопрос уже задавал здесь:http://zx-pk.ru/showpost.php?p=724999&postcount=1014
Дело в том, что без указанной возможности, SjASM нельзя использовать в пакетной сборке. Я-то могу и другие асмы использовать, но некоторых от сабжа не оторвать, и они не могут воспользоваться удобством автоматической сборки, скажем, плагинов к WildCommander.
Вроде бы, на этот вопрос за меня уже ответили. Кроме того, параметры бинарника, как правило, задаются в самом исходнике. Типа SAVESNA, SAVEBIN и т.п.
Два разных ответа. Хочется получить третий. И причем здесь упомянутые команды?
Уточняю проблему: можно ли пофиксить работу ключика --raw.
А я уточняю работу этого ключика. Особенно интересует его работа в условиях расширенной памяти.
Дело в том, что без указанной возможности, SjASM нельзя использовать в пакетной сборке.
Что мешает заюзать тот же SAVEBIN?
Два разных ответа. Хочется получить третий. И причем здесь упомянутые команды?
"единица, потом 24.5 кб нулей, потом данные из инклуда". правила сами определяйте.
А я уточняю работу этого ключика. Особенно интересует его работа в условиях расширенной памяти.
Очень просто: пусть выдаёт бинарь, грузящийся в основную память одним куском под заданным именем, а то, что должно лежать в страницах отдельными файлами с заданным именем + суффикс с номером страницы. (хотя мне достаточно только 64к, без страниц).
Что мешает заюзать тот же SAVEBIN?
Неудобство заключается в том, что из собирающего проект скрипта нельзя задать имя выходного файла. Ну, в принципе, можно выкрутиться тем, чтобы пользователь указывал в исходнике дефолтное имя бинарнику. Не стрёмно ли это?
Очень просто: пусть выдаёт бинарь, грузящийся в основную память одним куском под заданным именем, а то, что должно лежать в страницах отдельными файлами с заданным именем + суффикс с номером страницы. (хотя мне достаточно только 64к, без страниц).
А как ты узнаешь, под какой адрес предназначен этот бинарник? Я специально усложнил пример несколькими org'ами. Представь, что часть из них находится в чужом коде.
Неудобство заключается в том, что из собирающего проект скрипта нельзя задать имя выходного файла. Ну, в принципе, можно выкрутиться тем, чтобы пользователь указывал в исходнике дефолтное имя бинарнику. Не стрёмно ли это?
Можно сделать чуть проще, хотя тоже кривовато:
echo " SAVEBIN %MYBINARYNAME%,24576,16384" > mysaver.asm
sjasm mysource.asm mysaver.asm
Как руки дойдут, добавлю поддержку передачи define'ов через командную строку, как это сделано в нормальных компиляторах.
А как ты узнаешь, под какой адрес предназначен этот бинарник? Я специально усложнил пример несколькими org'ами. Представь, что часть из них находится в чужом коде.
Определение стартовых адресов - это задача программиста. Если он не идиот,то не будет делать орг на #c000, если знает, что программа должна запускаться с #8000. Не так ли?
Можно сделать чуть проще, хотя тоже кривовато:
echo " SAVEBIN %MYBINARYNAME%,24576,16384" > mysaver.asm
sjasm mysource.asm mysaver.asm
Сурово! :)
Определение стартовых адресов - это задача программиста. Если он не идиот,то не будет делать орг на #c000, если знает, что программа должна запускаться с #8000. Не так ли?
Прикол в том, что это слабо контролируемо и чревато ошибками.
Например, исходник рассчитан на работу из снапшота и что-то компилирует на экран или в буфер принтера. При попытке задампить бинарник получишь хрень.
Прикол в том, что это слабо контролируемо и чревато ошибками.
Например, исходник рассчитан на работу из снапшота и что-то компилирует на экран или в буфер принтера. При попытке задампить бинарник получишь хрень.
Я исхожу из того, что если юзер дошёл до того, что поставил себе интерпретатор REXX для того, чтобы воспользоваться сборщиком плагинов WildCommander, то он точно знает, что они стартуют с #8000. :)
Но по факту получаем, что идиоты у нас защищены, а люди, которые, реально хотят сделать какой-нибудь продукт, остаются в пролёте. :)))))
Я исхожу из того, что если юзер дошёл до того, что поставил себе интерпретатор REXX для того, чтобы воспользоваться сборщиком плагинов WildCommander, то он точно знает, что они стартуют с #8000.
А знают ли об этом все-все авторы кода, который ты у себя используешь? Подключил через include сторонний файл, а там внутри org закопан.
Но по факту получаем, что идиоты у нас защищены, а люди, которые, реально хотят сделать какой-нибудь продукт, вынуждены из-за этого испытывать неудобства. ))))
По факту получаем заточенность под конкретную ситуацию вкупе с уверенностью, что именно эта ситуация единственно возможная и правильная.
Именно поэтому кто-то и выпилил поддержку этой опции. Раз уж так нужна, рекомендую пользоваться той версией, где она есть.
Alex Rider
29.07.2015, 22:35
Как руки дойдут, добавлю поддержку передачи define'ов через командную строку, как это сделано в нормальных компиляторах.
Да, это было бы здорово. Я сейчас в проекты добавляю INCLUDE "defines.a80", а сам текст defines.a80 генерю батником.
Раз уж так нужна, рекомендую пользоваться той версией, где она есть.
Да нет, пожалуй, ты прав, -мало ли что. Просто, выпилю поддержку недоассемблеров. :)
Shadow Maker
30.07.2015, 09:05
На REXX плагины кто-то писал вообще, кроме тебя? :)
На REXX плагины кто-то писал вообще, кроме тебя? :)
:) Неееет.
На рексе писать не надо - на рексе только сборщик. А, вот, все потенциальные "писатели" поголовно в SjAsm привыкли писать.
Какие кросс-ассемблеры у нас ещё популярны?
Shadow Maker
30.07.2015, 13:09
Я только этим пользуюсь. Думаю "у нас" больше никакие не популярны.
denpopov
30.07.2015, 13:15
кроме REXX есть Lua
Ладно, фиг с ним, - уговорили. Но можно хотя бы, по ключу --raw или вновь добавленному задавать из командной строки имя для SAVEBIN.
---------- Post added at 15:48 ---------- Previous post was at 15:38 ----------
кроме REXX есть Lua
А LUA умеет самомодифицирующийся код? :)
Alex Rider
30.07.2015, 17:28
Но можно хотя бы, по ключу --raw или вновь добавленному задавать из командной строки имя для SAVEBIN.
Лучше дефайны через командную строку передавать. А в SAVEBIN использовать эти дефайны.
kowalski
30.07.2015, 17:36
А как pasmo выкручивается со страничками? Или оно вообще в 128 не умеет?
А как pasmo выкручивается со страничками? Или оно вообще в 128 не умеет?а sjasm чем не устраивает?
denpopov
30.07.2015, 19:56
а sjasm чем не устраивает?
А зачем отвечать вопросом на вопрос?
пока в sjAsm'e системные переменные не проинициализированы как надо, проще сделать тапку в pasmo. Да и быстрее.
kowalski
30.07.2015, 21:31
а sjasm чем не устраивает?
На самом деле он классный и лично меня всем устраивает, но мне многого и не нужно. Хотя от дефайнов бы не отказался, удобнее из мейкфайла собирать. Интересно поведение любимого иноземными басурманами pasmo в контексте обсуждаемого вопроса. Просто я сам его ещё не успел потрогать, а знание того, как он ведёт себя в этом плане, может быть полезным для внесения ясности.
Это прикол? В чем смысл? Что бы точно никто не разобрался? Или этот рекскс настолько уныл что по другому никак?
Уныло - это не знать, что такое Rexx :v2_dizzy_facepalm:
denpopov
05.08.2015, 18:41
Уныло - это не знать, что такое Rexx
а на Рексе можно ассемблер слабать?
а на Рексе можно ассемблер слабать?
уверен, что да.
denpopov
17.08.2015, 08:55
есть возможность использовать скрипт Lua. а как получить в скрипте доступ к меткам исходника?
Например, есть метка runpart, как мне обратиться к значению?
denpopov
17.08.2015, 11:46
А все оказалось просто:
local ss=tostring( sj.get_label("run_part") )
Взято из дока:
https://raw.githubusercontent.com/mkoloberdin/sjasmplus/my/docs/documentation.xml
NovaStorm
17.08.2015, 13:03
А xsl'ки нету?
Dr.Potapov
22.09.2015, 08:47
Переписываю сейчас кусочек кода с ZEUS на SjASMPlus, не могу разобраться в синтаксисе.
Как оформить в SjASM зевсовскую конструкцию: CP "A!W или DB "A!W, A!X
???
То есть нутром понимаю что там логический OR но на SjASM переложить не могу.
Shadow Maker
22.09.2015, 09:18
А что это хоть делает-то. Логический OR на sjasm - ||
Вероятно че-то типа "A"||"W", если я правильно понимаю (потому что хз что это такое - байты или что).
Но в DB ты так не воткнешь, надо че-то типа EQU.
Dr.Potapov
22.09.2015, 09:37
А что это хоть делает-то.
Да простое сравнение из разряда
LD A,(HL)
CP "A!W
JR Z,DUMMYLABEL
В ZEUS сравнение с "А" пишется как "А, без второй кавычки.
Логический OR на sjasm - ||
Спасибо, я невнимательный читатель манов )
Но в DB ты так не воткнешь, надо че-то типа EQU.
EQU там не сгодится, так как табличка данных описывается.
Думаю надо ассемлировать в ZEUS эти строки и посмотреть что он там в действительности делает ))) Подозрение, что что то сам додумывает для удобства.
Dr.Potapov
22.09.2015, 23:56
УФФ ) разобрался )
дело было так:
W EQU %1000 0000
X EQU %1010 0000
; поэтому конструкция
CP "A!W
;работает ))
просто плохо и не внимательно прочитал чужой код
Bedazzle
15.10.2015, 17:21
Есть вопрос, как удобней всего оформлять список объектов, когда затем в разных местах программы используются порядковые номера этих объектов (т.е. индексы)?
Т.е. имеем что-то вроде:
Сами объекты:
objects:
DB 'aaaa'
DB 'b'
DB 'aasdasd
DB 'ad'
objects_end:
...
Табличка индексов:
object_1 EQU 1
object_2 EQU 2
object_3 EQU 3
object_4 EQU 4
И потом использование:
...
ld a, obect_2
...
cp object_4
...
Можно ли как-то обойтись без таблицы, т.е. что-то типа:
objects:
object_1:
DB 'aaaa'
object_2:
DB 'b'
object_3:
DB 'aasdasd
object_4:
DB 'ad'
objects_end:
Может быть, sjasm умеет автоматически индекс строки давать?
Для объектов одинакового размера использую
(objects_end - objects) / object_len + 1
shurik-ua
15.10.2015, 17:39
objects:
DB 'aaaa'
DB 'b'
DB 'aasdasd
DB 'ad'
objects_end:
асм видит эту конструкцию как
objects:
DB 'aaaabaasdasdad'
objects_end:
SAM style
15.10.2015, 17:57
Во, кстати. Насчёт индексов/ID. Мне лично иногда не хватало аналога enum, хотя бы только для чисел. Типа вот:
ENUM id1=0,id2,id3,id4=7,id5,id6чтобы получить id1=1, id2=2, id3=3, id4=7, id5=8, id6=9...
struct object
f0 byte "a"
byte "a"
byte "a"
byte "a"
f1 byte "b"
f2 byte "a"
byte "a"
byte "s"
byte "d"
byte "a"
byte "s"
byte "d"
f3 byte "a"
byte "d"
ends
objects ds object*10 ; место для 10 объектов
ld hl,objects+5*object+object.f2 ;адрес поля f2 5-го (начиная с 0) объекта
---------- Post added at 18:10 ---------- Previous post was at 18:08 ----------
Во, кстати. Насчёт индексов/ID. Мне лично иногда не хватало аналога enum, хотя бы только для чисел. Типа вот:
ENUM id1=0,id2,id3,id4=7,id5,id6чтобы получить id1=1, id2=2, id3=3, id4=7, id5=8, id6=9...
struct Types
id0 byte
id1 byte
id2 byte
id3 byte
...
ends
будет аналогично
Types.id0=0
Types.id1=1
Types.id2=2
Types.id3=3
...
Bedazzle
15.10.2015, 23:40
ld hl,objects+5*object+object.f2 ;адрес поля f2 5-го (начиная с 0) объекта
Я фигово объяснил. Попробую на другом примере.
Пускай, есть блок данных со спрайтами.
Спрайт содержит два байта - ширину и высоту, и некоторое количество данных самой картинки. Что-то такое:
спрайт1
1, 1, .... тут 8 байт графики
спрайт2
2, 3, .... тут 48 байт графики
спрайт3
5, 2, ... тут 80 байт графики
и есть блок, описывающий комнату, где используются координаты на экране, и номер (!) спрайта
3,5,1 - в координаты 3,5 поместить спрайт номер 1 (именно индекс, а не адрес!)
10,20,1 - ... 10, 20, номер 1
15,2,3 - ... 15, 2, номер 3
25,10,2 - ... 25, 10, номер 2
естественно, описывать комнату цифрами не по-человечески, хочется давать нормальные названия индексам, которые и будут использоваться
3,5,собака
10,20,собака
15,2,книга
25,10,звезда
короче, что-то похожее на упомянутые enum-ы
А как ты собираешься по индексу находить адрес, если они все разного размера?
Bedazzle
16.10.2015, 00:05
А как ты собираешься по индексу находить адрес, если они все разного размера?
Да там уже есть процедуры, которые пробегают по данным.
Одна ищет маркеры (zero-terminated), и находит начальный адрес нужного куска.
Другая что-то типа как со спрайтами я описал, тоже рассчитывает начальный адрес следующего блока с объектом, переходя от одного к другому, используя информацию о размере.
Есть и так:
ld hl, table_start
ld bc, object_size
ld a, (de) ; A = object index
scan_objects:
dec a
ret z
add hl, bc
jr scan_objects
Квадратичная сложность - не слишком ли большая цена за экономию десятка байт памяти? Не говоря уже о затратах на код поиска.
Bedazzle
16.10.2015, 00:13
Квадратичная сложность - не слишком ли большая цена за экономию десятка байт памяти? Не говоря уже о затратах на код поиска.
Ну, это не ко мне вопрос :)
Меня больше интересует, как это можно представить в человеческом виде, чтобы потом было удобно поддерживать.
:)
Адресам конкретных спрайтов назначить метки и использовать. Не?
struct sprite
w byte
h byte
data byte
ends
struct object
x byte
y byte
addr word
ends
object 0,5,dog
object 7,3,cat
dog sprite 3,8
db data
cat sprite 2,7
db data
Bedazzle
16.10.2015, 00:37
Адресам конкретных спрайтов назначить метки и использовать. Не?
Я с объектами ещё не умею, пока ничего не делал, буду почитать.
Не догоняю, где в приведённом примере индексы для кота и собаки задаются.
Upd.
Во, чуть проще пример, чтобы стало понятна печаль с индексами.
animation:
DB #15, #16, #16, #16, #15, #01, #5E
Вот эти вот байты - номера спрайтов из набора.
И в тексте программы хочется использовать вместо числовых значений человеческие названия, скажем
animation:
DB WALK, PUNCH, PUNCH, PUNCH, WALK, JUMP, ANIMATION_STOP
сейчас я не вижу, как это можно сделать, не задавая
JUMP EQU #01
.....
WALK EQU #15
PUNCH EQU #16
ANIMATION_STOP EQU #5E
в таком виде один кусок программы получается очень сильно завязан на другой,
и если вдруг затем потребуется двигать спрайт PUNCH, то очень легко попортить данные, если забыть обновить EQUшки.
Я с объектами ещё не умею, пока ничего не делал, буду почитать.
Это просто структуры. Можно и без них, обычными defb.
в таком виде один кусок программы получается очень сильно завязан на другой,
и если вдруг затем потребуется двигать спрайт PUNCH, то очень легко попортить данные, если забыть обновить EQUшки.
Все потому, что ты пытаешься жрать кактус с этими идентификаторами.
Да, можно и с ними:
;идентификаторы, enum для бедных
struct sprites
stop byte ;fake
walk word
punch word
jump word
ends
macro mksprite id,w,h,datafile
spriteaddr=$
org lookup+id
dw spriteaddr
org spriteaddr
db w,h
incbin datafile
endm
;табличка с указателями на спрайты чтоб не надо было тупить с поиском
lookup sprites
;данные спрайтов
mksprite sprites.walk,1,2,"walk.bin"
mksprite sprites.punch,3,4,"punch.bin"
mksprite sprites.jump,5,6,"jump.bin"
;анимация
animation:
db sprites.walk,sprites.punch,sprites.punch,sprites.w alk,sprites.jump,sprites.stop
;получение адреса спрайта по идентификатору (в А)
getsprite:
ld l,a
ld h,high lookup
ld a,(hl)
inc l
ld h,(hl)
ld l,a
ret
Но это все дикий треш по сравнению с использованием нормальных адресов:
macro mksprite w,h,datafile
db w,h
incbin datafile
endm
;данные спрайтов
module sprites
stop=0
walk mksprite 1,2,"walk.bin"
punch mksprite 3,4,"punch.bin"
jump mksprite 5,6,"jump.bin"
endmod
;анимация
animation:
dw sprites.walk,sprites.punch,sprites.punch,sprites.w alk,sprites.jump,sprites.stop
И все! При этом, компилятор берет на себя проблемы типа необъявленного спрайта, на который ссылаются.
Bedazzle
16.10.2015, 11:31
Все потому, что ты пытаешься жрать кактус с этими идентификаторами.
Это дизасм, вот и выходит, что приводить в удобный вид приходится то, что было не мной сделано.
Так что с адресами пока не получится. :(
NEO SPECTRUMAN
17.10.2015, 16:36
Ткните меня носом ктонить в последнюю версию :v2_blink:
и в доки к нему
компилятор встроенный в emuzwin больше не могу терпеть :v2_dizzy_facepalm:
из за истерических припадков вызванных последним чота не могу найти...
или новей 1.07 RC7 ничего нет?
Bedazzle
17.10.2015, 18:39
или новей 1.07 RC7 ничего нет?
Я так понял, что это последняя стабильная версия.
Dr.Potapov
17.10.2015, 20:37
Ткните меня носом ктонить в последнюю версию :v2_blink:
и в доки к нему
компилятор встроенный в emuzwin больше не могу терпеть :v2_dizzy_facepalm:
из за истерических припадков вызванных последним чота не могу найти...
или новей 1.07 RC7 ничего нет?
А доки прям внутри ) 1.07 последний.
Bedazzle
21.10.2015, 11:04
Пара вопросов по макросам:
1) пять параметров - максимум?
2) а можно использовать динамическое количество параметров?
Lethargeek
22.11.2015, 19:25
Я так понял, такой тип как битовые строки в сабже отсутствует? Между тем порою был бы полезен. Например, я сейчас отлаживаю депакер, скармливая подопытным процедуркам тестовые битовые потоки. Разбирать их ручками по байтикам (а тем более изменять и редактировать) неудобно. То есть вместо:
BYTE %11000100, %11010101, %11011001, %10101111, %10100000
хочется иметь возможность написать что-то вроде:
BITS 1 1 0 00 1 0 01 1 0 10 1 0 11 1 0 1 1 001 1 0 10 1 1 111 01 0
или даже:
BITS {1(1 0 00)(1 0 01)(1 0 10)(1 0 11)} [1(0)(1 1 001)(1 0 10)(1 1 111 01)] {0}
Причём скобки (и вообще любые знаки, нужные только для удобочитаемости монотонных 0 и 1) чтобы просто игнорировались, кроме одного зарезервированного знака (запятая?) для выравнивания на границу байта (или ставить с новой строчки ALIGN1 ; в любом случае просто новые строки с директивой BITS одна за другой не должны выравниваться по байту!)
Lethargeek
23.11.2015, 17:14
krt17, что-то не особенно вдохновляет :) так-то я и в бинарь отдельно могу распарсить, а хочется возиться поменьше
Bedazzle
24.11.2015, 09:36
а хочется возиться поменьше
Ну, это к тому, как я спросил, нет ли чего поновее и более развивающегося, чем SjASM/Pasmo, а надо мной поржали, что за 30 лет ассемблер не изменился. Вопрос-то не в системе команд процессора (которая действительно не менялась), а в плюшках, которыми можно улучшить и упростить работу.
Shadow Maker
24.11.2015, 09:57
Колхоз - дело добровольное. Никто не жаждет заниматься внедрением никаких новых плюшек почему-то.
Bedazzle
24.11.2015, 11:51
Колхоз - дело добровольное. Никто не жаждет заниматься внедрением никаких новых плюшек почему-то.
Было бы оно на паскале - я бы взял. Моих очень начальных знаний в сях тупо не хватит на такой проект.
perestoronin
24.11.2015, 12:10
на паскале - я бы взял
http://demin.ws/blog/russian/2012/10/09/rewrite-of-as/
http://john.ccac.rwth-aachen.de:8000/as/
Если честно, то сходу не совсем понятно, что это за язык. Это, конечно, С, но изначально исходник был на Паскале, потом автор решил перейти на С, оставив основную часть кода практически без изменений.
Проект называется “Macro-assembler AS”, автор Альфред Арнольд. Я его использую как макро-ассемблер для Intel 8080, который собирается на Маке, Линуксе и Windows. Лучшего я пока ничего не нашел.
Как пишет сам автор, изначально проект был на Турбо-Паскале, но потом автор был вынужден перейти на С, так как Борланд остановил развитие досовских версий, и нормального Паскаля для Линукса тогда еще тоже не было. В итоге автор сконвертировал исходники в С и продолжил развивать проект в нового ключе. Несмотря на всю сомнительность затеи, по мне, сделал он это весьма удачно, и проект не умер, как это часто бывает в случаях полного переписывания большого проекта. Но хотя я склонировал проект для себя, собрал на Маке и радостно использую, не испытываю жгучего желания что-либо контрибьютить, так как для соблюдения стиля надо писать на этом гремучем Паскале-Си. Увы, это неизбежное следствие конверсии, иначе проект превратится в помойку. Если поелозить по исходникам, можно найти много интересных трюков типа “как сделать так, чтобы Си работал как Паскаль”.
Кстати сейчас ситуация иная, и никто не мешает вернуться на новую реализацию Паскаля и IDE под него:
https://ru.wikipedia.org/wiki/Lazarus
Bedazzle
24.11.2015, 13:50
Как пишет сам автор, изначально проект был на Турбо-Паскале, но потом автор был вынужден перейти на С
Сурово.
Вспоминается байка нашего препода, что ему в виде халтуры попал проект, который писал упёртый паскалист, но его вынудили писать по какой-то причине на С.
В итоге в начале файла было переопределение кучи паскалевских конструкций, и далее весь сишный код использовал эти макросы, т.е. читался практически как чистый паскаль...
Кстати сейчас ситуация иная, и никто не мешает вернуться на новую реализацию Паскаля
С этим есть нюансы, самый главный из которых - под андроид пока не умеет компилить. Под виндой - на выходе достаточно здоровые файлы (сейчас это малокритично), и... более медленные, чем из-под той же седьмой дельфы (видимо, следствие юникодности и кросплатформенности).
Кстати, на лазаре ваяю редактор для HOTM.
Alex Rider
24.11.2015, 17:58
Было бы оно на паскале - я бы взял.
Тут понимаешь какая картинка... Проект открытый, и много кто "бы взял", но потом выясняется такая штука: очередной автор пишет нужные себе плюшки, делает еще несколько сторонних хотелок, а потом у него кончается запал и получается очередная тупиковая ветка (мержить исходники, равно как и поддерживать центральный репозиторий тоже никто не хочет). А потом на форуме возникают вопросы "а где взять самую последнюю версию xxx?", а версий таких несколько, разной степени глючности и с разным набором фишек. Мне вот нужны были структуры на SjASM, я взял, да и пофиксил баги в них в авторской версии, пользуюсь самосборным в результате. И да, я тоже с C/C++ не дружу. Perestoronin тоже что-то фиксил под себя. Vitamin поддерживает свою ветку. Но никто даже и не знает, а есть ли версия, которая собирается под Linux и жует структуры. Уж не говоря про поддержку брейкпоинтов в какой-то очередной такой же кастомной ветке unreal.
Lethargeek
10.12.2015, 05:17
вот такой пример:
ORG $C000
bnode1 db LOW (label1-$), LOW (label1-$)
bnode2 db LOW (label2-$)
db LOW (label2-$)
wnode1 dw label1-$, label1-$
wnode2 dw label2-$
dw label2-$
label1 ld b,50
halt
djnz $-1
label2 ld b,50
halt:djnz $-1
результат:
C000 0C 0C bnode1 db LOW (label1-$), LOW (label1-$)
C002
C002 0F bnode2 db LOW (label2-$)
C003 0E db LOW (label2-$)
C004
C004 08 00 08 00 wnode1 dw label1-$, label1-$
C008
C008 09 00 wnode2 dw label2-$
C00A 07 00 dw label2-$
C00C
C00C 06 32 label1 ld b,50
C00E 76 halt
C00F 10 FD djnz $-1
C011
C011 06 32 label2 ld b,50
C013 76 halt
C014 10 FD djnz $-1
опаньки! почему в $C000 и $C004 числа одинаковые?
получается, что $ равен адресу первого числа в def-строке, а не текущего! разве так правильно?
тем более что, как видим ниже, для команд уже нет никакой разницы, первая она в строке или нет
правильно\неправильно - вопрос к автору той версии сджасма которую ты юзаешь....
перенеси dw на новую строчку и не заморачивайся...
Lethargeek
10.12.2015, 23:39
правильно\неправильно - вопрос к автору той версии сджасма которую ты юзаешь....
дык последнюю доступную 1.07rc7 (rc8 я по ссылкам не обнаружил)
перенеси dw на новую строчку и не заморачивайся...
для меня это заморачиваться как раз, некрасиво и чревато ошибками
у меня байтовое бинарное дерево с переходом по смещению от листа
и удобно, чтобы разветвления шли построчно, влево и вправо
- - - Добавлено - - -
По моему с дефами как раз правильно, а вот с кодом не совсем, по идее должно быть так же.
ящетаю, всё должно быть ровно наоборот: в дефах $ должен соответствовать текущему элементу, а в кодовой строке - началу строки
Хотя все эти переходы по $ и запись через : только ухудшают читаемость имхо.
запись-то скорей улучшает, когда опы тесно связаны в одно действие (и при отладке их удобней закомментировать)
Lethargeek
11.12.2015, 00:28
ну вот и суть, задача не в реальном коде, а в необходимости имитировать генерируемые данные вручную
нет, не суть, они не все генерируются
Ну не знаю всегда коментил блоки по ctrl+/ хотя да хорошая причина сделать код нечитаемым,
текст читаем лучше, когда глазу не приходится выискивать, где же в монотонном столбце отдельных команд начинается очередное цельное действие
и когда листать поменьше приходится, потому что нет нужды каждый чих пустыми строками выделять, и на экране больше информации помещается
Bedazzle
13.12.2015, 00:04
Есть вопрос, как удобней всего оформлять список объектов, когда затем в разных местах программы используются порядковые номера этих объектов (т.е. индексы)?
Сделал через MAP, получилось что-то вроде:
MAP 0
INDEX_0: #1 SETSPRITE 5, 6
INDEX_1: #1 SETSPRITE 12, 1
INDEX_2: #1 SETSPRITE 3, 7
....
creature:
DB INDEX_1, INDEX_2
Какой-то не понятный глюк в ужасме. делаю:
wascorrlogd: INCBIN "corlogd_.bin"
ORG wascorrlogd
LUA ALLPASS
for i=1,256,1 do
l_scrtopx = sj.get_label("screen_topx") * 8
addr = sj.current_address+l_scrtopx
byte = sj.get_byte(addr)
sj.insert_define("_b", byte)
print("addr=",addr)
_pc("db _b")
end
ENDLUA
т.е. погруженная табличка должна быть подправлена. ORG стоит, но по факты, кусок Lua кода исполняет код на 256 байт ниже. Т.е. это _pc("db _b") производит запись игнорируя ORG, соответственно, не с адреса, скажем #8500, с которой табличка, а с адреса #8600, сразу за ней. Косяк! Как это исправить? может я что-то не так делаю?
Как это исправить? может я что-то не так делаю?
а так что напишет?
display $
wascorrlogd: INCBIN "corlogd_.bin"
ORG wascorrlogd
display $
в том-то и дело, что в консоль пишет он всё верно и даже в логах (файл листинга) тоже всё верно. А в бинарном файле каша! Т.е. даже если заменить скрипт на lua на что-то типа:
wascorrlogd:
INCBIN "corlogd_.bin"
ORG wascorrlogd
DUP 256
db {$+(screen_topx*8)} & 0xff ;альтернативная замена аласмовскому безобразию
EDUP
то один фиг, ORG игнорируется и данные попадают сразу после инкбиненой таблички. Хрень какая-то.
бинарник собираю не в снапшот, а именно в бинарник камандой типа sjasmplus.exe %1.asm --raw=%1.exe --lst=%1.lst (или принудительно через OUTPUT в теле исходника).
ну и конечно если нет никакого потаенного смысла может проще написать _pc("db "..byte) вместо дефайна
- - - Добавлено - - -
хо хо
org при компиляции в raw ясен фиг не играет
- - - Добавлено - - -
компиль в девайс режиме и сохраняй savebin
да, я так и понял, что таблички собирать придётся отдельно. ацтой, чё. только почему в рав не играет, какая разница, оно что там бинарь, что так бинарь. тупость ужасмовская.
и кстати, собирается всё и так с DEVICE ZXSPECTRUM128. Но только savebin спасает. бред в общем.
Powered by vBulletin® Version 4.2.5 Copyright © 2026 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot