Subversion Repositories pentevo

Rev

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