|
@@ -24,7 +24,7 @@
|
|
|
|
|
|
|
|
|
function AllocVec(byteSize : Cardinal;
|
|
|
- requirements: Cardinal): Pointer;
|
|
|
+ requirements: Cardinal): Pointer; public name '_fpc_amiga_allocvec';
|
|
|
var
|
|
|
p: pointer;
|
|
|
begin
|
|
@@ -37,7 +37,7 @@ begin
|
|
|
AllocVec:=p;
|
|
|
end;
|
|
|
|
|
|
-procedure FreeVec(memoryBlock: Pointer);
|
|
|
+procedure FreeVec(memoryBlock: Pointer); public name '_fpc_amiga_freevec';
|
|
|
begin
|
|
|
if memoryBlock <> nil then
|
|
|
begin
|
|
@@ -75,12 +75,6 @@ begin
|
|
|
CreatePool:=p;
|
|
|
end;
|
|
|
|
|
|
-procedure DeletePool(poolHeader: Pointer);
|
|
|
-begin
|
|
|
-
|
|
|
-{$warning DeletePool unimplemented!}
|
|
|
-end;
|
|
|
-
|
|
|
function AllocPooled(poolHeader: Pointer;
|
|
|
memSize : Cardinal): Pointer;
|
|
|
var
|
|
@@ -121,9 +115,61 @@ begin
|
|
|
end;
|
|
|
end;
|
|
|
|
|
|
-procedure StackSwap(newStack: PStackSwapStruct);
|
|
|
+procedure DeletePool(poolHeader: Pointer);
|
|
|
+var
|
|
|
+ p: PAmigaLegacyPool absolute poolHeader;
|
|
|
+ pe: PAmigaLegacyPoolEntry;
|
|
|
begin
|
|
|
-{$warning StackSwap unimplemented!}
|
|
|
+ if p <> nil then
|
|
|
+ begin
|
|
|
+ while p^.pool_chain <> nil do
|
|
|
+ begin
|
|
|
+ pe:=p^.pool_chain;
|
|
|
+ FreePooled(poolHeader, pointer(pe) + sizeof(TAmigaLegacyPoolEntry), pe^.pe_size);
|
|
|
+ end;
|
|
|
+ execFreeMem(p,sizeof(TAmigaLegacyPool));
|
|
|
+ end;
|
|
|
+end;
|
|
|
+
|
|
|
+procedure StackSwap(newStack: PStackSwapStruct); assembler; nostackframe; public name '_fpc_amiga_stackswap';
|
|
|
+asm
|
|
|
+ move.l a6,-(sp)
|
|
|
+ move.l newStack,-(sp)
|
|
|
+
|
|
|
+ move.l AOS_ExecBase,a6
|
|
|
+ sub.l a1,a1
|
|
|
+ jsr -294(a6) // FindTask()
|
|
|
+ move.l d0,-(sp)
|
|
|
+
|
|
|
+ move.l AOS_ExecBase,a6
|
|
|
+ jsr -120(a6) // Disable()
|
|
|
+
|
|
|
+ move.l (sp)+,a1 // task
|
|
|
+ move.l (sp)+,a0 // newStack
|
|
|
+
|
|
|
+ move.l 58(a1),d0 // task^.tc_SPLower
|
|
|
+ move.l (a0),58(a1)
|
|
|
+ move.l d0,(a0)+
|
|
|
+
|
|
|
+ move.l 62(a1),d0 // task^.tc_SPUpper
|
|
|
+ move.l (a0),62(a1)
|
|
|
+ move.l d0,(a0)+
|
|
|
+
|
|
|
+ move.l (sp)+,a6
|
|
|
+ move.l (sp)+,d0 // return address
|
|
|
+
|
|
|
+ move.l (a0),d1
|
|
|
+ move.l sp,(a0)
|
|
|
+ move.l d1,sp
|
|
|
+
|
|
|
+ move.l d0,-(sp)
|
|
|
+ move.l a6,-(sp)
|
|
|
+
|
|
|
+ move.l AOS_ExecBase,a6
|
|
|
+ jsr -126(a6) // Enable()
|
|
|
+
|
|
|
+ move.l (sp)+,a6
|
|
|
+ rts
|
|
|
end;
|
|
|
|
|
|
procedure ObtainSemaphoreShared(sigSem: PSignalSemaphore);
|