Subversion Repositories ngs

Rev

Rev 115 | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 115 Rev 181
Line 1... Line 1...
1
 
1
 
2
;LAST UPDATE: 24.04.2014 savelij
2
; LAST UPDATE: 11.12.2024 savelij
3
 
3
 
4
                include ../macros.a80
4
                include ../macros.a80
5
                include ../ports_ngs.a80
5
                include ../ports_ngs.a80
6
                include ../sdcomand.a80
6
                include ../sdcomand.a80
7
 
7
 
8
;АДРЕС ЗАГРУЗКИ НАЙДЕННОЙ ПРОШИВКИ
8
; адрес загрузки найденной прошивки
9
ADRLOAD         EQU 0X8000
9
ADRLOAD         EQU 0x8000
10
 
10
 
11
RAMCOD          EQU 0X4080                      ;АДРЕС РАБОТЫ ОСНОВНОГО КОДА
11
RAMCOD          EQU 0x4080                      ; адрес работы основного кода
12
RAM8KB          EQU 0X6000                      ;АДРЕС БУФЕРА ДЛЯ ПЕРЕБРОСКИ КОДА
12
RAM8KB          EQU 0x6000                      ; адрес буфера для переброски кода
13
STRPAG          EQU 0X8000                      ;АДРЕС КУДА ЗАГРУЗКИ
13
STRPAG          EQU 0x8000                      ; адрес куда загрузки
14
 
14
 
15
FREQUENCY       EQU C_20MHZ                     ;ТЕКУЩАЯ ЧАСТОТА ДЛЯ ОСНОВНОЙ ПРОШИВКИ
15
FREQUENCY       EQU C_20MHZ                     ; текущая частота для основной прошивки
16
 
16
 
17
                ORG 0
17
                ORG 0
18
                DI
18
                DI
19
                LD SP,RAMCOD
19
                LD SP,RAMCOD
20
                XOR A
20
                XOR A
Line 23... Line 23...
23
                OUT (VOL3),A
23
                OUT (VOL3),A
24
                OUT (VOL4),A
24
                OUT (VOL4),A
25
                OUT (VOL5),A
25
                OUT (VOL5),A
26
                OUT (VOL6),A
26
                OUT (VOL6),A
27
                OUT (VOL7),A
27
                OUT (VOL7),A
28
                OUT (VOL8),A                    ;ЗАГЛУШИЛИ МОД ПОРТЫ ДЛЯ ИСПОЛЬЗОВАНИЯ БУФЕРА
28
                OUT (VOL8),A                    ; заглушили мод порты для использования буфера
29
 
29
 
30
;               JP RDBYT_DBG                    ;ОТЛАДОЧНАЯ ФИГНЯ
30
;               JP RDBYT_DBG                    ; отладочная фигня
31
 
31
 
32
;ОЖИДАНИЕ ЗАГРУЗКИ ПРОШИВКИ СО СПЕКА
32
; ожидание загрузки прошивки со спека
33
                LD B,0                          ;ЧИТАЕМ 256 ПОРТ СТАТУСА
33
                LD B,0                          ; читаем 256 порт статуса
34
                IN A,(ZXSTAT)                   ;НА ПРЕДМЕТ ИЗМЕНЕНИЯ СОСТОЯНИЯ 
34
.L1             IN A,(ZXSTAT)                   ; на предмет изменения состояния 
35
                RRA
35
                RRA
36
                JR C,RDBYT01
36
                JR C,RDBYT01
37
                DJNZ $-5
37
                DJNZ .L1
38
                DEC B                           ;СЧЕТЧИК ОБНУЛИЛСЯ, СОСТОЯНИЕ ПОРТА НЕ ИЗМЕНИЛОСЬ
38
                DEC B                           ; счетчик обнулился, состояние порта не изменилось
39
                JR RDBYT03                      ;ГРУЗИМ СТАНДАРТНУЮ ПРОШИВКУ
39
                JR RDBYT03                      ; грузим стандартную прошивку
40
 
40
 
41
RDBYT01         IN A,(ZXCMD)                    ;ЧИТЕМ ПРИШЕДШИЙ БАЙТ ИЗ ПОРТА КОМАНД
41
RDBYT01         IN A,(ZXCMD)                    ; читем пришедший байт из порта команд
42
                LD C,A                          ;СОХРАНИЛИ ДЛЯ ПРОВЕРКИ
42
                LD C,A                          ; сохранили для проверки
43
                IN A,(ZXDATRD)                  ;ЧИТЕМ БАЙТ ИЗ ПОРТА ДАННЫХ
43
                IN A,(ZXDATRD)                  ; читем байт из порта данных
44
                OUT (CLRCBIT),A                 ;СБРОСИЛИ КОМАНД БИТ
44
                OUT (CLRCBIT),A                 ; сбросили команд бит
45
                CP C                            ;СРАВНИВАЕМ ПРИШЕДШИЕ БАЙТЫ
45
                CP C                            ; сравниваем пришедшие байты
46
                JR NZ,RDBYT03                   ;НЕ СОВПАЛИ, ГРУЗИМ СТАНДАРТНУЮ ПРОШИВКУ
46
                JR NZ,RDBYT03                   ; не совпали, грузим стандартную прошивку
47
                CP 0X55                         ;ПРИШЕЛ БАЙТ 0X55?
47
                CP 0x55                         ; пришел байт 0x55?
48
                JR NZ,RDBYT03                   ;ЕСЛИ НЕТ, ГРУЗИМ СТАНДАРТНУЮ ПРОШИВКУ
48
                JR NZ,RDBYT03                   ; если нет, грузим стандартную прошивку
49
                LD B,0                          ;ЧИТАЕМ 256 РАЗ ИЗМЕНЕНИЕ ПОРТА КОМАНД
49
                LD B,0                          ; читаем 256 раз изменение порта команд
50
                IN A,(ZXSTAT)
50
                IN A,(ZXSTAT)
51
                RRA
51
                RRA
52
                JR C,RDBYT02
52
                JR C,RDBYT02
53
                DJNZ $-5
53
                DJNZ $-5
54
                DEC B
54
                DEC B
55
                JR RDBYT03                      ;НЕ ДОЖДАЛИСЬ, ГРУЗИМ СТАНДАРТНУЮ ПРОШИВКУ
55
                JR RDBYT03                      ; не дождались, грузим стандартную прошивку
56
 
56
 
57
RDBYT02         IN A,(ZXCMD)                    ;ЗАБРАЛИ БАЙТ ИЗ ПОРТА КОМАНД
57
RDBYT02         IN A,(ZXCMD)                    ; забрали байт из порта команд
58
                LD C,A                          ;СОХРАНИЛИ ДЛЯ ПРОВЕРКИ
58
                LD C,A                          ; сохранили для проверки
59
                IN A,(ZXDATRD)                  ;ЗАБРАЛИ БАЙТ ИЗ ПОРТА ДАННЫХ
59
                IN A,(ZXDATRD)                  ; забрали байт из порта данных
60
                CP C                            ;СРАВНИЛИ
60
                CP C                            ; сравнили
61
                JR NZ,RDBYT03                   ;ЕСЛИ НЕ СОВПАДАЮТ, ГРУЗИМ СТАНДАРТНУЮ ПРОШИВКУ
61
                JR NZ,RDBYT03                   ; если не совпадают, грузим стандартную прошивку
62
RDBYT_DBG       CP 0XAA                         ;ЭТО 0XAA?
62
RDBYT_DBG       CP 0xAA                         ; это 0xAA?
63
RDBYT03         EX AF,AF'                       ;ВРЕМЕННО СПРЯТАЛИ ФЛАГИ ПРОЦЕССОРА
63
RDBYT03         EX AF,AF'                       ; временно спрятали флаги процессора
64
                LD HL,GRUZILA
64
                LD HL,GRUZILA
65
                LD DE,RAMCOD
65
                LD DE,RAMCOD
66
                LD BC,RAMCEND-VERLOAD
66
                LD BC,RAMCEND-VERLOAD
67
                LDIR                            ;ПЕРЕНЕСЛИ ОСНОВНОЙ КОД В АДРЕС РАБОТЫ
67
                LDIR                            ; перенесли основной код в адрес работы
68
                OUT (CLRCBIT),A                 ;СБРОСИЛИ КОМАНД БИТ
68
                OUT (CLRCBIT),A                 ; сбросили команд бит
69
                EX AF,AF'                       ;ВЕРНУЛИ СПРЯТАННЫЕ ФЛАГИ
69
                EX AF,AF'                       ; вернули спрятанные флаги
70
                JP Z,GRUZIM2                    ;ЕСЛИ ВСЕ УСЛОВИЯ СОВПАЛИ, ЗАПУСКАЕМ ЗАГРУЗЧИК
70
                JP Z,GRUZIM2                    ; если все условия совпали, запускаем загрузчик
71
                JP GRUZIM0                      ;ИНАЧЕ ГРУЗИМ СТАНДАРТНУЮ ПРОШИВКУ ИЗ ПЗУ
71
                JP GRUZIM0                      ; иначе грузим стандартную прошивку из пзу
72
 
72
 
73
GRUZILA
73
GRUZILA
74
                PHASE RAMCOD
74
                PHASE RAMCOD
75
 
75
 
76
VERLOAD         DB "Loader"
76
VERLOAD         DB "Loader"
77
                DW DATA_VERS
77
                DW DATA_VERS
78
 
78
 
79
;ПУТЬ ДО ФАЙЛА ПРОШИВКИ GS
79
; путь до файла прошивки GS
80
F_PATH          DB "NEOGS.ROM",0
80
F_PATH          DB "NEOGS.ROM",0
81
 
81
 
82
UPDATENAME      DB "NGS_ROM.UPD",0
82
UPDATENAME      DB "NGS_ROM.UPD",0
83
 
83
 
84
TXT1            DB "not found",0
84
TXT1            DB "not found",0
Line 86... Line 86...
86
TXT2            DB "beta",0
86
TXT2            DB "beta",0
87
TXT2E
87
TXT2E
88
TXT3            DB 0;"stable",0
88
TXT3            DB 0;"stable",0
89
TXT3E
89
TXT3E
90
 
90
 
91
GRUZIM0         CALL RROMSD                     ;ЗАГРУЖАЕМ И ЗАПУСКАЕМ ПРОШИВКУ С SD КАРТЫ, ЕСЛИ ОНА ТАМ ЕСТЬ
91
GRUZIM0         CALL RROMSD                     ; загружаем и запускаем прошивку с SD карты, если она там есть
92
                JP GS105                        ;ИНАЧЕ ЗАГРУЖАЕМ ПРОШИВКУ ИЗ ПЗУ И ЗАПУСКАЕМ
92
                JP GS105                        ; иначе загружаем прошивку из пзу и запускаем
93
 
93
 
94
GRUZIM2         LD A,0X11                       ;КОНФИГУРИМ НГС
94
GRUZIM2         LD A,0x11                       ; конфигурим НГС
95
                LD (NGS_MODES),A
95
                LD (NGS_MODES),A
96
                OUT (GSCFG0),A                  ;ОТРУБАЕМ ПЗУ И ВРУБАЕМ ЧАСТОТУ 12МГЦ
96
                OUT (GSCFG0),A                  ; отрубаем пзу и врубаем частоту 12МГЦ
97
                XOR A
97
                XOR A
98
                OUT (MPAG),A                    ;ВКЛЮЧАЕМ СТРАНИЦУ 0
98
                OUT (MPAG),A                    ; включаем страницу 0
99
GRUZIM          IN A,(ZXSTAT)                   ;ПОСТОЯННО ЖДЕМ КОМАНД ОТ СПЕКА
99
GRUZIM          IN A,(ZXSTAT)                   ; постоянно ждем команд от спека
100
                RRA
100
                RRA
101
                JR NC,GRUZIM
101
                JR NC,GRUZIM
102
                IN A,(ZXCMD)                    ;ПОЙМАЛИ КОМАНДУ
102
                IN A,(ZXCMD)                    ; поймали команду
103
                CP 0X1D                         ;ЭТО КОМАНДА ПРОВЕРКИ? 
103
                CP 0x1D                         ; это команда проверки? 
104
                JR NZ,GRUZIM1
104
                JR NZ,GRUZIM1
105
                LD A,0X76
105
                LD A,0x76
106
                OUT (ZXDATWR),A                 ;ОТДАЕМ БАЙТ ИДЕНТИФИКАЦИИ ЗАГРУЗЧИКА
106
                OUT (ZXDATWR),A                 ; отдаем байт идентификации загрузчика
107
                OUT (CLRCBIT),A
107
                OUT (CLRCBIT),A
108
                JR GRUZIM                       ;И ПРОДОЛЖАЕМ ЖДАТЬ КОМАНД
108
                JR GRUZIM                       ; и продолжаем ждать команд
109
 
109
 
110
GRUZIM1         CP 0XF3
110
GRUZIM1         CP 0xF3
111
                JP Z,GS105                      ;ПРИ ПОСТУПЛЕНИИ КОМАНД 0XF3 И
111
                JP Z,GS105                      ; при поступлении команд 0xF3 и
112
                CP 0XF4
112
                CP 0xF4
113
                JP Z,GS105                      ;0XF4 ЗАГРУЖАЕМ И ЗАПУСКАЕМ ПРОШИВКУ ИЗ ПЗУ
113
                JP Z,GS105                      ; 0xF4 загружаем и запускаем прошивку из пзу
114
                CP LOW (FLOADE-FLOADER)/2+1
114
                CP LOW (FLOADE-FLOADER)/2+1
115
                JP NC,GS105                     ;АНАЛОГИЧНО НЕ КОМАНДА ЗАГРУЗЧИКА ПЕРЕХОДИМ НА ОСНОВНОЕ ПЗУ
115
                JP NC,GS105                     ; аналогично не команда загрузчика переходим на основное пзу
116
                ADD A,A
116
                ADD A,A
117
                LD L,A
117
                LD L,A
118
                LD H,0
118
                LD H,0
119
                LD DE,GRUZIM2
119
                LD DE,GRUZIM2
120
                PUSH DE                         ;НА СТЕКЕ АДРЕС ВОЗВРАТА ПОСЛЕ ИСПОЛНЕНИЯ КОМАНДЫ
120
                PUSH DE                         ; на стеке адрес возврата после исполнения команды
121
                LD DE,FLOADER
121
                LD DE,FLOADER
122
                ADD HL,DE
122
                ADD HL,DE
123
                LD E,(HL)
123
                LD E,(HL)
124
                INC HL
124
                INC HL
125
                LD D,(HL)                       ;ЗАБРАЛИ АДРЕС ИСПОЛНЕНИЯ КОМАНДЫ
125
                LD D,(HL)                       ; забрали адрес исполнения команды
126
                EX DE,HL
126
                EX DE,HL
127
                JP (HL)                         ;ПОЕХАЛИ НА ИСПОЛНЕНИЕ
127
                JP (HL)                         ; поехали на исполнение
128
 
128
 
129
FLOADER         DW LOADROM                      ;00 ЗАГРУЗКА ROM СО СПЕКА ВМЕСТО СКОПИРОВАННОЙ ИЗ ROM
129
FLOADER         DW LOADROM                      ; 00 загрузка rom со спека вместо скопированной из ROM
130
                DW JPLDROM                      ;01 ЗАПУСК ЗАГРУЖЕННОЙ ПРОШИВКИ 
130
                DW JPLDROM                      ; 01 запуск загруженной прошивки 
131
                DW GS105                        ;02 КОПИРОВАНИЕ ИЗ ROM И ЗАПУСК
131
                DW GS105                        ; 02 копирование из ROM и запуск
132
                DW RROMSD                       ;03 ЗАГРУЗКА И ЗАПУСК ROM С SD КАРТЫ
132
                DW RROMSD                       ; 03 загрузка и запуск ROM с SD карты
133
                DW LOADCOD                      ;04 ЗАГРУЗКА КОДА СО СПЕКА
133
                DW LOADCOD                      ; 04 загрузка кода со спека
134
                DW LDINSD                       ;05 ЗАГРУЗКА ФАЙЛА С SD КАРТЫ
134
                DW LDINSD                       ; 05 загрузка файла с SD карты
135
                DW RUNCOD                       ;06 ЗАПУСК КОДА С ЛЮБОГО АДРЕСА И В ЛЮБОЙ СТРАНИЦЕ
135
                DW RUNCOD                       ; 06 запуск кода с любого адреса и в любой странице
136
                DW STATSD                       ;07 СТАТУС ЗАГРУЖЕННОГО ФАЙЛА
136
                DW STATSD                       ; 07 статус загруженного файла
137
                DW VERPAGE                      ;08 ВЕРСИЯ В ТЕКСТОВОМ ВИДЕ ДЛЯ УКАЗАННОЙ СТРАНИЦЕ
137
                DW VERPAGE                      ; 08 версия в текстовом виде для указанной страницы
138
                DW GET_CRC                      ;09 ПОЛУЧИТЬ CRC16
138
                DW GET_CRC                      ; 09 получить CRC16
139
                DW LOADUPDATE                   ;0A ЗАГРУЗКА ФАЙЛА С ОБНОВЛЕНИЕМ
139
                DW LOADUPDATE                   ; 0A загрузка файла с обновлением
140
                DW SET_FREQ                     ;0B УСТАНОВКА ЧАСТОТЫ ПРОЦЕССОРА
140
                DW SET_FREQ                     ; 0B установка частоты процессора
141
FLOADE
141
FLOADE
142
 
142
 
143
SET_FREQ        IN A,(ZXDATRD)                  ;ПРИНЯЛИ НОМЕР ЧАСТОТЫ
143
SET_FREQ        IN A,(ZXDATRD)                  ; приняли номер частоты
144
                BIT 7,A
144
                BIT 7,A
145
                JR NZ,SET_FREQ2
145
                JR NZ,SET_FREQ2
146
                OUT (CLRCBIT),A                 ;СБРОСИЛИ КОМАНД БИТ
146
                OUT (CLRCBIT),A                 ; сбросили команд бит
147
                AND 3
147
                AND 3
148
                LD L,C_10MHZ                    ;УСТАНОВКА ЧАСТОТЫ 10 МГЦ
148
                LD L,C_10MHZ                    ; установка частоты 10 МГЦ
149
                JR Z,SET_FREQ1
149
                JR Z,SET_FREQ1
150
                DEC A
150
                DEC A
151
                LD L,C_12MHZ                    ;УСТАНОВКА ЧАСТОТЫ 12 МГЦ
151
                LD L,C_12MHZ                    ; установка частоты 12 МГЦ
152
                JR Z,SET_FREQ1
152
                JR Z,SET_FREQ1
153
                DEC A
153
                DEC A
154
                LD L,C_20MHZ                    ;УСТАНОВКА ЧАСТОТЫ 20 МГЦ
154
                LD L,C_20MHZ                    ; установка частоты 20 МГЦ
155
                JR Z,SET_FREQ1
155
                JR Z,SET_FREQ1
