
//
// Данные о анимации (дескриптор, формат):
//
// Для экрана-0:
//  +0 (byte) всего кадров
//  +1 (byte) текущий номер кадра 
//  +2 (word) адрес кадра к выводу
//  +4 (byte) номер банка кадра
//  +5 (word) адрес первого кадра
//
// Далее идут банки, в которых размещены данные (не более 8)
// значения (0-63), пропуская бит D3
//
//  +7 bankN0
//  +8 bankN1
//  +9 bankN2
//  +A bankN3
//  +B bankN4
//  +C bankN5
//  +D bankN6
//  +E bankN7
//  +F bankN8
//

//
// Для экрана-1: (совпадают с данными для экрана-0, идут сразу же за ним, т.е. +16 байт)
//  +0 (byte) всего кадров
//  +1 (byte) текущий номер кадра 
//  +2 (word) адрес кадра к выводу
//  +4 (byte) банк кадра к выводу (0-63), пропуская бит D3
//  +5 (word) адрес первого кадра
//
// Далее идут банки, в которых размещены данные (не более 9)
// значения (0-63), пропуская бит D3
//
//  +7 bankN0
//  +8 bankN1
//  +9 bankN2
//  +A bankN3
//  +B bankN4
//  +C bankN5
//  +D bankN6
//  +E bankN7
//  +F bankN8
//

//
// Инициализация анимации. 
// В дескрипторе должен быть заполнен массив банок
//
//  A - количество кадров
// IX - дескриптор
// DE - буфер для копирования сжатых данных
//

init_animation:
	ld (ix+0), a
	ld (ix+16), a
	xor a
	ld (ix+4), a
	ld (ix+20), a

	ld bc, 9
	add ix, bc

init_anim_bank_bits:
	dec ix
	ld a, 088h
	or (ix+7)
	ld (ix+7), a
	ld a, 080h
	or (ix+23)
	ld (ix+23), a
	dec c
	jr nz, init_anim_bank_bits
			
	call make_init_animation_internal
	ld c, 16
	add ix, bc

make_init_animation_internal:
	ld (ix+1), 1
	push de
	exx
	ld a, (ix+4)
	add a, 7
	ld (mega_index2+2), a
mega_index2:	
	ld a, (ix+0)
		
	ld l, a
	rst 32		// переключились на банк с данными
	ld a, l
	ld hl, 0c000h
	ld c, (hl)	// получаем размер сжатого блока анимации
	inc l
	ld b, (hl)
	inc l
	push hl
	add hl, bc
	ld (ix+2), l
	ld (ix+5), l
	ld (ix+3), h
	ld (ix+6), h
	pop hl
	pop de
	ldir		// скопировали сжатые данные, отрисовываем
	and 008h	// В аккумуляторе оставили только бит экрана. 
				// рисовать будем на неактивный. Т.е. для нулевого аккумулятора на 3,7 иначе на 1,5
	jr nz, anim_screen1_is_active
	add a, 2

anim_screen1_is_active:	
	inc a
	ld (anim_bank_tmp+1), a
	rst 32
	exx
	push ix
	push bc
	push de
	ex de, hl
	
	ld a, 0c0h
	call GfxUnpack
	ld a, 0e0h
	call GfxUnpack
	
anim_bank_tmp:
	ld a, 0
	add a, 4
	rst 32
	
	ld a, 0c0h
	call GfxUnpack
	ld a, 0e0h
	call GfxUnpack
	pop de
	pop bc
	pop ix		
	ret

//
// Осуществление анимации.
// На вход - какой экран подлежит обновлению (0 если A чётный, иначе 1)
// IX - дескриптор анимации
// DE - буфер для копирования сжатых данных
//

do_animation:
	add a, a
	and 2
	ld c, a
	inc a
	or 080h
	ld (do_animation_screen_bank+1), a	
	ld a, c
	add a, a
	add a, a
	add a, a
	ld c, a
	ld b, 0
	add ix, bc
	
	// копируем данные для распаковки
	push ix
	push de
	ex de, hl
	
	
	ld a, (ix+4)
	add a,7
	ld (mega_index1+2), a
mega_index1:	
	ld a, (ix+0)
	
	rst 32
	ex de, hl
	ld l, (ix+2)
	ld h, (ix+3)

	ld c, (hl)
	inc hl
	ld b, (hl)
	
	inc hl
	ldir
	
	ld (ix+2), l
	ld (ix+3), h
	ld a, (hl)
	inc hl
	or (hl)
	ld (do_animation_bank_not_completed+1), a
	pop hl
	
	// данные скопированы, рендерим их
do_animation_screen_bank:
	ld a, 0
	push af
	rst 32
	
	ld a, 0c0h
	call GfxUnpack
	ld a, 0e0h
	call GfxUnpack
	
	pop af
	add a, 4
	rst 32

	ld a, 0c0h
	call GfxUnpack
	ld a, 0e0h
	call GfxUnpack
	
	// рендеринг данных окончен, подготавливаем следующий кадh		
	pop ix
	ld a, (ix+0)
	inc (ix+1)
	sub (ix+1)
	jr nc, do_animation_no_rewind
	
	// кончились все кадры. Следующим кадром будет первый
	ld (ix+1), 1
	ld a, (ix+5)
	ld (ix+2), a
	ld a, (ix+6)
	ld (ix+3), a
	ld (ix+4), 0
	ret

do_animation_no_rewind:
	// кадры ещё не закончились, переключаем банк, если это необходимо
	

do_animation_bank_not_completed:
	ld a, 0
	or a
	ret nz
	
	// в текущем банке все кадры закончились, переключаем банк
	ld (ix+2), a
	ld a, 0c0h
	ld (ix+3), a
	inc (ix+4)
	ret
	




// Данные о анимации (дескриптор, формат):
//  +0 (byte) всего кадров
//
// Для экрана-0:
//  +0 (byte) текущий номер кадра 
//  +1 (word) адрес кадра к выводу
//  +3 (byte) банк кадра к выводу (0-63), пропуская бит D3
//  +4 (word) адрес первого кадра
//  +6 (byte) банк первого кадра



#include "gfx_unpack.asm"
