Subversion Repositories ngs

Rev

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

Rev Author Line No. Line
105 savelij 1
 
181 savelij 2
; LAST UPDATE: 17.05.2025 savelij
105 savelij 3
 
164 savelij 4
STACK_CURR_DIR          EQU 0x6000      ; стек номеров дир перед входом в нее
5
 
163 savelij 6
; FAT функции по номерам
7
 INIT_VAR
164 savelij 8
 SETVAR Init_Fatvars                    ; инит FAT драйвера
9
 SETVAR Getfzap                         ; получить описатель файла
10
 SETVAR Getlong                         ; получить длинное имя файла
11
 SETVAR Finddir                         ; найти все директории
12
 SETVAR Findfil                         ; найти все файлы по маске
13
 SETVAR Set_fil                         ; установка номера файла
14
 SETVAR Nextsec                         ; следующий сектор на MP3 чип
15
 SETVAR Openfil                         ; открытие файла
16
 SETVAR Prvdir                          ; предыдущая DIR для PLAY
17
 SETVAR Nxtdir                          ; следующая DIR для PLAY
18
 SETVAR Loadfil                         ; загрузка файла
105 savelij 19
 
163 savelij 20
 INIT_VAR B512BAS
164 savelij 21
 SETVAR BUF_512,                0x200   ; 200 буфер сектора
22
 SETVAR TDIRCLS,                0x400   ; 400 буфер кластеров root директории
23
 SETVAR DIR_CEP,                0x100   ; 100 цепочка кластеров поддиректорий
24
 SETVAR BUF_PATH,               0x100   ; 100 буфер текущего пути
25
 SETVAR ERORDRV,                WORD    ; 2 возврат с ошибкой в A
163 savelij 26
 SETVAR FATType,                BYTE    ; тип FAT: 0-12/1-16/2-32
27
 SETVAR NumFATs,                BYTE    ; количество FAT таблиц
28
 SETVAR SecPerClus,             BYTE    ; количество секторов в кластере
29
 SETVAR RootDIRCluster,         DWORD   ; номер кластера корневой DIR
30
 SETVAR NumSecRootDir,          DWORD   ; номер сектора корневой директории
164 savelij 31
 SETVAR ROOTSEC,                WORD    ; размер в секторах ROOT директории
163 savelij 32
 SETVAR FATSize,                DWORD   ; размер FAT таблицы в секторах
33
 SETVAR StartSecVol,            DWORD   ; номер стартового сектора раздела
34
 SETVAR FirstSecData,           DWORD   ; номер сектора начала области данных
35
 SETVAR NumSecFAT1,             DWORD   ; номер сектора первой FAT таблицы
36
 SETVAR NumSecFAT2,             DWORD   ; номер сектора второй FAT таблицы
37
 SETVAR NumSec2Buf,             DWORD   ; номер сектора загруженного в буфер
38
 SETVAR NumsSectorsVol,         DWORD   ; количество секторов на разделе
39
 SETVAR NumsClustersVol,        DWORD   ; количество кластеров на разделе
40
 SETVAR CurrentDIRCluster,      DWORD   ; номер кластера текущей DIR
164 savelij 41
 SETVAR TEK_ZAP,                WORD    ; текущая запись в DIR
42
 SETVAR TEK_LEV,                BYTE    ; глубина нахождения в директориях
43
 SETVAR NUMSECK,                BYTE    ; счетчик секторов в кластере
44
 SETVAR PAGEDIR,                WORD    ; адрес укладания в странице диров
45
 SETVAR PAGEMP3,                WORD    ; адрес укладания в странице файлов
46
 SETVAR TFILCLS,                DWORD   ; текущий кластер
47
 SETVAR TEKNUMC,                WORD    ; адрес текущего кластера
48
 SETVAR MPHWOST,                BYTE    ; остаток секторов в последнем кластере
49
 SETVAR KOL_CLS,                DWORD   ; кол-во полных кластеров файла
50
 SETVAR KOLVMP3,                WORD    ; кол-во найденных файлов
51
 SETVAR KOLVDIR,                WORD    ; кол-во найденных диров
52
 SETVAR STR_MP3,                WORD    ; адрес укладки найденных файлов
53
 SETVAR STACKPREVDIR,           WORD    ; адрес в стеке предыдущих директорий для возврата вверх
163 savelij 54
 SETVAR_ALIGN
164 savelij 55
 SETVAR STR_DIR,                0       ; ? адрес укладки найденных DIR
163 savelij 56
 
57
; общая точка входа для работы с FAT
112 savelij 58
                CALL CMP_INT
105 savelij 59
                DI
60
                EXX
61
                PUSH IX
62
                PUSH IY
63
                LD (ERORDRV),SP
64
                PUSH HL
65
                LD HL,EXITDRV
66
                EX (SP),HL
67
                PUSH HL
68
                PUSH DE
69
                ADD A,A
70
                LD L,A
71
                LD H,0
72
                LD DE,TABLFAT
73
                ADD HL,DE
74
                EX AF,AF'
75
                LD E,(HL)
76
                INC HL
77
                LD D,(HL)
78
                EX DE,HL
79
                POP DE
80
                EX (SP),HL
81
                EXX
82
                RET
83
 
84
ERR_DRV         LD SP,(ERORDRV)
85
EXITDRV         POP IY
86
                POP IX
112 savelij 87
                PUSH AF
181 savelij 88
                LD A,(VAR_INT_MODE)
112 savelij 89
                AND A
90
                JR Z,EXITDRV1
91
                EI
92
EXITDRV1        POP AF
105 savelij 93
                RET
94
 
163 savelij 95
TABLFAT         DW INIT_FATVARS                 ; 00 инит FAT драйвера
96
                DW GETFZAP                      ; 01 получить описатель файла
97
                DW GETLONG                      ; 02 получить длинное имя файла
98
                DW FINDDIR                      ; 03 найти все директории
99
                DW FINDMP3                      ; 04 найти все файлы по маске
100
                DW SET_MP3                      ; 05 установка номера файла
101
                DW NEXTSEC                      ; 06 следующий сектор на MP3 чип
102
                DW OPENFIL                      ; 07 открытие файла
103
                DW PRVDIR                       ; 08 предыдущая DIR для PLAY
104
                DW NXTDIR                       ; 09 следующая DIR для PLAY
105
                DW LOADFIL                      ; 0A загрузка файла
105 savelij 106
 
107
NO_LNG          POP DE
108
                LD BC,8
109
                LDIR
110
                LD A,(HL)
163 savelij 111
                CP " "
112
                JR Z,.NO_LNG1
105 savelij 113
                EX DE,HL
163 savelij 114
                LD (HL),"."
105 savelij 115
                INC HL
116
                EX DE,HL
117
                LDI
118
                LDI
119
                LDI
163 savelij 120
.NO_LNG1        EX DE,HL
105 savelij 121
                LD (HL),0
122
                POP HL
123
                RET
124
 
125
GETLONG         PUSH HL
126
                PUSH HL
127
                CALL SET_MP3
128
                CALL GETFZAP
129
                BIT 0,E
130
                JR Z,NO_LNG
131
                EXX
132
                LD C,0
133
                EXX
163 savelij 134
.GETLNG2        DEC BC
105 savelij 135
                CALL GETRZAP
136
                LD A,(HL)
137
                INC HL
138
                EXX
139
                BIT 6,C
140
                POP HL
163 savelij 141
                JR NZ,.GETLNGE_1
105 savelij 142
                LD C,A
143
                EXX
144
                LD A,5
163 savelij 145
                CALL .GETLNG1
105 savelij 146
                AND A
163 savelij 147
                JR Z,.GETLNGE
105 savelij 148
                INC HL
149
                INC HL
150
                INC HL
151
                LD A,6
163 savelij 152
                CALL .GETLNG1
105 savelij 153
                AND A
163 savelij 154
                JR Z,.GETLNGE
105 savelij 155
                INC HL
156
                INC HL
157
                LD A,2
163 savelij 158
                CALL .GETLNG1
105 savelij 159
                AND A
