.TITLE UTILITY ROUTINES ; ;IB0.MAC ; ; COPYRIGHT (C) 1976 ; ; DIGITAL EQUIPMENT CORPORATION ; MAYNARD, MASSACHUSETTS 01754 ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ; ON A SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH ; THE INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, ; OR ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE MADE ; AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH SYSTEM AND TO ; ONE WHO AGREES TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE ; SOFTWARE SHALL AT ALL TIMES REMAIN IN DIGITAL. ; ; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO ; CHANGE WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED ; AS A COMMITMENT BY DIGITAL EQUIPMENT CORPORATION. ; ; DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE ; OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT ; WHICH IS NOT SUPPLIED BY DIGITAL. ; ;AUTHOR: SRA ; JULY 1976 ; ;************************************************************ ; ASSEMBLE WITH IBP.MAC $$CSECT=0 ;************************************************************ ; ;ROUTINES FOR SENDING COMMANDS AND BUFFER HANDLING ; .SBTTL .CMD ROUTINE ; .GLOBL .CMD,.TST .GLOBL IB.STA,.IBERR,IB.TMP,IB.DR .GLOBL .IBCMD ; NXTSEC .IBCMD: IBARG. 1,2 ;1 OR 2 ARGS TST R0 ;2 ARGS? BNE 1$ ;YES ;SINGLE ARGUMENT MOVB @(R5)+,R0 ;GET IT BR .CMD ;FINISH UP AND EXIT ;MANY BYTES 1$: MOV @(R5)+,R2 ;BYTE COUNT BGT 2$ ;>0 IBERR. HARD,RNG.F ;OUT OF RANGE 2$: MOVB (R1)+,R0 ;GET IT CALL .CMD ;SEND IT DEC R2 ;DONE? BNE 2$ ;NOPE RETURN ;YES ; .CMD: PUSH (PC)+ ;.CMD ENTRY .TST: CLR -(SP) ;.TST ENTRY IBOK.. ;.IBINIT BEEN CALLED? 1$: BIT #^C,IB.STA ;OTHER THAN SRQ? BEQ 1$ ;NO ;SEE IF ALL BAD THINGS GO AWAY BIC #^C<.ER2!.ER1!.ER0>,IB.STA ;EXCEPT FATAL BEQ 2$ ;YES! ;GOT A REALLY FATAL ERROR HERE MOVB IB.STA,3$ ;GET IT JSR R0,.IBERR ;REPORT IT .BYTE HARD 3$: .BYTE 0 ;REASON 2$: TST (SP)+ ;.TST ENTRY? BEQ 4$ ;NO MOVB #DONE.F,IB.TMP+1 ;SET IT (IGNORES SRQ IN HERE) MOVB R0,@IB.DR ;SEND BYTE FINALLY 4$: RETURN ; .PAGE .SBTTL .IBARG ROUTINE ; .GLOBL .IBARG ; ;CALLED VIA: ; JSR R1,.IBARG ; .WORD MIN. # OF ARGS ; .WORD MAX.-MIN. # OF ARGS (OR 0) ; ;RETURNS WITH R0= ACTUAL # OF ARGS. - MIN. # OF ARGS ; .IBARG: MOV (R5)+,R0 ;GET ACTUAL ARG COUNT: N SUB (R1)+,R0 ;N-MIN CMP (R1)+,R0 ;(MAX-MIN) - (N-MIN) BLO 1$ ;0 <= (N-MIN) <= (MAX-MIN) RTS R1 1$: IBERR. HARD,ARG.F ;ARGUMENT ERROR ; .PAGE .SBTTL BUFFER MANAGEMENT ; ;************************************************************ ; ;BUFFER ROUTINES ; CALLED WITH R4 POINTING TO IB.LTN OR IB.TLK ; USES R0,R4,R5. DATA IN/OUT OF R0 ; USED AT BOTH INTERRUPT AND NON-INTERRUPT LEVELS ; ; .IBPUT AND .IBGET DO A SKIP RETURN IN NO ROOM/BYTE AVAILABLE ; JSR PC,ROUTINE ; BR GOOD RETURN ; HERE ON BAD RETURN ; ;LAYOUT OF BUFFER HEADER ; ; SIZE OF BUFFER ; R4--> CURRENT CHARACTER COUNT ; PUT POINTER ; GET POINTER ; END OF BUFFER+1 (FOR WRAP TEST) ; START OF BUFFER ; ;MAIN ROUTINES THAT WAIT/OR RETURN VALUE ; ;.IN,.OUT ARE CALLED VIA: ; MOV #ARG,R5 ; JSR PC,ROUTINE ; ; WHERE ARG: .BYTE 1 OR 2,? ; .WORD ADR OF BYTE TO GET FROM OR PUT INTO ; [.WORD ADR TO RETURN TRUTH VALUE IN] ; ;RETURNS WITH R0=-1 IF SUCCESS, R0=0 IF NO LUCK AND IB.BFR=0 ; IF IB.BFR#0, THE ROUTINE WAITS FOR A CHARACTER. ;IF THE SECOND ARG IS SPECIFIED, R0 IS DUMPED THERE TOO. ; .GLOBL .IN,.OUT,IB.BFR,IB.TLK,IB.LTN ; NXTSEC .IN: MOV (PC)+,R2 ;SIGNAL ENTRY NXTSEC .OUT: CLR R2 ;OUT ENTRY IBARG. 1,2 ;1 OR 2 ARGS PUSH R0 ;SAVE INDICATOR OF 2ND ARG MOVB #-1,R0 ;ASSUME TRUE TST R2 ;.IN? BEQ 3$ ;NO: .OUT CLR R0 ;FOR JUNK RESULT IF FALSE 1$: MOV #IB.LTN,R4 CALL .IBGET BR 2$ ;GOT ONE TST IB.BFR ;NOPE: WAIT BNE 1$ ;YES CLRB R1 ;ANSWER FALSE 2$: MOVB R0,@(R5)+ ;STORE VALUE (OR 0) BR 5$ ;FINISH UP ; 3$: MOVB @(R5)+,R0 ;GET BYTE 4$: MOV #IB.TLK,R4 ;ADDRESS BUFFER CALL .IBPUT ;SET IT IN BR 5$ ;SUCCESS TST IB.BFR ;NOPE: WAIT FOR ROOM? BNE 4$ ;YES CLRB R1 ;FALSE 5$: MOVB R1,R0 TST (SP)+ ;2 ARGS? BEQ 6$ ;NO MOV R0,@(R5)+ ;YES: RETURN VALUE 6$: RETURN ; ; .GLOBL .IBPUT,.IBGET,.IBCLR ; .IBPUT: CMP -2(R4),(R4)+ ;ROOM IN BUFFER? BLE SKIPIT ;NO PUSH R5 ;YES: SAVE R5 FIRST MOV (R4)+,R5 ;YES: GET PUT PTR TST (R4)+ ;SKIP BY GET PTR MOVB R0,(R5)+ ;SET IT IN CMP (R4)+,R5 ;TIME TO WRAP PTR? BHI 1$ ;NO MOV @R4,R5 ;YES, COPY START ADR 1$: MOV R5,-6(R4) ;SET IT INC -10(R4) ;BUMP COUNT BR RESTR5 ;RESTORE R5; RETURN ; SKIPIT: ADD #2,@SP ;FOR RETURN RETURN ; .IBGET: TST (R4)+ ;ANY CHARS? BEQ SKIPIT ;NO PUSH R5 ;SAVE R5 TST (R4)+ ;GO BY PUT PTR MOV (R4)+,R5 ;GET GET PTR MOVB (R5)+,R0 ;GET BYTE CMP (R4)+,R5 ;END? BHI 1$ ;NOT YET MOV @R4,R5 ;YES: GET START ADR 1$: MOV R5,-4(R4) ;SET IT IN DEC -10(R4) ;DROP COUNT RESTR5: POP R5 ;RESTORE R5 RETURN ; ;ROUTINES TO CLEAR BUFFERS ;CALLED WITH R5 POINTING TO ZERO WORD ; .GLOBL .ZLB,.ZTB ; NXTSEC .ZLB: PUSH (PC)+ NXTSEC .ZTB: CLR -(SP) IBARG. 0 ;NO ARGS MOV #IB.LTN,R4 ;ASSUME LTN BUFFER TST (SP)+ ;WELL BNE 1$ ;GOOD GUESS MOV #IB.TLK,R4 1$: ;FALL THROUGH TO .IBCLR ; .IBCLR: CLR (R4)+ ;ZERO IT MOV (R4)+,@R4 ;MOVE POINTERS TOGETHER CMP -(R4),-(R4) ;RESTORE R4 RETURN ; .END