156
                LD L,C_24MHZ                    ;УСТАНОВКА ЧАСТОТЫ 24 МГЦ
156
                LD L,C_24MHZ                    ; установка частоты 24 МГЦ
157
SET_FREQ1       LD A,(NGS_MODES)
157
SET_FREQ1       LD A,(NGS_MODES)
158
                AND %11001111
158
                AND %11001111
159
                OR L
159
                OR L
160
                LD (NGS_MODES),A
160
                LD (NGS_MODES),A
161
                OUT (GSCFG0),A
161
                OUT (GSCFG0),A
162
                RET
162
                RET
163
 
163
 
164
SET_FREQ2       LD A,(NGS_MODES)
164
SET_FREQ2       LD A,(NGS_MODES)
165
                AND 0X30
165
                AND 0x30
166
                RRCA
166
                RRCA
167
                RRCA
167
                RRCA
168
                RRCA
168
                RRCA
169
                RRCA
169
                RRCA
170
                OUT (CLRCBIT),A
170
                OUT (CLRCBIT),A
171
                OUT (ZXDATWR),A
171
                OUT (ZXDATWR),A
172
                JP WDN
172
                JP WDN
173
 
173
 
174
;ПЕРЕДАЧА НА СПЕК ВЕРСИИ В TXT ВИДЕ
174
; передача на спек версии в текстовом виде
175
VERPAGE         IN A,(ZXDATRD)                  ;ЗАБРАЛИ БАЙТ НОМЕРА ЗАПРОШЕННОЙ СТРАНИЦЫ ПЗУ
175
VERPAGE         IN A,(ZXDATRD)                  ; забрали байт номера запрошенной страницы пзу
176
                AND 7                           ;СТАРШИЕ 5 БИТ В ИГНОРЕ
176
                AND 7                           ; старшие 5 бит в игноре
177
                EX AF,AF'                       ;ВРЕМЕННО СПРЯТАЛИ ФЛАГИ ПРОЦА
177
                EX AF,AF'                       ; временно спрятали флаги проца
178
                LD A,0X30
178
                LD A,0x30
179
                OUT (GSCFG0),A                  ;ВКЛЮЧИЛИ 10 МГЦ И ВЕРНУЛИ ПЗУ
179
                OUT (GSCFG0),A                  ; включили 10 МГЦ и вернули пзу
180
                EX AF,AF'                       ;ВЕРНУЛИ ФЛАГИ
180
                EX AF,AF'                       ; вернули флаги
181
                ADD A,A                         ;НАМ НУЖНА ВТОРЫЕ 32К СТРАНИЦЫ ПЗУ
181
                ADD A,A                         ; нам нужна вторые 32К страницы пзу
182
;               AND A                           ;ВЫБРАНА СТРАНИЦА 0?
182
;               AND A                           ; выбрана страница 0?
183
;               JR NZ,VERPAG1                   ;ЕСЛИ НЕТ, ТО ИДЕМ НА ИЗВЛЕЧЕНИЕ ПОСЛЕДНИХ 8 БАЙТ
183
;               JR NZ,VERPAG1                   ; если нет, то идем на извлечение последних 8 байт
184
;               LD HL,VERLOAD                   ;ДЛЯ ЗАГРУЗЧИКА БЕРЕМ ИЗ ДРУГОГО АДРЕСА
184
;               LD HL,VERLOAD                   ; для загрузчика берем из другого адреса
185
;               LD DE,RAMCEND
185
;               LD DE,RAMCEND
186
;               LD BC,8
186
;               LD BC,8
187
;               PUSH DE
187
;               PUSH DE
188
;               LDIR
188
;               LDIR
189
;               POP DE
189
;               POP DE
190
;               JR VERPAG2                      ;ПОШЛИ НА ПЕРЕВОДЧИК В ТЕКСТОВЫЙ ВИД
190
;               JR VERPAG2                      ; пошли на переводчик в текстовый вид
191
 
191
 
192
VERPAG1         INC A
192
VERPAG1         INC A
193
                OUT (MPAG),A                    ;ВКЛЮЧИЛИ ПОСЛЕДНИЕ 16К ВЫБРАННОЙ СТРАНИЦЫ ПЗУ
193
                OUT (MPAG),A                    ; включили последние 16К выбранной страницы пзу
194
                LD HL,0XFFF8
194
                LD HL,0xFFF8
195
                LD BC,8
195
                LD BC,8
196
                LD DE,RAMCEND
196
                LD DE,RAMCEND
197
                PUSH DE
197
                PUSH DE
198
                LDIR                            ;ПЕРЕНЕСЛИ 8 БАЙТ ИЗ ХВОСТА ПЗУ
198
                LDIR                            ; перенесли 8 байт из хвоста пзу
199
                POP DE
199
                POP DE
200
VERPAG2         LD A,0X11
200
VERPAG2         LD A,0x11
201
                OUT (GSCFG0),A                  ;ОТРУБИЛИ ПЗУ И ВЕРНУЛИ 12МГЦ
201
                OUT (GSCFG0),A                  ; отрубили пзу и вернули 12МГЦ
202
                XOR A
202
                XOR A
203
                OUT (MPAG),A                    ;ВЕРНУЛИ СТРАНИЦУ 0 ОЗУ
203
                OUT (MPAG),A                    ; вернули страницу 0 озу
204
                LD B,8                          ;ПРОВЕРЯМ ПЕРЕНЕСЕННЫЕ 8 БАЙТ, А НЕ 0XFF ЛИ ТАМ?
204
                LD B,8                          ; проверям перенесенные 8 байт, а не 0xFF ли там?
205
                LD A,(DE)
205
                LD A,(DE)
206
                INC DE
206
                INC DE
207
                INC A
207
                INC A
208
                JR NZ,VFPGA1                    ;НЕ 0XFF, ПРОДОЛЖАЕМ
208
                JR NZ,VFPGA1                    ; не 0xFF, продолжаем
209
                DJNZ $-5
209
                DJNZ $-5
210
                DEC SP                          ;ТАКИ ВСЕ 8 БАЙТ 0XFF, ВЕРСИИ У ПЗУ СТРАНИЦЫ НЕТУ
210
                DEC SP                          ; таки все 8 байт 0xFF, версии у пзу страницы нету
211
                DEC SP
211
                DEC SP
212
                POP DE
212
                POP DE
213
                LD HL,TXT1
213
                LD HL,TXT1
214
                LD BC,TXT1E-TXT1
214
                LD BC,TXT1E-TXT1
215
                LDIR                            ;ОТДАТЬ ТЕКСТ ОБ ЭТОМ
215
                LDIR                            ; отдать текст об этом
216
                JR VFPGA0
216
                JR VFPGA0
217
 
217
 
218
VFPGA1          DEC SP
218
VFPGA1          DEC SP
219
                DEC SP
219
                DEC SP
220
                POP DE
220
                POP DE
221
                CALL UNVERS                     ;РАСПАКОВКА ПОЛУЧЕННЫХ 8 БАЙТ В ТЕКСТ
221
                CALL UNVERS                     ; распаковка полученных 8 байт в текст
222
VFPGA0          OUT (CLRCBIT),A                 ;СБРОСИЛИ КОМАНД БИТ
222
VFPGA0          OUT (CLRCBIT),A                 ; сбросили команд бит
223
                LD HL,RAMCEND
223
                LD HL,RAMCEND
224
                LD BC,ZXDATWR
224
                LD BC,ZXDATWR
225
VFPGA2          LD A,(HL)
225
VFPGA2          LD A,(HL)
226
                OUTI
226
                OUTI
227
                EX AF,AF'
227
                EX AF,AF'
228
                CALL WDN
228
                CALL WDN
229
                EX AF,AF'
229
                EX AF,AF'
230
                AND A
230
                AND A
231
                JR NZ,VFPGA2                    ;ОТДАЕМ ТЕКСТ ВЕРСИИ ПОКА НЕ ВСТРЕТИТСЯ БАЙТ 0, КОТОРЫЙ ТОЖЕ ОТДАЕМ
231
                JR NZ,VFPGA2                    ; отдаем текст версии пока не встретится байт 0, который тоже отдаем
232
                RET
232
                RET
233
 
233
 
234
;РАСПАКОВЩИК ДАТЫ
234
; распаковщик даты
235
UNVERS          LD HL,6
235
UNVERS          LD HL,6
236
                ADD HL,DE                       ;ПРОПУСТИЛИ 6 БАЙТ ТЕКСТА ВЕРСИИ
236
                ADD HL,DE                       ; пропустили 6 байт текста версии
237
                LD C,(HL)                       ;ЗАБРАЛИ МЛАДШИЙ БАЙТ ВЕРСИИ
237
                LD C,(HL)                       ; забрали младший байт версии
238
                LD (HL)," "                     ;НА ЕГО МЕСТО ПРОБЕЛ
238
                LD (HL)," "                     ; на его место пробел
239
                INC HL
239
                INC HL
240
                LD B,(HL)                       ;ЗАБРАЛИ СТАРШИЙ БАЙТ
240
                LD B,(HL)                       ; забрали старший байт
241
                LD A,C                          ;ВЗЯЛИ МЛАДШИЙ БАЙТ ВЕРСИИ
241
                LD A,C                          ; взяли младший байт версии
242
                AND 0X1F                        ;НАС ИНТЕРЕСУЮТ МЛАДШИЕ 5 БИТ (ДЕНЬ МЕСЯЦА)
242
                AND 0x1F                        ; нас интересуют младшие 5 бит (день месяца)
243
                JR NZ,$+4
243
                JR NZ,.L1
244
                RES 7,B                         ;ЕСЛИ ПОЛУЧИЛСЯ 0, ВОЗМОЖНО ЭТО БЕТА ВЕРСИЯ
244
                RES 7,B                         ; если получился 0, возможно это бета версия
245
                CP 32
245
.L1             CP 32
246
                JR C,$+4                        ;В МЕСЯЦЕ НЕ МОЖЕТ БЫТЬ БОЛЕЕ 31 ДНЯ
246
                JR C,.L2                        ; в месяце не может быть более 31 дня
247
                RES 7,B                         ;ИНАЧЕ ЭТО БЕТА ВЕРСИЯ
247
                RES 7,B                         ; иначе это бета версия
248
                CALL A2TXT                      ;ПЕРЕВОДИМ ПОЛУЧЕННОЕ ЧИСЛО В ТЕКСТ
248
.L2             CALL A2TXT                      ; переводим полученное число в текст
249
                SRL B                           ;СДИНУЛИ ВЕРСИЮ НА 1 БИТ ВЛЕВО ЧТОБЫ НОМЕР МЕСЯЦА
249
                SRL B                           ; сдинули версию на 1 бит влево чтобы номер месяца
250
                RR C                            ;ОКАЗАЛСЯ В ОДНОМ БАЙТЕ
250
                RR C                            ; оказался в одном байте
251
                LD A,C                          ;ЗАБРАЛИ ЭТОТ БАЙТ
251
                LD A,C                          ; забрали этот байт
252
                RRCA
252
                RRCA
253
                RRCA
253
                RRCA
254
                RRCA
254
                RRCA
255
                RRCA                            ;СДВИНУЛИ НУЖНЫЕ БИТЫ В МЛАДШИЕ РАЗРАДЫ БАЙТА
255
                RRCA                            ; сдвинули нужные биты в младшие разрады байта
256
                AND 0X0F                        ;ОСТАВИЛИ НУЖНЫЕ 4 БИТА (НОМЕР МЕСЯЦА)
256
                AND 0x0F                        ; оставили нужные 4 бита (номер месяца)
257
                JR NZ,$+4                       ;НОМЕР МЕСЯЦА НЕМОЖЕТ БЫТЬ 0
257
                JR NZ,.L3                       ; номер месяца неможет быть 0
258
                RES 6,B                         ;ИНАЧЕ ЭТО БЕТА ВЕРСИЯ
258
                RES 6,B                         ; иначе это бета версия
259
                CP 13                           ;И НОМЕР МЕСЯЦА НЕ МОЖЕТ БЫТЬ БОЛЬШЕ 12
259
.L3             CP 13                           ; и номер месяца не может быть больше 12
260
                JR C,$+4
260
                JR C,.L4
261
                RES 6,B                         ;ИНАЧЕ БЕТА ВЕРСИЯ
261
                RES 6,B                         ; иначе бета версия
262
                LD (HL),"."                     ;ОТДЕЛИЛИ НОМЕР ДНЯ МЕСЯЦА ТОЧКОЙ
262
.L4             LD (HL),"."                     ; отделили номер дня месяца точкой
263
                INC HL
263
                INC HL
264
                CALL A2TXT                      ;КОНВЕРТИРОВАЛИ НОМЕР МЕСЯЦА
264
                CALL A2TXT                      ; конвертировали номер месяца
265
                LD (HL),"."                     ;ТАК ЖЕ ОТДЕЛИЛИ ТОЧКОЙ
265
                LD (HL),"."                     ; так же отделили точкой
266
                INC HL
266
                INC HL
267
                LD A,B                          ;ВЗЯЛИ ОСТАВШИЕСЯ БИТЫ
267
                LD A,B                          ; взяли оставшиеся биты
268
                AND 0X3F                        ;НАМ НУЖНЫ 6 БИТ НОМЕРА ГОДА
268
                AND 0x3F                        ; нам нужны 6 бит номера года
269
                CALL A2TXT                      ;КОНВЕРТНУЛИ В ТЕКСТ
269
                CALL A2TXT                      ; конвертнули в текст
270
                BIT 6,B                         ;БЕТА ИЛИ ЫТАБЛ ВЕРСИЯ?
270
                BIT 6,B                         ; бета или стабл версия?
271
                JR NZ,UNVERS1
271
                JR NZ,.L5
272
                LD DE,TXT2                      ;ВСЕ-ТАКИ БЕТА, О ЧЕМ И ДОБАВЛЯЕМ ТЕКСТ К ВЕРСИИ
272
                LD DE,TXT2                      ; все-таки бета, о чем и добавляем текст к версии
273
                LD BC,TXT2E-TXT2
273
                LD BC,TXT2E-TXT2
274
                JR UNVERS2
274
                JR .L6
275
 
275
 
276
UNVERS1         LD DE,TXT3                      ;ВЕРСИЯ СТАБЛ
276
.L5             LD DE,TXT3                      ; версия стабл
277
                LD BC,TXT3E-TXT3
277
                LD BC,TXT3E-TXT3
278
UNVERS2         LD (HL)," "                     ;ПЕРЕД ТЕКСТОМ (БЕТА ИЛИ СТАБЛ) ВСТАВЛЯЕМ ПРОБЕЛ
278
.L6             LD (HL)," "                     ; перед текстом (бета или стабл) вставляем пробел
279
                INC HL
279
                INC HL
280
                EX DE,HL
280
                EX DE,HL
281
                LDIR                            ;ПЕРЕТАЩИЛИ ТЕКСТ
281
                LDIR                            ; перетащили текст
282
                EX DE,HL
282
                EX DE,HL
283
                LD (HL),0                       ;ЗАВЕРШИЛИ СТРОКУ НУЛЕМ
283
                LD (HL),0                       ; завершили строку нулем
284
                RET
284
                RET
285
 
285
 
286
;ПЕРЕВОД "A" В ДЕСЯТИЧНЫЙ ВИД И В ТЕКСТ. ДЛЯ ЧИСЕЛ ОТ 0 ДО 99
286
; перевод "A" в десятичный вид и в текст. для чисел от 0 до 99
287
A2TXT           PUSH HL                         ;СОХРАНИЛИ АДРЕС КУДА ЛОЖИТЬ СКОНВЕРЧЕННОЕ
287
A2TXT           PUSH HL                         ; сохранили адрес куда ложить сконверченное
288
                LD L,A
288
                LD L,A
289
                LD H,0
289
                LD H,0
290
                LD DE,10
290
                LD DE,10
291
                XOR A
291
                XOR A
292
                DEC A
292
                DEC A
293
                INC A
293
.L1             INC A
294
                SBC HL,DE
294
                SBC HL,DE
295
                JR NC,$-3                       ;СЧИТАЕМ КОЛИЧЕСТВО ДЕСЯТКОВ В ЧИСЛЕ
295
                JR NC,.L1                       ; считаем количество десятков в числе
296
                ADD HL,DE                       ;ВЕРНУЛИ ПЕРЕБОР ВЫЧИТАНИЯ
296
                ADD HL,DE                       ; вернули перебор вычитания
297
                ADD A,"0"                       ;ПЕРЕВЕЛИ В ТЕСКТОВЫЙ ВИД ПОЛУЧЕННОЕ ЧИСЛО
297
                ADD A,"0"                       ; перевели в тесктовый вид полученное число
298
                LD D,A                          ;ПОКА СОХРАНИЛИ
298
                LD D,A                          ; пока сохранили
299
                LD A,L                          ;ВЗЯЛИ ОСТАВШИЕСЯ ЕДИНИЦЫ ЧИСЛА
299
                LD A,L                          ; взяли оставшиеся единицы числа
300
                ADD A,"0"                       ;КОНВЕРТУЛИ В ТЕКСТ
300
                ADD A,"0"                       ; конвертули в текст
301
                POP HL                          ;ВЕРНУЛИ АДРЕС КУДА ЛОЖИТЬ
301
                POP HL                          ; вернули адрес куда ложить
302
                LD (HL),D                       ;ПОЛОЖИЛИ ДЕСЯТКИ ЗАДАННОГО ЧИСЛА
302
                LD (HL),D                       ; положили десятки заданного числа
303
                INC HL
303
                INC HL
304
                LD (HL),A                       ;ПОЛОЖИЛИ ЕДИНИЦЫ ТОГО ЖЕ ЧИСЛА
304
                LD (HL),A                       ; положили единицы того же числа
305
                INC HL
305
                INC HL
306
                RET
306
                RET
307
 
307
 
308
;ЗАГРУЗКА С SD КАРТЫ ПО УКАЗАННОМУ ПУТИ
308
; загрузка с SD карты по указанному пути
309
;ПЕРВЫЙ БАЙТ-НОМЕР СТРАНИЦЫ ОЗУ КУДА НАЧИНАТЬ ГРУЗИТЬ 
309
; первый байт-номер страницы озу куда начинать грузить 
310
;ДАЛЕЕ БАЙТЫ ТЕКСТОВОЙ СТРОКА ПУТИ И ИМЕНИ ФАЙЛА
310
; далее байты текстовой строка пути и имени файла
311
;КОНЕЦ СТРОКИ БАЙТ 0, ОН ЖЕ СТОП БАЙТ
311
; конец строки байт 0, он же стоп байт
312
LDINSD          LD BC,ZXDATRD                   ;АДРЕС ПОРТА ДАННЫХ
312
LDINSD          LD BC,ZXDATRD                   ; адрес порта данных
313
                LD HL,RAMCEND                   ;АДРЕС КУДА СТРОКУ ПУТИ СКЛАДИРОВАТЬ
