Subversion Repositories Kolibri OS

Rev

Rev 197 | Go to most recent revision | 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. 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.  
  570.