.TITLE GEBUDA .ENABL LC ; ; CALL GEBUDA(TA,IS,DI,KS,NC,CS,UP,WI,IX,IY,ST,IGOTO) -- This ; returns the next complete text description. The receiving ; and unpacking of the sent data is handled within as is the ; connecting to the sender tasks. ; .PSECT GEBUDA .MCALL ASTX$S, CLEF$C, CNCT$S, DSAR$S, ENAR$S, EXIT$S .MCALL RCVD$C, SETF$C, SRDA$C, WTSE$C F0=%0 ;DEFINE FLOATING POINT REGISTER ; GEBUDA::TST RDAST ;RECEIVE DATA AST INITIALIZED? BNE A ;BRANCH IF NOT ; MOV #-1,RDAST ;SET RDAST TO .TRUE. CLR CONNCT ;CLEAR TASK COUNTER CLR UNDONE ;ALL DATA SETS COMPLETED (EMPTY) MOV #1,TASK ;SET UP TASK POINTER MOV #NEXT,TODO ;BOTTOM OUT FIFO BUFFER POINTER SRDA$C GETDAT,GEBUDA ;SPECIFY RECEIVE DATA AST SETF$C 43.,GEBUDA ;SET GROUP FLAG TO SIGNIFY ALL SET TO GO ; A: CMP #NEXT,TODO ;ANYTHING TO DO? BNE B ;BRANCH IF TRUE WTSE$C 2,GEBUDA ;STOP UNTIL SOMETHING COMES ; B: DSAR$S ;TEMPORARILY DISABLE AST RECOGNITION MOV #NEXT,R0 ;GET FIFO BUFFER POINTER ADDRESS 1$: MOVB 1(R0),(R0)+ ;PUSH DOWN BUFFER POINTERS CMP R0,TODO ;LAST ONE PUSHED? BNE 1$ ;BRANCH IF NOT MOVB NEXT,R1 ;GET BUFFER NUMBER DEC TODO ;REDUCE LIST CLEF$C 2,GEBUDA ;CLEAR EVENT FLAG ENAR$S ;RE-ENABLE AST REGOGNITION ; MOV R1,@30(R5) ;RETURN BUFFER NUMBER INC @30(R5) ;CONVERT BUFFER NUMBER INTO LUN (IGOTO) MUL #242,R1 ;CALCULATE PROPER BUFFER ADD #IBUF,R1 ;REFERENCE BUFFER AREA STF F0,-(SP) ;SAVE F0 STFPS -(SP) ;SAVE FPS SETF ;SET FLOATING POINT ; LDF (R1)+,F0 ;LOAD TABUF STF F0,@2(R5) ;RETURN TABUF MOV (R1)+,@4(R5) ;RETURN ISBUF MOV (R1)+,@6(R5) ;RETURN DIBUF MOV (R1)+,@10(R5) ;RETURN KSBUF MOV (R1)+,@12(R5) ;RETURN NCBUF LDF (R1)+,F0 ;LOAD CSBUF STF F0,@14(R5) ;RETURN CSBUF LDF (R1)+,F0 ;LOAD UPBUF STF F0,@16(R5) ;RETURN UPBUF LDF (R1)+,F0 ;LOAD WIBUF STF F0,@20(R5) ;RETURN WIBUF MOV (R1)+,@22(R5) ;RETURN IXBUF MOV (R1)+,@24(R5) ;RETURN IYBUF ; MOV @12(R5),R0 ;GET NUMBER OF CHARACTERS MOV 26(R5),R3 ;GET ADDRESS OF ST 2$: MOVB (R1)+,(R3)+ ;MOVE CHARACTER SOB R0,2$ ;BRANCH UNTIL DONE ; LDFPS (SP)+ ;RESTORE FPS LDF (SP)+,F0 ;RESTORE F0 RTS PC ;RETURN ; RDAST: .WORD 0 ;RECEIVE DATA AST INITIALIZATION FLAG NEXT: .BLKB 6 ;NUMBER OF PLOTTING TERMINALS .EVEN TODO: .WORD 0 ;ADDRESS OF TOP OF FIFO BUFFER POINTERS UNDONE: .WORD 0 ;NUMBER OF DATA SETS INCOMPLETE ; GETDAT: JSR PC,GETPUT ;JUMP TO SUBROUTINE WHICH UNPACKS DATA ASTX$S ;RETURN FROM AST ; GETPUT: MOV R0,-(SP) ;SAVE R0 MOV R1,-(SP) ;SAVE R1 MOV R2,-(SP) ;SAVE R2 MOV R3,-(SP) ;SAVE R3 ; C: RCVD$C ,IDAT,GEBUDA ;ANY DATA QUEUED? TST $DSW ;WELL.. BGT 25$ ;BRANCH IF DATA THERE TST UNDONE ;ANY INCOMPLETE DATA SETS? BNE C ;BRANCH IF SO BR G ;BRANCH IF NOT ; 25$: MOVB IS,R1 ;GET TERMINAL NUMBER ADD #BUFNUM,R1 ;REFERENCE BUFFER TABLE MOVB (R1),R1 ;GET BUFFER NUMBER ; MOV #1,R0 ;SET CONNECT POINTER ASH R1,R0 ;SHIFT TO PROPER LOCATION BIT CONNCT,R0 ;CONNECTED? BNE D ;BRANCH IF TRUE ; BIS R0,CONNCT ;SET CONNECTION MOV R1,R2 ;GET BUFFER NUMBER ASL R2 ;MULTIPLY BY TWO ADD #CONAST,R2 ;REFERENCE CONNECT AST TABLE CNCT$S #TA,,(R2) ;CONNECT TO SENDER TASK ; CLR READM ;CLEAR READ IN FLAGS CLR READO ;SO THAT CHARACTER SET M, O0 AND W CLR READW ;ARE RE-INITIALIZED ; D: MOV R1,R0 ;COPY BUFFER NUMBER MUL #242,R1 ;CALCULATE PROPER BUFFER ADD #IBUF,R1 ;REFERENCE BUFFER AREA MOV #IDAT,R2 ;REFERENCE DATA AREA ; CMPB #1,DI ;CONTINUATION BLOCK? BNE 3$ ;BRANCH IF NOT MOV #ST,R2 ;SET ADDRESS OF STRING BR E ;BRANCH TO TRANSFER ; 3$: INC UNDONE ;MARK INCOMPLETE DATA SET STF F0,-(SP) ;SAVE F0 STFPS -(SP) ;SAVE FPS SETF ;SET FLOATING POINT ; LDF (R2)+,F0 ;GET TA STF F0,(R1) ;STORE TA MOVB (R2)+,4(R1) ;STORE IS CLR 6(R1) ;CLEAR DI MOVB (R2)+,6(R1) ;STORE DI BGE 5$ ;BRANCH IF NOT NEGATIVE SXT 6(R1) ;EXTEND SIGN ON DI 5$: MOVB (R2)+,10(R1) ;STORE KS TSTB (R2)+ ;NC = 0? BEQ 4$ ;BRANCH IF TRUE MOVB -1(R2),12(R1) ;STORE NC 4$: LDF (R2)+,F0 ;LOAD CS STF F0,14(R1) ;STORE CS LDF (R2)+,F0 ;LOAD UP STF F0,20(R1) ;STORE UP LDF (R2)+,F0 ;LOAD WI STF F0,24(R1) ;STORE WI MOV (R2)+,30(R1) ;STORE IX MOV (R2)+,32(R1) ;STORE IY ; LDFPS (SP)+ ;RESTORE FPS LDF (SP)+,F0 ;RESTORE F0 ; TSTB NC ;TEXT ALREADY DEFINED? BEQ F ;BRANCH IF TRUE ; CLR 240(R1) ;ZERO NUMBER OF CHARACTERS PRESENT ; E: MOV R1,R3 ;COPY BLOCK ADDRESS ADD #34,R3 ;MOVE TO START OF STRING ADD 240(R1),R3 ;ADD IN LENGTH OF STRING ALREADY HERE ; 6$: MOVB (R2)+,(R3)+ ;TRANSFER CHARACTER INC 240(R1) ;INCREMENT COUNT CMP 240(R1),12(R1) ;ALL CHARACTERS HERE? BEQ F ;BRANCH IF TRUE CMP R2,#DATEND ;END OF DATA AREA? BNE 6$ ;BRANCH IF NOT JMP C ;JUMP TO GET MORE ; F: DEC UNDONE ;MARK DATA SET COMPLETE INC TODO ;MOVE UP TOP OF FIFO BUFFER POINTERS MOVB R0,@TODO ;INSERT COMPLETED BUFFER POINTER SETF$C 2,GEBUDA ;SET FLAG ; G: MOV (SP)+,R3 ;RESTORE R3 MOV (SP)+,R2 ;RESTORE R2 MOV (SP)+,R1 ;RESTORE R1 MOV (SP)+,R0 ;RESTORE R0 RTS PC ;RETURN ; ;BUFNUM: .BYTE -1,0,1,2,3,-1,5,-1 ;TT0: - TT7: ; .BYTE -1,-1,6,4 ;TT10: - TT13: ; .BYTE -1,7,10 ;TT14: - TT16: .EVEN ; ; CONNCT: .WORD 0 ;TASK CONNECTING FLAGS CONAST: .WORD CON0,CON1,CON2 ;ADDRESSES OF CONNECT AST'S .WORD CON3,CON4,CON5 .WORD CON6,CON7,CON10 ; CON10: ASL TASK CON7: ASL TASK CON6: ASL TASK CON5: ASL TASK ;INCREMENT TASK COUNTER CON4: ASL TASK CON3: ASL TASK CON2: ASL TASK CON1: ASL TASK CON0: BIC TASK,CONNCT ;CLEAR TASK OUT BNE H ;BRANCH IF NOT ZERO CLEF$C 43.,GEBUDA ;CLEAR GROUP EVENT FLAG EXIT$S ;EXIT H: MOV #1,TASK ;SET UP FOR NEXT CALL TST (SP)+ ;CLEAR STACK OF EXTRA WORD ASTX$S ;RETURN FROM AST ; TASK: .WORD 1 ;TASK POINTER ; IDAT: ;DEFINE OFFSETS AND ALLOCATE DATA AREA TA: .RAD50 / / ;SENDER TASK NAME IS: .BYTE 0 ;PLOTTER TERMINAL NUMBER DI: .BYTE 0 ;DIMENSIONING FLAG, LOGICAL KS:ST: .BYTE 0 ;CHARACTER SET NUMBER; STRING NC: .BYTE 0 ;NUMBER OF CHARACTERS CS: .FLT2 0. ;CHARACTER SIZE UP: .FLT2 0. ;CHARACTER ANGLE WI: .FLT2 0. ;WIDTH ADJUSTMENT IX: .WORD 0 ;X SCREEN COORDINATE IY: .WORD 0 ;Y SCREEN COORDINATE .BLKW 3 ;STRING STORAGE DATEND: .WORD 0 ;END OF DATA AREA ; IBUF: .REPT 11 ;NUMBER OF PLOTTING TERMINALS .RAD50 / / ;TA .WORD 0 ;IS .WORD 0 ;DI .WORD 0 ;KS .WORD 0 ;NC .FLT2 0. ;CS .FLT2 0. ;UP .FLT2 0. ;WI .WORD 0 ;IX .WORD 0 ;IY .BLKB 132. ;ST .WORD 0 ;IC - NUMBER OF CHARACTERS ALREADY RECEIVED .ENDR .PSECT FLAGS RW, D, GBL, REL, OVR READM: .WORD 0 ;READ IN FLAG FOR SET M READO: .WORD 0 READW: .WORD 0 .PSECT BUFNUM,RW,D,GBL,OVR,REL BUFNUM: .END