Power OFF

Тема в разделе "WASM.ASSEMBLER", создана пользователем valeri, 3 июн 2005.

  1. R_NEW

    R_NEW New Member

    Публикаций:
    0
    Регистрация:
    6 май 2005
    Сообщения:
    86
    Адрес:
    Россия
    Если ты не затёр IDT реального режима, то int 15h действовать должно, но возможно нужно ещё сохранить область данных BIOS.В общем,память 0-500h должна быть не испорчена.
     
  2. R_NEW

    R_NEW New Member

    Публикаций:
    0
    Регистрация:
    6 май 2005
    Сообщения:
    86
    Адрес:
    Россия
    А в V86 у тебя могут возникнуть проблемы: вдруг BIOS вздумает выполнить привелигированную команду.
     
  3. valeri

    valeri New Member

    Публикаций:
    0
    Регистрация:
    3 июн 2005
    Сообщения:
    59
    Адрес:
    Russia
    Т.е. если я, например, расположу код вида
    Код (Text):
    1. mov ax,5301h
    2. sub bx,bx
    3. int 15h


    по адресу 1000h, то переход в реальный режим должен выглядеть так


    Код (Text):
    1.  
    2. mov word ptr fs:[467h],1000h
    3. mov word ptr fs:[469h],0
    4. cli
    5. mov al,8fh
    6. out 70h,al
    7. mov al,5
    8. out 71h,al
    9. mov al,0feh
    10. out 64h,al
    11. wait_reset:
    12. jmp wait_reset
    13.  




    при этом не надо затирать память 0-500h.

    Я так все понял?
     
  4. R_NEW

    R_NEW New Member

    Публикаций:
    0
    Регистрация:
    6 май 2005
    Сообщения:
    86
    Адрес:
    Россия
    Если 1000h - это физический адрес, то не mov word ptr fs:[467h],1000h, а mov word ptr fs:[467h],100h (0100:0000)

    А так всё правильно.
     
  5. R_NEW

    R_NEW New Member

    Публикаций:
    0
    Регистрация:
    6 май 2005
    Сообщения:
    86
    Адрес:
    Россия
    Насчёт 0-500h я точно не знаю. Я знаю, что когда комп перезагружается таким образом,то BIOS инициализирует контроллёр прерываний и исполняет твой код.Мне неизвестно, инициализируется-ли IDT,так что лучше подстраховаться.
     
  6. valeri

    valeri New Member

    Публикаций:
    0
    Регистрация:
    3 июн 2005
    Сообщения:
    59
    Адрес:
    Russia
    Все заработало! Спасибо за советы.



    Только возник другой вопрос, как осуществить перезагрузку системы не просто через сброс процессора, а чтобы процедура тестирования не выполнялясь, т.е. как при выполнении перезагрузки Windows. Где-то читал, что достаточно записать 0 в ячейку 0fh CMOS и выполнить сброс процессора, но у меня процедура тестирования все равно выполняется.
     
  7. R_NEW

    R_NEW New Member

    Публикаций:
    0
    Регистрация:
    6 май 2005
    Сообщения:
    86
    Адрес:
    Россия
    Попробуй записать 4 в ячейку 0fh CMOS. Не знаю точно работает-ли,но по идее BIOS должна сразу грузить ОС с диска, без всяких POST.
     
  8. R_NEW

    R_NEW New Member

    Публикаций:
    0
    Регистрация:
    6 май 2005
    Сообщения:
    86
    Адрес:
    Россия
    valeri

    Ну что, работает?
     
  9. valeri

    valeri New Member

    Публикаций:
    0
    Регистрация:
    3 июн 2005
    Сообщения:
    59
    Адрес:
    Russia
    Нет не получается. Эмулятор Bochs выдает PANIC Unimplemented shutdown status: 04, на реальном компе пока не проверял.
     
  10. R_NEW

    R_NEW New Member

    Публикаций:
    0
    Регистрация:
    6 май 2005
    Сообщения:
    86
    Адрес:
    Россия
    Попробуй выйти в реальный режим и выполнить int 19h.



    P.S. Я тоже пытаюсь писать свою ОСь. Я только начал, и у меня возникла проблема: аппаратные прерывания не работают. Исключения работают прекрасно. Я больше чем уверен, что в твоей ОСи аппаратные прерывания занимают вектора 20-2F(как и у меня). Не мог ли ты показать код, который перепрограммирует контроллёр прерываний?
     
  11. valeri

    valeri New Member

    Публикаций:
    0
    Регистрация:
    3 июн 2005
    Сообщения:
    59
    Адрес:
    Russia
    Перепрограммирую контроллер прерываний я таким образом:
    Код (Text):
    1. mov al,00010001b
    2. out 20h,al
    3. mov al,20h
    4. out 21h,al
    5. mov al,00000100b
    6. out 21h,al
    7. mov al,00000001b
    8. out 21h,al




    Ты это хотел узнать?

    После этого все аппаратные прерывания перемещаются на 20h.
     
  12. halyavin

    halyavin New Member

    Публикаций:
    0
    Регистрация:
    13 май 2005
    Сообщения:
    252
    Адрес:
    Russia
    А слабо разобраться в коде MenuetOS (кстати на этом форуме ее упоминание не запрещено?)? ;)

    Операционных систем, которые пишет один человек очень много (даже чисто ассемблерных много), поэтому стать первопроходцами все равно не удастся. Так может лучше присоединится к существующему проекту - MenuetOS, АТОМОС, Miraculix, GreyOS, Visopsys, SkyOS, BeOs, ReactOs или к unix-системе? (полный список http://en.wikipedia.org/wiki/List_of_operating_systems ;)
     
  13. _VaStaNi_

    _VaStaNi_ New Member

    Публикаций:
    0
    Регистрация:
    7 июн 2005
    Сообщения:
    7
    Адрес:
    Харьков
    Самый лучший ответ, на мой взгляд у _BC_



    если заниматься этим профессионально, то надо именно выкопать PMBASE (то есть чипсет то освоить свой надо) и уж там по сути регистров и "злодействовать".

    Интересовался год назад, путем упрямства ходил по извилистым путям int 15h..., потом SoftIce отловил последние магические действия на моем VIA686A... ну и что думаете? До идиотизма просто оказалось. Чистовой результат для данного чипсета таков

    mov al, 0x57

    mov dx, 0x402F

    out dx, al

    ;--------------- капец питанию ATX!

    Пишите если на других VIA сработало, ладно? :)

    PS: естественно все работает прямо в... ДОСе!)
     
  14. R_NEW

    R_NEW New Member

    Публикаций:
    0
    Регистрация:
    6 май 2005
    Сообщения:
    86
    Адрес:
    Россия
    valeri

    А где инициализация второго контроллёра?

    Я использовал этот код, но наверно он не работает.
    Код (Text):
    1.  
    2.         mov      al, 11h
    3.     out 20h, al
    4.     out 0A0h, al
    5.     mov al, 20h
    6.     out 21h, al
    7.     mov al, 28h
    8.     out 0A1h, al
    9.     mov al, 4
    10.     out 21h, al
    11.     mov al, 2
    12.     out 0A1h, al
    13.     mov al, 1
    14.     out 21h, al
    15.     out 0A1h, al
    16.  
     
  15. valeri

    valeri New Member

    Публикаций:
    0
    Регистрация:
    3 июн 2005
    Сообщения:
    59
    Адрес:
    Russia
    Второй контроллер я пока не инициализировал, но тут все аналогично, только порт 20h заменяем на a0h, далее в порт a1h номер обработчика для IRQ8, что делатся в строках

    mov al,00000100b

    out 21h,al

    я сам не совсем разобрался, по-моему надо отправить тоже самое, но в порт a1h. Затем тоже самое, что и для первого контроллера, но в регистр a1h.
     
  16. R_NEW

    R_NEW New Member

    Публикаций:
    0
    Регистрация:
    6 май 2005
    Сообщения:
    86
    Адрес:
    Россия
    valeri

    Нашёл ошибку. Мой код правильный(наверно :)). Ошибка оказалась в другом месте. Зато при тестировании возник другой вопрос: если во время работы оси двинуть мышь, то ось виснет. Не могу понять, где ошибка: ведь контроллёр инициализирован, прерывание от таймера работает.

    halyavin

    Создание своей ОСи, даже самой примитивной, доставляет большое моральное удовлетворение... :)
     
  17. valeri

    valeri New Member

    Публикаций:
    0
    Регистрация:
    3 июн 2005
    Сообщения:
    59
    Адрес:
    Russia
    Как это виснет?

    Т.е ты хочешь скачать, что когда ты двигаешь мышкой у тебя возникает прерывание?

    В этом случае ты устновил соответствующий обработчик?
     
  18. R_NEW

    R_NEW New Member

    Публикаций:
    0
    Регистрация:
    6 май 2005
    Сообщения:
    86
    Адрес:
    Россия
    Я обрабатываю прерывания только от клавиатуры и таймера. Код остальных прерываний для 1 контроллёра такой:
    Код (Text):
    1. push eax
    2. mov  al,0x20
    3. out  0x20,al
    4. pop  eax
    5. iretd


    Код прерываний для 2 контроллёра такой:
    Код (Text):
    1. push eax
    2. mov  al,0x20
    3. out  0x20,al
    4. out  0xa0,al
    5. pop  eax
    6. iretd


    Мышь выдаёт прерывание, которое обрабатывается 2 контроллёром(№ 12 ?). Но у меня есть все обработчики всех прерываний.
     
  19. _VaStaNi_

    _VaStaNi_ New Member

    Публикаций:
    0
    Регистрация:
    7 июн 2005
    Сообщения:
    7
    Адрес:
    Харьков


    а таймер тут ни при чём!

    Двинул мышь->генерация пакета отт неё в KBC->генерация IRQ12->НАДО ЭТИ БАЙТЫ ВЫЧИТАТЬ из KBC...

    Усёк? Буферок то есть но небольшой. Да и потом невычитав принятое, ты затыкаешь обработку других...

    Поставь хотя бы чтение без использования

    _IRQ12_:

    push eax

    in al, 0x60 ; - ) берем мышь за жабры )

    mov al,0x20

    out 0x20,al

    out 0xa0,al

    pop eax

    iretd
     
  20. R_NEW

    R_NEW New Member

    Публикаций:
    0
    Регистрация:
    6 май 2005
    Сообщения:
    86
    Адрес:
    Россия
    _VaStaNi_

    Спасибо за пояснение.

    P.S. Когда я говорил о таймере, я подразумевал, что IDT и контроллёр правильно настроены и прерывания работают.