;LAST UPDATE: 24.05.2013 savelij
 
;version 06.03.2009
 
 
 
;КОД ДЛЯ НГС
 
 
 
                include macros.a80
 
                include ports_ngs.a80   ;INCL "PORTSNGS"
 
 
 
BUF_LNG         EQU 0X4000
 
;БУФЕР ДЛЯ ПЕРЕКОД. ДЛИННОГО ИМЕНИ
 
GSSTEK          EQU 0X41DF
 
;ВЕРШИНА СТЕКА
 
 
 
;НЕКОТОРЫЕ ПЕРЕМЕННЫЕ
 
REJIMGS         EQU 0X41E0
 
;1 КОД ОТВЕТА
 
KOLWMP3         EQU REJIMGS+1
 
;2 КОЛИЧЕСТВО MP3
 
CALBFAT         EQU KOLWMP3+2
 
;1 КАЛИБР FAT
 
BUFTIME         EQU CALBFAT+1
 
;8 БУФЕР ДЛЯ ТЕКСТА
 
 
 
;АДРЕС УКЛАДКИ ТАБЛИЦ (DIR&MP3)
 
FORFILE         EQU 0X8000
 
 
 
;СТРАНИЦЫ ДОЛЖНЫ БЫТЬ ТОЛЬКО НЕЧЕТНЫМИ
 
PG4MP3          EQU 3
 
;СТРАНИЦА УКЛАДКИ ОПИСАТЕЛЕЙ ФАЙЛОВ
 
;ДЕФОЛТНАЯ СТРАНИЧКА
 
PG4DIR          EQU 5
 
;СТРАНИЦА УКЛАДКИ ОПИСАТЕЛЕЙ DIR
 
;ВРЕМЕННАЯ СТРАНИЧКА
 
 
 
                ORG 0X4600;,0X8000
 
;КОМПИЛЯЦИЯ ПОД АДРЕС ДЛЯ NeoGS 0X4600
 
;ОТКОМПИЛЕННОЕ УКЛАДАЕМ С АДРЕСА 0X8000
 
 
 
START           DI
 
                LD A,PG4MP3
 
                OUT (MPAG),A
 
;ВКЛЮЧИЛИ ДЕФОЛТНУЮ СТРАНИЦУ
 
                LD A,6
 
                CALL COM__SD
 
                AND A
 
;ОПРЕДЕЛЯЕМ GS/NeoGS
 
                JR Z,INI_MP3
 
                LD A,0XCC
 
                JR START4
 
;КОД ОШИБКИ =GS
 
 
 
INI_MP3         LD A,8
 
                CALL COM__SD
 
;ИНИЦИАЛИЗАЦИЯ MP3 ЧИПА
 
INI__SD         LD SP,GSSTEK
 
                IN A,(DAMNPORT1)
 
START2          XOR A
 
                CALL COM__SD
 
                AND A
 
;ИНИЦИАЛИЗАЦИЯ SD КАРТЫ
 
                JR Z,START1
 
                LD A,0XEE
 
                LD (CALBFAT),A
 
                JR START4
 
;КОД ОШИБКИ =SD КАРТА НЕ НАЙДЕНА
 
START1          XOR A
 
                CALL COM_FAT
 
;ИНИЦИАЛИЗАЦИЯ FAT
 
                LD (CALBFAT),A
 
                INC A
 
                JR NZ,START3
 
                LD A,0XDD
 
                JR START4
 
;КОД ОШИБКИ =FAT НЕ НАЙДЕН
 
 
 
START3          CALL CP_XB
 
                CALL RTYPEVS
 
                LD A,3
 
                CALL COM_FAT
 
;ПОИСК ВСЕХ ДИРЕКТОРИЙ
 
                LD A,4
 
                CALL COM_FAT
 
;ПОИСК ВСЕХ ФАЙЛОВ ПО МАСКЕ
 
                LD (KOLWMP3),HL
 
                IN A,(CLRCBIT)
 
                LD BC,0
 
                LD (STOP_PL+1),BC
 
                CALL PAUSEPL
 
