DataMuseum.dk

Presents historical artifacts from the history of:

MIKADOS

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

See our Wiki for more about MIKADOS

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download

⟦496f9dc28⟧

    Length: 5600 (0x15e0)
    Notes: Mikados TextFile, Mikados_K
    Names: »ALLOCA«

Derivation

└─⟦38ff28550⟧ Bits:30004682 Pascal Standard Assembler til MIKADOS
    └─ ⟦this⟧ »ALLOCA« 

Text

;*************************************************************
;*         PASCAL STANDARD ASSEMBLER PACKAGE.                *
;*                                                           *
;* (C) 1980 DANSK DATA ELEKTRONIK APS.                       *
;*************************************************************
;
;*************************************************************
;* PROCEDURE NAME:      ALLOCA                               *
;*************************************************************
;
; CT 05-MAY-1980
;
;=============================================================
; DESCRIPTION:
; THIS PROCEDURE IS USED TO ALLOCATE A MEMORY AREA.
; PLEASE REFER TO THE PASCAL STANDARD ASSEMBLER PACKAGE MANUAL
; SECTION 6.1 FOR DETAILS.
;
;-------------------------------------------------------------
; STACK CONTENTS ON ENTRY:     I               I
;                              I---------------I
;                              I RETURN ADR.   I
;                              I---------------I
;                              I  -> STATUS    I
;                              I---------------I
;                              I    LENGTH     I
;                              I---------------I
;                              I  -> ADDRESS   I
;                              I---------------I
;                              I               I
;-------------------------------------------------------------
; STACK CONTENTS ON EXIT:      EMPTY
;-------------------------------------------------------------
; THIS PROCEDURE ACTUALLY ALLOCATES THREE BYTES MORE THAN THE
; USER REQUESTED. THE TWO FIRST BYTES OF THE ALLOCATED AREA
; ARE THEN USED TO HOLD THE LENGTH OF THE AREA AND ARE USED
; WHEN DEALLO IS CALLED; THE THIRD BYTE CONTAINS THE CODE EE
; (HEX) AND IS A FLAG THAT INDICATES THAT THIS PARTICULAR AREA
; IS IN USE.
; THE ADDRESS RETURNED TO THE USER IS THE ADDRESS OF THE BYTE
; FOLLOWING THE THREE EXTRA BYTES.
;=============================================================
 
       SKIP
ALLOCA::
       
;
;GET THE REQUESTED LENGTH OF THE MEMORY AREA
;
       POP     B       ;BC=RETURN ADDRESS
       POP     D       ;DE->STATUS
       POP     H       ;HL=REQUESTED LENGTH
       PUSH    B
       PUSH    D
                       ;THE STACK NOW LOOKS LIKE THIS:
                       ;               I               I
                       ;               I---------------I
                       ;               I  -> STATUS    I
                       ;               I---------------I
                       ;               I  RET. ADR.    I
                       ;               I---------------I
                       ;               I  -> ADDRESS   I
                       ;               I---------------I
                       ;               I               I
       INX     H
       INX     H
       INX     H       ;WE SHOULD ALLOCATE THREE EXTRA BYTES
 
;
;IF THE LENGTH IS LESS THAN 4, 4 BYTES ARE ALLOCATED
;
       MOV     A,H     ;A:=MSB OF LENGTH
       ANA     A       ;A=0?
       JNZ     LENGOK  ;NO (I.E. LENGTH >= 256)
       MOV     A,L     ;YES, A:=LSB OF LENGTH
       CPI     4       ;A<4?
       JNC     LENGOK  ;NO
       MVI     L,4     ;YES, LENGTH:=4
 
;
;ALLOCATE!
;
LENGOK:CALL    ALLOC
                       ;DE=0 OR DE=-1 IN CASE OF ERROR
                       ;OTHERWISE: DE->ALLOCATED AREA
                       ;           HL=LENGTH OF ALLOCATED AREA
 
;
;TEST DE
;
       PUSH    D       ;SAVE ADDR. OF ALLOCATED AREA
       INX     D       ;DE=1 OR DE=0 IN CASE OF ERROR
       MOV     A,D     ;A:=MSB OF DE
       ANA     A       ;A=0?
       JNZ     OK      ;NO, ALLOCATION IS OK
       MOV     A,E     ;A:=LSB OF DE
       ANA     A       ;A=0? I.E. ILLEGAL LENGTH?
       JNZ     LEGLEN  ;NO
       MVI     A,2     ;YES, A:=ERROR CODE FOR ILLEGAL LENGTH
       JMP     EXI     ;GO CLEAN UP
LEGLEN:CPI     1       ;A=1? I.E. NO AREA AVAILABLE?
       JNZ     OK      ;NO, ALLOCATION IS OK
                       ;YES, A=1 (WHICH IS THE ERROR CODE FOR
                       ;               NO AREA AVAILABLE)
       JMP     EXI     ;GO CLEAN UP
 
;
;ALLOCATION WAS OK
;
OK:    XRA     A       ;A:=0 (I.E. NO ERROR CODE)
 
;
;CLEAN UP. MOST OF THIS CODE IS IRRELEVANT IF THE ALLOCATION
;WAS A FAILURE
;
EXI:   POP     D       ;DE->ALLOCATED AREA
       XCHG            ;HL->ALLOCATED AREA; DE=LENGTH OF AREA
       MOV     M,E     ;STORE LENGTH
       INX     H       ;  OF ALLOCATED AREA
       MOV     M,D     ;     IN FIRST TWO BYTES
       INX     H
       MVI     M,0EE   ;SET FLAG BYTE
       INX     H       ;AND POINT TO NEXT BYTE
       XCHG            ;DE->THE AREA THE USER GETS
 
;
;REG. A CONTAINS THE STATUS VALUE. STORE IT.
;
       POP     H       ;HL->STATUS
       MOV     M,A     ;STORE STATUS VALUE
       INX     H
       MVI     M,0     ;STORE 0 IN MSB. OF STATUS VALUE
 
;
;SET POINTER TO ALLOCATED AREA
;
       POP     H       ;HL=RETURN ADDRESS
       XTHL            ;HL->ADDRESS
       MOV     M,E     ;STORE
       INX     H       ;  ADDRESS OF
       MOV     M,D     ;    ALLOCATED AREA
 
       RET
 
       END