|
|
DataMuseum.dkPresents historical artifacts from the history of: MIKADOS |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about MIKADOS Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 7648 (0x1de0)
Notes: Mikados TextFile, Mikados_K
Names: »RECEIV«
└─⟦38ff28550⟧ Bits:30004682 Pascal Standard Assembler til MIKADOS
└─⟦this⟧ »RECEIV«
;*************************************************************
;* 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