163 savelij 160
                JR Z,.GETLNGE
105 savelij 161
                EXX
162
                PUSH HL
163
                EXX
163 savelij 164
                JR .GETLNG2
105 savelij 165
 
163 savelij 166
.GETLNGE        EXX
167
.GETLNGE_1      LD (HL),0
105 savelij 168
                EXX
169
                POP HL
170
                RET
171
 
163 savelij 172
.GETLNG1        EXX
105 savelij 173
                LD B,A
174
                EXX
163 savelij 175
.GETLNG1_3      LD D,(HL)
105 savelij 176
                INC HL
177
                LD E,(HL)
178
                INC HL
179
                LD A,D
180
                OR E
181
                RET Z
182
                LD A,E
183
                AND A
163 savelij 184
                JR NZ,.GETLNG3
105 savelij 185
                LD A,D
163 savelij 186
                CP 0x80
187
                JR C,.GETLNG5
188
                LD D,0x5F
189
                JR .GETLNG5
105 savelij 190
 
163 savelij 191
.GETLNG3        CP 4
192
                LD A,0x5F
193
                JR NZ,.GETLNG5
105 savelij 194
                LD A,D
163 savelij 195
                LD E,0xEF
196
                LD D,0x5F
105 savelij 197
                CP 1
163 savelij 198
                JR Z,.GETLNG4
199
                LD E,0xA0
200
                CP 0x51
201
                JR Z,.GETLNG4
202
                SUB 0x10
203
                LD E,0x80
204
                JR NC,.GETLNG6
105 savelij 205
                LD A,D
163 savelij 206
                JR .GETLNG5
105 savelij 207
 
163 savelij 208
.GETLNG6        CP 0x30
209
                JR C,.GETLNG4
210
                LD E,0xB0
211
                CP 0x40
212
                JR C,.GETLNG4
105 savelij 213
                LD A,D
163 savelij 214
                JR .GETLNG5
105 savelij 215
 
163 savelij 216
.GETLNG4        ADD A,E
217
.GETLNG5        EXX
105 savelij 218
                LD (HL),A
219
                INC HL
220
                DEC B
221
                EXX
222
                RET Z
163 savelij 223
                JR .GETLNG1_3
224
; 401,410-44F,451
105 savelij 225
 
164 savelij 226
READ_SECTOR     CALL CPNUMSC
227
                JR NZ,.L1
112 savelij 228
                LD HL,BUF_512
229
                RET
164 savelij 230
 
231
.L1             LD (NumSec2Buf),DE
163 savelij 232
                LD (NumSec2Buf+2),BC
112 savelij 233
                LD HL,BUF_512
105 savelij 234
                PUSH HL
235
                EX AF,AF'
236
                LD A,2
237
                CALL COM__SD
238
                AND A
239
                JP NZ,ERR_DRV
240
                POP HL
241
                RET
242
 
163 savelij 243
; проверка на уже загруженный сектор
244
CPNUMSC         LD HL,NumSec2Buf
112 savelij 245
                LD A,(HL)
246
                INC HL
247
                CP E
248
                RET NZ
249
                LD A,(HL)
250
                INC HL
251
                CP D
252
                RET NZ
253
                LD A,(HL)
254
                INC HL
255
                CP C
256
                RET NZ
257
                LD A,(HL)
258
                CP B
259
                RET
260
 
105 savelij 261
ENT_DIR         CALL GETFZAP
262
                BIT 4,A
263
                EX AF,AF'
264
                LD A,E
265
                EX AF,AF'
266
                LD E,A
267
                LD D,(HL)
268
                RET Z
269
                EXX
270
                EX AF,AF'
271
                BIT 7,A
272
                JR Z,ENT_DI2
273
                LD HL,TEK_LEV
274
                LD A,(HL)
275
                AND A
276
                EXX
277
                RET Z
278
                EXX
279
                DEC A
280
                LD (HL),A
281
                ADD A,A
282
                LD H,HIGH (DIR_CEP)
283
                LD L,A
284
                LD A,(HL)
285
                INC L
286
                LD H,(HL)
287
                LD L,A
288
                CALL ENT_DI1
289
                EXX
290
                LD (TEK_ZAP),HL
291
                EXX
292
                RET
293
 
294
ENT_DI2         LD HL,TEK_LEV
295
                LD A,(HL)
296
                INC A
163 savelij 297
                CP 0x80
105 savelij 298
                EXX
299
                RET Z
300
                EXX
301
                LD (HL),A
302
                DEC A
303
                ADD A,A
304
                LD H,HIGH (DIR_CEP)
305
                LD L,A
306
                LD BC,(TEK_ZAP)
307
                LD (HL),C
308
                INC L
309
                LD (HL),B
310
ENT_DI1         EXX
311
                LD DE,20
312
                ADD HL,DE
313
                LD C,(HL)
314
                INC HL
315
                LD B,(HL)
316
                LD E,5
317
                ADD HL,DE
318
                LD E,(HL)
319
                INC HL
320
                LD D,(HL)
321
                LD A,B
322
                OR C
323
                OR D
324
                OR E
325
                JR NZ,ENT_DI0
163 savelij 326
                LD DE,(RootDIRCluster)
327
                LD BC,(RootDIRCluster+2)
328
ENT_DI0         LD (CurrentDIRCluster),DE
329
                LD (CurrentDIRCluster+2),BC
105 savelij 330
                CALL INIRTSC
331
                XOR A
332
                INC A
333
                RET
334
 
335
GETFZAP         LD BC,(TEK_ZAP)
336
                LD A,B
337
                OR C
338
                JR Z,GETRZAP
339
                PUSH BC
340
                DEC BC
341
                CALL GETRZAP
342
                POP BC
343
                LD E,A
344
GETRZAP         PUSH DE
345
                CALL RDDIRSC
346
                POP DE
163 savelij 347
                CP 0xFF
105 savelij 348
                LD A,E
349
                RET Z
350
                EX AF,AF'
163 savelij 351
                LD A,C
352
                AND 0x0F
105 savelij 353
                LD E,A
354
                LD D,0
355
                EX DE,HL
356
                ADD HL,HL
357
                ADD HL,HL
358
                ADD HL,HL
359
                ADD HL,HL
360
                ADD HL,HL
361
                ADD HL,DE
362
                LD DE,11
363
                EX DE,HL
364
                ADD HL,DE
365
                LD L,(HL)
366
                LD H,0
367
                EX DE,HL
368
                CALL CP_TWOT
163 savelij 369
                JR NZ,.L1
370
                LD D,0x80
371
.L1             EX AF,AF'
372
                CP 0x0F
105 savelij 373
                LD A,E
374
                LD E,D
375
                RET NZ
376
                SET 0,E
377
                RET
378
 
163 savelij 379
; чтение сектора DIR по номеру BC
380
; На выходе: A = 0xFF - выход за пределы DIR
105 savelij 381
RDDIRSC         PUSH BC
382
                LD D,B
383
                LD E,C
384
                LD BC,0
163 savelij 385
                LD A,0x10
105 savelij 386
                CALL BCDE_A
387
                LD A,E
388
                PUSH AF
163 savelij 389
                LD A,(SecPerClus)
105 savelij 390
                PUSH AF
391
                CALL BCDE_A
112 savelij 392
                LD HL,TDIRCLS
393
                EX DE,HL
394
                ADD HL,HL
395
                ADD HL,HL
396
                ADD HL,DE
163 savelij 397
                CALL GET_DWORD
164 savelij 398
                BIT 7,B
399
                JR Z,.L1
105 savelij 400
                POP AF
164 savelij 401
                POP AF
402
                POP AF
403
                XOR A
105 savelij 404
                DEC A
164 savelij 405
                RET
406
 
407
.L1             CALL REALSEC
408
                POP AF
409
                DEC A
105 savelij 410
                LD L,A
411
                POP AF
412
                AND L
413
                LD L,A
414
                LD H,0
415
                ADD HL,DE
416
                EX DE,HL
417
                LD HL,0
418
                ADC HL,BC
419
                LD B,H
420
                LD C,L
164 savelij 421
                CALL READ_SECTOR
