Rev 2288 | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 2288 | Rev 3539 | ||
---|---|---|---|
1 | ; Copyright (c) 2009, |
1 | ; Copyright (c) 2009, |
2 | ; All rights reserved. |
2 | ; All rights reserved. |
3 | ; |
3 | ; |
4 | ; Redistribution and use in source and binary forms, with or without |
4 | ; Redistribution and use in source and binary forms, with or without |
5 | ; modification, are permitted provided that the following conditions are met: |
5 | ; modification, are permitted provided that the following conditions are met: |
6 | ; * Redistributions of source code must retain the above copyright |
6 | ; * Redistributions of source code must retain the above copyright |
7 | ; notice, this list of conditions and the following disclaimer. |
7 | ; notice, this list of conditions and the following disclaimer. |
8 | ; * Redistributions in binary form must reproduce the above copyright |
8 | ; * Redistributions in binary form must reproduce the above copyright |
9 | ; notice, this list of conditions and the following disclaimer in the |
9 | ; notice, this list of conditions and the following disclaimer in the |
10 | ; documentation and/or other materials provided with the distribution. |
10 | ; documentation and/or other materials provided with the distribution. |
11 | ; * Neither the name of the |
11 | ; * Neither the name of the |
12 | ; names of its contributors may be used to endorse or promote products |
12 | ; names of its contributors may be used to endorse or promote products |
13 | ; derived from this software without specific prior written permission. |
13 | ; derived from this software without specific prior written permission. |
14 | ; |
14 | ; |
15 | ; THIS SOFTWARE IS PROVIDED BY Alexey Teplov aka |
15 | ; THIS SOFTWARE IS PROVIDED BY Alexey Teplov aka |
16 | ; EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
16 | ; EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
17 | ; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
17 | ; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
18 | ; DISCLAIMED. IN NO EVENT SHALL |
18 | ; DISCLAIMED. IN NO EVENT SHALL |
19 | ; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
19 | ; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
20 | ; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
20 | ; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
21 | ; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND |
21 | ; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND |
22 | ; ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
22 | ; ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
23 | ; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
23 | ; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
24 | ; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
24 | ; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
25 | ;***************************************************************************** |
25 | ;***************************************************************************** |
26 | 26 | ||
27 | ; òóò îïèñûâàþòñÿ ïðîöåäóðû êîòîðûå èñïîëüçóþòñÿ â secondary loader |
27 | ; тут описываются процедуры которые используются в secondary loader |
28 | color_sym_black equ 0 |
28 | color_sym_black equ 0 |
29 | color_sym_blue equ 1 |
29 | color_sym_blue equ 1 |
30 | color_sym_green equ 2 |
30 | color_sym_green equ 2 |
31 | color_sym_turquoise equ 3 |
31 | color_sym_turquoise equ 3 |
32 | color_sym_red equ 4 |
32 | color_sym_red equ 4 |
33 | 33 | ||
34 | color_sym_lightgray equ 7 |
34 | color_sym_lightgray equ 7 |
35 | 35 | ||
36 | color_sym_lightblue equ 9 |
36 | color_sym_lightblue equ 9 |
37 | color_sym_lettuce equ 10 |
37 | color_sym_lettuce equ 10 |
38 | color_sym_pink equ 12 |
38 | color_sym_pink equ 12 |
39 | color_sym_yellow equ 14 |
39 | color_sym_yellow equ 14 |
40 | color_sym_white equ 15 |
40 | color_sym_white equ 15 |
41 | if DEBUG |
41 | if DEBUG |
42 | decode: |
42 | decode: |
43 | ;input eax - ÷èñëî, es:di êóäà ïèñàòü, cx=10 |
43 | ;input eax - число, es:di куда писать, cx=10 |
44 | cmp eax, ecx |
44 | cmp eax, ecx |
45 | jb @f |
45 | jb @f |
46 | xor edx, edx |
46 | xor edx, edx |
47 | div ecx |
47 | div ecx |
48 | push edx |
48 | push edx |
49 | call decode |
49 | call decode |
50 | pop eax |
50 | pop eax |
51 | @@: |
51 | @@: |
52 | or al, 0x30 |
52 | or al, 0x30 |
53 | mov [ds:di], al |
53 | mov [ds:di], al |
54 | inc di |
54 | inc di |
55 | ret |
55 | ret |
56 | 56 | ||
57 | end if |
57 | end if |
58 | 58 | ||
59 | 59 | ||
60 | putchar: |
60 | putchar: |
61 | ; in: al=character |
61 | ; in: al=character |
62 | mov ah, 0Eh |
62 | mov ah, 0Eh |
63 | mov bh, 0 |
63 | mov bh, 0 |
64 | int 10h |
64 | int 10h |
65 | ret |
65 | ret |
66 | 66 | ||
67 | printplain: |
67 | printplain: |
68 | ; in: si->string |
68 | ; in: si->string |
69 | pushad |
69 | pushad |
70 | lodsb |
70 | lodsb |
71 | @@: |
71 | @@: |
72 | call putchar |
72 | call putchar |
73 | lodsb |
73 | lodsb |
74 | test al, al |
74 | test al, al |
75 | jnz @b |
75 | jnz @b |
76 | mov al, 13 |
76 | mov al, 13 |
77 | call putchar |
77 | call putchar |
78 | 78 | ||
79 | mov al, 10 |
79 | mov al, 10 |
80 | call putchar |
80 | call putchar |
81 | popad |
81 | popad |
82 | ret |
82 | ret |
83 | getkey: |
83 | getkey: |
84 | ; get number in range [bl,bh] (bl,bh in ['0'..'9']) |
84 | ; get number in range [bl,bh] (bl,bh in ['0'..'9']) |
85 | ; in: bx=range |
85 | ; in: bx=range |
86 | ; out: ax=digit (1..9, 10 for 0) |
86 | ; out: ax=digit (1..9, 10 for 0) |
87 | mov ah, 0 |
87 | mov ah, 0 |
88 | int 16h |
88 | int 16h |
89 | cmp al, bl |
89 | cmp al, bl |
90 | jb getkey |
90 | jb getkey |
91 | cmp al, bh |
91 | cmp al, bh |
92 | ja getkey |
92 | ja getkey |
93 | push ax |
93 | push ax |
94 | call putchar |
94 | call putchar |
95 | pop ax |
95 | pop ax |
96 | and ax, 0Fh |
96 | and ax, 0Fh |
97 | jnz @f |
97 | jnz @f |
98 | mov al, 10 |
98 | mov al, 10 |
99 | @@: |
99 | @@: |
100 | ret |
100 | ret |
101 | 101 | ||
102 | ;setcursor: |
102 | ;setcursor: |
103 | ; in: dl=column, dh=row |
103 | ; in: dl=column, dh=row |
104 | ; mov ah, 2 |
104 | ; mov ah, 2 |
105 | ; mov bh, 0 |
105 | ; mov bh, 0 |
106 | ; int 10h |
106 | ; int 10h |
107 | ; ret |
107 | ; ret |
108 | 108 | ||
109 | ;macro _setcursor row,column |
109 | ;macro _setcursor row,column |
110 | ;{ |
110 | ;{ |
111 | ; mov dx, row*256 + column |
111 | ; mov dx, row*256 + column |
112 | ; call setcursor |
112 | ; call setcursor |
113 | ;} |
113 | ;} |
114 | 114 | ||
115 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
115 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
116 | ; |
116 | ; |
117 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
117 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
118 | get_firs_sym: |
118 | get_firs_sym: |
119 | .start: |
119 | .start: |
120 | mov al, byte [es:di] |
120 | mov al, byte [es:di] |
121 | inc di |
121 | inc di |
122 | dec cx |
122 | dec cx |
123 | jcxz .exit |
123 | jcxz .exit |
124 | 124 | ||
125 | cmp al, 0xa ;cmp al,0xa |
125 | cmp al, 0xa ;cmp al,0xa |
126 | jz ._entry |
126 | jz ._entry |
127 | 127 | ||
128 | cmp al, ';' |
128 | cmp al, ';' |
129 | jnz .start |
129 | jnz .start |
130 | 130 | ||
131 | .first_com: |
131 | .first_com: |
132 | 132 | ||
133 | mov al, 0xa |
133 | mov al, 0xa |
134 | repnz scasb |
134 | repnz scasb |
135 | jcxz .exit |
135 | jcxz .exit |
136 | ._entry: |
136 | ._entry: |
137 | mov al, byte [es:di] |
137 | mov al, byte [es:di] |
138 | .first_sp: |
138 | .first_sp: |
139 | cmp al, ' ' |
139 | cmp al, ' ' |
140 | jnz .not_space |
140 | jnz .not_space |
141 | 141 | ||
142 | ; mov al,' ' ;cut ' ' |
142 | ; mov al,' ' ;cut ' ' |
143 | repe scasb |
143 | repe scasb |
144 | dec di |
144 | dec di |
145 | inc cx |
145 | inc cx |
146 | mov al, byte [es:di] |
146 | mov al, byte [es:di] |
147 | .not_space: |
147 | .not_space: |
148 | cmp al, ';' |
148 | cmp al, ';' |
149 | jz .first_com |
149 | jz .first_com |
150 | .exit: |
150 | .exit: |
151 | ret |
151 | ret |
152 | ;;;;;;;;;;;;;;;;;;;;;;;;;;; |
152 | ;;;;;;;;;;;;;;;;;;;;;;;;;;; |
153 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
153 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
154 | show_name_section: |
154 | show_name_section: |
155 | push si |
155 | push si |
156 | push ini_data_ |
156 | push ini_data_ |
157 | pop es |
157 | pop es |
158 | 158 | ||
159 | 159 | ||
160 | mov al, ']' |
160 | mov al, ']' |
161 | repnz scasb |
161 | repnz scasb |
162 | test cx, cx |
162 | test cx, cx |
163 | jz error.incorect_section_def |
163 | jz error.incorect_section_def |
164 | .find_val_name_fb1: |
164 | .find_val_name_fb1: |
165 | mov al, 'n' |
165 | mov al, 'n' |
166 | .find_val_name_fb: |
166 | .find_val_name_fb: |
167 | repnz scasb |
167 | repnz scasb |
168 | jcxz .not_name_sec_fb |
168 | jcxz .not_name_sec_fb |
169 | 169 | ||
170 | mov si, parse_name |
170 | mov si, parse_name |
171 | 171 | ||
172 | push cx |
172 | push cx |
173 | push di |
173 | push di |
174 | 174 | ||
175 | mov cx, parse_name_e -parse_name |
175 | mov cx, parse_name_e -parse_name |
176 | repe cmpsb |
176 | repe cmpsb |
177 | pop di |
177 | pop di |
178 | pop cx |
178 | pop cx |
179 | jz .yaaa_find_value |
179 | jz .yaaa_find_value |
180 | 180 | ||
181 | 181 | ||
182 | jmp .find_val_name_fb |
182 | jmp .find_val_name_fb |
183 | 183 | ||
184 | .yaaa_find_value: |
184 | .yaaa_find_value: |
185 | sub cx, parse_name_e -parse_name |
185 | sub cx, parse_name_e -parse_name |
186 | add di, parse_name_e -parse_name |
186 | add di, parse_name_e -parse_name |
187 | 187 | ||
188 | mov ax, 0x3d20 ; ah='=' |
188 | mov ax, 0x3d20 ; ah='=' |
189 | repe scasb |
189 | repe scasb |
190 | test cx, cx |
190 | test cx, cx |
191 | jz .not_name_sec_fb |
191 | jz .not_name_sec_fb |
192 | 192 | ||
193 | cmp ah, byte [es:di-1] ;find '=' |
193 | cmp ah, byte [es:di-1] ;find '=' |
194 | jnz .find_val_name_fb1 |
194 | jnz .find_val_name_fb1 |
195 | 195 | ||
196 | repe scasb ;cut ' ' |
196 | repe scasb ;cut ' ' |
197 | inc cx |
197 | inc cx |
198 | dec di |
198 | dec di |
199 | 199 | ||
200 | 200 | ||
201 | ;âñå âûðåçàëè è âñå ãîòîâî äëÿ âûâîäà èìåíè ñåêöèè )) |
201 | ;все вырезали и все готово для вывода имени секции )) |
202 | push es |
202 | push es |
203 | pop ds |
203 | pop ds |
204 | 204 | ||
205 | .def_sect_name: |
205 | .def_sect_name: |
206 | push 0xb800 |
206 | push 0xb800 |
207 | pop es |
207 | pop es |
208 | ;clear array for message |
208 | ;clear array for message |
209 | xor ax, ax |
209 | xor ax, ax |
210 | if DEBUG |
210 | if DEBUG |
211 | mov ax, 0x0720 |
211 | mov ax, 0x0720 |
212 | end if |
212 | end if |
213 | 213 | ||
214 | mov cx, 39 |
214 | mov cx, 39 |
215 | mov si, di |
215 | mov si, di |
216 | mov di, dx |
216 | mov di, dx |
217 | sub di, 2 |
217 | sub di, 2 |
218 | rep stosw |
218 | rep stosw |
219 | ;////////////////////// |
219 | ;////////////////////// |
220 | 220 | ||
221 | 221 | ||
222 | mov di, dx |
222 | mov di, dx |
223 | mov ah, color_sym_white;color_sym_lightblue |
223 | mov ah, color_sym_white;color_sym_lightblue |
224 | mov cx, 36 |
224 | mov cx, 36 |
225 | lodsb |
225 | lodsb |
226 | sub di, 2 |
226 | sub di, 2 |
227 | cmp al, '"' |
227 | cmp al, '"' |
228 | jz @f |
228 | jz @f |
229 | cmp al, "'" |
229 | cmp al, "'" |
230 | jnz .end_sh_name_sec |
230 | jnz .end_sh_name_sec |
231 | @@: |
231 | @@: |
232 | lodsb |
232 | lodsb |
233 | @@: |
233 | @@: |
234 | stosw |
234 | stosw |
235 | lodsb |
235 | lodsb |
236 | cmp al, '"' |
236 | cmp al, '"' |
237 | jz .end_sh_name_sec |
237 | jz .end_sh_name_sec |
238 | cmp al, "'" |
238 | cmp al, "'" |
239 | jz .end_sh_name_sec |
239 | jz .end_sh_name_sec |
240 | loop @b |
240 | loop @b |
241 | 241 | ||
242 | mov al, '}' |
242 | mov al, '}' |
243 | mov ah, color_sym_yellow |
243 | mov ah, color_sym_yellow |
244 | stosw |
244 | stosw |
245 | .end_sh_name_sec: |
245 | .end_sh_name_sec: |
246 | push cs |
246 | push cs |
247 | pop ds |
247 | pop ds |
248 | 248 | ||
249 | pop si |
249 | pop si |
250 | ret |
250 | ret |
251 | 251 | ||
252 | .not_name_sec_fb: ;íåò èìåíè â íàçâàíèè ñåêöèè - çíà÷èò òàê è ñêàæåì îá ýòîì |
252 | .not_name_sec_fb: ;нет имени в названии секции - значит так и скажем об этом |
253 | push cs |
253 | push cs |
254 | pop ds |
254 | pop ds |
255 | mov di, default_section_name |
255 | mov di, default_section_name |
256 | jmp .def_sect_name |
256 | jmp .def_sect_name |
257 | 257 | ||
258 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
258 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
259 | ;ïðîöåäóðà ïîèñêà ââåðõ ñëåäóþùåé ñåêöèè |
259 | ;процедура поиска вверх следующей секции |
260 | ;â point_default ñîäåðæèòüñÿ óêàçàòåëü íà äåôàóëò ñåêöèþ, è â ïðåäåëàõ âðåéìà ìû áåãàåì ïî çàðàíåå ïðîïàðñåíûìè çíà÷åíèÿì óêàçàòåëåé |
260 | ;в point_default содержиться указатель на дефаулт секцию, и в пределах врейма мы бегаем по заранее пропарсеными значениям указателей |
261 | ;äëÿ òîãî ÷òî áû îòîáðàçèòü è ïðîïàðñèòü ñëåäóþùèé ôðåéì, íàì íóæíî ïîëó÷èòü çà ïåðäûäóùèé èëè ñëåäóþùèé óêàçàòåëü |
261 | ;для того что бы отобразить и пропарсить следующий фрейм, нам нужно получить за пердыдущий или следующий указатель |
262 | find_before_sect: |
262 | find_before_sect: |
263 | mov di, point_default |
263 | mov di, point_default |
264 | .e: |
264 | .e: |
265 | push ini_data_ |
265 | push ini_data_ |
266 | pop es |
266 | pop es |
267 | mov cx, di ;ïðåäïîëîæèì áóäåì ïðîñìàòðèâàòü ê íà÷àëó, òåêóùàÿ ïîçèöèÿ di = ñêîëüêî ñèìâîëîâ îò íà÷àëà äîêóìåíòà èìååòñÿ |
267 | mov cx, di ;предположим будем просматривать к началу, текущая позиция di = сколько символов от начала документа имеется |
268 | mov bx, cx ;êîïèÿ |
268 | mov bx, cx ;копия |
269 | 269 | ||
270 | ;íàñòðîèëè óêàçàòåëü íà äåôàóëò ñåêöèþ |
270 | ;настроили указатель на дефаулт секцию |
271 | ;áóäåì èñêàòü ââåðõ |
271 | ;будем искать вверх |
272 | .find_start_section: |
272 | .find_start_section: |
273 | std ;óñòàíîâêà ôëàãà íàïðàâëåíèÿ - áóäåì ïðîñìàòèðâàòü ê íà÷àëó íàøåãî èíè ôàéëà |
273 | std ;установка флага направления - будем просматирвать к началу нашего ини файла |
274 | ;áóäåì èñêàòü íà÷àëî ñåêöèè ò.å. '[' ýòîò ñèìâîë |
274 | ;будем искать начало секции т.е. '[' этот символ |
275 | mov al, 0xa |
275 | mov al, 0xa |
276 | repnz scasb ;ïðîñêàíèðóåì íà íàëè÷åå ñèìâîëà íà÷àëà ñåêöèè |
276 | repnz scasb ;просканируем на наличее символа начала секции |
277 | jcxz .go_ ;ìû ïðîñìîòðåëè äî íà÷àëà ôàéëà, íî òàê è íè÷åãî íå íàøëè ;(( ïî òèõîìó âûéäåì ) |
277 | jcxz .go_ ;мы просмотрели до начала файла, но так и ничего не нашли ;(( по тихому выйдем ) |
278 | 278 | ||
279 | mov find_sec_di, di ;ñîõðàíèì äàííûå |
279 | mov find_sec_di, di ;сохраним данные |
280 | mov cx, di ; |
280 | mov cx, di ; |
281 | 281 | ||
282 | sub bx, cx |
282 | sub bx, cx |
283 | mov cx, bx ;â ñx çíà÷åíèå - êîë-âî ñèìâîëîâ |
283 | mov cx, bx ;в сx значение - кол-во символов |
284 | cld |
284 | cld |
285 | call get_firs_sym |
285 | call get_firs_sym |
286 | .ret_go: |
286 | .ret_go: |
287 | jcxz ._not_section ; â äàííîì ñëó÷àå èìååì êîíñòðóêöèþ 0xa ... ; hello [ñåêöèÿ] îáëîìñ èùåì äàëåå |
287 | jcxz ._not_section ; в данном случае имеем конструкцию 0xa ... ; hello [секция] обломс ищем далее |
288 | 288 | ||
289 | cmp di, point_loader; ñåêöèþ loader ìû íå çàíîñèì èíà÷å êðàõ |
289 | cmp di, point_loader; секцию loader мы не заносим иначе крах |
290 | jz ._not_section |
290 | jz ._not_section |
291 | ;âñå óäà÷íî ìû íàøëè âõîæäåíèå ñåêöèè ïðåäûäóùåé |
291 | ;все удачно мы нашли вхождение секции предыдущей |
292 | cmp al, '[' |
292 | cmp al, '[' |
293 | jnz ._not_section |
293 | jnz ._not_section |
294 | mov point_default, di |
294 | mov point_default, di |
295 | .exit_scan_sect: |
295 | .exit_scan_sect: |
296 | ret |
296 | ret |
297 | ;;;;;;;; âîññòàíîâèì çíà÷åíèÿ è ïðîäîëæèì ïîèñêè íà÷àëà ñåêöèè êîòîðàÿ íàñ óñòðîèò )) |
297 | ;;;;;;;; восстановим значения и продолжим поиски начала секции которая нас устроит )) |
298 | ._not_section: |
298 | ._not_section: |
299 | mov di, find_sec_di |
299 | mov di, find_sec_di |
300 | mov cx, di |
300 | mov cx, di |
301 | mov bx, cx |
301 | mov bx, cx |
302 | jmp .find_start_section |
302 | jmp .find_start_section |
303 | .go_: |
303 | .go_: |
304 | cld |
304 | cld |
305 | mov cx, bx ;â ñx çíà÷åíèå - êîë-âî ñèìâîëîâ |
305 | mov cx, bx ;в сx значение - кол-во символов |
306 | 306 | ||
307 | mov al, byte [es:di] |
307 | mov al, byte [es:di] |
308 | push word .f_go |
308 | push word .f_go |
309 | cmp al, ' ' |
309 | cmp al, ' ' |
310 | jz @f |
310 | jz @f |
311 | jmp get_firs_sym.not_space |
311 | jmp get_firs_sym.not_space |
312 | @@: |
312 | @@: |
313 | jmp get_firs_sym.first_sp |
313 | jmp get_firs_sym.first_sp |
314 | 314 | ||
315 | .f_go: |
315 | .f_go: |
316 | jcxz .exit_scan_sect ; â äàííîì ñëó÷àå èìååì êîíñòðóêöèþ 0xa ... ; hello [ñåêöèÿ] îáëîìñ èùåì äàëåå |
316 | jcxz .exit_scan_sect ; в данном случае имеем конструкцию 0xa ... ; hello [секция] обломс ищем далее |
317 | 317 | ||
318 | cmp di, point_loader; ñåêöèþ loader ìû íå çàíîñèì èíà÷å êðàõ |
318 | cmp di, point_loader; секцию loader мы не заносим иначе крах |
319 | jz .exit_scan_sect |
319 | jz .exit_scan_sect |
320 | ;âñå óäà÷íî ìû íàøëè âõîæäåíèå ñåêöèè ïðåäûäóùåé |
320 | ;все удачно мы нашли вхождение секции предыдущей |
321 | cmp al, '[' |
321 | cmp al, '[' |
322 | jnz .exit_scan_sect |
322 | jnz .exit_scan_sect |
323 | mov point_default, di |
323 | mov point_default, di |
324 | ret |
324 | ret |
325 | 325 | ||
326 | 326 | ||
327 | 327 | ||
328 | 328 | ||
329 | 329 | ||
330 | 330 | ||
331 | 331 | ||
332 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
332 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
333 | ; |
333 | ; |
334 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
334 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
335 | find_next_sect: |
335 | find_next_sect: |
336 | mov di, point_default |
336 | mov di, point_default |
337 | push ini_data_ |
337 | push ini_data_ |
338 | pop es |
338 | pop es |
339 | mov cx, save_cx;di ;ïðåäïîëîæèì áóäåì ïðîñìàòðèâàòü ê êîíöó, òåêóùàÿ ïîçèöèÿ di = ñêîëüêî ñèìâîëîâ îò íà÷àëà äîêóìåíòà èìååòñÿ |
339 | mov cx, save_cx;di ;предположим будем просматривать к концу, текущая позиция di = сколько символов от начала документа имеется |
340 | sub cx, di ;ñåé÷àñ â cx îñòàòîê ò.å. ñêîëüêî ìîæíî êðóòèòü äî êîíöà è íå âûëàçèòü íà íà÷àëî |
340 | sub cx, di ;сейчас в cx остаток т.е. сколько можно крутить до конца и не вылазить на начало |
341 | jmp .let_s_go |
341 | jmp .let_s_go |
342 | .h: |
342 | .h: |
343 | push ini_data_ |
343 | push ini_data_ |
344 | pop es |
344 | pop es |
345 | mov cx, save_cx;di ;ïðåäïîëîæèì áóäåì ïðîñìàòðèâàòü ê êîíöó, òåêóùàÿ ïîçèöèÿ di = ñêîëüêî ñèìâîëîâ îò íà÷àëà äîêóìåíòà èìååòñÿ |
345 | mov cx, save_cx;di ;предположим будем просматривать к концу, текущая позиция di = сколько символов от начала документа имеется |
346 | ; sub cx,di ;ñåé÷àñ â cx îñòàòîê ò.å. ñêîëüêî ìîæíî êðóòèòü äî êîíöà è íå âûëàçèòü íà íà÷àëî |
346 | ; sub cx,di ;сейчас в cx остаток т.е. сколько можно крутить до конца и не вылазить на начало |
347 | 347 | ||
348 | mov al, byte [es:di] |
348 | mov al, byte [es:di] |
349 | push word .let_s_go_ret |
349 | push word .let_s_go_ret |
350 | cmp al, ' ' |
350 | cmp al, ' ' |
351 | jz @f |
351 | jz @f |
352 | jmp get_firs_sym.not_space |
352 | jmp get_firs_sym.not_space |
353 | @@: |
353 | @@: |
354 | jmp get_firs_sym.first_sp |
354 | jmp get_firs_sym.first_sp |
355 | 355 | ||
356 | 356 | ||
357 | 357 | ||
358 | 358 | ||
359 | ;íàñòðîèëè óêàçàòåëü íà äåôàóëò ñåêöèþ |
359 | ;настроили указатель на дефаулт секцию |
360 | ;áóäåì èñêàòü âíèç |
360 | ;будем искать вниз |
361 | .let_s_go: |
361 | .let_s_go: |
362 | call get_firs_sym |
362 | call get_firs_sym |
363 | .let_s_go_ret: |
363 | .let_s_go_ret: |
364 | jcxz .exit_scan_sect ; â äàííîì ñëó÷àå èìååì êîíñòðóêöèþ 0xa ... ; hello [ñåêöèÿ] îáëîìñ èùåì äàëåå |
364 | jcxz .exit_scan_sect ; в данном случае имеем конструкцию 0xa ... ; hello [секция] обломс ищем далее |
365 | cmp al, '[' |
365 | cmp al, '[' |
366 | jnz .let_s_go |
366 | jnz .let_s_go |
367 | cmp di, point_loader |
367 | cmp di, point_loader |
368 | jz .let_s_go |
368 | jz .let_s_go |
369 | ;âñå óäà÷íî ìû íàøëè âõîæäåíèå ñåêöèè ïðåäûäóùåé |
369 | ;все удачно мы нашли вхождение секции предыдущей |
370 | mov point_default, di |
370 | mov point_default, di |
371 | .exit_scan_sect: |
371 | .exit_scan_sect: |
372 | ret |
372 | ret |
373 | 373 | ||
374 | ;;;;;;;;;;;;;;;;;;;;;;;;;; |
374 | ;;;;;;;;;;;;;;;;;;;;;;;;;; |
375 | ;clean old cursor |
375 | ;clean old cursor |
376 | clean_active_cursor: |
376 | clean_active_cursor: |
377 | ;íå èçìåíÿåò çíà÷åíèå ax |
377 | ;не изменяет значение ax |
378 | ;îòîáðàæåíèå êóðñîðà ïî óìîë÷àíèþ |
378 | ;отображение курсора по умолчанию |
379 | lea si, point_to_hframe |
379 | lea si, point_to_hframe |
380 | mov di, 962-160 |
380 | mov di, 962-160 |
381 | mov dx, point_default |
381 | mov dx, point_default |
382 | mov cx, 18 |
382 | mov cx, 18 |
383 | .clean_show_cur: |
383 | .clean_show_cur: |
384 | mov bx, [si] |
384 | mov bx, [si] |
385 | add di, 160 |
385 | add di, 160 |
386 | cmp bx, dx |
386 | cmp bx, dx |
387 | jz .clean_cursor_ |
387 | jz .clean_cursor_ |
388 | sub si, 2 |
388 | sub si, 2 |
389 | loop .clean_show_cur |
389 | loop .clean_show_cur |
390 | 390 | ||
391 | ; jmp $ |
391 | ; jmp $ |
392 | 392 | ||
393 | .clean_cursor_: |
393 | .clean_cursor_: |
394 | push 0xb800 |
394 | push 0xb800 |
395 | pop es |
395 | pop es |
396 | push ax |
396 | push ax |
397 | mov point_to_point_def, si |
397 | mov point_to_point_def, si |
398 | xor ax, ax |
398 | xor ax, ax |
399 | if DEBUG |
399 | if DEBUG |
400 | mov ax, 0x0720 |
400 | mov ax, 0x0720 |
401 | end if |
401 | end if |
402 | stosw |
402 | stosw |
403 | add di, 68 |
403 | add di, 68 |
404 | stosw |
404 | stosw |
405 | pop ax |
405 | pop ax |
406 | ret |
406 | ret |
407 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
407 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
408 | ;óñòàíîâêà òàéìåðà è îòîáðàæåíèå ñ÷åò÷èêà âðåìåíè |
408 | ;установка таймера и отображение счетчика времени |
409 | gettime: |
409 | gettime: |
410 | mov ah, 0 |
410 | mov ah, 0 |
411 | int 1Ah |
411 | int 1Ah |
412 | xchg ax, cx |
412 | xchg ax, cx |
413 | shl eax, 10h |
413 | shl eax, 10h |
414 | xchg ax, dx |
414 | xchg ax, dx |
415 | ret |
415 | ret |
416 | newtimer: |
416 | newtimer: |
417 | push ds |
417 | push ds |
418 | 418 | ||
419 | push cs |
419 | push cs |
420 | pop ds |
420 | pop ds |
421 | 421 | ||
422 | pushf |
422 | pushf |
423 | call far dword [old_timer] |
423 | call far dword [old_timer] |
424 | 424 | ||
425 | pushad |
425 | pushad |
426 | call gettime |
426 | call gettime |
427 | 427 | ||
428 | sub eax, dword[start_timer] |
428 | sub eax, dword[start_timer] |
429 | mov bx, word [value_timeout] |
429 | mov bx, word [value_timeout] |
430 | imul bx, 18 |
430 | imul bx, 18 |
431 | sub bx, ax |
431 | sub bx, ax |
432 | jbe .timergo |
432 | jbe .timergo |
433 | 433 | ||
434 | push es |
434 | push es |
435 | 435 | ||
436 | push 0xb800 |
436 | push 0xb800 |
437 | pop es |
437 | pop es |
438 | mov ax, bx |
438 | mov ax, bx |
439 | 439 | ||
440 | mov bx, 18 |
440 | mov bx, 18 |
441 | xor dx, dx |
441 | xor dx, dx |
442 | div bx |
442 | div bx |
443 | 443 | ||
444 | mov bx, 10 |
444 | mov bx, 10 |
445 | mov di, 3734 |
445 | mov di, 3734 |
446 | call .decode |
446 | call .decode |
447 | 447 | ||
448 | xor ax, ax |
448 | xor ax, ax |
449 | stosw |
449 | stosw |
450 | 450 | ||
451 | ; wait 5/4/3/2 seconds, 1 second |
451 | ; wait 5/4/3/2 seconds, 1 second |
452 | pop es |
452 | pop es |
453 | popad |
453 | popad |
454 | pop ds |
454 | pop ds |
455 | 455 | ||
456 | iret |
456 | iret |
457 | .timergo: |
457 | .timergo: |
458 | push 0 |
458 | push 0 |
459 | pop es |
459 | pop es |
460 | mov eax, dword [old_timer] |
460 | mov eax, dword [old_timer] |
461 | mov [es:8*4], eax |
461 | mov [es:8*4], eax |
462 | mov dword [timer_], eax |
462 | mov dword [timer_], eax |
463 | mov sp, word [start_stack] |
463 | mov sp, word [start_stack] |
464 | mov bp, word [save_bp_from_timer] |
464 | mov bp, word [save_bp_from_timer] |
465 | ;;íå âîññòàíîâëåíûé ñòåê :( |
465 | ;;не восстановленый стек :( |
466 | sti |
466 | sti |
467 | jmp parse_start.parse_run_only |
467 | jmp parse_start.parse_run_only |
468 | 468 | ||
469 | 469 | ||
470 | .decode: |
470 | .decode: |
471 | ;input ax - ÷èñëî, es:di êóäà ïèñàòü, bx=10 |
471 | ;input ax - число, es:di куда писать, bx=10 |
472 | cmp ax, bx |
472 | cmp ax, bx |
473 | jb @f |
473 | jb @f |
474 | xor dx, dx |
474 | xor dx, dx |
475 | div bx |
475 | div bx |
476 | push dx |
476 | push dx |
477 | call .decode |
477 | call .decode |
478 | pop ax |
478 | pop ax |
479 | @@: |
479 | @@: |
480 | or al, 0x30 |
480 | or al, 0x30 |
481 | push ax |
481 | push ax |
482 | mov ah, 9 |
482 | mov ah, 9 |
483 | stosw |
483 | stosw |
484 | pop ax |
484 | pop ax |
485 | ret |
485 | ret |
486 | 486 | ||
487 | show_bl_sc_sect: |
487 | show_bl_sc_sect: |
488 | ;1) îòîáðàæåíèå ñïèñêà ñåêöèé. Åñëè ñåêöèÿ íå èìåò èìÿ - îøèáêà - âûâîä Section unname |
488 | ;1) отображение списка секций. Если секция не имет имя - ошибка - вывод Section unname |
489 | ;ïðîâåðêà íà íàëè÷åå èìåíè. |
489 | ;проверка на наличее имени. |
490 | ;âõîäíûå äàííûå es:di -óêàçàòåëü íà ñåêöèþ - cx ðàçìåð ñåêöèè |
490 | ;входные данные es:di -указатель на секцию - cx размер секции |
491 | ; push bp |
491 | ; push bp |
492 | mov bx, point_to_eframe |
492 | mov bx, point_to_eframe |
493 | lea si, point_to_hframe |
493 | lea si, point_to_hframe |
494 | mov dx, 966 |
494 | mov dx, 966 |
495 | 495 | ||
496 | .home_show_fb: |
496 | .home_show_fb: |
497 | cmp si, bx |
497 | cmp si, bx |
498 | jb ._show_space_fb |
498 | jb ._show_space_fb |
499 | mov di, [si] |
499 | mov di, [si] |
500 | sub si, 2 |
500 | sub si, 2 |
501 | mov cx, [si] |
501 | mov cx, [si] |
502 | sub cx, di ;home first section it's end before section |
502 | sub cx, di ;home first section it's end before section |
503 | call show_name_section |
503 | call show_name_section |
504 | add dx, 160 |
504 | add dx, 160 |
505 | jmp .home_show_fb |
505 | jmp .home_show_fb |
506 | ._show_space_fb: |
506 | ._show_space_fb: |
507 | sub dx, 4 |
507 | sub dx, 4 |
508 | push 0xb800 |
508 | push 0xb800 |
509 | pop es |
509 | pop es |
510 | @@: |
510 | @@: |
511 | cmp dx, 0xE64 |
511 | cmp dx, 0xE64 |
512 | ja .exit_show_fb |
512 | ja .exit_show_fb |
513 | mov di, dx |
513 | mov di, dx |
514 | ;clear array for message |
514 | ;clear array for message |
515 | xor ax, ax |
515 | xor ax, ax |
516 | if DEBUG |
516 | if DEBUG |
517 | mov ax, 0x0720 |
517 | mov ax, 0x0720 |
518 | end if |
518 | end if |
519 | mov cx, 39 |
519 | mov cx, 39 |
520 | rep stosw |
520 | rep stosw |
521 | ;////////////////////// |
521 | ;////////////////////// |
522 | 522 | ||
523 | add dx, 160 |
523 | add dx, 160 |
524 | jmp @b |
524 | jmp @b |
525 | .exit_show_fb: |
525 | .exit_show_fb: |
526 | ; pop bp |
526 | ; pop bp |
527 | ret |
527 | ret |