;--------------------------------------------------------------------
 
; Описание: Программа проигрывания модулей E-Tracker
 
; поддержка в железе: ZXM-SoundCard
 
; Автор порта: Тарасов М.Н.(Mick),2010
 
;--------------------------------------------------------------------
 
                DEVICE ZXSPECTRUM128
 
 
 
                .org    6000h
 
 
 
;-------------------------------------------------------------------
 
; описание: Точка входа в программу после передачи управления из ОС
 
;---------------------------------------------------------------------
 
ETunes_Start:           
 
                xor     a                               ;бордер в черный цвет
 
                out     (0feh),a        
 
 
 
                ld      hl,4000h
 
                ld      de,4001h
 
                ld      bc,1b00h
 
                ld      (hl),c
 
                ldir
 
                
 
                ld      hl,4000h                        ;грузим экран
 
                ld      de,(5CF4h)
 
                ld      bc,1B05h
 
                call    3d13h
 
                ld      a,10h                           ;установим начальную страницу памяти
 
                ld      bc,7ffdh
 
                out     (c),a
 
                ld      hl,0D000h                       ;грузим анализатор
 
                ld      de,(5CF4h)
 
                ld      bc,0905h
 
                call    3d13h
 
                ld      hl,0E000h                       ;грузим данные анализатора
 
                ld      de,(5CF4h)
 
                ld      bc,1305h
 
                call    3d13h
 
                call    Str_init_load
 
                ei
 
ETunes_loading:
 
                halt
 
                call    Str_play
 
                jr      c,ETunes_load
 
                call    Str_update_symbol
 
                jr      nc,ETunes_loading       
 
ETunes_load:
 
                di                                      ;на всякий пожарный запретим прерывания
 
                ld      de,(5CF4h)
 
                ld (sect_pack0),de
 
                call load_packs_0
 
                ld      de,(5CF4h)
 
                ld (sect_pack1),de
 
 
 
                ; xor   a 
 
                ; ld    bc,1ffdh
 
                ; out   (c),a
 
                
 
                ld      a,10h 
 
                ld      bc,0x7ffd
 
                out     (c),a
 
 
 
                ld      sp,5fffh
 
                call    Str_init                        ;инициализация бегущей строки
 
                call    Attribute_init                  
 
                call    Analyzer_init                   
 
                ld      a,1
 
                ld      (ETunes_number_music),a
 
                call    ETunes_view_number
 
                xor     a
 
                ld      (ETunes_count_music),a          ;счетчик номера музыки
 
                call    ETunes_copy_music
 
                ld      bc,0FFFDh                       ;разрешим работу SAA1099
 
                ld      a,0f6h
 
                out     (c),a
 
                call    ESIPlayer_Init                  ;инициализация проигрывающего модуля
 
                ld      hl,0fe00h                       ;создаем таблицу прерывания для im 2
 
                ld      de,0fe01h
 
                ld      bc,0100h
 
                ld      (hl),0fdh
 
                ldir
 
                ld      a,0c3h                          ;установим вектор прерывания
 
                ld      (0fdfdh),a
 
                ld      hl,Interrupt_handle
 
                ld      (0fdfeh),hl
 
                di
 
                ld      a,0feh                          ;окончание установки прерывания
 
                ld      i,a
 
                im      2
 
                ei
 
ETunes_key:             
 
                xor     a
 
                ld      (ETunes_key_press),a
 
ETunes_loop:            
 
                halt
 
                call    Str_play
 
                call    Str_update_symbol
 
                call    Attribute_update
 
 
 
                ld      a,7fh                           ;ожидаем пробел - переход к следующей композиции
 
                in      a,(0feh)
 
                rra     
 
                jr      c,ETunes_key
 
 
 
                ld      a,0FEh
 
                in      a,(0FEh)
 
                rra         
 
                jr      nc,ETunes_exit
 
 
 
                ld      a,(ETunes_key_press)
 
                and     a
 
                jr      nz,ETunes_loop
 
 
 
                di      
 
                inc     a
 
                ld      (ETunes_key_press),a
 
        
 
                call    ESIPlayer_Init                  ;глушим работу проигрывающего модуля
 
                ld      bc,0FFFDh                       ;запрещаем работу SAA1099
 
                ld      a,0feh
 
                out     (c),a
 
                ld      a,(ETunes_count_music)
 
                inc     a
 
                cp      26
 
                jr      c,ETunes_next_music
 
                xor     a
 
 
 