105 savelij 422
                POP BC
423
                RET
424
 
163 savelij 425
GET_DWORD       LD E,(HL)
112 savelij 426
                INC HL
427
                LD D,(HL)
428
                INC HL
429
                LD C,(HL)
430
                INC HL
431
                LD B,(HL)
432
                INC HL
433
                RET
434
 
163 savelij 435
SET_DWORD       LD (HL),E
112 savelij 436
                INC HL
437
                LD (HL),D
438
                INC HL
439
                LD (HL),C
440
                INC HL
441
                LD (HL),B
442
                INC HL
443
                RET
444
 
105 savelij 445
INIRTSC         PUSH AF
163 savelij 446
                LD HL,0xFFFF
447
                LD (NumSec2Buf + 2),HL
448
                LD HL,TDIRCLS
449
                LD DE,(CurrentDIRCluster)
450
                LD BC,(CurrentDIRCluster + 2)
451
                CALL SET_DWORD                  ; сохранили в таблицу номер текущего кластера
164 savelij 452
                LD A,D
453
                OR E
454
                OR B
455
                OR C
163 savelij 456
                JR Z,LASTCLS                    ; если номер кластера 0, то это ROOT дира (для FAT12/16)
105 savelij 457
NEXTCLS         PUSH HL
163 savelij 458
                CALL RDFATZP                    ; читаем следущий номер кластера из цепочки директории
459
                CALL LST_CLS                    ; проверяем на конец цепочки
105 savelij 460
                POP HL
461
                JR C,LASTCLS
163 savelij 462
                CALL SET_DWORD                  ; если не последний сохраняем в таблицу
463
                JR NEXTCLS                      ; следующий номер кластера
105 savelij 464
 
163 savelij 465
LASTCLS         LD BC,0xFFFF
466
                CALL SET_DWORD                  ; кладем маркер конца цепочки
112 savelij 467
                INC BC
105 savelij 468
                CALL RDDIRSC
469
                LD A,(HL)
112 savelij 470
                CP "."
105 savelij 471
                JR NZ,INIRTS1
472
                INC HL
473
                LD A,(HL)
112 savelij 474
                CP "."
105 savelij 475
                JR Z,INIRTS1
476
                INC BC
477
INIRTS1         LD (TEK_ZAP),BC
478
                POP AF
479
                RET
480
 
481
CP_TWOT         LD A,(HL)
112 savelij 482
                CP "."
105 savelij 483
                RET NZ
484
                INC HL
485
                LD A,(HL)
486
                DEC HL
112 savelij 487
                CP "."
105 savelij 488
                RET NZ
489
                XOR A
490
                RET
491
 
163 savelij 492
LST_CLS         LD A,(FATType)
105 savelij 493
                AND A
494
                JR NZ,LST_CL1
163 savelij 495
                LD HL,0x0FF7
105 savelij 496
                SBC HL,DE
497
                RET
498
 
499
LST_CL1         DEC A
500
                JR NZ,LST_CL2
163 savelij 501
                LD HL,0xFFF7
105 savelij 502
                SBC HL,DE
503
                RET
504
 
505
LST_CL2         PUSH BC
506
                LD A,B
163 savelij 507
                AND 0x0F
105 savelij 508
                LD B,A
163 savelij 509
                LD HL,0x0FFF
105 savelij 510
                SBC HL,BC
511
                POP BC
512
                RET NZ
163 savelij 513
                LD HL,0xFFF7
105 savelij 514
                SBC HL,DE
515
                RET
516
 
163 savelij 517
RDFATZP         LD A,(FATType)                  ; чтение зависит от разрядности FAT
105 savelij 518
                AND A
163 savelij 519
                JR Z,RDFATS0                    ; переход вперед для FAT12
105 savelij 520
                DEC A
163 savelij 521
                JR Z,RDFATS1                    ; переход вперед для FAT16
522
                EX DE,HL                        ; здесь чтение для FTA32
105 savelij 523
                ADD HL,HL
524
                EX DE,HL
164 savelij 525
                LD H,B
526
                LD L,C
527
                ADC HL,HL                       ; умножили номер кластера на 2
105 savelij 528
                LD A,E
529
                LD E,D
530
                LD D,L
531
                LD C,H
163 savelij 532
                LD B,0                          ; разделили номер кластера на 256
533
                CALL RDFATS2                    ; читаем младшие 16 бит используя чтение для FAT16
105 savelij 534
                INC HL
535
                LD C,(HL)
536
                INC HL
163 savelij 537
                LD B,(HL)                       ; прочитали последующие старшие 16 бит
105 savelij 538
                RET
539
 
163 savelij 540
; чтение 16 битного номера кластера из цепочки для FAT16
105 savelij 541
RDFATS1         LD BC,0
542
                LD A,E
543
                LD E,D
163 savelij 544
                LD D,C                          ; разделили номер кластера на 256, старшие 16 бит =0
545
RDFATS2         PUSH AF                         ; общее чтение 16 битного номера кластера для FAT16/32
105 savelij 546
                PUSH BC
163 savelij 547
                LD HL,NumSecFAT1
548
                CALL BCDEHLP                    ; прибавили смещение от начала FAT таблицы
164 savelij 549
                CALL READ_SECTOR                ; загрузили вычисленный номер сектора
105 savelij 550
                POP BC
551
                POP AF
552
                LD E,A
553
                LD D,0
554
                ADD HL,DE
163 savelij 555
                ADD HL,DE                       ; вычислили смещение до нужного номера в загруженном секторе
105 savelij 556
                LD E,(HL)
557
                INC HL
163 savelij 558
                LD D,(HL)                       ; получили 16 бит номера кластера
105 savelij 559
                RET
560
 
163 savelij 561
; чтение 12 битного номера кластера из цепочки для FAT12
105 savelij 562
RDFATS0         LD H,D
563
                LD L,E
564
                ADD HL,HL
163 savelij 565
                ADD HL,DE                       ; HL = HL * 3
105 savelij 566
                SRL H
163 savelij 567
                RR L                            ; HL = HL / 2 - в итоге умножили номер кластера на 1,5
568
                LD A,E                          ; A - нам интересен только бит номер старого номера кластера
105 savelij 569
                LD E,H
570
                LD D,0
571
                LD B,D
163 savelij 572
                LD C,D                          ; разделили номер кластера на 256
105 savelij 573
                SRL E
574
                PUSH AF
575
                PUSH HL
163 savelij 576
                LD DE,(NumSecFAT1)
577
                LD BC,(NumSecFAT1 + 2)
164 savelij 578
                CALL READ_SECTOR                ; загрузили вычисленный сектор
105 savelij 579
                POP BC
580
                LD A,B
581
                AND 1
163 savelij 582
                LD B,A                          ; BC = смещение в загруженном секторе
583
                ADD HL,BC                       ; HL = адрес откуда читать байты номера кластера
584
                LD B,(HL)                       ; прочитали младшую часть номера кластера
585
                INC HL                          ; адрес следующего байта
105 savelij 586
                LD A,H
163 savelij 587
                CP HIGH (BUF_512)+2             ; проверка на переход границы загруженного сектора
105 savelij 588
                JR NZ,RDFATS4
163 savelij 589
                PUSH BC                         ; выход за пределы текущего загруженного сектора
105 savelij 590
                LD BC,0
591
                INC DE
164 savelij 592
                CALL READ_SECTOR                ; загружаем следующий сектор FAT таблицы
105 savelij 593
                POP BC
594
RDFATS4         POP AF
163 savelij 595
                LD D,(HL)                       ; читаем старшие биты номера кластера
596
                LD E,B                          ; теперь DE = номер следующего кластера в цепочке
105 savelij 597
                LD BC,0
163 savelij 598
                RRA                             ; проверяем бит 0 старого номера кластера
105 savelij 599
                JR NC,RDFATS3
163 savelij 600
        REPT 4
601
                SRL D                           ; сдвигаем номер прочитанного номера кластера в младшие 12 бит
105 savelij 602
                RR E
163 savelij 603
        ENDM
