;+ ; MOVE -- THIS ROUTINE PERFORMS A DATA TRANSFER BETWEEN THE WRITER'S ; BUFFER AND THE READER'S BUFFER. ; ; INPUTS: ; R1 READER'S I/O PACKET ADDRESS ; R3 WRITER'S I/O PACKET ADDRESS ; R4 WRITER'S UCB ADDRESS ; R5 READER'S UCB ADDRESS ; ; OUTPUTS: ; R5 CORRECT UCB FOR NEXT OPERATION ; BOTH I/O OPERATIONS ARE TERMINATED, UNLESS THE READER HAD AN ; ILLEGAL BUFFER CHECK (LESS THAN 3 BYTES REQUESTED) ; ;- MOVE: CMP U.CNT(R5),#3 ; READ REQUEST LONG ENOUGH? BGE 85$ ; YES MOV #IE.BAD&377,R0 ; SET BAD PARAMETERS CODE CALLR $IOALT ; FINISH I/O, NO BYTES TRANSFERRED 85$: MOV U.UNIT(R4),-(SP) ; PUT WRITER'S UNIT NUMBER ON STACK CALL $PTBYT ; PUT IT INTO READER'S BUFFER DEC U.CNT(R5) ; UPDATE READER'S BYTE COUNT MOV I.PRM+6(R3),-(SP) ; PUT CARRIAGE CONTROL BYTE ON STACK CALL $PTBYT ; PUT IT INTO READER'S BUFFER DEC U.CNT(R5) ; AND UPDATE THE COUNT 15$: MOV R4,R5 ; GET WRITER'S UCB ADDRESS IN R5 CALL $GTBYT ; GET A BYTE FROM THE WRITER'S BUFFER MOV I.UCB(R1),R5 ; GET READER'S UCB ADDRESS CALL $PTBYT ; AND PUT THE BYTE IN READER'S BUFFER DEC U.CNT(R4) ; UPDATE WRITER'S BYTE COUNT BNE 16$ ; IF NE THEN WE'RE NOT AT THE END DEC U.CNT(R5) ; AT THE END OF WRITER'S BUFFER; DON'T FORGET ; THAT WE PUT THE BYTE IN READER'S BUFFER BR 17$ ; FINISH BOTH I/O OPERATIONS 16$: DEC U.CNT(R5) ; UPDATE READER'S BYTE COUNT BNE 15$ ; IF NE WE CAN DO MORE 17$: MOV I.PRM+4(R1),R1 ; GET READER'S ORIGINAL BYTE COUNT ; (R1 IS READER'S I/O PACKET ADDRESS) MOV R3,-(SP) ; SAVE WRITER'S I/O PACKET ADDRESS MOV R4,-(SP) ; SAVE WRITER'S UCB ADDRESS ON STACK MOV #IS.CR,R0 ; FINAL STATUS IS AS TERMINATOR, ALL OK. CALL DONE ; FINISH I/O OPERATION MOV (SP)+,R5 ; RESTORE WRITER'S UCB ADDRESS TO R5 MOV (SP)+,R3 ; RESTORE WRITER'S I/O PACKET ADDRESS MOV I.PRM+4(R3),R1 ; GET WRITER'S ORIGINAL BYTE COUNT MOV #IS.SUC&377,R0 ; WRITE SUCCESSFUL ; FALL THROUGH TO FINISH I/O DONE: SUB U.CNT(R5),R1 ; SUBTRACT THOSE BYTES NOT TRANSFERRED CALLR $IODON ; FINISH THE OPERATION