Subversion Repositories ngs

Rev

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

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