Subversion Repositories ngs

Rev

Rev 112 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1.  
  2. ; LAST UPDATE 27.08.2021 savelij
  3.  
  4. ; SD & MP3 функции по номерам
  5.  INIT_VAR
  6.  SETVAR Sd_init         ; инит SD карты
  7.  SETVAR Sd__off         ; снятие выбора
  8.  SETVAR Rdsingl         ; читать 1 сектор
  9.  SETVAR Rdmulti         ; читать "A" сектор
  10.  SETVAR Wrsingl         ; записать 1 сектор - нету
  11.  SETVAR Wrmulti         ; записать "A" секторов - нету
  12.  SETVAR Avtodet         ; автодетект GS/NeoGS
  13.  SETVAR Freqnc          ; установка частоты
  14.  SETVAR Hardmp3         ; полный инит MP3 чипа
  15.  SETVAR Ldi_mp3         ; передача сектора с SD -> MP3
  16.  SETVAR Com_mp3         ; RD/WR MP3 чипа
  17.  SETVAR Softmp3         ; soft инит MP3 чипа
  18.  SETVAR Dat2mp3         ; передача сек. GSDAT -> MP3
  19.  SETVAR Zer2mp3         ; передача 2048 нулей -> MP3
  20.  
  21. ; ДРАЙВЕР SD-CARD ДЛЯ NGS
  22. ; +ДРАЙВЕР ДЛЯ MP3-ДЕКОДЕРА
  23.  
  24. ; Входные параметры общие:
  25. ; HL-адрес загрузки в память
  26. ; BCDE-32-х битный номер сектора
  27. ; A-количество блоков (блок=512 байт)
  28. ; только для многоблочной записи/чтении
  29.  
  30. ; Ошибки выдаваемые на выходе:
  31. ; A=0-инициализация прошла успешно
  32. ; A=1-карта не найдена или не ответила
  33. ; A=2-карта защищена от записи
  34. ; A=3-попытка записи в сектор 0 карты
  35. ; A=0x80-карта перестала отвечать
  36.  
  37. ; общая точка входа для работы с SD картой
  38.                 CALL CMP_INT
  39.                 DI
  40.                 EXX
  41.                 PUSH HL                 ;СОХРАНИЛИ HL'
  42.                 PUSH DE                 ;СОХРАНИЛИ DE'
  43.                 LD HL,OK_SD
  44.                 PUSH HL                 ;ВОЗВРАТ НА ВСЕ OK
  45.                 LD HL,0
  46.                 ADD HL,SP               ;СОХРАНИЛИ СТЕК
  47.                 EX DE,HL
  48.                 LD HL,ERR_SD            ;АДРЕС ПЕРЕХОДА ПРИ ОШИБКЕ
  49.                 EXX
  50.                 PUSH HL
  51.                 PUSH DE
  52.                 ADD A,A
  53.                 LD L,A
  54.                 LD H,0
  55.                 LD DE,TABL_SD
  56.                 ADD HL,DE
  57.                 EX AF,AF'
  58.                 LD E,(HL)
  59.                 INC HL
  60.                 LD D,(HL)
  61.                 EX DE,HL
  62.                 POP DE
  63.                 EX (SP),HL
  64.                 RET
  65.  
  66. OK_SD           EXX
  67. ERR_SD          EX DE,HL
  68.                 LD SP,HL
  69.                 POP DE
  70.                 POP DE
  71.                 POP HL
  72.                 EXX
  73.                 PUSH AF
  74.                 LD A,(INT_MODE)
  75.                 AND A
  76.                 JR Z,ERR_SD1
  77.                 EI
  78. ERR_SD1         POP AF
  79.                 RET
  80.  
  81. TABL_SD         DW SD_INIT              ;0 параметров не требует, на выходе A смотри выше первые 2 значения
  82.                 DW SD__OFF              ;1 просто снятие выбора SD карты
  83.                 DW RDSINGL              ;2 ЧИТАТЬ 1 СЕКТОР
  84.                 DW RDMULTI              ;3 ЧИТАТЬ "A" СЕКТОРОВ
  85.                 DW EMPTY                ;4 ПИСАТЬ 1 СЕКТОР
  86.                 DW EMPTY                ;5 ПИСАТЬ "A" СЕКТОРОВ
  87.                 DW AVTODET              ;6-АВТОДЕТЕКТ
  88.                 DW FREQNC               ;7-ЗАДАЧА ЧАСТОТЫ
  89.                 DW HARDMP3              ;8 INIT MP3-ДЕКОДЕРА
  90.                 DW LDI_MP3              ;9 ГОН С SD НА MP3
  91.                 DW COM_MP3              ;0XA RD&WR В MP3-ДЕКОД
  92.                 DW SOFTMP3              ;0XB SOFT RESET MP3CHIP
  93.                 DW DAT2MP3              ;0XC ГОН С GSDAT2MP3
  94.                 DW ZER2MP3              ;0XD 2048 НУЛЕЙ НА MP3
  95.  
  96. EMPTY           RET
  97.  
  98. ZAW003          CALL SD__OFF
  99.                 LD A,1
  100.                 RET
  101.  
  102. SD_INIT         CALL CS_HIGH
  103.                 LD BC,SD_SEND
  104.                 LD DE,0X20FF
  105.                 OUT (C),E
  106.                 DEC D
  107.                 JR NZ,$-3
  108.                 LD BC,SD_RSTR
  109.                 XOR A
  110.                 EX AF,AF'
  111. ZAW001          LD HL,CMD00
  112.                 CALL OUTCOM
  113.                 CALL IN_OOUT
  114.                 EX AF,AF'
  115.                 DEC A
  116.                 JR Z,ZAW003
  117.                 EX AF,AF'
  118.                 DEC A
  119.                 JR NZ,ZAW001
  120.                 LD HL,CMD08
  121.                 CALL OUTCOM
  122.                 CALL IN_OOUT
  123.                 IN H,(C)
  124.                 NOP
  125.                 IN H,(C)
  126.                 NOP
  127.                 IN H,(C)
  128.                 NOP
  129.                 IN H,(C)
  130.                 LD HL,0
  131.                 BIT 2,A
  132.                 JR NZ,ZAW006
  133.                 LD H,0X40
  134. ZAW006          LD A,CMD_55
  135.                 CALL OUT_COM
  136.                 CALL IN_OOUT
  137.                 LD BC,SD_SEND
  138.                 LD A,ACMD_41
  139.                 OUT (C),A
  140.                 NOP
  141.                 OUT (C),H
  142.                 NOP
  143.                 OUT (C),L
  144.                 NOP
  145.                 OUT (C),L
  146.                 NOP
  147.                 OUT (C),L
  148.                 LD A,0XFF
  149.                 OUT (C),A
  150.                 CALL IN_OOUT
  151.                 AND A
  152.                 JR NZ,ZAW006
  153. ZAW004          LD A,CMD_59
  154.                 CALL OUT_COM
  155.                 CALL IN_OOUT
  156.                 AND A
  157.                 JR NZ,ZAW004
  158. ZAW005          LD HL,CMD16
  159.                 CALL OUTCOM
  160.                 CALL IN_OOUT
  161.                 AND A
  162.                 JR NZ,ZAW005
  163.  
  164. SD__OFF
  165. CS_HIGH         PUSH AF
  166.                 LD A,M_SDNCS+M_SNCLR            ;0X81
  167.                 OUT (SCTRL),A
  168.                 POP AF
  169.                 RET
  170.  
  171. CS__LOW         PUSH AF
  172.                 LD A,M_SDNCS                    ;1
  173.                 OUT (SCTRL),A
  174.                 POP AF
  175.                 RET
  176.  
  177. OUTCOM          CALL CS__LOW
  178.                 PUSH BC
  179.                 LD BC,0X0600+SD_SEND
  180.                 OTIR
  181.                 POP BC
  182.                 RET
  183.  
  184. OUT_COM         PUSH BC
  185.                 CALL CS__LOW
  186.                 LD BC,SD_SEND
  187.                 OUT (C),A
  188.                 XOR A
  189.                 OUT (C),A
  190.                 NOP
  191.                 OUT (C),A
  192.                 NOP
  193.                 OUT (C),A
  194.                 NOP
  195.                 OUT (C),A
  196.                 DEC A
  197.                 OUT (C),A
  198.                 POP BC
  199.                 RET
  200.  
  201. SECM200         PUSH HL
  202.                 PUSH DE
  203.                 PUSH BC
  204.                 PUSH AF
  205.                 PUSH BC
  206.                 LD A,CMD_58
  207.                 LD BC,SD_RSTR
  208.                 CALL OUT_COM
  209.                 CALL IN_OOUT
  210.                 INC A
  211.                 JR NZ,SCM200
  212.                 EXX
  213.                 LD A,0X80
  214.                 JP (HL)
  215.  
  216. SCM200          IN A,(C)
  217.                 NOP
  218.                 IN H,(C)
  219.                 NOP
  220.                 IN H,(C)
  221.                 NOP
  222.                 IN H,(C)
  223.                 BIT 6,A
  224.                 POP HL
  225.                 JR NZ,SECN200
  226.                 EX DE,HL
  227.                 ADD HL,HL
  228.                 EX DE,HL
  229.                 ADC HL,HL
  230.                 LD H,L
  231.                 LD L,D
  232.                 LD D,E
  233.                 LD E,0
  234. SECN200         POP AF
  235.                 LD BC,SD_SEND
  236.                 OUT (C),A
  237.                 NOP
  238.                 OUT (C),H
  239.                 NOP
  240.                 OUT (C),L
  241.                 NOP
  242.                 OUT (C),D
  243.                 NOP
  244.                 OUT (C),E
  245.                 LD A,0XFF
  246.                 OUT (C),A
  247.                 POP BC
  248.                 POP DE
  249.                 POP HL
  250.                 RET
  251.  
  252. IN_OOUT         PUSH DE
  253.                 LD DE,0X20FF
  254. IN_WAIT         IN A,(SD_RSTR)
  255.                 CP E
  256.                 JR NZ,IN_EXIT
  257.                 DEC D
  258.                 JR NZ,IN_WAIT
  259. IN_EXIT         POP DE
  260.                 RET
  261.  
  262. CMD00           DB 0X40,0X00,0X00,0X00,0X00,0X95        ;GO_IDLE_STATE
  263. CMD08           DB 0X48,0X00,0X00,0X01,0XAA,0X87        ;SEND_IF_COND
  264. CMD16           DB 0X50,0X00,0X00,0X02,0X00,0XFF        ;SET_BLOCKEN
  265.  
  266. ;ЧТЕНИЕ ОДНОГО СЕКТОРА В ПАМЯТЬ
  267. RD_SECT         PUSH BC
  268.                 PUSH DE
  269.                 LD BC,SD_RSTR
  270.                 INIR
  271.                 INIR
  272.                 JR RDSECT3
  273.  
  274. ;ЧТЕНИЕ ОДНОГО СЕКТОРА С ПОБАЙТОВОЙ ПЕРЕДАЧЕЙ В MP3 ЧИП
  275. RON_MP3         PUSH BC
  276.                 PUSH DE
  277.                 LD BC,SD_RSTR
  278.                 LD D,0X10
  279. RDSECT2         IN A,(SSTAT)
  280.                 RRA
  281.                 JR NC,$-3
  282.                 LD E,0X20
  283. RDSECT1         IN A,(C)
  284.                 NOP
  285.                 OUT (MD_SEND),A
  286.                 DEC E
  287.                 JR NZ,RDSECT1
  288.                 DEC D
  289.                 JR NZ,RDSECT2
  290. RDSECT3         IN A,(C)                        ;СНЯТИЕ CRC16
  291.                 NOP
  292.                 IN A,(C)
  293.                 POP DE
  294.                 POP BC
  295.                 RET
  296.  
  297. ;ПЕРЕДАЧА СЕКТОРА В MP3 ЧИП
  298. LDI_MP3         LD A,CMD_17
  299.                 CALL SECM200
  300.                 CALL IN_OOUT
  301.                 CP 0XFE
  302.                 JR NZ,$-5
  303.                 CALL RON_MP3
  304.                 CALL IN_OOUT
  305.                 INC A
  306.                 JR NZ,$-4
  307.                 JP CS_HIGH
  308.  
  309. ;ЗАГРУЗКА ОДНОГО СЕКТОРА В ПАМЯТЬ
  310. RDSINGL         LD A,CMD_17
  311.                 CALL SECM200
  312.                 CALL IN_OOUT
  313.                 CP 0XFE
  314.                 JR NZ,$-5
  315.                 CALL RD_SECT
  316.                 CALL IN_OOUT
  317.                 INC A
  318.                 JR NZ,$-4
  319.                 JP CS_HIGH
  320.  
  321. RDMULTI         EX AF,AF'
  322.                 LD A,CMD_18
  323.                 CALL SECM200
  324.                 EX AF,AF'
  325. RDMULT1         EX AF,AF'
  326.                 CALL IN_OOUT
  327.                 CP 0XFE
  328.                 JR NZ,$-5
  329.                 CALL RD_SECT
  330.                 EX AF,AF'
  331.                 DEC A
  332.                 JR NZ,RDMULT1
  333.                 LD A,CMD_12
  334.                 CALL OUT_COM
  335.                 CALL IN_OOUT
  336.                 INC A
  337.                 JR NZ,$-4
  338.                 JP CS_HIGH
  339.  
  340. ;ОЖИДАНИЕ ГОТОВНОСТИ SPI MP3 ЧИПА
  341. NOPER           REPT 18
  342.                 NOP
  343.                 ENDM
  344.                 RET
  345.  
  346. ;               PUSH AF
  347. ;NOPER1         IN A,(SSTAT)
  348. ;               AND M_MCRDY
  349. ;               JR Z,NOPER1
  350. ;               POP AF
  351. ;               RET
  352.  
  353. AVTODET         IN A,(GSCFG0)
  354.                 AND 0XCF
  355.                 OUT (GSCFG0),A
  356.                 LD D,A
  357.                 CALL NOPER
  358.                 IN A,(GSCFG0)
  359.                 CP D
  360.                 LD A,0
  361.                 RET Z
  362. NO_MP3          LD A,0XFF
  363.                 RET
  364.  
  365. FREQNC          LD A,E
  366.                 LD D,C_10MHZ                    ;0X30
  367.                 AND 3
  368.                 JR Z,FREQNCS
  369.                 LD D,C_12MHZ                    ;0X10
  370.                 DEC A
  371.                 JR Z,FREQNCS
  372.                 LD D,C_20MHZ                    ;0X20
  373.                 DEC A
  374.                 JR Z,FREQNCS
  375.                 LD D,C_24MHZ                    ;0
  376. FREQNCS         IN A,(GSCFG0)
  377.                 AND %11001111
  378.                 OR D
  379.                 OUT (GSCFG0),A
  380.                 RET
  381.  
  382. ;ЗАПИСЫВАЕМ 2048 НУЛЕЙ КАК ЗАВЕРШЕНИЕ ПЕСЕНКИ
  383. ZER2MP3         LD D,0X40
  384. ZR2MP31         IN A,(SSTAT)
  385.                 RRA
  386.                 JR NC,$-3
  387.                 LD E,0X20
  388.                 XOR A
  389.                 OUT (MD_SEND),A
  390.                 DEC E
  391.                 JR NZ,$-4
  392.                 DEC D
  393.                 JR NZ,ZR2MP31
  394.                 RET
  395.  
  396. ;ПОЛНЫЙ СБРОС
  397. HARDMP3         XOR A
  398.                 CALL VOL_MOD                    ;ЗАГЛУШИЛИ ГРОМКОСТЬ ПОРТОВ GS
  399.                 LD BC,MC_SEND
  400.                 LD A,%10011100                  ;0X9C
  401.                 OUT (SCTRL),A
  402.                 LD E,0
  403.                 CALL FREQNC                     ;ВЫСТАВИЛИ ЧАСТОТУ НА NGS 10 МГц
  404.                 LD HL,0X0301
  405.                 CALL COM_MP3
  406.                 LD A,E
  407.                 AND %01110000
  408.                 PUSH AF
  409.                 LD A,M_MPXRS
  410.                 OUT (SCTRL),A
  411.                 CALL NOPER
  412.                 LD A,M_MPXRS+M_SNCLR            ;0X84
  413.                 OUT (SCTRL),A                   ;ВЫДАЛИ СБРОС НА ДЕКОДЕР
  414.                 IN A,(SSTAT)
  415.                 RRA
  416.                 JR NC,$-3                       ;ДОЖДАЛИСЬ ГОТОВНОСТИ ДЕКОДЕРА
  417.                 LD HL,0X0203
  418.                 LD DE,0X9B58
  419.                 CALL COM_MP3                    ;ВЫСТАВИЛИ НА ДЕКОДЕРЕ ЧАСТОТУ 14 МГц
  420.                 POP AF                          ;ЗДЕСЬ ПОШЛА ИНИЦИАЛИЗАЦИЯ ДЛЯ VS1001
  421.                 LD HL,0X0202
  422.                 LD DE,0X8008
  423.                 CALL Z,COM_MP3                  ;ЗАПИСЬ НЕДОКУМЕНТИРОВАННОГО ПИНКА В
  424.                                                 ;НЕДОКУМЕНТИРОВАННЫЙ РЕГИСТР, ЕСЛИ
  425.                                                 ;БИТЫ 6-4 РЕГИСТРА СТАТУСА В НУЛЕ
  426.                 LD E,1
  427.                 JP FREQNC                       ;ВЫСТАВИЛИ ЧАСТОТУ НА NGS 12 МГц
  428.  
  429. ;ПРОГРАММНЫЙ СБРОС MP3 ДЕКОДЕРА, РЕКОМЕНДУЕТСЯ ВЫЗЫВАТЬ ПЕРЕД КАЖДЫМ НОВЫМ ФАЙЛОМ, СБРАСЫВАЕТ СЧЕТЧИК СЕКУНД
  430. ;ПОСЛЕ ПРОГРАММНОГО СБРОСА ВСЕ УСТАНОВЛЕННЫЕ РЕЖИМЫ ДЕКОДЕРА НЕ ИЗМЕНЯЮТСЯ
  431. SOFTMP3         LD BC,MC_SEND
  432.                 LD HL,0X030B
  433.                 CALL COM_MP3                    ;СНИМАЕМ ТЕКУЩЕЕ ЗНАЧЕНИЕ ГРОМКОСТИ
  434.                 PUSH DE
  435.                 LD DE,0XFEFE                    ;И СОХРАНЯЕМ ЕГО ДО ЛУЧШИХ ВРЕМЕН
  436.                 LD HL,0X020B
  437.                 CALL COM_MP3                    ;УМЕНЬШАЕМ ГРОМКОСТЬ ДО МИНИМУМА
  438.                 LD HL,0X0301
  439.                 CALL COM_MP3
  440.                 LD A,E
  441.                 AND %01110000
  442.                 PUSH AF
  443.                 LD HL,0X0300
  444.                 CALL COM_MP3                    ;ЧИТАЕМ СОСТОЯНИЕ MODE
  445.                 LD A,4
  446.                 XOR E
  447.                 LD E,A
  448.                 LD HL,0X0200
  449.                 CALL COM_MP3
  450.                 LD A,4
  451.                 XOR E
  452.                 LD E,A
  453.                 LD HL,0X0200
  454.                 CALL COM_MP3                    ;ДАЕМ КОМАНДУ СОФТ-СБРОСА
  455.                 IN A,(SSTAT)
  456.                 RRA
  457.                 JR NC,$-3                       ;ЖДЕМ ОСВОБОЖДЕНИЯ ДЕКОДЕРА
  458.                 LD HL,0X0203
  459.                 LD DE,0X9B58
  460.                 CALL COM_MP3                    ;ВЫСТАВЛЯЕМ ЧАСТОТУ ПОСЛЕ ИНИЦИАЛИЗАЦИИ MP3 ДЕКОДЕРА
  461.                 POP AF
  462.                 LD HL,0X0202
  463.                 LD DE,0X8008
  464.                 CALL Z,COM_MP3                  ;НЕДОКУМЕНТИРОВАННЫЙ ПИНОК MP3 ДЕКОДЕРА
  465.                 POP DE
  466.                 LD HL,0X020B
  467.                 JR COM_MP3                      ;ВОССТАНАВЛИВАЕМ ГРОМКОСТЬ ДО СБРОСА
  468.  
  469. ; глушим громкость MOD портов
  470. VOL_MOD         OUT (VOL1),A
  471.                 OUT (VOL2),A
  472.                 OUT (VOL3),A
  473.                 OUT (VOL4),A
  474.                 OUT (VOL5),A
  475.                 OUT (VOL6),A
  476.                 OUT (VOL7),A
  477.                 OUT (VOL8),A
  478.                 RET
  479.  
  480. ; процедура чтения/записи адресов MP3 декодера
  481. ; H - команда декодеру 3-READ или 2-WRITE
  482. ; L - адрес в декодере
  483. ; D - старший байт
  484. ; E - младший байт
  485. ; DE по записи подать на вход
  486. ;    по чтению получить на выходе
  487. COM_MP3         IN A,(SSTAT)
  488.                 RRA
  489.                 JR NC,COM_MP3                   ; декодер свободен
  490.                 LD A,M_MCNCS
  491.                 OUT (SCTRL),A                   ; выбираем декодер и объясняем ему, что от него требуется
  492.                 CALL NOPER
  493.                 LD BC,MC_SEND
  494.                 LD A,H
  495.                 OUT (C),H
  496.                 CALL NOPER
  497.                 OUT (C),L
  498.                 CALL NOPER
  499.                 CP 3
  500.                 JR Z,MP3READ                    ; переходим на чтение (смотри выше)
  501.                 OUT (C),D
  502.                 CALL NOPER
  503.                 OUT (C),E                       ; записали в адрес декодера
  504. MP3_END         CALL NOPER
  505.                 LD A,M_MCNCS + M_SNCLR          ; 0x82 снимаем выбор декодера
  506.                 OUT (SCTRL),A
  507.                 RET
  508.  
  509. ; читаем что затребовали
  510. MP3READ         LD BC,MC_READ
  511.                 LD A,0XFF
  512.                 OUT (MC_SEND),A
  513.                 CALL NOPER
  514.                 IN D,(C)
  515.                 CALL NOPER
  516.                 OUT (MC_SEND),A
  517.                 CALL NOPER
  518.                 IN E,(C)
  519.                 JR MP3_END
  520.  
  521. ; процедура пересылки байтов со спека через порты ГС на MP3 декодер
  522. ; пересылается 512 байт
  523. DAT2MP3         LD D,0X10               ; перегнать на декодер 16 порций
  524. .L1             IN A,(SSTAT)
  525.                 RRA
  526.                 JR NC,.L1               ; декодер свободен?
  527.                 LD B,0X20               ; одна порция 32 байта
  528. .L2             IN A,(ZXSTAT)
  529.                 RLA
  530.                 JR NC,.L2               ; дождались подачи от спека
  531.                 IN A,(ZXDATRD)          ; забрали байт
  532.                 OUT (MD_SEND),A         ; отдали декодеру
  533.                 NOP                     ; выдержали паузу по тактам
  534.                 DJNZ .L2                ; порция кончилась
  535.                 DEC D
  536.                 JR NZ,.L1
  537.                 RET                     ; 512 байт передано!!!
  538.