;ПОСТАНОВКА НА ПАУЗУ
 
                LD A,H
 
                OR L
 
                LD A,0XBB
 
                JR Z,START4
 
;КОД ОШИБКИ =ФАЙЛОВ НЕ НАЙДЕНО
 
                CALL INIPLAY
 
                LD A,0X77
 
;КОД ОШИБКИ =ВСЕ ЗАМЕЧАТЕЛЬНО
 
START4          LD (REJIMGS),A
 
                OUT (ZXDATWR),A
 
;СООБЩИЛИ СПЕКУ О РЕЗУЛЬТАТАХ ИНИТА
 
                IN A,(DAMNPORT1)
 
 
 
;ОСНОВМОЙ ЦИКЛ ОБЩЕНИЯ СО СПЕКОМ
 
OPROS           IN A,(ZXSTAT)
 
                RRA
 
                JR C,OPROS1
 
                CALL PLAYMP3
 
                JR OPROS
 
 
 
OPROS1          IN A,(CLRCBIT)
 
                IN A,(ZXCMD)
 
                LD L,A
 
                AND A
 
                JR Z,OPROS2
 
                LD A,(REJIMGS)
 
                CP 0X78
 
                JR NC,OPROS
 
                LD A,L
 
OPROS2          CP LOW ((END_TAB-TABFUNC)/2)+1
 
                JR NC,OPROS
 
                ADD A,A
 
                LD L,A
 
                LD H,0
 
                LD DE,TABFUNC
 
                ADD HL,DE
 
                LD E,(HL)
 
                INC HL
 
                LD D,(HL)
 
                LD HL,OPROS
 
                PUSH HL
 
                EX DE,HL
 
                JP (HL)
 
 
 
TABFUNC         DW INI__SD      ;00 ПЕРЕЗАПУСК SD
 
                DW PREVPL       ;01 ПРЕДЫДУЩИЙ ТРЕК
 
                DW PLAY         ;02 ПЛЕЙ
 
                DW PAUSEPL      ;03 ПАУЗА
 
                DW STOP_PL      ;04 СТОП
 
                DW NEXTPL       ;05 СЛЕДУЮЩИЙ ТРЕК
 
                DW XORBASS      ;06 XOR TREBLE/BASS
 
                DW XORSURR      ;07 XOR SURROUND
 
                DW VOL_UP       ;08 ГРОМКОСТЬ +
 
                DW VOL_DN       ;09 ГРОМКОСТЬ -
 
                DW MUTE         ;0A ВКЛ/ВЫКЛ ГРОМКОСТИ
 
                DW GETTIME      ;0B ОТДАТЬ ВРЕМЯ
 
                DW GET_VTS      ;0C ОТДАТЬ ПАРАМ 6-10
 
                DW GET_TEK      ;0D ОТДАТЬ ТЕК НОМЕР
 
                DW SET_NUM      ;0E ПОЛУЧИТЬ ТЕК НОМЕР
 
                DW SRESMP3      ;0F СБРОС MP3 ДЕКОДЕРА
 
                DW FATTYPE      ;10 ТИП FAT
 
                DW GET_LNG      ;11 ОТДАТЬ ИМЯ ФАЙЛА
 
                DW GETOPIS      ;12 ОТДАТЬ ОПИСАТЕЛЬ
 
                DW GETKMP3      ;13 ОТДАТЬ КОЛВО *.EXT
 
                DW GON2MP3      ;14 ПРД НА MP3
 
                DW GETDMP3      ;15 DEC ЧИСЛО ФАЙЛОВ
 
                DW GETDTEK      ;16 DEC ЧИСЛО ТЕКУЩ+1
 
                DW SFT_HRD      ;17 ПЕРЕКЛЮЧ СБРОСА
 
                DW PREVDIR      ;18 СЛЕДУЮЩИЙ DIR
 
                DW NEXTDIR      ;19 ПРЕДЫДУЩИЙ DIR
 
                DW SETTMBR      ;1A УСТ. ТЕМБРОВ
 
                DW RUSTTBL      ;1B ЧТЕНИЕ ТЕМБРОВ
 
                DW BITRATE      ;1C RD БИТРЕЙТ И ПРОЧ
 
                DW TESTREJ      ;1D ТЕСТ РЕЖИМА
 
