
        define  TRUE #37   ; scf
        define  FALSE #a7  ; and a

SLOT0   equ     #82
SLOT1   equ     #a2
SLOT2   equ     #c2
SLOT3   equ     #e2

        define  ENABLE_MUSIC
        define  MUSIC_LENGTH  1245 ; bytes


        jp __start


        include "sprinter_libs/BIOS_equ.inc"
        include "sprinter_libs/DSS_equ.inc"

        include "../../lib/im_lib.asm"
        include "../../lib/sound/sound_lib.asm"

        include "sprinter_functions.asm"
        include "macro.asm"

        include "delta.asm"
        include "im2_handler.asm"


__start:
        di

        ; сохраним указатель стека
        ld (__saved_sp), sp
        ld sp, memory_map.stack_addr    ; стек должен находиться в адресах #8000-#bfff

        ; сохраним дескриптор *.exe файла
        ld a, (ix-3)
        ld (exe_file_handle), a

        ; сохраним номер физ. страницы, которая подключена в SLOT3
        in a, (SLOT3)
        ld (__saved_page_in_slot3), a

        ; включим 21 МГц
        call turbo_on

        ; выделим страницу памяти под музыку
        call try_get_mem_page
        ld (music_page), a

        ; откроем страницу для музыки
        ld a, (music_page)
        out (SLOT3), a

        ; и загрузим музыку (байт в байт)
        ld a, (exe_file_handle)
        ld hl, #c000            ; куда загружаем
        ld de, MUSIC_LENGTH     ; сколько байт пытаемся загрузить
        ld c, Dss.Read
        rst ToDSS

        ; закроем файл
        ld a, (exe_file_handle)
        ld c, Dss.Close
        rst ToDSS

        ; выведем надпись
        ld hl, s_press_any_key
        print_str

;
; запускаем прерывания на таймере CTC (взамен кадрового)
; музыка инициализируется там же
;
        ; включаем страницу с музыкой
        ld a, (music_page)
        out (SLOT3), a

        ; инициализация прерываний
        call initialize_interrupts

;
; основной цикл
;
        ei

        ; крутимся в дельта-цикле, пока не выставлен флаг delta_exit_flag = TRUE
        DELTA do_present, do_render, do_logic

        ; переход на выход из программы        
        jr do_continue



do_present:
        ; поменять экраны местами
        ret


do_render:
        ; процедура рендера одного кадра
        ; может не помещаться во фрейм
        ret


do_logic:
        ; процедура обработки логики
        ; гарантированно вызывается 50 раз в секунду,
        ; даже если рендер не укладывается во фрейм

        ; проверка нажатия любой кнопки для выхода
        xor a
        in a, (#fe)
        or %11100000
        inc a
        ret z
        
        ; установка флага "на выход"
        ld a, TRUE
        ld (delta_exit_flag), a
        ret


do_continue:
        di

        ; выключим CTC прерывания и отключим музыку
        ld a, (music_page)
        out (SLOT3), a
        call disable_interrupts

        ; освободим ранее занятые страницы памяти
        ld a, (music_page)
        call try_free_mem

        ; выведем текстовую строку
        ld hl, s_byebye
        print_str

        ; почистим буфер клавиатуры
        ld c, Dss.K_CLEAR
        ld b, 0
        rst ToDSS

        ; восстановим страницу в SLOT3, которая была там на момент запуска
__saved_page_in_slot3: equ $+1
        ld a, 0
        out (SLOT3), a

        ; восстановим стек, где был
__saved_sp: equ $+1
        ld sp, 0

        jp exit_to_dos


interrupts_count:       dw -1


exe_file_handle:        db 0
music_page:             db 0


s_press_any_key:        db "Press any key to exit...\r\n",0
s_byebye:               db "Bye bye! :)\r\n",0