313
                LD HL,RAMCEND                   ; адрес куда строку пути складировать
314
                PUSH HL
314
                PUSH HL
315
                IN A,(C)                        ;ПРИНЯЛИ НОМЕР СТРАНИЦЫ ОТКУДА НАЧИНАТЬ ЗАГРУЗКУ
315
                IN A,(C)                        ; приняли номер страницы откуда начинать загрузку
316
                OUT (CLRCBIT),A                 ;СБРОСИЛИ КОМАНД БИТ
316
                OUT (CLRCBIT),A                 ; сбросили команд бит
317
                EX AF,AF'
317
                EX AF,AF'
318
LDINSD1         CALL WDY
318
LDINSD1         CALL WDY
319
                IN A,(C)
319
                IN A,(C)
320
                LD (HL),A
320
                LD (HL),A
321
                INC HL
321
                INC HL
322
                AND A
322
                AND A
323
                JR NZ,LDINSD1                   ;ПРИНИМАЕМ СТРОКУ ПОКА НЕ ВСТРЕТИТСЯ БАЙТ 0
323
                JR NZ,LDINSD1                   ; принимаем строку пока не встретится байт 0
324
                EX AF,AF'
324
                EX AF,AF'
325
                POP HL
325
                POP HL
326
                JP LOAD_SD                      ;ДАЛЕЕ ЗАПУСКАЕМ ЗАГРУЗКУ С SD КАРТЫ
326
                JP LOAD_SD                      ; далее запускаем загрузку с SD карты
327
 
327
 
328
;ЗАГРУЗКА ФАЙЛА С ОБНОВЛЕНИЯМИ
328
; загрузка файла с обновлениями
329
LOADUPDATE      LD HL,UPDATENAME                ;ИМЯ ФАЙЛА ОБНОВЛЕНИЯ
329
LOADUPDATE      LD HL,UPDATENAME                ; имя файла обновления
330
                LD A,2                          ;ГРУЗИТЬ НАЧИНАЯ СО 2 СТРАНИЦЫ
330
                LD A,2                          ; грузить начиная со 2 страницы
331
                OUT (CLRCBIT),A
331
                OUT (CLRCBIT),A
332
                JP LOAD_SD
332
                JP LOAD_SD
333
 
333
 
334
;СТАТУС ЗАГРУЗКИ ФАЙЛА С SD КАРТЫ
334
; статус загрузки файла с SD карты
335
STATSD          LD A,(STATUS)
335
STATSD          LD A,(STATUS)
336
                OUT (ZXDATWR),A
336
                OUT (ZXDATWR),A
337
                OUT (CLRCBIT),A
337
                OUT (CLRCBIT),A
338
                RET
338
                RET
339
 
339
 
340
;ЗАГРУЗКА И ЗАПУСК ПРОШИВКИ С SD КАРТЫ
340
; загрузка и запуск прошивки с SD карты
341
;ИМЯ, ПУТЬ И АДРЕС ФИКСИРОВАН
341
; имя, путь и адрес фиксирован
342
RROMSD          LD HL,F_PATH                    ;АДРЕС СТРОКИ ФИКСИРОВАННОГО ПУТИ ДЛЯ ЗАГРУЗКИ 
342
RROMSD          LD HL,F_PATH                    ; адрес строки фиксированного пути для загрузки 
343
                XOR A
343
                XOR A
344
                CALL LOAD_SD                    ;ЗАГРУЖАЕМ
344
                CALL LOAD_SD                    ; загружаем
345
                AND A
345
                AND A
346
                RET NZ                          ;ЕСЛИ ОШИБКА, ТО ГРУЗИМ ИЗ ПЗУ
346
                RET NZ                          ; если ошибка, то грузим из пзу
347
                JP JPLDROM
347
                JP JPLDROM
348
 
348
 
349
;ЗАПУСК КОДА В ЛЮБОЙ СТРАНИЦЕ
349
; запуск кода в любой странице
350
;0-НОМЕР СТРАНИЦЫ ОЗУ
350
; 0 - номер страницы озу
351
;1-МЛАДШИЙ БАЙТ АДРЕСА ЗАПУСКА
351
; 1 - младший байт адреса запуска
352
;2-СТАРШИЙ БАЙТ АДРЕСА ЗАПУСКА
352
; 2 - старший байт адреса запуска
353
RUNCOD          LD BC,ZXDATRD                   ;АДРЕС ПОРТА ДАННЫХ
353
RUNCOD          LD BC,ZXDATRD                   ; адрес порта данных
354
                IN A,(C)                        ;ПРИНЯЛИ НОМЕР СТРАНИЦЫ ОЗУ
354
                IN A,(C)                        ; приняли номер страницы озу
355
                OUT (CLRCBIT),A                 ;СБРОСИЛИ КОМАНД БИТ
355
                OUT (CLRCBIT),A                 ; сбросили команд бит
356
                OUT (MPAG),A
356
                OUT (MPAG),A
357
                CALL WDY
357
                CALL WDY
358
                IN L,(C)                        ;ПРИНЯЛИ МЛАДШИЙ БАЙТ АДРЕСА ЗАПУСКА
358
                IN L,(C)                        ; приняли младший байт адреса запуска
359
                CALL WDY
359
                CALL WDY
360
                IN H,(C)                        ;ПРИНЯЛИ СТАРШИЙ БАЙТ АДРЕСА ЗАПУСКА
360
                IN H,(C)                        ; приняли старший байт адреса запуска
361
                JP (HL)                         ;ЗАПУСКАЕМ
361
                JP (HL)                         ; запускаем
362
 
362
 
363
;0-НОМЕР СТРАНИЦЫ ОЗУ
363
; 0 - номер страницы озу
364
;1-МЛАДШИЙ БАЙТ ДЛИНЫ ЗАГРУЗКИ
364
; 1 - младший байт длины загрузки
365
;2-СТАРШИЙ БАЙТ ДЛИНЫ ЗАГРУЗКИ
365
; 2 - старший байт длины загрузки
366
;ЗАГРУЗКА НЕ БОЛЕЕ 32КБ
366
; загрузка не более 32КБ
367
LOADCOD         LD BC,ZXDATRD                   ;АДРЕС ПОРТА ДАННЫХ
367
LOADCOD         LD BC,ZXDATRD                   ; адрес порта данных
368
                LD HL,0X8000                    ;АДРЕС НАЧАЛА ЗГРУЗКИ
368
                LD HL,0x8000                    ; адрес начала зaгрузки
369
                IN A,(C)                        ;ПРИНЯЛИ НОМЕР СТРАНИЦЫ ОЗУ
369
                IN A,(C)                        ; приняли номер страницы озу
370
                OUT (CLRCBIT),A                 ;СБРОСИЛИ КОМАНД БИТ
370
                OUT (CLRCBIT),A                 ; сбросили команд бит
371
                OUT (MPAG),A                    ;ВКЛЮЧИЛИ ЗАДАННУЮ СТРАНИЦУ ОЗУ
371
                OUT (MPAG),A                    ; включили заданную страницу озу
372
                CALL WDY
372
                CALL WDY
373
                IN E,(C)                        ;ПРИНЯЛИ МЛАДШИЙ БАЙТ ДЛИНЫ ЗАГРУЗКИ
373
                IN E,(C)                        ; приняли младший байт длины загрузки
374
                CALL WDY
374
                CALL WDY
375
                IN D,(C)                        ;ПРИНЯЛИ СТАРШИЙ БАЙТ ДЛИНЫ ЗГАРУЗКИ
375
                IN D,(C)                        ; приняли старший байт длины загрузки
376
LOADCO1         CALL WDY
376
LOADCO1         CALL WDY
377
                INI
377
                INI
378
                LD A,H
378
                LD A,H
379
                AND A
379
                AND A
380
                RET Z                           ;ЕСЛИ ОЗУ КОНЧИЛОСЬ, ВЫХОДИМ
380
                RET Z                           ; если озу кончилось, выходим
381
                DEC DE
381
                DEC DE
382
                LD A,D
382
                LD A,D
383
                OR E
383
                OR E
384
                JR NZ,LOADCO1                   ;ГРУЗИМ СКОКА УКАЗАНО
384
                JR NZ,LOADCO1                   ; грузим скока указано
385
                RET
385
                RET
386
 
386
 
387
;ЗАГРУЗКА ПРОШИВКИ 32КБ СО СПЕКА
387
; загрузка прошивки 32КБ со спека
388
LOADROM         XOR A
388
LOADROM         XOR A
389
                OUT (MPAG),A                    ;ВКЛЮЧАЕМ СТРАНИЦУ
389
                OUT (MPAG),A                    ; включаем страницу
390
                LD HL,0X8000                    ;АДРЕС ЗАГРУЗКИ
390
                LD HL,0x8000                    ; адрес загрузки
391
                OUT (CLRCBIT),A                 ;СБРОС КОМАНД БИТА
391
                OUT (CLRCBIT),A                 ; сброс команд бита
392
                LD BC,ZXDATRD                   ;АДРЕС ПОРТА ДАННЫХ
392
                LD BC,ZXDATRD                   ; адрес порта данных
393
LOADROM1        CALL WDY
393
LOADROM1        CALL WDY
394
                INI
394
                INI
395
                LD A,H
395
                LD A,H
396
                AND A
396
                AND A
397
                JR NZ,LOADROM1                  ;ГРУЗИМ ПОКА ПАМЯТЬ НЕ КОНЧИТСЯ
397
                JR NZ,LOADROM1                  ; грузим пока память не кончится
398
                RET
398
                RET
399
 
399
 
400
;ГРУЗИЛКА СТАНДАРТНОЙ ПРОШИВКИ ИЗ ROM
400
; грузилка стандартной прошивки из ROM
401
GS105           LD HL,STRPAG                    ;АДРЕС КУДА ПЕРЕНОСИТЬ
401
GS105           LD HL,STRPAG                    ; адрес куда переносить
402
                LD A,4                          ;ПЕРЕНОСИТЬ 4 КУСКА ПО 8 КИЛОБАЙТ
402
                LD A,4                          ; переносить 4 куска по 8 килобайт
403
MOV1            EX AF,AF'                       ;ПРЯЧЕМ СЧЕТЧИК
403
MOV1            EX AF,AF'                       ; прячем счетчик
404
                LD A,0X30
404
                LD A,0x30
405
                OUT (GSCFG0),A                  ;ВКЛЮЧИЛИ ПЗУ
405
                OUT (GSCFG0),A                  ; включили пзу
406
                LD A,2
406
                LD A,2
407
                OUT (MPAG),A                    ;СТРАНИЦУ 2 СО СТАНДАРТНОЙ ПРОШИВКОЙ
407
                OUT (MPAG),A                    ; страницу 2 со стандартной прошивкой
408
                PUSH HL
408
                PUSH HL
409
                LD DE,RAM8KB
409
                LD DE,RAM8KB
410
                LD BC,0X2000
410
                LD BC,0x2000
411
                LDIR                            ;ПЕРЕНЕСЛИ В БУФЕР 8 КИЛОБАЙТ
411
                LDIR                            ; перенесли в буфер 8 килобайт
412
                LD A,0X31
412
                LD A,0x31
413
                OUT (GSCFG0),A                  ;ПЕРЕКЛЮЧИЛИ ПЗУ
413
                OUT (GSCFG0),A                  ; переключили пзу
414
                XOR A
414
                XOR A
415
                OUT (MPAG),A                    ;ВКЛЮЧИЛИ СТРАНИЦУ 0 ОЗУ
415
                OUT (MPAG),A                    ; включили страницу 0 озу
416
                POP DE
416
                POP DE
417
                LD HL,RAM8KB
417
                LD HL,RAM8KB
418
                LD BC,0X2000
418
                LD BC,0x2000
419
                LDIR                            ;ПЕРЕНЕСЛИ ИЗ БУФЕРА 8 КИЛОБАЙТ
419
                LDIR                            ; перенесли из буфера 8 килобайт
420
                EX DE,HL
420
                EX DE,HL
421
                EX AF,AF'
421
                EX AF,AF'
422
                DEC A
422
                DEC A
423
                JR NZ,MOV1                      ;И ТАК 4 РАЗА
423
                JR NZ,MOV1                      ; и так 4 раза
424
 
424
 
425
;ЗАПУСК ЗАГРУЖЕННОЙ ПРОШИВКИ
425
; запуск загруженной прошивки
426
JPLDROM         XOR A
426
JPLDROM         XOR A
427
                OUT (MPAG),A                    ;ВКЛЮЧИЛИ СТРАНИЦУ 0 ОЗУ
427
                OUT (MPAG),A                    ; включили страницу 0 озу
428
;               LD A,0X13                       ;ВКЛЮЧИЛИ ЧАСТОТУ 12МГЦ, ОТКЛЮЧИЛИ ПЗУ И ЗАЩИТИЛИ ОЗУ ОТ ЗАПИСИ
428
;               LD A,0x13                       ; включили частоту 12МГЦ, отключили пзу и защитили озу от записи
429
;               LD A,0X23                       ;ВКЛЮЧИЛИ ЧАСТОТУ 20МГЦ, ОТКЛЮЧИЛИ ПЗУ И ЗАЩИТИЛИ ОЗУ ОТ ЗАПИСИ
429
;               LD A,0x23                       ; включили частоту 20МГЦ, отключили пзу и защитили озу от записи
430
                LD A,3+FREQUENCY                ;ВКЛЮЧИЛИ УКАЗАННУЮ ЧАСТОТУ, ОТКЛЮЧИЛИ ПЗУ И ЗАЩИТИЛИ ОЗУ ОТ ЗАПИСИ
430
                LD A,3+FREQUENCY                ; включили указанную частоту, отключили пзу и защитили озу от записи
431
                OUT (GSCFG0),A
431
                OUT (GSCFG0),A
432
                JP 0                            ;СТАРТУЕМ СТАНДАРТНУЮ ПРОШИВКУ
432
                JP 0                            ; стартуем стандартную прошивку
433
 
433
 
434
;ЖДЕМ ПОКА СПЕК ДАСТ БАЙТ
434
; ждем пока спек даст байт
435
WDY             IN A,(ZXSTAT)
435
WDY             IN A,(ZXSTAT)
436
                RLA
436
                RLA
437
                JR NC,WDY
437
                JR NC,WDY
438
                RET
438
                RET
439
 
439
 
440
;ЖДЕМ ПОКА СПЕК ЗАБЕРЕТ БАЙТ ИЗ ПОРТА
440
; ждем пока спек заберет байт из порта
441
WDN             IN A,(ZXSTAT)
441
WDN             IN A,(ZXSTAT)
442
                RLA
442
                RLA
443
                JR C,WDN
443
                JR C,WDN
444
                RET
444
                RET
445
 
445
 
446
;ПОДСЧЕТ CRC16
446
; подсчет CRC16
447
GET_CRC         LD A,2
447
GET_CRC         LD A,2
448
                OUT (MPAG),A
448
                OUT (MPAG),A
449
                DEC A
449
                DEC A
450
                OUT (GSCFG0),A
450
                OUT (GSCFG0),A
451
                LD HL,(0X8000)
451
                LD HL,(0x8000)
452
                SRL H
452
                SRL H
453
                RR L
453
                RR L
454
                SRL H
454
                SRL H
455
                RR L
455
                RR L
456
                SRL H
456
                SRL H
457
                RR L
457
                RR L
458
                SRL H
458
                SRL H
459
                RR L
459
                RR L
460
                LD A,L
460
                LD A,L
461
                LD IYH,A
461
                LD IYH,A
462
;               LD IX,0X8000
462
;               LD IX,0x8000
463
;               LD C,(IX+0)
463
;               LD C,(IX+0)
464
;               LD B,(IX+1)
464
;               LD B,(IX+1)
465
;               CALL CRC16
465
;               CALL CRC16
466
;               LD C,(IX+0)
466
;               LD C,(IX+0)
467
;               LD B,(IX+1)
467
;               LD B,(IX+1)
468
;               LD A,0X81
468
;               LD A,0x81
469
;               AND A
469
;               AND A
470
;               SBC HL,BC
470
;               SBC HL,BC
471
;               JR NZ,OUT_ERR                   ;CRC16 ЗАГОЛОВКА ERROR
471
;               JR NZ,OUT_ERR                   ; CRC16 заголовка ERROR
472
                LD IX,0X8000+8-0X10
472
                LD IX,0x8000+8-0x10
473
SCHET           LD DE,0X10
473
SCHET           LD DE,0x10
474
                ADD IX,DE                       ;В IX АДРЕС ВЫБРАННОГО БЛОКА
474
                ADD IX,DE                       ; в IX адрес выбранного блока
475
                LD C,(IX+4)
475
                LD C,(IX+4)
476
                LD B,(IX+5)                     ;В BC ДЛИНА БЛОКА
476
                LD B,(IX+5)                     ; в BC длина блока
477
                LD E,(IX+1)
477
                LD E,(IX+1)
478
                LD L,(IX+2)
478
                LD L,(IX+2)
479
                LD H,(IX+3)
479
                LD H,(IX+3)
480
                LD A,L
480
                LD A,L
481
                AND 0X7F
481
                AND 0x7F
482
                LD D,A                          ;В DE СМЕЩЕНИЕ В СТРАНИЦЕ
482
                LD D,A                          ; в DE смещение в странице
483
                ADD HL,HL
483
                ADD HL,HL
484
                LD A,2
484
                LD A,2
485
                ADD A,H
485
                ADD A,H
486
                LD IYL,A
486
                LD IYL,A
487
                OUT (MPAG),A                    ;НОМЕР СТРАНИЦЫ
487
                OUT (MPAG),A                    ; номер страницы
488
                PUSH IX
488
                PUSH IX
489
                LD IX,0X8000
489
                LD IX,0x8000
490
                ADD IX,DE                       ;В IX АДРЕС НАЧАЛА БЛОКА
490
                ADD IX,DE                       ; в IX адрес начала блока
491
                CALL CRC16
491
                CALL CRC16
492
                POP IX
492
                POP IX
493
                LD C,(IX+6)
493
                LD C,(IX+6)
494
                LD B,(IX+7)
494
                LD B,(IX+7)
495
                LD A,0X82
495
                LD A,0x82
496
                AND A
496
                AND A
497
                SBC HL,BC
497
                SBC HL,BC
498
                JR NZ,OUT_ERR
498
                JR NZ,OUT_ERR
499
                DEC IYH
499
                DEC IYH
500
                JR NZ,SCHET
500
                JR NZ,SCHET
501
ERR_OK          LD A,0X80
501
ERR_OK          LD A,0x80
502
 
502
 
503
;CRC16 ERROR
503
; CRC16 ERROR
504
;0X80-CRC16 БЛОКА OK
504
; 0x80 - CRC16 блока ok
505
;0X81-CRC16 ЗАГОЛОВКА ERROR
505
; 0x81 - CRC16 заголовка error
506
;0X82-CRC16 БЛОКА ERROR
506
; 0x82 - CRC16 блока ERROR
507
OUT_ERR         OUT (CLRCBIT),A
507
OUT_ERR         OUT (CLRCBIT),A
508
                OUT (ZXDATWR),A