105 savelij 604
RDFATS3         LD A,D
163 savelij 605
                AND 0x0F
606
                LD D,A                          ; сбросили незначащие старшие 4 бита у полученного номера кластера
105 savelij 607
                RET
608
 
163 savelij 609
; вычисление реального сектора
610
; на входе BCDE = номер FAT
611
; на выходе BCDE = адрес сектора
105 savelij 612
REALSEC         LD A,B
613
                OR C
614
                OR D
615
                OR E
163 savelij 616
                JR NZ,REALSE1                   ; BCDE = 0?
617
                LD DE,(NumSecRootDir)
618
                LD BC,(NumSecRootDir + 2)
619
                RET
620
 
621
REALSE1         LD HL,0xFFFE
105 savelij 622
                EX DE,HL
623
                ADD HL,DE
624
                EX DE,HL
625
                INC HL
164 savelij 626
                ADC HL,BC                       ; HLDE = номер кластера - 2
163 savelij 627
                LD A,(SecPerClus)               ; нужно умножить на размер кластера
105 savelij 628
                JR REALSE2
629
 
630
REALSE3         SLA E
631
                RL D
632
                RL L
633
                RL H
634
REALSE2         RRCA
163 savelij 635
                JR NC,REALSE3                   ; умножили на размер кластера
105 savelij 636
                LD B,H
637
                LD C,L
163 savelij 638
                LD HL,FirstSecData
639
                JP BCDEHLP                      ; прибавили смещение от начала раздела
105 savelij 640
 
641
BCDE200         LD E,D
642
                LD D,C
643
                LD C,B
644
                LD B,0
645
                LD A,2
646
                JR BCDE_A
647
 
163 savelij 648
; BCDE >> A = BCDE
105 savelij 649
BCDE_A1         SRL B
650
                RR C
651
                RR D
652
                RR E
653
BCDE_A          RRCA
654
                JR NC,BCDE_A1
655
                RET
656
 
163 savelij 657
; (ADR) - BCDE = BCDE
105 savelij 658
BCDEHLM         LD A,(HL)
659
                INC HL
660
                SUB E
661
                LD E,A
662
                LD A,(HL)
663
                INC HL
664
                SBC A,D
665
                LD D,A
666
                LD A,(HL)
667
                INC HL
668
                SBC A,C
669
                LD C,A
670
                LD A,(HL)
671
                SBC A,B
672
                LD B,A
673
                RET
674
 
163 savelij 675
; (ADR) + BCDE = BCDE
105 savelij 676
BCDEHLP         LD A,(HL)
677
                INC HL
678
                ADD A,E
679
                LD E,A
680
                LD A,(HL)
681
                INC HL
682
                ADC A,D
683
                LD D,A
684
                LD A,(HL)
685
                INC HL
686
                ADC A,C
687
                LD C,A
688
                LD A,(HL)
689
                ADC A,B
690
                LD B,A
691
                RET
692
 
163 savelij 693
; HLDE + BC = HLDE
105 savelij 694
HLDEPBC         EX DE,HL
695
                ADD HL,BC
696
                EX DE,HL
697
                LD BC,0
698
                ADC HL,BC
699
                RET
700
 
163 savelij 701
; BCDE - (ADR) = BCDE
112 savelij 702
HLBCDEM         LD A,E
703
                SUB (HL)
704
                INC HL
705
                LD E,A
706
                LD A,D
707
                SBC A,(HL)
708
                INC HL
709
                LD D,A
710
                LD A,C
711
                SBC A,(HL)
712
                INC HL
713
                LD C,A
714
                LD A,B
715
                SBC A,(HL)
716
                LD B,A
717
                RET
718
 
163 savelij 719
; проверка 0 сектора раздела
720
VALID_BOOTSEC   LD HL,(BUF_512 + _BPB_BytsPerSec)
721
                LD A,H
722
                SUB 2
723
                OR L
724
                JR NZ,VALID_BOOTSEC1
725
                LD HL,(BUF_512 + _BPB_SecPerClus)
726
                OR L
727
                JR Z,VALID_BOOTSEC1
728
                NEG
729
                AND L
730
                CP L
731
                JR NZ,VALID_BOOTSEC1
732
                LD A,(BUF_512 + _BPB_NumFATs)
733
                DEC A
734
                CP 7
735
                JR NC,VALID_BOOTSEC1
736
                XOR A
105 savelij 737
                RET
738
 
163 savelij 739
VALID_BOOTSEC1  OR IXH
740
                RET
741
 
742
FAT_ERR         LD A,0xFF
743
                LD (FATType),A
744
                RET
745
 
746
; инициализация переменных FAT
747
INIT_FATVARS    LD A,0xFF
748
                LD (NumSec2Buf+3),A
112 savelij 749
                LD DE,0
105 savelij 750
                LD B,D
751
                LD C,E
164 savelij 752
                CALL READ_SECTOR
105 savelij 753
                PUSH HL
754
                POP IY
163 savelij 755
                LD DE,0x01BE
105 savelij 756
                ADD HL,DE
757
                LD A,(HL)
758
                AND A
759
                JR NZ,RDFAT05
760
                LD DE,4
761
                ADD HL,DE
762
                LD A,(HL)
763
                LD B,0
764
                CP 1
765
                JR Z,RDFAT06
766
                LD B,2
163 savelij 767
                CP 0x0B
105 savelij 768
                JR Z,RDFAT06
163 savelij 769
                CP 0x0C
105 savelij 770
                JR Z,RDFAT06
771
                LD B,1
772
                CP 6
773
                JR Z,RDFAT06
163 savelij 774
                CP 0x0E
105 savelij 775
                JR NZ,RDFAT05
776
RDFAT06         LD A,B
163 savelij 777
                LD (FATType),A
105 savelij 778
                ADD HL,DE
779
                LD E,(HL)
780
                INC HL
781
                LD D,(HL)
782
                INC HL
783
                LD C,(HL)
784
                INC HL
785
                LD B,(HL)
786
                JR RDFAT00
787
 
163 savelij 788
RDFAT05         LD C,(IY+0x0D)
105 savelij 789
                XOR A
790
                LD E,A
791
                LD B,8
164 savelij 792
.L4             RR C
105 savelij 793
                ADC A,0
164 savelij 794
                DJNZ .L4
105 savelij 795
                DEC A
164 savelij 796
                JR NZ,.L5
105 savelij 797
                INC E
164 savelij 798
.L5             LD A,(IY+0x0E)
163 savelij 799
                OR (IY+0x0F)
800
                JR Z,.L2
105 savelij 801
                INC E
163 savelij 802
.L2             LD A,(IY+0x13)
803
                OR (IY+0x14)
804
                JR NZ,.L3
105 savelij 805
                INC E
163 savelij 806
.L3             LD A,(IY+0x20)
807
                OR (IY+0x21)
808
                OR (IY+0x22)
809
                OR (IY+0x23)
164 savelij 810
                JR NZ,.L6
105 savelij 811
                INC E
164 savelij 812
.L6             LD A,(IY+0x15)
163 savelij 813
                AND 0xF0
814
                CP 0xF0
815
                JR NZ,.L1
105 savelij 816
                INC E
163 savelij 817
.L1             LD A,E
105 savelij 818
                CP 4
819
                JP NZ,FAT_ERR
163 savelij 820
                LD A,0xFF
821
                LD (FATType),A
105 savelij 822
                LD DE,0
823
                LD B,D
824
                LD C,E
825
 
163 savelij 826
RDFAT00         LD (StartSecVol),DE
164 savelij 827
                LD (StartSecVol + 2),BC         ; положили номер стартового сектора раздела
828
                CALL READ_SECTOR                ; загрузили его
163 savelij 829
 
830
                LD A,(BUF_512 + _BPB_SecPerClus)
831
                LD (SecPerClus),A
832
                LD HL,(BUF_512 + _BPB_RsvdSecCnt)
833
                ADD HL,DE
834
                LD (NumSecFAT1),HL
105 savelij 835
                LD HL,0
163 savelij 836
                ADC HL,BC
837
                LD (NumSecFAT1 + 2),HL
