bool CALLBACK_Setup(Bitu callback,CallBack_Handler handler,Bitu type,const char* descr) { if (callback>=CB_MAX) return false; CALLBACK_SetupExtra(callback,type,CALLBACK_PhysPointer(callback)+0,(handler!=NULL)); CallBack_Handlers[callback]=handler; CALLBACK_SetDescription(callback,descr); return true; }
Bitu CALLBACK_Setup(Bitu callback,CallBack_Handler handler,Bitu type,PhysPt addr,const char* descr) { if (callback>=CB_MAX) return 0; Bitu csize=CALLBACK_SetupExtra(callback,type,addr,(handler!=NULL)); if (csize>0) { CallBack_Handlers[callback]=handler; CALLBACK_SetDescription(callback,descr); } return csize; }
void BIOS_Init() { Mem_rStosb(0x400, 0, 0x200); // Clear the Bios Data Area (0x400-0x5ff, 0x600- is accounted to DOS) // Setup all the interrupt handlers the Bios controls CALLBACK_SetupExtra(0, CB_IRQ0, dWord2Ptr(BIOS_DEFAULT_IRQ0_LOCATION)); RealSetVec(0x08, BIOS_DEFAULT_IRQ0_LOCATION); BIOS_HostTimeSync(); // Initialize the timer ticks CALLBACK_Install(0x11, &INT11_Handler, CB_IRET); // INT 11 Get equipment list CALLBACK_Install(0x12, &INT12_Handler, CB_IRET); // INT 12 Memory size default at 640 kb Mem_Stosw(BIOS_MEMORY_SIZE, 640); CALLBACK_Install(0x13, &INT13_DiskHandler, CB_IRET_STI); // INT 13 BIOS Disk support Mem_Stosb(BIOS_HARDDISK_COUNT, 2); // Setup the Bios Area CALLBACK_Install(0x14, &INT14_Handler, CB_IRET_STI); // INT 14 Serial ports CALLBACK_Install(0x15, &INT15_Handler, CB_IRET_STI); // INT 15 Misc calls BIOS_SetupKeyboard(); // INT 16 Keyboard handled in another file CALLBACK_Install(0x17, &INT17_Handler, CB_IRET_STI); // INT 17 Printer Routines CALLBACK_Install(0x1a, &INT1A_Handler, CB_IRET_STI); // INT 1A Time and some other functions // These are already setup as dummy by CALLBACK_Init() // CALLBACK_SetupDummyIRET(0x1c); // INT 1C System timer tick called from INT 8 // CALLBACK_Install(0x71, NULL, CB_IRQ9); // Irq 9 rerouted to irq 2 // CALLBACK_SetupDummyIRET(0x18); // Reboot dummies // CALLBACK_SetupDummyIRET(0x19); // set system BIOS entry point too Mem_aStosb(0xffff0, 0xEA); // FAR JMP Mem_aStosd(0xffff1, Mem_Lodsd(0x18*4)); Bitu cbID = CALLBACK_Allocate(); // Irq 2 CALLBACK_Setup(cbID, NULL, CB_IRET_EOI_PIC1, dWord2Ptr(BIOS_DEFAULT_IRQ2_LOCATION)); RealSetVec(0x0a, BIOS_DEFAULT_IRQ2_LOCATION); Mem_aStosb(BIOS_DEFAULT_HANDLER_LOCATION, 0xcf); // BIOS default interrupt vector location -> IRET Mem_aWrites(0xfff00, "vDos BIOS", 9); // System BIOS identification Mem_aWrites(0xffff5, "01/01/99\x00\xfc\x24", 11); // System BIOS date + signature for (Bitu i = BIOS_COM1_TIMEOUT; i <= BIOS_COM4_TIMEOUT; i++) // Port timeouts Mem_Stosb(i, 1); }