508
                OUT (ZXDATWR),A
509
                CALL WDN
509
                CALL WDN
510
                LD A,L
510
                LD A,L
511
                OUT (ZXDATWR),A
511
                OUT (ZXDATWR),A
512
                CALL WDN
512
                CALL WDN
513
                LD A,H
513
                LD A,H
514
                OUT (ZXDATWR),A
514
                OUT (ZXDATWR),A
515
                RET
515
                RET
516
 
516
 
517
CRC16           LD HL,0XFFFF
517
CRC16           LD HL,0xFFFF
518
                LD DE,0X1021
518
                LD DE,0x1021
519
CRC_0           LD A,(IX)
519
CRC_0           LD A,(IX)
520
                INC IX
520
                INC IX
521
                EX AF,AF'
521
                EX AF,AF'
522
                LD A,IXL
522
                LD A,IXL
523
                OR IXH
523
                OR IXH
524
                JR NZ,CRC_3
524
                JR NZ,CRC_3
525
                INC IYL
525
                INC IYL
526
                LD A,IYL
526
                LD A,IYL
527
                OUT (MPAG),A
527
                OUT (MPAG),A
528
                LD IX,0X8000
528
                LD IX,0x8000
529
CRC_3           EX AF,AF'
529
CRC_3           EX AF,AF'
530
                XOR H
530
                XOR H
531
                LD H,A
531
                LD H,A
532
                LD A,8
532
                LD A,8
533
CRC_1           ADD HL,HL
533
CRC_1           ADD HL,HL
Line 549... Line 549...
549
                LD A,2
549
                LD A,2
550
                OUT (MPAG),A
550
                OUT (MPAG),A
551
                RET
551
                RET
552
 
552
 
553
;---------------------------------
553
;---------------------------------
554
;ГРУЗИЛКА ФАЙЛА ПО УКАЗАННОМУ ПУТИ
554
; грузилка файла по указанному пути
555
 
555
 
-
 
556
 INIT_VAR 0x5000
556
BUF_512         EQU 0X5000                      ;0X200 БУФЕР СЕКТОРА
557
 SETVAR BUF_512,        0x200           ; буфер сектора
557
TDIRCLS         EQU BUF_512+0X0200              ;0X400 БУФЕР КЛАСТЕРОВ ROOT ДИРЕКТОРИИ
558
 SETVAR TDIRCLS,        0x400           ; буфер кластеров ROOT директории
558
CAL_FAT         EQU TDIRCLS+0X0400              ;1 КАЛИБР FAT
559
 SETVAR CAL_FAT,        BYTE            ; калибр FAT
559
BYTSSEC         EQU CAL_FAT+1                   ;1 КОЛИЧЕСТВО СЕКТОРОВ В КЛАСТЕРЕ
560
 SETVAR BYTSSEC,        BYTE            ; количество секторов в кластере
560
ROOTCLS         EQU BYTSSEC+1                   ;4 КЛАСТЕР НАЧАЛА ROOT ДИРЕКТОРИИ
561
 SETVAR ROOTCLS,        DWORD           ; кластер начала ROOT директории
561
ROOTSEC         EQU ROOTCLS+4                   ;2 РАЗМЕР В СЕКТОРАХ ROOT ДИРЕКТОРИИ
562
 SETVAR ROOTSEC,        WORD            ; размер в секторах ROOT директории
562
SEC_FAT         EQU ROOTSEC+2                   ;4 КОЛИЧЕСТВО СЕКТОРОВ ОДНОЙ FAT
563
 SETVAR SEC_FAT,        DWORD           ; количество секторов одной FAT
563
RSVDSEC         EQU SEC_FAT+4                   ;2 РАЗМЕР РЕЗЕРВНОЙ ОБЛАСТИ
564
 SETVAR RSVDSEC,        WORD            ; размер резервной области
564
STARTRZ         EQU RSVDSEC+2                   ;4 НАЧАЛО ДИСКА/РАЗДЕЛА
565
 SETVAR STARTRZ,        DWORD           ; начало диска/раздела
565
FRSTDAT         EQU STARTRZ+4                   ;4 АДРЕС ПЕРВОГО СЕКТОРА ДАННЫХ ОТ BPB
566
 SETVAR FRSTDAT,        DWORD           ; адрес первого сектора данных от BPB
566
SEC_DSC         EQU FRSTDAT+4                   ;4 КОЛИЧЕСТВО СЕКТОРОВ НА ДИСКЕ/РАЗДЕЛЕ
567
 SETVAR SEC_DSC,        DWORD           ; количество секторов на диске/разделе
567
CLS_DSC         EQU SEC_DSC+4                   ;4 КОЛИЧЕСТВО КЛАСТЕРОВ НА ДИСКЕ/РАЗДЕЛЕ
568
 SETVAR CLS_DSC,        DWORD           ; количество кластеров на диске/разделе
568
FATSTR          EQU CLS_DSC+4                   ;4 НАЧАЛО ПЕРВОЙ FAT ТАБЛИЦЫ
569
 SETVAR FATSTR,         DWORD           ; начало первой FAT таблицы
569
ADRPATH         EQU FATSTR+4                    ;2 АДРЕС ТЕКСТА ПУТИ ФАЙЛА
570
 SETVAR ADRPATH,        WORD            ; адрес текста пути файла
570
STATUS          EQU ADRPATH+2                   ;1 СТАТУС ПОСЛЕ ВЫЗОВА LOAD_SD
571
 SETVAR STATUS,         BYTE            ; статус после вызова LOAD_SD
571
OLD_SP          EQU STATUS+1                    ;2 СТЕК ДЛЯ ВЫХОДА
572
 SETVAR OLD_SP,         WORD            ; стек для выхода
572
FB_EXT          EQU OLD_SP+2                    ;B БУФЕР 8.3 ДЛЯ ПОИСКА ИМЕНИ
573
 SETVAR FB_EXT,         0x0B            ; буфер 8.3 для поиска имени
573
LVL_DIR         EQU FB_EXT+0X0B                 ;1 НОМЕР УРОВНЯ ДИРЕКТОРИИ
574
 SETVAR LVL_DIR,        BYTE            ; номер уровня директории
574
LSTLOAD         EQU LVL_DIR+1                   ;4 НОМЕР СЕКТОРА ЗАГРУЖЕННОГО В БУФЕР
575
 SETVAR LSTLOAD,        DWORD           ; номер сектора загруженного в буфер
575
NGS_MODES       EQU LSTLOAD+4                   ;1 ТЕКУЩИЙ УСТАНОВЛЕННЫЙ РЕЖИМ
576
 SETVAR NGS_MODES,      BYTE            ; текущий установленный режим
576
 
577
 
577
;SD КАРТА НЕ НАЙДЕНА
578
; SD карта не найдена
578
ZAW003          LD A,0XEE
579
ZAW003          LD A,0xEE
579
WR_STAT         LD SP,(OLD_SP)
580
WR_STAT         LD SP,(OLD_SP)
580
                LD (STATUS),A
581
                LD (STATUS),A
581
                RET
582
                RET
582
 
583
 
583
;ЗАГРУЗКА ФАЙЛА
584
; загрузка файла
584
;НА ВХОДЕ:A-СТРАНИЦА НАЧАЛА ЗАГРУЗКИ
585
; на входе: A - страница начала загрузки
585
;HL-АДРЕС ТЕКСТОВОЙ СТРОКИ
586
; HL - адрес текстовой строки
586
;ПУТИ К ФАЙЛУ ВМЕСТЕ С ИМЕНЕМ И РАСШИРЕНИЕМ ФАЙЛА. ПУТЬ ПОЛНОСТЬЮ ОТ ROOT 
587
; пути к файлу вместе с именем и расширением файла. путь полностью от ROOT 
587
;ЗАГРУЖАЕТСЯ ФАЙЛ ПО РАЗМЕРУ ДОПОЛНЕНОМУ ДО ПОЛНЫХ СЕКТОРОВ (СЕКТОР 512 БАЙТ)
588
; загружается файл по размеру дополненому до полных секторов (сектор 512 байт)
588
;ПРИМЕР: РАЗМЕР ФАЙЛА =0X80-ПОСЛЕ ДОПОЛНЕНИЯ БУДЕТ ЗАГРУЖЕН 1 СЕКТОР
589
; пример: размер файла =0x80-после дополнения будет загружен 1 сектор
589
;=0X401-БУДЕТ ЗАГРУЖЕНО 3 СЕКТОРА
590
; =0x401 - будет загружено 3 сектора
590
;НА ВЫХОДЕ: A=
591
; на выходе: A =
591
                ;0X00-ФАЙЛ ЗАГРУЖЕН
592
                ; 0x00 - файл загружен
592
                ;0XAA-ФАЙЛ НЕ НАЙДЕН
593
                ; 0xAA - файл не найден
593
                ;0XDD-FAT НЕ ОБНАРУЖЕН
594
                ; 0xDD - FAT не обнаружен
594
                ;0XEE-SD КАРТА НЕ ОБНАРУЖЕНА
595
                ; 0xEE - SD карта не обнаружена
595
LOAD_SD         LD IYL,A;LY,A                   ;СОХРАНИЛИ НОМЕР СТРАНИЦЫ КУДА ГРУЗИТЬ
596
LOAD_SD         LD IYL,A                        ; сохранили номер страницы куда грузить
596
                LD (ADRPATH),HL                 ;СОХРАНИЛИ АДРЕС СТРОКИ ПУТИ
597
                LD (ADRPATH),HL                 ; сохранили адрес строки пути
597
                LD (OLD_SP),SP                  ;СОХРАНИЛИ СТЕК
598
                LD (OLD_SP),SP                  ; сохранили стек
598
                LD A,0XFF
599
                LD A,0xFF
599
                LD (LSTLOAD+3),A                ;ПРИНУДИТЕЛЬНАЯ ЗАГРУЗКА СЕКТОРА БЕЗ ПРОВЕРКИ
600
                LD (LSTLOAD+3),A                ; принудительная загрузка сектора без проверки
600
                LD A,1
601
                LD A,1
601
                OUT (GSCFG0),A                  ;ОТКЛЮЧИЛИ ПЗУ, ВСЕ СТРАНИЦА ОЗУ
602
                OUT (GSCFG0),A                  ; отключили пзу, все страница озу
602
                LD A,%10011011
603
                LD A,M_SDNCS+M_SNCLR;%10011011
603
                OUT (SCTRL),A                   ;СКОНФИГУРИЛИ НГС С CS=1 ДЛЯ SD КАРТЫ           
604
                OUT (SCTRL),A                   ; сконфигурили нгс с CS=1 для SD карты          
604
                LD B,0X10
605
                LD B,0x10
605
LOADSD1         LD A,0XFF
606
.L1             LD A,0xFF
606
                OUT (SD_SEND),A                 ;ПИШЕМ 0X80 БАЙТ 0XFF В ПОРТ КАРТОЧКИ
607
                OUT (SD_SEND),A                 ; пишем 0x80 байт 0xFF в порт карточки
607
                DJNZ LOADSD1
608
                DJNZ .L1
608
                XOR A                           ;256 ПОПЫТОК НАЙТИ SD КАРТУ
609
                XOR A                           ; 256 попыток найти SD карту
609
                EX AF,AF'
610
                EX AF,AF'
610
                LD A,1
611
                LD A,M_SDNCS
611
                OUT (SCTRL),A                   ;ВЫБРАЛИ SD КАРТУ CS=0
612
                OUT (SCTRL),A                   ; выбрали SD карту CS=0
612
 
-
 
613
ZAW001          LD HL,CMD00
613
.L2             LD HL,CMD00
614
                CALL OUTCOM                     ;ПЕРЕВОДИМ КАРТОЧКУ В РЕЖИМ SPI КОМАНДОЙ 0
614
                CALL OUTCOM                     ; переводим карточку в режим SPI командой 0
615
                CALL IN_OOUT                    ;ЖДЕМ ОТВЕТА
615
                CALL IN_OOUT                    ; ждем ответа
616
                EX AF,AF'
616
                EX AF,AF'
617
                DEC A
617
                DEC A
618
                JR Z,ZAW003                     ;ЖДЕМ ПО СЧЕПТЧИКУ 256 РАЗ
618
                JR Z,ZAW003                     ; ждем по счептчику 256 раз
619
                EX AF,AF'
619
                EX AF,AF'
620
                DEC A
620
                DEC A
621
                JR NZ,ZAW001                    ;ЖДЕМ ПОКА КАРТА ОТВЕТИТ БАЙТОМ 1
621
                JR NZ,.L2                       ; ждем пока карта ответит байтом 1
622
                LD BC,SD_RSTR
622
                LD BC,SD_RSTR
623
                LD HL,CMD08
623
                LD HL,CMD08
624
                CALL OUTCOM                     ;ОПРЕДЕЛЯЕМ СПЕЦИФИКАЦИЮ КАРТЫ
624
                CALL OUTCOM                     ; определяем спецификацию карты
625
                CALL IN_OOUT                    ;В "A" ОТВЕТ КАРТЫ R1
625
                CALL IN_OOUT                    ; в "A" ответ карты R1
626
                IN H,(C)
626
                IN H,(C)
627
                NOP
627
                NOP
628
                IN H,(C)       
628
                IN H,(C)       
629
                NOP
629
                NOP
630
                IN H,(C)
630
                IN H,(C)
631
                NOP
631
                NOP
632
                IN H,(C)                        ;ПРОЧИТАЛИ ОСТАЛЬНЫЕ БАЙТЫ В НИКУДА
632
                IN H,(C)                        ; прочитали остальные байты в никуда
633
                BIT 2,A                         ;ЕСЛИ ОШИБКА, ТО
633
                BIT 2,A                         ; если ошибка, то
634
                LD HL,0                         ;КАРТА СПЕЦИФИКАЦИИ 1.0
634
                LD HL,0                         ; карта спецификации 1.0
635
                JR NZ,ZAW006                    ;ИНАЧЕ
635
                JR NZ,.L3                       ; иначе
636
                LD H,0X40                       ;КАРТА СПЕЦИФИКАЦИИ 2.0
636
                LD H,0x40                       ; карта спецификации 2.0
637
ZAW006          LD A,CMD_55
637
.L3             LD A,CMD_55
638
                CALL OUT_COM                    ;ЗАПУСКАЕМ ВНУТРЕННЮЮ ИНИЦИАЛИЗАЦИЮ КАРТЫ
638
                CALL OUT_COM                    ; запускаем внутреннюю инициализацию карты
639
                CALL IN_OOUT
639
                CALL IN_OOUT
-
 
640
                in (c) ;in f,(c)
-
 
641
                in (c) ;in f,(c)
640
                LD BC,SD_SEND
642
                LD BC,SD_SEND
641
                LD A,ACMD_41
643
                LD A,ACMD_41
642
                OUT (C),A
644
                OUT (C),A
643
                LD A,H
645
                LD A,H
644
                OUT (C),A
646
                OUT (C),A
Line 650... Line 652...
650
                OUT (C),A
652
                OUT (C),A
651
                DEC A
653
                DEC A
652
                OUT (C),A
654
                OUT (C),A
653
                CALL IN_OOUT
655
                CALL IN_OOUT
654
                AND A
656
                AND A
655
                JR NZ,ZAW006                    ;ЖДЕМ ПОКА КАРТЫ ПЕРЕЙДЕТ В РЕЖИМ ГОТОВНОСТИ
657
                JR NZ,.L3                       ; ждем пока карты перейдет в режим готовности
656
ZAW004          LD A,CMD_59
658
.L4             LD A,CMD_59
657
                CALL OUT_COM                    ;ПРИНУДИТЕЛЬНО ОТКЛЮЧАЕМ CRC16
659
                CALL OUT_COM                    ; принудительно отключаем CRC16
658
                CALL IN_OOUT
660
                CALL IN_OOUT
659
                AND A
661
                AND A
660
                JR NZ,ZAW004
662
                JR NZ,.L4
661
ZAW005          LD HL,CMD16
663
.L5             LD HL,CMD16
662
                CALL OUTCOM                     ;ПРИНУДИТЕЛЬНЫЙ РАЗМЕР СЕКТОРА 512 БАЙТ
664
                CALL OUTCOM                     ; принудительный размер сектора 512 байт
663
                CALL IN_OOUT
665
                CALL IN_OOUT
664
                AND A
666
                AND A
665
                JR NZ,ZAW005
667
                JR NZ,.L5
666
 
668
 
667
;ИНИЦИАЛИЗАЦИЯ ПЕРЕМЕННЫХ FAT
669
; инициализация переменных FAT
668
WC_FAT          LD DE,0
670
WC_FAT          LD DE,0
669
                LD B,D
671
                LD B,D
670
                LD C,E
672
                LD C,E
671
                CALL LOADLST                    ;ЧИТАЕМ СЕКТОР 0 КАРТОЧКИ
673
                CALL LOADLST                    ; читаем сектор 0 карточки
672
                PUSH HL
674
                PUSH HL
673
                POP IX
675
                POP IX
674
                LD DE,0X01BE
676
                LD DE,0x01BE
675
                ADD HL,DE                       ;ПЕРЕХОДИМ НА СМЕЩЕНИЕ ДЛЯЧ ПРОВЕРОК
677
                ADD HL,DE                       ; переходим на смещение для проверок
676
                LD A,(HL)                       ;ПРОВЕРЯМ ЧТОБЫ БЫЛ 0, КАРТОЧКИ НЕ МОГУТ БЫТЬ ЗАГРУЗОЧНЫМИ
678
                LD A,(HL)                       ; проверям чтобы был 0, карточки не могут быть загрузочными
677
                AND A
679
                AND A
678
                JR NZ,RDFAT05                   ;ЕСЛИ НЕ 0, ПРОВЕРИТЬ ДРУГОЕ
680
                JR NZ,.L2                       ; если не 0, проверить другое
679
                LD DE,4
681
                LD DE,4
680
                ADD HL,DE                       ;ПЕРЕХОДИМ К ПРОВЕРКЕ ТИПА РАЗДЕЛА
682
                ADD HL,DE                       ; переходим к проверке типа раздела
681
                LD A,(HL)
683
                LD A,(HL)
682
                LD B,0
684
                LD B,0
683
                CP 1                            ;FAT12?
685
                CP 1                            ; FAT12?
684
                JR Z,RDFAT06
686
                JR Z,.L1
685
                LD B,2
687
                LD B,2
686
                CP 0X0B                         ;FAT32?
688
                CP 0x0B                         ; FAT32?
687
                JR Z,RDFAT06
689
                JR Z,.L1
688
                CP 0X0C                         ;FAT32?
690
                CP 0x0C                         ; FAT32?
689
                JR Z,RDFAT06
691
                JR Z,.L1
690
                LD B,1
692
                LD B,1
691
                CP 6                            ;FAT16?
