ReC98/libs/BorlandC/signal.asm

432 lines
7.2 KiB
NASM

; static void interrupt Int0Catcher(unsigned bp)
Int0Catcher proc far
@@action = DPTR_ -(0 + dPtrSize)
push ax
push bx
push cx
push dx
push es
push ds
push si
push di
push bp
mov bp, seg _DATA
mov ds, bp
mov bp, sp
sub sp, 4
mov dx, word ptr Dispatch+(2*4)+2
mov ax, word ptr Dispatch+(2*4)
mov word ptr [bp+@@action+2], dx
mov word ptr [bp+@@action], ax
or dx, dx
jnz short @@Int0Catcher_check_sigerr
cmp ax, 1
jz short @@Int0Catcher_ret
@@Int0Catcher_check_sigerr:
mov ax, word ptr [bp+@@action]
or ax, word ptr [bp+@@action+2]
jz short @@Int0Catcher_exit
cmp word ptr [bp+@@action+2], 0FFFFh
jnz short @@Int0Catcher_call
cmp word ptr [bp+@@action], 0FFFFh
jnz short @@Int0Catcher_call
@@Int0Catcher_exit:
mov ax, 1
push ax
nopcall __exit
pop cx
@@Int0Catcher_call:
mov word ptr Dispatch+(2*4)+2, 0
mov word ptr Dispatch+(2*4), 0
push ss
lea ax, [bp+0]
push ax
mov ax, 7Fh
push ax
mov ax, 8
push ax
call [bp+@@action]
add sp, 8
@@Int0Catcher_ret:
mov sp, bp
pop bp
pop di
pop si
pop ds
pop es
pop dx
pop cx
pop bx
pop ax
iret
Int0Catcher endp
; static void interrupt Int4Catcher(unsigned bp)
Int4Catcher proc far
@@action = DPTR_ -(0 + dPtrSize)
push ax
push bx
push cx
push dx
push es
push ds
push si
push di
push bp
mov bp, seg _DATA
mov ds, bp
mov bp, sp
sub sp, 4
mov dx, word ptr Dispatch+(2*4)+2
mov ax, word ptr Dispatch+(2*4)
mov word ptr [bp+@@action+2], dx
mov word ptr [bp+@@action], ax
or dx, dx
jnz short @@Int4Catcher_check_sigerr
cmp ax, 1
jz short @@Int4Catcher_ret
@@Int4Catcher_check_sigerr:
mov ax, word ptr [bp+@@action]
or ax, word ptr [bp+@@action+2]
jz short @@Int4Catcher_exit
cmp word ptr [bp+@@action+2], 0FFFFh
jnz short @@Int4Catcher_call
cmp word ptr [bp+@@action], 0FFFFh
jnz short @@Int4Catcher_call
@@Int4Catcher_exit:
mov ax, 1
push ax
nopcall __exit
pop cx
@@Int4Catcher_call:
mov word ptr Dispatch+(2*4)+2, 0
mov word ptr Dispatch+(2*4), 0
push ss
lea ax, [bp+0]
push ax
mov ax, 7Eh
push ax
mov ax, 8
push ax
call [bp+@@action]
add sp, 8
@@Int4Catcher_ret:
mov sp, bp
pop bp
pop di
pop si
pop ds
pop es
pop dx
pop cx
pop bx
pop ax
iret
Int4Catcher endp
; static void interrupt Int23Catcher()
Int23Catcher proc far
@@action = DPTR_ -(0 + dPtrSize)
push ax
push cx
push dx
push bx
push sp
push bp
push si
push di
push ds
push es
mov bp, seg _DATA
mov ds, bp
mov bp, sp
sub sp, 4
pushf
mov dx, word ptr Dispatch+2
mov ax, word ptr Dispatch
mov word ptr [bp+@@action+2], dx
mov word ptr [bp+@@action], ax
or dx, dx
jnz short @@Int23Catcher_check_sigerr
cmp ax, 1
jz short @@Int23Catcher_ret
@@Int23Catcher_check_sigerr:
mov ax, word ptr [bp+@@action]
or ax, word ptr [bp+@@action+2]
jz short @@Int23Catcher_exit
cmp word ptr [bp+@@action+2], 0FFFFh
jnz short @@Int23Catcher_call
cmp word ptr [bp+@@action], 0FFFFh
jnz short @@Int23Catcher_call
@@Int23Catcher_exit:
mov ax, 1
push ax
nopcall __exit
pop cx
@@Int23Catcher_call:
mov word ptr Dispatch+2, 0
mov word ptr Dispatch, 0
push word ptr OldInt23+2
push word ptr OldInt23
mov ax, 23h
push ax
nopcall _setvect
mov ax, 2
push ax
call [bp+@@action]
add sp, 8
@@Int23Catcher_ret:
popf
clc
mov sp, bp
pop es
pop ds
pop di
pop si
pop bp
pop bx
pop bx
pop dx
pop cx
pop ax
retf
Int23Catcher endp
; static int GetIndex(int SigType)
GetIndex proc
SigType = word ptr 2 + dPtrSize
push bp
mov bp, sp
push si
push di
xor dx, dx
@@GetIndex_loop:
mov bx, dx
mov al, IxGen[bx]
mov ah, 0
cmp ax, [bp+SigType]
jnz short @@GetIndex_check
mov ax, dx
jmp short @@GetIndex_ret
@@GetIndex_check:
inc dx
cmp dx, 6
jl short @@GetIndex_loop
mov ax, 0FFFFh
@@GetIndex_ret:
pop di
pop si
pop bp
ret
GetIndex endp
; CatcherPTR __cdecl signal(int sig, CatcherPTR *New)
signal proc
@@OldVar = dword ptr -6
@@Index = word ptr -2
@@sig = word ptr 6
@@New = dword ptr 8
push bp
mov bp, sp
sub sp, 6
push si
push di
cmp SignalPtrSet, 0
jnz short @@signal_index_check
mov word ptr __SignalPtr+2, seg signal
mov word ptr __SignalPtr, offset signal
mov SignalPtrSet, 1
@@signal_index_check:
push [bp+@@sig]
call GetIndex
pop cx
mov [bp+@@Index], ax
cmp ax, 0FFFFh
jnz short @@signal_install
mov _errno, 13h
mov dx, 0FFFFh
mov ax, 0FFFFh
jmp @@signal_ret
@@signal_install:
mov bx, [bp+@@Index]
mov cl, 2
shl bx, cl
mov dx, word ptr (Dispatch+2)[bx]
mov ax, word ptr Dispatch[bx]
mov word ptr [bp+@@OldVar+2], dx
mov word ptr [bp+@@OldVar], ax
mov bx, [bp+@@Index]
shl bx, cl
mov dx, word ptr [bp+@@New+2]
mov ax, word ptr [bp+@@New]
mov word ptr (Dispatch+2)[bx], dx
mov word ptr Dispatch[bx], ax
cmp [bp+@@sig], 2
jnz short @@signal_SIGFPE
cmp GotInt23, 0
jnz short @@signal_new_check
mov ax, 23h
push ax
nopcall _getvect
pop cx
mov word ptr OldInt23+2, dx
mov word ptr OldInt23, ax
mov GotInt23, 1
@@signal_new_check:
mov ax, word ptr [bp+@@New]
or ax, word ptr [bp+@@New+2]
jnz short @@signal_Int23Catcher
push word ptr OldInt23+2
push word ptr OldInt23
jmp short @@signal_int23
@@signal_Int23Catcher:
mov ax, seg Int23Catcher
push ax
mov ax, offset Int23Catcher
push ax
@@signal_int23:
mov ax, 23h
jmp short @@signal_last_vector
@@signal_SIGFPE:
cmp [bp+@@sig], 8
jnz short @@signal_ret_oldvar
mov ax, seg Int0Catcher
push ax
mov ax, offset Int0Catcher
push ax
xor ax, ax
push ax
nopcall _setvect
add sp, 6
mov ax, seg Int4Catcher
push ax
mov ax, offset Int4Catcher
push ax
mov ax, 4
@@signal_last_vector:
push ax
nopcall _setvect
add sp, 6
@@signal_ret_oldvar:
mov dx, word ptr [bp+@@OldVar+2]
mov ax, word ptr [bp+@@OldVar]
@@signal_ret:
pop di
pop si
mov sp, bp
pop bp
ret
signal endp
; int raise(int SigType)
raise proc
@@action = dword ptr -6
@@Index = word ptr -2
@@SigType = word ptr 6
push bp
mov bp, sp
sub sp, 6
push si
push di
push [bp+@@SigType]
call GetIndex
pop cx
mov [bp+@@Index], ax
cmp ax, 0FFFFh
jnz short @@raise_check_ignore
mov ax, 1
jmp short @@raise_ret
@@raise_check_ignore:
mov bx, [bp+@@Index]
mov cl, 2
shl bx, cl
mov dx, word ptr (Dispatch+2)[bx]
mov ax, word ptr Dispatch[bx]
mov word ptr [bp+@@action+2], dx
mov word ptr [bp+@@action], ax
or dx, dx
jnz short @@raise_check_type
cmp ax, 1
jz short @@raise_ret_0
@@raise_check_type:
mov ax, word ptr [bp+@@action]
or ax, word ptr [bp+@@action+2]
jnz short @@raise_user
mov ax, [bp+@@SigType]
cmp ax, 2
jz short @@raise_SIGINT
cmp ax, 16h
jnz short @@raise_default
nopcall __abort
@@raise_SIGINT:
xor ax, ax
int 23h
mov ax, 4C03h
int 21h
@@raise_default:
mov ax, 1
push ax
nopcall __exit
pop cx
jmp short @@raise_ret_0
@@raise_user:
mov bx, [bp+@@Index]
mov cl, 2
shl bx, cl
mov word ptr (Dispatch+2)[bx], 0
mov word ptr Dispatch[bx], 0
mov bx, [bp+@@Index]
mov al, ExplicitVal[bx]
mov ah, 0
push ax
push [bp+@@SigType]
call [bp+@@action]
pop cx
pop cx
@@raise_ret_0:
xor ax, ax
@@raise_ret:
pop di
pop si
mov sp, bp
pop bp
ret
raise endp