838
                LD HL,0
839
                LD DE,(BUF_512 + _BPB_FATSz16)
105 savelij 840
                LD A,D
841
                OR E
163 savelij 842
                JR NZ,RDFAT01                   ; если не FAT12/16 (_BPB_FATSz16 == 0)
843
                LD DE,(BUF_512 + _BPB_FATSz32)
164 savelij 844
                LD HL,(BUF_512 + _BPB_FATSz32 + 2)      ; то берем из смещения +36
163 savelij 845
RDFAT01         LD (FATSize),DE
164 savelij 846
                LD (FATSize + 2),HL             ; число секторов на FAT-таблицу
163 savelij 847
 
105 savelij 848
                LD HL,0
163 savelij 849
                LD DE,(BUF_512 + _BPB_TotSec16)
105 savelij 850
                LD A,D
851
                OR E
164 savelij 852
                JR NZ,.L1                       ; если не FAT12/16 (BPB_TOTSEC16=0)
163 savelij 853
                LD DE,(BUF_512 + _BPB_TotSec32)
854
                LD HL,(BUF_512 + _BPB_TotSec32+2)
164 savelij 855
                                                ; то берем из смещения +32
163 savelij 856
.L1             LD (NumsSectorsVol + 2),HL
164 savelij 857
                LD (NumsSectorsVol),DE          ; количество секторов на диске/разделе
105 savelij 858
 
163 savelij 859
; вычисляем ROOTDIRSECTORS
860
                LD DE,(BUF_512 + _BPB_RootEntCnt)
861
                LD BC,0
105 savelij 862
                LD A,D
863
                OR E
864
                JR Z,RDFAT03
163 savelij 865
                LD A,0x10
105 savelij 866
                CALL BCDE_A
867
 
164 savelij 868
; это реализована формула
869
; ROOTDIRSECTORS=((BPB_ROOTENTCNT*32)++(BPB_BYTSPERSEC-1))/BPB_BYTSPERSEC
870
; в HL ROOTDIRSECTORS. если FAT32, то HL=0 всегда
105 savelij 871
 
164 savelij 872
RDFAT03         PUSH DE                         ; ROOTDIRSECTORS
163 savelij 873
                LD HL,NumSecFAT1
874
                CALL GET_DWORD
875
                LD A,(BUF_512 + _BPB_NumFATs)
876
                LD (NumFATs),A
105 savelij 877
                DEC A
163 savelij 878
                JR Z,.L1
879
                LD HL,FATSize
880
                CALL BCDEHLP
881
                LD (NumSecFAT2),DE
882
                LD (NumSecFAT2 + 2),BC
883
.L1             LD HL,FATSize
884
                CALL BCDEHLP
885
                LD (NumSecRootDir),DE
886
                LD (NumSecRootDir + 2),BC
887
                POP HL
888
; добавляем размер ROOTDIR
889
                ADD HL,DE
105 savelij 890
                EX DE,HL
163 savelij 891
                LD HL,0
892
                ADC HL,BC
105 savelij 893
                LD B,H
894
                LD C,L
163 savelij 895
                LD (FirstSecData),DE
896
                LD (FirstSecData + 2),BC
897
                LD HL,NumsSectorsVol
898
                CALL BCDEHLM
899
                LD A,(SecPerClus)
900
                CALL BCDE_A
901
                LD (NumsClustersVol),DE
902
                LD (NumsClustersVol + 2),BC
105 savelij 903
 
163 savelij 904
                LD A,(FATType)
905
                CP 0xFF
112 savelij 906
                JR NZ,RDFAT04
163 savelij 907
; определение типа FAT при отсуствии MBR
908
                LD HL,(BUF_512 + _BPB_FATSz16)
909
                LD A,H
910
                OR L
112 savelij 911
                LD A,2
163 savelij 912
                JR Z,.L2
913
                LD DE,(FATSize - 1)
914
                LD BC,(FATSize + 1)
915
                LD E,0                          ; BCDE = количество секторов * 0x100
916
                LD HL,NumsClustersVol           ; количество кластеров на FAT
917
                CALL HLBCDEM                    ; количество кластеров - (количество секторов * 0x100)
112 savelij 918
                LD A,D
919
                OR C
920
                OR B
163 savelij 921
                LD A,1                          ; FAT16
922
                JR Z,.L2                        ; FAT16 если флаг Z=0
923
                XOR A                           ; иначе FAT12
924
.L2             LD (FATType),A
105 savelij 925
 
163 savelij 926
; для FAT12/16 ROOT кластер = 0
927
; для FAT32 берем по смещению +44
928
; На выходе: BCDE - СЕКТОР ROOTDIR КЛАСТЕР
929
RDFAT04         XOR A
930
                LD (TEK_LEV),A
931
                LD (BUF_PATH),A
932
;               CALL INIT_PATH
933
                LD A,(FATType)
934
                PUSH AF
105 savelij 935
                AND A
936
                LD DE,0
937
                LD B,D
938
                LD C,E
163 savelij 939
                JR Z,.L1                        ;FAT12-NONE
105 savelij 940
                DEC A
163 savelij 941
                JR Z,.L1                        ;FAT16
942
                LD DE,(BUF_512 + _BPB_RootClus)
943
                LD BC,(BUF_512 + _BPB_RootClus + 2)     ;FAT32
944
.L1             LD (CurrentDIRCluster),DE
945
                LD (CurrentDIRCluster + 2),BC   ; номер текущего кластера
946
                LD (RootDIRCluster),DE
947
                LD (RootDIRCluster + 2),BC      ; номер корневого кластера
105 savelij 948
                LD (TEK_LEV),A
163 savelij 949
                POP AF
105 savelij 950
                JP INIRTSC
951
 
181 savelij 952
F_EXT           DW F_EXT_VS1001                 ; 0 for VS1001  (MA8201)        9B58
953
                DW F_EXT_VS1011                 ; 1 for VS1011  (MA8201A)       9B58
954
                DW 0    ; 2 for VS1002  ; не поддерживается, не проверялся
955
                DW F_EXT_VS1003                 ; 3 for VS1003
956
                DW F_EXT_VS1053                 ; 4 for VS1053 and VS8053       ; пока не доделан
957
                DW 0    ; 5 for VS1033  ; не поддерживается, не проверялся
958
                DW F_EXT_VS1063                 ; 6 for VS1063  ; пока не доделан
959
                DW 0    ; 7 for VS1103  ; не поддерживается, не проверялся
105 savelij 960
 
961
CP_EXT          PUSH BC
962
                PUSH DE
963
                PUSH HL
181 savelij 964
                PUSH HL
105 savelij 965
                LD C,0
181 savelij 966
                LD A,(VAR_CHIP_TYPE)
967
                ADD A,A
968
                ADD A,LOW (F_EXT)
969
                LD L,A
970
                ADC A,HIGH (F_EXT)
971
                SUB L
972
                LD H,A
973
                LD E,(HL)
974
                INC HL
975
                LD D,(HL)
976
                POP HL
163 savelij 977
.L3             LD A,(DE)
105 savelij 978
                AND A
163 savelij 979
                JR Z,.L2
105 savelij 980
                INC C
981
                PUSH DE
982
                PUSH HL
983
                CALL COMPARF
984
                POP HL
985
                POP DE
163 savelij 986
                JR Z,.L1
105 savelij 987
                INC DE
988
                INC DE
989
                INC DE
163 savelij 990
                JR .L3
105 savelij 991
 
163 savelij 992
.L1             LD A,C
993
.L2             POP HL
105 savelij 994
                POP DE
995
                POP BC
996
                RET
997
 
998
COMPARF         PUSH DE
999
                LD DE,8
1000
                ADD HL,DE
1001
                POP DE
1002
                LD B,3
163 savelij 1003
.L1             LD A,(DE)
105 savelij 1004
                CP (HL)
1005
                RET NZ
1006
                INC HL
1007
                INC DE
163 savelij 1008
                DJNZ .L1
105 savelij 1009
                RET
1010
 