END_TAB
 
 
 
;КОНВЕРСИЯ HDAT1,HDAT0
 
;ПОСЛЕ ЧТЕНИЯ BC=HDAT1, DE=HDAT0
 
BITRATE         LD HL,0X0309
 
                LD A,0X0A
 
                CALL COM__SD
 
                PUSH DE
 
                LD HL,0X0308
 
                LD A,0X0A
 
                CALL COM__SD
 
                POP BC
 
                LD A,C
 
                AND A
 
                LD HL,0XA000
 
                JP Z,GET_RZN
 
                AND %00011000
 
                RRCA
 
                RRCA
 
                RRCA
 
;БИТЫ ID
 
                LD L,A
 
                LD A,D
 
                AND %00001100
 
;БИТЫ SAMPLE RATE
 
                OR L
 
                LD L,A
 
                LD A,C
 
                AND %00000110
 
;БИТЫ LAYER
 
                RLCA
 
                RLCA
 
                RLCA
 
                OR L
 
                LD L,A
 
                LD A,E
 
                AND %11000000
 
;БИТЫ MODE
 
                OR L
 
                LD L,A
 
                LD A,D
 
                AND %11110000
 
;БИТЫ BITRATE
 
                RRCA
 
                RRCA
 
                RRCA
 
                RRCA
 
                LD H,A
 
                JP GET_RZN
 
;СБРОС НА СПЕК СОДЕРЖИМОГО HL
 
 
 
;ИЗМЕНЕНИЕ ТЕМБРОВ
 
SETTMBR         CALL WDY
 
                IN A,(ZXDATRD);ЧТЕНИЕ ПАРАМЕТРА
 
                LD B,A;СОХРАНЯЕМ
 
                LD A,(GET_VTS+2)
 
                BIT 3,A;ПРОВЕРЯЕМ ТИП ЧИПА
 
                RET Z;ДЛЯ VS1001 ВЫХОДИМ
 
;ДЛЯ VS1011 ПРОДОЛЖАЕМ
 
                BIT 7,A;ПРОВЕРЯЕМ МОЖНО ЛИ
 
                RET Z;КРУТИТЬ ТЕМБРЫ
 
                PUSH BC;СОХРАНЯЕМ "B"
 
                LD HL,0X0302
 
                LD A,0X0A;ЧИТАЕМ ТЕКУЩЕЕ ЗНАЧЕНИЕ
 
                CALL COM__SD;ТЕМБРОВ
 
                POP BC;ВОССТАНАВЛИВАЕМ "B"
 
                LD C,0X10;ШАГ ИЗМЕНЕНИЯ
 
                BIT 6,B;КРУТИМ UBASS?
 
                JR Z,STTMBR1
 
;МЕНЯЕМ УРОВЕНЬ BASS, БИТЫ 7-4
 
                LD A,E
 
                AND 0X0F
 
                LD L,A;СОХРАНЯЕМ БИТЫ 3-0
 
                LD A,E
 
                AND 0XF0
 
                BIT 7,B;КУДА КРУТИМ?
 
                JR Z,STMB01
 
;УВЕЛИЧЕНИЕ
 
                ADD A,C;УВЕЛИЧИВАЕМ НА 1
 
                JR C,STTMBR1;МАКСИМУМ!
 
                JR STMB02
 
;УМЕНЬШЕНИЕ
 
STMB01          SUB C;УМЕНЬШАЕМ НА 1
 
                JR C,STTMBR1;МИНИМУМ!
 
STMB02          ADD A,L
 
                LD E,A;ВЕРНУЛИ БИТЫ 3-0
 
STTMBR1         BIT 2,B;КРУТИМ UTREBLE?
 
                JR Z,STTMBR2
 
