Лучше дефайны через командную строку передавать. А в SAVEBIN использовать эти дефайны.
Вид для печати
А как pasmo выкручивается со страничками? Или оно вообще в 128 не умеет?
На самом деле он классный и лично меня всем устраивает, но мне многого и не нужно. Хотя от дефайнов бы не отказался, удобнее из мейкфайла собирать. Интересно поведение любимого иноземными басурманами pasmo в контексте обсуждаемого вопроса. Просто я сам его ещё не успел потрогать, а знание того, как он ведёт себя в этом плане, может быть полезным для внесения ясности.
есть возможность использовать скрипт Lua. а как получить в скрипте доступ к меткам исходника?
Например, есть метка runpart, как мне обратиться к значению?
А все оказалось просто:
local ss=tostring( sj.get_label("run_part") )
Взято из дока:
https://raw.githubusercontent.com/mk...umentation.xml
А xsl'ки нету?
Переписываю сейчас кусочек кода с ZEUS на SjASMPlus, не могу разобраться в синтаксисе.
Как оформить в SjASM зевсовскую конструкцию: CP "A!W или DB "A!W, A!X
???
То есть нутром понимаю что там логический OR но на SjASM переложить не могу.
А что это хоть делает-то. Логический OR на sjasm - ||
Вероятно че-то типа "A"||"W", если я правильно понимаю (потому что хз что это такое - байты или что).
Но в DB ты так не воткнешь, надо че-то типа EQU.
Да простое сравнение из разряда
В ZEUS сравнение с "А" пишется как "А, без второй кавычки.Код:LD A,(HL)
CP "A!W
JR Z,DUMMYLABEL
Спасибо, я невнимательный читатель манов )Цитата:
Логический OR на sjasm - ||
EQU там не сгодится, так как табличка данных описывается.Цитата:
Но в DB ты так не воткнешь, надо че-то типа EQU.
Думаю надо ассемлировать в ZEUS эти строки и посмотреть что он там в действительности делает ))) Подозрение, что что то сам додумывает для удобства.
УФФ ) разобрался )
дело было так:
просто плохо и не внимательно прочитал чужой кодКод:W EQU %1000 0000
X EQU %1010 0000
; поэтому конструкция
CP "A!W
;работает ))
Есть вопрос, как удобней всего оформлять список объектов, когда затем в разных местах программы используются порядковые номера этих объектов (т.е. индексы)?
Т.е. имеем что-то вроде:
Сами объекты:
Табличка индексов:Код: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
...
Можно ли как-то обойтись без таблицы, т.е. что-то типа:
Может быть, sjasm умеет автоматически индекс строки давать?Код:objects:
object_1:
DB 'aaaa'
object_2:
DB 'b'
object_3:
DB 'aasdasd
object_4:
DB 'ad'
objects_end:
Для объектов одинакового размера использую
(objects_end - objects) / object_len + 1
асм видит эту конструкцию какКод:objects:
DB 'aaaa'
DB 'b'
DB 'aasdasd
DB 'ad'
objects_end:
Код:objects:
DB 'aaaabaasdasdad'
objects_end:
Во, кстати. Насчёт индексов/ID. Мне лично иногда не хватало аналога enum, хотя бы только для чисел. Типа вот:чтобы получить id1=1, id2=2, id3=3, id4=7, id5=8, id6=9...Код:ENUM id1=0,id2,id3,id4=7,id5,id6
Код: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 ----------
будет аналогичноКод:struct Types
id0 byte
id1 byte
id2 byte
id3 byte
...
ends
Код:Types.id0=0
Types.id1=1
Types.id2=2
Types.id3=3
...
Я фигово объяснил. Попробую на другом примере.
Пускай, есть блок данных со спрайтами.
Спрайт содержит два байта - ширину и высоту, и некоторое количество данных самой картинки. Что-то такое:
спрайт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-ы
А как ты собираешься по индексу находить адрес, если они все разного размера?
Да там уже есть процедуры, которые пробегают по данным.
Одна ищет маркеры (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
Квадратичная сложность - не слишком ли большая цена за экономию десятка байт памяти? Не говоря уже о затратах на код поиска.
Адресам конкретных спрайтов назначить метки и использовать. Не?
Код: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
Я с объектами ещё не умею, пока ничего не делал, буду почитать.
Не догоняю, где в приведённом примере индексы для кота и собаки задаются.
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.
Все потому, что ты пытаешься жрать кактус с этими идентификаторами.
Да, можно и с ними:
Но это все дикий треш по сравнению с использованием нормальных адресов:Код:;идентификаторы, 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.walk,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.walk,sprites.jump,sprites.stop
Ткните меня носом ктонить в последнюю версию :v2_blink:
и в доки к нему
компилятор встроенный в emuzwin больше не могу терпеть :v2_dizzy_facepalm:
из за истерических припадков вызванных последним чота не могу найти...
или новей 1.07 RC7 ничего нет?
Пара вопросов по макросам:
1) пять параметров - максимум?
2) а можно использовать динамическое количество параметров?
Я так понял, такой тип как битовые строки в сабже отсутствует? Между тем порою был бы полезен. Например, я сейчас отлаживаю депакер, скармливая подопытным процедуркам тестовые битовые потоки. Разбирать их ручками по байтикам (а тем более изменять и редактировать) неудобно. То есть вместо:
хочется иметь возможность написать что-то вроде:Код: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
Причём скобки (и вообще любые знаки, нужные только для удобочитаемости монотонных 0 и 1) чтобы просто игнорировались, кроме одного зарезервированного знака (запятая?) для выравнивания на границу байта (или ставить с новой строчки ALIGN1 ; в любом случае просто новые строки с директивой BITS одна за другой не должны выравниваться по байту!)Код: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}
krt17, что-то не особенно вдохновляет :) так-то я и в бинарь отдельно могу распарсить, а хочется возиться поменьше
Ну, это к тому, как я спросил, нет ли чего поновее и более развивающегося, чем SjASM/Pasmo, а надо мной поржали, что за 30 лет ассемблер не изменился. Вопрос-то не в системе команд процессора (которая действительно не менялась), а в плюшках, которыми можно улучшить и упростить работу.
Колхоз - дело добровольное. Никто не жаждет заниматься внедрением никаких новых плюшек почему-то.
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
Сурово.
Вспоминается байка нашего препода, что ему в виде халтуры попал проект, который писал упёртый паскалист, но его вынудили писать по какой-то причине на С.
В итоге в начале файла было переопределение кучи паскалевских конструкций, и далее весь сишный код использовал эти макросы, т.е. читался практически как чистый паскаль...
С этим есть нюансы, самый главный из которых - под андроид пока не умеет компилить. Под виндой - на выходе достаточно здоровые файлы (сейчас это малокритично), и... более медленные, чем из-под той же седьмой дельфы (видимо, следствие юникодности и кросплатформенности).
Кстати, на лазаре ваяю редактор для HOTM.
Тут понимаешь какая картинка... Проект открытый, и много кто "бы взял", но потом выясняется такая штука: очередной автор пишет нужные себе плюшки, делает еще несколько сторонних хотелок, а потом у него кончается запал и получается очередная тупиковая ветка (мержить исходники, равно как и поддерживать центральный репозиторий тоже никто не хочет). А потом на форуме возникают вопросы "а где взять самую последнюю версию xxx?", а версий таких несколько, разной степени глючности и с разным набором фишек. Мне вот нужны были структуры на SjASM, я взял, да и пофиксил баги в них в авторской версии, пользуюсь самосборным в результате. И да, я тоже с C/C++ не дружу. Perestoronin тоже что-то фиксил под себя. Vitamin поддерживает свою ветку. Но никто даже и не знает, а есть ли версия, которая собирается под Linux и жует структуры. Уж не говоря про поддержку брейкпоинтов в какой-то очередной такой же кастомной ветке unreal.