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

⟦4fa22049e⟧ TextFile

    Length: 7168 (0x1c00)
    Types: TextFile
    Names: »DIS.SA«

Derivation

└─⟦909f4eb2b⟧ Bits:30009789/_.ft.Ibm2.50006622.imd Mogens Pelles Zilog 80,000 / EOS projekt
    └─⟦this⟧ »DIS.SA« 
└─⟦ddcd65152⟧ Bits:30009789/_.ft.Ibm2.50006617.imd Mogens Pelles Zilog 80,000 / EOS projekt
    └─⟦this⟧ »DIS.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 DISPOSE (HEAP DEALLOCATION) SUBROUTINE
DIS      IDNT    0,01   68K EOS PASCAL DISPOSE (HEAP DEALLOCATION) SUBROUTINE
         SECTION 8
*
*********
*
*        DIS, DIPOSE OF A SEGMENT AND INSERT INTO THE FREE LIST
*
*        ENTRY:
*                A0 = POINTER TO THE VARIABLE THAT CONTAINS A POINTER TO
*                     THE SEGMENT TO BE DISPOSED OF
*
*                THE WORD AFTER THE SUBROUTINE CALL = THE LENGTH OF THE
*                SEGMENT BEING DISPOSED.
*
*        EXIT:
*                NONE.
*
*        USES:
*                   0 1 2 3 4 5 6 7
*                A: * * * X X X X A
*                D: * * X X * X X *
*
*
*        UPDATED FOR EOS PASCAL USE
*
*
*        FUNCTION:
*           
*           DIS MAKES A COPY OF THE POINTER TO THE SEGMENT TO FREE UP, AND
*        SETS THE USERS POINTER BACK TO NIL.  IT THEN CHECKS TO MAKE SURE
*        THAT THE POINTER IS POINTING TO A VALID PLACE IN THE HEAP.  IF THE
*        POINTER ISN'T VALID THEN A RUNTIME ERROR IS GENERATED.  THE FREE
*        LIST IS THEN SEARCHED FOR THE PROPER PLACE TO INSERT THE NEW
*        ELEMENT.  AFTER IT HAS BEEN INSERTED A CHECK IS MADE TO SEE IF
*        IT CAN BE MERGED WITH THE FREE LIST ELEMENT AT A LOWER MEMORY
*        ADDRESS, AND IF IT CAN BE MERGED IT IS.  THEN A CHECK IS MADE TO SEE
*        IF THE POSSIBLY MERGED NEW ELEMENT CAN BE MERGED WITH THE ONE AT
*        A HIGHER MEMORY ADDRESS.  IF IT IS POSSIBLE THEN THEY ARE MERGED.
*        IF THE SEGMENT BEING DISPOSED IS AT BTHE TOP OF THE HEAP THEN THE
*        HEAP IS CUT BACK.
*
*        EXTERNALS:
*                .PDIS = DEF, ENTRY POINT FOR THE DISPOSE RUNTIME ROUTINE
*                .PDISL = DEF, ENTRY POINT FOR THE LONG DISPSE ROUTINE
*
*                .PCHKOVF = REF, ROUTINE TO CHECK FOR STACK HEAP OVERFLOW
*                .PCHKOBJ = REF, ROUTINE TO CHECK FOR OBJECT CALL
*
*********
*
         XDEF    .PDIS       ! ENTRY POINT FOR THE DISPOSE RUNTIME ROUTINE
         XDEF    .PDISL
 
           XREF    .PCHKOBJ     ! CHECK FOR OBJECT CALL
         XREF    .PCHKOVF    ! CHECK FOR STACK HEAP OVERFLOW ROUTINE
*
.PDISL   EQU     *           ! ENTRY POINT FOR LARGE DISPOSE ROUTINE
*
         ADDQ.L  #2,(A7)     ! ADJUST RETURN ADDRESS TO POINT PAST LEN LWORD
*
.PDIS:   EQU     *           ! ENTRY POINT FOR DISPOSE ROUTINE
*
         ADDQ.L  #2,(A7)     ! ADJUST RETURN ADDRESS TO POINT PAST LEN WORD
         MOVE.L  (A7),D7     ! D7 = RETURN ADDRESS IN CASE OF ERROR
 
           BSR     .PCHKOBJ    ! ERROR IF OBJECT CALL
 
*
*        CHECK FOR STACK/HEAP OVERFLOW
*
         BSR     .PCHKOVF    ! ERROR IF THE STACK HAS BUMPED INTO THE HEAP
*
*        COPY AND CLEAR POINTER TO SEGMENT TO DISPOSE
*
         MOVE.L  (A0),A2     ! A2 = POINTER TO SEGMENT TO DISPOSE
         CLR.L   (A0)        ! USERS POINTER NOW EQUALS NIL
*
*        CHECK IF SEGMENT IS BELOW TOP OF HEAP, AND IGNORE DISPOSE CALL IF NOT
*
         MOVE.L  4(A5),A0    ! A0 = POINTER TO TOP OF HEAP
         SUBQ.L  #8,A0       ! A0 = POINTER TO THE TOP OF HEAP RECORD
         CMP.L   A0,A2       ! IS POINTER POINTING INTO THE HEAP ?
         BHI.S   DIS4        ! NO, THEN IGNORE THE DISPOSE CALL