;МЕНЯЕМ УРОВЕНЬ TREBLE, БИТЫ 7-4
 
                LD A,D
 
                AND 0X0F
 
                LD L,A;СОХРАНЯЕМ БИТЫ 3-0
 
                LD A,D
 
                AND 0XF0
 
                BIT 3,B;КУДА КРУТИМ?
 
                JR Z,STMB03
 
;УВЕЛИЧЕНИЕ
 
                ADD A,C
 
                JR C,STTMBR2;МАКСИМУМ!
 
                JR STMB04
 
;УМЕНЬШЕНИЕ
 
STMB03          SUB C
 
                JR C,STTMBR3;МИНИМУМ!
 
STMB04          ADD A,L
 
                LD D,A;ВЕРНУЛИ БИТЫ 3-0
 
STTMBR2         BIT 4,B;КРУТИМ FBASS?
 
                JR Z,STTMBR3
 
;ИЗМЕНЕНИЕ ЧАСТОТЫ BASS, БИТЫ 3-0
 
                LD A,E
 
                AND 0XF0
 
                LD L,A;СОХРАНЯЕМ БИТЫ 7-4
 
                LD A,E
 
                AND 0X0F
 
                BIT 5,B;КУДА КРУТИМ?
 
                JR Z,STMB05
 
;УВЕЛИЧЕНИЕ
 
                INC A
 
                CP 0X10
 
                JR NC,STTMBR3;МАКСИМУМ!
 
                JR STMB06
 
 
 
STMB05          AND A
 
                JR Z,STTMBR3;МИНИМУМ!
 
                DEC A
 
STMB06          ADD A,L
 
                LD E,A;ВЕРНУЛИ БИТЫ 7-4
 
STTMBR3         BIT 0,B;КРУТИМ FTREBLE?
 
                JR Z,WRTMBR
 
;ИЗМЕНЕНИЕ ЧАСТОТЫ TREBLE, БИТЫ 3-0
 
                LD A,D
 
                AND 0XF0
 
                LD L,A;СОХРАНЯЕМ БИТЫ 7-4
 
                LD A,D
 
                AND 0X0F
 
                BIT 1,B;КУДА КРУТИМ?
 
                JR Z,STBM07
 
;УВЕЛИЧЕНИЕ
 
                INC A
 
                CP 0X10
 
                JR NC,WRTMBR;МАКСИМУМ!
 
                JR STBM08
 
 
 
;УМЕНЬШЕНИЕ
 
STBM07          AND A
 
                JR Z,$+3;МИНИМУМ!
 
                DEC A
 
STBM08          ADD A,L
 
                LD D,A;ВЕРНУЛИ БИТЫ 7-4
 
WRTMBR          LD HL,0X0202
 
                LD A,0X0A
 
                JP COM__SD
 
;ЗАПИСАЛИ УСТАНОВКИ ВЗАД
 
 
 
;ОТДАЧА БАЙТА ТИПА FAT
 
FATTYPE         LD A,(CALBFAT)
 
                JP GET_BYT
 
 
 
;ОПРЕДЕЛЕНИЕ УСТАНОВЛЕННОГО ЧИПА
 
RTYPEVS         LD A,0X0A
 
                LD HL,0X0301
 
                CALL COM__SD
 
                LD A,E
 
                RRCA
 
                AND 8
 
                LD E,A
 
                LD A,(GET_VTS+2)
 
                AND 0XF7
 
                OR E
 
                LD (GET_VTS+2),A
 
                RET
 
 
 
;ОТВЕТ НА ЗАПРОС КАКОЙ КОД РАБОТАЕТ
 
TESTREJ         IN A,(CLRCBIT)
 
                LD A,(ZXDATRD)
 
                LD A,(REJIMGS)
 
                OUT (ZXDATWR),A
 
                RET
 
 
 
;ПЕРЕКЛЮЧЕНИЕ ТИПА СБРОСА
 
SFT_HRD         LD HL,GET_VTS+2
 
                LD A,0X10
 
                XOR (HL)
 
                LD (HL),A
 
                LD A,8
 
                BIT 4,(HL)
 
                JR NZ,$+4
 
                LD A,0X0B
 
                LD (SRESMP3+1),A
 
                RET
 
 
 
