Subversion Repositories Kolibri OS

Rev

Rev 7899 | 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.     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.  
  62. drawwindow:
  63.       mov  eax,48
  64.       mov  ebx,3
  65.       mov  ecx,sc
  66.       mov  edx,sizeof.system_colors
  67.       mcall
  68.  
  69.       mov       eax, 12
  70.         mov     ebx, 1 ; start redraw
  71.         mcall
  72.  
  73.         mov     eax, 0 ; window
  74.         mov     ebx, 100 shl 16 + 300
  75.         mov     ecx, 100 shl 16 + 90
  76.         mov   edx, [sc.work]
  77.       or    edx, 0x13000000
  78.         mov     edi, title
  79.         mcall
  80.  
  81.         mov     eax, 4
  82.         mov     ebx, 17 shl 16 + 30
  83.       mov   ecx, [sc.work_text]
  84.         mov     edx, msg_nb
  85.         mov     esi, msg_nb.length
  86.         mcall
  87.  
  88.         mov     ebx, 105 shl 16 + 30
  89.         mov     edx, [nb_name]
  90.         movzx   esi, byte[edx]
  91.         inc     edx
  92.         mcall
  93.  
  94.         mov     ebx, 17 shl 16 + 40
  95.         mov     edx, msg_stat
  96.         mov     esi, msg_stat.length
  97.         mcall
  98.  
  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
  111.  
  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.  
  181. ; Wait for event ...
  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
  194. no_exit:
  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.  
  207. no_ch_bt:
  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
  215. no_hdd_bt:
  216.         sub     ah, 10
  217.         movzx   edi, ah
  218.         mov     esi, [val_hdd]
  219.         call    set_divs
  220.         jmp     drawwindow
  221.  
  222.  
  223. not_bt: cmp     al, 2
  224.         jne     drawwindow
  225.         mov     eax, 2                  ; ¯®ª  ª« ¢  ­¥ ¯®¤¤¥à¦¨¢ ¥âáï - ç¨â ¥¬ ¨ § ¡ë¢ ¥¬
  226.         mcall
  227.         jmp     drawwindow
  228. ;--------------------------------------------------------------------------
  229. bus_num:        db      2       ; ®¬¥à 設ë
  230. devfn:          db      255
  231. bd_id:          dd      0       ; ˆ¤¥­â¨ä¨ª â®à ãáâனá⢠
  232. bd_stat:        db      0       ; 0 - ­¥ ­ ©¤¥­, 1 - ¢ëª«î祭, 2 - ¢ª«î祭
  233.  
  234. nb_name         dd      nb_nf
  235. bd_msk          dd      msk_i440
  236.  
  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'
  279.  
  280.  
  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
  376. bd_table_end:
  377.  
  378.  
  379. find_north_bridg:
  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
  403. bd_found:
  404.         add     esi, bd_table + 4
  405.         mov     edi, nb_name
  406.         mov     ecx, 2
  407.         rep     movsd
  408.  
  409.         mov     [bd_id], eax
  410.         ret
  411.  
  412. ;----------------------
  413. ;bd_stat:       db      0       ; 0 - ­¥ ­ ©¤¥­, 1 - ¢ëª«î祭, 2 - ¢ª«î祭
  414. get_bd_stat:
  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
  439. ;----------------------
  440. set_bd_stat:
  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]
  447. bd_ss_nxt:
  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
  472. bd_ss_end:
  473.         ret
  474. ;------- nForce 2 -----------
  475. set_stat_nforce2:
  476. ; IN : eax = 0 - disable, !0 - enable
  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
  500. ;--------------------------------------------------------------------------
  501. ;                        x8    x16   x32    x64  x128  x256  x512
  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
  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                      |
  511. ; 256      0x1267   & bit 18 is clear  |  & bit 18 is set
  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 ..)
  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
  535.  
  536. get_divs:
  537. ; OUT : val_hdd - hdd (0 = x8, 1 = x16 ..)
  538. ;       val_sgd - sgd ...
  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
  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
  572.    test    dword[bd_id], -1 ; check zero
  573.    jz      controller_not_found
  574.  
  575.    call    set_bd_stat
  576.    mcall   -1
  577.  
  578. ;******************************************************************************
  579.  
  580.  
  581. ;--------------------------------------------------------------------------
  582.  
  583. title   db appname,version,0
  584.  
  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
  595.  
  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.  
  612. I_END:
  613.  
  614. sc      system_colors
  615. val_hdd dd ?
  616. val_sgd dd ?
  617.  
  618.