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

⟦80102c5e3⟧

    Length: 9184 (0x23e0)
    Notes: Mikados TextFile, Mikados_K
    Names: »SENDM«

Derivation

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

Text

;*************************************************************
;*         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 STATUS
LENGTH:DS      2       ;LENGTH OF MESSAGE
CONPTR:DS      2       ;ADDRESS OF CONTENTS
RECPTR:DS      2       ;ADDRESS OF PCB OF RECEIVING PROCESS
 
       END