2014-11-25 5 views
0

먼저 Vintage 컴퓨터 그룹을 위해 프로그램합니다. 내가 쓰는 것은 사람들이 무엇을 실행하고 있는지 알기 때문에 특히 MS-DOS가 아니라 창을위한 것입니다. 현재 프로그램은 나중에 시스템을위한 것이며 8086 라인이 아니기 때문에 IRQ 8을 사용하는 것이 계획되었습니다. 이렇게하면 2/2 초에서 8192/초 (2, 4, 8, 16, etc ...)IRQ 8이 작동하지 않습니다 ... HW 또는 SW?

어떤 이유로 든 더 오래된 시스템 (ok, 이상하게 들릴 수 있음)에서만 작동하지 않는 것 같습니다. 에뮬레이션 및 386 시스템에서 액세스 할 수 있지만 잘 작동하지만 P3 시스템에서 (GA-6BXC MB w/P3 800 CPU) 작동하지 않습니다. 다운

,536,913,632 프로그램을 닫을 때

코드

인터럽트

outportb(0x70,0x0c); 
inportb(0x71);  //Reading the C register resets the interrupt 
outportb(0xa0,0x20); //Resets the PIC (turns interrupts back on) 
outportb(0x20,0x20); //There are 2 PICs on AT machines and later 

끝에 인터럽트

disable(); 
oldrtc = getvect(0x70); //Reads the vector for IRQ 8 
settvect(0x70,countdown); //Sets the vector for 

outportb(0x70,0x8a); 
y = inportb(0x71) & 0xf0; 
outportb(0x70,0x8a); 
outportb(0x71,y | _MRATE_); //Adjustable value, set for 64 interrupts per second 

outportb(0x70,0x8b); 
y = inportb(0x71); 
outportb(0x70,0x8b); 
outportb(0x71,y | 0x40); 

enable(); 

설정 10

disable(); outportb(0x70,0x8b); y = inportb(0x71); outportb(0x70,0x8b); outportb(0x71,y & 0xbf); setvect(0x70,oldrtc); enable(); 

문제를 일으킬 수있는 코드가 표시되지 않습니다. 그러나 그것은 단지 이해가되지 않는 것처럼 보입니다. 정보를 전적으로 신뢰하지는 않지만 MSD는 IRQ 8을 RTC 카운터로보고하고 있으며 이것이 현재 잘 작동하고 있다고 말합니다. 나중에 시스템이 벡터를 움직일 수 있습니까? 내가 찾은 모든 것은 IRQ 8이 벡터 0x70이지만 인터럽트는 내 펜티엄 III 시스템에서 결코 발생하지 않는다고 말합니다. 벡터가 변경되었는지 확인하는 방법이 있습니까?

답변

1

MS-DOS 코드를 작성한 이후로 오랜 시간이 지났으며이 특정 인터럽트로 작업 한 적이 없다고 생각합니다. (시간을 가져 오기 위해 메모리 위치를 읽을 수도 있습니다. , IRQ0를 사용하면 일정 간격으로 사용자를 트리거 할 수 있습니다. 어쨌든 내 녹슨 감이 있으면 다소간 링크 덤핑을 용서해주십시오.

http://wiki.osdev.org/Real_Time_Clock 페이지 하단에는 문제가 있다고 말하는 사람이 있습니다. RBIL은 BIOS가 될 수 있다고 제안합니다 : http://www.ctyme.com/intr/rb-7797.htm 도스가 없으면 IRQ0 자체를 캡처하여 모든 인터럽트 번호로 다시 매핑하고 tim을 변경합니다. 필요에 따라 나는 그것을 다소 최근에 끝냈다!

"참고 : 어쨌든 http://www.ctyme.com/intr/rb-2443.htm

이 있지만, 나는 그것이 BIOS 건과 관련이있다 별말씀 : 대부분의 BIOS는주기적인 인터럽트를 끄고 난 그 DOS는하지만,이 것을 더 권장 외모에 나쁜 아이디어라고 생각합니다 (INT 15/AH = 83h, INT 15/AH = 86h 참고). I/O 포트 A1h에서 비트 0을 설정하여 마스킹 될 수 있습니다. "

+0

나는 실제로 이미 매우 빠른 (짧은 코드) 기능을 위해 PIT1 & PIT3 사용. 처음 빌드에서는 타이머 기능에도이 코드를 사용했지만 더 많은 코드를 필요로합니다. 따라서 성능이 크게 저하되었습니다. 초당 64 회 실행되는 코드는 코드가 초당 23K 회 발생하는 것보다 적은 영향을줍니다. 그리고 네, 이미 더 빠른 PIT1 인터럽트 루틴을위한 시계를 조정하고 있습니다. 나는 BIOS가 IRQ 8을 완전히 무력하게 할 수 있다는 것을 발견하지 못한다. 나는 이것을 탐지하고 다시 사용할 수있는 방법을 찾을 수없는 것 같다. ( – user3399848

+0

일부 BIOS 유형이 IRQ 8을 감추는 것으로 판명되었다.그래서 줄을 추가했습니다. outportb (0xa1, inportb (0xa1) & 0x7f); outportb (0x21, inportb (0x21) & 0xdf); 초기화에 . 그러나 그것은 그 문제를 해결하지 못했습니다. – user3399848

+0

흠, 나는 시도 할 다른 것을 생각할 수 없다. 이를 통해 오는 또 다른 해결 방법은 짧은 이벤트 처리기에 시세 표시기를 넣고 다른 쪽을 롤오버 할 때만입니다. 그래서 느린 함수 호출을 억제합니다. 23k/sec 함수에서와 마찬가지로,'inc [somebyte]; jz do_more; iret;'- 어떤 바이트가 0으로 롤백되면, 당신은 256 번의 ​​반복을 거쳤고 다시 호출 할 수 있음을 의미합니다. 그건 전화를 걸지 않는 시간에 끔찍하게 느려지지 않고 초당 90 건의 통화를하는 것입니다. –