;СБРОС MP3 ЧИПА
 
SRESMP3         LD A,0X0B
 
                JP COM__SD
 
 
 
;ОСТАНОВКА ПРОИГРЫВАНИЯ
 
STOP_PL         LD BC,0
 
                CALL PAUSEPL
 
                JP INIPLAY
 
 
 
;ПАУЗА ВОСПРОИЗВЕДЕНИЯ
 
PAUSEPL         LD A,0XC9
 
                LD (PLAYMP3),A
 
                RET
 
 
 
;ЗАПУСК ВОСПРОИЗВЕДЕНИЯ
 
PLAY            LD HL,(KOLWMP3)
 
                LD A,H
 
                OR L
 
                RET Z
 
                XOR A
 
                JR PAUSEPL+2
 
 
 
;ПЕРЕХОД НА СЛЕДУЩИЙ ПЕСНЯК
 
NEXTPL          LD BC,(STOP_PL+1)
 
                INC BC
 
                LD HL,(KOLWMP3)
 
                LD A,H
 
                OR L
 
                RET Z
 
                AND A
 
                SBC HL,BC
 
                JR NZ,$+5
 
                LD BC,0
 
                LD (STOP_PL+1),BC
 
                JP INIPLAY
 
 
 
;ПЕРЕХОД НА ПРЕДЫДУЩИЙ ПЕСНЯК
 
PREVPL          LD BC,(STOP_PL+1)
 
                LD A,B
 
                OR C
 
                JR NZ,PREVPL1
 
                LD BC,(KOLWMP3)
 
                LD A,B
 
                OR C
 
                RET Z
 
PREVPL1         DEC BC
 
                LD (STOP_PL+1),BC
 
                JP INIPLAY
 
 
 
;ПЕРЕХОД НА ПЕРВЫЙ ФАЙЛ СЛЕДУЩЕЙ DIR
 
NEXTDIR         LD BC,(STOP_PL+1)
 
                LD A,9
 
                PUSH BC
 
                CALL COM_FAT
 
                POP HL
 
                AND A
 
                SBC HL,BC
 
                RET Z
 
                LD (STOP_PL+1),BC
 
                JP INIPLAY
 
 
 
;ПЕРЕХОД НА ПЕРВЫЙ ФАЙЛ ПРЕДЫДУЩЕЙ DIR
 
PREVDIR         LD BC,(STOP_PL+1)
 
                LD A,8
 
                PUSH BC
 
                CALL COM_FAT
 
                POP HL
 
                AND A
 
                SBC HL,BC
 
                RET Z
 
                LD (STOP_PL+1),BC
 
                JP INIPLAY
 
 
 
;ПЕРЕГОНКА 512 БАЙТ СНАРУЖИ НА MP3
 
GON2MP3         LD HL,BUF_512
 
                LD DE,0X0200
 
                LD A,0X0C
 
                JP COM__SD
 
 
 
;ОТДАТЬ СПЕКУ ДЛИННОЕ ИМЯ
 
GET_LNG         CALL RDINBC
 
                BIT 7,B
 
                JR Z,$+6
 
                LD BC,(STOP_PL+1)
 
                LD HL,GET_VTS+2
 
                RES 5,(HL)
 
                LD HL,BUF_LNG
 
                LD A,2
 
                CALL COM_FAT
 
                LD E,0
 
                JP OUTDATA
 
 
 
;ВЫКЛ/ВКЛ ЗВУКА
 
MUTE            LD HL,0X030B
 
                LD A,0X0A
 
                CALL COM__SD
 
                LD A,E
 
                CP 0XFE
 
                JR NC,MUTEOFF
 
                LD (MUTEOFF+1),A
 
                LD HL,GET_VTS+2
 
                SET 6,(HL)
 
                LD E,0XFE
 
                JR VOL_ALL
 
 
 
MUTEOFF         LD E,0
 
                LD HL,GET_VTS+2
 
                RES 6,(HL)
 
                JR VOL_ALL
 
 
 
