;*************************************************************;*         PASCAL STANDARD ASSEMBLER PACKAGE.                *;*                                                           *;* (C) 1980 DANSK DATA ELEKTRONIK APS.                       *;*************************************************************;;*************************************************************;* PROCEDURE NAME:      SENDM                                *;*************************************************************;; CT 07-MAY-1980;;=============================================================; DESCRIPTION:; THIS PROCEDURE SENDS A MESSAGE TO THE MAIN SEMAPHORE OF; ANOTHER PROCESS.; PLEASE REFER TO THE PASCAL STANDARD ASSEMBLER PACKAGE MANUAL; SECTION 4.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  -> CONTENTS  I;                              I---------------I;                              I -> RECVR. PCB 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 WILL CONTAIN THE ADDRESS OF ; THE PCB OF THE SENDING PROCESS (NOTE: BYTES 0-1 DO NOT; CONTAIN THE ADDRESS A SEMAPHORE).; BYTE 3 OF THE MESSAGE BUFFER WILL CONTAIN 'LENGTH'.; IF LENGTH <= 10 BYTES 4-13 OF THE MESSAGE BUFFER WILL;                 CONTAIN THE MESSAGE.; IF LENGTH > 10  A DATA AREA IS ALLOCATED IN WHICH THE;                 MESSAGE WILL BE STORED.;                 BYTES 4-5 OF THE MESSAGE BUFFER WILL;                 CONTAIN THE ADDRESS OF THE MESSAGE.;                 BYTES 6-7 OF THE MESSAGE BUFFER WILL;                 CONTAIN THE ACTUAL NUMBER OF BYTES;                 ALLOCATED.;=============================================================              SKIP       SYMB SENDM:: ;;GET PARAMETERS;       POP     B       ;BC=RETURN ADDRESS       POP     H       ;HL->STATUS       SHLD    STAPTR       POP     H       ;HL=LENGTH       SHLD    LENGTH       POP     H       ;HL->CONTENTS       SHLD    CONPTR       POP     H       ;HL->RECEIVER PCB       SHLD    RECPTR       PUSH    B       ;RESTORE RETURN ADDRESS ;;IS LENGTH LEGAL (I.E. LENGTH <= 255)?;       LDA     LENGTH+1 ;THE CONTENTS OF LENGTH+1 IS NOT ZERO                        ;   IF LENGTH>255       ANA     A        ;LENGTH OK?       JNZ     LENLON   ;NO, GO FINISH UP ;;TEST IF THERE ARE ANY MESSAGES AVAILABLE ON THE POOL;SEMAPHORE;       LXI     H,POOL+1 ;HL->LENGTH FIELD OF SEMAPHORE       MOV     A,M      ;A:=NUMBER OF AVAILABLE MESSAGES       CPI     3        ;LESS THAN 3?       JC      NOMES    ;YES. WE DARE NOT GET A MESSAGE ;;GET MESSAGE BUFFER FROM POOL SEMAPHORE;       LXI     B,POOL       CALL    F]BUF ;;SAVE ADDRESS OF MESSAGE BUFFER, AND STORE THE ADDRESS OF THE;PCB IN BYTES 0-1 OF THE MESSAGE BUFFER AND THE;LENGTH IN BYTE 3 OF THE BUFFER;       PUSH    H       ;SAVE ADDRESS OF MESSAGE BUFFER       LHLD    RUNN    ;HL->PCB OF SENDING PROCESS       MOV     A,L     ;STORE       STAX    D       ;  ADDRESS       INX     D       ;    OF       MOV     A,H     ;      PCB       STAX    D       INX     D       INX     D       ;DE->LENGTH FIELD (BYTE 3)       LDA     LENGTH       STAX    D       ;STORE LENGTH IN LENGTH FIELD       INX     D       ;DE->BYTE 4. IF LENGTH > 10 THIS BYTE                       ; (TOGETHER WITH BYTE 5) WILL CONTAIN                       ; A BUFFER POINTER. IF LENGTH <= 10                       ; THIS BYTE WILL BE THE FIRST BYTE                       ; CONTAINING THE MESSAGE       PUSH    D       ;SAVE THE ADDRESS OF BYTE 4 ;;DECIDE IF LENGTH <= 10 OR LENGTH > 10;       CPI     #11     ;LENGTH<11?       JC      SHORT   ;YES, THERE IS NO NEED TO ALLOCATE ;;ALLOCATE A DATA AREA FOR THE MESSAGE;       LHLD    LENGTH  ;HL:=LENGTH       CALL    ALLOC   ;ALLOCATE       SHLD    LENGTH  ;STORE THE LENGTH ACTUALLY ALLOCATED       XCHG            ;HL->DATA AREA (HL=0 IF                       ;               ALLOCATION FAILED)       CALL    TESTH   ;ALLOCATION FAILED?       JZ      NOAL    ;YES, GO FINISH UP       XCHG            ;DE->ALLOCATED DATA AREA       POP     H       ;HL->BYTES 4-5 OF MESSAGE BUFFER (THESE                       ;  BYTES ARE TO CONTAIN THE ADDRESS OF                       ;  THE MESSAGE)       PUSH    D       ;SAVE THE ADDRESS OF THE MESSAGE       MOV     M,E     ;STORE THE       INX     H       ;  ADDRESS OF THE MESSAGE       MOV     M,D     ;    IN BYTES 4-5 OF THE MESSAGE BUFFER       INX     H       ;HL->BYTES 6-7 OF MESSAGE BUFFER (THESE                       ;  BYTES ARE TO CONTAIN THE LENGTH OF                       ;  THE ACTUALLY ALLOCATED DATA AREA)       XCHG            ;DE:=       LHLD    LENGTH  ;  THE LENGTH OF       XCHG            ;    THE ALLOCATED DATA AREA       MOV     M,E     ;STORE THE       INX     H       ;  LENGTH OF THE DATA AREA       MOV     M,D     ;    IN BYTES 6-7 OF THE MESSAGE BUFFER ;;EVERYTHING IS NOW READY FOR THE TRANSFER OF THE CONTENTS;PARAMETER TO THE MESSAGE.;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.;IN EITHER CASE THE TOPMOST ELEMENT ON THE STACK CONTAINS THE;      ADDRESS OF THE LOCATION WHERE THE MESSAGE SHOULD BE;      STORED.;SHORT: LHLD    CONPTR  ;HL->CONTENTS       POP     D       ;DE->LOCATION WHERE CONTENTS SHOULD BE                       ;                               STORED       XCHG            ;DE->SOURCE, HL->DESTINATION FOR MOVE       LDA     LENGTH  ;A:=LENGTH OF MESSAGE (PLUS POSSIBLY A                       ;  FEW EXTRA BYTES ALLOCATED, BUT THIS                       ;  IS IRRELEVANT)       MOV     B,A     ;B:=LENGTH OF MESSAGE       CALL    MOVE    ;MOVE THE MESSAGE ;;SEND THE MESSAGE BUFFER;       LHLD    RECPTR  ;HL->PCB OF RECEIVING PROCESS       LXI     B,KOSEM       DAD     B       ;HL->ADDRESS OF MAIN SEMAPHORE OF                       ;    RECEIVING PROCESS       MOV     C,M     ;BC->MAIN SEMAPHORE       INX     H       ;      OF THE       MOV     B,M     ;          RECEIVING PROCESS       POP     H       ;HL->MESSAGE BUFFER       CALL    SEND    ;SEND IT! ;;STATUS:=0 TO INDICATE SUCCESS;       LHLD    STAPTR  ;HL->STATUS       XRA     A       ;A:=0       MOV     M,A     ;STATUS       INX     H       ;       :=       MOV     M,A     ;           0       RET        SKIP;;COME HERE IF LENGTH IS ILLEGAL. STATUS:=2;LENLON:LHLD    STAPTR  ;HL->STATUS       MVI     M,2     ;STATUS       INX     H       ;       :=       MVI     M,0     ;           2       RET ;;COME HERE IF ALLOCATION FAILED. STATUS:=1;NOAL:  LHLD    STAPTR  ;HL->STATUS       MVI     M,1     ;STATUS       INX     H       ;       :=       MVI     M,0     ;           1 ;;RETURN MESSAGE BUFFER TO POOL SEMAPHORE;       POP     H       ;SKIP ADDRESS OF BYTE 4 OF MESS. BUFFER       POP     H       ;HL->MESSAGE BUFFER       LXI     B,POOL  ;BL->POOL SEMAPHORE       CALL    SEND    ;SEND IT BACK       RET ;;COME HERE IF THERE WERE NO MESSAGES AVAILABLE. STATUS=3;NOMES: LHLD    STAPTR  ;HL->STATUS       MVI     M,3     ;STATUS       INX     H       ;       :=       MVI     M,0     ;           3       RET              SKIP;***** LOCAL DATA ***** STAPTR:DS      2       ;ADDRESS OF STATUSLENGTH:DS      2       ;LENGTH OF MESSAGECONPTR:DS      2       ;ADDRESS OF CONTENTSRECPTR:DS      2       ;ADDRESS OF PCB OF RECEIVING PROCESS        END