DataMuseum.dk

Presents historical artifacts from the history of:

Bogika Butler

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about Bogika Butler

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download

⟦2af9a12fe⟧ TextFile

    Length: 4096 (0x1000)
    Types: TextFile
    Names: »RLS.SA«

Derivation

└─⟦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« 

TextFile

         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»