Go to most recent revision | Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
195 | heavyiron | 1 | ; |
2 | ; Kolibri Bus Disconnect |
||
3 | ; Test for bus disconnect |
||
4 | ; |
||
5 | ; Compile with FASM for Menuet |
||
6 | ; |
||
7 | ; |
||
8 | |||
9 | include 'macros.inc' |
||
10 | include 'lang.inc' |
||
11 | |||
12 | memsize = 1000h |
||
13 | org 0 |
||
14 | PARAMS = memsize - 1024 |
||
15 | |||
16 | appname equ 'Kolibri Bus Disconnect' |
||
17 | version equ ' 1.1 ' |
||
18 | |||
19 | use32 ; включить 32-битный режим ассемблера |
||
20 | |||
21 | db 'MENUET01' ; 8 byte id |
||
22 | dd 0x01 ; header version |
||
23 | dd START ; start of code |
||
24 | dd I_END ; size of image |
||
25 | dd memsize ; memory for app |
||
26 | dd memsize - 1024 ; esp |
||
27 | dd PARAMS , 0x0 ; I_Param , I_Icon |
||
28 | |||
29 | |||
30 | |||
31 | ;--------------------------------------------------------------------- |
||
32 | ;--- НАЧАЛО ПРОГРАММЫ ---------------------------------------------- |
||
33 | ;--------------------------------------------------------------------- |
||
34 | |||
35 | START: |
||
36 | cmp [PARAMS], byte 0 |
||
37 | jne check_parameters |
||
38 | |||
39 | no_params: |
||
40 | call find_north_bridg |
||
41 | |||
42 | drawwindow: |
||
43 | mov eax,48 |
||
44 | mov ebx,3 |
||
45 | mov ecx,sc |
||
46 | mov edx,sizeof.system_colors |
||
47 | int 0x40 |
||
48 | |||
49 | mov eax, 12 |
||
50 | mov ebx, 1 ; start redraw |
||
51 | int 0x40 |
||
52 | |||
53 | mov eax, 0 ; window |
||
54 | mov ebx, 100 shl 16 + 300 |
||
55 | mov ecx, 100 shl 16 + 90 |
||
56 | mov edx, [sc.work] |
||
57 | or edx, 0x13000000 |
||
58 | mov edi, header |
||
59 | int 0x40 |
||
60 | |||
61 | mov eax, 4 |
||
62 | mov ebx, 17 shl 16 + 30 |
||
63 | mov ecx, [sc.work_text] |
||
64 | mov edx, msg_nb |
||
65 | mov esi, 14 |
||
66 | int 0x40 |
||
67 | |||
68 | mov ebx, 105 shl 16 + 30 |
||
69 | mov edx, [nb_name] |
||
70 | movzx esi, byte[edx] |
||
71 | inc edx |
||
72 | int 0x40 |
||
73 | |||
74 | mov ebx, 17 shl 16 + 40 |
||
75 | mov edx, msg_stat |
||
76 | mov esi, 8 |
||
77 | int 0x40 |
||
78 | |||
79 | mov ebx, 102 shl 16 + 50 |
||
80 | mov edx, msg_divs |
||
81 | mov esi, 32 |
||
82 | int 0x40 |
||
83 | mov ebx, 17 shl 16 + 62 |
||
84 | mov edx, msg_hdd |
||
85 | mov esi, 10 |
||
86 | int 0x40 |
||
87 | mov ebx, 17 shl 16 + 72 |
||
88 | mov edx, msg_sgd |
||
89 | int 0x40 |
||
90 | |||
91 | call get_divs |
||
92 | mov eax, 47 |
||
93 | mov ebx, 0x30000 |
||
94 | mov ecx, [val_hdd] |
||
95 | mov edx, 8 |
||
96 | shl edx, cl |
||
97 | mov ecx, edx |
||
98 | mov edx, 80 shl 16 + 62 |
||
99 | mov esi, [sc.work_text] |
||
100 | int 0x40 |
||
101 | |||
102 | mov ecx, [val_sgd] |
||
103 | mov edx, 8 |
||
104 | shl edx, cl |
||
105 | mov ecx, edx |
||
106 | mov edx, 80 shl 16 + 72 |
||
107 | int 0x40 |
||
108 | |||
109 | |||
110 | call get_bd_stat |
||
111 | mov ecx, [sc.work_text] |
||
112 | mov esi, 9 |
||
113 | mov ebx, 105 shl 16 + 40 |
||
114 | mov edx, msg_nf |
||
115 | mov al, [bd_stat] |
||
116 | test al, al |
||
117 | jz @f |
||
118 | mov edx, msg_dis |
||
119 | dec al |
||
120 | jz @f |
||
121 | mov edx, msg_en |
||
122 | @@: mov eax, 4 |
||
123 | int 0x40 |
||
124 | |||
125 | ; Создаём кнопку |
||
126 | mov ecx, 27 shl 16 + 20 |
||
127 | mov eax, 8 |
||
128 | mov ebx, 220 shl 16 + 70 |
||
129 | mov esi, [sc.work_button] |
||
130 | mov edx, 2 |
||
131 | int 0x40 |
||
132 | |||
133 | ; И ещё 14 ;) |
||
134 | mov edi, 7 |
||
135 | mov ecx, 60 shl 16 + 10 |
||
136 | mov eax, 8 |
||
137 | mov ebx, 105 shl 16 + 25 |
||
138 | mov edx, 3 |
||
139 | |||
140 | @@: int 0x40 |
||
141 | inc edx |
||
142 | add ebx, 27 shl 16 |
||
143 | dec edi |
||
144 | jnz @b |
||
145 | |||
146 | add ecx, 12 shl 16 |
||
147 | mov ebx, 105 shl 16 + 25 |
||
148 | mov edi, 7 |
||
149 | @@: int 0x40 |
||
150 | inc edx |
||
151 | add ebx, 27 shl 16 |
||
152 | dec edi |
||
153 | jnz @b |
||
154 | |||
155 | end_dr: mov eax, 12 |
||
156 | mov ebx, 2 ; end redraw |
||
157 | int 0x40 |
||
158 | |||
159 | ; Wait for event ... |
||
160 | mov eax, 10 |
||
161 | int 0x40 |
||
162 | |||
163 | cmp al, 3 |
||
164 | jne not_bt |
||
165 | |||
166 | mov eax, 17 ; get id |
||
167 | int 0x40 |
||
168 | cmp ah, 1 |
||
169 | jne no_exit |
||
170 | mov eax, -1 ; close this program |
||
171 | int 0x40 |
||
172 | no_exit: |
||
173 | cmp ah, 2 |
||
174 | jne no_ch_bt |
||
175 | mov dl, [bd_stat] |
||
176 | test dl, dl |
||
177 | jz drawwindow |
||
178 | xor eax, eax |
||
179 | dec dl |
||
180 | jnz @f |
||
181 | inc eax |
||
182 | @@: call set_bd_stat |
||
183 | jmp drawwindow |
||
184 | |||
185 | no_ch_bt: |
||
186 | cmp ah, 9 |
||
187 | jg no_hdd_bt |
||
188 | sub ah, 3 |
||
189 | movzx esi, ah |
||
190 | mov edi, [val_sgd] |
||
191 | call set_divs |
||
192 | jmp drawwindow |
||
193 | no_hdd_bt: |
||
194 | sub ah, 10 |
||
195 | movzx edi, ah |
||
196 | mov esi, [val_hdd] |
||
197 | call set_divs |
||
198 | jmp drawwindow |
||
199 | |||
200 | |||
201 | not_bt: cmp al, 2 |
||
202 | jne drawwindow |
||
203 | mov eax, 2 ; пока клава не поддерживается - читаем и забываем |
||
204 | int 0x40 |
||
205 | jmp drawwindow |
||
206 | ;-------------------------------------------------------------------------- |
||
207 | bus_num: db 2 ; Номер шины |
||
208 | devfn: db 255 |
||
209 | bd_id: dd 0 ; Идентификатор устройства |
||
210 | bd_stat: db 0 ; 0 - не найден, 1 - выключен, 2 - включен |
||
211 | |||
212 | nb_name dd nb_nf |
||
213 | bd_msk dd msk_i440 |
||
214 | |||
215 | nb_nf db 9, 'Not found' |
||
216 | msk_i440 db 0 |
||
217 | nb_i440 db 4, 'i440' |
||
218 | msk_nforce db 0x6D, 0x80, 0xE7, 0x06, 0 ; номер регистра, маска, номер регистра, маска, ... , 0 |
||
219 | nb_nforce db 6, 'nForce' |
||
220 | msk_nforce2 db 0x6F, 0x10, 0 |
||
221 | nb_nforce2 db 8, 'nForce 2' |
||
222 | msk_sis730 db 0x6B, 0x01, 0 |
||
223 | nb_sis730 db 7, 'SiS 730' |
||
224 | nb_sis733 db 7, 'SiS 733' |
||
225 | msk_sis735 db 0x6A, 0x03, 0 |
||
226 | nb_sis735 db 7, 'SiS 735' |
||
227 | nb_sis740 db 7, 'SiS 740' |
||
228 | nb_sis741 db 7, 'SiS 741' |
||
229 | nb_sis745 db 7, 'SiS 745' |
||
230 | msk_sis746 db 0x6C, 0x01, 0 |
||
231 | nb_sis746 db 7, 'SiS 746' |
||
232 | nb_sis748 db 7, 'SiS 748' |
||
233 | msk_amd751 db 0x62, 0x06, 0 |
||
234 | nb_amd751 db 7, 'AMD 751' |
||
235 | nb_amd751s db 8, 'AMD 751S' |
||
236 | nb_amd761 db 7, 'AMD 761' |
||
237 | msk_amd762 db 0x62, 0x02, 0x6A, 0x02, 0 |
||
238 | nb_amd762 db 7, 'AMD 762' |
||
239 | msk_viakt133 db 0x52, 0x80, 0x70, 0x08, 0 |
||
240 | nb_viakt133 db 30, 'VIA KT133(A)/KM133/KL133/KN133' |
||
241 | nb_viakx133 db 9, 'VIA KX133' |
||
242 | nb_viakle133 db 10, 'VIA KLE133' |
||
243 | msk_viakt266 db 0x92, 0x80, 0x95, 0x02, 0x70, 0x08, 0 |
||
244 | nb_viakt266 db 18, 'VIA KT266(A)/KT333' |
||
245 | nb_viakm266 db 21, 'VIA KM266/KL266/KM333' |
||
246 | nb_vikn266 db 9, 'VIA KN266' |
||
247 | msk_viakt400 db 0xD2, 0x80, 0xD5, 0x02, 0x70, 0x08, 0 |
||
248 | nb_viakt400 db 18, 'VIA KT400(A)/KT600' |
||
249 | nb_viakm400 db 9, 'VIA KM400' |
||
250 | msk_viakt880 db 0x82, 0x80, 0x85, 0x02, 0 |
||
251 | nb_viakt880 db 9, 'VIA KT880' |
||
252 | |||
253 | |||
254 | bd_table: dd 0x70061022 ; AMD 751 ---- |
||
255 | dd nb_amd751 |
||
256 | dd msk_amd751 |
||
257 | |||
258 | dd 0x70041022 ; AMD 751S |
||
259 | dd nb_amd751s |
||
260 | dd msk_amd751 |
||
261 | |||
262 | dd 0x700E1022 ; AMD 761 |
||
263 | dd nb_amd761 |
||
264 | dd msk_amd751 |
||
265 | |||
266 | dd 0x700C1022 ; AMD 762 |
||
267 | dd nb_amd762 |
||
268 | dd msk_amd762 |
||
269 | |||
270 | dd 0x71908086 ; i440 --- |
||
271 | dd nb_i440 |
||
272 | dd msk_i440 |
||
273 | |||
274 | dd 0x01A410DE ; nForce ---- |
||
275 | dd nb_nforce |
||
276 | dd msk_nforce |
||
277 | |||
278 | dd 0x01E010DE ; nForce 2 |
||
279 | dd nb_nforce2 |
||
280 | dd msk_nforce2 |
||
281 | |||
282 | dd 0x07301039 ; SiS 730 ---- |
||
283 | dd nb_sis730 |
||
284 | dd msk_sis730 |
||
285 | |||
286 | dd 0x07331039 ; SiS 733 |
||
287 | dd nb_sis730 |
||
288 | dd msk_sis730 |
||
289 | |||
290 | dd 0x07351039 ; SiS 735 |
||
291 | dd nb_sis735 |
||
292 | dd msk_sis735 |
||
293 | |||
294 | dd 0x07401039 ; SiS 740 |
||
295 | dd nb_sis735 |
||
296 | dd msk_sis735 |
||
297 | |||
298 | dd 0x07411039 ; SiS 741 |
||
299 | dd nb_sis735 |
||
300 | dd msk_sis735 |
||
301 | |||
302 | dd 0x07451039 ; SiS 745 |
||
303 | dd nb_sis735 |
||
304 | dd msk_sis735 |
||
305 | |||
306 | dd 0x07461039 ; SiS 746 |
||
307 | dd nb_sis746 |
||
308 | dd msk_sis746 |
||
309 | |||
310 | dd 0x07481039 ; SiS 748 |
||
311 | dd nb_sis746 |
||
312 | dd msk_sis746 |
||
313 | |||
314 | dd 0x03051106 ; VIA KT133(A)/KM133/KL133/KN133 ---- |
||
315 | dd nb_viakt133 |
||
316 | dd msk_viakt133 |
||
317 | |||
318 | dd 0x03911106 ; VIA KX133 |
||
319 | dd nb_viakt133 |
||
320 | dd msk_viakt133 |
||
321 | |||
322 | dd 0x06911106 ; VIA KLE133 |
||
323 | dd nb_viakt133 |
||
324 | dd msk_viakt133 |
||
325 | |||
326 | dd 0x30991106 ; VIA KT266(A)/KT333 |
||
327 | dd nb_viakt266 |
||
328 | dd msk_viakt266 |
||
329 | |||
330 | dd 0x31161106 ; VIA KM266/KL266/KM333 |
||
331 | dd nb_viakt266 |
||
332 | dd msk_viakt266 |
||
333 | |||
334 | dd 0x31561106 ; VIA KN266 |
||
335 | dd nb_viakt266 |
||
336 | dd msk_viakt266 |
||
337 | |||
338 | dd 0x31891106 ; VIA KT400(A)/KT600 |
||
339 | dd nb_viakt400 |
||
340 | dd msk_viakt400 |
||
341 | |||
342 | dd 0x32051106 ; VIA KM400 |
||
343 | dd nb_viakm400 |
||
344 | dd msk_viakt400 |
||
345 | |||
346 | dd 0x22691106 ; VIA KT880 |
||
347 | dd nb_viakt880 |
||
348 | dd msk_viakt880 |
||
349 | bd_table_end: |
||
350 | |||
351 | |||
352 | |||
353 | find_north_bridg: |
||
354 | mov bl, 6 |
||
355 | xor cl, cl |
||
356 | nbus: mov bh, [bus_num] |
||
357 | ndevfn: mov ch, [devfn] |
||
358 | mov eax, 62 |
||
359 | int 0x40 |
||
360 | cmp eax, 0xffffffff |
||
361 | je bd_next |
||
362 | ;--------- |
||
363 | mov esi, bd_table_end - bd_table - 12 |
||
364 | @@: cmp eax, [bd_table + esi] |
||
365 | je bd_found |
||
366 | test esi, esi |
||
367 | jz bd_next |
||
368 | sub esi, 12 |
||
369 | jmp @b |
||
370 | ;--------- |
||
371 | bd_next:dec byte[devfn] |
||
372 | jns ndevfn |
||
373 | mov byte[devfn], 0 |
||
374 | dec byte[bus_num] |
||
375 | jns nbus |
||
376 | ret |
||
377 | bd_found: |
||
378 | add esi, bd_table + 4 |
||
379 | mov edi, nb_name |
||
380 | mov ecx, 2 |
||
381 | rep movsd |
||
382 | |||
383 | mov [bd_id], eax |
||
384 | ret |
||
385 | |||
386 | ;---------------------- |
||
387 | ;bd_stat: db 0 ; 0 - не найден, 1 - выключен, 2 - включен |
||
388 | get_bd_stat: |
||
389 | mov byte[bd_stat], 1 |
||
390 | cld |
||
391 | mov esi, [bd_msk] |
||
392 | lodsw |
||
393 | test al, al |
||
394 | jnz @f |
||
395 | mov byte[bd_stat], 0 |
||
396 | ret |
||
397 | @@: push eax |
||
398 | mov bh, [bus_num] |
||
399 | mov bl, 4 |
||
400 | mov ch, [devfn] |
||
401 | mov cl, al |
||
402 | mov eax, 62 |
||
403 | int 0x40 |
||
404 | pop edx |
||
405 | and al, dh |
||
406 | jnz @f |
||
407 | lodsw |
||
408 | test al, al |
||
409 | jnz @b |
||
410 | ret |
||
411 | @@: mov byte[bd_stat], 2 |
||
412 | ret |
||
413 | ;---------------------- |
||
414 | set_bd_stat: |
||
415 | cmp dword[bd_id], 0x01E010DE ; специально для nForce2 400 |
||
416 | je set_stat_nforce2 |
||
417 | |||
418 | mov edi, eax |
||
419 | cld |
||
420 | mov esi, [bd_msk] |
||
421 | bd_ss_nxt: |
||
422 | lodsw |
||
423 | test al, al |
||
424 | jz bd_ss_end |
||
425 | mov dl, ah ; маска |
||
426 | mov bh, [bus_num] |
||
427 | mov bl, 4 |
||
428 | mov ch, [devfn] |
||
429 | mov cl, al |
||
430 | mov eax, 62 |
||
431 | int 0x40 |
||
432 | mov bl, 8 |
||
433 | test edi, edi |
||
434 | jz @f |
||
435 | or al, dl |
||
436 | mov dl, al |
||
437 | mov eax, 62 |
||
438 | int 0x40 |
||
439 | jmp bd_ss_nxt |
||
440 | @@: not dl |
||
441 | and al, dl |
||
442 | mov dl, al |
||
443 | mov eax, 62 |
||
444 | int 0x40 |
||
445 | jmp bd_ss_nxt |
||
446 | bd_ss_end: |
||
447 | ret |
||
448 | ;------- nForce 2 ----------- |
||
449 | set_stat_nforce2: |
||
450 | ; IN : eax = 0 - disable, !0 - enable |
||
451 | push eax |
||
452 | mov bh, [bus_num] |
||
453 | mov bl, 4 |
||
454 | mov ch, [devfn] |
||
455 | mov cl, 0x6f |
||
456 | mov eax, 62 |
||
457 | int 0x40 |
||
458 | and al, 0x1F |
||
459 | mov dl, al |
||
460 | mov bl, 8 |
||
461 | mov eax, 62 |
||
462 | int 0x40 |
||
463 | pop eax |
||
464 | test eax, eax |
||
465 | jz @f |
||
466 | or dl, 0x10 |
||
467 | mov eax, 62 |
||
468 | int 0x40 |
||
469 | ret |
||
470 | @@: and dl, 0xef |
||
471 | mov eax, 62 |
||
472 | int 0x40 |
||
473 | ret |
||
474 | ;-------------------------------------------------------------------------- |
||
475 | ; x8 x16 x32 x64 x128 x256 x512 |
||
476 | div_hdd: db 0x23, 0x27, 0x2B, 0x2F, 0x63, 0x67, 0x6B ; Halt Disconnect Divisor |
||
477 | div_sgd: db 0x12, 0x52, 0x92, 0xD2, 0x12, 0x52, 0x92 ; Stop Grand Divisor |
||
478 | ; low word of 0xC001001B MSR |
||
479 | ; HDD\SGD 8 16 32 64 128 256 512 |
||
480 | ; 8 0x1223 0x5223 0x9223 0xD223 | 0x1223 0x5223 0x9223 |
||
481 | ; 16 0x1227 | |
||
482 | ; 32 0x122B | |
||
483 | ; 64 0x122F | 0x522F |
||
484 | ; 128 0x1263 | |
||
485 | ; 256 0x1267 & bin 18 is clear | & bin 18 is set |
||
486 | ; 512 0x126B | |
||
487 | ; ^^^^ |
||
488 | ; ||||_HDD |
||
489 | ; ||_SGD |
||
490 | set_divs: |
||
491 | ; IN : ESI - hdd (0 = x8, 1 = x16 ..) |
||
492 | ; EDI - sgd (0 = x8, 1 = x16 ..) |
||
493 | mov eax, 68 |
||
494 | mov ebx, 3 |
||
495 | mov edx, 0xC001001b |
||
496 | int 0x40 |
||
497 | mov al, [div_hdd + esi] |
||
498 | mov ah, [div_sgd + edi] |
||
499 | and eax, 0xFFFBFFFF |
||
500 | cmp edi, 3 |
||
501 | jle @f |
||
502 | or eax, 0x40000 |
||
503 | @@: mov edi, eax |
||
504 | mov esi, ebx |
||
505 | mov eax, 68 |
||
506 | mov ebx, 4 |
||
507 | int 0x40 |
||
508 | ret |
||
509 | |||
510 | get_divs: |
||
511 | ; OUT : val_hdd - hdd (0 = x8, 1 = x16 ..) |
||
512 | ; val_sgd - sgd ... |
||
513 | mov eax, 68 |
||
514 | mov ebx, 3 |
||
515 | mov edx, 0xC001001b |
||
516 | int 0x40 |
||
517 | mov ecx, 7 |
||
518 | @@: cmp [div_hdd + ecx - 1], al |
||
519 | je @f |
||
520 | loop @b |
||
521 | @@: dec ecx |
||
522 | mov [val_hdd], ecx |
||
523 | mov ecx, 4 |
||
524 | @@: cmp [div_sgd + ecx - 1], ah |
||
525 | je @f |
||
526 | loop @b |
||
527 | @@: dec ecx |
||
528 | test eax, 0x40000 |
||
529 | jz @f |
||
530 | add ecx, 4 |
||
531 | @@: mov [val_sgd], ecx |
||
532 | ret |
||
533 | |||
534 | ;****************************************************************************** |
||
535 | |||
536 | check_parameters: |
||
537 | cmp [PARAMS], dword "BOOT" ; received BOOT parameter -> goto handler |
||
538 | je boot_bd_enable |
||
539 | jmp no_params |
||
540 | |||
541 | ;****************************************************************************** |
||
542 | |||
543 | boot_bd_enable: |
||
544 | |||
545 | call find_north_bridg |
||
546 | call set_bd_stat |
||
547 | mcall -1 |
||
548 | |||
549 | ;****************************************************************************** |
||
550 | |||
551 | |||
552 | ;-------------------------------------------------------------------------- |
||
553 | |||
554 | header db appname,version,0 |
||
555 | |||
556 | msg_divs db ' x8 x16 x32 x64 x128 x256 x512' |
||
557 | msg_hdd db 'Hatl Disc.' |
||
558 | msg_sgd db 'Stop Grand' |
||
559 | msg_nb db 'North bridge :';14 |
||
560 | msg_stat db 'Status :' ;8 |
||
561 | msg_en db 'Enabled ' ;9 |
||
562 | msg_dis db 'Disabled ' ;9 |
||
563 | msg_nf db 'Not found' ;9 |
||
564 | |||
565 | I_END: |
||
566 | sc system_colors |
||
567 | val_hdd: dd ? |
||
568 | val_sgd: dd ? |
||
569 |