еще пару коментариев на свежую голову
главное, дальше на ZX делать что-то с этим у меня нет планов
мне исходники нужны были для возможного порта на другой комп
а т.к. довел до приличного вида - решил открыть, вдруг кому будет интересно.
и по теме.
традиционно дизасм был в IDA, база в проекте
там же тулзы которые использовал для визуализации графики.
из исходников при желании можно получить полную копию оригинала
я в этих в паре мест явно неиспользуемый код закоментил
(правда потом в одном месте пришлось раскоменчивать, поломал скролл таблицы рекордов)
синхронизации нет,
прерывания ни используются
AY эффекты играют - в основмном цикле несколько вызовов doPSG
код не использует ПЗУ
не, в одном месте он читает один байт чтобы поставить флаг ZX128
а не, опять забыл про задержку
ну и используем, например в основном цикле игрыКод:; BC _delayLDIR: push bc push de push hl ld hl, 0 ld de, 0 ldir pop hl pop de pop bc ret
из "оптимизаций по размеру"Код:ld bc, 500 124: call _delayLDIR
то что не явное
куча данных используется только при построении уровня
их можно держать сжатыми и разжимать по необходимости.
zone_blocks, perl_level_enemy_tab, level data, FONTS
это больше 10к
на экране может быть только один тип врага в один момент времени
т.е. можно держать в памяти сдвинутый только нужный предварительно его подготовив
врод там есть явный баг
сокомпилить без него можно
FIX_SPRITE16x16COM equ 1
с этим фиксом вроде чуть поживее
а то получалась чистая задержка ...
в коде при выводе спрайтов увеличивают счётчик,
и есть такой код (он выводит фейковые спрайты на экран если на экране их меньше заданного)
Скрытый текст
Код:CompensateSprites8x8preshifted: ld a, (Sprites8x8_OnScreen_count) cp 16 ret nc ld b, a ld a, 16 sub b ld b, a ld a, 6 ; 6 - Boom5 - Empty? loc_9E92: call Sprite8x8_XOR_Preshifted djnz loc_9E92 ret ; --------------------------------------------------------------------------- Sprites8x8_OnScreen_count:db 0 CompensateSprites16x16: ld a, (Sprites16x16_OnScreen_count) cp 6 ret nc ld b, a ld a, 6 sub b ld b, a if FIX_SPRITE16x16COM = 1 ld hl, SPR_COMP else ld hl, byte_B101 endif xor a if FIX_SPRITE16x16COM = 1 ld de,0 endif loc_9EA8: call Sprite16x16 ; A sprId (00..45) ; D - Y (0..192)? ; E - X (0..255) ; HL - saveSpriteArea ; djnz loc_9EA8 ret ; --------------------------------------------------------------------------- Sprites16x16_OnScreen_count:db 0[свернуть]
так CompensateSprites16x16 - вызывается
но инкрементировать Sprites16x16_OnScreen_count - забыли
вот "карта" памяти, по lst файлу
основные блоки "данных"
Код:4000 screen 5800 attr 5b00 over_player_tab 5e00 ATTR_TABLE_COPY 6100 no_walk_tab 6400 bitSwapTab 6500 Y2SCR_HI 6600 Y2SCR_LO 6700 scr_addr_8 (2x256) ----- ~3583 6D60 code start 71ED highscore table 750E ----- ~ 800 7D4D beeper music+code 807D ---- ~ 816 84FB zone_blocks 8DC2 ---- ~2247 A3D3 trajectory A4D5 ----- ~ 258 A644 per_level_enemy_tab ----- ~ 351 A7A3 A92E xMessages AB61 ----- ~ 563 B0A8 sprite buffers B678 ----- ~1488 B678 PSG related code C79A ----- ~4386 C79B level data D886 ----- ~4331 D887 "FONTS" ECE6 ----- ~5215 ECE7 SPRITES FEB6 ----- ~4559





Ответить с цитированием