Rev 961 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
507 | savelij | 1 | |
1120 | savelij | 2 | ; LAST UPDATE: 10.02.2024 savelij |
507 | savelij | 3 | |
1120 | savelij | 4 | include macros.a80 |
5 | include define.a80 |
||
6 | include global_vars.a80 |
||
7 | include ports_ngs.a80 |
||
8 | include sdcomand.a80 |
||
9 | include ports_ide.a80 |
||
10 | include nums_devices.a80 |
||
11 | include fat_dir.a80 |
||
680 | savelij | 12 | |
1120 | savelij | 13 | INIT_VAR DRV_VAR |
14 | SETVAR BUF_512_, 0x200 ; буфер сектора |
||
961 | savelij | 15 | include ../../fat_vars.a80 |
1120 | savelij | 16 | SETVAR_ALIGN |
17 | SUBVAR (WORD + WORD + BYTE + BYTE) |
||
18 | SETVAR LENGHT, WORD ; длина файла в байтах |
||
19 | SETVAR LOADSCS1, WORD ; адрес вызываемого драйвера |
||
20 | SETVAR MAS_SLA, BYTE ; маска для MASTER/SLAVE |
||
21 | SETVAR NUM_DEVICE, BYTE ; номер устройства для запуска кода |
||
680 | savelij | 22 | |
1120 | savelij | 23 | ORG INITVAR |
24 | |||
25 | ; на входе: A - номер выбранного устройства |
||
26 | ; BCDE - номер кластера запускаемого файла |
||
507 | savelij | 27 | DI |
28 | LD A,(NUM_DEVICE) |
||
831 | savelij | 29 | CP _SD_SDZ |
1120 | savelij | 30 | LD HL,READ_ZSD ; драйвер SD ZC карты |
507 | savelij | 31 | JR Z,SETLOADER |
831 | savelij | 32 | CP _SD_SDG |
1120 | savelij | 33 | LD HL,READ_NEOGS ; драйвер SD NGS карты |
507 | savelij | 34 | JR Z,SETLOADER |
831 | savelij | 35 | CP _HDD_NEMO_MASTER |
1120 | savelij | 36 | LD HL,RD_HDD_NEMO ; драйвер HDD NEMO |
37 | IFDEF ALL_DRVS |
||
507 | savelij | 38 | JR Z,SETLOADER |
831 | savelij | 39 | CP _HDD_SMUC_MASTER |
1120 | savelij | 40 | LD HL,RD_HDD_SMUC ; драйвер HDD SMUC |
585 | savelij | 41 | JR Z,SETLOADER |
831 | savelij | 42 | CP _HDD_DIVIDE_MASTER |
1120 | savelij | 43 | LD HL,RD_HDD_DIVIDE ; драйвер HDD DIVIDE |
585 | savelij | 44 | JR Z,SETLOADER |
1120 | savelij | 45 | LD HL,RD_HDD_PROFI ; драйвер HDD PROFI |
46 | ENDIF |
||
47 | SETLOADER LD (LOADSCS1),HL ; установили адрес читалки секторов |
||
507 | savelij | 48 | LD A,(MAS_SLA) |
49 | AND A |
||
1120 | savelij | 50 | LD A,0xE0 |
507 | savelij | 51 | JR Z,SETMASL |
1120 | savelij | 52 | LD A,0xF0 |
507 | savelij | 53 | SETMASL LD (MAS_SLA),A |
1120 | savelij | 54 | LD BC,(FILE_SRC + _DIR_FstClusHI) |
961 | savelij | 55 | LD (AFILCLS+2),BC |
1120 | savelij | 56 | LD DE,(FILE_SRC + _DIR_FstClusLO) |
961 | savelij | 57 | LD (AFILCLS),DE |
1120 | savelij | 58 | LD A,(FILE_SRC + _DIR_Ext + 1) |
706 | Dimkam | 59 | CP "P" |
1120 | savelij | 60 | JP Z,RUNSPG2 ; переход на запуск SPG файла |
706 | Dimkam | 61 | CP "N" |
1120 | savelij | 62 | JP Z,RUNSNA ; переход на запуск SNA файла |
63 | CALL REALSEC ; преобразовали в номер сектора |
||
64 | CALL LOADLST ; загрузили в буфер |
||
507 | savelij | 65 | EXX |
1120 | savelij | 66 | LD HL,(BUF_512_ + _DIR_Ext + 1) |
67 | LD (0x5D45),HL ; адрес старта кода |
||
68 | LD HL,(BUF_512_ + _DIR_Attr) |
||
69 | LD (LENGHT),HL ; установка длины файла в байтах |
||
70 | LD DE,0x11 |
||
71 | ADD HL,DE ; пропуск HOBETA заголовка |
||
507 | savelij | 72 | LD A,L |
73 | AND A |
||
1120 | savelij | 74 | JR Z,READ01 ; если младший байт не 0 |
75 | INC H ; старший +1 |
||
507 | savelij | 76 | READ01 LD A,H |
1120 | savelij | 77 | SRL A ; делим на 2 ибо на FAT сектор 512 байт |
78 | ADC A,0 ; учитываем чет/нечет |
||
79 | DEC A ; первый сектор загружен, грузить на 1 меньше |
||
507 | savelij | 80 | EXX |
1120 | savelij | 81 | JP Z,LDIRBUF ; если сектор 1 перенос и запуск |
961 | savelij | 82 | DEC A |
1120 | savelij | 83 | LD IXL,A ; запомнили количество секторов - 1 |
84 | JP Z,READ08 ; если файл влез в 2 сектора |
||
507 | savelij | 85 | EXX |
1120 | savelij | 86 | CALL LD_ONES ; перенос остатков первого сектора |
87 | PUSH DE ; адрес куда далее грузить |
||
507 | savelij | 88 | EXX |
1120 | savelij | 89 | LD HL,1 ; один сектор уже загружен |
90 | ADD HL,DE ; далее грузить со следующего сектора |
||
507 | savelij | 91 | EX DE,HL |
92 | JR NC,READ04 |
||
1120 | savelij | 93 | INC BC ; BCDE = BCDE + 1 |
94 | READ04 POP HL ; в HL адрес для продолжения загрузки |
||
95 | LD IY,(SecPerClus) ; LY = количество секторов в кластере |
||
507 | savelij | 96 | LD A,IXL |
1120 | savelij | 97 | CP IYL ; секторов осталось меньше чем в кластере |
98 | JR C,READ02 ; переход на дозагрузку остатка секторов |
||
507 | savelij | 99 | INC IXL |
100 | LD A,IYL |
||
101 | CP 2 |
||
102 | JR C,READ07 |
||
103 | DEC A |
||
104 | JR READ05 |
||
105 | |||
106 | READ07 PUSH HL |
||
961 | savelij | 107 | LD DE,(AFILCLS) |
108 | LD BC,(AFILCLS + 2) |
||
1120 | savelij | 109 | CALL RD_NEXT_CLUSTER ; получить номер следующего кластера |
961 | savelij | 110 | LD (AFILCLS),DE |
111 | LD (AFILCLS + 2),BC |
||
1120 | savelij | 112 | CALL CHECK_LAST_CLUSTER ; проверка на окончание FAT цепочки |
507 | savelij | 113 | POP HL |
1120 | savelij | 114 | JR C,RUNLOAD ; если кластера закончились, то запуск загруженного |
507 | savelij | 115 | PUSH HL |
1120 | savelij | 116 | CALL REALSEC ; преобразование номера кластера в номер сектора |
507 | savelij | 117 | POP HL |
1120 | savelij | 118 | LD A,IXL ; сколько секторов осталось загрузить |
119 | CP IYL ; сравниваем с размером кластера |
||
120 | JR C,READ02 ; если осталось загрузить секторов меньше чем в кластере, то дозагружаем остаток |
||
121 | LD A,IYL ; сколько секторов загружать |
||
122 | READ05 CALL LOADSCS ; загрузка секторов |
||
123 | LD A,IXL ; сколько секторов всего загружать |
||
124 | SUB IYL ; минус сколько секторов только что загрузили |
||
125 | JR Z,RUNLOAD ; сектора кончились, переходим на запуск |
||
126 | LD IXL,A ; сколько секторов осталось загрузить |
||
127 | JR READ07 ; продолжаем загрузку |
||
507 | savelij | 128 | |
961 | savelij | 129 | ; размер кода в Hobeta менее 2 секторов |
130 | ; копируем хвост первого сектора и догружаем из второго с переносом |
||
131 | READ08 EXX |
||
132 | CALL LD_ONES |
||
133 | PUSH DE |
||
134 | EXX |
||
135 | POP HL |
||
136 | LD IXL,1 |
||
137 | JR READ03 |
||
138 | |||
1120 | savelij | 139 | ; загрузка количества секторов, если осталось менее размера кластера |
507 | savelij | 140 | READ02 AND A |
141 | JR Z,READ03 |
||
142 | CALL LOADSCS |
||
143 | READ03 PUSH HL |
||
144 | LD A,IXL |
||
145 | LD L,A |
||
146 | LD H,0 |
||
147 | ADD HL,DE |
||
148 | EX DE,HL |
||
149 | JR NC,READ06 |
||
150 | INC BC |
||
151 | READ06 CALL LOADLST |
||
152 | LD BC,(LENGHT) |
||
153 | EX DE,HL |
||
1120 | savelij | 154 | LD HL,0x11 |
507 | savelij | 155 | ADD HL,BC |
156 | LD B,H |
||
157 | LD C,L |
||
158 | EX DE,HL |
||
159 | POP DE |
||
160 | LD A,B |
||
161 | AND 1 |
||
162 | LD B,A |
||
605 | savelij | 163 | OR C |
164 | JR Z,RUNLOAD |
||
507 | savelij | 165 | LDIR |
1120 | savelij | 166 | ; запуск загруженного |
167 | RUNLOAD LD HL,0x2758 |
||
507 | savelij | 168 | EXX |
1120 | savelij | 169 | LD IY,0x5C3A |
507 | savelij | 170 | EI |
1120 | savelij | 171 | JP 0x1B7D ; запуск перенесенной бейсик проги |
507 | savelij | 172 | |
1120 | savelij | 173 | LDIRBUF LD HL,0x200 - 0x11 |
174 | LD DE,(BUF_512_ + 0x0B) |
||
507 | savelij | 175 | AND A |
176 | SBC HL,DE |
||
177 | JR NC,LDIRBUF1 |
||
178 | CALL LD_ONES |
||
179 | JP RUNLOAD |
||
180 | |||
1120 | savelij | 181 | LDIRBUF1 LD HL,BUF_512_ + 0x11 |
182 | LD DE,(BUF_512_ + 9) |
||
183 | LD BC,(BUF_512_ + 0x0B) |
||
507 | savelij | 184 | LDIR |
185 | JP RUNLOAD |
||
186 | |||
1120 | savelij | 187 | ; перенос куска из уже загруженного сектора, если файл = 501 байт и менее |
188 | LD_ONES LD HL,BUF_512_ + 0x11 |
||
189 | LD DE,(BUF_512_ + 9) |
||
190 | LD BC,0x200-0x11 |
||
507 | savelij | 191 | LDIR |
192 | RET |
||
193 | |||
1120 | savelij | 194 | ; загрузить сектора с выбранного устройства |
507 | savelij | 195 | LOADSCS PUSH HL |
196 | LD HL,(LOADSCS1) |
||
197 | EX (SP),HL |
||
198 | RET |
||
199 | |||
961 | savelij | 200 | ; чтение файла |
201 | ; BCDE - номер кластера откуда грузить |
||
202 | ; IXL - размер кластера |
||
203 | ; IXH - временные переменные |
||
204 | ; IYL - количество секторов для загрузки |
||
205 | ; IYH - смещение в кластере |
||
1120 | savelij | 206 | LOAD_FILE PUSH BC ; старшие 16 бит номера кластера |
207 | PUSH DE ; младшие 16 бит номера кластера |
||
208 | PUSH HL ; сохранили адрес загрузки |
||
209 | CALL REALSEC ; перевели номер кластера в номер сектора |
||
961 | savelij | 210 | LD IX,(SecPerClus) |
1120 | savelij | 211 | LD A,IYH ; смещение в кластере |
507 | savelij | 212 | LD L,A |
213 | LD H,0 |
||
214 | ADD HL,DE |
||
215 | EX DE,HL |
||
1120 | savelij | 216 | JR NC,.L1 |
217 | INC BC ; BCDE = номер сектора откуда грузить |
||
218 | .L1 LD A,IYL ; количество секторов для загрузки |
||
219 | CP IXL ; размер кластера |
||
220 | JP C,.L2 |
||
221 | LD A,IXL ; размер кластера |
||
222 | .L2 ADD A,IYH ; смещение в кластере |
||
223 | CP IXL ; размер кластера |
||
224 | LD A,IYL ; количество секторов для загрузки |
||
225 | JP C,.L5 |
||
226 | LD A,IXL ; размер кластера |
||
227 | SUB IYH ; смещение в кластере |
||
228 | .L5 LD IXH,A ; TEMP VAR, сколько секторов сейчас грузим |
||
229 | POP HL ; восстановили адрес загрузки |
||
230 | CALL LOADSCS ; загрузили сектора |
||
507 | savelij | 231 | POP DE |
1120 | savelij | 232 | POP BC ; восстановили номер кластера |
233 | LD A,IYH ; смещение в кластере |
||
234 | ADD A,IXH ; TEMP VAR |
||
235 | CP IXL ; размер кластера |
||
236 | JP C,.L3 |
||
237 | SUB IXL ; размер кластера |
||
238 | .L3 LD IYH,A ; смещение в кластере |
||
239 | JP C,.L4 |
||
240 | PUSH HL ; сохранили адрес загрузки |
||
241 | CALL RD_NEXT_CLUSTER ; прочитали номер следующего кластера |
||
242 | CALL CHECK_LAST_CLUSTER ; проверили, а может это последний кластер? |
||
243 | POP HL ; восстановили адрес загрузки |
||
244 | RET C ; если последний, выходим |
||
245 | .L4 LD A,IYL ; количество секторов для загрузки |
||
246 | SUB IXH ; TEMP VAR |
||
507 | savelij | 247 | RET Z |
1120 | savelij | 248 | LD IYL,A ; количество секторов для загрузки |
249 | JP NZ,LOAD_FILE |
||
507 | savelij | 250 | RET |
251 | |||
1120 | savelij | 252 | ; проверка номера кластера |
253 | CHECK_LAST_CLUSTER |
||
254 | LD A,(FATType) |
||
507 | savelij | 255 | AND A |
1120 | savelij | 256 | JR NZ,.L1 |
257 | LD HL,0x0FF7 |
||
507 | savelij | 258 | SBC HL,DE |
259 | RET |
||
260 | |||
1120 | savelij | 261 | .L1 DEC A |
262 | JR NZ,.L2 |
||
263 | LD HL,0xFFF7 |
||
507 | savelij | 264 | SBC HL,DE |
265 | RET |
||
266 | |||
1120 | savelij | 267 | .L2 LD HL,0x0FFF |
507 | savelij | 268 | SBC HL,BC |
269 | RET NZ |
||
1120 | savelij | 270 | LD HL,0xFFF7 |
507 | savelij | 271 | SBC HL,DE |
272 | RET |
||
273 | |||
1120 | savelij | 274 | ; чтение следующего кластера |
275 | RD_NEXT_CLUSTER LD A,(FATType) |
||
507 | savelij | 276 | AND A |
1120 | savelij | 277 | JR Z,.L1 |
507 | savelij | 278 | DEC A |
1120 | savelij | 279 | JR Z,.L2 |
507 | savelij | 280 | EX DE,HL |
281 | ADD HL,HL |
||
282 | EX DE,HL |
||
283 | LD HL,0 |
||
284 | ADC HL,BC |
||
1120 | savelij | 285 | ADD HL,BC ; HLDE = BCDE * 2 |
507 | savelij | 286 | LD A,E |
287 | LD E,D |
||
288 | LD D,L |
||
289 | LD C,H |
||
290 | LD B,0 |
||
1120 | savelij | 291 | CALL .L3 |
507 | savelij | 292 | INC HL |
293 | LD C,(HL) |
||
294 | INC HL |
||
295 | LD B,(HL) |
||
296 | RET |
||
297 | |||
1120 | savelij | 298 | .L2 LD BC,0 |
507 | savelij | 299 | LD A,E |
300 | LD E,D |
||
301 | LD D,C |
||
1120 | savelij | 302 | .L3 PUSH AF |
507 | savelij | 303 | PUSH BC |
961 | savelij | 304 | LD HL,NumSecFAT1 |
507 | savelij | 305 | CALL BCDEHLP |
306 | CALL LOADLST |
||
307 | POP BC |
||
308 | POP AF |
||
309 | LD E,A |
||
310 | LD D,0 |
||
311 | ADD HL,DE |
||
312 | ADD HL,DE |
||
313 | LD E,(HL) |
||
314 | INC HL |
||
315 | LD D,(HL) |
||
961 | savelij | 316 | RET |
507 | savelij | 317 | |
1120 | savelij | 318 | .L1 LD H,D |
507 | savelij | 319 | LD L,E |
320 | ADD HL,HL |
||
321 | ADD HL,DE |
||
322 | SRL H |
||
323 | RR L |
||
324 | LD A,E |
||
325 | LD E,H |
||
326 | LD D,0 |
||
327 | LD B,D |
||
328 | LD C,D |
||
329 | SRL E |
||
330 | PUSH AF |
||
331 | PUSH HL |
||
961 | savelij | 332 | LD DE,(NumSecFAT1) |
333 | LD BC,(NumSecFAT1 + 2) |
||
507 | savelij | 334 | CALL LOADLST |
335 | POP BC |
||
336 | LD A,B |
||
337 | AND 1 |
||
338 | LD B,A |
||
339 | ADD HL,BC |
||
340 | LD B,(HL) |
||
341 | INC HL |
||
342 | LD A,H |
||
1120 | savelij | 343 | CP HIGH (BUF_512) + 2 |
344 | JR NZ,.L4 |
||
507 | savelij | 345 | PUSH BC |
346 | LD BC,0 |
||
347 | INC DE |
||
348 | CALL LOADLST |
||
349 | POP BC |
||
1120 | savelij | 350 | .L4 POP AF |
507 | savelij | 351 | LD D,(HL) |
352 | LD E,B |
||
353 | LD BC,0 |
||
354 | RRA |
||
1120 | savelij | 355 | JR NC,.L5 |
961 | savelij | 356 | REPT 4 |
507 | savelij | 357 | SRL D |
358 | RR E |
||
961 | savelij | 359 | ENDM |
1120 | savelij | 360 | .L5 LD A,D |
361 | AND 0x0F |
||
507 | savelij | 362 | LD D,A |
961 | savelij | 363 | RET |
507 | savelij | 364 | |
1120 | savelij | 365 | ; преобразование номера кластера |
366 | ; вычисление реального сектора |
||
367 | ; на входе: BCDE = номер кластера |
||
368 | ; на выходе: BCDE = номер сектора |
||
961 | savelij | 369 | REALSEC LD A,B |
507 | savelij | 370 | OR C |
371 | OR D |
||
372 | OR E |
||
373 | JR NZ,REALSE1 |
||
961 | savelij | 374 | LD DE,(NumSecRootDir) |
375 | LD BC,(NumSecRootDir + 2) |
||
376 | RET |
||
507 | savelij | 377 | |
1120 | savelij | 378 | REALSE1 LD HL,0xFFFE |
507 | savelij | 379 | EX DE,HL |
380 | ADD HL,DE |
||
381 | EX DE,HL |
||
382 | INC HL |
||
1120 | savelij | 383 | ADC HL,BC ; номер кластера - 2 |
961 | savelij | 384 | LD A,(SecPerClus) |
385 | JR REALSE2 |
||
507 | savelij | 386 | |
961 | savelij | 387 | REALSE3 SLA E |
507 | savelij | 388 | RL D |
389 | RL L |
||
390 | RL H |
||
961 | savelij | 391 | REALSE2 RRCA |
1120 | savelij | 392 | JR NC,REALSE3 ; умножили на размер кластера |
507 | savelij | 393 | LD B,H |
394 | LD C,L |
||
961 | savelij | 395 | LD HL,FirstSecData |
1120 | savelij | 396 | JP BCDEHLP ; прибавили смещение от начала раздела |
507 | savelij | 397 | |
1120 | savelij | 398 | ; BCDE / 512 |
507 | savelij | 399 | BCDE200 LD E,D |
400 | LD D,C |
||
401 | LD C,B |
||
402 | LD B,0 |
||
403 | LD A,2 |
||
404 | JR BCDE_A |
||
405 | |||
1120 | savelij | 406 | ; BCDE >> A = BCDE |
507 | savelij | 407 | BCDE_A1 SRL B |
408 | RR C |
||
409 | RR D |
||
410 | RR E |
||
411 | BCDE_A RRCA |
||
412 | JR NC,BCDE_A1 |
||
413 | RET |
||
414 | |||
1120 | savelij | 415 | ; (ADR) - BCDE = BCDE |
507 | savelij | 416 | BCDEHLM LD A,(HL) |
417 | INC HL |
||
418 | SUB E |
||
419 | LD E,A |
||
420 | LD A,(HL) |
||
421 | INC HL |
||
422 | SBC A,D |
||
423 | LD D,A |
||
424 | LD A,(HL) |
||
425 | INC HL |
||
426 | SBC A,C |
||
427 | LD C,A |
||
428 | LD A,(HL) |
||
429 | SBC A,B |
||
430 | LD B,A |
||
431 | RET |
||
432 | |||
1120 | savelij | 433 | ; (ADR) + BCDE = BCDE |
507 | savelij | 434 | BCDEHLP LD A,(HL) |
435 | INC HL |
||
436 | ADD A,E |
||
437 | LD E,A |
||
438 | LD A,(HL) |
||
439 | INC HL |
||
440 | ADC A,D |
||
441 | LD D,A |
||
442 | LD A,(HL) |
||
443 | INC HL |
||
444 | ADC A,C |
||
445 | LD C,A |
||
446 | LD A,(HL) |
||
447 | ADC A,B |
||
448 | LD B,A |
||
449 | RET |
||
450 | |||
1120 | savelij | 451 | ; HLDE + BC = HLDE |
507 | savelij | 452 | HLDEPBC EX DE,HL |
453 | ADD HL,BC |
||
454 | EX DE,HL |
||
455 | LD BC,0 |
||
456 | ADC HL,BC |
||
457 | RET |
||
458 | |||
1120 | savelij | 459 | ; загрузка сектора в буфер |
573 | savelij | 460 | LOADLST LD HL,BUF_512_ |
507 | savelij | 461 | PUSH HL |
462 | LD A,1 |
||
463 | CALL LOADSCS |
||
464 | POP HL |
||
465 | RET |
||
466 | |||
680 | savelij | 467 | include drivers/drv_zc.a80 |
468 | include drivers/drv_neogs.a80 |
||
469 | include drivers/drv_nemo.a80 |
||
1120 | savelij | 470 | IFDEF ALL_DRVS |
680 | savelij | 471 | include drivers/drv_smuc.a80 |
472 | include drivers/drv_divide.a80 |
||
473 | include drivers/drv_profi.a80 |
||
1120 | savelij | 474 | ENDIF |
680 | savelij | 475 | include spg2_run.a80 |
706 | Dimkam | 476 | include sna_run.a80 |