Subversion Repositories Kolibri OS

Rev

Rev 502 | Go to most recent revision | Blame | 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.       mcall
  48.  
  49.       mov       eax, 12
  50.         mov     ebx, 1 ; start redraw
  51.         mcall
  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, title
  59.         mcall
  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, msg_nb.length
  66.         mcall
  67.  
  68.         mov     ebx, 105 shl 16 + 30
  69.         mov     edx, [nb_name]
  70.         movzx   esi, byte[edx]
  71.         inc     edx
  72.         mcall
  73.  
  74.         mov     ebx, 17 shl 16 + 40
  75.         mov     edx, msg_stat
  76.         mov     esi, msg_stat.length
  77.         mcall
  78.  
  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
  91.  
  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.  
  161. ; Wait for event ...
  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
  174. no_exit:
  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.  
  187. no_ch_bt:
  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. no_hdd_bt:
  196.         sub     ah, 10
  197.         movzx   edi, ah
  198.         mov     esi, [val_hdd]
  199.         call    set_divs
  200.         jmp     drawwindow
  201.  
  202.  
  203. not_bt: cmp     al, 2
  204.         jne     drawwindow
  205.         mov     eax, 2                  ; ¯®ª  ª« ¢  ­¥ ¯®¤¤¥à¦¨¢ ¥âáï - ç¨â ¥¬ ¨ § ¡ë¢ ¥¬
  206.         mcall
  207.         jmp     drawwindow
  208. ;--------------------------------------------------------------------------
  209. bus_num:        db      2       ; ®¬¥à 設ë
  210. devfn:          db      255
  211. bd_id:          dd      0       ; ˆ¤¥­â¨ä¨ª â®à ãáâனá⢠
  212. bd_stat:        db      0       ; 0 - ­¥ ­ ©¤¥­, 1 - ¢ëª«î祭, 2 - ¢ª«î祭
  213.  
  214. nb_name         dd      nb_nf
  215. bd_msk          dd      msk_i440
  216.  
  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'
  259.  
  260.  
  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
  356. bd_table_end:
  357.  
  358.  
  359. find_north_bridg:
  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
  383. bd_found:
  384.         add     esi, bd_table + 4
  385.         mov     edi, nb_name
  386.         mov     ecx, 2
  387.         rep     movsd
  388.  
  389.         mov     [bd_id], eax
  390.         ret
  391.  
  392. ;----------------------
  393. ;bd_stat:       db      0       ; 0 - ­¥ ­ ©¤¥­, 1 - ¢ëª«î祭, 2 - ¢ª«î祭
  394. get_bd_stat:
  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
  419. ;----------------------
  420. set_bd_stat:
  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]
  427. bd_ss_nxt:
  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
  452. bd_ss_end:
  453.         ret
  454. ;------- nForce 2 -----------
  455. set_stat_nforce2:
  456. ; IN : eax = 0 - disable, !0 - enable
  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
  480. ;--------------------------------------------------------------------------
  481. ;                        x8    x16   x32    x64  x128  x256  x512
  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
  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                      |
  491. ; 256      0x1267   & bit 18 is clear  |  & bit 18 is set
  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 ..)
  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
  515.  
  516. get_divs:
  517. ; OUT : val_hdd - hdd (0 = x8, 1 = x16 ..)
  518. ;       val_sgd - sgd ...
  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
  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.  
  560. title   db appname,version,0
  561.  
  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
  572.  
  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.  
  589. I_END:
  590.  
  591. sc      system_colors
  592. val_hdd dd ?
  593. val_sgd dd ?
  594.  
  595.