· Начало · Статистика · WASM.RU · Noir.Ru ·

 WASM Phorum (Оффлайн - 24.11.2003) —› WASM.ASSEMBLER —› PM & RM & programming i8259A

Посл.отвђт Сообщенiе


Дата: Окт 22, 2003 20:19:52

Подскажите в чем дело. Моя микро ось линкованая как СОМ файл загружается из доса, переходит в прот. моде, делает свои дела (не обращается вне исходного кода и данных) и затем не может выгрузиться в дос, просто виснет и баста.
Это происходит только в том случае если я программирую контроллер прерываний 8259, если же нет - все работает нормально.
Для программирования используется следующая процедура:
set_i8259A proc ; BH=base for MASTER, BL=base for SLAVE
mov al, 00010001b
out port_i8259a_m,al ;icw1
jmp $+2
jmp $+2
out port_i8259a_s,al ;icw1
jmp $+2
jmp $+2
mov al, bh
out port_i8259a_m+1,al ;base
jmp $+2
jmp $+2
mov al, bl
out port_i8259a_s+1,al ;base
jmp $+2
jmp $+2
mov al, 4 ; unit la a 2-a linie (master)
out port_i8259a_m+1,al ;icw3
jmp $+2
jmp $+2
mov al, 2 ; unit la a 2-a linie (slave)
out port_i8259a_s+1,al ;icw3
jmp $+2
jmp $+2
mov al, 1
out port_i8259a_m+1,al ;icw4
jmp $+2
jmp $+2
out port_i8259a_s+1,al ;icw4
jmp $+2
jmp $+2
mov al, 0ffh
out port_i8259a_m+1,al
jmp $+2
jmp $+2
out port_i8259a_s+1,al
jmp $+2
jmp $+2
ret
set_i8259A endp
;
port_i8259A_m equ 020h ; MASTER
port_i8259A_s equ 0A0h ; SLAVE
;
после перехода в прот. моде вызываю:
mov bx,2028h
call set_i8259A
xor al,al
out port_i8259A_m+1,al
out port_i8259A_s+1,al
in al,70h
and al,07fh
out 70h,al
;
после возврата в реал моде вызываю:
mov bx,0870h
call set_i8259A
xor al,al
out port_i8259A_m+1,al
out port_i8259A_s+1,al
in al,70h
and al,07fh
out 70h,al
все сегментные реги и системные тоже инициализирую так, как надо, т.к. иключений и зависаний не возникает ни в одном из случаев.
После возврата в реал моде доступны функции BIOS и работает комбинация CTRL+ALT+DEL
а выхожу из программы стандортно:
sti
mov ax,4c00h
int 21h
Подскажите плиз, что тут может быть не так?


Дата: Окт 23, 2003 06:07:58

У Гука написано что последовательность инициализации для контроллеров следующая:
ICW1 = 10h/10h(master/slave)
ICM2 = 08h/70h
ICW3 = 04h/02h
ICW4 = 1fh/1bh
OCW3 = 0ah,0ah
Только в моей программе после выхода из защищенного режима, отрубалась клавиатура. По моему выход тут один: в бут сектор дискеты поместить код, который поставит брекпоинт на обращение к портам, и посмотрит, что же всетаки в них пишется.


Дата: Окт 23, 2003 10:45:59

К стати, а где можно скачать этого Гука?


Дата: Окт 23, 2003 15:59:55

lazari
просто виснет и баста

вроде программируешь котроллер правильно, во всяком случае у меня та же последовательность команд. И все работает, то-есть и входит и выходит. А ты уверен, что проблема именно в контроллере?


Дата: Окт 23, 2003 16:10:50

да, еще, вот ссылочка.
Хотя про APIC я ни хрена не знаю. И без его разрешения/запрещения все прекрасно работает :)


Дата: Окт 23, 2003 17:50:21

Код правильный, если судить по приведеному куску. Но неплохо бы узнать еще
как в риал возвращаешься - если через ресет с точкой возврата, то в порт 71 нужно код возврата без перепрограммирования СКИ биосом, раз ты сам СКИ засылаешь.

Если без ресета, то не понимаю пока почему не проходит. разве что маски не те:)


Дата: Окт 23, 2003 20:22:55 · Поправил: lazari

Black_mirror
Год Гука правильнее, ICW4 у меня неверен. Но это не решает проблему.

Kba3iM0go
Что проблема в контролере уверен почти на все 100%, т.к. если я не перепрограммирую его, то все работает, ну почти все, т.к. прерывания не работают ...

Valery
А вот на счет маски и приоритетов не уверен, я лично приоритеты не использую, как и маски тоже, т.е. все аппаратные прерывания разрешены.


Дата: Окт 23, 2003 20:31:22

lazari

Год Гука правильнее, ICW4 у меня неверен.
хм. У меня также, как у тебя... Посмотрим.

ну почти все, т.к. прерывания не работают
Дык может именно прерывания что-то и портят? попробуй их повызывать ручками, без перепрограммирования.

я лично приоритеты не использую, как и маски тоже
Имеет смысл сохранить маску, которую выставил ДОС до того, как ты запустился. А вдруг у него какой-то вектор не инициализирован, и маска на него стоит. А ты когда выходишь - разблокируеш его?

А что по поводу APIC? Мож кто ткнет носом?


