mirror of https://github.com/lianthony/NT4.0
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.
101 lines
2.7 KiB
101 lines
2.7 KiB
;; olecall.s
|
|
;;
|
|
;; Assembly for fixing the stack and calling the C++ member function
|
|
;; in asmppc format
|
|
|
|
;; _AfxDispatchCall(AFX_PMSG /*pfn*/, void* /*pArgs*/, UINT /*nSizeArgs*/)
|
|
|
|
export __AfxDispatchCall
|
|
|
|
;; r3 -> function descriptor
|
|
;; r4 -> argument list
|
|
;; r5 = number of argument bytes
|
|
;; (r4+r5 -> float argument shadow buffer)
|
|
|
|
__AfxDispatchCall:
|
|
|
|
lwz r0,0(sp) ;; load back link
|
|
|
|
;; load fp regs
|
|
|
|
add r5,r5,r4 ;; make r5 point to float argument shadow list
|
|
lfd f1,0(r5) ;; load float argument 1
|
|
lfd f2,8(r5) ;; load float argument 2
|
|
lfd f3,16(r5) ;; load float argument 3
|
|
lfd f4,24(r5) ;; load float argument 4
|
|
lfd f5,32(r5) ;; load float argument 5
|
|
lfd f6,40(r5) ;; load float argument 6
|
|
lfd f7,48(r5) ;; load float argument 7
|
|
lfd f8,56(r5) ;; load float argument 8
|
|
lfd f9,64(r5) ;; load float argument 9
|
|
lfd f10,72(r5) ;; load float argument 10
|
|
lfd f11,80(r5) ;; load float argument 11
|
|
lfd f12,88(r5) ;; load float argument 12
|
|
lfd f13,96(r5) ;; load float argument 13
|
|
|
|
;; save away data into scratch area
|
|
|
|
stw r2,0(r5) ;; TOC reg
|
|
stw r31,4(r5) ;; r31 save
|
|
mflr r31 ;; move return address to r31
|
|
stw r31,8(r5) ;; lr save
|
|
stw sp,12(r5) ;; sp save
|
|
|
|
;; save current linkage
|
|
lwz r6,0(sp)
|
|
stw r6,16(r5)
|
|
lwz r6,4(sp)
|
|
stw r6,20(r5)
|
|
lwz r6,8(sp)
|
|
stw r6,24(r5)
|
|
lwz r6,12(sp)
|
|
stw r6,28(r5)
|
|
lwz r6,16(sp)
|
|
stw r6,32(r5)
|
|
lwz r6,20(sp)
|
|
stw r6,36(r5)
|
|
|
|
addi r31,r5,0 ;; move r5 into r31 -- nonvolatile
|
|
addi sp,r4,-24 ;; set new sp
|
|
|
|
lwz r12,0(r3) ;; load entry point address
|
|
lwz r2,4(r3) ;; load TOC address
|
|
mtctr r12 ;; move function entry point address to CTR register
|
|
|
|
lwz r10,52(sp) ;; load argument word 8
|
|
lwz r9,48(sp) ;; load argument word 7
|
|
lwz r8,44(sp) ;; load argument word 6
|
|
lwz r7,40(sp) ;; load argument word 5
|
|
lwz r6,36(sp) ;; load argument word 4
|
|
lwz r5,32(sp) ;; load argument word 3
|
|
lwz r4,28(sp) ;; load argument word 2
|
|
lwz r3,24(sp) ;; load argument word 1
|
|
stw r0,0(sp) ;; store back link
|
|
|
|
bcctrl 20,0 ;; destination function entry point
|
|
|
|
addi r5,r31,0 ;; restore scratch area ptr
|
|
lwz r2,0(r5) ;; restore TOC
|
|
lwz r31,8(r5) ;; r31
|
|
mtlr r31 ;; restore lr
|
|
lwz r31,4(r5) ;; actual r31
|
|
lwz sp,12(r5) ;; actual sp
|
|
|
|
;; restore current linkage
|
|
lwz r6,16(r5)
|
|
stw r6,0(sp)
|
|
lwz r6,20(r5)
|
|
stw r6,4(sp)
|
|
lwz r6,24(r5)
|
|
stw r6,8(sp)
|
|
lwz r6,28(r5)
|
|
stw r6,12(sp)
|
|
lwz r6,32(r5)
|
|
stw r6,16(sp)
|
|
lwz r6,36(r5)
|
|
stw r6,20(sp)
|
|
|
|
bclr 20,0 ;; return
|
|
|
|
end
|
|
|