Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
165 | savelij | 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 байт передано!!! |