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