diff --git a/kernel/init-mod.h b/kernel/init-mod.h index 94ade1a..cb6924d 100644 --- a/kernel/init-mod.h +++ b/kernel/init-mod.h @@ -275,6 +275,12 @@ extern struct { extern UWORD DOSFAR LBA_WRITE_VERIFY; +/* original interrupt vectors, at 70:xxxx */ +extern struct lowvec { + unsigned char intno; + intvec isv; +} DOSTEXTFAR ASM intvec_table[5]; + /* floppy parameter table, at 70:xxxx */ extern unsigned char DOSTEXTFAR ASM int1e_table[0xe]; diff --git a/kernel/irqstack.asm b/kernel/irqstack.asm index 63dc3c7..cc49bd5 100644 --- a/kernel/irqstack.asm +++ b/kernel/irqstack.asm @@ -32,7 +32,7 @@ %include "segs.inc" -segment _LOWTEXT +segment _IRQTEXT old_vectors times 16 dd 0 stack_size dw 0 @@ -155,6 +155,10 @@ dont_switch: pushf iret + ; align to 100h to align _LOWTEXT for interrupt vectors + ; in kernel.asm + times (100h - ($ - old_vectors)) db 0 + segment INIT_TEXT global _init_stacks diff --git a/kernel/kernel.asm b/kernel/kernel.asm index db8257c..f07496f 100644 --- a/kernel/kernel.asm +++ b/kernel/kernel.asm @@ -233,6 +233,21 @@ no_nul_read: retf segment _LOWTEXT + + ; low interrupt vectors 10h,13h,15h,19h,1Bh + ; these need to be at 0070:0100 (see RBIL memory.lst) + global _intvec_table +_intvec_table: db 10h + dd 0 + db 13h + dd 0 + db 15h + dd 0 + db 19h + dd 0 + db 1Bh + dd 0 + ; floppy parameter table global _int1e_table _int1e_table: times 0eh db 0 diff --git a/kernel/main.c b/kernel/main.c index bb669b9..82a4b46 100644 --- a/kernel/main.c +++ b/kernel/main.c @@ -251,8 +251,11 @@ STATIC void setup_int_vectors(void) { 0x2f, FP_OFF(int2f_handler) } }; struct vec *pvec; + struct lowvec FAR *plvec; int i; + for (plvec = intvec_table; plvec < intvec_table + 5; plvec++) + plvec->isv = getvec(plvec->intno); for (i = 0x23; i <= 0x3f; i++) setvec(i, empty_handler); for (pvec = vectors; pvec < vectors + (sizeof vectors/sizeof *pvec); pvec++) diff --git a/kernel/segs.inc b/kernel/segs.inc index ba6e123..a08ce71 100644 --- a/kernel/segs.inc +++ b/kernel/segs.inc @@ -39,7 +39,7 @@ CPU XCPU %endif group PGROUP PSP -group LGROUP _LOWTEXT _IO_TEXT _IO_FIXED_DATA _TEXT +group LGROUP _IRQTEXT _LOWTEXT _IO_TEXT _IO_FIXED_DATA _TEXT group DGROUP _FIXED_DATA _BSS _DATA _DATAEND CONST CONST2 DCONST DYN_DATA %ifdef WATCOM group TGROUP HMA_TEXT_START HMA_TEXT HMA_TEXT_END INIT_TEXT_START INIT_TEXT INIT_TEXT_END @@ -51,6 +51,7 @@ group I_GROUP ID_B ID ID_E IC IDATA IB_B IB IB_E %endif segment PSP class=PSP +segment _IRQTEXT class=LCODE segment _LOWTEXT class=LCODE segment _IO_TEXT class=LCODE segment _IO_FIXED_DATA class=LCODE align=2