.TITLE POUTCS .MCALL MRKT$C,MRKT$S,QIOW$C,QIOW$S,QIO$C,QIO$S,ASTX$S .MCALL GTIM$S CL.BSZ=4 CL.OFF=6 CL.MSK=8. CL.SIZ=10. CL.BEG=12. CSPAGE: .WORD 0 ; PAGE NUMBER FORMAT: .WORD 0 ; FORMAT OF NUMBER XY: .WORD 0 ; X,Y LOCATION FSAVE: .BLKW 2 ; SAVES NUMBER ; 100 = UNDERLINE ; 200 = FLASH ; 400 = NON ASCII ; 0000 = WHITE 1000 = LIGHT BLUE ; 2000 = PINK(PURPLE) 3000 = BLUE* ; 4000 = YELLOW 5000 = GREEN* ; 6000 = RED* 7000 = BLACK (NO COLOR) ; *=PRIMARY COLOR ; STAT: .WORD IS.SUC ; I/O STATUS BLOCK .WORD 0 ACNT: .WORD 0 ; AST COUNT FOR EXPECTED AST BUFF: .BLKW 12. CSBUF: .BLKW 25. .EVEN ERRBUF: .WORD 100,60,61,62,63,64,65,66,67,70,71 .WORD 60,61,62,63,64,65 UNIT = 11. POUT:: MOV #1,R0 ; CHECK ONLY 1 PARAM CALL R5CHEK ; CHECK IT MOV @(R5),R1 ; NEW PAGE NUMBER BIS #100000,R1 ; INDICATE FIRST TIME THRU MOV R1,CSPAGE INC ACNT ; One more AST expected MRKT$C ,1,1,CSI RETURN CSOUT: MOV #CSBUF,R1 MOV R4,R3 INC R3 ; EXTRA FOR X,Y WORD MOV XY,(R1)+ ; LOCATION ON SCREEN 1$: MOVB (R0)+,R2 ; GET CHAR BIC #177700,R2 ; STRIP OFF EXTRA BITS BIS FORMAT,R2 ; COLOR IN CHAR. MOV R2,(R1)+ ; PUT TO OUTPUT BUFFER SOB R4,1$ MOV #CSBUF,R4 CSOUT2: MOV #POUTCL,R0 CLEXEC: MOV CL.SIZ(R0),R1 ; CLIST SIZE MOV CL.MSK(R0),R2 ; CRATE MASK ADD #CL.BEG,R0 ; START OF CLIST CODE ASL R3 ; NUMBER OF BYTES TO TRANSFER QIOW$S #IO.RBC,#UNIT,,,#STAT,#CSI, BR DISMIS ; INTERRUPT PART OF THE ROUTINE ; CSI: TST (SP)+ ; POP STACK BNE 2$ ; RETURN AFTER OUTPUT DEC ACNT ; 1 LESS AST EXPECTED BNE 1$ ; Still more to come CALL WAIT10 ; Set up 10 sec wait 1$: TST STAT ; OUTPUT IN PROGRESS BEQ CSEND ; YES, DO NOT INTERRUPT IT 2$: MOV R5,-(SP) MOV R4,-(SP) MOV R3,-(SP) MOV R2,-(SP) ; SAVE MOV R1,-(SP) ; SAVE MOV R0,-(SP) ; SAVE STFPS -(SP) ; STORE FLOATING STATUS LDFPS #040200 ; NO INTERRUPT DOUBL PRE STF %1,-(SP) ; SAVE FLOATING STF %0,-(SP) ; SAVE FLOATING SETF ; SINGLE PRECISION NOW BR GET INIT: .WORD 0 ; ZERO = FIRST TIME THRU (LINE ADDRESS) ECTR: .WORD 0 ; NUMBER OF ENTRIES LEFT TO PROCESS TYPE: .WORD 0 ; TYPE OF DATA - FLOAT,0 1 WD INT SVTB2: .WORD 0 ; SAVE NEXT LOCATION IN DISPLAY TABLE SVTB: .WORD 0 ; SAVE LABELS (CURRENT ADDRESS) SVDATA: .WORD 0 ; CURRENT DATA ADDRESS TSAVE: .WORD 0 ; STATUS SAVE DISMIS: SETD LDF (SP)+,%0 LDF (SP)+,%1 LDFPS (SP)+ MOV (SP)+,R0 MOV (SP)+,R1 MOV (SP)+,R2 MOV (SP)+,R3 MOV (SP)+,R4 MOV (SP)+,R5 CSEND: ASTX$S ; RETURN FROM AST GET: TST CSPAGE ; NEW PAGE? BGE 1$ ; NO BIC #177700,CSPAGE ; RESET NEW PAGE INDICATOR CLR INIT ; YES MOV #1,R3 ; SIZE MOV #PERASE,R0 ; CLIST MOV #CSBUF,R4 ; BUFFER ADDRESS BR CLEXEC 1$: MOV #BUFF,R0 ; BUFFER FOR OUTPUT TST INIT ; FIRST TIME THRU BGT BEG ; NO, ALREADY INITED BLT 2$ CLR XY ; START AT LOCATION ZERO DEC INIT CLR ECTR ; YES MOV #SVT2,SVTB2 ; ADDRESS OF ARRAY CLR FORMAT ; BLANK FORMAT MOV #CSBUF+2,R1 ; WILL BE DATE, TIME GTIM$S R1 ; GET TIME PARAMS CALL $DAT ; FORMAT THE DATE MOVB #' ,(R0)+ ; Ouput a blank MOV #3,R2 ; COMPLETE TIME CALL $TIM MOVB #' ,(R0)+ ; Add a blank MOVB CSPAGE,R3 ; Get page number CLR R2 DIV #10.,R2 ; Convert to 2 digits ADD #'0,R2 ; Converted to ASCII ADD #'0,R3 ; Converted to ASCII MOVB R2,(R0)+ ; Leading digit MOVB R3,(R0)+ ; Trailing digit MOV R0,R4 ; Last char + 1 MOV #BUFF,R0 SUB R0,R4 ; Now is char count JMP CSOUT 2$: CMP INIT,#-1 ; Is it print errors? BNE 3$ ; No DEC INIT ; NEXT CLEAR ERRBUF ADD #100,XY MOV #ERRBUF,R4 MOV #17.,R3 JMP CSOUT2 3$: MOV #ERRBUF+2,R1 ; Buffer to clear bits MOV #16.,R4 ; Counter 4$: BIC #177700,(R1)+ ; Clear color bits SOB R4,4$ ; Till all done BEG: MOV SVTB,R3 ; LABELS BIC #3700,FORMAT ; RESET FORMAT MOV SVDATA,R1 ; DATA ADDRESS DEC ECTR ; OUTPUT OLD DATA? BGT OUTNXT ; NEXT IN LINE CLR TYPE ; NEW DATA ADDRESS CLR ECTR UPDATE: MOV SVTB2,R3 ; NEXT ENTRY IN TABLE MOV (R3),R3 BNE 2$ ; MORE TO DO CLR INIT ; FIRST TIME INDICATOR TST ACNT ; MARK TIME IN PROGRESS? BNE 1$ CALL WAIT10 ; No start one 1$: JMP DISMIS ; RETURN LATER 2$: MOV R3,SVTB2 ; SAVE IT CLR FORMAT ; CLEAN FORMAT MOV #2,INIT ; NON PRINTABLE TST (R3)+ MOVB 1(R3),R4 ; PAGE NUMBER BIC #177760,R4 ; NOW IS PAGE CMPB R4,CSPAGE ; IS IT ONE DESIRED? BNE 3$ ; NO MOV #1,INIT ; OUTPUT NOW ENABLED BIT #200,(R3) ; LINE SKIP DESIRED? BEQ 3$ ; NO MOV -4(R3),R1 ; Number of lines to skip MUL #100,R1 ; Now is Y address increment ADD R1,XY ; INCREMENT Y LOCATION 3$: MOV (R3)+,R4 ; TYPE SWITCH MOV R4,TSAVE ; SAVE STATUS MOV (R3)+,R1 ; SOURCE ADDRESS MOV R3,SVTB ; SAVE LABELS NEXT MOVB R4,ECTR ; COUNT OF DATA WDS BIC #177700,ECTR ; CLEAR EXTRA BITS BIT #40000,R4 ; PRECISION? BEQ 4$ ; SINGLE PRE INTEGER INC TYPE 4$: BIT #20000,R4 ; FLOATING? BEQ 5$ ; NO IT IS INTEGER DEC TYPE ; FLOATING PT. TYPE 5$: BIT #10000,R4 ; INPUT PARAM? BEQ OUTNXT ; NO MOV #4000,FORMAT ; YES, COLOR IT YELLOW OUTNXT: TST TYPE ; TYPE OF DATA? BMI 2$ ; FLOATING PT BEQ 1$ ; SINGLE WD INTEGER SETL ; DOUBLE WORD INTEGER MOV (R1)+,-(SP) ; REVERSE THE WORDS MOV (R1)+,-(SP) LDCIF (SP)+,%0 ; GET DOUBLE FLOATING BR 3$ 1$: SETI LDCIF (R1)+,%0 ; INTEGER INPUT BR 3$ 2$: LDF (R1)+,%0 ; FLOAT INPUT 3$: MOV R1,SVDATA ; SAVE OLD DATA STF %0,FSAVE ; SAVE VALUE FOR LATER MOV R3,R1 ; WILL BE FOR COMPARISON CMP (R1)+,(R1)+ ; SKIP TITLE ENTRIES CALL LIMIT ; MOVE TITLE, TEST LO LIMIT IF ANY BCC 4$ ; NO COMPARISON CFCC BGE 4$ ; GREATER THAN LOWER LIMIT BIS #300,FORMAT ; FLASH, UNDERLINE 4$: CALL LIMIT ; MOVE TITLE, TEST HI LIMIT IF ANY BCC 5$ CFCC BLE 5$ ; LESS THAN UPPER LIMIT BIS #200,FORMAT ; FLASH 5$: MOV R1,SVTB ; NEXT LOCATION IN TABLE CMP INIT,#2 ; DO WE OUTPUT? BEQ 6$ ; NO MOV #10.,R4 ; NUMBER OF DIGITS CALL F0CNVT ; CONVERT F0 TO DIGITS 6$: BIT #100,TSAVE ; DIFFERENCE REQUESTED? BEQ OUTPUT ; NO MOV SVTB,R1 ; YES LDF FSAVE,%0 ; GET OLD SAVED VALUE TST TYPE ; FLOATING? BMI 7$ ; YES BEQ 12$ ; ONE WORD SETL 12$: LDCIF (R1),%1 ; GET SAVED VALUE STCFI %0,(R1)+ ; SAVE NEW BR 10$ 7$: LDF (R1),%1 STF %0,(R1)+ 10$: MOV R1,SVTB CMP INIT,#2 ; DO WE OUTPUT? BEQ OUTPUT ; NO SUBF %1,%0 ; GET DIFFERENCE MOV #8.,R4 CALL F0CNVT ; CONVERT IT OUTPUT: MOVB TSAVE+1,R4 ; PAGE NUMBER BIC #177760,R4 ; STRIP EXTRA BITS ASL R4 BIS FORMAT,ERRBUF+2(R4) ; SET UP ERRRORS CMP INIT,#2 ; DO WE OUTPUT? BNE 11$ ; YES JMP GET ; NEXT INPUT 11$: SUBF %1,%0 ; GET DIFFERENCE MOV R0,R4 ; LAST BYTE SUB #BUFF,R4 ; NUMBER OF BYTES TO WRITE MOV #BUFF,R0 ADD #100,XY ; INCREMENT Y LOCATION CMP XY,#3000 ; Y TOO BIG? BLO 2$ ; NO SUB #3000,XY ADD #23.,XY ; YES,X=24. (SECOND HALF) 2$: JMP CSOUT ; ; 10 Sec marktime routine ; WAIT10: MRKT$S ,#10.,#2,#CSI ; RETURN AFTER MARK TIME INC ACNT ; One more AST to wait for RETURN ; ; ; LIMIT: MOV (R3)+,(R0) ; MOVE 2 CHAR OF TITLE TO USER CLC BPL 4$ ; NO LIMIT TST TYPE ; FLOATING? BMI 2$ ; YES LDCIF (R1)+,%1 ; GET FLOATING VALUE BR 3$ 2$: LDF (R1)+,%1 3$: SEC ; SIGNAL COMPARISON CMPF %0,%1 ; COMPARE THE 2 VALUES 4$: BIC #100200,(R0)+ ; STRIP EXTRA BITS RETURN .END