ETunes_next_music:
 
                ld      (ETunes_count_music),a
 
                im 1
 
                call    ETunes_copy_music
 
                im 2
 
                ld      bc,0FFFDh                       ;разрешим работу SAA1099
 
                ld      a,0f6h
 
                out     (c),a
 
                call    ESIPlayer_Init                  ;инициализируем проигрыватель
 
 
 
                ld      a,(ETunes_number_music)
 
                inc     a
 
                ld      c,a
 
                and     0Fh
 
                cp      10
 
                jr      c,ETunes_number_correct
 
                ld      a,6
 
                add     c
 
                ld      c,a
 
 
 
ETunes_number_correct:
 
                ld      a,c
 
                ld      (ETunes_number_music),a
 
                cp      27h
 
                jr      c,ETunes_number_valid
 
                ld      a,1
 
 
 
ETunes_number_valid:
 
                ld      (ETunes_number_music),a
 
                call    ETunes_view_number
 
 
 
                ei
 
                jp      ETunes_loop
 
 
 
ETunes_exit:            
 
                di      
 
                call    ESIPlayer_Init                  ;глушим работу проигрывающего модуля
 
                ld      bc,0FFFDh                       ;запрещаем работу SAA1099
 
                ld      a,0feh
 
                out     (c),a
 
                ld      hl,0    
 
                push    hl
 
                jp      3d2fh                           ;выход в TR-DOS
 
                display $
 
ETunes_copy_music:
 
                ld      l,a
 
                ld      h,0
 
                add     hl,hl
 
                ld      d,h
 
                ld      e,l
 
                add     hl,hl
 
                add     hl,de
 
                ld      de,ETunes_tabl_music
 
                add     hl,de
 
                push hl
 
                ld      a,(hl)                          ;номер страницы памяти
 
                and 0x80
 
curr_packs=$+1
 
                cp 0x00
 
                jr z,ETunes_copy_0
 
                ld (curr_packs),a
 
                or a
 
                jr nz,is_pack1
 
                call load_packs_0
 
                jr ETunes_copy_0
 
is_pack1
 
                call load_packs_1
 
ETunes_copy_0:
 
                pop hl
 
                ld      a,(hl)                          ;номер страницы памяти
 
                and 0x7f
 
                ld      bc,7ffdh
 
                out     (c),a
 
                inc     hl
 
                ld      c,(hl)                          ;признак что залезет в С000h
 
                inc     hl
 
                ld      e,(hl)                          ;адрес где модуль                          
 
                inc     hl
 
                ld      d,(hl)
 
                inc     hl
 
                ld      a,(hl)                          ;адрес куда копировать                          
 
                inc     hl
 
                ld      h,(hl)
 
                ld      l,a
 
                ex      hl,de
 
                push    de
 
                ld      e,(hl)
 
                inc     hl
 
                ld      d,(hl)
 
                inc     hl
 
                ex      hl,de
 
                ld      (ESIPlayer_Init+1),hl            ;адрес музыкального произведения
 
                ex      hl,de
 
                ld      e,(hl)
 
                inc     hl
 
                ld      d,(hl)
 
                inc     hl
 
                ex      hl,de
 
                ld      (ESIPlayer_InitS+1),hl          ;адрес музыкального произведения
 
                ex      hl,de
 
                ld      a,c                             ;флаг копирования
 
                ld      c,(hl)                          ;размер файла
 
                inc     hl
 
                ld      b,(hl)
 
                inc     hl
 
                pop     de
 
                and     a
 
                jr      z,ETunes_copy_1
 
                ld      a,d
 
                cp      0C0h                            ;копируем в область C000h
 
                jr      nc,ETunes_copy_2
 
ETunes_copy_3:
 
                ldi
 
                ld      a,d
 
                cp      0C0h
 
                jr      c,ETunes_copy_3
 
ETunes_copy_2:
 
                push    de
 
                push    bc
 
                ld      de,8000h
 
                ldir
 
;               xor     a 
 
;               ld      bc,1ffdh
 
;               out     (c),a
 
                ld      a,10h 
 
                ld      bc,7ffdh
 
                out     (c),a
 
                pop     bc
 
                pop     de
 
                ld      hl,8000h
 
                ldir
 
                ret
 
                
 
ETunes_copy_1:
 
                ldir
 
;               xor     a 
 
;               ld      bc,1ffdh
 
;               out     (c),a
 
                ld      a,10h 
 
                ld      bc,7ffdh
 
                out     (c),a
 
                ret
 
 
 
 
 
ETunes_view_number:
 
                ld      c,a
 
                and     0F0h
 
                rrca
 
                rrca
 
                rrca
 
                rrca
 
                ld      hl,55DDh
 
                call    ETunes_view_symbol
 
                ld      a,c
 
                and     0Fh
 
                ld      hl,55DEh
 
 
 
ETunes_view_symbol:
 
                push    hl
 
                ld      h,0
 
                ld      l,a
 
                add     hl,hl
 
                add     hl,hl
 
                add     hl,hl
 
                ld      de,ETunes_table_symbol
 
                add     hl,de   
 
                ex      de,hl
 
                pop     hl
 
                ld      b,8
 
 
 