693
                CP 6                            ; FAT16?
692
                JR Z,RDFAT06
694
                JR Z,.L1
693
                CP 4                            ;FAT16?
695
                CP 4                            ; FAT16?
694
                JR Z,RDFAT06
696
                JR Z,.L1
695
                CP 0X0E                         ;FAT16?
697
                CP 0x0E                         ; FAT16?
696
                JR NZ,RDFAT05          
698
                JR NZ,.L2              
697
RDFAT06         LD A,B                          ;БЕРЕМ ИЗ "B" ТИП РАЗДЕЛА
699
.L1             LD A,B                          ; берем из "B" тип раздела
698
                LD (CAL_FAT),A                  ;СОХРАНИЛИ
700
                LD (CAL_FAT),A                  ; сохранили
699
                ADD HL,DE
701
                ADD HL,DE
700
                CALL LOADZP                     ;БЕРЕМ НОМЕР СЕКТОРА НАЧАЛА ОСНОВНОГО РАЗДЕЛА
702
                CALL LOADZP                     ; берем номер сектора начала основного раздела
701
                JR RDFAT00                      ;ПЕРЕХОДИМ К ИНИЦИАЛИЗАЦИИ ПЕРЕМЕННЫХ ДЛЯ РАБОТЫ С ФАТОМ
703
                JR .R1                          ; переходим к инициализации переменных для работы с фатом
702
 
704
 
703
;MBR НЕ ОБНАРУЖЕН, ПРОВЕРЯЕМ СЕКТОР 0 КАРТЫ КАК ОПИСАТЕЛЬ
705
; MBR не обнаружен, проверяем сектор 0 карты как описатель
704
RDFAT05         LD C,(IX+0X0D)                  ;C=КОЛИЧЕСТВО СЕКТОРОВ В КЛАСТЕРЕ
706
.L2             LD C,(IX+0x0D)                  ; C = количество секторов в кластере
705
                XOR A
707
                XOR A
706
                LD E,A
708
                LD E,A
707
                LD B,8
709
                LD B,8
708
                RR C
710
.L3             RR C
709
                ADC A,0
711
                ADC A,0
710
                DJNZ $-4                        ;КОЛИЧЕСТВО СЕКТОРОВ В КЛАСТЕРЕ ДОЛЖНО БЫТЬ СТЕПЕНЬЮ 2
712
                DJNZ .L3                        ; количество секторов в кластере должно быть степенью 2
711
                DEC A
713
                DEC A
712
                JR NZ,$+3                       ;ПРОВЕРИЛИ КОЛИЧЕСТВО БИТ
714
                JR NZ,.L4                       ; проверили количество бит
713
                INC E                           ;+1, ЕСТЬ ТАКОЕ
715
                INC E                           ; +1, есть такое
714
                LD A,(IX+0X0E)
716
.L4             LD A,(IX+0x0E)
715
                OR (IX+0X0F)
717
                OR (IX+0x0F)
716
                JR Z,$+3                        ;КОЛИЧЕСТВО ЗАРЕЗЕРВИРОВАННЫХ СЕКТОРОВ ДОЛЖНО БЫТЬ >0
718
                JR Z,.L5                        ; количество зарезервированных секторов должно быть >0
717
                INC E                           ;+1, ЕСТЬ ТАКОЕ
719
                INC E                           ; +1, есть такое
718
                LD A,(IX+0X13)
720
.L5             LD A,(IX+0x13)
719
                OR (IX+0X14)
721
                OR (IX+0x14)
720
                JR NZ,$+3                       ;КОЛИЧЕСТВО СЕКТОРОВ НА РАЗДЕЛЕ ДЛЯ ФАТ16?
722
                JR NZ,.L6                       ; количество секторов на разделе для ФАТ16?
721
                INC E
723
                INC E
722
                LD A,(IX+0X20)
724
.L6             LD A,(IX+0x20)
723
                OR (IX+0X21)
725
                OR (IX+0x21)
724
                OR (IX+0X22)
726
                OR (IX+0x22)
725
                OR (IX+0X23)
727
                OR (IX+0x23)
726
                JR NZ,$+3                       ;КОЛИЧЕСТВО СЕКТОРОВ НА РАЗДЕЛЕ ДЛЯ ФАТ32?
728
                JR NZ,.L7                       ; количество секторов на разделе для ФАТ32?
727
                INC E                           ;ОДНО ИЗ НИХ ДОЛЖНО БЫТЬ =0, ДРУГОЕ >0
729
                INC E                           ; од но из них должно быть =0, другое >0
728
                LD A,(IX+0X15)
730
.L7             LD A,(IX+0x15)
729
                AND 0XF0
731
                AND 0xF0
730
                CP 0XF0
732
                CP 0xF0
731
                JR NZ,$+3                       ;СТАРШИЕ БИТЫ ДОЛЖНЫ БЫТЬ В 1
733
                JR NZ,.L8                       ; старшие биты должны быть в 1
732
                INC E
734
                INC E
733
                LD A,E
735
.L8             LD A,E
734
                CP 4                            ;УСЛОВИЯ СОВПАЛИ?
736
                CP 4                            ; условия совпали?
735
                LD A,0XDD                       ;FAT НЕ НАЙДЕН
737
                LD A,0xDD                       ; FAT не найден
736
                JP NZ,WR_STAT
738
                JP NZ,WR_STAT
737
                LD A,0XFF
739
                LD A,0xFF
738
                LD (CAL_FAT),A                  ;ТИП ФАТ ПОКА НЕ ОПРЕДЕЛЕН
740
                LD (CAL_FAT),A                  ; тип фат пока не определен
739
                LD DE,0
741
                LD DE,0
740
                LD B,D
742
                LD B,D
741
                LD C,E
743
                LD C,E
742
 
744
 
743
RDFAT00         LD (STARTRZ),DE
745
.R1             LD (STARTRZ),DE
744
                LD (STARTRZ+2),BC               ;ПОЛОЖИЛИ НОМЕР СТАРТОВОГО СЕКТОРА РАЗДЕЛА
746
                LD (STARTRZ+2),BC               ; положили номер стартового сектора раздела
745
                CALL LOADLST                    ;ЗАГРУЗИЛИ ЕГО
747
                CALL LOADLST                    ; загрузили его
746
                LD HL,0
748
                LD HL,0
747
                LD DE,(BUF_512+0X16)            ;BPB_FATSZ16
749
                LD DE,(BUF_512+0x16)            ; BPB_FATSZ16
748
                LD A,D
750
                LD A,D
749
                OR E
751
                OR E
750
                JR NZ,RDFAT01                   ;ЕСЛИ НЕ FAT12/16 (BPB_FATSZ16=0)
752
                JR NZ,.R2                       ; если не FAT12/16 (BPB_FATSZ16=0)
751
                LD DE,(BUF_512+0X24)
753
                LD DE,(BUF_512+0x24)
752
                LD HL,(BUF_512+0X26)            ;BPB_FATSZ32
754
                LD HL,(BUF_512+0x26)            ; BPB_FATSZ32
753
                                                ;ТО БЕРЕМ ИЗ СМЕЩЕНИЯ +36
755
                                                ; то берем из смещения +36
754
RDFAT01         LD (SEC_FAT+2),HL
756
.R2             LD (SEC_FAT+2),HL
755
                LD (SEC_FAT),DE                 ;ЧИСЛО СЕКТОРОВ НА FAT-ТАБЛИЦУ
757
                LD (SEC_FAT),DE                 ; число секторов на FAT-таблицу
756
                LD HL,0
758
                LD HL,0
757
                LD DE,(BUF_512+0X13)            ;BPB_TOTSEC16
759
                LD DE,(BUF_512+0x13)            ; BPB_TOTSEC16
758
                LD A,D
760
                LD A,D
759
                OR E
761
                OR E
760
                JR NZ,RDFAT02                   ;ЕСЛИ НЕ FAT12/16 (BPB_TOTSEC16=0)
762
                JR NZ,.R3                       ; если не FAT12/16 (BPB_TOTSEC16=0)
761
                LD DE,(BUF_512+0X20)
763
                LD DE,(BUF_512+0x20)
762
                LD HL,(BUF_512+0X22)            ;BPB_TOTSEC32
764
                LD HL,(BUF_512+0x22)            ; BPB_TOTSEC32
763
                                                ;ТО БЕРЕМ ИЗ СМЕЩЕНИЯ +32
765
                                                ; то берем из смещения +32
764
RDFAT02         LD (SEC_DSC+2),HL
766
.R3             LD (SEC_DSC+2),HL
765
                LD (SEC_DSC),DE                 ;К-ВО СЕКТОРОВ НА ДИСКЕ/РАЗДЕЛЕ
767
                LD (SEC_DSC),DE                 ; к-во секторов на диске/разделе
766
 
768
 
767
;ВЫЧИСЛЯЕМ ROOTDIRSECTORS
769
; вычисляем ROOTDIRSECTORS
768
                LD BC,(BUF_512+0X0B)            ;BPB_BYTSPERSEC
770
                LD BC,(BUF_512+0x0B)            ; BPB_BYTSPERSEC
769
                LD DE,(BUF_512+0X11)            ;BPB_ROOTENTCNT
771
                LD DE,(BUF_512+0x11)            ; BPB_ROOTENTCNT
770
                LD HL,0
772
                LD HL,0
771
                LD A,D
773
                LD A,D
772
                OR E
774
                OR E
773
                JR Z,RDFAT03
775
                JR Z,.R4
774
                LD B,H
776
                LD B,H
775
                LD C,L
777
                LD C,L
776
                LD A,0X10
778
                LD A,0x10
777
                CALL BCDE_A
779
                CALL BCDE_A
778
                EX DE,HL
780
                EX DE,HL
779
 
781
 
780
;ЭТО РЕАЛИЗОВАНА ФОРМУЛА
782
; это реализована формула
781
;ROOTDIRSECTORS=((BPB_ROOTENTCNT*32)+(BPB_BYTSPERSEC-1))/BPB_BYTSPERSEC
783
; ROOTDIRSECTORS = ((BPB_ROOTENTCNT*32) + (BPB_BYTSPERSEC-1)) / BPB_BYTSPERSEC
782
;В HL=ROOTDIRSECTORS. ЕСЛИ FAT32, ТО HL=0 ВСЕГДА
784
; В HL=ROOTDIRSECTORS. если FAT32, то HL=0 всегда
783
 
785
 
784
RDFAT03         PUSH HL                         ;ROOTDIRSECTORS
786
.R4             PUSH HL                         ; ROOTDIRSECTORS
785
                LD (ROOTSEC),HL
787
                LD (ROOTSEC),HL
786
                LD A,(BUF_512+0X10)
788
                LD A,(BUF_512+0x10)
787
                LD DE,(SEC_FAT)
789
                LD DE,(SEC_FAT)
788
                LD HL,(SEC_FAT+2)
790
                LD HL,(SEC_FAT+2)
789
                DEC A
791
                DEC A
790
                EX DE,HL
792
.R5             EX DE,HL
791
                ADD HL,HL
793
                ADD HL,HL
792
                EX DE,HL
794
                EX DE,HL
793
                ADC HL,HL
795
                ADC HL,HL
794
                DEC A
796
                DEC A
795
                JR NZ,$-6
797
                JR NZ,.R5
796
                POP BC                          ;ПОЛНЫЙ РАЗМЕР FAT-ОБЛАСТИ В СЕКТОРАХ
798
                POP BC                          ; полный размер FAT-области в секторах
797
                CALL HLDEPBC                    ;ПРИБАВИЛИ ROOTDIRSECTORS
799
                CALL HLDEPBC                    ; прибавили ROOTDIRSECTORS
798
                LD BC,(BUF_512+0X0E)            ;BPB_RSVDSECCNT
800
                LD BC,(BUF_512+0x0E)            ; BPB_RSVDSECCNT
799
                LD (RSVDSEC),BC
801
                LD (RSVDSEC),BC
800
                CALL HLDEPBC                    ;ПРИБАВИЛИ BPB_RESVDSECCNT
802
                CALL HLDEPBC                    ; прибавили BPB_RESVDSECCNT
801
                LD (FRSTDAT),DE
803
                LD (FRSTDAT),DE
802
                LD (FRSTDAT+2),HL               ;ПОЛОЖИЛИ НОМЕР ПЕРВОГО СЕКТОРА ДАННЫХ
804
                LD (FRSTDAT+2),HL               ; положили номер первого сектора данных
803
                LD B,H
805
                LD B,H
804
                LD C,L
806
                LD C,L
805
                LD HL,SEC_DSC                   ;BCDE+32-ое ЧИСЛО ПО АДРЕСУ HL
807
                LD HL,SEC_DSC                   ; BCDE + 32-ое число по адресу HL
806
                CALL BCDEHLM                    ;ВЫЧЛИ ИЗ ПОЛНОГО К-ВА СЕКТОРОВ РАЗДЕЛА
808
                CALL BCDEHLM                    ; вычли из полного к-ва секторов раздела
807
                LD A,(BUF_512+0X0D)
809
                LD A,(BUF_512+0x0D)
808
                LD (BYTSSEC),A
810
                LD (BYTSSEC),A
809
                CALL BCDE_A                     ;РАЗДЕЛИЛИ НА К-ВО СЕКТОРОВ В КЛАСТЕРЕ
811
                CALL BCDE_A                     ; разделили на к-во секторов в кластере
810
                LD (CLS_DSC),DE
812
                LD (CLS_DSC),DE
811
                LD (CLS_DSC+2),BC               ;ПОЛОЖИЛИ КОЛ-ВО КЛАСТЕРОВ НА РАЗДЕЛЕ
813
                LD (CLS_DSC+2),BC               ; положили кол-во кластеров на разделе
812
 
814
 
813
                LD A,(CAL_FAT)
815
                LD A,(CAL_FAT)
814
                CP 0XFF
816
                CP 0xFF
815
                JR NZ,RDFAT04
817
                JR NZ,.R6
816
;ОПРЕДЕЛЕНИЕ ТИПА FAT ПРИ ОТСУСТВИИ MBR
818
; определение типа FAT при отсуствии MBR
817
                LD DE,(SEC_FAT-1)
819
                LD DE,(SEC_FAT-1)
818
                LD BC,(SEC_FAT+1)
820
                LD BC,(SEC_FAT+1)
819
                LD E,0                          ;BCDE=КОЛИЧЕСТВО СЕКТОРОВ *0X100
821
                LD E,0                          ; BCDE = количество секторов *0x100
820
                PUSH BC
822
                PUSH BC
821
                PUSH DE                         ;СОХРАНИЛИ
823
                PUSH DE                         ; сохранили
822
                SRL B
824
                SRL B
823
                RR C
825
                RR C
824
                RR D
826
                RR D
825
                RR E                            ;BCDE=КОЛИЧЕСТВО СЕКТОРОВ *0X80
827
                RR E                            ; BCDE = количество секторов *0x80
826
                LD HL,CLS_DSC                   ;КОЛИЧЕСТВО КЛАСТЕРОВ НА FAT
828
                LD HL,CLS_DSC                   ; количество кластеров на FAT
827
                PUSH HL                         ;СОХРАНИЛИ
829
                PUSH HL                         ; сохранили
828
                CALL HLBCDEM                    ;КОЛИЧЕСТВО КЛАСТЕРОВ-(КОЛИЧЕСТВО СЕКТОРОВ*0X80)
830
                CALL HLBCDEM                    ; количество кластеров-(количество секторов*0x80)
829
                LD A,E
831
                LD A,E
830
                AND 0X80                        ;КОЛИЧЕСТВО МЕНЕЕ 128 КЛАСТЕРОВ В СЕКТОРЕ ДЛЯ FAT32
832
                AND 0x80                        ; количество менее 128 кластеров в секторе для FAT32
831
                OR D
833
                OR D
832
                OR C
834
                OR C
833
                OR B
835
                OR B
834
                LD A,2
836
                LD A,2
835
                POP HL
837
                POP HL
836
                POP DE
838
                POP DE
837
                POP BC
839
                POP BC
838
                JR Z,RDFAT04                    ;FAT32 ЕСЛИ ФЛАГ Z=0
840
                JR Z,.R6                        ; FAT32 если флаг Z=0
839
                CALL HLBCDEM                    ;КОЛИЧЕСТВО КЛАСТЕРОВ-(КОЛИЧЕСТВО СЕКТОРОВ*0X100)
841
                CALL HLBCDEM                    ; количество кластеров-(количество секторов*0x100)
840
                LD A,D
842
                LD A,D
841
                OR C
843
                OR C
842
                OR B
844
                OR B
843
                LD A,1
845
                LD A,1
844
                JR Z,RDFAT04                    ;FAT16 ЕСЛИ ФЛАГ Z=0
846
                JR Z,.R6                        ; FAT16 если флаг Z=0
845
                XOR A                           ;ИНАЧЕ FAT12
847
                XOR A                           ; иначе FAT12
846
 
848
 
847
;ДЛЯ FAT12/16 ВЫЧИСЛЯЕМ АДРЕС ПЕРВОГО СЕКТОРА ДИРЕКТОРИИ
849
; для FAT12/16 вычисляем адрес первого сектора директории
848
;ДЛЯ FAT32 БЕРЕМ ПО СМЕЩЕМИЮ +44, НА ВЫХОДЕ BCDE-СЕКТОР ROOTDIR
850
; для FAT32 берем по смещемию +44, на выходе BCDE - сектор ROOTDIR
849
RDFAT04         LD (CAL_FAT),A                  ;УТОЧНИЛИ ТИП ФАТА
851
.R6             LD (CAL_FAT),A                  ; уточнили тип фата
850
                EX AF,AF'
852
                EX AF,AF'
851
                LD DE,(RSVDSEC)
853
                LD DE,(RSVDSEC)
852
                LD BC,0
854
                LD BC,0
853
                LD HL,STARTRZ
855
                LD HL,STARTRZ
854
                CALL BCDEHLP
856
                CALL BCDEHLP
855
                LD (FATSTR),DE
857
                LD (FATSTR),DE
856
                LD (FATSTR+2),BC                ;ВЫЧИСЛИЛИ И ПОЛОЖИЛИ НОМЕР СЕКТОРА НАЧАЛА FAT-ЕАБЛИЦ
858
                LD (FATSTR+2),BC                ; вычислили и положили номер сектора начала FAT-таблиц
857
                EX AF,AF'
859
                EX AF,AF'
858
                AND A
860
                AND A
859
                LD DE,0
861
                LD DE,0
860
                LD B,D
862
                LD B,D
861
                LD C,E
863
                LD C,E
862
                JR Z,FSRROO2                    ;FAT12-NONE
864
                JR Z,.F1                        ; FAT12 - none
863
                DEC A
865
                DEC A
864
                JR Z,FSRROO2                    ;FAT16
866
                JR Z,.F1                        ; FAT16
865
                LD DE,(BUF_512+0X2C)
867
                LD DE,(BUF_512+0x2C)
