;--------------------------------------------------------------------
; Описание: Программа проигрывания модулей E-Tracker
; поддержка в железе: ZXM-SoundCard
; Автор порта: Тарасов М.Н.(Mick),2010
;--------------------------------------------------------------------
DEVICE ZXSPECTRUM128
.org 6000h
;-------------------------------------------------------------------
; описание: Точка входа в программу после передачи управления из ОС
;---------------------------------------------------------------------
ETunes_Start:
xor a ;бордер в черный цвет
out (0feh),a
ld (ETunes_count_music),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
call Str_init_load
ei
ETunes_loading:
halt
call Str_draw_symbol
call Str_play
jr c,ETunes_load
call Str_update_symbol
jr nc,ETunes_loading
ETunes_load:
di ;на всякий пожарный запретим прерывания
ld a,10h ;установим начальную страницу памяти
ld (ETunes_page_memory),a
ld bc,7ffdh
out (c),a
ld hl,0C000h ;грузим музыкальный пак 1.
ld de,(5CF4h)
ld bc,3A05h
call 3d13h
ld a,11h
ld bc,7ffdh
out (c),a
ld hl,0C000h ;грузим музыкальный пак 2.
ld de,(5CF4h)
ld bc,3A05h
call 3d13h
ld a,13h
ld bc,7ffdh
out (c),a
ld hl,0C000h ;грузим музыкальный пак 3.
ld de,(5CF4h)
ld bc,3D05h
call 3d13h
ld a,14h
ld bc,7ffdh
out (c),a
ld hl,0C000h ;грузим музыкальный пак 4.
ld de,(5CF4h)
ld bc,3E05h
call 3d13h
ld a,16h
ld bc,7ffdh
out (c),a
ld hl,0C000h ;грузим музыкальный пак 5.
ld de,(5CF4h)
ld bc,0F05h
call 3d13h
ld a,10h
ld bc,7ffdh
out (c),a
call Str_init_clear
ei
ETunes_clearing:
halt
call Str_draw_symbol
call Str_play
jr c,ETunes_init
call Str_update_symbol
jr nc,ETunes_clearing
ETunes_init:
di ;на всякий пожарный запретим прерывания
ld sp,5fffh
call Str_init ;инициализация бегущей строки
call Analyzer_init
ld a,1
ld (ETunes_number_music),a
call ETunes_view_number
ld hl,0C000h
ld (EPlayer_Init+1),hl ;адрес музыкального произведения
ld bc,0FFFDh ;разрешим работу SAA1099
ld a,0f6h
out (c),a
call EPlayer_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
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
ld a,(ETunes_page_memory) ;загрузим номер страницы памяти
ld bc,7ffdh
out (c),a
call EPlayer_Init ;глушим работу проигрывающего модуля
ld bc,0FFFDh ;запрещаем работу SAA1099
ld a,0feh
out (c),a
ld a,(ETunes_count_music)
inc a
cp 30
jr c,ETunes_next_music
xor a
ETunes_next_music:
ld (ETunes_count_music),a
ld l,a
ld e,a
ld h,0
ld d,h
add hl,hl
add hl,de
ld de,ETunes_tabl_music
add hl,de
ld a,(hl) ;номер страницы памяти
ld (ETunes_page_memory),a
inc hl
ld a,(hl)
inc hl
ld h,(hl)
ld l,a
ld a,(ETunes_page_memory) ;загрузим номер страницы памяти
ld bc,7ffdh
out (c),a
ld (EPlayer_Init+1),hl ;адрес музыкального произведения
ld bc,0FFFDh ;разрешим работу SAA1099
ld a,0f6h
out (c),a
call EPlayer_Init ;инициализируем проигрыватель
ld a,10h
ld bc,7ffdh
out (c),a
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 31h
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 EPlayer_Init ;глушим работу проигрывающего модуля
ld bc,0FFFDh ;запрещаем работу SAA1099
ld a,0feh
out (c),a
ld hl,0
push hl
jp 3d2fh ;выход в TR-DOS
ETunes_view_number:
ld c,a
and 0F0h
rrca
rrca
rrca
rrca
ld hl,5092h
call ETunes_view_symbol
ld a,c
and 0Fh
ld hl,5093h
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
djnz ETunes_view_loop
ret
ETunes_line_border:
ld a,07h
out (0feh),a
ld b,0Ch
ETunes_width_loop:
nop
djnz ETunes_width_loop
xor a
out (0feh),a
ret
;-------------------------------------------------------------------
; описание: Обновление параметров основной бегущей строки
; параметры: нет
; возвращаемое значение: нет
;---------------------------------------------------------------------
ETunes_line_select:
ld hl,(ETunes_line_index)
ld a,(hl)
dec a
jr nz,ETunes_load_index
ld hl,ETunes_table_line
ETunes_load_index:
ld e,(hl)
inc hl
ld d,(hl)
inc hl
ld (ETunes_line_index),hl
ex hl,de
ld (ETunes_cnst_delay),hl
ret
ETunes_tabl_music:
db 10h ; 1 музыкальное произведение
dw 0C000h
db 10h ; 2 музыкальное произведение
dw 0C5B0h
db 10h ; 3 музыкальное произведение
dw 0CFD0h
db 10h ; 4 музыкальное произведение
dw 0DC10h
db 10h ; 5 музыкальное произведение
dw 0E210h
db 10h ; 6 музыкальное произведение
dw 0EEC0h
db 10h ; 7 музыкальное произведение
dw 0F770h
db 11h ; 8 музыкальное произведение
dw 0C000h
db 11h ; 9 музыкальное произведение
dw 0C700h
db 11h ; 10 музыкальное произведение
dw 0CC70h
db 11h ; 11 музыкальное произведение
dw 0D7C0h
db 11h ; 12 музыкальное произведение
dw 0E550h
db 11h ; 13 музыкальное произведение
dw 0ED60h
db 11h ; 14 музыкальное произведение
dw 0F180h
db 13h ; 15 музыкальное произведение
dw 0C000h
db 13h ; 16 музыкальное произведение
dw 0CD80h
db 13h ; 17 музыкальное произведение
dw 0D740h
db 13h ; 18 музыкальное произведение
dw 0DEB0h
db 13h ; 19 музыкальное произведение
dw 0E5C0h
db 13h ; 20 музыкальное произведение
dw 0ED80h
db 13h ; 21 музыкальное произведение
dw 0F450h
db 14h ; 22 музыкальное произведение
dw 0C000h
db 14h ; 23 музыкальное произведение
dw 0CCB0h
db 14h ; 24 музыкальное произведение
dw 0D580h
db 14h ; 25 музыкальное произведение
dw 0DFD0h
db 14h ; 26 музыкальное произведение
dw 0E8F0h
db 14h ; 27 музыкальное произведение
dw 0F080h
db 14h ; 28 музыкальное произведение
dw 0F2D0h
db 16h ; 29 музыкальное произведение
dw 0C000h
db 16h ; 30 музыкальное произведение
dw 0C630h
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_table_line:
dw 0Bh
dw 0Bh
dw 0Bh
dw 0Bh
dw 13h
dw 13h
dw 13h
dw 1Ch
dw 1Ch
dw 1Ch
dw 25h
dw 25h
dw 25h
dw 2Dh
dw 2Dh
dw 3Eh
dw 3Eh
dw 47h
dw 47h
dw 58h
dw 58h
dw 69h
dw 69h
dw 7Bh
dw 7Bh
dw 8Ch
dw 8Ch
dw 9Dh
dw 9Dh
dw 0AEh
dw 0AEh
dw 0B7h
dw 0B7h
dw 0B7h
dw 0C0h
dw 0C0h
dw 0C0h
dw 0C8h
dw 0C8h
dw 0C8h
dw 0C8h
dw 0C0h
dw 0C0h
dw 0C0h
dw 0B7h
dw 0B7h
dw 0B7h
dw 0AEh
dw 0AEh
dw 9Dh
dw 9Dh
dw 8Ch
dw 8Ch
dw 7Bh
dw 7Bh
dw 69h
dw 69h
dw 58h
dw 58h
dw 47h
dw 47h
dw 3Eh
dw 3Eh
dw 2Dh
dw 2Dh
dw 25h
dw 25h
dw 25h
dw 1Ch
dw 1Ch
dw 1Ch
dw 13h
dw 13h
dw 13h
db 1
ETunes_line_index:
dw ETunes_table_line
ETunes_cnst_delay:
dw 4
ETunes_page_memory:
db 0
ETunes_count_music:
db 0
ETunes_number_music:
db 0
ETunes_key_press:
db 0
ETunes_phase:
db 0
Interrupt_handle:
push af
call Analyzer_update
call Analyzer_view
call Analyzer_draw_flash
call Str_shift_buf
call Str_play_txt
call Str_update_symstr
ld bc,(ETunes_cnst_delay)
MA2BB:
dec bc
ld a,b
or c
jr nz,MA2BB
call ETunes_line_border
call ETunes_line_select
ld b,7Bh
MA2BC:
djnz MA2BC
call ETunes_line_border
ld a,(ETunes_page_memory)
ld bc,7ffdh
out (c),a
call EPlayer_Play
ld a,10h
ld bc,7ffdh
out (c),a
call Str_line_clear
call Str_line_select
call Str_copy_scr
pop af
ei
ret
.include analyzer.asm
.include etplayer.asm
.include string.asm
Etunes_end:
.savebin "etunes.bin",ETunes_Start, Etunes_end - ETunes_Start
.end