165 savelij 1011
; открытие файла
1012
; на выходе:
1013
; A - тип файла (1 и далее)
105 savelij 1014
OPENFIL         CALL SET_MP3
1015
                CALL GETFZAP
1016
                CALL CP_EXT
1017
                PUSH AF
163 savelij 1018
                LD DE,0x14
105 savelij 1019
                ADD HL,DE
1020
                LD C,(HL)
1021
                INC HL
1022
                LD B,(HL)
1023
                LD E,5
1024
                ADD HL,DE
1025
                LD E,(HL)
1026
                INC HL
1027
                LD D,(HL)
1028
                LD (TFILCLS),DE
1029
                LD (TFILCLS+2),BC
1030
                INC HL
1031
                LD E,(HL)
1032
                INC HL
1033
                LD D,(HL)
1034
                INC HL
1035
                LD C,(HL)
1036
                INC HL
1037
                LD B,(HL)
1038
                LD A,D
1039
                AND 1
1040
                OR E
1041
                EX AF,AF'
1042
                CALL BCDE200
163 savelij 1043
                LD A,(SecPerClus)
105 savelij 1044
                LD H,A
1045
                DEC A
1046
                AND E
1047
                LD L,A
1048
                EX AF,AF'
163 savelij 1049
                JR Z,.L1
105 savelij 1050
                INC L
163 savelij 1051
.L1             LD A,L
105 savelij 1052
                LD (MPHWOST),A
1053
                LD A,H
1054
                CALL BCDE_A
1055
                LD (KOL_CLS),DE
1056
                LD (KOL_CLS+2),BC
1057
                XOR A
1058
                LD (NUMSECK),A
1059
                POP AF
1060
                RET
1061
 
164 savelij 1062
; передача текущего сектора файла на декодер MP3
105 savelij 1063
NEXTSEC         LD HL,KOL_CLS
1064
                LD A,(HL)
1065
                INC HL
1066
                OR (HL)
1067
                INC HL
1068
                OR (HL)
1069
                INC HL
1070
                OR (HL)
1071
                JR Z,LSTCLSF
1072
                LD DE,(TFILCLS)
1073
                LD BC,(TFILCLS+2)
1074
                PUSH DE
1075
                PUSH BC
1076
                CALL REALSEC
1077
                LD HL,(NUMSECK)
1078
                LD H,0
1079
                ADD HL,DE
1080
                EX DE,HL
1081
                LD HL,0
1082
                ADC HL,BC
1083
                LD B,H
1084
                LD C,L
1085
                LD A,9
1086
                CALL COM__SD
1087
                AND A
1088
                JP NZ,ERR_DRV
1089
                POP BC
1090
                POP DE
1091
                LD A,(NUMSECK)
1092
                INC A
1093
                LD H,A
1094
                LD (NUMSECK),A
163 savelij 1095
                LD A,(SecPerClus)
105 savelij 1096
                CP H
163 savelij 1097
                LD A,0                          ; выход не по ошибке
105 savelij 1098
                RET NZ
1099
                XOR A
1100
                LD (NUMSECK),A
1101
                CALL RDFATZP
1102
                LD (TFILCLS),DE
1103
                LD (TFILCLS+2),BC
1104
                LD HL,KOL_CLS
1105
                LD DE,1
1106
                LD B,D
1107
                LD C,D
1108
                CALL BCDEHLM
1109
                LD (KOL_CLS),DE
1110
                LD (KOL_CLS+2),BC
1111
                XOR A
1112
                INC A
1113
                RET
1114
 
164 savelij 1115
; передача последнего сектора файла на декодер MP3
105 savelij 1116
LSTCLSF         LD DE,(TFILCLS)
1117
                LD BC,(TFILCLS+2)
1118
                CALL REALSEC
1119
                LD HL,(NUMSECK)
1120
                LD H,0
1121
                ADD HL,DE
1122
                EX DE,HL
1123
                LD HL,0
1124
                ADC HL,BC
1125
                LD B,H
1126
                LD C,L
1127
                LD A,9
1128
                CALL COM__SD
1129
                AND A
1130
                JP NZ,ERR_DRV
1131
                LD A,(NUMSECK)
1132
                INC A
1133
                LD H,A
1134
                LD (NUMSECK),A
1135
                LD A,(MPHWOST)
1136
                AND A
1137
                RET Z
1138
                CP H
1139
                RET
1140
 
163 savelij 1141
; инициализация переменных для текущего файла
105 savelij 1142
SET_MP3         LD H,B
1143
                LD L,C
1144
                LD DE,(STR_MP3)
1145
                ADD HL,HL
1146
                ADD HL,HL
1147
                ADD HL,DE
1148
                LD E,(HL)
1149
                INC HL
1150
                LD D,(HL)
1151
                INC HL
1152
                PUSH HL
1153
                EX DE,HL
163 savelij 1154
                LD DE,CurrentDIRCluster
105 savelij 1155
                LDI
1156
                LDI
1157
                LDI
1158
                LDI
163 savelij 1159
                LD DE,(CurrentDIRCluster)
1160
                LD BC,(CurrentDIRCluster+2)
105 savelij 1161
                CALL INIRTSC
1162
                POP HL
1163
                LD E,(HL)
1164
                INC HL
1165
                LD D,(HL)
1166
                LD (TEK_ZAP),DE
1167
                RET
1168
 
163 savelij 1169
; переход на предыдущую директорию
105 savelij 1170
PRVDIR          LD HL,(KOLVDIR)
1171
                LD DE,2
1172
                AND A
1173
                SBC HL,DE
1174
                RET C
1175
                LD HL,(KOLVMP3)
1176
                AND A
1177
                SBC HL,DE
1178
                RET C
1179
                LD H,B
1180
                LD L,C
1181
                LD DE,(STR_MP3)
1182
                ADD HL,HL
1183
                ADD HL,HL
1184
                ADD HL,DE
1185
                PUSH HL
1186
                POP IX
1187
                LD H,B
1188
                LD L,C
1189
                LD BC,(KOLVMP3)
163 savelij 1190
                LD DE,0xFFFC
105 savelij 1191
                EXX
1192
                LD L,(IX+0)
1193
                LD H,(IX+1)
1194
                EXX
1195
                CALL PRVDIR2
1196
                CALL PRVDIR2
1197
                LD DE,4
1198
                JR NXTDIR2
1199
 
1200
PRVDIR2         EXX
1201
                LD D,H
1202
                LD E,L
1203
                LD L,(IX+0)
1204
                LD H,(IX+1)
1205
                AND A
1206
                SBC HL,DE
1207
                EX AF,AF'
1208
                ADD HL,DE
1209
                EX AF,AF'
1210
                EXX
1211
                RET NZ
1212
                LD A,H
1213
                OR L
1214
                JR Z,PRVDIR4
1215
                DEC HL
1216
                ADD IX,DE
1217
                JR PRVDIR2
1218
 
1219
PRVDIR4         LD H,B
1220
                LD L,C
1221
                DEC HL
1222
                ADD HL,HL
1223
                ADD HL,HL
1224
                LD IX,(STR_MP3)
1225
                EX DE,HL
1226
                ADD IX,DE
1227
                EX DE,HL
1228
                LD H,B
1229
                LD L,C
1230
                DEC HL
1231
                JR PRVDIR2
1232
 
163 savelij 1233
; переход на следующую директорию
105 savelij 1234
NXTDIR          LD HL,(KOLVDIR)
1235
                LD DE,2
1236
                AND A
1237
                SBC HL,DE
1238
                RET C
1239
                LD HL,(KOLVMP3)
1240
                AND A
1241
                SBC HL,DE
1242
                RET C
1243
                LD H,B
1244
                LD L,C
1245
                LD DE,(STR_MP3)
1246
                ADD HL,HL
1247
                ADD HL,HL
1248
                ADD HL,DE
1249
                PUSH HL
1250
                POP IX
1251
                LD H,B
1252
                LD L,C
1253
                LD BC,(KOLVMP3)
1254
                LD DE,4
1255
                EXX
1256
                LD L,(IX+0)
1257
                LD H,(IX+1)
1258
                EXX
