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

⟦51e0a506f⟧

    Length: 7648 (0x1de0)
    Notes: Mikados TextFile, Mikados_K
    Names: »RECEIV«

Derivation

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

Text

;*************************************************************
;*         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.
;=============================================================
       
       SKIP
RECEIV::
 
;
;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 PARAMETER
CONPTR:DS      2       ;ADDRESS OF CONTENTS PARAMETER
SNDPTR:DS      2       ;ADDRESS OF SENDER PARAMETER
LENGTH:DS      2       ;LENGTH OF MESSAGE
ALLEN: DS      2       ;LENGTH OF DATA AREA ALLOCATED FOR
                       ;       MESSAGE
       END