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 |