Subversion Repositories ngs

Rev

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

Rev Author Line No. Line
165 savelij 1
 
181 savelij 2
; LAST UPDATE 17.05.2025 savelij
165 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
181 savelij 74
                LD A,(VAR_INT_MODE)
165 savelij 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
181 savelij 283
.L2             CALL DRQVS
165 savelij 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)
181 savelij 350
                AND %11001111
165 savelij 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
181 savelij 380
.L2             CALL DRQVS
165 savelij 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
 
181 savelij 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
 
165 savelij 400
; установка частоты MP3 чипа
181 savelij 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
165 savelij 412
                JP COM_MP3                      ; установка частоты для декодера
413
 
181 savelij 414
; ожидание готовности MP3 декодера
415
DRQVS           IN A,(SSTAT)
416
                RRA
417
                JR NC,DRQVS                     ; дождались готовности декодера
418
                RET
165 savelij 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                   ; выдали сброс на декодер
181 savelij 434
                CALL DRQVS
165 savelij 435
                CALL SET_CLOCKF
181 savelij 436
                LD A,(VAR_CHIP_TYPE)
165 savelij 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
181 savelij 458
                AND SCISTATUS.M_SS_VER
165 savelij 459
                PUSH AF
460
                LD HL,VS10XX_READ << 8 + SCI_MODE;0x0300
461
                CALL COM_MP3                    ; читаем состояние MODE
181 savelij 462
                LD A,SCIMODE.M_SM_RESET
165 savelij 463
                XOR E
464
                LD E,A
465
                LD HL,VS10XX_WRITE << 8 + SCI_MODE;0x0200
466
                CALL COM_MP3
181 savelij 467
                LD A,SCIMODE.M_SM_RESET
165 savelij 468
                XOR E
469
                LD E,A
181 savelij 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
165 savelij 475
                CALL COM_MP3                    ;даем команду софт-сброса
181 savelij 476
                CALL DRQVS
165 savelij 477
                CALL SET_CLOCKF
478
                POP AF
479
                LD HL,VS10XX_WRITE << 8 + SCI_BASS;0x0202
480
                LD DE,%1000000000001000         ; 0x8008
181 savelij 481
                CALL Z,COM_MP3                  ; недокументированный пинок MP3 декодера (у VS1001 INT_FCTLH)
165 savelij 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
;    по чтению получить на выходе
181 savelij 505
COM_MP3         CALL DRQVS
165 savelij 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 порций
181 savelij 540
.L1             CALL DRQVS
165 savelij 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 байт передано!!!