home *** CD-ROM | disk | FTP | other *** search
- ; TITLE intr.asm C. J. Kent
- ; page 64,130
- ;
- ; BUILD: Microsoft masm 5.1:
- ; masm /ML intr.asm;
-
- .MODEL LARGE, c
-
- ; IMPORTS:
-
-
- ; EXPORTS:
-
- ; MACROS
- ;
- ;struct REGPACK
- ; unsigned int r_ax;
- ; unsigned int r_bx;
- ; unsigned int r_cx;
- ; unsigned int r_dx;
- ; unsigned int r_bp;
- ; unsigned int r_si;
- ; unsigned int r_di;
- ; unsigned int r_ds;
- ; unsigned int r_es;
- ; unsigned int r_flags;
-
- OFFAX = 0
- OFFBX = 2
- OFFCX = 4
- OFFDX = 6
- OFFBP = 8
- OFFSI = 10
- OFFDI = 12
- OFFDS = 14
- OFFES = 16
- OFFC = 18
-
-
- ; DEFINES:
-
-
-
- .CODE
-
- ;***
- ;int int86x(intno, inregs, outregs, segregs) - do 8086 interrupt
- ;
- ;Purpose:
- ; calls the sepcified DOS interrupt with the registers as specified
- ; in inregs and ES and DS from segregs; copies the registers, ES,
- ; and DS into outregs and segregs on return.
- ;
- ;Entry:
- ; int intno - interrupt to execute
- ; union REGS *inregs - registers on entry to interrupt
- ; union REGS *outregs - registers on exit from interrupt
- ; struct SREGS *segregs - seg register: input and output
- ; (only ES and DS are used)
- ;
- ;Exit:
- ; returns value in AX after interrupt
- ;
- ;Uses:
- ;
- ;Exceptions:
- ;
- ;*******************************************************************************
- intr PROC USES di si ds, intno:WORD, pRegs:DWORD
-
- ;
- ; the stack is made to look like this:
- ;
- ; -------------------
- ; | pRegs | (arg2)
- ; -------------------
- ; | intno | (arg1)
- ; -------------------
- ; | ret addr |
- ; -------------------
- ; bp-> | old bp |
- ; -------------------
- ; | old di |
- ; -------------------
- ; | old si |
- ; -------------------
- ; | old ds |
- ; -------------------
- ; | 'retf'| |
- ; -------------------
- ; | 'inc sp inc sp' | <- only in if int 25 or int 26
- ; -------------------
- ; | 'int' | intno | <- we do a long call to 'int' opcode
- ; -------------------
- ; | ss |
- ; -------------------
- ; (bp)->| offset of 'int' |
- ; -------------------
- ;
- sub sp,10 ; room for 5 words
- mov byte ptr [bp-12],0cdh ; an 'int' opcode
- mov ax,intno
- mov [bp-11],al ; the interrupt number
- cmp al,25h
- je abnorm
- cmp al,26h
- je abnorm
- mov byte ptr [bp-10],0cbh ; a 'retf' opcode
- jmp short continue
-
- abnorm:
- mov byte ptr [bp-8],0cbh ; a 'retf' opcode
- mov byte ptr [bp-9],044h ; a 'inc sp' opcode for flags on stack
- mov byte ptr [bp-10],044h ; a 'inc sp' opcode for flags on stack
-
- continue:
-
- mov [bp-14],ss ; seg part of far call addr
-
- lea ax,[bp-12] ; offset part of far call addr
- mov [bp-16],ax ; we're going to jump onto the stack
-
- lds di,pRegs ; get struct REGPACK addr
-
-
- mov ax,[di+OFFAX]
- mov bx,[di+OFFBX]
- mov cx,[di+OFFCX]
- mov dx,[di+OFFDX]
- mov si,[di+OFFSI]
- push [di+OFFDI] ; save di, need it for indexing
-
- mov es,[di+OFFES]
- mov ds,[di+OFFDS]
- pop di ; restore di
- push bp
- call dword ptr [bp-10h] ; execute interrupt
-
- pop bp ; bp points to old bp
- cld ; ensure that direction is "up"
- push di ; save di
- push ds
-
- lds di,pRegs ; get struct REGPACK addr
-
- mov [di+OFFES],es
- pop [di+OFFDS]
-
- mov [di+OFFAX],ax
- mov [di+OFFBX],bx
- mov [di+OFFCX],cx
- mov [di+OFFDX],dx
- mov [di+OFFSI],si
- pop [di+OFFDI] ; restore di
- jc carry
-
- xor si,si
- jmp short toend
-
- carry:
- mov si,1
-
- toend:
- mov [di+OFFC],si ; set carry/no carry flag
- add sp,10 ; to get back to old sp
- ret
- intr ENDP
- END
- ; intr.asm
-
-