;УВЕЛИЧЕНИЕ ГРОМКОСТИ НА ЕДИНИЦУ
 
VOL_UP          LD HL,0X030B
 
                LD A,0X0A
 
                CALL COM__SD
 
                LD A,E
 
                AND A
 
                RET Z
 
                CP 0X80
 
                RET NC
 
                DEC E
 
                JR VOL_ALL
 
 
 
;УМЕНЬШЕНИЕ ГРОМКОСТИ НА ЕДИНИЦУ
 
VOL_DN          LD HL,0X030B
 
                LD A,0X0A
 
                CALL COM__SD
 
                LD A,E
 
                CP 0X7F
 
                RET NC
 
                INC E
 
VOL_ALL         LD D,E
 
                LD HL,0X020B
 
                LD A,E
 
                LD (GET_VTS+1),A
 
                LD A,0X0A
 
                JP COM__SD
 
 
 
;ПЕРЕКЛЮЧЕНИЕ VIRTUAL SURROUND
 
XORSURR         LD B,1
 
XOR_ALL         PUSH BC
 
                LD HL,0X0300
 
                LD A,0X0A
 
                CALL COM__SD
 
                POP BC
 
                LD A,E
 
                XOR B
 
                LD E,A
 
                LD A,(GET_VTS+2)
 
                XOR B
 
                LD (GET_VTS+2),A
 
                BIT 3,A
 
                JR Z,$+4
 
                RES 7,E
 
                LD HL,0X0200
 
                LD A,0X0A
 
                JP COM__SD
 
 
 
;ПЕРЕКЛЮЧЕНИЕ ТЕМБРОВ
 
XORBASS         LD A,(GET_VTS+2)
 
                BIT 3,A
 
                JR NZ,XB
 
                LD B,0X80
 
                JR XOR_ALL
 
 
 
XB              LD A,(GET_VTS+2)
 
                XOR 0X80
 
                LD (GET_VTS+2),A
 
 
 
CP_XB           LD A,(GET_VTS+2)
 
                BIT 7,A
 
                JR Z,XB1
 
VS_TBL          LD DE,0
 
XB2             LD HL,0X0202
 
                LD A,0X0A
 
                JP COM__SD
 
 
 
XB1             LD HL,0X0302
 
                LD A,0X0A
 
                CALL COM__SD
 
                LD (VS_TBL+1),DE
 
                LD DE,0
 
                JR XB2
 
 
 
;ПОЛУЧИТЬ ВРЕМЯ ПРОИГРЫВАНИЯ
 
GETTIME         LD HL,0X0304
 
                LD A,0X0A
 
                CALL COM__SD
 
                EX DE,HL
 
                LD DE,BUFTIME
 
                PUSH DE
 
                LD BC,36000
 
                CALL SUB_BC
 
                LD BC,3600
 
                CALL SUB_BC
 
                LD BC,600
 
                CALL SUB_BC
 
                LD BC,60
 
                CALL SUB_BC
 
                LD BC,10
 
                CALL SUB_BC
 
                LD A,0X30
 
                ADD A,L
 
                LD (DE),A
 
                LD E,6
 
                POP HL
 
                JP OUTDATA
 
 
 
;СБРОС НА СПЕК СОСТОЯНИЕ ТЕМБРОВ
 
;В ТЕКСТОВОМ ВИДЕ
 
RUSTTBL         LD A,(GET_VTS+2)
 
                BIT 3,A
 
                RET Z
 
                LD HL,0X0302
 
                LD A,0X0A
 
                CALL COM__SD
 
                LD A,D
 
                EXX
 
                LD DE,BUFTIME
 
                AND 0X0F
 
                LD L,A
 
                LD H,0
 
                LD BC,10
 
                CALL SUB_BC
 
                LD A,0X30
 
                ADD A,L
 
                LD (DE),A
 
