А как ты собираешься по индексу находить адрес, если они все разного размера?
А как ты собираешься по индексу находить адрес, если они все разного размера?
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
Да там уже есть процедуры, которые пробегают по данным.
Одна ищет маркеры (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:09.
Квадратичная сложность - не слишком ли большая цена за экономию десятка байт памяти? Не говоря уже о затратах на код поиска.
Адресам конкретных спрайтов назначить метки и использовать. Не?
Код: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шки.
Последний раз редактировалось Bedazzle; 16.10.2015 в 00:51.
Это просто структуры. Можно и без них, обычными 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
Последний раз редактировалось Vitamin; 16.10.2015 в 11:23.
Ткните меня носом ктонить в последнюю версию
и в доки к нему
компилятор встроенный в emuzwin больше не могу терпеть
из за истерических припадков вызванных последним чота не могу найти...
или новей 1.07 RC7 ничего нет?
Последний раз редактировалось NEO SPECTRUMAN; 17.10.2015 в 17:14.
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)