

CTC:
.Ch_0   equ     #10
.Ch_1   equ     #11
.Ch_2   equ     #12
.Ch_3   equ     #13


; процедура инициализации прерываний на CTC
initialize_interrupts:
        ifdef ENABLE_MUSIC
            ld hl, memory_map.music_module_addr
            call sound_lib.init_psg
        endif

        ld hl, im2_keyb_or_frame_handler
        ld (#beff), hl   

        ld hl, im2_ctc_handler
        ld (#be06), hl

        ei
        halt
        di

        ; тут можно вставить код от Сергея,
        ; который отличит клавиатурное прерывание от кадрового, и пропустит его

        ld a, #57 : out (CTC.Ch_2),a
        ld a, 112 : out (CTC.Ch_2),a
        ld a, #d7 : out (CTC.Ch_3),a
        ld a, 160 : out (CTC.Ch_3),a
        ld a, 0   : out (CTC.Ch_0),a

        ld a, #be
        ld i, a
        im 2
        ret


; процедура отключения прерываний на CTC
disable_interrupts:
        ld a, 1
        out (CTC.Ch_3), a

        call im_lib.im2_off

        ifdef ENABLE_MUSIC
            call sound_lib.init_psg
            call sound_lib.play_frame
        endif
        ret


; пустой обработчик прерывания по вектору #FF
im2_keyb_or_frame_handler:
        nop
        ei
        reti


; обработчик CTC прерывания по вектору #06
im2_ctc_handler:
        push af,bc,de,hl
        ex af, af
        push af

        border 7

        ifdef ENABLE_MUSIC
            in a, (SLOT3)
            push af

            ld a, (music_page)
            out (SLOT3), a
            call sound_lib.play_frame
        endif

        DELTA_INT_HANDLER

        ld hl, (interrupts_count)
        inc hl
        ld (interrupts_count), hl

;
; после 20 секунд (1000 прерываний) программа самозавершится
;
        ld bc, -1000
        add hl, bc
        dec h
        jr nc, .exit

        ; установка флага "на выход"
        ld a, TRUE
        ld (delta_exit_flag), a

.exit:
        ifdef ENABLE_MUSIC
            pop af
            out (SLOT3), a
        endif

        border 0

        pop af
        ex af, af
        pop hl,de,bc,af

        ei
        reti


