|
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 - 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