;ПОЛОЖИЛИ ЧАСТОТУ TREBLE
 
                INC DE
 
                EXX
 
                LD A,D
 
                EXX
 
                AND 0XF0
 
                RRCA
 
                RRCA
 
                RRCA
 
                RRCA
 
                LD L,A
 
                BIT 3,A
 
                LD A,0X2B
 
                JR Z,$+4
 
                LD A,0X2D
 
                LD (DE),A
 
                INC DE
 
                LD A,L
 
                AND 7
 
                ADD A,0X30
 
                LD (DE),A
 
;ПОЛОЖИЛИ УРОВЕНЬ TREBLE
 
                INC DE
 
                EXX
 
                LD A,E
 
                EXX
 
                AND 0X0F
 
                LD L,A
 
                LD BC,10
 
                CALL SUB_BC
 
                LD A,0X30
 
                ADD A,L
 
                LD (DE),A
 
;ПОЛОЖИЛИ ЧАСТОТУ BASS
 
                INC DE
 
                EXX
 
                LD A,E
 
                EXX
 
                AND 0XF0
 
                RRCA
 
                RRCA
 
                RRCA
 
                RRCA
 
                LD L,A
 
                LD BC,10
 
                CALL SUB_BC
 
                LD A,0X30
 
                ADD A,L
 
                LD (DE),A
 
;ПОЛОЖИЛИ УРОВЕНЬ BASS
 
                EXX
 
                LD E,8
 
                LD HL,BUFTIME
 
                LD A,0X30
 
                CP (HL)
 
                JR NZ,$+4
 
                LD (HL),0X20
 
                JP OUTDATA
 
 
 
SUB_BC          LD A,0XFF
 
                AND A
 
                INC A
 
                SBC HL,BC
 
                JR NC,$-3
 
                ADD HL,BC
 
                ADD A,0X30
 
                LD (DE),A
 
                INC DE
 
                RET
 
 
 
;СБРОС НА СПЕК КОЛ-ВО НАЙДЕННЫХ ФАЙЛОВ
 
GETDMP3         LD HL,(KOLWMP3)
 
 
 
;ПЕРЕГОНЯЕМ HL В TXT И СБРАСЫВАЕМ
 
GETDCHR         LD DE,BUFTIME
 
                PUSH DE
 
                LD BC,10000
 
                CALL SUB_BC
 
                LD BC,1000
 
                CALL SUB_BC
 
                LD BC,100
 
                CALL SUB_BC
 
                LD BC,10
 
                CALL SUB_BC
 
                LD A,0X30
 
                ADD A,L
 
                LD (DE),A
 
                POP HL
 
                PUSH HL
 
                LD BC,0X0420
 
                LD A,(HL)
 
                CP 0X30
 
                JR NZ,GO_OUTD
 
                LD (HL),C
 
                INC HL
 
                DJNZ $-7
 
GO_OUTD         POP HL
 
                LD E,5
 
                JR OUTDATA
 
 
 
;СБРОС НА СПЕК НОМЕРА ИГРАЕМОГО ФАЙЛА+1
 
;С ПЕРЕГОНКОЙ В ТЕКСТОВЫЙ ВИД
 
GETDTEK         LD HL,(STOP_PL+1)
 
                INC HL
 
                JR GETDCHR
 
 
 
;ОТДАТЬ СПЕКУ 33 БАЙТА ОПИСАТЕЛЯ ФАЙЛА
 
GETOPIS         CALL RDINBC
 
                BIT 7,B
 
                JR Z,$+6
 
                LD BC,(STOP_PL+1)
 
                LD A,1
 
                CALL COM_FAT
 
                LD BC,0X20
 
                ADD HL,BC
 
                LD (HL),E
 
                SBC HL,BC
 
                LD E,0X21
 
 
 
;ОТДАЕМ БАЙТИКИ, СЧЕТЧИК БАЙТА В E
 
OUTDATA         LD A,(HL)
 
                INC HL
 
                OUT (ZXDATWR),A
 
                CALL WDN
 
                DEC E
 
                JR NZ,OUTDATA
 
                RET
 
 
 
;УСТАНОВКА НОМЕРА ФАЙЛА ДЛЯ ИГРАНИЯ
 
