|
|
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: 9184 (0x23e0)
Notes: Mikados TextFile, Mikados_K
Names: »SENDM«
└─⟦38ff28550⟧ Bits:30004682 Pascal Standard Assembler til MIKADOS
└─⟦this⟧ »SENDM«
;*************************************************************
;* 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