; Register a interrupt handler (21h AH=25h) ; in: AL interrupt number ; DS:DX far ptr isr_intr_register: ; backup previous stos ptr push es push di ; DI = AL * 4 mov ah, 4 mul ah mov di, ax ; ES = 0 xor ax, ax mov es, ax ; store offset mov ax, dx stosw ; store segment mov ax, ds stosw ; restore previous stos ptr pop di pop es iret ; Register a interrupt handler ; in: AL interrupt number ; ES:DI far ptr to routine/data intr_register: ; backup original values push ax push es push di ; pop as ax later push es push di ; DI = AL * 4 mov ah, 4 mul ah mov di, ax ; ES = 0 xor ax, ax mov es, ax ; store offset pop ax stosw ; store segment pop ax stosw pop di pop es pop ax ret ; Get address for a interrupt vector ; in AL interrupt number ; out DS:SI far ptr to routine/data intr_load: push ax ; SI = AL * 4 mov ah, 4 mul ah mov si, ax ; DS = 0 xor ax, ax mov ds, ax ; load segment and offset in one go lds si, [si] pop ax ret