diff options
author | Robert de Bath <rdebath@poboxes.com> | 1999-06-11 14:11:38 +0200 |
---|---|---|
committer | Lubomir Rintel <lkundrak@v3.sk> | 2013-10-23 23:41:25 +0200 |
commit | 3d4957c86ff239b24b43933924ec72a3fd288518 (patch) | |
tree | da8225a4d7bb2d9123e10d558cdc3eebae6254c8 /libc/msdos/intr.c | |
parent | e62b35169cdcd13632ae353b1e5ffde7dec44201 (diff) | |
download | dev86-3d4957c86ff239b24b43933924ec72a3fd288518.tar.gz |
Import Dev86src-0.14.8.tar.gzv0.14.8
Diffstat (limited to 'libc/msdos/intr.c')
-rw-r--r-- | libc/msdos/intr.c | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/libc/msdos/intr.c b/libc/msdos/intr.c new file mode 100644 index 0000000..22de042 --- /dev/null +++ b/libc/msdos/intr.c @@ -0,0 +1,82 @@ + +struct REGPACK +{ + unsigned r_ax, r_bx, r_cx, r_dx; + unsigned r_bp, r_si, r_di, r_ds, r_es, r_flags; +}; + +/* DANGER DANGER -- Self modifying code! */ + +#asm +.text +save_sp: + dw 0 +#endasm + +intr(intr, regs) +int intr; +struct REGPACK * regs; +{ +#asm + mov bx,sp + push bp + push si + push di + push es + push ds + + mov ax,[bx+2] + seg cs + mov [intr_inst+1],al + seg cs + mov [save_sp],sp + + mov bx,[bx+4] + + mov ah,[bx+18] ! Flags low byte + sahf + + mov ax,[bx] + push [bx+2] + mov cx,[bx+4] + mov dx,[bx+6] + mov bp,[bx+8] + mov si,[bx+10] + mov di,[bx+12] + mov es,[bx+16] + mov ds,[bx+14] + pop bx + +intr_inst: + int $FF ! Must be a real int .. consider protected mode. + + seg cs ! Could be SS as DS==SS + mov sp,[save_sp] + seg cs + mov [save_sp],ds + pop ds + push [save_sp] + + push bx + mov bx,sp + mov bx,[bx+12] + + mov [bx],ax + pop [bx+2] + mov [bx+4],cx + mov [bx+6],dx + mov [bx+8],bp + mov [bx+10],si + mov [bx+12],di + pop [bx+14] + mov [bx+16],es + pushf + pop [bx+18] + + pop es + pop di + pop si + pop bp + +#endasm +} |