Subversion Repositories Kolibri OS

Rev

Rev 197 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

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