еще пару коментариев на свежую голову
главное, дальше на 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