|
|
DataMuseum.dkPresents historical artifacts from the history of: Bogika Butler |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Bogika Butler Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 4096 (0x1000)
Types: TextFile
Names: »RLS.SA«
└─⟦909f4eb2b⟧ Bits:30009789/_.ft.Ibm2.50006622.imd Mogens Pelles Zilog 80,000 / EOS projekt
└─⟦this⟧ »RLS.SA«
└─⟦ddcd65152⟧ Bits:30009789/_.ft.Ibm2.50006617.imd Mogens Pelles Zilog 80,000 / EOS projekt
└─⟦this⟧ »RLS.SA«
NOLIST
INCLUDE RR.RTEQU.SA
INCLUDE RR.MACROS.SA
LIST
*
* FILE RR.RTEQU.SA HAS BEEN INCLUDED
* FILE RR.MACROS.SA HAS BEEN INCLUDED
*
TTL V 0.01 68K EOS PASCAL RELEASE (HEAP DEALLOCATION) SUBROUTINE
RLS IDNT 0,01 68K EOS PASCAL RELEASE (HEAP DEALLOCATION) SUBROUTINE
SECTION 8 ! RUNTIME ROUTINES GO IN SECTION 8
*
*********
*
* RLS, RELEASE SOME PART OF THE TOP OF THE HEAP
*
* ENTRY:
* A0 = PTR TO WHERE THE HEAP IS TO BE RELEASED TO
*
* EXIT:
* NONE.
*
* USES:
* 0 1 2 3 4 5 6 7
* A: * * X X X X X A
* D: * X X X X X X *
*
*
* UPDATED FOR EOS PASCAL USE
*
* FUNCTION:
* RLS RELEASES FROM THE HEAP THE PART OF THE HEAP IN HIGHER
* MEMORY ADDRESS FROM THE POINTER IT IS PASSED. IF THIS POINTER
* POINTS INTO THE MIDDLE OF A FREE ELEMENT THEN THAT FREE ELEMENT
* IS ALSO RELEASED. IF THE POINTER IS BETWEEN THE TOP OF THE HEAP
* AND THE STACK IT IS IGNORED.
*
* EXTERNALS:
* .PRLS = DEF, ENTRY POINT FOR THE RELEASE RUNTIME ROUTINE
* .PCHKOBJ = REF, ROUTINE TO CHECK FOR OBJECT CALL
*
* .PCHKOVF = REF, ROUTINE TO CHECK FOR STACK / HHEAP OVERFLOW
*
*********
*
XDEF .PRLS ! ENTRY POINT FOR THE RELEASE RUNTIME ROUTINE
*
XREF .PCHKOBJ ! ROUTINE TO CHECK FOR OBJECT CALL
*
XREF .PCHKOVF ! THE ROUTINE TO CHECK FOR STACK HEAP OVERFLOW
*
.PRLS: EQU * ! THIS IS THE ENTRY POINT FOR RLS (RELEASE)
*
MOVE.L (A7),D7 ! D7 = RETURN ADDRESS IN CASE OF ERROR
*
* CHECK FOR OBJECT CALL
*
BSR .PCHKOBJ ! ERROR IF OBJECT CALL
*
* CHECK FOR STACK HEAP OVERFLOW
*
BSR .PCHKOVF ! ERROR IF STACK/HEAP OVERFLOW HASS OCCURED
*
* ADJUST POINTER TO PLACE TO RELEASE TO
*
SUBQ.L #4,A0 ! A0 = PTR TO OF HEAP WHEN ITS MARK WAS DONE
*
* CHECK IF HEAP IS ALREADY BELOW THE POINT BEING RELEASED TO
*
MOVE.L 4(A5),A1 ! A1 = PTR TO TOP OF HEAP
SUBQ.L #8,A1 ! POINT TO TOP OF HEAP RECORD
CMP.L A0,A1 ! IS HEAP BELOW RELEASE POINT ?
BLS.S RLS2 ! YES, THEN IGNORE THE RELEASE CALL
*
* PUT IN A CHECK HERE TO MAKE SURE THE POINTER IS IN THE HEAP
*
*
* FIND THE FIRST ELEMENT IN THE FREE LIST THAT WILL BE IN THE NEW HEAP
*
RLSL1: MOVE.L 4(A1),A1 ! A1 = PTR TO NEXT FREE ELEMENT
CMP.L A0,A1 ! WILL THIS ELEMENT BE IN THE HEAP AFTER THE RLS ?
BHI.S RLSL1 ! NO, THEN TRY THE NEXT ELEMENT
*
* IS THE FIRST FREE ELEMENT IN THE LIST ADJACENT TO THE NEW TOP
* OF THE HEAP ?
*
MOVE.L A1,D0 ! D0 = PTR TO FIRST ELEMENT OF THE NEW FREE LIST
BEQ.S RLS1 ! IF FREE LIST = NIL THEN GO BUILD NEW TOP OF HEAP
ADD.L (A1),D0 ! D0 = PTR TO THE END OF THE FIRST ELEMENT
CMP.L D0,A0 ! IS THE FIRST ELEMENT ADJACENT TO THE TOP ?
BHI.S RLS1 ! NO, THEN GO BUILD A NEW TOP OF HEAP RECORD
*
* THE FIRST FREE ELEMENT IN THE LIST IS ADJACENT TO THE TOP SO CUT
* BACK THE HEAP EVEN FURTHER
*
MOVE.L A1,A0 ! A0 = NEW PTR TO THE ADJUSTED TOP OF HEAP
MOVE.L 4(A1),A1 ! A1 = PTR TO THE NEW FIRST ELEMENT IN FREE LIST
*
* BUILD A NEW TOP OF HEAP RECORD
*
RLS1: MOVEQ.L #-1,D0 ! D0 = -1 (TOP OF HEAP RECORD LENGTH)
MOVE.L D0,(A0)+ ! SAVE TOP OF HEAP RECORD LENGTH INDICATOR
MOVE.L A1,(A0)+ ! SAVE FREE LIST POINTER
*
* SAVE NEW TOP OF HEAP POINTER
*
MOVE.L A0,4(A5) ! SAVE THE NEW TOP OF THE HEAP POINTER
*
* RETURN TO THE PASCAL PROGRAM
*
RLS2: RTS ! RETURN TO THE PASCAL PROGRAM
END
«eof»