Subversion Repositories ngs

Rev

Rev 165 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1.  
  2. ; LAST UPDATE 17.05.2025 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 для NeoGS
  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,(VAR_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              ; 00 параметров не требует, на выходе A смотри выше первые 2 значения
  82.                 DW SD__OFF              ; 01 просто снятие выбора SD карты
  83.                 DW RDSINGL              ; 02 читать 1 сектор
  84.                 DW RDMULTI              ; 03 читать "A" секторов
  85.                 DW EMPTY                ; 04 писать 1 сектор
  86.                 DW EMPTY                ; 05 писать "A" секторов
  87.                 DW AVTODET              ; 06-автодетект
  88.                 DW FREQNC               ; 07-установка частоты
  89.                 DW HARDMP3              ; 08 инициализация MP3-декодера
  90.                 DW LDI_MP3              ; 09 гон с SD на MP3
  91.                 DW COM_MP3              ; 0A RD&WR в MP3-декодер
  92.                 DW SOFTMP3              ; 0B SOFT RESET MP3CHIP
  93.                 DW DAT2MP3              ; 0C гон с GSDAT2MP3
  94.                 DW ZER2MP3              ; 0D 2048 нулей на MP3
  95.  
  96. ZAW003          CALL SD__OFF
  97.                 LD A,1
  98. EMPTY           RET
  99.  
  100. SD_INIT         CALL CS_HIGH
  101.                 LD BC,SD_SEND
  102.                 LD DE,0x20FF
  103.                 OUT (C),E
  104.                 DEC D
  105.                 JR NZ,$-3
  106.                 LD BC,SD_RSTR
  107.                 XOR A
  108.                 EX AF,AF'
  109. ZAW001          LD HL,CMD00
  110.                 CALL OUTCOM
  111.                 CALL IN_OOUT
  112.                 EX AF,AF'
  113.                 DEC A
  114.                 JR Z,ZAW003
  115.                 EX AF,AF'
  116.                 DEC A
  117.                 JR NZ,ZAW001
  118.                 LD HL,CMD08
  119.                 CALL OUTCOM
  120.                 CALL IN_OOUT
  121.                 IN H,(C)
  122.                 NOP
  123.                 IN H,(C)
  124.                 NOP
  125.                 IN H,(C)
  126.                 NOP
  127.                 IN H,(C)
  128.                 LD HL,0
  129.                 BIT 2,A
  130.                 JR NZ,ZAW006
  131.                 LD H,0x40
  132. ZAW006          LD A,CMD_55
  133.                 CALL OUT_COM
  134.                 CALL IN_OOUT
  135.                 in (c) ;in f,(c)
  136.                 in (c) ;in f,(c)
  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.                 in (c) ;in f,(c)
  188.                 in (c) ;in f,(c)
  189.                 OUT (C),A
  190.                 XOR A
  191.                 OUT (C),A
  192.                 NOP
  193.                 OUT (C),A
  194.                 NOP
  195.                 OUT (C),A
  196.                 NOP
  197.                 OUT (C),A
  198.                 DEC A
  199.                 OUT (C),A
  200.                 POP BC
  201.                 RET
  202.  
  203. SECM200         PUSH HL
  204.                 PUSH DE
  205.                 PUSH BC
  206.                 PUSH AF
  207.                 PUSH BC
  208.                 LD A,CMD_58
  209.                 LD BC,SD_RSTR
  210.                 CALL OUT_COM
  211.                 CALL IN_OOUT
  212.                 INC A
  213.                 JR NZ,SCM200
  214.                 EXX
  215.                 LD A,0x80
  216.                 JP (HL)
  217.  
  218. SCM200          IN A,(C)
  219.                 NOP
  220.                 IN H,(C)
  221.                 NOP
  222.                 IN H,(C)
  223.                 NOP
  224.                 IN H,(C)
  225.                 BIT 6,A
  226.                 POP HL
  227.                 JR NZ,SECN200
  228.                 EX DE,HL
  229.                 ADD HL,HL
  230.                 EX DE,HL
  231.                 ADC HL,HL
  232.                 LD H,L
  233.                 LD L,D
  234.                 LD D,E
  235.                 LD E,0
  236. SECN200         POP AF
  237.                 in (c) ;in f,(c)
  238.                 in (c) ;in f,(c)
  239.                 LD BC,SD_SEND
  240.                 OUT (C),A
  241.                 NOP
  242.                 OUT (C),H
  243.                 NOP
  244.                 OUT (C),L
  245.                 NOP
  246.                 OUT (C),D
  247.                 NOP
  248.                 OUT (C),E
  249.                 LD A,0xFF
  250.                 OUT (C),A
  251.                 POP BC
  252.                 POP DE
  253.                 POP HL
  254.                 RET
  255.  
  256. IN_OOUT         PUSH DE
  257.                 LD DE,0x30FF
  258. IN_WAIT         IN A,(SD_RSTR)
  259.                 CP E
  260.                 JR NZ,IN_EXIT
  261.                 DEC D
  262.                 JR NZ,IN_WAIT
  263. IN_EXIT         POP DE
  264.                 RET
  265.  
  266. CMD00           DB 0x40,0x00,0x00,0x00,0x00,0x95        ; GO_IDLE_STATE
  267. CMD08           DB 0x48,0x00,0x00,0x01,0xAA,0x87        ; SEND_IF_COND
  268. CMD16           DB 0x50,0x00,0x00,0x02,0x00,0xFF        ; SET_BLOCKEN
  269.  
  270. ; чтение одного сектора в память
  271. RD_SECT         PUSH BC
  272.                 PUSH DE
  273.                 LD BC,SD_RSTR
  274.                 INIR
  275.                 INIR
  276.                 JR RON_MP3.L3
  277.  
  278. ; чтение одного сектора с побайтовой передачей в MP3 чип
  279. RON_MP3         PUSH BC
  280.                 PUSH DE
  281.                 LD BC,SD_RSTR
  282.                 LD D,0x10
  283. .L2             CALL DRQVS
  284.                 LD E,0x20
  285. .L1             IN A,(C)
  286.                 NOP
  287.                 OUT (MD_SEND),A
  288.                 DEC E
  289.                 JR NZ,.L1
  290.                 DEC D
  291.                 JR NZ,.L2
  292. .L3             IN A,(C)                        ; снятие CRC16
  293.                 NOP
  294.                 IN A,(C)
  295.                 POP DE
  296.                 POP BC
  297.                 RET
  298.  
  299. ; передача сектора в MP3 чип
  300. LDI_MP3         LD A,CMD_17
  301.                 CALL SECM200
  302. .L1             CALL IN_OOUT
  303.                 CP 0xFE
  304.                 JR NZ,.L1
  305.                 CALL RON_MP3
  306. .L2             CALL IN_OOUT
  307.                 INC A
  308.                 JR NZ,.L2
  309.                 JP CS_HIGH
  310.  
  311. ; загрузка одного сектора в память
  312. RDSINGL         LD A,CMD_17
  313.                 CALL SECM200
  314. .L1             CALL IN_OOUT
  315.                 CP 0xFE
  316.                 JR NZ,.L1
  317.                 CALL RD_SECT
  318. .L2             CALL IN_OOUT
  319.                 INC A
  320.                 JR NZ,.L2
  321.                 JP CS_HIGH
  322.  
  323. RDMULTI         EX AF,AF'
  324.                 LD A,CMD_18
  325.                 CALL SECM200
  326.                 EX AF,AF'
  327. .L1             EX AF,AF'
  328. .L3             CALL IN_OOUT
  329.                 CP 0xFE
  330.                 JR NZ,.L3
  331.                 CALL RD_SECT
  332.                 EX AF,AF'
  333.                 DEC A
  334.                 JR NZ,.L1
  335.                 LD A,CMD_12
  336.                 CALL OUT_COM
  337. .L2             CALL IN_OOUT
  338.                 INC A
  339.                 JR NZ,.L2
  340.                 JP CS_HIGH
  341.  
  342. ; ожидание готовности SPI MP3 чипа
  343. NOPER
  344.         REPT 18
  345.                 NOP
  346.         ENDM
  347.                 RET
  348.  
  349. AVTODET         IN A,(GSCFG0)
  350.                 AND %11001111
  351.                 OUT (GSCFG0),A
  352.                 LD D,A
  353.                 CALL NOPER
  354.                 IN A,(GSCFG0)
  355.                 CP D
  356.                 LD A,0
  357.                 RET Z
  358. NO_MP3          LD A,0xFF
  359.                 RET
  360.  
  361. FREQNC          LD A,E
  362.                 LD D,C_10MHZ                    ; 0x30
  363.                 AND 3
  364.                 JR Z,.L1
  365.                 LD D,C_12MHZ                    ; 0x10
  366.                 DEC A
  367.                 JR Z,.L1
  368.                 LD D,C_20MHZ                    ; 0x20
  369.                 DEC A
  370.                 JR Z,.L1
  371.                 LD D,C_24MHZ                    ; 0
  372. .L1             IN A,(GSCFG0)
  373.                 AND %11001111
  374.                 OR D
  375.                 OUT (GSCFG0),A
  376.                 RET
  377.  
  378. ; записываем 2048 нулей как завершение песенки
  379. ZER2MP3         LD D,0x40
  380. .L2             CALL DRQVS
  381.                 LD E,0x20
  382. .L1             XOR A
  383.                 OUT (MD_SEND),A
  384.                 DEC E
  385.                 JR NZ,.L1
  386.                 DEC D
  387.                 JR NZ,.L2
  388.                 RET
  389.  
  390. ; SS_VER is
  391. TABL_CLOCK      DW 0x8000 + (14000000 / 2000)   ; 0 for VS1001  (MA8201)        9B58
  392.                 DW 0x8000 + (14000000 / 2000)   ; 1 for VS1011  (MA8201A)       9B58
  393.                 DW 0    ; 2 for VS1002  ; не поддерживается, не проверялся
  394.                 DW SC_MULT4 | SC_ADD3 | 1500    ; 3 for VS1003
  395.                 DW SC_MULT4 | SC_ADD1 | 1500    ; 4 for VS1053 and VS8053       ; пока не доделан
  396.                 DW 0    ; 5 for VS1033  ; не поддерживается, не проверялся
  397.                 DW SC_MULT4 | SC_ADD1 | 1500    ; 6 for VS1063  ; пока не доделан
  398.                 DW 0    ; 7 for VS1103  ; не поддерживается, не проверялся
  399.  
  400. ; установка частоты MP3 чипа
  401. SET_CLOCKF      LD A,(VAR_CHIP_TYPE)
  402.                 ADD A,A
  403.                 ADD A,LOW (TABL_CLOCK)
  404.                 LD L,A
  405.                 ADC A,HIGH (TABL_CLOCK)
  406.                 SUB L
  407.                 LD H,A
  408.                 LD E,(HL)
  409.                 INC HL
  410.                 LD D,(HL)
  411.                 LD HL,VS10XX_WRITE << 8 + SCI_CLOCKF;0x0202
  412.                 JP COM_MP3                      ; установка частоты для декодера
  413.  
  414. ; ожидание готовности MP3 декодера
  415. DRQVS           IN A,(SSTAT)
  416.                 RRA
  417.                 JR NC,DRQVS                     ; дождались готовности декодера
  418.                 RET
  419.  
  420. ; полный сброс
  421. HARDMP3         CALL VOL_MOD                    ; заглушили громкость портов GS
  422.                 LD BC,MC_SEND
  423.                 LD A,%10011100                  ; 0x9C
  424.                 OUT (SCTRL),A
  425.                 LD E,0
  426.                 CALL FREQNC                     ; выставили частоту на NGS 10 МГц
  427.                 LD HL,VS10XX_READ << 8 + SCI_STATUS;0x0301
  428.                 CALL COM_MP3
  429.                 LD A,M_MPXRS
  430.                 OUT (SCTRL),A
  431.                 CALL NOPER
  432.                 LD A,M_MPXRS + M_SNCLR          ; 0x84
  433.                 OUT (SCTRL),A                   ; выдали сброс на декодер
  434.                 CALL DRQVS
  435.                 CALL SET_CLOCKF
  436.                 LD A,(VAR_CHIP_TYPE)
  437.                 CP VS1001
  438.                 LD HL,VS10XX_WRITE << 8 + SCI_BASS;0x0202
  439.                 LD DE,%1000000000001000         ; 0x8008
  440.                 CALL Z,COM_MP3                  ; для VS1001 запись недокументированного пинка в
  441.                                                 ; недокументированный регистр, если
  442.                                                 ; биты 7-4 регистра статуса в нуле
  443.                 LD E,1
  444.                 JP FREQNC                       ; выставили частоту на NGS 12 МГц
  445.  
  446. ; программный сброс MP3 декодера, рекомендуется вызывать перед каждым новым файлом, сбрасывает счетчик секунд
  447. ; после программного сброса все установленные режимы декодера не изменяются
  448. SOFTMP3         LD BC,MC_SEND
  449.                 LD HL,VS10XX_READ << 8 + SCI_VOL;0x030B
  450.                 CALL COM_MP3                    ; снимаем текущее значение громкости
  451.                 PUSH DE
  452.                 LD DE,0xFEFE                    ; и сохраняем его до лучших времен
  453.                 LD HL,VS10XX_WRITE << 8 + SCI_VOL;0x020B
  454.                 CALL COM_MP3                    ; уменьшаем громкость до минимума
  455.                 LD HL,VS10XX_READ << 8 + SCI_STATUS;0x0301
  456.                 CALL COM_MP3
  457.                 LD A,E
  458.                 AND SCISTATUS.M_SS_VER
  459.                 PUSH AF
  460.                 LD HL,VS10XX_READ << 8 + SCI_MODE;0x0300
  461.                 CALL COM_MP3                    ; читаем состояние MODE
  462.                 LD A,SCIMODE.M_SM_RESET
  463.                 XOR E
  464.                 LD E,A
  465.                 LD HL,VS10XX_WRITE << 8 + SCI_MODE;0x0200
  466.                 CALL COM_MP3
  467.                 LD A,SCIMODE.M_SM_RESET
  468.                 XOR E
  469.                 LD E,A
  470.                 LD A,(VAR_CHIP_TYPE)
  471.                 CP VS1001
  472.                 JR Z,.L1
  473.                 RES SCIMODE.B_SM_SDINEW,D       ; отмена SPI modes
  474. .L1             LD HL,VS10XX_WRITE << 8 + SCI_MODE;0x0200
  475.                 CALL COM_MP3                    ;даем команду софт-сброса
  476.                 CALL DRQVS
  477.                 CALL SET_CLOCKF
  478.                 POP AF
  479.                 LD HL,VS10XX_WRITE << 8 + SCI_BASS;0x0202
  480.                 LD DE,%1000000000001000         ; 0x8008
  481.                 CALL Z,COM_MP3                  ; недокументированный пинок MP3 декодера (у VS1001 INT_FCTLH)
  482.                 POP DE
  483.                 LD HL,VS10XX_WRITE << 8 + SCI_VOL;0x020B
  484.                 JR COM_MP3                      ; восстанавливаем громкость до сброса
  485.  
  486. ; глушим громкость MOD портов
  487. VOL_MOD         XOR A
  488.                 OUT (VOL1),A
  489.                 OUT (VOL2),A
  490.                 OUT (VOL3),A
  491.                 OUT (VOL4),A
  492.                 OUT (VOL5),A
  493.                 OUT (VOL6),A
  494.                 OUT (VOL7),A
  495.                 OUT (VOL8),A
  496.                 RET
  497.  
  498. ; процедура чтения/записи адресов MP3 декодера
  499. ; H - команда декодеру 3-READ или 2-WRITE
  500. ; L - адрес в декодере
  501. ; D - старший байт
  502. ; E - младший байт
  503. ; DE по записи подать на вход
  504. ;    по чтению получить на выходе
  505. COM_MP3         CALL DRQVS
  506.                 LD A,M_MCNCS
  507.                 OUT (SCTRL),A                   ; выбираем декодер и объясняем ему, что от него требуется
  508.                 CALL NOPER
  509.                 LD BC,MC_SEND
  510.                 LD A,H
  511.                 OUT (C),H
  512.                 CALL NOPER
  513.                 OUT (C),L
  514.                 CALL NOPER
  515.                 CP VS10XX_READ
  516.                 JR Z,MP3READ                    ; переходим на чтение (смотри выше)
  517.                 OUT (C),D
  518.                 CALL NOPER
  519.                 OUT (C),E                       ; записали в адрес декодера
  520. MP3_END         CALL NOPER
  521.                 LD A,M_MCNCS + M_SNCLR          ; 0x82 снимаем выбор декодера
  522.                 OUT (SCTRL),A
  523.                 RET
  524.  
  525. ; читаем что затребовали
  526. MP3READ         LD BC,MC_READ
  527.                 LD A,0xFF
  528.                 OUT (MC_SEND),A
  529.                 CALL NOPER
  530.                 IN D,(C)
  531.                 CALL NOPER
  532.                 OUT (MC_SEND),A
  533.                 CALL NOPER
  534.                 IN E,(C)
  535.                 JR MP3_END
  536.  
  537. ; процедура пересылки байтов со спека через порты ГС на MP3 декодер
  538. ; пересылается 512 байт
  539. DAT2MP3         LD D,0x10               ; перегнать на декодер 16 порций
  540. .L1             CALL DRQVS
  541.                 LD B,0x20               ; одна порция 32 байта
  542. .L2             IN A,(ZXSTAT)
  543.                 RLA
  544.                 JR NC,.L2               ; дождались подачи от спека
  545.                 IN A,(ZXDATRD)          ; забрали байт
  546.                 OUT (MD_SEND),A         ; отдали декодеру
  547.                 NOP                     ; выдержали паузу по тактам
  548.                 DJNZ .L2                ; порция кончилась
  549.                 DEC D
  550.                 JR NZ,.L1
  551.                 RET                     ; 512 байт передано!!!
  552.