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