AdvancedPowerManagment(dos)

Тема в разделе "WASM.BEGINNERS", создана пользователем morkster, 19 апр 2006.

  1. morkster

    morkster New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    31
    Сижу в DOSе. Второй винт(IDE,Primary,Slave) шумит со всех своих rpm. В BIOSе стоит shutdown, но там минимум 3 минуты ждать. Пол года терпел, ленился, потом набросал програмку.

    Проблема в том, что она отрубает оба винта, несмотря на начение в bl

    В доках есть только комментарий, bx=(02FFh for all attached secondary storage devices)

    Попробовал через GetPowerState(int 15,ax=530C) проверить девайсы в диапазоне 200-2FF и получил облом, CF=1 AH=09h(unrecognized device ID).

    Сам BIOS умеет отрубать винты "поштучно". Трейсить как он ето делает вроде как лень, подумал тут спросит.

    Версия powermanagmentа 1.1



    Source тута, компилируется в .COM и как уже упоминалось, под DOS.



    .MODEL TINY

    .486

    .CODE

    ORG 100h



    start:

    mov ax,5300h

    mov bx,00h

    int 15h ;в принципе нафиг не надо, так как на error я всеравно не проверяю(под дебуггером все ок)



    mov ax,5301h

    xor bx,bx

    int 15h ;говорим BIOSу подвинуца



    mov ax,530eh

    xor bx,bx

    mov cx,0101h

    int 15h ;говорим BIOSу что мы знаем его и его маму(в смысле до версии 1.1)



    ;смотрим с какими параметрами или их отсутствием нас запустили.

    ;В теории если запустиь прогу с параметром 0, SetPowerState будет вызван с bx=0200h(дебуггерер со мной вроде согласен). Соответственно с параметром 1, bx будет 0201h что вроде как должно соответствовать второму винту(нет, при значении 0202h всеравно вырубаются оба.).

    Ну а без параметров bx будет 02FFh, и оба винта засыпают, как и положено.



    mov ax,5307h

    mov bx,0200h

    mov bl,cs:[80h]

    test bl,bl

    jz ssetall

    mov bl,cs:[82h]

    sub bl,30h

    jmp zgib

    ssetall:

    xor bl,bl

    dec bl

    zgib: ;это типа skip

    mov cx,0003h

    int 15h ;и собственно Акшен!



    ;материмся потомучто BIOS отрубил Primary,Master заодно со рабом, тобиш Slave



    mov ax,5304h

    xor bx,bx

    int 15h ;отдаём BIOSу его любимые игрушки



    mov ah,4ch

    int 21h ;выходим в DOS наплевав на return code



    end start