1259
NXTDIR2         EXX
1260
                LD D,H
1261
                LD E,L
1262
                LD L,(IX+0)
1263
                LD H,(IX+1)
1264
                AND A
1265
                SBC HL,DE
1266
                EX AF,AF'
1267
                ADD HL,DE
1268
                EX AF,AF'
1269
                EXX
1270
                JR NZ,NXTDIR3
1271
                INC HL
1272
                ADD IX,DE
1273
                AND A
1274
                SBC HL,BC
1275
                EX AF,AF'
1276
                ADD HL,BC
1277
                EX AF,AF'
1278
                JR NZ,NXTDIR2
1279
                LD HL,0
1280
                LD IX,(STR_MP3)
1281
                JR NXTDIR2
1282
 
1283
NXTDIR3         LD B,H
1284
                LD C,L
1285
                RET
1286
 
163 savelij 1287
; включение следующей страницы памяти
1288
SETPAGE         LD HL,BUF_PAG+0xFF
105 savelij 1289
                LD L,(HL)
1290
                LD A,(HL)
1291
                OUT (MPAGEX),A
163 savelij 1292
                LD L,0xFF
105 savelij 1293
                INC (HL)
1294
                RET
1295
 
163 savelij 1296
; грузилка MOD в память NEOGS
1297
LOADFIL         LD HL,BUF_PAG+0xFF
105 savelij 1298
                LD (HL),0
1299
                IN A,(GSCFG0)
1300
                SET B_EXPAG,A
1301
                OUT (GSCFG0),A
163 savelij 1302
                LD IY,(SecPerClus)
1303
; LY = кол-во секторов в кластере
105 savelij 1304
                LD A,IYL
163 savelij 1305
                CP 0x20
105 savelij 1306
                JR C,LDMF5
163 savelij 1307
; загрузка кластеров 32 и более секторов
105 savelij 1308
LD_F5           LD DE,(TFILCLS)
1309
                LD BC,(TFILCLS+2)
1310
                CALL REALSEC
1311
                LD A,IYL
163 savelij 1312
                AND 0xE0
105 savelij 1313
                RLCA
1314
                RLCA
1315
                RLCA
1316
                LD IYH,A
163 savelij 1317
LD_F9           LD A,0x20
105 savelij 1318
                EX AF,AF'
1319
                CALL SETPAGE
1320
                LD A,3
163 savelij 1321
                LD HL,0xC000
105 savelij 1322
                CALL COM__SD
1323
                AND A
1324
                JP NZ,ERR_DRV
163 savelij 1325
                LD HL,0x20
105 savelij 1326
                ADD HL,DE
1327
                EX DE,HL
1328
                LD HL,0
1329
                ADC HL,BC
1330
                LD B,H
1331
                LD C,L
1332
                DEC IYH
1333
                JR NZ,LD_F9
1334
                LD DE,(TFILCLS)
1335
                LD BC,(TFILCLS+2)
1336
                CALL RDFATZP
1337
                CALL LST_CLS
1338
                JR C,LD_E
1339
                LD (TFILCLS+2),BC
1340
                LD (TFILCLS),DE
1341
                JR LD_F5
1342
 
1343
LD_E            IN A,(GSCFG0)
1344
                RES B_EXPAG,A
1345
                OUT (GSCFG0),A
181 savelij 1346
                LD A,(VAR_PAGE_PLAYER)
105 savelij 1347
                OUT (MPAG),A
163 savelij 1348
                LD A,(BUF_PAG+0xFF)
105 savelij 1349
                SRL A
1350
                ADC A,0
1351
                RET
1352
 
163 savelij 1353
; загрузка кластеров 16 и менее секторов
105 savelij 1354
LDMF5           CALL SETPAGE
163 savelij 1355
                LD HL,0xC000
105 savelij 1356
LDMF2           LD DE,(TFILCLS)
1357
                LD BC,(TFILCLS+2)
1358
                PUSH HL
1359
                CALL REALSEC
1360
                POP HL
1361
LDMF3           LD A,IYL
1362
                EX AF,AF'
1363
                LD A,3
1364
                CALL COM__SD
1365
                AND A
1366
                JP NZ,ERR_DRV
1367
                PUSH HL
1368
                LD BC,(TFILCLS+2)
1369
                LD DE,(TFILCLS)
1370
                CALL RDFATZP
1371
                CALL LST_CLS
1372
                POP HL
1373
                JR C,LD_E
1374
                LD (TFILCLS+2),BC
1375
                LD (TFILCLS),DE
1376
                LD A,H
1377
                AND A
1378
                JR NZ,LDMF2
1379
                JR LDMF5
1380
 
163 savelij 1381
; поиск всех директорий на FAT
164 savelij 1382
FINDDIR         LD HL,STACK_CURR_DIR
1383
                LD (STACKPREVDIR),HL
105 savelij 1384
                LD DE,STR_DIR
163 savelij 1385
                LD HL,RootDIRCluster
105 savelij 1386
                LDI
1387
                LDI
1388
                LDI
1389
                LDI
164 savelij 1390
                LD (PAGEDIR),DE                 ; куда следующий номер кластера диры ложить
1391
.L72            LD BC,0
105 savelij 1392
                CALL RDDIRSC
163 savelij 1393
                LD DE,0x20
105 savelij 1394
                PUSH HL
1395
                POP IX
1396
                LD A,(HL)
112 savelij 1397
                CP "."
164 savelij 1398
                JR NZ,.L3
1399
                LD A,(IX+1)
112 savelij 1400
                CP "."
164 savelij 1401
                JR Z,.NEXTDIR
105 savelij 1402
                INC BC
1403
                ADD IX,DE
164 savelij 1404
.NEXTDIR        INC BC
105 savelij 1405
                ADD IX,DE
164 savelij 1406
.L3             LD A,IXH
1407
                CP HIGH (BUF_512) + 2
1408
                JR NZ,.L2                       ; сектор кончился?
1409
                CALL RDDIRSC
1410
                JR NZ,.FNDDIR5                  ; конец DIR
163 savelij 1411
                LD DE,0x20
105 savelij 1412
                PUSH HL
1413
                POP IX
164 savelij 1414
.L2             LD A,(IX+0)
112 savelij 1415
                AND A
164 savelij 1416
                JR Z,.FNDDIR5                   ; конец DIR?
163 savelij 1417
                CP 0xE5
164 savelij 1418
                JR Z,.NEXTDIR                   ; файл удален?
1419
                LD A,(IX + _DIR_Attr)
1420
                CP M_DIR_AttrLongName
1421
                JR Z,.NEXTDIR                   ; это длинное имя?
1422
                CP M_DIR_VolumeID
1423
                JR Z,.NEXTDIR                   ; это имя раздела?
1424
                BIT 4,(IX + _DIR_Attr)
1425
                JR Z,.NEXTDIR                   ; это директория?
1426
; укладка номера кластера найденной DIR
1427
                LD HL,(PAGEDIR)                 ; куда ложить
163 savelij 1428
                LD A,(IX+0x1A)
105 savelij 1429
                LD (HL),A
1430
                INC HL
163 savelij 1431
                LD A,(IX+0x1B)
105 savelij 1432
                LD (HL),A
1433
                INC HL
163 savelij 1434
                LD A,(IX+0x14)
105 savelij 1435
                LD (HL),A
1436
                INC HL
163 savelij 1437
                LD A,(IX+0x15)
105 savelij 1438
                LD (HL),A
163 savelij 1439
                INC HL                          ; уложили номер кластера найденной DIR
105 savelij 1440
                LD (PAGEDIR),HL
164 savelij 1441
                LD HL,(STACKPREVDIR)
1442
                DEC HL
1443
                LD (HL),B
1444
                DEC HL
1445
                LD (HL),C                       ; сохранили номер текущей диры
1446
                LD (STACKPREVDIR),HL
105 savelij 1447
                LD (TEK_ZAP),BC
1448
                CALL ENT_DIR
164 savelij 1449
                JP .L72
105 savelij 1450
 