ETunes_view_loop:
 
                ld      a,(de)
 
                ld      (hl),a
 
                inc     de              
 
                inc     h
 
                ld      a,h
 
                and     7
 
                jr      nz,ETunes_next_line
 
                ld      a, l
 
                add     a,20h
 
                ld      l, a
 
                jr      c,ETunes_next_line
 
                ld      a,h
 
                sub     8
 
                ld      h,a
 
ETunes_next_line:       
 
                djnz    ETunes_view_loop
 
                ret     
 
 
 
load_packs_0
 
                ld      a,11h                           ;установим начальную страницу памяти
 
                ld      bc,7ffdh
 
                out     (c),a
 
                ld      hl,0C000h                       ;грузим музыкальный пак 1.
 
                ld      de,0x0000
 
sect_pack0=$-2
 
                ld      bc,3A05h
 
                call    3d13h
 
 
 
                ld      a,13h 
 
                ld      bc,7ffdh
 
                out     (c),a
 
                ld      hl,0C000h                       ;грузим музыкальный пак 2.
 
                ld      de,(5CF4h)
 
                ld      bc,3F05h
 
                call    3d13h
 
 
 
                ld      a,14h 
 
                ld      bc,7ffdh
 
                out     (c),a
 
                ld      hl,0C000h                       ;грузим музыкальный пак 3.
 
                ld      de,(5CF4h)
 
                ld      bc,3905h
 
                call    3d13h
 
 
 
                ld      a,16h 
 
                ld      bc,7ffdh
 
                out     (c),a
 
                ld      hl,0C000h                       ;грузим музыкальный пак 4.
 
                ld      de,(5CF4h)
 
                ld      bc,3B05h
 
                call    3d13h
 
 
 
                ld      a,17h 
 
                ld      bc,7ffdh
 
                out     (c),a
 
                ld      hl,0C000h                       ;грузим музыкальный пак 5.
 
                ld      de,(5CF4h)
 
                ld      bc,3505h
 
                call    3d13h
 
                ret
 
                
 
load_packs_1
 
                ld      a,11h 
 
                ld      bc,7ffdh
 
                out     (c),a
 
                ld      hl,0C000h                       ;грузим музыкальный пак 6.
 
                ld      de,0x0000
 
sect_pack1=$-2
 
                ld      bc,2A05h
 
                call    3d13h
 
 
 
                ld      a,13h 
 
                ld      bc,7ffdh
 
                out     (c),a
 
                ld      hl,0C000h                       ;грузим музыкальный пак 7.
 
                ld      de,(5CF4h)
 
                ld      bc,2205h
 
                call    3d13h
 
 
 
                ld      a,14h 
 
                ld      bc,7ffdh
 
                out     (c),a
 
                ld      hl,0C000h                       ;грузим музыкальный пак 8.
 
                ld      de,(5CF4h)
 
                ld      bc,3B05h
 
                call    3d13h
 
 
 
                ld      a,16h 
 
                ld      bc,7ffdh
 
                out     (c),a
 
                ld      hl,0C000h                       ;грузим музыкальный пак 9.
 
                ld      de,(5CF4h)
 
                ld      bc,3205h
 
                call    3d13h
 
                ret
 
 
 
