Subversion Repositories Kolibri OS

Rev

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