;ЕСЛИ НЕ ПРЕВЫШАЕТ КОЛ-ВО НАЙДЕННОГО-1
 
SET_NUM         CALL RDINBC
 
                LD HL,(KOLWMP3)
 
                AND A
 
                SBC HL,BC
 
                RET C
 
                LD (STOP_PL+1),BC
 
                RET
 
 
 
;ЧИТАЕМ В BC
 
RDINBC          CALL WDY
 
                IN A,(ZXDATRD)
 
                LD B,A
 
                CALL WDY
 
                IN A,(ZXDATRD)
 
                LD C,A
 
                RET
 
 
 
;ОТДАТЬ СПЕКУ КОЛ-ВО НАЙДЕННОГО
 
GETKMP3         LD HL,(KOLWMP3)
 
                JR GET_RZN
 
 
 
;ОТДАТЬ СПЕКУ НОМЕР ТЕКУЩЕГО ФАЙЛА
 
GET_TEK         LD HL,(STOP_PL+1)
 
                JR GET_RZN
 
 
 
;В HL СОДЕРЖИМОЕ БИТОВ УСТАНОВОК
 
GET_VTS         LD HL,0
 
 
 
;СБРАСЫВАЕМ СОДЕРЖИМОЕ HL НА СПЕК
 
GET_RZN         LD A,H
 
                OUT (ZXDATWR),A
 
                CALL WDN
 
                LD A,L
 
 
 
;СБРОСИТЬ НА СПЕК 2 БАЙТА HL
 
GET_BYT         OUT (ZXDATWR),A
 
 
 
;ЖДЕМ ПОКА СПЕК ЗАБЕРЕТ БАЙТ ИЗ ПОРТА
 
WDN             IN A,(ZXSTAT)
 
                RLA
 
                JR C,$-3
 
                RET
 
 
 
;ЖДЕМ ПОКА СПЕК ДАСТ БАЙТ В ПОРТ
 
WDY             IN A,(ZXSTAT)
 
                RLA
 
                JR NC,$-3
 
                RET
 
 
 
;ИГРАТЬ НА MP3-ДЕКОДЕР 1 СЕКТОР
 
PLAYMP3         RET
 
                LD A,6
 
                CALL COM_FAT
 
                RET NZ
 
;ФАЙЛО НЕ КОНЧИЛОСЬ, ВЫХОДИМ
 
                LD A,0X0D
 
                CALL COM__SD
 
                JP NEXTPL
 
;ФАЙЛ КОНЧИЛСЯ, ЗАВЕРШАЕМ НУЛЯМИ
 
;И ПЕРЕХОДИМ НА СЛЕДУЮЩИЙ ФАЙЛ
 
 
 
;ОТКРЫТИЕ ФАЙЛА И ИНИТ ДЕКОДЕРА
 
INIPLAY         PUSH BC
 
                CALL SRESMP3
 
;СБРОС ЧИПА В ЗАВИСИМОСТИ ОТ УСТАНОВОК
 
                LD HL,(GET_VTS+1)
 
                BIT 4,H
 
;ЕСЛИ СБРОС =HARD, ТО ОБНУЛЯЕМ ВСЕ
 
;КРОМЕ БИТА УСТАНОВЛЕННОГО MP3 ЧИПА
 
;И ТИПА СБРОСА ЭТОГО ЧИПА
 
                JR Z,INIPLA1
 
                LD L,0
 
                LD A,H
 
                AND %00011000
 
                LD H,A
 
INIPLA1         SET 5,H
 
                LD (GET_VTS+1),HL
 
;ВКЛЮЧАЕМ БИТ 5, ПОШОЛ НОВЫЙ ФАЙЛ
 
                POP BC
 
                LD A,7
 
                JP COM_FAT
 
;ОТКРЫВАЕМ НОВЫЙ ФАЙЛ
 
 
 
COM__SD         include sd4ngs.a80      ; INCL "SD4NGS";ДРАЙВЕР SD КАРТЫ
 
COM_FAT         include fat4ngs.a80     ; INCL "FAT4NGS";ДРАЙВЕР FAT