Subversion Repositories ngs

Rev

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 байт передано!!!