;*************************************************************;*         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.;=============================================================        SKIPALLOCA::       ;;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 UPLEGLEN: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