866
                LD BC,(BUF_512+0X2E)            ;FAT32
868
                LD BC,(BUF_512+0x2E)            ; FAT32
867
FSRROO2         LD (ROOTCLS),DE
869
.F1             LD (ROOTCLS),DE
868
                LD (ROOTCLS+2),BC               ;ПОЛОЖИЛИ НОМЕР КЛАСТЕР ROOT ДИРЕКТОРИИ
870
                LD (ROOTCLS+2),BC               ; положили номер кластер ROOT директории
869
 
871
 
870
                XOR A
872
                XOR A
871
                LD (LVL_DIR),A                  ;НАЧИНАЕМ С ROOT ДИРЕКТОРИИ
873
                LD (LVL_DIR),A                  ; начинаем с ROOT директории
872
                LD HL,(ADRPATH)                 ;ВЕРНУЛИ АДРЕС СТРОКИ ПУТИ ДО ФАЙЛА
874
                LD HL,(ADRPATH)                 ; вернули адрес строки пути до файла
873
FINDFL1         PUSH BC
875
.F6             PUSH BC
874
                PUSH DE                         ;СОХРАНИЛИ НОМЕР КЛАСТЕРА
876
                PUSH DE                         ; сохранили номер кластера
875
                CALL FNDBUF                     ;РАСПАКОВКА ЧАСТИ ТЕКСТОВОЙ СТРОКИ ДЛЯ СОЗДАНИЯ МАСКИ ПОИСКА
877
                CALL FNDBUF                     ; распаковка части текстовой строки для создания маски поиска
876
                POP DE
878
                POP DE
877
                POP BC                          ;ВОССТАНОВИЛИ НОМЕР КЛАСТЕРА
879
                POP BC                          ; восстановили номер кластера
878
                PUSH HL                         ;СОХРАНИЛИ ТЕКУЩИЙ АДРЕС ТЕКСТОВОЙ СТРОКИ
880
                PUSH HL                         ; сохранили текущий адрес текстовой строки
879
 
881
 
880
                LD HL,TDIRCLS                   ;АДРЕС ТАБЛИЦЫ КЛАСТЕРОВ ТЕКУЩЕЙ ДИРЕКТОРИИ
882
                LD HL,TDIRCLS                   ; адрес таблицы кластеров текущей директории
881
                LD A,D
883
                LD A,D
882
                OR E
884
                OR E
883
                OR B
885
                OR B
884
                OR C
886
                OR C
885
                CALL SAVEZP                     ;СОХРАНИЛИ В ТАБЛИЦУ НОМЕР ТЕКУЩЕГО КЛАСТЕРА
887
                CALL SAVEZP                     ; сохранили в таблицу номер текущего кластера
886
                JR Z,LASTCLS                    ;ЕСЛИ НОМЕР КЛАСТЕРА 0, ТО ЭТО ROOT ДИРА (ДЛЯ ФАТ12/16)
888
                JR Z,.F3                        ; если номер кластера 0, то это ROOT дира (для ФАТ12/16)
887
NEXTCLS         PUSH HL
889
.F2             PUSH HL
888
                CALL RDFATZP                    ;ЧИТАЕМ СЛЕДУЩИЙ НОМЕР КЛАСТЕРА ИЗ ЦЕПОЧКИ ДИРЕКТОРИИ
890
                CALL RDFATZP                    ; читаем следущий номер кластера из цепочки директории
889
                CALL LST_CLS                    ;ПРОВЕРЯЕМ НА КОНЕЦ ЦЕПОЧКИ
891
                CALL LST_CLS                    ; проверяем на конец цепочки
890
                POP HL
892
                POP HL
891
                JR C,LASTCLS
893
                JR C,.F3
892
                CALL SAVEZP                     ;ЕСЛИ НЕПОСЛЕДНИЙ СОХРАНЯЕМ В ТАБЛИЦУ
894
                CALL SAVEZP                     ; если непоследний сохраняем в таблицу
893
                JR NEXTCLS                      ;СЛЕДУЮЩИЙ НОМЕР КЛАСТЕРА
895
                JR .F2                          ; следующий номер кластера
894
 
896
 
895
LASTCLS         LD BC,0XFFFF
897
.F3             LD BC,0xFFFF
896
                CALL SAVEZP                     ;КЛАДЕМ МАРКЕР КОНЦА ЦЕПОЧКИ
898
                CALL SAVEZP                     ; кладем маркер конца цепочки
897
                EXX
899
                EXX
898
                LD HL,LVL_DIR
900
                LD HL,LVL_DIR
899
                LD A,(HL)                       ;ТЕКУЩИЙ УРОВЕНЬ ДИРЕКТОРИИ
901
                LD A,(HL)                       ; текущий уровень директории
900
                INC (HL)                        ;СЛЕДУЮЩИЙ УРОВЕНЬ ДИРЕКТОРИИ
902
                INC (HL)                        ; следующий уровень директории
901
                AND A
903
                AND A
902
                LD BC,0                         ;КОЛИЧЕСТВО ЗАПИСЕЙ ROOT ДИРЕКТОРИИ
904
                LD BC,0                         ; количество записей ROOT директории
903
                JR NZ,LASTCLS1
905
                JR NZ,.F4
904
                LD A,(CAL_FAT)
906
                LD A,(CAL_FAT)
905
                CP 2
907
                CP 2
906
                JR NC,LASTCLS1
908
                JR NC,.F4
907
                LD HL,(ROOTSEC)                 ;УЖЕ НЕ ROOT ДИРЕКТОРИЯ
909
                LD HL,(ROOTSEC)                 ; уже не ROOT директория
908
                ADD HL,HL
910
                ADD HL,HL
909
                ADD HL,HL
911
                ADD HL,HL
910
                ADD HL,HL
912
                ADD HL,HL
911
                ADD HL,HL
913
                ADD HL,HL
912
                ADD HL,HL
914
                ADD HL,HL
913
                LD B,H
915
                LD B,H
914
                LD C,L
916
                LD C,L
915
LASTCLS1        EXX
917
.F4             EXX
916
 
918
 
917
FINDFL          INC BC                          ;ИЩЕМ ПО ЗАДАННОЙ МАСКЕ НАЧИНАЯ С 0
919
.F5             INC BC                          ; ищем по заданной маске начиная с 0
918
                CALL RDDIRSC                    ;ГРУЗИМ ПО НОМЕРУ ОПИСАТЕЛЯ СЕКТОР ДИРЕКТОРИИ
920
                CALL RDDIRSC                    ; грузим по номеру описателя сектор директории
919
                LD A,C
921
                LD A,C
920
                AND 0X0F                        ;В СЕКТОРЕ МАКСИМУМ 16 ОПИСАТЕЛЕЙ
922
                AND 0x0F                        ; в секторе максимум 16 описателей
921
                LD E,A
923
                LD E,A
922
                LD D,0
924
                LD D,0
923
                EX DE,HL
925
                EX DE,HL
924
                ADD HL,HL
926
                ADD HL,HL
925
                ADD HL,HL
927
                ADD HL,HL
926
                ADD HL,HL
928
                ADD HL,HL
927
                ADD HL,HL
929
                ADD HL,HL
928
                ADD HL,HL
930
                ADD HL,HL
929
                ADD HL,DE                       ;ПОЛУЧИЛИ АДРЕС НУЖНОГО ОПИСАТЕЛЯ
931
                ADD HL,DE                       ; получили адрес нужного описателя
930
                EXX
932
                EXX
931
                DEC BC
933
                DEC BC
932
                LD A,B
934
                LD A,B
933
                OR C
935
                OR C
934
                EXX
936
                EXX
935
                LD A,0XAA
937
                LD A,0xAA
936
                JP Z,WR_STAT
938
                JP Z,WR_STAT
937
                LD A,(HL)                       ;ПРОВЕРЯЕМ ПЕРВЫЙ БАЙТ ИМЕНИ ОПИСАТЕЛЯ
939
                LD A,(HL)                       ; проверяем первый байт имени описателя
938
                AND A
940
                AND A
939
                LD A,0XAA                       ;ЕСЛИ БАЙТ =0, ТО
941
                LD A,0xAA                       ; если байт =0, то
940
                JP Z,WR_STAT                    ;ПЕРЕХОД ПО ОШИБКЕ = ФАЙЛ НЕ НАЙДЕН
942
                JP Z,WR_STAT                    ; переход по ошибке = файл не найден
941
                PUSH HL
943
                PUSH HL
942
                PUSH BC
944
                PUSH BC
943
                CALL COMPARE                    ;СРАВНИВАЕМ С ЗАДАННОЙ МАСКОЙ
945
                CALL COMPARE                    ; сравниваем с заданной маской
944
                POP BC
946
                POP BC
945
                POP DE
947
                POP DE
946
                PUSH DE
948
                PUSH DE
947
                POP IX                          ;СОДЕРЖИМОЕ IX=АДРЕС ОПИСАТЕЛЯ
949
                POP IX                          ; содержимое IX = адрес описателя
948
                JR NZ,FINDFL                    ;НЕ СОВПАДАЕТ, ПЕРЕХОДИМ К СЛЕДУЮЩЕМУ ОПИСАТЕЛЮ
950
                JR NZ,.F5                       ; не совпадает, переходим к следующему описателю
949
                CALL RD_CLAS                    ;ЗАБИРАЕМ НОМЕР КЛАСТЕРА ИЗ НАЙДЕННОГО ОПИСАТЕЛЯ
951
                CALL RD_CLAS                    ; забираем номер кластера из найденного описателя
950
                EX (SP),HL                      ;ВОССТАНОВИЛИ ТЕКУЩИЙ АДРЕС В СТРОКЕ ПУТИ ДО ФАЙЛА
952
                EX (SP),HL                      ; восстановили текущий адрес в строке пути до файла
951
                INC SP
953
                INC SP
952
                INC SP                          ;МАСКИРОВКА НА СТЕКЕ АДРЕСА РАЗМЕРА В БАЙТАХ ТЕКУЩЕГО ФАЙЛА
954
                INC SP                          ; маскировка на стеке адреса размера в байтах текущего файла
953
                LD A,(HL)
955
                LD A,(HL)
954
                AND A                           ;ТЕКСТОВАЯ СТРОКА КОНЧИЛАСЬ?
956
                AND A                           ; текстовая строка кончилась?
955
                JR NZ,FINDFL1                   ;ЕСЛИ НЕТ, ТО ИЩЕМ ДАЛЬШЕ
957
                JR NZ,.F6                       ; если нет, то ищем дальше
956
                LD A,(IX+0X0B)                  ;ПРОВЕРЯЕМ ЭТО ДИРА ИЛИ ФАЙЛ?
958
                LD A,(IX+0x0B)                  ; проверяем это дира или файл?
957
                AND 0X10
959
                AND 0x10
958
                LD A,0XAA                       ;ЕСЛИ ДИРА, ТО ОШИБКА
960
                LD A,0xAA                       ; если дира, то ошибка
959
                JP NZ,WR_STAT                   ;ТЕКСТОВАЯ СТРОКА ДОЛЖНА УКАЗЫВАТЬ НА ФАЙЛ
961
                JP NZ,WR_STAT                   ; текстовая строка должна указывать на файл
960
                DEC SP
962
                DEC SP
961
                DEC SP
963
                DEC SP
962
                POP HL                          ;ВОССТАНОВИЛИ В HL АДРЕС ОТКУДА ВЗЯТЬ РАЗМЕР ФАЙЛА В БАЙТАХ
964
                POP HL                          ; восстановили в HL адрес откуда взять размер файла в байтах
963
                PUSH BC
965
                PUSH BC
964
                PUSH DE
966
                PUSH DE
965
                CALL LOADZP                     ;ЗАБИРАЕМ РАЗМЕР ФАЙЛА (В БАЙТАХ)
967
                CALL LOADZP                     ; забираем размер файла (в байтах)
966
                LD A,E
968
                LD A,E
967
                AND A
969
                AND A
968
                JR Z,$+3                        ;МЛАДШИЙ БАЙТ РАЗМЕРА ФАЙЛА =0?
970
                JR Z,.F8                        ; младший байт размера файла =0?
969
                INC D                           ;УВЕЛИЧИВАЕМ РАЗМЕР НА 256 БАЙТ БЕЗ УЧЕТА МЛАДШЕГО БАЙТА
971
                INC D                           ; увеличиваем размер на 256 байт без учета младшего байта
970
                BIT 0,D                         ;ПРОВЕРЯЕМ ЧЕТ/НЕЧЕТ
972
.F8             BIT 0,D                         ; проверяем чет/нечет
971
                JR Z,$+3                        ;ЕСЛИ НЕЧЕТ, ТО
973
                JR Z,.F9                        ; если нечет, то
972
                INC D                           ;УВЕЛИЧИВАЕМ РАЗМЕР ЕЩЕ НА 256 БАЙТ
974
                INC D                           ; увеличиваем размер еще на 256 байт
973
                CALL BCDE200                    ;ДЕЛИМ НА 512 (НА РАЗМЕР СЕКТОР)
975
.F9             CALL BCDE200                    ; делим на 512 (на размер сектор)
974
                PUSH DE
976
                PUSH DE
975
                EXX
977
                EXX
976
                POP HL
978
                POP HL
977
                EXX
979
                EXX
978
                LD A,(BYTSSEC)                  ;ВЗЯЛИ РАЗМЕР КЛАСТЕРА В СЕКТОРАХ
980
                LD A,(BYTSSEC)                  ; взяли размер кластера в секторах
979
                LD IXH,A                        ;СОХРАНИЛИ
981
                LD IXH,A                        ; сохранили
980
                POP DE
982
                POP DE
981
                POP BC
983
                POP BC
982
                LD HL,0X8000                    ;АДРЕС ЗАГРУЗКИ
984
                LD HL,0x8000                    ; адрес загрузки
983
 
985
 
984
;HX-РАЗМЕР КЛАСТЕРА
986
; HX - размер кластера
985
;HL'-КОЛ-ВО СЕКТОРОВ ФАЙЛА
987
; HL' - кол-во секторов файла
986
;BCDE-НОМЕР СТАРТОВОГО КЛАСТЕРА
988
; BCDE - номер стартового кластера
987
;LY-СТАРТОВАЯ СТРАНИЦА ЗАГРУЗКИ
989
; LY - стартовая страница загрузки
988
 
990
 
989
                LD A,IYL                        ;ВОССТАНОВИЛИ СТРАНИЦУ ЗАГРУЗКИ
991
                LD A,IYL                        ; восстановили страницу загрузки
990
                AND A
992
                AND A
991
                JR NZ,CP_PAGE                   ;ПРОВЕРКА ДЛЯ ЗАГРУЗКИ В СТРАНИЦУ 0
993
                JR NZ,CP_PAGE                   ; проверка для загрузки в страницу 0
992
                OUT (MPAG),A                    ;ВКЛЮЧАЕМ СТРАНИЦУ 0
994
                OUT (MPAG),A                    ; включаем страницу 0
993
                EXX
995
                EXX
994
                LD A,L
996
                LD A,L
995
                LD DE,0X41
997
                LD DE,0x41
996
                SBC HL,DE
998
                SBC HL,DE
997
                JR C,$+4                        ;ЕСЛИ ФАЙЛ 0X41 И БОЛЕЕ СЕКТОРОВ
999
                JR C,.F7                        ; если файл 0x41 и более секторов
998
                LD A,0X40                       ;ТО ГРУЗИМ ТОЛЬКО 0X40 ПЕРВЫХ СЕКТОРОВ
1000
                LD A,0x40                       ; то грузим только 0x40 первых секторов
999
                EXX
1001
.F7             EXX
1000
                JP LDMINI                       ;ПЕРЕХОДИМ НА ЗАГРУЗКУ
1002
                JP LDMINI                       ; переходим на загрузку
1001
 
1003
 
1002
;ЗАГРУЗКА В СТРАНИЦУ 1 ЗАПРЕЩЕНА
1004
; загрузка в страницу 1 запрещена
1003
CP_PAGE         DEC A
1005
CP_PAGE         DEC A
1004
                LD A,0XAA
1006
                LD A,0xAA
1005
                JP Z,WR_STAT
1007
                JP Z,WR_STAT
1006
                LD A,IYL
1008
                LD A,IYL
1007
 
1009
 
1008
;ВКЛЮЧАЕМ СТРАНИЦУ ЗАГРУЗКИ
1010
; включаем страницу загрузки
1009
LDFILE0         OUT (MPAG),A                    ;ВКЛЮЧАЕМ ЗАДАННУЮ СТРАНИЦУ ДЛЯ ЗАГРУЗКИ
1011
LDFILE0         OUT (MPAG),A                    ; включаем заданную страницу для загрузки
1010
 
1012
 
1011
;ЗАГРУЗКА В СТРАНИЦЫ 02...7F
1013
; загрузка в страницы 02...7F
1012
LD_FILE         EXX
1014
LD_FILE         EXX
1013
                LD E,IXH
1015
                LD E,IXH
1014
                LD D,0                          ;DE=РАЗМЕР КЛАСТЕРА В СЕКТОРАХ
1016
                LD D,0                          ; DE = размер кластера в секторах
1015
                AND A
1017
                AND A
1016
                SBC HL,DE                       ;СВЕРЯЕМ С КОЛИЧЕСТВОМ СЕКТОРОВ ДЛЯ ЗАГРУЗКИ
1018
                SBC HL,DE                       ; сверяем с количеством секторов для загрузки
1017
                LD IXL,IXH                      ;LX=КОЛИЧЕСТВО СЕКТОРОВ ДЛЯ ЗАГРУЗКИ
1019
                LD IXL,IXH                      ; LX = количество секторов для загрузки
1018
                EXX
1020
                EXX
1019
                JR NC,LDFILE1
1021
                JR NC,.L1
1020
                EXX                             ;СЕКТОРОВ ДЛЯ ЗАГРУЗКИ МЕНЬШЕ РАЗМЕРА КЛАСТЕРА
1022
                EXX                             ; секторов для загрузки меньше размера кластера
1021
                ADD HL,DE      
1023
                ADD HL,DE      
1022
                LD A,L
1024
                LD A,L
1023
                LD IXL,A                        ;LX=КОЛИЧЕСТВО СЕКТОРОВ ДЛЯ ЗАГРУЗКИ
1025
                LD IXL,A                        ; LX = количество секторов для загрузки
1024
                EXX
1026
                EXX
1025
 
1027
 
1026
LDFILE1         PUSH BC
1028
.L1             PUSH BC
1027
                PUSH DE
1029
                PUSH DE
1028
                PUSH HL
1030
                PUSH HL
1029
                CALL REALSEC                    ;ПЕРЕВЕЛИ НОМЕР КЛАСТЕРА В НОМЕР РЕАЛЬНОГО СЕКТОРА
1031
                CALL REALSEC                    ; перевели номер кластера в номер реального сектора
1030
                LD A,IXL
1032
                LD A,IXL
