Subversion Repositories ngs

Rev

Rev 164 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed | ?url?

  1.  
  2. ; LAST UPDATE 15.01.2024 savelij
  3.  
  4. ; код для нгс
  5.  
  6.                 include macros.a80
  7.                 include ports_ngs.a80
  8.                 include sdcomand.a80
  9.                 include bootsecfat.a80
  10.                 include fat_dir.a80
  11.                 include define_vs10xx.a80
  12.                 include local_define.a80
  13.  
  14. ; патч прошивки для плеерения MOD
  15. ; плеерение, проверка и прочее
  16. COMINT          EQU 0x026B
  17. COMINT_         EQU 0x026E
  18. COMINT0         EQU 0x0273
  19. COMINT1         EQU 0x0295
  20. WTDTL           EQU 0x02BC
  21. EMPTY1          EQU 0x0942
  22. ADDA80          EQU 0x0EF8
  23. EMPTY2          EQU 0x3D5F
  24. NUMPG           EQU 0x4080                              ; всего страниц
  25. CPAGE           EQU 0x4081
  26. CNTMOD          EQU 0x4090
  27. CURMOD          EQU 0x4096
  28. CONVERT         EQU 0x40B7
  29. MTSTAT          EQU 0x4151
  30. MTSNGPS         EQU 0x415B
  31. MTSNGSZ         EQU 0x415C
  32. PlMode          EQU 0x41A0
  33. MODLLEN         EQU 0x41A1
  34. ISTACK          EQU 0x4400
  35. LDMOD           EQU 0xC3F8
  36. PLAYMOD         EQU 0xC426
  37. FXB01           EQU 0xD2B2
  38.  
  39.  BITMASK MOD_STOP_PLAY,         7                       ; 1-MOD STOP, 0-PLAY
  40.  
  41.  INIT_VAR 0x4168
  42.  SETVAR FLAGS,                  BYTE
  43.  SETVAR STATUS,                 BYTE                    ; 1 статус плеера
  44.  SETVAR GETVTSL,                BYTE                    ; 1 громкость MP3 чипа
  45.  SETVAR GETVTSH,                BYTE                    ; 1 биты режимов
  46.  SETVAR VSTBL,                  WORD                    ; 2 текущие настройки тембров
  47.  SETVAR COUNT_MP3,              WORD                    ; 2 количество MP3
  48.  SETVAR NUMFILE,                WORD                    ; 2 номер текущего файла
  49.  SETVAR TYPE_RESET,             BYTE                    ; 1 тип сброса
  50.  SETVAR TYPE_FAT,               BYTE                    ; 1 калибр FAT
  51.  SETVAR BUF_TEXT,               8                       ; 8 буфер для текста
  52.  SETVAR SIZE_PATTERN_MOD,       BYTE                    ; 1 кол-во патернов в загруженном MOD
  53.  SETVAR SIZE_PAGES_MOD,         BYTE                    ; 1 кол-во страниц MOD
  54.  SETVAR TIMEOUT,                WORD                    ; 2 TIMEOUT на работу с новым файлом
  55.  SETVAR KUDAXOR,                WORD                    ; 2 адрес перехода на XOR BIT 7
  56.  SETVAR PAGE_PLAYER,            BYTE                    ; 1 номер страницы расположения плеера
  57.  SETVAR INT_MODE,               BYTE                    ; 1 флаг разрешенности прерываний
  58.  SETVAR CHIP_TYPE,              BYTE                    ; 1 тип чина на плате
  59.  SETVAR FILE_TYPE,              BYTE                    ; 1 тип файла
  60.  SETVAR SIZE_VARS,              0                       ; количество переменных
  61.  
  62. ; маски изменения тембров (требует проверки, на VS1011 работает только BASS
  63.  BITMASK UBASS_DIR,             7                       ; направление изменения UBASS
  64.  BITMASK UBASS,                 6                       ; UBASS
  65.  BITMASK FBASS_DIR,             5                       ; направление изменения FBASS
  66.  BITMASK FBASS,                 4                       ; FBASS
  67.  BITMASK UTREBLE_DIR,           3                       ; направление изменения UTREBLE
  68.  BITMASK UTREBLE,               2                       ; UTREBLE
  69.  BITMASK FTREBLE_DIR,           1                       ; направление изменения FTREBLE
  70.  BITMASK FTREBLE,               0                       ; FTREBLE
  71.  
  72. FREQ10          EQU 0
  73. FREQ12          EQU 1
  74. FREQ20          EQU 2
  75. FREQ24          EQU 3
  76.  
  77.                 ORG 0x8000
  78. START           DI
  79.                 LD SP,ISTACK
  80.                 CALL ALLRES                             ; сброс всех настроек
  81.                 OUT (ZXDATWR),A
  82.                 OUT (CLRCBIT),A                         ; сообщили спеку о результатах инита
  83.                 LD A,1
  84.                 LD (PlMode),A
  85.                 LD HL,0x0200
  86.                 LD (MODLLEN),HL
  87.                 JP CONTINUE_MOD
  88.  
  89. TABFUNC         DW INIT_SD                              ; 00 перезапуск SD
  90.                 DW PREV_TRACK                           ; 01 предыдущий трек
  91.                 DW PLAY                                 ; 02 плей
  92.                 DW PAUSE                                ; 03 пауза
  93.                 DW STOP                                 ; 04 стоп
  94.                 DW NEXT_TRACK                           ; 05 следующий трек
  95.                 DW XORBASS                              ; 06 XOR TREBLE/BASS
  96.                 DW XORSURR                              ; 07 XOR SURROUND
  97.                 DW VOL_UP                               ; 08 громкость +
  98.                 DW VOL_DOWN                             ; 09 громкость -
  99.                 DW MUTE                                 ; 0A вкл/выкл громкости
  100.                 DW GET_TIME                             ; 0B отдать время
  101.                 DW GET_VTS                              ; 0C отдать парам 6-10
  102.                 DW GET_CURRENT                          ; 0D отдать тек номер
  103.                 DW SET_NUM                              ; 0E установка текущего номера
  104.                 DW RESET_MP3                            ; 0F сброс MP3 декодера
  105.                 DW FAT_TYPE                             ; 10 тип FAT
  106.                 DW GET_LNG                              ; 11 отдать имя файла
  107.                 DW GET_FILE_DESCR                       ; 12 отдать описатель
  108.                 DW GET_COUNT_FILES                      ; 13 отдать колво *.EXT
  109.                 DW SEND_MP3                             ; 14 прд на MP3
  110.                 DW TXT_COUNT_FILES                      ; 15 DEC число файлов
  111.                 DW TXT_CURRENT_FILE                     ; 16 DEC число текущ+1
  112.                 DW XOR_RESET                            ; 17 переключения типа сброса
  113.                 DW PREV_DIR                             ; 18 следующий DIR
  114.                 DW NEXT_DIR                             ; 19 предыдущий DIR
  115.                 DW SET_TEMBR                            ; 1A уст. тембров
  116.                 DW TXT_TEMBR_STATUS                     ; 1B чтение тембров
  117.                 DW BITRATE                              ; 1C RD битрейт и проч
  118.                 DW TEST_MODE                            ; 1D тест режима
  119.                 DW GET_CHIP_TYPE                        ; 1E номер чипа MP3
  120. END_TAB
  121.  
  122. ALLRES          CALL PATCH                              ; патч основной прошивки
  123.                 LD HL,FLAGS
  124.                 LD D,H
  125.                 LD E,L
  126.                 LD BC,SIZE_PAGES_MOD - FLAGS            ; количество переменных для зануления
  127.                 INC DE
  128.                 LD (HL),0
  129.                 LDIR                                    ; зачистка области переменных
  130.                 LD A,Softmp3
  131.                 LD (TYPE_RESET),A                       ; установка сброса MP3 чипа
  132.                 LD A,Avtodet
  133.                 CALL COM__SD
  134.                 AND A                                   ; определяем GS/NeoGS
  135.                 JR Z,INI_MP3
  136.                 LD A,NEOGS_ERROR
  137.                 JR INIT_SD.L4                           ; код ошибки =GS
  138.  
  139. INI_MP3         LD A,Hardmp3
  140.                 CALL COM__SD                            ; полная инициализация MP3 чипа
  141.  
  142. ;----FUNC00----
  143. INIT_SD         CALL RTYPEVS                            ; получение номера чипа MP3
  144.                 LD HL,0
  145.                 LD (NUMFILE),HL
  146.                 LD A,Sd_init
  147.                 CALL COM__SD
  148.                 AND A                                   ; инициализация SD карты
  149.                 JR Z,.L1
  150.                 LD A,SD_NOT_FOUND
  151.                 LD (TYPE_FAT),A
  152.                 JR .L4                                  ; код ошибки =SD карта не найдена
  153.  
  154. .L1             LD HL,FLAGS
  155.                 RES B_SD_LOST,(HL)
  156.                 LD A,Init_Fatvars
  157.                 CALL COM_FAT                            ; инициализация FAT
  158.                 CP 0x80
  159.                 JR Z,.L11
  160.                 LD (TYPE_FAT),A
  161.                 INC A
  162.                 JR NZ,.L3
  163. .L11            LD A,FAT_NOT_FOUND
  164.                 JR .L4                                  ; код ошибки =FAT не найден
  165.  
  166. .L3             CALL XORBASS.L2
  167.                 LD A,Finddir
  168.                 CALL COM_FAT                            ; поиск всех директорий
  169.                 CP 0x80
  170.                 JR Z,.L11
  171.                 LD A,Findfil
  172.                 CALL COM_FAT                            ; поиск всех файлов по маске
  173.                 CP 0x80
  174.                 JR Z,.L11
  175.                 LD (COUNT_MP3),HL
  176.                 OUT (CLRCBIT),A
  177.                 CALL PAUSE                              ; постановка на паузу
  178.                 LD A,H
  179.                 OR L
  180.                 LD A,FILES_NOT_FOUND
  181.                 JR Z,.L4                                ; код ошибки =файлов не найдено
  182.                 LD BC,0
  183.                 CALL INIPLAY
  184.                 LD A,PLAYER_OK                          ; код ошибки =все замечательно
  185. .L4             LD (STATUS),A
  186.                 RET
  187.  
  188. ;----FUNC1C----
  189. ; конверсия HDAT1,HDAT0
  190. ; после чтения BC=HDAT1, DE=HDAT0
  191. BITRATE         LD HL,VS10XX_READ << 8 + SCI_HDAT1;0x0309
  192.                 LD A,Com_mp3
  193.                 CALL COM__SD
  194.                 PUSH DE
  195.                 LD HL,VS10XX_READ << 8 + SCI_HDAT0;0x0308
  196.                 LD A,Com_mp3
  197.                 CALL COM__SD
  198.                 POP BC
  199.                 LD A,C
  200.                 AND A
  201.                 LD HL,0xA000
  202.                 JP Z,GET_RZN                            ; переход если ничего не играется
  203.                 AND %00011000
  204.                 RRCA
  205.                 RRCA
  206.                 RRCA                                    ; биты ID
  207.                 LD L,A
  208.                 LD A,D
  209.                 AND %00001100                           ; биты SAMPLE RATE
  210.                 OR L
  211.                 LD L,A
  212.                 LD A,C
  213.                 AND %00000110                           ; биты LAYER
  214.                 RLCA
  215.                 RLCA
  216.                 RLCA
  217.                 OR L
  218.                 LD L,A
  219.                 LD A,E
  220.                 AND %11000000                           ; биты MODE
  221.                 OR L
  222.                 LD L,A
  223.                 LD A,D
  224.                 AND %11110000                           ; биты BITRATE
  225.                 RRCA
  226.                 RRCA
  227.                 RRCA
  228.                 RRCA
  229.                 LD H,A
  230.                 JP GET_RZN                              ; сброс на спек содержимого HL
  231.  
  232. ;----FUNC1A----
  233. ; изменение тембров
  234. SET_TEMBR       OUT (CLRCBIT),A
  235.                 CALL WDY
  236.                 IN A,(ZXDATRD)                          ; чтение параметра
  237.                 LD B,A                                  ; сохраняем
  238.                 LD A,(CHIP_TYPE)
  239.                 CP VS1001                               ; проверяем тип чипа
  240.                 RET Z                                   ; для VS1001 выходим
  241. ; для VS1011 продолжаем
  242.                 LD A,(GETVTSH)
  243.                 BIT B_ENABLE_TEMBR,A                    ; проверяем можно ли
  244.                 RET Z                                   ; крутить тембры
  245.                 PUSH BC                                 ; сохраняем "B"
  246.                 LD HL,VS10XX_READ << 8 + SCI_BASS;0x0302
  247.                 LD A,Com_mp3                            ; читаем текущее значение
  248.                 CALL COM__SD                            ; тембров
  249.                 POP BC                                  ; восстанавливаем "B"
  250.                 LD C,0x10                               ; шаг изменения
  251. ; меняем уровень UBASS ?
  252.                 BIT B_UBASS,B                           ; крутим UBASS?
  253.                 JR Z,.L1
  254.                 LD A,E
  255.                 AND %00001111
  256.                 LD L,A                                  ; сохраняем биты 3-0
  257.                 LD A,E
  258.                 AND %11110000
  259.                 BIT B_UBASS_DIR,B                       ; куда крутим?
  260.                 JR Z,.L01                               ; увеличение
  261. ; увеличение UBASS
  262.                 ADD A,C                                 ; увеличиваем на 1
  263.                 JR C,.L1                                ; максимум!
  264.                 JR .L02
  265.  
  266. ; уменьшение UBASS
  267. .L01            SUB C                                   ; уменьшаем на 1
  268.                 JR C,.L1                                ; минимум!
  269. .L02            ADD A,L
  270.                 LD E,A                                  ; вернули биты 3-0
  271.  
  272. ; меняем уровень UTREBLE ?
  273. .L1             BIT B_UTREBLE,B                         ; крутим UTREBLE?
  274.                 JR Z,.L2
  275.                 LD A,D
  276.                 AND %00001111
  277.                 LD L,A                                  ; сохраняем биты 3-0
  278.                 LD A,D
  279.                 AND %11110000
  280.                 BIT B_UTREBLE_DIR,B                     ; куда крутим?
  281.                 JR Z,.L03
  282. ; увеличение UTREBLE
  283.                 ADD A,C
  284.                 JR C,.L2                                ; максимум!
  285.                 JR .L04
  286.  
  287. ; уменьшение UTREBLE
  288. .L03            SUB C
  289.                 JR C,.L3                                ; минимум!
  290. .L04            ADD A,L
  291.                 LD D,A                                  ; вернули биты 3-0
  292. ; меняем уровень FBASS ?
  293. .L2             BIT B_FBASS,B                           ; крутим FBASS?
  294.                 JR Z,.L3
  295.                 LD A,E
  296.                 AND %11110000
  297.                 LD L,A                                  ; сохраняем биты 7-4
  298.                 LD A,E
  299.                 AND %00001111
  300.                 BIT B_FBASS_DIR,B                       ; куда крутим?
  301.                 JR Z,.L05
  302. ; увеличение FBASS
  303.                 INC A
  304.                 CP 0x10
  305.                 JR NC,.L3                               ; максимум!
  306.                 JR .L06
  307.  
  308. ; уменьшение FBASS
  309. .L05            AND A
  310.                 JR Z,.L3                                ; минимум!
  311.                 DEC A
  312. .L06            ADD A,L
  313.                 LD E,A                                  ; вернули биты 7-4
  314. ; меняем уровень FTREBLE ?
  315. .L3             BIT B_FTREBLE,B                         ; крутим FTREBLE?
  316.                 JR Z,WR_TEMBR
  317.                 LD A,D
  318.                 AND %11110000
  319.                 LD L,A                                  ; сохраняем биты 7-4
  320.                 LD A,D
  321.                 AND %00001111
  322.                 BIT B_FTREBLE_DIR,B                     ; куда крутим?
  323.                 JR Z,.L07
  324. ; увеличение FTREBLE
  325.                 INC A
  326.                 CP 0x10
  327.                 JR NC,WR_TEMBR                          ; максимум!
  328.                 JR .L08
  329.  
  330. ; уменьшение FTREBLE
  331. .L07            AND A
  332.                 JR Z,.L08                               ; минимум!
  333.                 DEC A
  334. .L08            ADD A,L
  335.                 LD D,A                                  ; вернули биты 7-4
  336. ; записываем изменение в чип
  337. WR_TEMBR        LD HL,VS10XX_WRITE << 8 + SCI_BASS;0x0202
  338.                 LD A,Com_mp3
  339.                 JP COM__SD                              ; записали установки взад
  340.  
  341. ;----FUNC10----
  342. ; отдача байта типа FAT
  343. FAT_TYPE        LD A,(TYPE_FAT)
  344.                 JP GET_BYT
  345.  
  346. ; определение установленного чипа
  347. RTYPEVS         LD HL,VS10XX_READ << 8 + SCI_STATUS;0x0301
  348.                 LD A,Com_mp3
  349.                 CALL COM__SD
  350.                 LD A,E                                  ; нас интересуют биты 7-4 из регистра статуса
  351.                 RRCA
  352.                 RRCA
  353.                 RRCA
  354.                 RRCA
  355.                 AND %00001111                           ; сдвинули в младшие биты
  356.                 LD (CHIP_TYPE),A                        ; тип установленного MP3 чипа
  357.                 RET
  358.  
  359. ;----FUNC1D----
  360. ; ответ на запрос какой код работает
  361. TEST_MODE       IN A,(ZXDATRD)
  362.                 OUT (CLRCBIT),A
  363.                 LD A,(STATUS)
  364.                 OUT (ZXDATWR),A
  365.                 RET
  366.  
  367. ;----FUNC1E-----
  368. ; получение номера чипа MP3
  369. GET_CHIP_TYPE   IN A,(ZXDATRD)
  370.                 OUT (CLRCBIT),A
  371.                 LD A,(CHIP_TYPE)
  372.                 OUT (ZXDATWR),A
  373.                 RET
  374.  
  375. ;----FUNC17----
  376. ; переключение типа сброса
  377. XOR_RESET       LD HL,GETVTSH
  378.                 LD A,M_TYPE_RESET
  379.                 XOR (HL)
  380.                 LD (HL),A
  381.                 LD A,Hardmp3
  382.                 BIT B_TYPE_RESET,(HL)
  383.                 JR NZ,.L1
  384.                 LD A,Softmp3
  385. .L1             LD (TYPE_RESET),A
  386.                 RET
  387.  
  388. ;----FUNC0F----
  389. ; сброс MP3 чипа
  390. RESET_MP3       LD A,(TYPE_RESET)
  391.                 JP COM__SD
  392.  
  393. ;----FUNC04----
  394. ; остановка проигрывания
  395. STOP            CALL PAUSE
  396.                 LD BC,(NUMFILE)
  397.                 JP INIPLAY
  398.  
  399. ;----FUNC03----
  400. ; пауза воспроизведения
  401. PAUSE           LD HL,MTSTAT
  402.                 SET B_MOD_STOP_PLAY,(HL)
  403.                 LD HL,FLAGS
  404.                 RES B_PLAY_STOP,(HL)
  405.                 RET
  406.  
  407. ;----FUNC02----
  408. ; запуск воспроизведения
  409. PLAY            LD HL,(COUNT_MP3)
  410.                 LD A,H
  411.                 OR L
  412.                 RET Z
  413.                 LD HL,MTSTAT
  414.                 RES B_MOD_STOP_PLAY,(HL)
  415.                 LD HL,FLAGS
  416.                 SET B_PLAY_STOP,(HL)
  417.                 RET
  418.  
  419. ;----FUNC05----
  420. ; переход на следущий песняк
  421. NEXT_TRACK      LD BC,(NUMFILE)
  422.                 INC BC
  423.                 LD HL,(COUNT_MP3)
  424.                 LD A,H
  425.                 OR L
  426.                 RET Z
  427.                 AND A
  428.                 SBC HL,BC
  429.                 JR NZ,.L1
  430.                 LD BC,0
  431.  
  432. ; общее для переходов по файлам
  433. .L1             LD (NUMFILE),BC
  434.                 JP INIPLAY
  435.  
  436. ;----FUNC01----
  437. ; переход на предыдущий песняк
  438. PREV_TRACK      LD BC,(NUMFILE)
  439.                 LD A,B
  440.                 OR C
  441.                 JR NZ,.L1
  442.                 LD BC,(COUNT_MP3)
  443.                 LD A,B
  444.                 OR C
  445.                 RET Z
  446. .L1             DEC BC
  447.                 JR NEXT_TRACK.L1
  448.  
  449. ;----FUNC19----
  450. ; переход на первый файл следущей DIR
  451. NEXT_DIR        LD A,Nxtdir
  452.                 JR P_DIR
  453.  
  454. ;----FUNC18----
  455. ; переход на первый файл предыдущей DIR
  456. PREV_DIR        LD A,Prvdir
  457. P_DIR           LD BC,(NUMFILE)
  458.                 PUSH BC
  459.                 CALL COM_FAT
  460.                 POP HL
  461.                 CP 0x80
  462.                 JP Z,SD_LOST
  463.                 AND A
  464.                 SBC HL,BC
  465.                 JR NZ,NEXT_TRACK.L1
  466.                 RET
  467.  
  468. ;----FUNC15----
  469. ; перегонка 512 байт снаружи на MP3
  470. SEND_MP3        LD A,Dat2mp3
  471.                 JP COM__SD
  472.  
  473. ;----FUNC11----
  474. ; отдать спеку длинное имя
  475. GET_LNG         CALL RDINBC
  476.                 BIT 7,B
  477.                 JR Z,.L1
  478.                 LD BC,(NUMFILE)
  479. .L1             LD HL,GETVTSH
  480.                 RES B_NEW_FILE,(HL)
  481.                 LD HL,BUF_LNG
  482. ;               LD A,Getlong
  483. ;               CALL COM_FAT
  484. ;               CP 0x80
  485. ;               JP Z,SD_LOST
  486.                 LD E,0
  487.                 JP OUTDATA
  488.  
  489. ;----FUNC0A----
  490. ; выкл/вкл звука
  491. MUTE            LD HL,VS10XX_READ << 8 + SCI_VOL;0x030B
  492.                 LD A,Com_mp3
  493.                 CALL COM__SD
  494.                 LD A,E
  495.                 CP 0xFE
  496.                 JR NC,MUTEOFF
  497.                 LD (MUTEOFF.L1),A
  498.                 LD HL,GETVTSH
  499.                 SET B_MUTE,(HL)
  500.                 LD E,0xFE
  501.                 JR VOL_ALL
  502.  
  503. MUTEOFF         LD E,0
  504. .L1             EQU $-1
  505.                 LD HL,GETVTSH
  506.                 RES B_MUTE,(HL)
  507.                 JR VOL_ALL
  508.  
  509. ;----FUNC08----
  510. ; увеличение громкости на единицу
  511. VOL_UP          LD HL,VS10XX_READ << 8 + SCI_VOL;0x030B
  512.                 LD A,Com_mp3
  513.                 CALL COM__SD
  514.                 LD A,E
  515.                 AND A
  516.                 RET Z
  517.                 CP 0x80
  518.                 RET NC
  519.                 DEC E
  520.                 JR VOL_ALL
  521.  
  522. ;----FUNC09----
  523. ; уменьшение громкости на единицу
  524. VOL_DOWN        LD HL,VS10XX_READ << 8 + SCI_VOL;0x030B
  525.                 LD A,Com_mp3
  526.                 CALL COM__SD
  527.                 LD A,E
  528.                 CP 0x7F
  529.                 RET NC
  530.                 INC E
  531. VOL_ALL         LD D,E
  532.                 LD HL,VS10XX_WRITE << 8 + SCI_VOL;0x020B
  533.                 LD A,E
  534.                 LD (GETVTSL),A
  535.                 JR XOR_ALL.L1
  536.  
  537. ;----FUNC07----
  538. ; переключение VIRTUAL SURROUND
  539. XORSURR         LD B,M_SURROUND
  540. XOR_ALL         PUSH BC
  541.                 LD HL,VS10XX_READ << 8 + SCI_MODE;0x0300
  542.                 LD A,Com_mp3
  543.                 CALL COM__SD
  544.                 POP BC
  545.                 LD A,E
  546.                 XOR B
  547.                 LD E,A
  548.                 LD A,(GETVTSH)
  549.                 XOR B
  550.                 LD (GETVTSH),A
  551.                 LD A,(CHIP_TYPE)
  552.                 CP VS1001
  553.                 JR Z,.L2
  554.                 RES 7,E
  555. .L2             LD HL,VS10XX_WRITE << 8 + SCI_MODE;0x0200
  556. .L1             LD A,Com_mp3
  557.                 JP COM__SD
  558.  
  559. ;----FUNC06----
  560. ; переключение тембров
  561. XORBASS         LD A,(CHIP_TYPE)
  562.                 CP VS1001
  563.                 JR Z,.L1
  564.                 LD B,M_ENABLE_TEMBR
  565.                 JR XOR_ALL
  566.  
  567. .L1             LD A,(GETVTSH)
  568.                 XOR M_ENABLE_TEMBR
  569.                 LD (GETVTSH),A
  570. .L2             LD A,(GETVTSH)
  571.                 BIT B_ENABLE_TEMBR,A
  572.                 JR Z,.L4
  573.                 LD DE,(VSTBL)
  574. .L3             LD HL,VS10XX_WRITE << 8 + SCI_BASS;0x0202
  575.                 JR XOR_ALL.L1
  576.  
  577. .L4             LD HL,VS10XX_READ << 8 + SCI_BASS;0x0302
  578.                 LD A,Com_mp3
  579.                 CALL COM__SD
  580.                 LD (VSTBL),DE
  581.                 LD DE,0
  582.                 JR .L3
  583.  
  584. ;----FUNC0B----
  585. ; получить время проигрывания
  586. GET_TIME        LD HL,VS10XX_READ << 8 + SCI_DECODE_TIME;0x0304
  587.                 LD A,Com_mp3
  588.                 CALL COM__SD
  589.                 EX DE,HL
  590.                 LD DE,BUF_TEXT
  591.                 PUSH DE
  592.                 LD BC,36000
  593.                 CALL SUB_BC
  594.                 LD BC,3600
  595.                 CALL SUB_BC
  596.                 LD BC,600
  597.                 CALL SUB_BC
  598.                 LD BC,60
  599.                 CALL SUB_BC
  600.                 LD BC,10
  601.                 CALL SUB_BC
  602.                 LD A,'0'
  603.                 ADD A,L
  604.                 LD (DE),A
  605.                 LD E,6
  606.                 POP HL
  607.                 JP OUTDATA
  608.  
  609. ;----FUNC1B----
  610. ; сброс на спек состояние тембров в текстовом виде
  611. TXT_TEMBR_STATUS
  612.                 LD A,(CHIP_TYPE)
  613.                 CP VS1001
  614.                 RET Z
  615.                 LD HL,VS10XX_READ << 8 + SCI_BASS;0x0302
  616.                 LD A,Com_mp3
  617.                 CALL COM__SD
  618.                 LD A,D
  619.                 EXX
  620.                 LD DE,BUF_TEXT
  621.                 AND 0x0F
  622.                 LD L,A
  623.                 LD H,0
  624.                 LD BC,10
  625.                 CALL SUB_BC
  626.                 LD A,'0'
  627.                 ADD A,L
  628.                 LD (DE),A                               ; положили частоту TREBLE
  629.                 INC DE
  630.                 EXX
  631.                 LD A,D
  632.                 EXX
  633.                 AND 0xF0
  634.                 RRCA
  635.                 RRCA
  636.                 RRCA
  637.                 RRCA
  638.                 LD L,A
  639.                 BIT 3,A
  640.                 LD A,'+'
  641.                 JR Z,.L2
  642.                 LD A,'-'
  643. .L2             LD (DE),A
  644.                 INC DE
  645.                 LD A,L
  646.                 AND 7
  647.                 ADD A,'0'
  648.                 LD (DE),A                               ; положили уровень TREBLE
  649.                 INC DE
  650.                 EXX
  651.                 LD A,E
  652.                 EXX
  653.                 AND 0x0F
  654.                 LD L,A
  655.                 LD BC,10
  656.                 CALL SUB_BC
  657.                 LD A,'0'
  658.                 ADD A,L
  659.                 LD (DE),A                               ; положили частоту BASS
  660.                 INC DE
  661.                 EXX
  662.                 LD A,E
  663.                 EXX
  664.                 AND 0xF0
  665.                 RRCA
  666.                 RRCA
  667.                 RRCA
  668.                 RRCA
  669.                 LD L,A
  670.                 LD BC,10
  671.                 CALL SUB_BC
  672.                 LD A,'0'
  673.                 ADD A,L
  674.                 LD (DE),A                               ; положили уровень BASS
  675.                 EXX
  676.                 LD E,8
  677.                 LD HL,BUF_TEXT
  678.                 LD A,'0'
  679.                 CP (HL)
  680.                 JR NZ,.L1
  681.                 LD (HL),0x20
  682. .L1             JP OUTDATA
  683.  
  684. SUB_BC          LD A,0xFF
  685.                 AND A
  686. .L1             INC A
  687.                 SBC HL,BC
  688.                 JR NC,.L1
  689.                 ADD HL,BC
  690.                 ADD A,'0'
  691.                 LD (DE),A
  692.                 INC DE
  693.                 RET
  694.  
  695. ;----FUNC15----
  696. ; сброс на спек количество найденных файлов
  697. TXT_COUNT_FILES LD HL,(COUNT_MP3)
  698.  
  699. ; перегоняем HL в TXT и сбрасываем
  700. GETDCHR         LD DE,BUF_TEXT
  701.                 PUSH DE
  702.                 LD BC,10000
  703.                 CALL SUB_BC
  704.                 LD BC,1000
  705.                 CALL SUB_BC
  706.                 LD BC,100
  707.                 CALL SUB_BC
  708.                 LD BC,10
  709.                 CALL SUB_BC
  710.                 LD A,'0'
  711.                 ADD A,L
  712.                 LD (DE),A
  713.                 POP HL
  714.                 PUSH HL
  715.                 LD BC,4 << 8 + ' '
  716. .L1             LD A,(HL)
  717.                 CP '0'
  718.                 JR NZ,GO_OUTD
  719.                 LD (HL),C
  720.                 INC HL
  721.                 DJNZ .L1
  722. GO_OUTD         POP HL
  723.                 LD E,5
  724.                 JR OUTDATA
  725.  
  726. ;----FUNC16----
  727. ; сброс на спек номера играемого файла + 1
  728. ; с перегонкой в текстовый вид
  729. TXT_CURRENT_FILE
  730.                 LD HL,(NUMFILE)
  731.                 INC HL
  732.                 JR GETDCHR
  733.  
  734. ;----FUNC12----
  735. ; отдать спеку 33 байта описателя файла
  736. GET_FILE_DESCR  CALL RDINBC
  737.                 BIT 7,B
  738.                 JR Z,.L1
  739.                 LD BC,(NUMFILE)
  740. .L1             LD A,Getfzap
  741.                 CALL COM_FAT
  742.                 CP 0x80
  743.                 JP Z,SD_LOST
  744.                 LD BC,0x20
  745.                 ADD HL,BC
  746.                 LD (HL),E
  747.                 SBC HL,BC
  748.                 LD E,0x21
  749.  
  750. ; отдаем байтики, счетчик байта в E
  751. OUTDATA         LD A,(HL)
  752.                 INC HL
  753.                 OUT (ZXDATWR),A
  754.                 CALL WDN
  755.                 DEC E
  756.                 JR NZ,OUTDATA
  757.                 RET
  758.  
  759. ;----FUNC0E----
  760. ; установка номера файла для играния
  761. ; если не превышает количество найденного - 1
  762. SET_NUM         CALL RDINBC
  763.                 LD HL,(COUNT_MP3)
  764.                 AND A
  765.                 SBC HL,BC
  766.                 RET C
  767.                 LD (NUMFILE),BC
  768.                 RET
  769.  
  770. ; читаем в BC
  771. RDINBC          CALL WDY
  772.                 IN A,(ZXDATRD)
  773.                 LD B,A
  774.                 CALL WDY
  775.                 IN A,(ZXDATRD)
  776.                 LD C,A
  777.                 RET
  778.  
  779. ;----FUNC13----
  780. ; отдать спеку количество найденного
  781. GET_COUNT_FILES LD HL,(COUNT_MP3)
  782.                 JR GET_RZN
  783.  
  784. ;----FUNC0D----
  785. ; отдать спеку номер текущего файла
  786. GET_CURRENT     LD HL,(NUMFILE)
  787.                 JR GET_RZN
  788.  
  789. ;----FUNC0C----
  790. ; в HL содержимое битов установок
  791. GET_VTS         LD HL,(GETVTSL)
  792.  
  793. ; сбрасываем содержимое HL на спек
  794. GET_RZN         LD A,H
  795.                 OUT (ZXDATWR),A
  796.                 CALL WDN
  797.                 LD A,L
  798.  
  799. ; сбросить на спек байт A
  800. GET_BYT         OUT (ZXDATWR),A
  801.  
  802. ; ждем пока спек заберет байт из порта
  803. WDN             LD B,0
  804. .L1             DEC B
  805.                 RET Z
  806.                 IN A,(ZXSTAT)
  807.                 RLA
  808.                 JR C,.L1
  809.                 RET
  810.  
  811. ; ждем пока спек даст байт в порт
  812. WDY             IN A,(ZXSTAT)
  813.                 RLA
  814.                 JR NC,WDY
  815.                 RET
  816.  
  817. ; играть на MP3-декодер 1 сектор
  818. PLAYMP3         LD A,(FLAGS)
  819.                 BIT B_PLAY_STOP,A
  820.                 RET Z
  821.                 LD A,(FILE_TYPE)
  822.                 CP FILE_MP3
  823.                 RET NZ
  824. ; только MP3
  825.                 LD A,Nextsec
  826.                 CALL COM_FAT
  827.                 LD H,A
  828.                 EX AF,AF'
  829.                 LD A,H
  830.                 CP 0x80
  831.                 JP Z,SD_LOST
  832.                 EX AF,AF'
  833.                 RET NZ                                  ; файло не кончилось, выходим
  834.                 LD A,Zer2mp3
  835.                 CALL COM__SD
  836.                 JP NEXT_TRACK                           ; файл кончился, завершаем нулями
  837.                                                         ; и переходим на следующий файл
  838.  
  839. ; открытие файла и инит декодера
  840. INIPLAY         PUSH BC
  841.                 CALL MOD_OFF
  842.                 CALL RESET_MP3                          ; сброс чипа в зависимости от установок
  843.                 LD HL,(GETVTSL)
  844.                 BIT B_TYPE_RESET,H                      ; если сброс =HARD, то обнуляем все
  845.                                                         ; кроме типа сброса этого чипа
  846.                 JR Z,.L1
  847.                 LD L,0
  848.                 LD A,H
  849.                 AND M_TYPE_RESET
  850.                 LD H,A
  851. .L1             SET B_NEW_FILE,H                        ; включаем бит 5, пошол новый файл
  852.                 POP BC
  853.                 PUSH BC
  854.                 PUSH HL
  855.                 LD A,Openfil
  856.                 CALL COM_FAT                            ; открываем новый файл
  857.                 CP 0x80
  858.                 JP Z,SD_LOST
  859.                 POP HL
  860.                 LD (GETVTSL),HL
  861.                 LD (FILE_TYPE),A
  862.                 CP FILE_MP3
  863.                 LD E,FREQ20                             ; 20 Мгц для играния MOD
  864.                 JR NZ,.L2
  865.                 LD E,FREQ12                             ; 12 Мгц для играния MP3
  866. .L2             LD A,Freqnc
  867.                 CALL COM__SD
  868.                 LD HL,FLAGS
  869.                 RES B_FILE_LOAD,(HL)
  870.                 LD HL,0x0400
  871.                 LD (TIMEOUT),HL
  872.                 POP BC
  873.                 LD HL,BUF_LNG
  874.                 LD A,Getlong
  875.                 CALL COM_FAT                            ; чтение в буфер длинного имени файла
  876. MOD_OFF         XOR A
  877.                 OUT (VOL1),A
  878.                 OUT (VOL2),A
  879.                 OUT (VOL3),A
  880.                 OUT (VOL4),A
  881.                 OUT (VOL5),A
  882.                 OUT (VOL6),A
  883.                 OUT (VOL7),A
  884.                 OUT (VOL8),A
  885.                 OUT (VOL8),A
  886.                 RET
  887.  
  888. SD_LOST         LD SP,ISTACK
  889.                 LD HL,FLAGS
  890.                 SET B_SD_LOST,(HL)
  891.                 CALL PAUSE
  892.                 JP CONTINUE_MOD
  893.  
  894. CMP_INT         PUSH AF
  895.                 LD A,R
  896.                 JP PE,CMP_INT1
  897.                 LD A,R
  898. CMP_INT1        LD A,0
  899.                 JP PO,CMP_INT2
  900.                 LD A,1
  901. CMP_INT2        LD (INT_MODE),A
  902.                 POP AF
  903.                 RET
  904.  
  905. COM__SD         include "sd_on_ngs.a80"                 ; драйвер SD карты
  906. COM_FAT         include "fat_on_ngs.a80"                ; драйвер FAT
  907.  
  908. SET7XOR         PUSH HL
  909.                 LD HL,0
  910.                 ADD HL,SP
  911.                 EXX
  912.                 LD A,0x10
  913.                 LD SP,0x7F00
  914.                 LD BC,0xA97E                            ; LD A,(HL):XOR C
  915.                 LD DE,0x2C77                            ; LD (HL),A:INC L
  916. SPEDI1
  917.         REPT 16
  918.                 PUSH DE
  919.                 PUSH BC
  920.         ENDM
  921.                 DEC A
  922.                 JP NZ,SPEDI1
  923.                 LD HL,SPEDI2
  924.                 LD DE,0x7F00
  925.                 LD BC,ESPEDI2 - SPEDI2
  926.                 LDIR
  927.                 EXX
  928.                 LD SP,HL
  929.                 POP HL
  930.                 LD A,L
  931.                 EXX
  932.                 LD L,A
  933.                 LD H,0
  934.                 LD BC,0x7B00
  935.                 ADD HL,HL
  936.                 ADD HL,HL
  937.                 ADD HL,BC
  938.                 LD (KUDAXOR),HL
  939.                 EXX
  940.                 LD A,(SIZE_PAGES_MOD)
  941.                 LD B,A
  942.                 LD C,0x80
  943.                 RET
  944.  
  945. SPEDI2          INC H
  946.                 JP NZ,0x7B00
  947.                 INC E
  948.                 LD A,(DE)
  949.                 LD H,0x80
  950.                 OUT (MPAG),A
  951.                 DEC B
  952.                 JP NZ,0x7B00
  953.                 LD A,(PAGE_PLAYER)
  954.                 OUT (MPAG),A
  955.                 JP END7XOR
  956. ESPEDI2
  957.  
  958. SPEDI3          LD A,(PAGE_PLAYER)
  959.                 OUT (MPAG),A
  960.                 CALL SET7XOR
  961.                 LD A,(DE)
  962.                 PUSH HL
  963.                 OUT (MPAG),A
  964.                 LD HL,(KUDAXOR)
  965.                 EX (SP),HL
  966.                 RET
  967.  
  968. END7XOR         EXX
  969.                 LD HL,0
  970.                 ADD HL,SP
  971.                 LD SP,0x8000
  972.                 LD DE,0x8080
  973.                 LD B,0x40
  974. E7X1
  975.         REPT 64
  976.                 PUSH DE
  977.         ENDM
  978.                 DJNZ E7X1
  979.                 LD SP,HL
  980.                 EXX
  981.                 JP ESPEED
  982.  
  983. PATCH           LD A,(NUMPG)
  984.                 OR %00111111
  985.                 LD (PAGE_PLAYER),A                      ; страница расположения плеера
  986.                 IN A,(GSCFG0)
  987.                 RES B_RAMRO,A
  988.                 SET B_EXPAG,A
  989.                 OUT (GSCFG0),A
  990.                 LD A,0x80
  991.                 OUT (MPAGEX),A
  992.                 LD HL,SPEDI3
  993.                 LD DE,ADDA80
  994.                 LD BC,END7XOR - SPEDI3
  995.                 LDIR
  996.                 LD HL,FXB01
  997.                 LD (HL),0xCD
  998.                 INC HL
  999.                 LD (HL),LOW (NXTMOD)
  1000.                 INC HL
  1001.                 LD (HL),HIGH (NXTMOD)
  1002.                 LD HL,0x11D6
  1003.                 LD (HL),0xCD
  1004.                 INC HL
  1005.                 LD (HL),LOW (NXTMODR)
  1006.                 INC HL
  1007.                 LD (HL),HIGH (NXTMODR)
  1008.                 INC HL
  1009.                 EX DE,HL
  1010.                 LD HL,0x11E3
  1011.                 AND A
  1012.                 SBC HL,DE
  1013.                 LD B,H
  1014.                 LD C,L
  1015.                 LD H,D
  1016.                 LD L,E
  1017.                 LD (HL),B
  1018.                 INC DE
  1019.                 LDIR                                    ; зачистка хвостов в ПЗУ
  1020.                 LD HL,TEKADR1
  1021.                 LD DE,EMPTY2
  1022.                 LD BC,P_END - LD_MOD
  1023.                 LDIR                                    ; перенос загрузчика и обработчика
  1024.                                                         ; окончания проигрываемого файла
  1025.                 LD HL,P_START
  1026.                 LD DE,EMPTY1
  1027.                 LD BC,P__END - P_00
  1028.                 LDIR                                    ; перенос управления MP3 плеером в ПЗУ
  1029.                 LD HL,(NUMPG)
  1030.                 LD H,0x40
  1031.                 DEC L
  1032.                 LD (HL),1
  1033.                 INC L
  1034.                 LD (HL),0                               ; отрубание последней страницы ОЗУ
  1035.                                                         ; от основного списка страниц
  1036.                 LD HL,NUMPG
  1037.                 DEC (HL)
  1038.                 LD HL,P_00
  1039.                 LD (0x0300 + (0x1F * 2)),HL             ; патч команды 1F
  1040.                 LD HL,COMMFF
  1041.                 LD (0x0300 + (0x2F * 2)),HL             ; патч команды FF
  1042.                 IN A,(GSCFG0)
  1043.                 SET B_RAMRO,A
  1044.                 RES B_EXPAG,A
  1045.                 OUT (GSCFG0),A
  1046.                 LD A,(PAGE_PLAYER)
  1047.                 OUT (MPAG),A
  1048.  
  1049. ; создание списка малых страниц для загрузчика файла в память
  1050. LISTPAG         LD HL,0x4000
  1051.                 LD DE,BUF_PAG
  1052. .L1             LD A,(HL)
  1053.                 ADD A,A
  1054.                 RRCA
  1055.                 LD (DE),A
  1056.                 RLCA
  1057.                 INC DE
  1058.                 INC A
  1059.                 RRCA
  1060.                 LD (DE),A
  1061.                 INC DE
  1062.                 INC HL
  1063.                 LD A,(HL)
  1064.                 DEC A
  1065.                 JR NZ,.L1
  1066.                 RET
  1067.  
  1068. TEKADR1
  1069.                 PHASE EMPTY2
  1070.  
  1071. ; грузилка файла в память NEOGS
  1072. LD_MOD          IN A,(GSCFG0)
  1073.                 AND %11001111
  1074.                 OUT (GSCFG0),A
  1075.                 LD HL,FLAGS
  1076.                 SET B_FILE_LOAD,(HL)
  1077.                 CALL MOD_OFF
  1078.                 LD A,Loadfil
  1079.                 CALL COM_FAT
  1080.                 CP 0x80
  1081.                 JP Z,SD_LOST
  1082.                 LD (SIZE_PAGES_MOD),A
  1083.                 LD A,(CPAGE)
  1084.                 OUT (MPAG),A
  1085.                 LD A,1
  1086.                 LD (CNTMOD),A
  1087.                 LD (CURMOD),A
  1088.                 CALL LDMOD
  1089.                 LD A,(MTSNGSZ)
  1090.                 LD (SIZE_PATTERN_MOD),A
  1091.                 LD BC,0x0100
  1092.                 CALL PLAYMOD
  1093.                 IN A,(GSCFG0)
  1094.                 OR %00010000
  1095.                 OUT (GSCFG0),A
  1096.                 RET
  1097.  
  1098. ESPEED          XOR A
  1099.                 LD (CPAGE),A
  1100.                 OUT (MPAG),A
  1101.                 RET
  1102.  
  1103. NXTMOD          LD HL,MTSNGPS
  1104.                 INC (HL)
  1105.                 CP (HL)
  1106.                 JP C,NXTMOD1
  1107.                 LD (MTSNGPS),A
  1108.                 RET
  1109.  
  1110. NXTMODR         LD A,(PAGE_PLAYER)
  1111.                 OUT (MPAG),A
  1112.                 CALL NEXT_TRACK
  1113.                 LD A,(FILE_TYPE)
  1114.                 CP FILE_MP3
  1115.                 JP NZ,LD_MOD
  1116.                 POP HL
  1117.                 JP OPROS
  1118.  
  1119. COMMFF          IN A,(ZXDATRD)
  1120.                 OUT (CLRCBIT),A
  1121.                 ADD A,LOW (FLAGS)
  1122.                 LD IYL,A
  1123.                 LD A,HIGH (FLAGS)
  1124.                 ADC A,0
  1125.                 LD IYH,A
  1126.                 LD A,(IY+0)
  1127.                 OUT (ZXDATWR),A
  1128.                 JP COMINT_
  1129. P_END
  1130.                 DEPHASE
  1131. P_START
  1132.                 PHASE EMPTY1
  1133.  
  1134. ; основной цикл общения со спеком
  1135. P_00            JP OPROS.L3
  1136.  
  1137. NXTMOD1         LD A,(PAGE_PLAYER)
  1138.                 OUT (MPAG),A
  1139.                 CALL NEXT_TRACK
  1140. ; продолжить играть MOD
  1141. CONTINUE_MOD    LD A,(FILE_TYPE)
  1142.                 CP FILE_MP3
  1143.                 JR Z,OPROS
  1144.                 LD A,(FLAGS)
  1145.                 BIT B_PLAY_STOP,A
  1146.                 JR Z,CONROM
  1147.                 BIT B_FILE_LOAD,A
  1148.                 CALL Z,LD_MOD
  1149. CONROM          LD A,(CPAGE)
  1150.                 OUT (MPAG),A
  1151.                 JP COMINT
  1152.  
  1153. OPROS           IN A,(ZXSTAT)
  1154.                 RRA
  1155.                 JR C,.L1
  1156.                 CALL PLAYMP3
  1157.                 JR OPROS
  1158.  
  1159. .L1             IN A,(ZXCMD)
  1160.                 CP 0x1F
  1161.                 JR NZ,CONROM
  1162. .L3             IN A,(ZXDATRD)
  1163.                 OUT (CLRCBIT),A
  1164.                 AND A
  1165.                 JR Z,.L2
  1166.                 LD H,A
  1167.                 LD A,(STATUS)
  1168.                 CP 0x78
  1169.                 JR NC,OPROS
  1170.                 LD A,H
  1171. .L2             CP LOW (END_TAB-TABFUNC) / 2 + 1
  1172.                 JR NC,OPROS
  1173.                 LD HL,CONTINUE_MOD
  1174.                 PUSH HL
  1175.                 ADD A,A
  1176.                 ADD A,LOW (TABFUNC)
  1177.                 LD L,A
  1178.                 LD A,HIGH (TABFUNC)
  1179.                 ADC A,0
  1180.                 LD H,A
  1181.                 LD A,(PAGE_PLAYER)
  1182.                 OUT (MPAG),A
  1183.                 LD A,(HL)
  1184.                 INC HL
  1185.                 LD H,(HL)
  1186.                 LD L,A
  1187.                 JP (HL)
  1188. P__END
  1189.                 DEPHASE
  1190.  
  1191.                 DUPL 0x100-LOW ($),0
  1192.  
  1193.  INIT_VAR $
  1194.  SETVAR BUF_LNG,                0x100                   ; буфер для перекод. длинного имени
  1195.  SETVAR BUFTDIR,                0x100                   ; буфер имени текущей DIR
  1196.  SETVAR BUF_PAG,                0x100                   ; таблица расширенных страниц
  1197.  SETVAR B512BAS,                0
  1198.