Windows NT 4.0 source code leak
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

315 lines
6.8 KiB

;***
;lowhelpr.asm
;
; Copyright (c) 1993 - 1995, Microsoft Corporation. All rights reserved.
;
;Purpose:
;
;Revision History:
; 05-01-95 JWM _NLG_Notify renamed to __NLG_Notify.
;
;**********************************************************************
.ppc
.code
align 4
ofsFP equ 0
_GetR4 proc public
move r3, r4
ret
_GetR4 endp
_GetSP proc public
move r3, sp
ret
_GetSP endp
_GetRTOC proc public
move r3, r2
ret
_GetRTOC endp
;!!! IT SEEMS that every single routines below need to save, set and restore RTOC
; /////////////////////////////////////////////////////////////////////////////
; //
; // _CallSettingFrame - sets up r31 and calls the specified funclet. Restores
; // r31 on return.
; //
; // Return value is return value of funclet (whatever is in r3).
; //
; void * __cdecl _CallSettingFrame(
; void *funclet, // The funclet to call
; EHRegistrationNode *pRN // Registration node, represents location of frame
;)
; Use __cdecl calling convention
public __NLG_Return
__CallSettingFrame proc public
; parmD funclet reserve 24(sp)
; parmD pRN reserve 28(sp)
; reserve stack and save r31
stwu sp,-268(sp)
stw r31, 32(sp)
stmw r13, 36(sp) ;save r13-r31
stfd fp14, 112(sp) ;save fp14
stfd fp15, 120(sp) ;save fp15
stfd fp16, 128(sp) ;save fp16
stfd fp17, 136(sp) ;save fp17
stfd fp18, 144(sp) ;save fp18
stfd fp19, 152(sp) ;save fp19
stfd fp20, 160(sp) ;save fp20
stfd fp21, 168(sp) ;save fp21
stfd fp22, 176(sp) ;save fp22
stfd fp23, 184(sp) ;save fp23
stfd fp24, 192(sp) ;save fp24
stfd fp25, 200(sp) ;save fp25
stfd fp26, 208(sp) ;save fp26
stfd fp27, 216(sp) ;save fp27
stfd fp28, 224(sp) ;save fp28
stfd fp29, 232(sp) ;save fp29
stfd fp30, 240(sp) ;save fp30
stfd fp31, 248(sp) ;save fp31
mflr r5
stw r5, 276(sp) ;save lk in caller linkage
stw r2, 288(sp) ;save rtoc in caller linkage
move r31, r4 ;set the frame point
lwz r3, 0(r3) ;actual address in r3
bl __NLG_Notify
mtctr r3
lwz r4, 20(r4)
cmpli 0, 0, r4, 0
beq noset$
move r2, r4 ;load handler's rtoc
noset$:
bcctrl 20, 0
__NLG_Return::
lwz r2, 288(sp) ; restore rtoc
bl __NLG_Notify
; restore all non-volatile
lwz r31, 32(sp)
lmw r13, 36(sp)
lfd fp14, 112(sp) ;restore fp14
lfd fp15, 120(sp) ;restore fp15
lfd fp16, 128(sp) ;restore fp16
lfd fp17, 136(sp) ;restore fp17
lfd fp18, 144(sp) ;restore fp18
lfd fp19, 152(sp) ;restore fp19
lfd fp20, 160(sp) ;restore fp20
lfd fp21, 168(sp) ;restore fp21
lfd fp22, 176(sp) ;restore fp22
lfd fp23, 184(sp) ;restore fp23
lfd fp24, 192(sp) ;restore fp24
lfd fp25, 200(sp) ;restore fp25
lfd fp26, 208(sp) ;restore fp26
lfd fp27, 216(sp) ;restore fp27
lfd fp28, 224(sp) ;restore fp28
lfd fp29, 232(sp) ;restore fp29
lfd fp30, 240(sp) ;restore fp30
lfd fp31, 248(sp) ;restore fp31
lwz r5, 276(sp)
mtlr r5
;restore stack
addic sp,sp,268
ret
__CallSettingFrame endp
public __NLG_Dispatch
__NLG_Notify proc public
lwz r5, __NLG_Destination(r2)
stw r3, 4(r5)
__NLG_Dispatch::
ret
__NLG_Notify endp
;/////////////////////////////////////////////////////////////////////////////
;//
;// _JumpToContinuation - sets up r1 and jumps to specified code address.
;//
;// Does not return.
;//
__JumpToContinuation proc public
; parmD target ; r3
; parmD pRN ; r4
; parmD SP ; r5
; restore target r31
move r31, r4
lwz r6, 20(r4)
cmpli 0, 0, r6, 0
beq noset2$
move r2, r6 ;load target's rtoc
noset2$:
; set r1 to target
cmpl 0, 0, r5, r4
beq spsame$
move r4, r5
spsame$:
move r1, r4
; jump to continuation address ???
mtctr r3
bcctr 20, 0
__JumpToContinuation endp
if 0
;/////////////////////////////////////////////////////////////////////////////
;//
;// _CallMemberFunction0 - call a parameterless member function, Wings only support
;// stdcall calling convention, with 0 parameters.
;//
; the destructor call will be __stdcall in Wings compiler
; rebuild the stack by push this and then call destructor
; return to caller of this function
;
; enter the call:
;
; rtn
; pthis
; pmfn
;
; before jmp, (a0) = pmfn
;
; pthis
; rtn
; pthis
; pmfn
;??? do we need to switch TOC for member function calls???
__CallMemberFunction0 proc public
; parmD pthis r3
; parmD pmfn r4
; parmD rtoc r5
stwu sp, -36(sp) ; allocate 24 + 3*4 bytes(36) for linkage area
mflr r6
stw r6, 44(sp) ;stw in caller linkage area
stw r2, 56(sp) ;caller linkage
lwz r4,0(r4) ;get actual function address
;lwz r5,20(r5) ;rtoc
cmpli 0, 0, r5, 0
beq nortoc$
move r2, r5
nortoc$:
mtctr r4
bcctrl 20, 0
lwz r2, 56(sp)
lwz r6, 44(sp)
mtlr r6
addic sp, sp, 36
ret
__CallMemberFunction0 endp
;/////////////////////////////////////////////////////////////////////////////
;//
;// _CallMemberFunction1 - call a member function using stdcall
;// calling convention, with 1 parameter, see comments for previous function
;//
__CallMemberFunction1 proc public
; parmD pthis r3
; parmD pmfn r4
; parmD pthat r5
; parmD sp r6
stwu sp, -40(sp) ; allocate 24+4*4 bytes for linkage area
mflr r7
stw r7, 48(sp) ;stw in caller linkage area
stw r2, 60(sp)
lwz r4,0(r4) ;get actual function address
mtctr r4
move r4, r5
;lwz r6, 20(r6) ;rtoc
cmpli 0, 0, r6, 0
beq nortoc1$
move r2, r6
nortoc1$:
bcctrl 20, 0
lwz r2, 60(sp)
lwz r6, 48(sp)
mtlr r6
addic sp, sp, 40
ret
__CallMemberFunction1 endp
;/////////////////////////////////////////////////////////////////////////////
;//
;// _CallMemberFunction2 - call a member function using stdcall
;// calling convention, with 1 parameter, see comments for previous function
;//
__CallMemberFunction2 proc public
; parmD pthis r3
; parmD pmfn r4
; parmD pthat r5
; parmd fvb r6
; parmD sp r7
stwu sp, -44(sp) ; allocate 24 + 4*5 bytes for linkage area
mflr r8
stw r8, 52(sp) ;stw in caller linkage area
stw r2, 64(sp) ;rotc
lwz r4,0(r4) ;get actual function address
mtctr r4
move r4, r5
move r5, r6
;lwz r7, 20(r7) ;rtoc
cmpli 0, 0, r7, 0
beq nortoc2$
move r2, r7
nortoc2$:
bcctrl 20, 0
lwz r2, 64(sp)
lwz r6, 52(sp)
mtlr r6
addic sp, sp, 44
ret
__CallMemberFunction2 endp
endif
.data
public __NLG_Destination
__NLG_Destination dd 19930520h,00000000h,00000000h
end