;*************************************************************;*         PASCAL STANDARD ASSEMBLER PACKAGE.                *;*                                                           *;* (C) 1980 DANSK DATA ELEKTRONIK APS.                       *;*************************************************************;;*************************************************************;* PROCEDURE NAME:      RECEIV                               *;*************************************************************;; CT 07-MAY-1980;;=============================================================; DESCRIPTION:; THIS PROCEDURE RECEIVES A MESSAGE FROM THE MAIN SEMAPHORE OF; THE CALLING ANOTHER PROCESS.; PLEASE REFER TO THE PASCAL STANDARD ASSEMBLER PACKAGE MANUAL; SECTION 4.2 FOR DETAILS.;;-------------------------------------------------------------; STACK CONTENTS ON ENTRY:     I               I;                              I---------------I;                              I  RETURN ADR.  I;                              I---------------I;                              I  -> LENGTH    I;                              I---------------I;                              I  -> CONTENTS  I;                              I---------------I;                              I  -> SENDER    I;                              I---------------I;                              I               I;-------------------------------------------------------------; STACK CONTENTS ON EXIT:      EMPTY;-------------------------------------------------------------; THE MESSAGE IS EXCHANGED IN A MESSAGE BUFFER.; BYTES 0-1 OF THE MESSAGE BUFFER CONTAIN THE ADDRESS OF; THE PCB OF THE SENDING PROCESS.; BYTE 3 OF THE MESSAGE BUFFER CONTAINS THE LENGTH OF THE; MESSAGE.; IF LENGTH <= 10 BYTES 4-13 OF THE MESSAGE BUFFER;                 CONTAINS THE MESSAGE.; IF LENGTH > 10  BYTES 4-5 OF THE MESSAGE BUFFER POINT;                 TO A DATA AREA THAT CONTAINS THE MES-;                 SAGE. THE LENGTH OF THE DATA AREA IS;                 STORED IN BYTES 6-7 OF THE MESSAGE;                 BUFFER.;=============================================================              SKIPRECEIV:: ;;GET THE PARAMETERS;       POP     B       ;BC:=RETURN ADDRESS       POP     H       ;HL->LENGTH       SHLD    LENPTR       POP     H       ;HL->CONTENTS       SHLD    CONPTR       POP     H       ;HL->SENDER       SHLD    SNDPTR       PUSH    B       ;RESTORE RETURN ADDRESS ;;RECEIVE THE MESSAGE BUFFER FROM THE MAIN SEMAPHORE;       CALL    VENTS ;;SAVE THE ADDRESS OF THE MESSAGE BUFFER;       PUSH    H ;;GET ADDRESS OF PCB OF SENDING PROCESS FROM BYTES 0-1 OF;MESSAGE BUFFER;       LHLD    SNDPTR  ;HL->SENDER PARAMETER       LDAX    D       ;SENDER PARAMETER       MOV     M,A     ;       ->       INX     H       ;          PCB OF       INX     D       ;               THE       LDAX    D       ;                    SENDING       MOV     M,A     ;                       PROCESS ;;GET LENGTH OF MESSAGE FROM BYTE 3 OF MESSAGE BUFFER;       INX     D       INX     D       ;DE->LENGTH FIELD       LHLD    LENPTR  ;HL->LENGTH PARAMETER       LDAX    D       ;LENGTH PARAMETER       MOV     M,A     ;       :=       INX     H       ;          LENGTH       MVI     M,0     ;               OF MESSAGE       STA     LENGTH  ;SAVE THE LENGTH FOR LATER USE ;;PREPARE TO GET THE MESSAGE;       INX     D       ;DE->BYTE 4 OF MESSAGE. IF LENGTH > 10                       ;  THIS BYTE (TOGETHER WITH BYTE 5)                       ;  CONTAINS THE ADDRESS OF THE MESSAGE.                       ;  IF LENGTH <= 10 THIS BYTE IS THE                       ;  FIRST BYTE OF THE MESSAGE.       PUSH    D       ;SAVE THE ADDRESS OF BYTE 4 ;;DECIDE IF LENGTH <= 10 OR LENGTH > 10;       CPI     #11     ;LENGTH<11?       JC      SHORT   ;YES, THE MESSAGE IS IN THE MES. BUFFER ;;GET ADDRESS OF MESSAGE;       XCHG            ;HL->ADDRESS OF MESSAGE       MOV     E,M     ;DE       INX     H       ;  ->       MOV     D,M     ;    MESSAGE       POP     H       ;HL->BYTE 4 OF MESSAGE BUFFER       PUSH    D       ; AND REPLACE IT BY THE ADDRESS OF THE                       ; MESSAGE ;;GET THE LENGTH OF THE DATA AREA ALLOCATED FOR THE MESSAGE;       INX     H       INX     H       ;HL->LENGTH OF DATA AREA       MOV     A,M     ;ALLLEN       STA     ALLEN   ;      :=       INX     H       ;        LENGTH OF       MOV     A,M     ;           ALLOCATED       STA     ALLEN+1 ;             DATA AREA ;;EVERYTHING IS NOW READ FOR THE TRANSFER OF THE MESSAGE TO THE;CONTENTS PARAMETER.;IF THE MESSAGE LENGTH <= 10 THE TOPMOST ELEMENT ON THE STACK;      CONTAINS THE ADDRESS OF BYTE 4 OF THE MESSAGE BUFFER.;IF THE MESSAGE LENGTH > 10 THE TOPMOST ELEMENT ON THE STACK;      CONTAINS THE ADDRESS OF THE ALLOCATED DATA AREA CON-;      TAINING THE MESSAGE.;IN EITHER CASE THE TOPMOST ELEMENT ON THE STACK CONTAINS THE;      ADDRESS OF THE LOCATION WHERE THE MESSAGE IS STORED.;SHORT: LHLD    CONPTR  ;HL->CONTENTS       POP     D       ;DE->LOCATION OF MESSAGE       PUSH    D       ;PUT ADDRESS OF MESSAGE BACK ON STACK       LDA     LENGTH  ;A:=LENGTH OF MESSAGE       MOV     B,A     ;B:=LENGTH OF MESSAGE       CALL    MOVE    ;MOVE MESSAGE TO CONTENTS PARAMETER ;;SHOULD AN AREA BE DEALLOCATED? THEN DO IT!;       POP     D       ;DE->LOCATION OF MESSAGE. IF THE                       ; MESSAGE LENGTH > 10 THIS AREA SHOULD                       ; BE DEALLOCATED.       LDA     LENGTH  ;A:=MESSAGE LENGTH       CPI     11      ;LENGTH<11?       JC      SHORT1  ;YES, WE SHOULD NOT DEALLOCATE       LHLD    ALLEN   ;HL:=LENGTH OF THE ARE TO BE DALLOCATED       CALL    DELOC   ;DEALLOCATE ;;SEND THE MESSAGE BUFFER BACK TO THE POOL SEMAPHORE;SHORT1:POP     H       ;HL->MESSAGE BUFFER       LXI     B,POOL       CALL    SEND    ;SEND IT BACK        RET              SKIP;***** LOCAL DATA ***** LENPTR:DS      2       ;ADDRESS OF LENGTH PARAMETERCONPTR:DS      2       ;ADDRESS OF CONTENTS PARAMETERSNDPTR:DS      2       ;ADDRESS OF SENDER PARAMETERLENGTH:DS      2       ;LENGTH OF MESSAGEALLEN: DS      2       ;LENGTH OF DATA AREA ALLOCATED FOR                       ;       MESSAGE       END