*
*        PUT IN CODE HERE TO MAKE SURE THAT THE POINTER IS ABOVE THE BOTTOM
*        OF THE HEAP
*
*        PREPARE TO FIND THE PLACE IN THE FREE LIST THAT THIS NEW SEGMENT
*        SHOULD BE INSERTED INTO.
*
         CLR.L   D0          ! D0 = PTR TO FREE LIST ELEMENT 2 AFTER CURRENT
         SUB.L   A1,A1       ! A1 = PTR TO FREE LIST ELEMENT 1 AFTER CURRENT
         MOVE.L  -(A2),D4    ! D4 = LEN OF SEGMENT, A2 = PTR TO SEG TO DISPOSE
*
*        SEARCH THE FREE LIST TO FIND THE PLACE WHERE THE NEW ELEMENT SHOULD
*        BE INSERTED
*
DISL1:   CMP.L   A0,A2       ! IS THIS WHERE THE NEW ELEMENT BELONGS ?
         BHI.S   DIS1        ! YES, THEN GO INSERT IT HERE
*
*        THIS WASN'T WHERE THE NEW ELEMENT BELONGS
*
         MOVE.L  A1,D0       ! D0 = NEW 2 AFTER CURRENT POINTER
         MOVE.L  A0,A1       ! A1 = NEW 1 AFTER CURRENT POINTER
         MOVE.L  4(A0),A0    ! A0 = NEW CURRENT POINTER
         BRA.S   DISL1       ! LOOP, UNTIL RIGHT PLACE TO INSERT IS FOUND
*
*        THE PLACE WAS FOUND TO INSERT THE NEW ELEMENT INTO THE FREE LIST
*
DIS1:    MOVE.L  A0,4(A2)    ! LINK NEW ELEMENT TO NEXT FREE ELEMENT
         MOVE.L  A2,4(A1)    ! LINK PREVIOUS FREE ELEMENT TO THE NEW ONE
*
*        CHECK IF THE NEW FREE ELEMENT CAN BE MERGED WITH THE ONE BEFORE IT
*
         MOVE.L  A0,D1       ! D1 = PTR TO ELEMENT BEFORE ONE BEING INSERTED
         BEQ.S   DIS2        ! IF NIL THEN THERE IS NO ELEMENT TO MERGE WITH
         ADD.L   (A0),D1     ! D1 = PTR TO END OF ELEMENT BEFORE NEW ONE
         CMP.L   D1,A2       ! CAN THE TWO ELEMENTS BE MERGED ?
         BHI.S   DIS2        ! NO, THEN CHECK IF THE 1 AFTER CAN BE MERGED
*
*        MERGE THE NEW ELEMENT WITH THE ONE BEFORE IT (IN LOWER MEMORY)
*
         SUB.L   A0,A2       ! A2 = LENGTH OF OLD SEGMENT
         ADD.L   A2,D4       ! D4 = LENGTH OF THE TWO MERGED TOGETHER
         MOVE.L  D4,(A0)     ! SAVE THE NEW LENGTH
         MOVE.L  A0,A2       ! A2 = PTR TO THE NEW MERGED ELEMENT
         MOVE.L  A2,4(A1)    ! FIX UP THE LINK TO THE MERGED ELEMENT
*
*        CHECK IF NEW ELEMENT CAN BE MERGED WITH THE ONE AFTER IT
*
DIS2:    MOVE.L  A2,D1       ! D1 = PTR TO THE NEW ELEMENT
         ADD.L   D4,D1       ! D1 = PTR TO THE END OF THE NEW ELEMENT
         CMP.L   D1,A1       ! CAN THE TWO ELEMENTS BE MERGED ?
         BHI.S   DIS4        ! NO, THEN CLEAN UP AND RETURN
*
*        CHECK IF ELEMENTS SHOULD BE MERGED OR IF THE HEAP SHOULD BE CUT
*        BACK.
*
         TST.L   D0          ! SHOULD THE HEAP BE CUT BACK (YES IF D0 = 0)
         BNE.S   DIS3        ! NO, GO MERGE THE TWO ELEMENTS
*
*        CUT BACK THE HEAP
*
         MOVE.L  (A1),(A2)   ! MOVE THE TOP OF HEAP RECORD BACK
         ADDQ.L  #8,A2       ! ADJUST POINTER TO POINT ABOVE TOP OF HEAP RECORD
         MOVE.L  A2,4(A5)    ! SAVE NEW TOP OF HEAP PTR IN THE R.M.A.
         BRA.S   DIS4        ! GO CLEAN UP AND RETURN TO THE PASCAL PROGRAM
*
*        MERGE THE NEW SEGMENT WITH THE ONE AFTER IT.
*
DIS3:    MOVE.L  A1,D1       ! D1 = PTR TO FREE ELEMENT AFTER NEW ONE
         SUB.L   A2,D1       ! D1 = LENGTH OF NEW ELEMENT
         ADD.L   (A1),D1     ! D1 = LENGTH OF MERGED ELEMENT
         MOVE.L  D1,(A2)     ! SAVE THE LENGTH OF THE MERGED ELEMENT
         MOVE.L  D0,A0       ! A0 = PTR TO THE ELEMENT TWO BEFORE THE NEW ONE
         MOVE.L  A2,4(A0)    ! LINK THE NEW MERGED ELEMENT INTO THE FREE LIST
*
*        CLEAN UP AND RETURN TO THE PASCAL PROGRAM
*
DIS4:    RTS                 ! RETURN TO THE PASCAL PROGRAM
         END
 
«eof»