1031
                CP 0X41                         ;КОЛИЧЕСТВО СЕКТОРОВ ДЛЯ ЗАГРУЗКИ БОЛЬШЕ 0X40?
1033
                CP 0x41                         ; количество секторов для загрузки больше 0x40?
1032
                JR C,$+4
1034
                JR C,.L2
1033
                LD A,0X40                       ;БУДЕМ ГРУЗИТЬ 0X40 СЕКТОРОВ
1035
                LD A,0x40                       ; будем грузить 0x40 секторов
1034
                POP HL
1036
.L2             POP HL
1035
                LD IYH,A
1037
                LD IYH,A
1036
                CALL RDMULTI                    ;ЗАГРУЖАЕМ СЕКТОРА
1038
                CALL RDMULTI                    ; загружаем сектора
1037
                LD A,IXH
1039
                LD A,IXH
1038
                AND 0X80
1040
                AND 0x80
1039
                JR Z,LDFILE2
1041
                JR Z,.L5
1040
                LD A,IXL
1042
                LD A,IXL
1041
                SUB IYH
1043
                SUB IYH
1042
                JR Z,LDFILE4
1044
                JR Z,.L3
1043
                JR C,LDFILE4
1045
                JR C,.L3
1044
                LD HL,0X40
1046
                LD HL,0x40
1045
                ADD HL,DE
1047
                ADD HL,DE
1046
                EX DE,HL
1048
                EX DE,HL
1047
                LD HL,0
1049
                LD HL,0
1048
                ADC HL,BC
1050
                ADC HL,BC
1049
                LD B,H
1051
                LD B,H
1050
                LD C,L
1052
                LD C,L
1051
                LD L,A
1053
                LD L,A
1052
                INC IYL
1054
                INC IYL
1053
                LD A,IYL
1055
                LD A,IYL
1054
                CP 0X40
1056
                CP 0x40
1055
                JR C,LDFILE3
1057
                JR C,.L4
1056
LDFILE4         INC SP
1058
.L3             INC SP
1057
                INC SP
1059
                INC SP
1058
                INC SP
1060
                INC SP
1059
                INC SP
1061
                INC SP
1060
                JR LDEFILE
1062
                JR LDEFILE
1061
 
1063
 
1062
LDFILE3         OUT (MPAG),A                    ;СЛЕДУЮЩАЯ СТРАНИЦА
1064
.L4             OUT (MPAG),A                    ; следующая страница
1063
                LD A,L
1065
                LD A,L
1064
                LD HL,0X8000
1066
                LD HL,0x8000
1065
                CALL RDMULTI
1067
                CALL RDMULTI
1066
LDFILE2         POP DE
1068
.L5             POP DE
1067
                POP BC
1069
                POP BC
1068
                PUSH HL
1070
                PUSH HL
1069
                CALL RDFATZP
1071
                CALL RDFATZP
1070
                CALL LST_CLS
1072
                CALL LST_CLS
1071
                POP HL
1073
                POP HL
Line 1074... Line 1076...
1074
                CP IXH
1076
                CP IXH
1075
                JR C,LDEFILE
1077
                JR C,LDEFILE
1076
                LD A,H
1078
                LD A,H
1077
                AND A
1079
                AND A
1078
                JR NZ,LD_FILE
1080
                JR NZ,LD_FILE
1079
                LD HL,0X8000
1081
                LD HL,0x8000
1080
                INC IYL
1082
                INC IYL
1081
                LD A,IYL
1083
                LD A,IYL
1082
                CP 0X40
1084
                CP 0x40
1083
                JR C,LDFILE0
1085
                JR C,LDFILE0
1084
LDEFILE         XOR A
1086
LDEFILE         XOR A
1085
                JP WR_STAT
1087
                JP WR_STAT
1086
 
1088
 
1087
LDMINI          EXX
1089
LDMINI          EXX
Line 1135... Line 1137...
1135
                INC HL
1137
                INC HL
1136
                LD B,(HL)
1138
                LD B,(HL)
1137
                INC HL
1139
                INC HL
1138
                RET
1140
                RET
1139
 
1141
 
1140
;ЧТЕНИЕ СЕКТОРА DIR ПО НОМЕРУ BC
1142
; чтение сектора DIR по номеру BC
1141
RDDIRSC         PUSH BC
1143
RDDIRSC         PUSH BC
1142
                LD D,B
1144
                LD D,B
1143
                LD E,C
1145
                LD E,C
1144
                LD BC,0
1146
                LD BC,0
1145
                LD A,0X10
1147
                LD A,0x10
1146
                CALL BCDE_A
1148
                CALL BCDE_A
1147
                LD A,E
1149
                LD A,E
1148
                PUSH AF
1150
                PUSH AF
1149
                LD A,(BYTSSEC)
1151
                LD A,(BYTSSEC)
1150
                PUSH AF
1152
                PUSH AF
Line 1171... Line 1173...
1171
                LD C,L
1173
                LD C,L
1172
                CALL LOADLST
1174
                CALL LOADLST
1173
                POP BC
1175
                POP BC
1174
                RET
1176
                RET
1175
 
1177
 
1176
;ПРОВЕРКА НА ПОСЛЕДНИЙ КЛАСТЕР В ЦЕПОЧКЕ
1178
; проверка на последний кластер в цепочке
1177
LST_CLS         LD A,(CAL_FAT)                  ;ЗАВИСИТ ОТ РАЗРЯДНОСТИ ФАТА
1179
LST_CLS         LD A,(CAL_FAT)                  ; зависит от разрядности фата
1178
                AND A
1180
                AND A
1179
                JR NZ,LST_CL1
1181
                JR NZ,LST_CL1
1180
                LD HL,0X0FF7                    ;ПРОВЕРКА ДЛЯ ФАТ12
1182
                LD HL,0x0FF7                    ; проверка для ФАТ12
1181
                SBC HL,DE
1183
                SBC HL,DE
1182
                RET
1184
                RET
1183
 
1185
 
1184
LST_CL1         DEC A
1186
LST_CL1         DEC A
1185
                JR NZ,LST_CL2
1187
                JR NZ,LST_CL2
1186
LST_CL3         LD HL,0XFFF7                    ;ПРОВЕРКАМ ДЛЯ ФАТ16 И МЛАДШИХ БИТ ФАТ32
1188
LST_CL3         LD HL,0xFFF7                    ; проверкам для ФАТ16 и младших бит ФАТ32
1187
                SBC HL,DE
1189
                SBC HL,DE
1188
                RET
1190
                RET
1189
 
1191
 
1190
LST_CL2         LD HL,0X0FFF                    ;ПРОВЕРКА ДЛЯ СТАРШИХ БИТ ФАТ32
1192
LST_CL2         LD HL,0x0FFF                    ; проверка для старших бит ФАТ32
1191
                SBC HL,BC
1193
                SBC HL,BC
1192
                RET NZ
1194
                RET NZ
1193
                JR LST_CL3
1195
                JR LST_CL3
1194
 
1196
 
1195
;ЧТЕНИЕ СЛЕДУЮЩЕГО НОМЕРА КЛАСТЕРА В ЦЕПОЧКЕ
1197
; чтение следующего номера кластера в цепочке
1196
RDFATZP         LD A,(CAL_FAT)                  ;ЧТЕНИЕ ЗАВИСИТ ОТ РАЗРАДНОСТИ ФАТА
1198
RDFATZP         LD A,(CAL_FAT)                  ; чтение зависит от разрадности фата
1197
                AND A
1199
                AND A
1198
                JR Z,RDFATS0                    ;ПЕРЕХОД ВПЕРЕД ДЛЯ ФАТ12
1200
                JR Z,RDFATS0                    ; переход вперед для ФАТ12
1199
                DEC A
1201
                DEC A
1200
                JR Z,RDFATS1                    ;ПЕРЕХОД ВПЕРЕД ДЛЯ ФАТ16
1202
                JR Z,RDFATS1                    ; переход вперед для ФАТ16
1201
                EX DE,HL                        ;ЗДЕСЬ ЧТЕНИЕ ДЛЯ ФАТ32
1203
                EX DE,HL                        ; здесь чтение для ФАТ32
1202
                ADD HL,HL
1204
                ADD HL,HL
1203
                EX DE,HL
1205
                EX DE,HL
1204
                LD HL,0
1206
                LD HL,0
1205
                ADC HL,BC
1207
                ADC HL,BC
1206
                ADC HL,BC                       ;УМНОЖИЛИ НОМЕР КЛАСТЕРА НА 2
1208
                ADC HL,BC                       ; умножили номер кластера на 2
1207
                LD A,E
1209
                LD A,E
1208
                LD E,D
1210
                LD E,D
1209
                LD D,L
1211
                LD D,L
1210
                LD C,H
1212
                LD C,H
1211
                LD B,0                          ;РАЗДЕЛИЛИ НОМЕР КЛАСТЕРА НА 256
1213
                LD B,0                          ; разделили номер кластера на 256
1212
                CALL RDFATS2                    ;ЧИТАЕМ МЛАДШИЕ 16 БИТ ИСПОЛЬЗУЯ ЧТЕНИЕ ДЛЯ ФАТ16
1214
                CALL RDFATS2                    ; читаем младшие 16 бит используя чтение для ФАТ16
1213
                INC HL
1215
                INC HL
1214
                LD C,(HL)
1216
                LD C,(HL)
1215
                INC HL
1217
                INC HL
1216
                LD B,(HL)                       ;ПРОЧИТАЛИ ПОСЛЕДУЮЩИЕ СТАРШИЕ 16 БИТ
1218
                LD B,(HL)                       ; прочитали последующие старшие 16 бит
1217
                RET
1219
                RET
1218
 
1220
 
1219
;ЧТЕНИЕ 16 БИТНОГО НОМЕРА КЛАСТЕРА ИЗ ЦЕПОЧКИ ДЛЯ ФАТ16
1221
; чтение 16 битного номера кластера из цепочки для ФАТ16
1220
RDFATS1         LD BC,0
1222
RDFATS1         LD BC,0
1221
                LD A,E
1223
                LD A,E
1222
                LD E,D
1224
                LD E,D
1223
                LD D,C                          ;РАЗДЕЛИЛИ НОМЕР КЛАСТЕРА НА 256, СТАРШИЕ 16 БИТ =0
1225
                LD D,C                          ; разделили номер кластера на 256, старшие 16 бит =0
1224
RDFATS2         PUSH AF                         ;ОБЩЕЕ ЧТЕНИЕ 16 БИТНОГО НОМЕРА КЛАСТЕРА ДЛЯ ФАТ16/32
1226
RDFATS2         PUSH AF                         ; общее чтение 16 битного номера кластера для ФАТ16/32
1225
                PUSH BC
1227
                PUSH BC
1226
                LD HL,FATSTR
1228
                LD HL,FATSTR
1227
                CALL BCDEHLP                    ;ПРИБАВИЛИ СМЕЩЕНИЕ ОТ НАЧАЛА ФАТ ТАБЛИЦЫ
1229
                CALL BCDEHLP                    ; прибавили смещение от начала фат таблицы
1228
                CALL LOADLST                    ;ЗАГРУЗИЛИ ВЫЧИСЛЕННЫЙ НОМЕР СЕКТОРА
1230
                CALL LOADLST                    ; загрузили вычисленный номер сектора
1229
                POP BC
1231
                POP BC
1230
                POP AF
1232
                POP AF
1231
                LD E,A
1233
                LD E,A
1232
                LD D,0
1234
                LD D,0
1233
                ADD HL,DE
1235
                ADD HL,DE
1234
                ADD HL,DE                       ;ВЫЧИСЛИЛИ СМЕЩЕНИЕ ДО НУЖНОГО НОМЕРА В ЗАГРУЖЕННОМ СЕКТОРЕ
1236
                ADD HL,DE                       ; вычислили смещение до нужного номера в загруженном секторе
1235
                LD E,(HL)
1237
                LD E,(HL)
1236
                INC HL
1238
                INC HL
1237
                LD D,(HL)                       ;ПОЛУЧИЛИ 16 БИТ НОМЕРА КЛАСТЕРА
1239
                LD D,(HL)                       ; получили 16 бит номера кластера
1238
                RET
1240
                RET
1239
 
1241
 
1240
;ЧТЕНИЕ 12 БИТНОГО НОМЕРА КЛАСТЕРА ИЗ ЦЕПОЧКИ ДЛЯ ФАТ12
1242
; чтение 12 битного номера кластера из цепочки для ФАТ12
1241
RDFATS0         LD H,D
1243
RDFATS0         LD H,D
1242
                LD L,E
1244
                LD L,E
1243
                ADD HL,HL
1245
                ADD HL,HL
1244
                ADD HL,DE                       ;HL=HL*3
1246
                ADD HL,DE                       ; HL = HL * 3
1245
                SRL H
1247
                SRL H
1246
                RR L                            ;HL=HL/2 - В ИТОГЕ УМНОЖИЛИ НОМЕР КЛАСТЕРА НА 1,5
1248
                RR L                            ; HL = HL / 2 - в итоге умножили номер кластера на 1,5
1247
                LD A,E                          ;A-НАМ ИНТЕРЕСЕН ТОЛЬКО БИТ НОМЕР СТАРОГО НОМЕРА КЛАСТЕРА
1249
                LD A,E                          ; A - нам интересен только бит номер старого номера кластера
1248
                LD E,H
1250
                LD E,H
1249
                LD D,0
1251
                LD D,0
1250
                LD B,D
1252
                LD B,D
1251
                LD C,D                          ;РАЗДЕЛИЛИ НОМЕР КЛАСТЕРА НА 256
1253
                LD C,D                          ; разделили номер кластера на 256
1252
                SRL E
1254
                SRL E
1253
                PUSH AF
1255
                PUSH AF
1254
                PUSH HL
1256
                PUSH HL
1255
                LD HL,FATSTR
1257
                LD HL,FATSTR
1256
                CALL BCDEHLP                    ;ПРИБАВИЛИ СМЕЩЕНИЕ ОТ НАЧАЛА ФАТ ТАБЛИЦЫ
1258
                CALL BCDEHLP                    ; прибавили смещение от начала фат таблицы
1257
                CALL LOADLST                    ;ЗАГРУЗИЛИ ВЫВЧИСЛЕННЫЙ СЕКТОР
1259
                CALL LOADLST                    ; загрузили вывчисленный сектор
1258
                POP BC
1260
                POP BC
1259
                LD A,B
1261
                LD A,B
1260
                AND 1
1262
                AND 1
1261
                LD B,A                          ;BC=СМЕЩЕНИЕ В ЗАГРУЖЕННОМ СЕКТОРЕ
1263
                LD B,A                          ; BC = смещение в загруженном секторе
1262
                ADD HL,BC                       ;HL=АДРЕС ОТКУДА ЧИТАТЬ БАЙТЫ НОМЕРА КЛАСТЕРА
1264
                ADD HL,BC                       ; HL = адрес откуда читать байты номера кластера
1263
                LD B,(HL)                       ;ПРОЧИТАЛИ МЛАДШУЮ ЧАСТЬ НОМЕРА КЛАСТЕРА
1265
                LD B,(HL)                       ; прочитали младшую часть номера кластера
1264
                INC HL                          ;АДРЕС СЛЕДУЮЩЕГО БАЙТА
1266
                INC HL                          ; адрес следующего байта
1265
                LD A,H
1267
                LD A,H
1266
                CP HIGH (BUF_512)+2             ;ПРОВЕРКА НА ПЕРЕХОД ГРАНИЦЫ ЗАГРУЖЕННОГО СЕКТОРА
1268
                CP HIGH (BUF_512)+2             ; проверка на переход границы загруженного сектора
1267
                JR NZ,RDFATS4
1269
                JR NZ,RDFATS4
1268
                PUSH BC                         ;ВЫХОД ЗА ПРЕДЕЛЫ ТЕКУЩЕГО ЗАГРУЖЕННОГО СЕКТОРА
1270
                PUSH BC                         ; выход за пределы текущего загруженного сектора
1269
                LD BC,0
1271
                LD BC,0
1270
                INC DE
1272
                INC DE
1271
                CALL LOADLST                    ;ЗАГРУЖАЕМ СЛЕДУЮЩИЙ СЕКТОР ФАТ ТАБЛИЦЫ
1273
                CALL LOADLST                    ; загружаем следующий сектор фат таблицы
1272
                POP BC
1274
                POP BC
1273
RDFATS4         POP AF
1275
RDFATS4         POP AF
1274
                LD D,(HL)                       ;ЧИТАЕМ СТАРШИЕ БИТЫ НОМЕРА КЛАСТЕРА
1276
                LD D,(HL)                       ; читаем старшие биты номера кластера
1275
                LD E,B                          ;ТЕПЕРЬ DE=НОМЕР СЛЕДУЮЩЕГО КЛАСТЕРА В ЦЕПОЧКЕ
1277
                LD E,B                          ; теперь DE = номер следующего кластера в цепочке
1276
                LD BC,0
1278
                LD BC,0
1277
                RRA                             ;ПРОВЕРЯЕМ БИТ 0 СТАРОГО НОМЕРА КЛАСТЕРА
1279
                RRA                             ; проверяем бит 0 старого номера кластера
1278
                JR NC,RDFATS3
1280
                JR NC,RDFATS3
1279
                SRL D                           ;СДВИГАЕМ НОМЕР ПРОЧИТАННОГО НОМЕРА КЛАСТЕРА В МЛАДШИЕ 12 БИТ
1281
                SRL D                           ; сдвигаем номер прочитанного номера кластера в младшие 12 бит
1280
                RR E
1282
                RR E
1281
                SRL D
1283
                SRL D
1282
                RR E
1284
                RR E
1283
                SRL D
1285
                SRL D
1284
                RR E
1286
                RR E
1285
                SRL D
1287
                SRL D
1286
                RR E
1288
                RR E
1287
RDFATS3         LD A,D
1289
RDFATS3         LD A,D
1288
                AND 0X0F
1290
                AND 0x0F
1289
                LD D,A                          ;СБРОСИЛИ НЕЗНАЧАЩИЕ СТАРШИЕ 4 БИТА У ПОЛУЧЕННОГО НОМЕРА КЛАСТЕРА
1291
                LD D,A                          ; сбросили незначащие старшие 4 бита у полученного номера кластера
1290
                RET
1292
                RET
1291
 
1293
 
1292
;ВЫЧИСЛЕНИЕ РЕАЛЬНОГО СЕКТОРА
1294
; вычисление реального сектора
1293
;НА ВХОДЕ BCDE=НОМЕР КЛАСТЕРА FAT
1295
; на входе BCDE = номер кластера FAT
1294
;НА ВЫХОДЕ BCDE=НОМЕР РЕАЛЬНОГО СЕКТОРА
1296
; на выходе BCDE = номер реального сектора
1295
REALSEC         LD A,B
1297
REALSEC         LD A,B
1296
                OR C
1298
                OR C
1297
                OR D
1299
                OR D
1298
                OR E
1300
                OR E
