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 |