Rev 1120 | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1120 | Rev 1186 | ||
---|---|---|---|
Line 1... | Line 1... | ||
1 | 1 | ||
2 | ; LAST UPDATE: 10.02.2024 savelij |
2 | ; LAST UPDATE: 07.02.2025 savelij |
3 | 3 | ||
4 | include macros.a80 |
4 | include macros.a80 |
5 | include define.a80 |
5 | include define.a80 |
6 | include global_vars.a80 |
6 | include global_vars.a80 |
7 | include ports_ngs.a80 |
7 | include ports_ngs.a80 |
Line 10... | Line 10... | ||
10 | include nums_devices.a80 |
10 | include nums_devices.a80 |
11 | include fat_dir.a80 |
11 | include fat_dir.a80 |
12 | 12 | ||
13 | INIT_VAR DRV_VAR |
13 | INIT_VAR DRV_VAR |
14 | SETVAR BUF_512_, 0x200 ; буфер сектора |
14 | SETVAR BUF_512_, 0x200 ; буфер сектора |
- | 15 | FATVAR |
|
- | 16 | _INIT_VAR INITVAR ; базовый адрес для переменых FAT |
|
15 | include ../../fat_vars.a80 |
17 | include fat_vars.a80 |
16 | SETVAR_ALIGN |
18 | SETVAR_ALIGN |
17 | SUBVAR (WORD + WORD + BYTE + BYTE) |
19 | SUBVAR (WORD + WORD + BYTE + BYTE) |
18 | SETVAR LENGHT, WORD ; длина файла в байтах |
20 | SETVAR LENGHT, WORD ; длина файла в байтах |
19 | SETVAR LOADSCS1, WORD ; адрес вызываемого драйвера |
21 | SETVAR LOADSCS1, WORD ; адрес вызываемого драйвера |
20 | SETVAR MAS_SLA, BYTE ; маска для MASTER/SLAVE |
22 | SETVAR MAS_SLA, BYTE ; маска для MASTER/SLAVE |
Line 49... | Line 51... | ||
49 | AND A |
51 | AND A |
50 | LD A,0xE0 |
52 | LD A,0xE0 |
51 | JR Z,SETMASL |
53 | JR Z,SETMASL |
52 | LD A,0xF0 |
54 | LD A,0xF0 |
53 | SETMASL LD (MAS_SLA),A |
55 | SETMASL LD (MAS_SLA),A |
54 | LD BC,(FILE_SRC + _DIR_FstClusHI) |
56 | LD BC,(FATVAR.FILE_SRC + _DIR_FstClusHI) |
55 | LD (AFILCLS+2),BC |
57 | LD (FATVAR.AFILCLS+2),BC |
56 | LD DE,(FILE_SRC + _DIR_FstClusLO) |
58 | LD DE,(FATVAR.FILE_SRC + _DIR_FstClusLO) |
57 | LD (AFILCLS),DE |
59 | LD (FATVAR.AFILCLS),DE |
58 | LD A,(FILE_SRC + _DIR_Ext + 1) |
60 | LD A,(FATVAR.FILE_SRC + _DIR_Ext + 1) |
59 | CP "P" |
61 | CP 'P' |
60 | JP Z,RUNSPG2 ; переход на запуск SPG файла |
62 | JP Z,RUNSPG2 ; переход на запуск SPG файла |
61 | CP "N" |
63 | CP 'N' |
62 | JP Z,RUNSNA ; переход на запуск SNA файла |
64 | JP Z,RUNSNA ; переход на запуск SNA файла |
63 | CALL REALSEC ; преобразовали в номер сектора |
65 | CALL REALSEC ; преобразовали в номер сектора |
64 | CALL LOADLST ; загрузили в буфер |
66 | CALL LOADLST ; загрузили в буфер |
65 | EXX |
67 | EXX |
66 | LD HL,(BUF_512_ + _DIR_Ext + 1) |
68 | LD HL,(BUF_512_ + _DIR_Ext + 1) |
Line 90... | Line 92... | ||
90 | ADD HL,DE ; далее грузить со следующего сектора |
92 | ADD HL,DE ; далее грузить со следующего сектора |
91 | EX DE,HL |
93 | EX DE,HL |
92 | JR NC,READ04 |
94 | JR NC,READ04 |
93 | INC BC ; BCDE = BCDE + 1 |
95 | INC BC ; BCDE = BCDE + 1 |
94 | READ04 POP HL ; в HL адрес для продолжения загрузки |
96 | READ04 POP HL ; в HL адрес для продолжения загрузки |
95 | LD IY,(SecPerClus) ; LY = количество секторов в кластере |
97 | LD IY,(FATVAR.SecPerClus) ; LY = количество секторов в кластере |
96 | LD A,IXL |
98 | LD A,IXL |
97 | CP IYL ; секторов осталось меньше чем в кластере |
99 | CP IYL ; секторов осталось меньше чем в кластере |
98 | JR C,READ02 ; переход на дозагрузку остатка секторов |
100 | JR C,READ02 ; переход на дозагрузку остатка секторов |
99 | INC IXL |
101 | INC IXL |
100 | LD A,IYL |
102 | LD A,IYL |
Line 102... | Line 104... | ||
102 | JR C,READ07 |
104 | JR C,READ07 |
103 | DEC A |
105 | DEC A |
104 | JR READ05 |
106 | JR READ05 |
105 | 107 | ||
106 | READ07 PUSH HL |
108 | READ07 PUSH HL |
107 | LD DE,(AFILCLS) |
109 | LD DE,(FATVAR.AFILCLS) |
108 | LD BC,(AFILCLS + 2) |
110 | LD BC,(FATVAR.AFILCLS + 2) |
109 | CALL RD_NEXT_CLUSTER ; получить номер следующего кластера |
111 | CALL RD_NEXT_CLUSTER ; получить номер следующего кластера |
110 | LD (AFILCLS),DE |
112 | LD (FATVAR.AFILCLS),DE |
111 | LD (AFILCLS + 2),BC |
113 | LD (FATVAR.AFILCLS + 2),BC |
112 | CALL CHECK_LAST_CLUSTER ; проверка на окончание FAT цепочки |
114 | CALL CHECK_LAST_CLUSTER ; проверка на окончание FAT цепочки |
113 | POP HL |
115 | POP HL |
114 | JR C,RUNLOAD ; если кластера закончились, то запуск загруженного |
116 | JR C,RUNLOAD ; если кластера закончились, то запуск загруженного |
115 | PUSH HL |
117 | PUSH HL |
116 | CALL REALSEC ; преобразование номера кластера в номер сектора |
118 | CALL REALSEC ; преобразование номера кластера в номер сектора |
Line 205... | Line 207... | ||
205 | ; IYH - смещение в кластере |
207 | ; IYH - смещение в кластере |
206 | LOAD_FILE PUSH BC ; старшие 16 бит номера кластера |
208 | LOAD_FILE PUSH BC ; старшие 16 бит номера кластера |
207 | PUSH DE ; младшие 16 бит номера кластера |
209 | PUSH DE ; младшие 16 бит номера кластера |
208 | PUSH HL ; сохранили адрес загрузки |
210 | PUSH HL ; сохранили адрес загрузки |
209 | CALL REALSEC ; перевели номер кластера в номер сектора |
211 | CALL REALSEC ; перевели номер кластера в номер сектора |
210 | LD IX,(SecPerClus) |
212 | LD IX,(FATVAR.SecPerClus) |
211 | LD A,IYH ; смещение в кластере |
213 | LD A,IYH ; смещение в кластере |
212 | LD L,A |
214 | LD L,A |
213 | LD H,0 |
215 | LD H,0 |
214 | ADD HL,DE |
216 | ADD HL,DE |
215 | EX DE,HL |
217 | EX DE,HL |
Line 249... | Line 251... | ||
249 | JP NZ,LOAD_FILE |
251 | JP NZ,LOAD_FILE |
250 | RET |
252 | RET |
251 | 253 | ||
252 | ; проверка номера кластера |
254 | ; проверка номера кластера |
253 | CHECK_LAST_CLUSTER |
255 | CHECK_LAST_CLUSTER |
254 | LD A,(FATType) |
256 | LD A,(FATVAR.FATType) |
255 | AND A |
257 | AND A |
256 | JR NZ,.L1 |
258 | JR NZ,.L1 |
257 | LD HL,0x0FF7 |
259 | LD HL,0x0FF7 |
258 | SBC HL,DE |
260 | SBC HL,DE |
259 | RET |
261 | RET |
Line 270... | Line 272... | ||
270 | LD HL,0xFFF7 |
272 | LD HL,0xFFF7 |
271 | SBC HL,DE |
273 | SBC HL,DE |
272 | RET |
274 | RET |
273 | 275 | ||
274 | ; чтение следующего кластера |
276 | ; чтение следующего кластера |
275 | RD_NEXT_CLUSTER LD A,(FATType) |
277 | RD_NEXT_CLUSTER LD A,(FATVAR.FATType) |
276 | AND A |
278 | AND A |
277 | JR Z,.L1 |
279 | JR Z,.L1 |
278 | DEC A |
280 | DEC A |
279 | JR Z,.L2 |
281 | JR Z,.L2 |
280 | EX DE,HL |
282 | EX DE,HL |
Line 299... | Line 301... | ||
299 | LD A,E |
301 | LD A,E |
300 | LD E,D |
302 | LD E,D |
301 | LD D,C |
303 | LD D,C |
302 | .L3 PUSH AF |
304 | .L3 PUSH AF |
303 | PUSH BC |
305 | PUSH BC |
304 | LD HL,NumSecFAT1 |
306 | LD HL,FATVAR.NumSecFAT1 |
305 | CALL BCDEHLP |
307 | CALL BCDEHLP |
306 | CALL LOADLST |
308 | CALL LOADLST |
307 | POP BC |
309 | POP BC |
308 | POP AF |
310 | POP AF |
309 | LD E,A |
311 | LD E,A |
Line 327... | Line 329... | ||
327 | LD B,D |
329 | LD B,D |
328 | LD C,D |
330 | LD C,D |
329 | SRL E |
331 | SRL E |
330 | PUSH AF |
332 | PUSH AF |
331 | PUSH HL |
333 | PUSH HL |
332 | LD DE,(NumSecFAT1) |
334 | LD DE,(FATVAR.NumSecFAT1) |
333 | LD BC,(NumSecFAT1 + 2) |
335 | LD BC,(FATVAR.NumSecFAT1 + 2) |
334 | CALL LOADLST |
336 | CALL LOADLST |
335 | POP BC |
337 | POP BC |
336 | LD A,B |
338 | LD A,B |
337 | AND 1 |
339 | AND 1 |
338 | LD B,A |
340 | LD B,A |
339 | ADD HL,BC |
341 | ADD HL,BC |
340 | LD B,(HL) |
342 | LD B,(HL) |
341 | INC HL |
343 | INC HL |
342 | LD A,H |
344 | LD A,H |
343 | CP HIGH (BUF_512) + 2 |
345 | CP HIGH (BUF_512_) + 2 |
344 | JR NZ,.L4 |
346 | JR NZ,.L4 |
345 | PUSH BC |
347 | PUSH BC |
346 | LD BC,0 |
348 | LD BC,0 |
347 | INC DE |
349 | INC DE |
348 | CALL LOADLST |
350 | CALL LOADLST |
Line 369... | Line 371... | ||
369 | REALSEC LD A,B |
371 | REALSEC LD A,B |
370 | OR C |
372 | OR C |
371 | OR D |
373 | OR D |
372 | OR E |
374 | OR E |
373 | JR NZ,REALSE1 |
375 | JR NZ,REALSE1 |
374 | LD DE,(NumSecRootDir) |
376 | LD DE,(FATVAR.NumSecRootDir) |
375 | LD BC,(NumSecRootDir + 2) |
377 | LD BC,(FATVAR.NumSecRootDir + 2) |
376 | RET |
378 | RET |
377 | 379 | ||
378 | REALSE1 LD HL,0xFFFE |
380 | REALSE1 LD HL,0xFFFE |
379 | EX DE,HL |
381 | EX DE,HL |
380 | ADD HL,DE |
382 | ADD HL,DE |
381 | EX DE,HL |
383 | EX DE,HL |
382 | INC HL |
384 | INC HL |
383 | ADC HL,BC ; номер кластера - 2 |
385 | ADC HL,BC ; номер кластера - 2 |
384 | LD A,(SecPerClus) |
386 | LD A,(FATVAR.SecPerClus) |
385 | JR REALSE2 |
387 | JR REALSE2 |
386 | 388 | ||
387 | REALSE3 SLA E |
389 | REALSE3 SLA E |
388 | RL D |
390 | RL D |
389 | RL L |
391 | RL L |
390 | RL H |
392 | RL H |
391 | REALSE2 RRCA |
393 | REALSE2 RRCA |
392 | JR NC,REALSE3 ; умножили на размер кластера |
394 | JR NC,REALSE3 ; умножили на размер кластера |
393 | LD B,H |
395 | LD B,H |
394 | LD C,L |
396 | LD C,L |
395 | LD HL,FirstSecData |
397 | LD HL,FATVAR.FirstSecData |
396 | JP BCDEHLP ; прибавили смещение от начала раздела |
398 | JP BCDEHLP ; прибавили смещение от начала раздела |
397 | 399 | ||
398 | ; BCDE / 512 |
400 | ; BCDE / 512 |
399 | BCDE200 LD E,D |
401 | BCDE200 LD E,D |
400 | LD D,C |
402 | LD D,C |