Дата: Окт 23, 2003 20:46:40

Повторяю вопрос: как в риал возвращаешься?Здесь это принципиально. Можно так еще: при возврате не перепрограмировать контроллеры, а сбросить перед ресетом в кмоп (0х71 порт) 0х05.


Дата: Окт 23, 2003 21:36:20 · Поправил: lazari

Valery
Сорри, забыл ответить.
Возвращаюсь сам, без сброса, вот код
set_real: cli
in al,port_CMOS_m ; interzicerea
or al,80h ; intreruperilor
out port_CMOS_m,al ; nemascabile
mov edi,krnl_offset
load_descr CODE_desc,edi,0FFFFh,SEG_DATACODE+SEG_CODE+SEG_PRESENT+SEG_READABLE
load_descr DATA_desc,edi,0FFFFh,SEG_DATACODE+SEG_PRESENT+SEG_WRITEABLE
mov word ptr IDTR,03ffh
mov dword ptr IDTR+2,0
lidt fword ptr IDTR ; incarcarea IDTR pentru RM
mov ax,real_cs
mov @@cs_rm,ax
mov ax,DATA_sel
mov ds,ax
mov es,ax
mov ss,ax
mov gs,ax
mov fs,ax
db 0eah ; far jmp (PM)
dd offset @@cs_pm
dw CODE_sel
@@cs_pm: mov eax,cr0 ; stabilirea
and al,0feh ; modului
mov cr0,eax ; real
db 0eah ; far jmp (RM)
dw offset back_rm
@@cs_rm dw ?
;
back_rm: mov ax,cs
mov ds,ax
mov es,ax
mov ss,ax
mov sp,real_sp

mov bx,0870h
call set_i8259A
xor al,al
out port_i8259A_m+1,al
out port_i8259A_s+1,al
in al,70h ; initializarea
and al,07fh ; intreruperilor
out 70h,al ; nemascabile

sti
mov ax,4c00h
int 21h
;
надеюсь здесь все понятно

да, вот еще кое какая статистика:
если программирую контроллер до входа в ПМ и не вхожу в ПМ, а сразу иду на BACK_RM, т.е. еще раз перепрограммирую контроллер но для доса, то все работает.
а вот если программирую контроллер, прыгаю в ПМ, но не трогаю контроллер, затем обратно и программирую его для дос, прога выходит в дос, но виснет клава :-)

А что касается ICW4, то смотрите сами:
Последнее слово инициализации (ICW4) имеет следующий формат:
7 6 5 4 3 2 1 0
Бит 0 (mPM) определяет, с каким микропроцессором работает
ПКП (0 - 8080/8085, 1 - 8086/8088).
Бит 1 (AEOI), равный 1, задает режим автоматического
завершения обработки прерывания, описанный выше. Если этот бит
равен 0, действует обычное соглашение: процедура обработки
аппаратного прерывания должна сама сбрасывать свой бит в ISR.
Бит 2 (M/S) игнорируется, если бит 3 (BUF) = 0. При наличии
одного контроллера и BUF = 1 устанавливается в 1. При наличии
каскада должен быть равен 1 только для ведущего контроллера.
Бит 4 (SFNM) устанавливает специальный вложенный режим,
применяемый при каскадировании для определения приоритетов
запросов от разных контроллеров (Special Fully Nested Mode).

Kba3iM0go
Ты имеешь в виду вызывать ручками в реале? Наверняка там заглушки стоят, но я все таки проверю, хотя в этом уже нет смысла, т.к. я маску во время статистики что выше менял и ничего - работало. А в ПМ все прерывания у меня перехватываются, если что лишнее вызвается - сразу видно.

Я ща перешел на альтернативный путь - ресет с кодом 5, так все работает, но все таки хотелось бы понять в чем именно трабла в первом случае. Возможно это из-за ACPI или как он там ...


Дата: Окт 24, 2003 02:22:23

lazari
да, вот еще кое какая статистика:
если программирую контроллер до входа в ПМ и не вхожу в ПМ, а сразу иду на BACK_RM, т.е. еще раз перепрограммирую контроллер но для доса, то все работает.
а вот если программирую контроллер, прыгаю в ПМ, но не трогаю контроллер, затем обратно и программирую его для дос, прога выходит в дос, но виснет клава :-)

У меня картина была точно такая же. Причем сохранение маски прерываний на это никак не влияло. На том компе на котором я производил тесты, никакого APIC не было, так что он скорее всего тут не при чем. Вообще моя программа переходила в зашищенный режим, а затем запускала дос в виртуальном. Некоторые программы там даже работали 8) А при возврате в реальный клавиатура не работала и все тут. Не помогал даже ее сброс.
Где скачать Гука я не знаю. Вообще книга называется "Аппаратные средства IBM PC" издательство "ПИТЕР".


Дата: Окт 24, 2003 07:32:14 · Поправил: lazari

Видимо надо вырезать из биоса процедуру программирования ПКП. Думаю, если покавыряться в нем с адреса, по которому прыгает проц после ресета (кажется 0FFFF:0000) ща точно не помню, то можно добраться и до этого ...
Попытаюсь, может на че интересное наткнусь :-)

Еще интересен момент: при перепрограммировании ПКП есть необходимость заново устанавливать приоритеты или они сохраняются?


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.048