.TITLE POUTCS .MCALL MRKT$S,QIOW$S,QIO$S,ASTX$S .MCALL GTIM$S .psect $VARS,RW,LCL,D,con PAG: .BYTE 0 ; Page requested CPAG: .BYTE 0 ; Page processed FORMAT: .WORD WHITE ; FORMAT OF NUMBER COLOR: .WORD WHITE POINT: .WORD GET ; Points to next code to execute STAT: .WORD IS.SUC ; I/O STATUS BLOCK .WORD 0 ACNT: .WORD 0 ; AST COUNT FOR EXPECTED AST CSBUF: .BLKB 150. TBUFF: .BLKW 8. ; Temporary buffer SVTB2: .WORD 0 ; SAVE NEXT LOCATION IN DISPLAY TABLE SVTB: .WORD 0 ; SAVE LABELS (CURRENT ADDRESS) SVDATA: .WORD 0 ; CURRENT DATA ADDRESS TSAVE: .BYTE 0 ; STATUS SAVE OSTAT: .BYTE 0 FSAVE: .BLKW 2 ; SAVES NUMBER X: .word 0 ; X,Y LOCATION Y: .word 0 ECTR: .BYTE 0 ; NUMBER OF ENTRIES LEFT TO PROCESS TYPE: .BYTE 0 ; TYPE OF DATA - FLOAT,0 1 WD INT ERRBUF: .BLKB 16. ; Keeps error count SIZ=<.-X>/2 UNIT = 11. ; Unit color scope is on. .psect $text,lcl,d,ro,con esc=33 PAGTX: .ASCIZ / Page / ERASE: .ascii /[2J/ ; erase entire display .ascii /[1v/ ; set invisible cursor .asciz /[?3h/ ; set 132 chars SETXY: .asciz /[/ ; Set Y .asciz /;/ ; Set X .ascii /H/ ; Final set XY .asciz /#6/ ; set wide chars UPPER: .ascii /[0m/ ; No features .asciz /[40;31m/ ; color= red LOWER: .ascii /[4m/ ; underline RED: .asciz /[40;31m/ ; color = red ;MAGENTA:.asciz /[40;35m/ ; color = magenta CYAN: .ascii /[0m/ ; reset features .asciz /[40;36m/ ; color = cyan ;YELLOW: .asciz /[40;33m/ ; Color = yellow GREEN: .ascii /[0m/ ; Reset features .asciz /[40;32m/ ; Color = green WHITE: .asciz /[0m/ ; reset features ;BLUE: .ascii /[0m/ ; reset features ; .asciz /[40;34m/ ; color = blue ;FLASH: .ascii /[5m/ ; Flashing chars ;BOLD: .ascii /[1m/ ; Boldface chars ;REVERS:.ascii /[7m/ ; Reverse video on .psect $code,lcl,i,ro,con POUT:: MOV #1,R0 ; CHECK ONLY 1 PARAM CALL R5CHEK ; CHECK IT MOVB @(R5),R1 ; NEW PAGE NUMBER BIC #^C<17>,R1 ; Clear extra bits BIS #200,R1 ; INDICATE FIRST TIME THRU MOVB R1,PAG INCB ACNT ; One more AST expected MRKT$s ,#1,#1,#CSI RETURN ; ; The following is at interrupt level ; CSOUT: MOV #CSBUF,R0 ; Buffer address TSTEQB OSTAT,CSOUT1 ; Output allowed ? RETURN ; No CSOUT1: MOV R0,R1 10$: TSTNEB (R1)+,10$ ; Hunt for end of buffer SUB R0,R1 ; Now is buffer size+1 DEC R1 ; Now have size of buffer INCB Y ; Next Y QIO$S #IO.WLB,#UNIT,,,#STAT,#CSI, DISMIS: MOV (SP)+,POINT SETD LDF (SP)+,%0 LDF (SP)+,%1 LDF (SP)+,%2 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 ; ; INTERRUPT entry ; CSI: TST (SP)+ ; POP STACK BNE 10$ ; RETURN AFTER OUTPUT DEC ACNT ; 1 LESS AST EXPECTED CALL WAIT10 ; Set up 10 sec wait 10$: TST STAT ; OUTPUT IN PROGRESS BEQ CSEND ; YES, DO NOT INTERRUPT IT 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 %2,-(SP) ; SAVE FLOATING STF %1,-(SP) ; SAVE FLOATING STF %0,-(SP) ; SAVE FLOATING SETF ; SINGLE PRECISION NOW JMP @POINT ; Do next thing ; ; Start at beginning of page ; GET0: MOVB #1,X MOVB #2,Y ; Set to print errors CLRB OSTAT ; Set for output MOV #WHITE,R4 ; Default color MOV R4,FORMAT CALL GETXY ; Set up buffer CLR R5 ; Will be page number 10$: CMP R5,#16. BHIS 40$ ; Done ? CMPB ERRBUF(R5),#10. ; How many errors ? BGE 20$ ; 2 digits ?? MOVB #' ,(R0)+ ; Pad with space 20$: MOV #WHITE,R1 ; Color if no errors TSTEQB ERRBUF(R5),30$ ; Errors ? MOV #RED,R1 ; Yes ! 30$: CMPEQ R1,R4,35$ ; Same as last color ?? MOV R1,R4 CALL TRANS ; Set new color 35$: MOVB ERRBUF(R5),R1 ; Number to convert CALL NCONV INC R5 BR 10$ 40$: CLRB (R0) ; Chock buffer CALL CSOUT ; Print output errors CALL DISMIS ; rEturn later GET: TSTB PAG ; Check current page BGE 10$ ; not NEW PAGE? BICB #200,PAG ; Strip it MOV #ERASE,R0 ; Erase screen CALL CSOUT1 ; Output the string 10$: MOV #SIZ,R1 MOV #X,R0 ; Zero mem locs 30$: CLR (R0)+ SOB R1,30$ MOV #WHITE,FORMAT MOV #SVT2,SVTB2 ; ADDRESS OF ARRAY INCB X ; First cursor location INCB Y ; First cursor location CALL GETXY ; Put XY into buffer MOV #TBUFF,R1 ; Buffer for time GTIM$S R1 ; GET TIME PARAMS CALL $DAT ; FORMAT THE DATE MOVB #' ,(R0)+ ; Ouput a blank MOV #4,R2 ; COMPLETE TIME CALL $TIM MOV #PAGTX,R1 ; Text to add CALL TRANS ; Transfer to buffer MOVB PAG,R1 ; Get page number BLT GET ; Done ?? CALL NCONV ; Convert it to number INCB Y ; Skip error buffer BEG: CALL CSOUT TSTB PAG ; Check current page BLT GET ; New page ?? MOV SVTB,R3 ; LABELS MOV SVDATA,R5 ; DATA ADDRESS DECB ECTR ; OUTPUT OLD DATA? BGT OUTNXT ; NEXT IN LINE MOV SVTB2,R3 ; NEXT ENTRY IN TABLE MOV (R3),R3 BEQ GET0 ; No more to do 20$: MOV R3,SVTB2 ; SAVE IT TST (R3)+ BITEQB #200,(R3),30$ ; No skip requested ? ADD -4(R3),Y ; Add to Y 30$: MOVB (R3)+,R4 ; status MOVB R4,TSAVE ; Status BIC #300,R4 ; Get variable count MOVB R4,ECTR ; Counts variables CLRB TYPE ; NEW DATA ADDRESS MOVB (R3)+,R4 ; PAGE NUMBER BITEQ #100,R4,40$ ; not Double word variable ? INCB TYPE ; Yes, make it +1 40$: BITEQ #40,R4,50$ ; not Floating point variable ? DECB TYPE ; FLOATING PT. TYPE 50$: MOV #WHITE,FORMAT ; RESET FORMAT BITEQ #20,R4,60$ ; not INPUT PARAM? MOV #GREEN,FORMAT ; YES, make it GREEN 60$: BIC #177760,R4 ; NOW IS PAGE CLRB OSTAT ; Output status MOVB R4,CPAG CMPEQB R4,PAG,70$ ; IS IT ONE DESIRED? INCB OSTAT ; Mark it no output 70$: MOV (R3)+,R5 ; SOURCE ADDRESS MOV R3,SVTB ; SAVE LABELS NEXT OUTNXT: SETF ; Set single precision floating CALL GETXY ; Get buffer with xy SETI TSTB TYPE ; TYPE OF DATA? BMI 20$ ; FLOATING PT BEQ 10$ ; SINGLE WD INTEGER SETL ; DOUBLE WORD INTEGER MOV (R5)+,-(SP) ; REVERSE THE WORDS 10$: MOV (R5)+,-(SP) LDCIF (SP)+,%0 ; GET DOUBLE FLOATING BR 30$ 20$: LDF (R5)+,%0 ; FLOAT INPUT 30$: MOV R5,SVDATA ; SAVE OLD DATA STF %0,FSAVE ; SAVE VALUE FOR LATER MOV R3,R5 ; WILL BE FOR COMPARISON CMP (R5)+,(R5)+ ; SKIP TITLE ENTRIES MOV #WHITE,COLOR CALL LIMIT ; MOVE TITLE, TEST LO LIMIT IF ANY CFCC BGE 40$ ; GREATER THAN LOWER LIMIT MOV #LOWER,color ; FLASH, UNDERLINE MOVB CPAG,R1 ; Get page # INCB ERRBUF(R1) ; And increment error table 40$: CALL LIMIT ; MOVE TITLE, TEST HI LIMIT IF ANY CFCC BLE 50$ ; LESS THAN UPPER LIMIT MOV #UPPER,color ; FLASH MOVB CPAG,R1 ; Get page # INCB ERRBUF(R1) ; And increment error table 50$: MOV R5,SVTB ; NEXT LOCATION IN TABLE TSTNEB OSTAT,60$ ; No output MOVB #' ,(R0)+ ; Put in a space MOV COLOR,R1 ; Color of number CALL TRANS ; Set up the color MOV #10.,R4 ; NUMBER OF DIGITS CALL F0CNVT ; CONVERT F0 TO DIGITS CLRB (R0) 60$: BITEQB #100,TSAVE,130$ ; DIFFERENCE REQUESTED? MOV SVTB,R5 ; YES MOV R5,R1 ; Save address LDF FSAVE,%0 ; GET OLD SAVED VALUE SETI TSTB TYPE ; FLOATING? BMI 70$ ; YES BEQ 65$ ; Single word ? SETL 65$: LDCIF (R5)+,%1 ; Get saved value STCFI %0,(R1) ; SAVE NEW BR 100$ 70$: LDF (R5)+,%1 STF %0,(R1) 100$: MOV R5,SVTB TSTNEB OSTAT,130$ ; no Output ? MOV #cyan,R1 ; Set to light blue CALL TRANS ; Transfer it SUBF %1,%0 ; GET DIFFERENCE MOV #8.,R4 MOVB #' ,(R0)+ ; Put in a space CALL F0CNVT ; CONVERT IT CLRB (R0) 130$: JMP BEG ; Now output current value ; ; 10 Sec marktime routine ; WAIT10: TSTNEB ACNT,10$ ; Waiting for timer ? INCB ACNT ; One more AST to wait for MRKT$S ,#10.,#2,#CSI ; RETURN AFTER MARK TIME 10$: RETURN ; ; ; LIMIT: MOVB (R3)+,(R0)+ ; MOVE 2 CHAR OF TITLE TO USER MOVB (R3)+,(R0)+ ; Transfer next char BLT 5$ ; NO LIMIT CLRF %1 ; Set conditions to 0 RETURN 5$: BICB #200,-1(R0) ; STRIP EXTRA BITS TSTB TYPE ; FLOATING? BMI 20$ ; YES BEQ 10$ ; Single word ? MOV (R5)+,-(SP) 10$: MOV (R5)+,-(SP) LDCIF (SP)+,%1 ; GET FLOATING VALUE BR 30$ 20$: LDF (R5)+,%1 30$: CMPF %0,%1 ; COMPARE THE 2 VALUES RETURN ; ; Convert integer in R3 into number in (R0) ; NCONV: MOV R2,-(SP) MOV R3,-(SP) CLR -(SP) ; Chock stack MOV R1,R3 10$: CLR R2 DIV #10.,R2 ; Convert to 2 digits ADD #'0,R3 ; Converted to ASCII MOVB R3,-(SP) ; Save digit MOV R2,R3 ; Lo bits BNE 10$ ; Continue ? 20$: MOVB (SP)+,(R0)+ ; Get digits into buffer BNE 20$ ; Not done ? DEC R0 ; Points to chocked digit MOV (SP)+,R3 MOV (SP)+,R2 RETURN ; ; Set up buffer with address at front ; GETXY: MOV #CSBUF,R0 ; Buffer address TSTNEB OSTAT,20$ ; No output ? MOV #SETXY,R1 ; String to transfer CALL TRANS ; Stransfer string MOV R1,-(SP) ; Save string address MOV Y,R1 ; Now Y coordinte CMP R1,#24. ; Is it in range ? BLE 10$ ; Yes ? SUB #24.,R1 ; No MOVB R1,Y ; Set new Y MOVB #34.,X ; Set to margin 1 10$: CALL NCONV ; Into buffer MOV (SP)+,R1 ; Restore address CALL TRANS ; Transfer chars MOV R1,-(SP) ; Save address MOV X,R1 ; X coordinate CALL NCONV ; into buffer MOV (SP)+,R1 ; Restore address CALL TRANS ; finish sequence MOV FORMAT,R1 CALL TRANS ; Set up format 20$: RETURN ; ; Transfer string from (r1) to (R0) ; TRANS: MOVB (R1)+,(R0)+ ; Transfer 1 byte BGT TRANS ; Not done ? DEC R0 RETURN .END