ReC98/libs/BorlandC/int86.asm

118 lines
2.3 KiB
NASM

; int __cdecl int86(int intno, union REGS *inregs, union REGS *outregs)
_int86 proc
@@segp = SREGS ptr -(size SREGS)
@@intno = word ptr (dPtrSize + 2)
@@inregs = DPTR_ (dPtrSize + 4)
@@outregs = DPTR_ (dPtrSize + 4 + dPtrSize)
push bp
mov bp, sp
sub sp, size SREGS
push si
push di
push ss
lea ax, [bp+@@segp]
push ax
nopcall _segread
pop cx
pop cx
push ss
lea ax, [bp+@@segp]
push ax
push word ptr [bp+@@outregs+2]
push word ptr [bp+@@outregs]
push word ptr [bp+@@inregs+2]
push word ptr [bp+@@inregs]
push [bp+@@intno]
call _int86x
add sp, (dPtrSize * 2) + 6
pop di
pop si
mov sp, bp
pop bp
ret
_int86 endp
; int __cdecl int86x(int intno, union REGS *inregs, union REGS *outregs, struct SREGS *segregs)
_int86x proc
@@Code = byte ptr -(4 + 10)
@@Vector = dword ptr -4
@@intno = word ptr (dPtrSize + 2)
@@inregs = DPTR_ (dPtrSize + 4)
@@outregs = DPTR_ (dPtrSize + 4 + dPtrSize)
@@segregs = DPTR_ (dPtrSize + 4 + dPtrSize + dPtrSize)
push bp
mov bp, sp
sub sp, (4 + 10)
push si
push di
push ds
lea cx, [bp+@@Code]
mov word ptr [bp+@@Vector], cx
mov word ptr [bp+@@Vector+2], ss
mov [bp+@@Code], 55h
mov [bp+@@Code+1], 0CDh
mov ax, [bp+@@intno]
mov [bp+@@Code+2], al
mov word ptr [bp+@@Code+3], 0CB5Dh
cmp al, 25h
jb short @@SetRegs
cmp al, 26h
ja short @@SetRegs
mov [bp+@@Code+3], 36h
mov word ptr [bp+@@Code+4], 68Fh
mov word ptr [bp+@@Code+6], cx
mov word ptr [bp+@@Code+8], 0CB5Dh
@@SetRegs:
LDS_ si, [bp+@@segregs]
push [si+SREGS._es]
push [si+SREGS._ds]
LDS_ si, [bp+@@inregs]
mov ax, [si+WORDREGS._ax]
mov bx, [si+WORDREGS._bx]
mov cx, [si+WORDREGS._cx]
mov dx, [si+WORDREGS._dx]
mov di, [si+WORDREGS._di]
mov si, [si+WORDREGS._si]
pop ds
pop es
clc
call [bp+@@Vector]
pushf
pushf
push si
push ds
push es
ife LDATA
mov ds, [bp-20]
endif
LDS_ si, [bp+@@segregs]
pop [si+SREGS._es]
pop [si+SREGS._ds]
LDS_ si, [bp+@@outregs]
pop [si+WORDREGS._si]
pop [si+WORDREGS._flags]
pop [si+WORDREGS._cflags]
and [si+WORDREGS._cflags], 1
mov [si+WORDREGS._di], di
mov [si+WORDREGS._dx], dx
mov [si+WORDREGS._cx], cx
mov [si+WORDREGS._bx], bx
mov [si+WORDREGS._ax], ax
pop ds
jz short @@int86Ok
push ax
push ax
call __IOERROR
pop ax
@@int86Ok:
pop di
pop si
mov sp, bp
pop bp
ret
_int86x endp