Subversion Repositories Kolibri OS

Rev

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