164 savelij 1451
; выход из директории и проверка попытки выхода из корневой директории
1452
.FNDDIR5        LD A,(STACKPREVDIR + 1)
1453
                CP HIGH (STACK_CURR_DIR)
1454
                JR NC,FNDDIR0
105 savelij 1455
                LD BC,0
1456
                CALL RDDIRSC
1457
                PUSH HL
1458
                POP IX
163 savelij 1459
                LD DE,0x20
105 savelij 1460
                LD A,(HL)
112 savelij 1461
                CP "."
164 savelij 1462
                JR NZ,.FNDDI52
105 savelij 1463
                INC HL
1464
                LD A,(HL)
112 savelij 1465
                CP "."
164 savelij 1466
                JR Z,.FNDDI52
105 savelij 1467
                INC BC
1468
                ADD IX,DE
164 savelij 1469
.FNDDI52        LD (TEK_ZAP),BC
1470
                CALL ENT_DIR                    ; выход из диры
1471
                LD HL,(STACKPREVDIR)
1472
                LD C,(HL)
1473
                INC HL
1474
                LD B,(HL)
1475
                INC HL
1476
                LD (STACKPREVDIR),HL
105 savelij 1477
                CALL RDDIRSC
1478
                LD A,C
163 savelij 1479
                AND 0x0F
105 savelij 1480
                LD E,A
1481
                LD D,0
1482
                EX DE,HL
1483
                ADD HL,HL
1484
                ADD HL,HL
1485
                ADD HL,HL
1486
                ADD HL,HL
1487
                ADD HL,HL
1488
                ADD HL,DE
1489
                PUSH HL
1490
                POP IX
163 savelij 1491
                LD DE,0x20
164 savelij 1492
                JP .NEXTDIR
105 savelij 1493
 
163 savelij 1494
; все DIR найдены
105 savelij 1495
FNDDIR0         LD HL,(PAGEDIR)
1496
                LD D,H
1497
                LD E,L
1498
                INC HL
1499
                INC HL
1500
                INC HL
163 savelij 1501
                LD (HL),0xFF
105 savelij 1502
                PUSH HL
1503
                EX DE,HL
1504
                LD DE,STR_DIR
1505
                AND A
1506
                SBC HL,DE
1507
                SRL H
1508
                RR L
1509
                SRL H
1510
                RR L
1511
                LD (KOLVDIR),HL
1512
                EX (SP),HL
1513
                INC HL
1514
                LD (STR_MP3),HL
1515
                POP HL
1516
                RET
1517
 
163 savelij 1518
; все файлы найдены или память кончилась
105 savelij 1519
FNDMP30         LD HL,(PAGEMP3)
1520
                LD DE,(STR_MP3)
1521
                PUSH HL
1522
                POP IX
1523
                LD (HL),0
1524
                INC L
1525
                LD (HL),0
1526
                DEC L
1527
                AND A
1528
                SBC HL,DE
1529
                SRL H
1530
                RR L
1531
                SRL H
1532
                RR L
1533
                LD DE,2
1534
                LD (KOLVMP3),HL
181 savelij 1535
                LD (VAR_COUNT_MP3),HL
105 savelij 1536
                AND A
1537
                SBC HL,DE
1538
                EX AF,AF'
1539
                ADD HL,DE
1540
                EX AF,AF'
1541
                RET C
1542
                PUSH HL
1543
                LD IY,1
1544
                LD B,H
1545
                LD C,L
163 savelij 1546
                LD DE,0xFFFC
105 savelij 1547
                ADD IX,DE
1548
                DEC HL
1549
                EXX
1550
                LD L,(IX+0)
1551
                LD H,(IX+1)
1552
                EXX
1553
FNDM030         EXX
1554
                LD D,H
1555
                LD E,L
1556
                LD L,(IX+0)
1557
                LD H,(IX+1)
1558
                AND A
1559
                SBC HL,DE
1560
                EX AF,AF'
1561
                ADD HL,DE
1562
                EX AF,AF'
1563
                EXX
164 savelij 1564
                JR Z,.L1
105 savelij 1565
                INC IY
164 savelij 1566
.L1             LD A,H
105 savelij 1567
                OR L
163 savelij 1568
                JR Z,FNDM033                    ; память кончилась, выходим
105 savelij 1569
                DEC HL
1570
                ADD IX,DE
1571
                JR FNDM030
1572
 
163 savelij 1573
FNDM033         LD (KOLVDIR),IY                 ; количество найденных директорий
105 savelij 1574
                POP HL
1575
                RET
1576
 
163 savelij 1577
; поиск файлов по расширению
105 savelij 1578
FINDMP3         LD HL,(STR_MP3)
1579
                LD (PAGEMP3),HL
1580
                LD HL,STR_DIR
1581
                LD (PAGEDIR),HL
164 savelij 1582
.FNDMP37        LD HL,(PAGEDIR)
105 savelij 1583
                LD (TEKNUMC),HL
163 savelij 1584
                LD DE,CurrentDIRCluster
105 savelij 1585
                LDI
1586
                LDI
1587
                LDI
1588
                LDI
1589
                LD (PAGEDIR),HL
1590
                DEC HL
1591
                BIT 7,(HL)
1592
                JP NZ,FNDMP30
163 savelij 1593
                LD DE,(CurrentDIRCluster)
1594
                LD BC,(CurrentDIRCluster+2)
105 savelij 1595
                CALL INIRTSC
1596
                LD BC,0
1597
                CALL RDDIRSC
163 savelij 1598
                LD DE,0x20
105 savelij 1599
                PUSH HL
1600
                POP IX
1601
                LD A,(HL)
112 savelij 1602
                CP "."
164 savelij 1603
                JR NZ,.ROOT
1604
                LD A,(IX+1)
112 savelij 1605
                CP "."
164 savelij 1606
                JR Z,.NEXTFILE
105 savelij 1607
                INC BC
1608
                ADD IX,DE
164 savelij 1609
.NEXTFILE       INC BC
105 savelij 1610
                ADD IX,DE
164 savelij 1611
.ROOT           LD A,IXH
1612
                CP HIGH (BUF_512) + 2
1613
                JR NZ,.FNDMP32
1614
                CALL RDDIRSC
1615
                JP NZ,.FNDMP37
163 savelij 1616
                LD DE,0x20
105 savelij 1617
                PUSH HL
1618
                POP IX
164 savelij 1619
.FNDMP32        LD A,(IX+0)
112 savelij 1620
                AND A
164 savelij 1621
                JP Z,.FNDMP37                   ; конец DIR?
163 savelij 1622
                CP 0xE5
164 savelij 1623
                JR Z,.NEXTFILE                  ; файл удален?
1624
                LD A,(IX + _DIR_Attr)
1625
                CP M_DIR_AttrLongName
1626
                JR Z,.NEXTFILE                  ; это длинное имя?
1627
                CP M_DIR_VolumeID
1628
                JR Z,.NEXTFILE                  ; это имя раздела?
1629
                BIT 4,(IX + _DIR_Attr)
1630
                JR NZ,.NEXTFILE                 ; это директория?
105 savelij 1631
                EXX
1632
                PUSH IX
1633
                POP HL
163 savelij 1634
                CALL CP_EXT                     ; проверяем расширение файла
105 savelij 1635
                EXX
1636
                AND A
164 savelij 1637
                JP Z,.NEXTFILE                  ; не совпало, продолжаем
105 savelij 1638
                LD DE,(TEKNUMC)
1639
                LD HL,(PAGEMP3)
163 savelij 1640
; укладка описателя файла
1641
; 2 байта адрес кластера диры
1642
; 2 байта "реальный" номер файла
105 savelij 1643
                LD (HL),E
1644
                INC HL
1645
                LD (HL),D
1646
                INC HL
1647
                LD (HL),C
1648
                INC HL
1649
                LD (HL),B
1650
                INC HL
1651
                LD (PAGEMP3),HL
1652
                LD A,H
1653
                AND A
163 savelij 1654
                JP Z,FNDMP30                    ; память кончилась, выходим
1655
                LD DE,0x20
164 savelij 1656
                JR .NEXTFILE