А как ты собираешься по индексу находить адрес, если они все разного размера?
Вид для печати
А как ты собираешься по индексу находить адрес, если они все разного размера?
Да там уже есть процедуры, которые пробегают по данным.
Одна ищет маркеры (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 ничего нет?