Subversion Repositories ngs

Rev

Blame | Last modification | View Log | Download | RSS feed | ?url?

  1.  
  2. ; LAST UPDATE 16.01.2024 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,(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             IN A,(SSTAT)
  284.                 RRA
  285.                 JR NC,.L2
  286.                 LD E,0x20
  287. .L1             IN A,(C)
  288.                 NOP
  289.                 OUT (MD_SEND),A
  290.                 DEC E
  291.                 JR NZ,.L1
  292.                 DEC D
  293.                 JR NZ,.L2
  294. .L3             IN A,(C)                        ; снятие CRC16
  295.                 NOP
  296.                 IN A,(C)
  297.                 POP DE
  298.                 POP BC
  299.                 RET
  300.  
  301. ; передача сектора в MP3 чип
  302. LDI_MP3         LD A,CMD_17
  303.                 CALL SECM200
  304. .L1             CALL IN_OOUT
  305.                 CP 0xFE
  306.                 JR NZ,.L1
  307.                 CALL RON_MP3
  308. .L2             CALL IN_OOUT
  309.                 INC A
  310.                 JR NZ,.L2
  311.                 JP CS_HIGH
  312.  
  313. ; загрузка одного сектора в память
  314. RDSINGL         LD A,CMD_17
  315.                 CALL SECM200
  316. .L1             CALL IN_OOUT
  317.                 CP 0xFE
  318.                 JR NZ,.L1
  319.                 CALL RD_SECT
  320. .L2             CALL IN_OOUT
  321.                 INC A
  322.                 JR NZ,.L2
  323.                 JP CS_HIGH
  324.  
  325. RDMULTI         EX AF,AF'
  326.                 LD A,CMD_18
  327.                 CALL SECM200
  328.                 EX AF,AF'
  329. .L1             EX AF,AF'
  330. .L3             CALL IN_OOUT
  331.                 CP 0xFE
  332.                 JR NZ,.L3
  333.                 CALL RD_SECT
  334.                 EX AF,AF'
  335.                 DEC A
  336.                 JR NZ,.L1
  337.                 LD A,CMD_12
  338.                 CALL OUT_COM
  339. .L2             CALL IN_OOUT
  340.                 INC A
  341.                 JR NZ,.L2
  342.                 JP CS_HIGH
  343.  
  344. ; ожидание готовности SPI MP3 чипа
  345. NOPER
  346.         REPT 18
  347.                 NOP
  348.         ENDM
  349.                 RET
  350.  
  351. AVTODET         IN A,(GSCFG0)
  352.                 AND %11001111;0xCF
  353.                 OUT (GSCFG0),A
  354.                 LD D,A
  355.                 CALL NOPER
  356.                 IN A,(GSCFG0)
  357.                 CP D
  358.                 LD A,0
  359.                 RET Z
  360. NO_MP3          LD A,0xFF
  361.                 RET
  362.  
  363. FREQNC          LD A,E
  364.                 LD D,C_10MHZ                    ; 0x30
  365.                 AND 3
  366.                 JR Z,.L1
  367.                 LD D,C_12MHZ                    ; 0x10
  368.                 DEC A
  369.                 JR Z,.L1
  370.                 LD D,C_20MHZ                    ; 0x20
  371.                 DEC A
  372.                 JR Z,.L1
  373.                 LD D,C_24MHZ                    ; 0
  374. .L1             IN A,(GSCFG0)
  375.                 AND %11001111
  376.                 OR D
  377.                 OUT (GSCFG0),A
  378.                 RET
  379.  
  380. ; записываем 2048 нулей как завершение песенки
  381. ZER2MP3         LD D,0x40
  382. .L2             IN A,(SSTAT)
  383.                 RRA
  384.                 JR NC,.L2
  385.                 LD E,0x20
  386. .L1             XOR A
  387.                 OUT (MD_SEND),A
  388.                 DEC E
  389.                 JR NZ,.L1
  390.                 DEC D
  391.                 JR NZ,.L2
  392.                 RET
  393.  
  394. ; установка частоты MP3 чипа
  395. SET_CLOCKF      LD HL,VS10XX_WRITE << 8 + SCI_CLOCKF;0x0202
  396.                 LD A,(CHIP_TYPE)
  397.                 CP VS1053
  398.                 JR Z,.VS1053
  399.                 CP VS1063
  400.                 JR Z,.VS1063
  401. ; по дефолту установка для VS1001/VS1011
  402. .L1             LD DE,0x8000 + (14000000 / 2000); 0x9B58 установка делителя частоты для MP3 чипа
  403.                 JP COM_MP3                      ; установка частоты для декодера
  404.  
  405. .VS1053
  406. .VS1063         LD DE,SC_MULT4 | SC_ADD2 | 1000
  407.                 JP COM_MP3                      ; установка частоты для декодера
  408.  
  409. ; полный сброс
  410. HARDMP3         CALL VOL_MOD                    ; заглушили громкость портов GS
  411.                 LD BC,MC_SEND
  412.                 LD A,%10011100                  ; 0x9C
  413.                 OUT (SCTRL),A
  414.                 LD E,0
  415.                 CALL FREQNC                     ; выставили частоту на NGS 10 МГц
  416.                 LD HL,VS10XX_READ << 8 + SCI_STATUS;0x0301
  417.                 CALL COM_MP3
  418.                 LD A,M_MPXRS
  419.                 OUT (SCTRL),A
  420.                 CALL NOPER
  421.                 LD A,M_MPXRS + M_SNCLR          ; 0x84
  422.                 OUT (SCTRL),A                   ; выдали сброс на декодер
  423. .L1             IN A,(SSTAT)
  424.                 RRA
  425.                 JR NC,.L1                       ; дождались готовности декодера
  426.                 CALL SET_CLOCKF
  427.                 LD A,(CHIP_TYPE)
  428.                 CP VS1001
  429.                 LD HL,VS10XX_WRITE << 8 + SCI_BASS;0x0202
  430.                 LD DE,%1000000000001000         ; 0x8008
  431.                 CALL Z,COM_MP3                  ; для VS1001 запись недокументированного пинка в
  432.                                                 ; недокументированный регистр, если
  433.                                                 ; биты 7-4 регистра статуса в нуле
  434.                 LD E,1
  435.                 JP FREQNC                       ; выставили частоту на NGS 12 МГц
  436.  
  437. ; программный сброс MP3 декодера, рекомендуется вызывать перед каждым новым файлом, сбрасывает счетчик секунд
  438. ; после программного сброса все установленные режимы декодера не изменяются
  439. SOFTMP3         LD BC,MC_SEND
  440.                 LD HL,VS10XX_READ << 8 + SCI_VOL;0x030B
  441.                 CALL COM_MP3                    ; снимаем текущее значение громкости
  442.                 PUSH DE
  443.                 LD DE,0xFEFE                    ; и сохраняем его до лучших времен
  444.                 LD HL,VS10XX_WRITE << 8 + SCI_VOL;0x020B
  445.                 CALL COM_MP3                    ; уменьшаем громкость до минимума
  446.                 LD HL,VS10XX_READ << 8 + SCI_STATUS;0x0301
  447.                 CALL COM_MP3
  448.                 LD A,E
  449.                 AND %11110000
  450.                 PUSH AF
  451.                 LD HL,VS10XX_READ << 8 + SCI_MODE;0x0300
  452.                 CALL COM_MP3                    ; читаем состояние MODE
  453.                 LD A,4
  454.                 XOR E
  455.                 LD E,A
  456.                 LD HL,VS10XX_WRITE << 8 + SCI_MODE;0x0200
  457.                 CALL COM_MP3
  458.                 LD A,4
  459.                 XOR E
  460.                 LD E,A
  461.                 LD HL,VS10XX_WRITE << 8 + SCI_MODE;0x0200
  462.                 CALL COM_MP3                    ;даем команду софт-сброса
  463. .L1             IN A,(SSTAT)
  464.                 RRA
  465.                 JR NC,.L1                       ; ждем освобождения декодера
  466.                 CALL SET_CLOCKF
  467.                 POP AF
  468.                 LD HL,VS10XX_WRITE << 8 + SCI_BASS;0x0202
  469.                 LD DE,%1000000000001000         ; 0x8008
  470.                 CALL Z,COM_MP3                  ; недокументированный пинок MP3 декодера (у Ы1001 INT_FCTLH)
  471.                 POP DE
  472.                 LD HL,VS10XX_WRITE << 8 + SCI_VOL;0x020B
  473.                 JR COM_MP3                      ; восстанавливаем громкость до сброса
  474.  
  475. ; глушим громкость MOD портов
  476. VOL_MOD         XOR A
  477.                 OUT (VOL1),A
  478.                 OUT (VOL2),A
  479.                 OUT (VOL3),A
  480.                 OUT (VOL4),A
  481.                 OUT (VOL5),A
  482.                 OUT (VOL6),A
  483.                 OUT (VOL7),A
  484.                 OUT (VOL8),A
  485.                 RET
  486.  
  487. ; процедура чтения/записи адресов MP3 декодера
  488. ; H - команда декодеру 3-READ или 2-WRITE
  489. ; L - адрес в декодере
  490. ; D - старший байт
  491. ; E - младший байт
  492. ; DE по записи подать на вход
  493. ;    по чтению получить на выходе
  494. COM_MP3         IN A,(SSTAT)
  495.                 RRA
  496.                 JR NC,COM_MP3                   ; декодер свободен
  497.                 LD A,M_MCNCS
  498.                 OUT (SCTRL),A                   ; выбираем декодер и объясняем ему, что от него требуется
  499.                 CALL NOPER
  500.                 LD BC,MC_SEND
  501.                 LD A,H
  502.                 OUT (C),H
  503.                 CALL NOPER
  504.                 OUT (C),L
  505.                 CALL NOPER
  506.                 CP VS10XX_READ
  507.                 JR Z,MP3READ                    ; переходим на чтение (смотри выше)
  508.                 OUT (C),D
  509.                 CALL NOPER
  510.                 OUT (C),E                       ; записали в адрес декодера
  511. MP3_END         CALL NOPER
  512.                 LD A,M_MCNCS + M_SNCLR          ; 0x82 снимаем выбор декодера
  513.                 OUT (SCTRL),A
  514.                 RET
  515.  
  516. ; читаем что затребовали
  517. MP3READ         LD BC,MC_READ
  518.                 LD A,0xFF
  519.                 OUT (MC_SEND),A
  520.                 CALL NOPER
  521.                 IN D,(C)
  522.                 CALL NOPER
  523.                 OUT (MC_SEND),A
  524.                 CALL NOPER
  525.                 IN E,(C)
  526.                 JR MP3_END
  527.  
  528. ; процедура пересылки байтов со спека через порты ГС на MP3 декодер
  529. ; пересылается 512 байт
  530. DAT2MP3         LD D,0x10               ; перегнать на декодер 16 порций
  531. .L1             IN A,(SSTAT)
  532.                 RRA
  533.                 JR NC,.L1               ; декодер свободен?
  534.                 LD B,0x20               ; одна порция 32 байта
  535. .L2             IN A,(ZXSTAT)
  536.                 RLA
  537.                 JR NC,.L2               ; дождались подачи от спека
  538.                 IN A,(ZXDATRD)          ; забрали байт
  539.                 OUT (MD_SEND),A         ; отдали декодеру
  540.                 NOP                     ; выдержали паузу по тактам
  541.                 DJNZ .L2                ; порция кончилась
  542.                 DEC D
  543.                 JR NZ,.L1
  544.                 RET                     ; 512 байт передано!!!
  545.