breeze, больше похоже на проблему компиляции собственно команд. Не приведёшь сам макрос, не весь, а те строки, где ты используешь параметры?
Вид для печати
breeze,
у тебя внутри макроса стоит DB
а передаешь ты ему word (255+)
других вариантов не бывает
код покажи.
introspec, вместо Byte ты передаешь Word
все остальное от лукавого
Да, вы немного угадали :) макрос строит структуру db, но…
возможно я не так понял как пользоваться low/high ?Код:MACRO MCreateSprite posX, posY, width, height, pal
db low posY ; Y0-7 | 8 bit младшие даные Y координаты (0-255px)
;FLAR S Y8
db %00100000|((height/8)-1)<<1|high posY ; Y8 | 0й бит - старшие данные Y координаты (256px >)
; YS | 1,2,3 бит - высота в блоках по 8 px
; RESERVED | 4й бит - зарезервирован
; ACT | 5й бит - спрайт активен (показывается)
; LEAP | 6й бит - указывает, что данный спрайт последний в текущем слое. (для перехода по слоям)
; YF | 7й бит - указывает, что данный спрайт нужно отобразить зеркально по вертикали
db low posX ; X0-7 | 8 bit младшие даные X координаты (0-255px)
;F R S X8
db %00000000|((width/8)-1)<<1|high posX ; X8 | 0й бит - старшие данные X координаты (256px >)
; XS | 1,2,3 бит - ширина в блоках по 8 px
; RESERVED | 4й бит - зарезервирован
; - | 5,6й бит - не используются
; XF | 7й бит - указывает, что данный спрайт нужно отобразить зеркально по горизонтали
;TNUM
db %00000000 ; TNUM | Номер тайла для левого верхнего угла.
; | 0,1,2,3,4,5й бит - Х координата в битмап
;SPALTNUM ; | 6,7й бит +
db %00000000|(pal<<4) ; TNUM | 0,1,2,3 бит - Y координата в битмап
; SPAL | 4,5,6,7й биты номер палитры (?)
ENDM
---------- Post added at 17:46 ---------- Previous post was at 17:27 ----------
короче дело было в этих странных low/high, заменил на posX%255 и (posX/256) и всё ок стало.
Но теперь другая проблема. Мегаумный компилятор округляет 0.1 до 1 //_—
эээ… что-то не совсем понял. В первых здесь собираются биты и они означают разные статусы, и кроме того в low я уже заворачивал. Собственно с этого я и начал — вылетает «error: Bytes lost».
По сути мне нужен какой-то операнд, который скажет sjasm'u? что 0.1 это всё-таки 0, а не 1. Тобишь активировать округление в меньшую сторону.
introspec, видишь я был прав :)
breeze, у тебя какая версия асма? У меня твой макрос нормально скомпилировался.
Не в версии асма дело, я ж не говорил что оно не компилит. Просто ошибку выдавало.
Короче уже сам разобрался, проблема была в 255, заменил на 256 всё ОК. Не внимательно просто заменил.
Если кому интересно, рабочий вариант:
Код:MACRO MCreateSprite posX, posY, width, height, pal
db posY%256 ; Y0-7 | 8 bit младшие даные Y координаты (0-255px)
;FLAR S Y8
db %00100000|((height/8)-1)<<1|(posY/256) ; Y8 | 0й бит - старшие данные Y координаты (256px >)
; YS | 1,2,3 бит - высота в блоках по 8 px
; RESERVED | 4й бит - зарезервирован
; ACT | 5й бит - спрайт активен (показывается)
; LEAP | 6й бит - указывает, что данный спрайт последний в текущем слое. (для перехода по слоям)
; YF | 7й бит - указывает, что данный спрайт нужно отобразить зеркально по вертикали
db posX%256 ; X0-7 | 8 bit младшие даные X координаты (0-255px)
;F R S X8
db %00000000|((width/8)-1)<<1|(posX/256) ; X8 | 0й бит - старшие данные X координаты (256px >)
; XS | 1,2,3 бит - ширина в блоках по 8 px
; RESERVED | 4й бит - зарезервирован
; - | 5,6й бит - не используются
; XF | 7й бит - указывает, что данный спрайт нужно отобразить зеркально по горизонтали
;TNUM
db %00000000 ; TNUM | Номер тайла для левого верхнего угла.
; | 0,1,2,3,4,5й бит - Х координата в битмап
;SPALTNUM ; | 6,7й бит +
db %00000000|(pal<<4) ; TNUM | 0,1,2,3 бит - Y координата в битмап
; SPAL | 4,5,6,7й биты номер палитры (?)
ENDM
breeze, я всё ещё не могу воспроизвести сообщение об ошибке. Скажи, пожалуйста, какие-нибудь значения height и posY на которых у тебя вылетало. Если что, я довольно последовательно изничтожил деления из моих констант, и всё время пишу с high/low, так что мне интересно понять, откуда растут ноги у твоей проблемы.
а насколько реально внедрить в sjAsm опцию похожую в pasmo сохранение как .TAP?
пользоваться своим костылем уже поднадоело.
denpopov, сохраняй сна - для отладки самое оно
Кто знает как победить? Не отключая warnings:
Код:# cat rawsource.h
class RawSource {
public:
RawSource(string);
RawSource(StringList);
StringList ReadUntil(StringList,StringList,string);
void Process();
SourceList &GetSource() { return _source; }
void ClearSource() { _source.clear(); }
void AddToSource(SourceList n) { _source.splice(_source.end(),n); }
protected:
RawSource() {}
void _Preprocess();
string _KillComments();
void _Group1(string&);
void _ReplaceDefs(string &);
void _Group2(string&);
void _CutLines(string&);
int _ParseLabel(string&);
void _ParseRepeat(string&);
void _ExpandMacros(string&);
int _AssemblerDirectives(string&);
void _Mnemonics(string&);
int _nextline();
StringList _sl;
iStringList _it;
SourceList _source;
string _unexpectedin;
int _unexcurlin,_unexlistcurlin;
void virtual _Parse(string&);
};
class RSRepeat : public RawSource {
public:
RSRepeat() {}
void parserepeat(string &s) { _ParseRepeat(s); }
};
class RSStructure : public RawSource {
private:
void _Parse(string&);
int _offset,_defaultalign;
bool _global;
Structure &_s;
bool _mustalign;
int _newalign;
public:
RSStructure(int n_offset, int n_align, bool n_global, Structure &n_s, StringList &sl) :
_offset(n_offset), _defaultalign(n_align), _global(n_global), _s(n_s), _mustalign(false), RawSource(sl) {}
};
Код:# make
g++ -Wp,-MD,.deps/datadir.d -Wall -O2 -c -o datadir.o datadir.cpp
In file included from sjasm.h:125:0,
from datadir.cpp:29:
rawsource.h: In constructor «RSStructure::RSStructure(int, int, bool, Structure&, StringList&)»:
rawsource.h:78:8: предупреждение: «RSStructure::_mustalign» будет инициализирован после [-Wreorder]
bool _mustalign;
^
rawsource.h:82:109: предупреждение: базового класса «RawSource» [-Wreorder]
_offset(n_offset), _defaultalign(n_align), _global(n_global), _s(n_s), _mustalign(false), RawSource(sl) {}
^
rawsource.h:81:3: предупреждение: when initialized here [-Wreorder]
RSStructure(int n_offset, int n_align, bool n_global, Structure &n_s, StringList &sl) :
^
perestoronin, инициализируй перемены класса в том же порядке, в котором они объявлены. Тебе же компилятор об этом и говорит.
Вызов RawSource (sl ) ставь первым.
Pasmo
я ошибся все же, но в командной строке указывается опция генерации тапки.
Это шибко "зависит от". Сборка спотыкается на незадефайненом atoi(), который дефайнится только для win32 платформы.
Собирается оно без танцев с саблями только если stdlib заинклужен по дефолту. А по дефолту так сильно не везде.
После правки sjdefs.h и выноса #include <stdlib.h> из под #ifdef WIN32 оно собирается и работает.
Считаю сие багой, и прошу разработчиков выправить косячок-с если они это читают.
Все, я понял. Вы свежим глазом увидели косяк в моем коде. Причем в том месте где я его даже не думал искать (процедура записи в память работала правильно, косячила процедура чтения, но она мной не отлаживалась потому как я ей пока не пользовался и был уверен что кроме инструкции pop там ничего криминального появиться не может и в памяти не лазиит).
SJASM подлец своим неестественным мать его интеллектом проявил самодеятельность и втихую сделал то чего я ему не писал.
Я давно не кодил на асме, поэтому написал ld ix,hl (подзабыл я за 15 лет инстракшн сет). Так эта падла, вместо того чтобы матюгнуться на неверную команду, молча сделала перегон значения через стек, о чем ассемблер ващще никто не просил. И мало того что сделала, так сделала молча. Причем сделала это совершенно не будучи в курсе что стеком пользоваться нельзя. Как и памятью вообще.
Поубивав бы гада.
В итоге сидим и несуществующую багу ловим.
Вопрос снимается, сыплю голову пеплом.
Вообще я когда пишу код я расчитываю получить именно то что написал, а если написал хрени, то получить по рукам.
В данном конкретном случае поведение sjasm в рамки здравого смысла не укладывается (тем более что в той древней версии на которой я до того кодерасил такого поведения по умолчанию не было). Во первых если я захочу каких-то плюшек то я их явным образом включу. До той поры пока я чего-то явно не разрешил мне дополнительного сервиса никакого не нужно. Во вторых я готов еще понять когда какое-нть ld hl,de разворачивается в пару восьмибитных пересылок. Ладно, на байт длиннее программа стала, адреса меток оно пересчитает, для того ассемблер и придумали. Но вот когда оно без спросу в стек лезет это в чистом виде самодеятельность уже. В третьих такое поведение отключить 1) нельзя и 2) в доке не написано каким именно образом в sjasm накостылен тот или иной встроенный макрос разворачивающий одну мнемонику в несколько, сиди и смотри в листинг называется. И не факт кстати что завтра там в этих макросах чего-то не поменяется на этот счет. И сиди потом, ищи из-за чего код не работает.
Сижу как дурак теперь и в листинг после каждой компиляции смотрю. А то вдруг он мне rlc a на rlca где-то поменяет, потому-что оно мол на байт короче и на четыре (кажись) такта быстрее. Или jp на jr заменит, мол зачем тебе jp, тут близко же...
Ищщо раз. Я прочел доку. В доке нигде не написано что внутренний макрос будет трогать стек. Более того вообще не написано во что эта порнография разворачивается.
В спортлото я жаловаться не буду. Я пожалуюсь разработчику. Если разработчик внимать не будет, пофикшу для себя сам.
Для компилятора подобное поведение считаю недопустимым.
если не написано, на что можно рассчитывать? и вообще, расскажите, как вы еще сделаете ld hl,ix не попортив ничего больше?
и да, читаем:
продолжайте катить бочку... про стек же не написано, да?Цитата:
Of course the Z80 is only an 8 bit cpu, but sometimes ld hl,de would be nice. SjASMPlus now 'fakes' some instructions like that. This improves the readability of the source, but it might not be the fastest way to get the result. Also possibly some 'new' load instructions do affect the flags in ways you wouldn't expect.
это то же самое:)) его никто уже не поддерживает, место вакантно.
Я, кстати, согласен с этой мыслью. Но я всё равно не понимаю жалобы на существующие макросы ассемблера. Человек, пишущий на ассемблере, берёт на себя ответственность за каждую деталь кода. Я не понимаю, как можно писать ассемблерный код, не помня, что реально может (и не может) делать процессор, отказываясь вслух прочесть документацию и продолжая использовать встроенные макросы.
Имеющаяся проблема удобства использования инструмента квалифицируется как "так тебе и надо". Разве это правильно?
Имхо, пути решения проблемы два
1) возможность отключения всех расширений
2) не мимикрировать расширения под стандартные команды (шибко умному компилятору пофиг, забыл ли ты ассемблер или просто опечатался).