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