16Fermer18
FarewellLe 27/04/2013 à 13:53
Voici le diff unifié qui s'applique au sld.asm de PreOS 1.0.7 :
--- sld.asm.org	2013-04-26 19:09:04.882258000 +0200
+++ sld.asm	2013-04-27 14:04:37.533079000 +0200
@@ -1183,17 +1183,18 @@
 kernel::LibsExec:
 	movem.l	d0-d7/a0-a6,-(a7)			; 
 	GET_DATA_PTR					; Get Preos Data Ptr
-	moveq	#0,d7					; Set Error
+	lea	(4*16)(a7),a4
+	move.l	(a4),a2
+	move.b	(4*17+2)(a7),d3				; Minimum Library version
+	clr.l	(a4)+
 	pea	(12).w					; Create a list (Next, RealReturnAddr, LibPtr)
 	ROM_THROW HeapAllocPtr				; Alloc Node
 	move.l	a0,(a7)					; Ok ?
 	beq.s	\AllocError
 	move.l	a0,a3					; Ptr to node
 	move.l	(LibsExecList-Ref)(a6),(a3)+		; Save Next node in List 
-	move.l	(4*16)(a7),(a3)+			; Save Real Return Address
+	move.l	(a4)+,(a3)+
 	move.l	a3,(LibsExecList-Ref)(a6)		; Update list head
-	move.l	(4*17)(a7),a2				; Get Library name
-	move.b	(4*18+2)(a7),d3				; Minimum Library version
 	bsr	kernel::FindLib				; Find the library
 	move.l	a0,(a3)					; Save the lib & Check for success
 	beq.s	\FreeNode
@@ -1207,16 +1208,17 @@
 	bsr.s	kernel::LibsPtr				; Get the ptr to the required func
 	move.l	a0,d0
 	beq.s	\UnrelocLib
-	move.l	a0,(4*17)(a7)				; New return address
+	move.l	a0,(a4)+
 	lea	\next(pc),a0
-	move.l	a0,(4*18)(a7)				; After it return here
+	move.l	a0,(a4)
 	addq.l	#4,a7					; Pop Stack Frame
 	movem.l	(a7)+,d0-d7/a0-a6
 	addq.l	#4,a7					; Pop First Return Address
 	rts						; Jump to the function and return \next
 
 \next	subq.l	#8,a7					; Fix stack ptr.
-	movem.l	d0-d7/a0-a7,-(a7)			; Pop a7 to increase Stack Frame
+	st.b	(a7)
+	movem.l	d0-d7/a0-a7,-(a7)			; Push a7 to increase Stack Frame
 	GET_DATA_PTR					; Get a6 
 	subq.l	#4,a7					; Create Stack Frame
 \UnrelocLib:
@@ -1229,10 +1231,8 @@
 	move.l	-(a3),(LibsExecList-Ref)(a6)		; Set new head
 	move.l	a3,(a7)
 	ROM_THROW HeapFreePtr				; Free Node
-	moveq	#1,d7					; Set no error
 \AllocError
 	addq.l	#4,a7					; Fix stack
-	move.l	d7,(4*16)(a7)				; Set error
 \end:	movem.l	(a7)+,d0-d7/a0-a6
 	rts