From: "steven mann" Newsgroups: comp.os.msdos.djgpp Subject: How do I get INT 11 (vector 73h) to work in protected mode Date: Tue, 7 Mar 2000 14:04:03 -0000 Lines: 109 X-Newsreader: Microsoft Outlook Express 4.72.3110.5 X-MimeOLE: Produced By Microsoft MimeOLE V4.72.3110.3 NNTP-Posting-Host: basit47307946.basldn.gecm.com Message-ID: <38c50cce$1@pull.gecm.com> X-Trace: 7 Mar 2000 14:06:06 GMT, basit47307946.basldn.gecm.com To: djgpp AT delorie DOT com DJ-Gateway: from newsgroup comp.os.msdos.djgpp Reply-To: djgpp AT delorie DOT com I have written a program that must run in PROTECTED mode to enable interfacing functions to work with a PCI card that I have designed. I have looked at all the FAQ's for DJGPP edition 2.11 for DJGPP 2.01. This has not helped as I appear to be doing everything neccesary. I am using CWSDPMI as the DPMI host and my program is only 40k in size. The interrupt handler is called "int_trans " of which I have captured the location in memory to place in the vector table 73h for interrupt 11. The interrupt handler does not get called when I run the program despite all, my efforts. I can see interrupts being generated by the hardware and thats it. All data and functions used during interrupt handling have been locked to prevent paging out. I hope someone can point out what I may have done wrong, as I have got to the stage were I have read so much documentation on what people think I should do, I have become totally confused. If anyone can help I would be very grateful many thanks - steve. An extract of the code for interrupt installing is below. dword irq_number=11; //Interrupt number that interrupt function is hooked into dword int_11_vector=0x73; //Vector number for interrupt 11 if (_go32_dpmi_lock_data(&last_packet,sizeof(last_packet))!=0) { printf("\nFailed to lock global in memory"); exit(0); } if (_go32_dpmi_lock_data(&main_pkt_list,sizeof(main_pkt_list))!=0) { printf("\nFailed to lock global in memory"); exit(0); } if (_go32_dpmi_lock_data(&control,sizeof(control))!=0) { printf("\nFailed to lock global in memory"); exit(0); } if (_go32_dpmi_lock_data(&Selector,sizeof(Selector))!=0) { printf("\nFailed to lock global in memory"); exit(0); } if (_go32_dpmi_lock_data(&LinearAddress,sizeof(LinearAddress)) != 0) { printf("\nFailed to lock global in memory"); exit(0); } /*-------------------------------------------------------------------------- ---------- Lock PCI Interrupt handler code interrupt 11 vector 73h ---------------------------------------------------------------------------- ---------*/ if (_go32_dpmi_lock_code(int_trans, (long)end_int_trans - (long)int_trans)!=0) { printf("\nFailed to lock Panavia PCI Card interrupt handler code in memory"); exit(0); } if (_go32_dpmi_get_protected_mode_interrupt_vector(int_11_vector, &pci_vector)!=0) { printf("\nFailed to get clock interrupt vector"); exit(0); } int_trans_vector.pm_offset = (int)int_trans; int_trans_vector.pm_selector = _my_cs(); /*The wrapper function creates a small assembler function that handles the overhead of servicing an interrupt. */ if (_go32_dpmi_allocate_iret_wrapper(&int_trans_vector)!=0) { printf("\nFailed to allocate Panavia PCi card interrupt wrapper"); exit(0); } if (_go32_dpmi_set_protected_mode_interrupt_vector(int_11_vector, &int_trans_vector)!=0) { printf("\nFailed to set interrupt Panavia PCi card vector"); exit(0); }