ETunes_tabl_music:
 
                db      11h                             ; 1 музыкальное произведение
 
                db      0
 
                dw      0C000h
 
                dw      8567h
 
                db      11h                             ; 2 музыкальное произведение
 
                db      0
 
                dw      0DC10h
 
                dw      8567h
 
 
 
                db      13h                             ; 3 музыкальное произведение
 
                db      0
 
                dw      0C000h
 
                dw      8567h
 
                db      13h                             ; 4 музыкальное произведение
 
                db      0
 
                dw      0D210h
 
                dw      8567h
 
 
 
                db      14h                             ; 5 музыкальное произведение
 
                db      0
 
                dw      0C000h
 
                dw      8567h
 
                db      14h                             ; 6 музыкальное произведение
 
                db      0
 
                dw      0D7F0h
 
                dw      8567h
 
 
 
                db      16h                             ; 7 музыкальное произведение
 
                db      0
 
                dw      0C000h
 
                dw      8567h
 
                db      16h                             ; 8 музыкальное произведение
 
                db      0
 
                dw      0D200h
 
                dw      8567h
 
                db      16h                             ; 9 музыкальное произведение
 
                db      0
 
                dw      0D9D0h
 
                dw      8567h
 
                db      16h                             ; 10 музыкальное произведение
 
                db      0
 
                dw      0EAC0h
 
                dw      85A8h
 
                db      16h                             ; 11 музыкальное произведение
 
                db      0
 
                dw      0EE40h
 
                dw      891Ch
 
                db      16h                             ; 12 музыкальное произведение
 
                db      0
 
                dw      0F450h
 
                dw      8F20h
 
                db      16h                             ; 13 музыкальное произведение
 
                db      1
 
                dw      0F760h
 
                dw      0C220h
 
 
 
                db      17h                             ; 14 музыкальное произведение
 
                db      0
 
                dw      0C000h
 
                dw      8590h
 
                db      17h                             ; 15 музыкальное произведение
 
                db      0
 
                dw      0D0A0h
 
                dw      9628h
 
                db      17h                             ; 16 музыкальное произведение
 
                db      0
 
                dw      0DEC0h
 
                dw      921Ch
 
                db      17h                             ; 17 музыкальное произведение
 
                db      0
 
                dw      0E5D0h
 
                dw      991Ch
 
 
 
                db      91h                             ; 18 музыкальное произведение
 
                db      0
 
                dw      0C000h
 
                dw      0A820h
 
                db      91h                             ; 19 музыкальное произведение
 
                db      1
 
                dw      0CD10h
 
                dw      0B524h
 
                db      91h                             ; 20 музыкальное произведение
 
                db      0
 
                dw      0DA20h
 
                dw      8598h
 
                db      91h                             ; 21 музыкальное произведение
 
                db      0
 
                dw      0E5C0h
 
                dw      9128h
 
 
 
                db      93h                             ; 22 музыкальное произведение
 
                db      0
 
                dw      0C000h
 
                dw      951Ch
 
                db      93h                             ; 23 музыкальное произведение
 
                db      0
 
                dw      0D660h
 
                dw      0AB6Ch
 
 
 
                db      94h                             ; 24 музыкальное произведение
 
                db      0
 
                dw      0C000h
 
                dw      85ACh
 
                db      94h                             ; 25 музыкальное произведение
 
                db      0
 
                dw      0EAB0h
 
                dw      8567h
 
 
 
                db      96h                             ; 26 музыкальное произведение
 
                db      0
 
                dw      0C000h
 
                dw      8567h
 
 
 
 
 
ETunes_table_symbol:
 
                db      0,3Ch,66h,6Eh,76h,66h,3Ch,0
 
                db      0,18h,38h,18h,18h,18h,7Eh,0
 
                db      0,3Ch,66h,0Ch,18h,30h,7Eh,0
 
                db      0,7Eh,0Ch,18h,0Ch,66h,3Ch,0
 
                db      0,0Ch,1Ch,3Ch,6Ch,7Eh,0Ch,0
 
                db      0,7Eh,60h,7Ch,06h,66h,3Ch,0
 
                db      0,3Ch,60h,7Ch,66h,66h,3Ch,0
 
                db      0,7Eh,06h,0Ch,18h,30h,30h,0
 
                db      0,3Ch,66h,3Ch,66h,66h,3Ch,0
 
                db      0,3Ch,66h,3Eh,06h,0Ch,38h,0
 
 
 
 
 
 
 
ETunes_count_music:
 
                db      0
 
ETunes_number_music:
 
                db      0
 
ETunes_key_press:
 
                db      0
 
ETunes_phase:
 
                db      0
 
 
 
Interrupt_handle:
 
                push    hl      
 
                push    bc      
 
                push    de
 
                push    af      
 
 
 
                call    Analyzer_clear
 
                call    Analyzer_update
 
                ld      a,(ETunes_count_music)
 
                cp      8
 
                jr      z,ETunes_analyzer_0
 
                cp      0Dh
 
                jr      z,ETunes_analyzer_1
 
                cp      0Eh
 
                jr      z,ETunes_analyzer_1
 
                cp      18h
 
                jr      z,ETunes_analyzer_0
 
                call    Analyzer_view_0
 
ETunes_continue:
 
                call    Analyzer_draw_flash
 
                call    ESIPlayer_Play
 
                pop     af
 
                pop     de
 
                pop     bc
 
                pop     hl
 
                ei
 
                ret
 
 
 
ETunes_analyzer_0:
 
                call    Analyzer_view_1
 
                jr      ETunes_continue
 
 
 
ETunes_analyzer_1:
 
                call    Analyzer_view_2
 
                jr      ETunes_continue
 
 
 
                .include  esplayer.asm
 
                .include  attribute.asm
 
                .include  string.asm
 
Etunes_end:
 
                .savebin "etunes.bin",ETunes_Start, Etunes_end - ETunes_Start
 
 
 
                .include  analyzer.asm
 
 
 
                .savebin "erunea.bin",Analyzer_update, Analyzer_end - Analyzer_update
 
                .end