1299
                JR NZ,REALSE1                   ;BCDE=0?
1301
                JR NZ,REALSE1                   ; BCDE = 0?
1300
                LD HL,SEC_FAT                   ;ЭТО ROOT ДИРЕКТОРИЯ У ФАТ12/16
1302
                LD HL,SEC_FAT                   ; это root директория у ФАТ12/16
1301
                LD DE,(FATSTR)                  ;МЕСТОПОЛОЖЕНИЕ ROOT ДИРЫ СРАЗУ ПОСЛЕ ФАТ ТАБЛИЦЫ
1303
                LD DE,(FATSTR)                  ; местоположение ROOT диры сразу после фат таблицы
1302
                LD BC,(FATSTR+2)
1304
                LD BC,(FATSTR+2)
1303
                PUSH HL
1305
                PUSH HL
1304
                CALL BCDEHLP                    ;ПРИБАВИЛИ К НАЧАЛУ ФАТ ТАБЛИЦЫ ЕЕ РАЗМЕР
1306
                CALL BCDEHLP                    ; прибавили к началу фат таблицы ее размер
1305
                POP HL
1307
                POP HL
1306
                JP BCDEHLP                      ;ПРИБАВИЛИ ЕЩЕ РАЗ И ПОЛУЧИЛИ НОМЕР СЕКТОРА НАЧАЛА ROOT ДИРЫ
1308
                JP BCDEHLP                      ; прибавили еще раз и получили номер сектора начала ROOT диры
1307
 
1309
 
1308
REALSE1         LD HL,0XFFFE
1310
REALSE1         LD HL,0xFFFE
1309
                EX DE,HL
1311
                EX DE,HL
1310
                ADD HL,DE
1312
                ADD HL,DE
1311
                EX DE,HL
1313
                EX DE,HL
1312
                INC HL
1314
                INC HL
1313
                ADC HL,BC                       ;HLDE=НОМЕР КЛАСТЕРА-2
1315
                ADC HL,BC                       ; HLDE = номер кластера - 2
1314
                LD A,(BYTSSEC)                  ;НУЖНО УМНОЖИТЬ НА РАЗМЕР КЛАСТЕРА
1316
                LD A,(BYTSSEC)                  ; нужно умножить на размер кластера
1315
                JR REALSE2
1317
                JR REALSE2
1316
 
1318
 
1317
REALSE3         SLA E
1319
REALSE3         SLA E
1318
                RL D
1320
                RL D
1319
                RL L
1321
                RL L
1320
                RL H
1322
                RL H
1321
REALSE2         RRCA
1323
REALSE2         RRCA
1322
                JR NC,REALSE3                   ;УМНОЖИЛИ НА РАЗМЕР КЛАСТЕРА
1324
                JR NC,REALSE3                   ; умножили на размер кластера
1323
                LD B,H
1325
                LD B,H
1324
                LD C,L
1326
                LD C,L
1325
                LD HL,STARTRZ
1327
                LD HL,STARTRZ
1326
                CALL BCDEHLP                    ;ПРИБАВИЛИ СМЕЩЕНИЕ ОТ НАЧАЛА ДИСКА
1328
                CALL BCDEHLP                    ; прибавили смещение от начала диска
1327
                LD HL,FRSTDAT
1329
                LD HL,FRSTDAT
1328
                JP BCDEHLP                      ;ПРИБАВИЛИ СМЕЩЕНИЕ ОТ НАЧАЛА РАЗДЕЛА
1330
                JP BCDEHLP                      ; прибавили смещение от начала раздела
1329
 
1331
 
1330
;BCDE=BCDE/512
1332
; BCDE = BCDE / 512
1331
BCDE200         LD E,D
1333
BCDE200         LD E,D
1332
                LD D,C
1334
                LD D,C
1333
                LD C,B
1335
                LD C,B
1334
                LD B,0
1336
                LD B,0
1335
                LD A,2
1337
                LD A,2
1336
                JR BCDE_A
1338
                JR BCDE_A
1337
 
1339
 
1338
;BCDE>>A=BCDE
1340
; BCDE = BCDE >> A
1339
BCDE_A1         SRL B
1341
BCDE_A1         SRL B
1340
                RR C
1342
                RR C
1341
                RR D
1343
                RR D
1342
                RR E
1344
                RR E
1343
BCDE_A          RRCA
1345
BCDE_A          RRCA
1344
                JR NC,BCDE_A1
1346
                JR NC,BCDE_A1
1345
                RET
1347
                RET
1346
 
1348
 
1347
;(ADR)-BCDE=BCDE
1349
; BCDE = (ADR) - BCDE
1348
BCDEHLM         LD A,(HL)
1350
BCDEHLM         LD A,(HL)
1349
                INC HL
1351
                INC HL
1350
                SUB E
1352
                SUB E
1351
                LD E,A
1353
                LD E,A
1352
                LD A,(HL)
1354
                LD A,(HL)
Line 1360... Line 1362...
1360
                LD A,(HL)
1362
                LD A,(HL)
1361
                SBC A,B
1363
                SBC A,B
1362
                LD B,A
1364
                LD B,A
1363
                RET
1365
                RET
1364
 
1366
 
1365
;(ADR)+BCDE=BCDE
1367
; BCDE = (ADR) + BCDE
1366
BCDEHLP         LD A,(HL)
1368
BCDEHLP         LD A,(HL)
1367
                INC HL
1369
                INC HL
1368
                ADD A,E
1370
                ADD A,E
1369
                LD E,A
1371
                LD E,A
1370
                LD A,(HL)
1372
                LD A,(HL)
Line 1378... Line 1380...
1378
                LD A,(HL)
1380
                LD A,(HL)
1379
                ADC A,B
1381
                ADC A,B
1380
                LD B,A
1382
                LD B,A
1381
                RET
1383
                RET
1382
 
1384
 
1383
;HLDE+BC=HLDE
1385
; HLDE = HLDE + BC
1384
HLDEPBC         EX DE,HL
1386
HLDEPBC         EX DE,HL
1385
                ADD HL,BC
1387
                ADD HL,BC
1386
                EX DE,HL
1388
                EX DE,HL
1387
                LD BC,0
1389
                LD BC,0
1388
                ADC HL,BC
1390
                ADC HL,BC
1389
                RET
1391
                RET
1390
 
1392
 
1391
;BCDE-(ADR)=BCDE
1393
; BCDE = BCDE - (ADR)
1392
HLBCDEM         LD A,E
1394
HLBCDEM         LD A,E
1393
                SUB (HL)
1395
                SUB (HL)
1394
                INC HL
1396
                INC HL
1395
                LD E,A
1397
                LD E,A
1396
                LD A,D
1398
                LD A,D
Line 1404... Line 1406...
1404
                LD A,B
1406
                LD A,B
1405
                SBC A,(HL)
1407
                SBC A,(HL)
1406
                LD B,A
1408
                LD B,A
1407
                RET
1409
                RET
1408
 
1410
 
1409
;ГРУЗИЛКА ОДНОГО СЕКТОРА
1411
; грузилка одного сектора
1410
LOADLST         CALL CPNUMSC
1412
LOADLST         CALL CPNUMSC
1411
                JR NZ,LOADLST1
1413
                JR NZ,LOADLST1
1412
                LD HL,BUF_512
1414
                LD HL,BUF_512
1413
                RET
1415
                RET
1414
 
1416
 
1415
LOADLST1        LD HL,BUF_512                   ;АДРЕС БУФЕРА СЕКТОРА
1417
LOADLST1        LD HL,BUF_512                   ; адрес буфера сектора
1416
                LD A,1                          ;ГРУЗИТЬ 1 СЕКТОР
1418
                LD A,1                          ; грузить 1 сектор
1417
                PUSH HL
1419
                PUSH HL
1418
                CALL RDMULTI                    ;ЗАГРУЗИЛИ СЕКТОР
1420
                CALL RDMULTI                    ; загрузили сектор
1419
                POP HL                          ;НА ВЫХОДЕ HL=АДРЕС НАЧАЛА БУФЕРА ЗАГРУЖЕННОГО СЕКТОРА
1421
                POP HL                          ; на выходе HL=адрес начала буфера загруженного сектора
1420
                RET
1422
                RET
1421
 
1423
 
1422
;ПРОВЕРКА НА УЖЕ ЗАГРУЖЕННЫЙ СЕКТОР
1424
; проверка на уже загруженный сектор
1423
CPNUMSC         LD HL,LSTLOAD
1425
CPNUMSC         LD HL,LSTLOAD
1424
                LD A,(HL)
1426
                LD A,(HL)
1425
                INC HL
1427
                INC HL
1426
                CP E
1428
                CP E
1427
                RET NZ
1429
                RET NZ
Line 1435... Line 1437...
1435
                RET NZ
1437
                RET NZ
1436
                LD A,(HL)
1438
                LD A,(HL)
1437
                CP B
1439
                CP B
1438
                RET
1440
                RET
1439
 
1441
 
1440
;ПОДАЧА КОМАНДЫ В SD КАРТУ БЕЗ ПАРАМЕТРОВ
1442
; подача команды в SD карту без параметров
1441
OUTCOM          PUSH BC
1443
OUTCOM          PUSH BC
1442
                LD BC,0X0600+SD_SEND            ;ВЫДАТЬ В ПОРТ 6 БАЙТ
1444
                LD BC,0x0600+SD_SEND            ; выдать в порт 6 байт
1443
                OTIR
1445
                OTIR
1444
                POP BC
1446
                POP BC
1445
                RET
1447
                RET
1446
 
1448
 
1447
;ВЫДАЧА В ПОРТ SD КАРТЫ КОМАНДЫ С ПАРАМЕТРОМ 0
1449
; выдача в порт SD карты команды с параметром 0
1448
OUT_COM         PUSH BC
1450
OUT_COM         PUSH BC
1449
                LD BC,SD_SEND
1451
                LD BC,SD_SEND
-
 
1452
                in (c) ;in f,(c)
-
 
1453
                in (c) ;in f,(c)
1450
                OUT (C),A                       ;ОТПРАВИЛИ КОД КОМАНДЫ
1454
                OUT (C),A                       ; отправили код команды
1451
                XOR A
1455
                XOR A
1452
                OUT (C),A                       ;БИТЫ 31-24 ПАРАМЕТРА
1456
                OUT (C),A                       ; биты 31-24 параметра
1453
                NOP
1457
                NOP
1454
                OUT (C),A                       ;БИТЫ 23-16 ПАРАМЕТРА
1458
                OUT (C),A                       ; биты 23-16 параметра
1455
                NOP
1459
                NOP
1456
                OUT (C),A                       ;БИТЫ 15-8 ПАРАМЕТРА
1460
                OUT (C),A                       ; биты 15-8 параметра
1457
                NOP
1461
                NOP
1458
                OUT (C),A                       ;БИТЫ 7-0 ПАРАМЕТРА
1462
                OUT (C),A                       ; биты 7-0 параметра
1459
                DEC A
1463
                DEC A
1460
                OUT (C),A                       ;БЕЗ CRC16
1464
                OUT (C),A                       ; без CRC16
1461
                POP BC
1465
                POP BC
1462
                RET
1466
                RET
1463
 
1467
 
1464
SECM200         PUSH HL
1468
SECM200         PUSH HL
1465
                PUSH BC
1469
                PUSH BC
1466
                LD A,CMD_58
1470
                LD A,CMD_58
-
 
1471
                LD BC,SD_RSTR
1467
                CALL OUT_COM
1472
                CALL OUT_COM
1468
                CALL IN_OOUT
1473
                CALL IN_OOUT
1469
                LD BC,SD_RSTR
-
 
1470
                IN H,(C)
1474
                IN H,(C)
1471
                NOP
1475
                NOP
1472
                IN A,(C)
1476
                IN A,(C)
1473
                NOP
1477
                NOP
1474
                IN A,(C)
1478
                IN A,(C)
1475
                NOP
1479
                NOP
1476
                IN A,(C)
1480
                IN A,(C)
1477
                BIT 6,H
1481
                BIT 6,H
1478
                POP HL
1482
                POP HL
1479
                JR NZ,SECN200
1483
                JR NZ,.L1
1480
                EX DE,HL
1484
                EX DE,HL
1481
                ADD HL,HL
1485
                ADD HL,HL
1482
                EX DE,HL
1486
                EX DE,HL
1483
                ADC HL,HL
1487
                ADC HL,HL
1484
                LD H,L
1488
                LD H,L
1485
                LD L,D
1489
                LD L,D
1486
                LD D,E
1490
                LD D,E
1487
                LD E,0
1491
                LD E,0
1488
SECN200         LD A,CMD_18
1492
.L1             LD A,CMD_18
1489
                LD C,SD_SEND
1493
                LD C,SD_SEND
-
 
1494
                in (c) ;in f,(c)
-
 
1495
                in (c) ;in f,(c)
1490
                OUT (C),A
1496
                OUT (C),A
1491
                NOP
1497
                NOP
1492
                OUT (C),H
1498
                OUT (C),H
1493
                NOP
1499
                NOP
1494
                OUT (C),L
1500
                OUT (C),L
1495
                NOP
1501
                NOP
1496
                OUT (C),D
1502
                OUT (C),D
1497
                NOP
1503
                NOP
1498
                OUT (C),E
1504
                OUT (C),E
1499
                LD A,0XFF
1505
                LD A,0xFF
1500
                OUT (C),A
1506
                OUT (C),A
1501
                POP HL
1507
                POP HL
1502
                RET
1508
                RET
1503
 
1509
 
1504
IN_OOUT         EXX
1510
IN_OOUT         EXX
1505
                LD DE,0X20FF
1511
                LD DE,0x30FF
1506
IN_WAIT         IN A,(SD_RSTR)
1512
.L1             IN A,(SD_RSTR)
1507
                CP E
1513
                CP E
1508
                JR NZ,IN_EXIT
1514
                JR NZ,.L2
1509
IN_NEXT         DEC D
1515
                DEC D
1510
                JR NZ,IN_WAIT
1516
                JR NZ,.L1
1511
IN_EXIT         EXX
1517
.L2             EXX
1512
                RET
1518
                RET
1513
 
1519
 
1514
CMD00           DB 0X40,0X00,0X00,0X00,0X00,0X95;GO_IDLE_STATE
1520
CMD00           DB 0x40,0x00,0x00,0x00,0x00,0x95;GO_IDLE_STATE
1515
CMD08           DB 0X48,0X00,0X00,0X01,0XAA,0X87;SEND_IF_COND
1521
CMD08           DB 0x48,0x00,0x00,0x01,0xAA,0x87;SEND_IF_COND
1516
CMD16           DB 0X50,0X00,0X00,0X02,0X00,0XFF;SET_BLOCKEN
1522
CMD16           DB 0x50,0x00,0x00,0x02,0x00,0xFF;SET_BLOCKEN
1517
 
1523
 
1518
;МНОГО СЕКТОРНОЕ ЧТЕНИЕ С SD КАРТЫ
1524
; много секторное чтение с SD карты
1519
RDMULTI         EX AF,AF'
1525
RDMULTI         EX AF,AF'
1520
                CALL SECM200
1526
                CALL SECM200
1521
                EX AF,AF'
1527
                EX AF,AF'
1522
                LD BC,SD_RSTR
1528
                LD BC,SD_RSTR
1523
RDMULT1         EX AF,AF'
1529
.L1             EX AF,AF'
1524
                CALL IN_OOUT
1530
.L2             CALL IN_OOUT
1525
                CP 0XFE
1531
                CP 0xFE
1526
                JR NZ,$-5
1532
                JR NZ,.L2
1527
                INIR
1533
                INIR
1528
                NOP
1534
                NOP
1529
                INIR
1535
                INIR
1530
                NOP
1536
                NOP
1531
                IN A,(C)
1537
                IN A,(C)
1532
                NOP
1538
                NOP
1533
                IN A,(C)
1539
                IN A,(C)
1534
                EX AF,AF'
1540
                EX AF,AF'
1535
                DEC A
1541
                DEC A
1536
                JR NZ,RDMULT1
1542
                JR NZ,.L1
1537
                LD A,CMD_12
1543
                LD A,CMD_12
1538
                CALL OUT_COM
1544
                CALL OUT_COM
1539
                CALL IN_OOUT
1545
.L3             CALL IN_OOUT
1540
                INC A
1546
                INC A
1541
                JR NZ,$-4
1547
                JR NZ,.L3
1542
                RET
1548
                RET
1543
 
1549
 
1544
;ВЫБОРКА НОМЕРА КЛАСТЕРА ИЗ ФАЙЛОВОГО ОПИСАТЕЛЯ
1550
; выборка номера кластера из файлового описателя
1545
RD_CLAS         EX DE,HL
1551
RD_CLAS         EX DE,HL
1546
                LD DE,0X14                      ;СТАРШИЕ 16 БИТ ЧИТАЕМ ИЗ СМЕЩЕНИЯ +20
1552
                LD DE,0x14                      ; старшие 16 бит читаем из смещения +20
1547
                ADD HL,DE
1553
                ADD HL,DE
1548
                LD C,(HL)
1554
                LD C,(HL)
1549
                INC HL
1555
                INC HL
1550
                LD B,(HL)
1556
                LD B,(HL)
1551
                LD E,5                          ;МЛАДШИЕ 16 БИТ ЧИТАЕМ ИЗ СМЕЩЕНИЯ +26
1557
                LD E,5                          ; младшие 16 бит читаем из смещения +26
1552
                ADD HL,DE
1558
                ADD HL,DE
1553
                LD E,(HL)
1559
                LD E,(HL)
1554
                INC HL
1560
                INC HL
1555
                LD D,(HL)
1561
                LD D,(HL)
1556
                INC HL
1562
                INC HL
1557
                RET
1563
                RET
1558
 
1564
 
1559
;ПРОВЕРКА ПО МАСКЕ
1565
; проверка по маске
1560
COMPARE         LD DE,FB_EXT
1566
COMPARE         LD DE,FB_EXT
1561
                LD B,0X0B
1567
                LD B,0x0B
1562
                LD A,(DE)
1568
                LD A,(DE)
1563
                CP (HL)
1569
                CP (HL)
1564
                RET NZ
1570
                RET NZ
1565
                INC HL
1571
                INC HL
1566
                INC DE
1572
                INC DE
1567
                DJNZ $-5
1573
                DJNZ $-5
1568
                RET
1574
                RET
1569
 
1575
 
1570
;РАСПАКОВЩИК ПУТИ К ФАЙЛУ
1576
; распаковщик пути к файлу
1571
FNDBUF          LD BC,0X0802
1577
FNDBUF          LD BC,0x0802
1572
                LD DE,FB_EXT
1578
                LD DE,FB_EXT
1573
FNDBUF4         LD A,(HL)
1579
FNDBUF4         LD A,(HL)
1574
                INC HL
1580
                INC HL
1575
                CP "."
1581
                CP "."
1576
                JR Z,FNDBUF2
1582
                JR Z,FNDBUF2