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