Subversion Repositories ngs

Rev

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

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