; CHAR7.SUB - COMMAND FILE TO CATALOG CHAR7 SUBROUTINE. .SETF TSTP .OPEN CHAR7.MAC .ENABLE DATA ! ADD SOURCE FOR SUBROUTINE AFTER THIS CARD .LIST MEB .NLIST MD,CND .TITLE CHAR7 ; @SD@ CHAR7 ; ; SUBPRGM ID: CHAR7 ; PROGRAMMER: TSG MARVIN L FREIMUND / ADS ; CREATED ON: 10 MAY 79 FOR PROJECT 050540 ; ; DESCRIPTION: CHAR7 IS A MACRO-11 SUBROUTINE USED ON THE PDP-11/45 ; TO CONVERT A STRING OF CHARACTERS INTO LARGE 7X7 BLOCK LETTERS. ; ; CALL FORMAT: CALL CHAR7(LNPB,NCHS,LOPB,NCLS,NSPS) ; ; USAGE: SEE SYSTEMS FOR DOCUMENTATION ; ; @ED@ ; .GLOBL CHAR7 ; CALL FORMAT: CALL CHAR7(LNPB,NCHS,LOPB,NCLS,NSPS) CHAR7: CALL $SAVAL ; SAVE REGISTERS MOV 2(R5),R0 ; GET HIS INPUT ADDR MOV R0,LNPB ; (SAVE FOR LATER) ADD @4(R5),R0 ; ADD NUMBER OF CHARS MOV R0,LNPE ; AND STORE END ADDR FOR COMPARE MOV @4(R5),NCHS ; AND SAVE NUMBER OF CHARS MOV 6(R5),LOPB ; OUTPUT ADDR MOV @10(R5),NCLS ; NBR OF COLUMNS MOV @12(R5),NSPS ; NBR SPACES S100: MOV NSPS,R1 ; MY NCLS = HIS SPACES ADD #7.,R1 ; PLUS 7 BYTES PER CHAR MOV R1,FACT ; (SAVE FOR LATER) MUL NCHS,R1 ; TIMES NBR OF CHARS SUB NSPS,R1 ; MINUS 1 SET OF SPACES. MOV NCLS,R0 ; GET HIS NCLS AND CMP R0,R1 ; COMPARE THEM. BGE S220 ; OK, THEY'LL FIT. S200: MOV NCLS,R0 ; HIS BUFFER IS TOO SMALL MOV LOPB,R1 ; POINT R1 AT HIS OUTPUT BUFFER S210: MOVB #'*,(R1)+ ; SEND HIM BACK JUST SOB R0,S210 ; ONE LINE OF STARS BR RTRN ; AND RETURN S220: MOV LNPB,R0 ; R0 => CURR CHAR DO600: CLR R1 ; R1=NTB INDEX CHAR TABLE DO300: CMPB (R0),ITBL(R1) ; CMP HIS CHAR TO TABLE BEQ S310 ; FOUND IT. R1 POINTS TO ITS LINE S300: ADD #8.,R1 ; POINT TO NEXT LINE IN TABLE CMP R1,NTBS ; PAST END OF TABLE? BLT DO300 ; NO, COMPARE NEXT. CLR R1 ; YES, POINT AT SPACE ENTRY. S310: CLR R2 ; R2=NLN=CURR LINE OF CHAR DO500: MOV R2,R3 ; CURR LINE MUL NCLS,R3 ; TIMES BYTES/LINE PLUS MOV R0,R5 ; CURR CHAR SUB LNPB,R5 ; AFTER SUBRTRACTING START ADDR MUL FACT,R5 ; TIMES BYTES/CHAR EQUALS ADD R5,R3 ; PNTR TO LOPB FOR CURR LIN/CHR. ADD LOPB,R3 ; AFTER ADDING BUFF START ADDR INC R1 ; POINT AT NEXT BYTE OF BITS MOVB ITBL(R1),R5 ; AND PICK IT UP CLR R4 ; R4=NBT INDEX FOR LINE MASKS DO400: BITB IBTL(R4),R5 ; IS THIS BIT ON? BEQ S400 ; NO, LEAVE IT BLANK MOVB (R0),(R3) ; YES, PUT IN THE CHAR S400: INC R3 ; POINT TO NXT OUTPUT CHAR POSN INC R4 ; AND TO NEXT MASK BYTE CMP R4,NBTS ; CHECKED ALL MASKS? BLT DO400 ; NO, GO DO NEXT S500: INC R2 ; YES, UP TO NEXT LINE CMP R2,NLNS ; DONE 7 LINES? BLT DO500 ; NO, DO NEXT LINE S600: INC R0 ; YES, UP TO NEXT CHAR CMP R0,LNPE ; DONE ALL CHARS? BLT DO600 ; NO, GO DO NEXT CHAR RTRN: RTS PC ; AND RETURN .PAGE ; ; LOCAL STORAGE FOLLOWS: ; LNPB: .WORD 0 ; ADDR INPUT BUFF LNPE: .WORD 0 ; ADDR INPUT BUFF END NCHS: .WORD 0 ; NMBR CHARACTERS LOPB: .WORD 0 ; ADDR OUTPT BUFF NCLS: .WORD 0 ; NMBR COLUMNS NSPS: .WORD 0 ; NMBR SPACES FACT: .WORD 0 ; EQUALS NSPS+10. NLNS: .WORD 7 ; CONSTANT NUMBER LINES ; ; HERE IS THE CHARACTER BIT TABLE ; .NLIST BEX ITBL: .BYTE 040,000,000,000,000,000,000,000 ; SPACE .BYTE 041,010,010,010,010,000,000,010 ; EXCLA .BYTE 042,167,167,021,042,000,000,000 ; " .BYTE 044,076,111,110,076,011,111,076 ; $ .BYTE 045,161,162,004,010,020,047,107 ; % .BYTE 046,076,110,110,076,110,111,076 ; & .BYTE 047,034,034,014,010,000,000,000 ; ' .BYTE 050,020,040,100,100,100,040,020 ; ( .BYTE 051,004,002,001,001,001,002,004 ; ) .BYTE 052,111,052,034,177,034,052,111 ; * .BYTE 053,000,010,010,076,010,010,000 ; + .BYTE 054,000,000,000,034,034,014,010 ; , .BYTE 055,000,000,000,076,000,000,000 ; - .BYTE 056,000,000,000,000,170,170,170 ; . .BYTE 057,001,002,004,010,020,040,100 ; / .BYTE 060,077,103,105,111,121,141,176 ; 0 .BYTE 061,010,030,010,010,010,010,076 ; 1 .BYTE 062,076,101,001,036,040,100,177 ; 2 .BYTE 063,076,101,001,036,001,101,076 ; 3 .BYTE 064,012,022,042,177,002,002,002 ; 4 .BYTE 065,177,100,100,076,001,101,076 ; 5 .BYTE 066,076,101,100,176,101,101,076 ; 6 .BYTE 067,177,002,004,010,020,040,100 ; 7 .BYTE 070,076,101,101,076,101,101,076 ; 8 .BYTE 071,076,101,101,076,001,001,076 ; 9 .BYTE 072,034,034,000,000,000,034,034 ; : .BYTE 073,034,034,000,034,034,014,020 ; ; .BYTE 074,010,020,040,100,040,020,010 ; < .BYTE 075,000,000,076,000,076,000,000 ; = .BYTE 076,010,004,002,001,002,004,010 ; > .BYTE 077,076,101,001,016,000,010,010 ; ? .BYTE 101,076,101,101,177,101,101,101 ; A .BYTE 102,176,101,101,176,101,101,176 ; B .BYTE 103,076,101,100,100,100,101,076 ; C .BYTE 104,176,101,101,101,101,101,176 ; D .BYTE 105,177,100,100,170,100,100,177 ; E .BYTE 106,177,100,100,170,100,100,100 ; F .BYTE 107,076,101,100,103,101,101,076 ; G .BYTE 110,101,101,101,177,101,101,101 ; H .BYTE 111,076,010,010,010,010,010,076 ; I .BYTE 112,037,004,004,004,004,044,030 ; J .BYTE 113,102,104,110,120,150,104,102 ; K .BYTE 114,100,100,100,100,100,100,177 ; L .BYTE 115,101,143,125,111,101,101,101 ; M .BYTE 116,101,141,121,111,105,103,101 ; N .BYTE 117,076,101,101,101,101,101,076 ; O .BYTE 120,176,101,101,176,100,100,100 ; P .BYTE 121,076,101,101,101,105,103,077 ; Q .BYTE 122,176,101,101,176,110,104,102 ; R .BYTE 123,076,101,100,076,001,101,076 ; S .BYTE 124,177,010,010,010,010,010,010 ; T .BYTE 125,101,101,101,101,101,101,076 ; U .BYTE 126,101,101,101,101,042,024,010 ; V .BYTE 127,101,101,101,111,125,143,101 ; W .BYTE 130,101,042,024,010,024,042,101 ; X .BYTE 131,101,042,024,010,010,010,010 ; Y .BYTE 132,177,002,004,010,020,040,177 ; Z .BYTE 133,170,100,100,100,100,100,170 ; [ .BYTE 134,017,001,001,001,001,001,017 ; ] ITBE=. NTBS: .WORD ITBE-ITBL ; ; HERE IS THE MASK TABLE ; IBTL: .BYTE 100,040,020,010,004,002,001 IBTE=. .EVEN NBTS: .WORD IBTE-IBTL .LIST BEX .END .DISABLE DATA .CLOSE MAC CHAR7,ADSCHAR7.DMP/-SP=CHAR7 PIP CHAR7.MAC;*/DE .ASK ANSA DID IT ASSEMBLE OK .IFF ANSA .GOTO 500 .ASK TSTP DO YOU HAVE A TEST PROGRAM .IFF TSTP .GOTO 500 .OPEN TSTCHAR7.FTN .ENABLE DATA ! ADD TEST PROGRAM SOURCE AFTER THIS CARD C TSTCHAR7 BYTE BUF8(70,7),BUF7(61,7),BUF6(52,7),BUF5(43,7),BUF4(34,7), * BUF3(25,7),BUF2(16,7),BUF1( 7,7),BUFF(10) ,BLNK EQUIVALENCE (BUF8,BUF7,BUF6,BUF5,BUF4,BUF3,BUF2,BUF1) DATA BLNK/' '/ C CALL BEGIN 100 CALL TRMSG('ENTER UP TO 8 CHARS> ',22,BUFF,10) DO 110 N=8,1,-1 IF (BUFF(N).NE.BLNK) GOTO 200 110 CONTINUE GOTO 999 C 200 DO 210 I=1,70 DO 210 J=1,7 BUF8(I,J) = BLNK 210 CONTINUE C 300 IF (N.EQ.1) CALL CHAR7(BUFF,1,BUF1, 7,2) IF (N.EQ.2) CALL CHAR7(BUFF,2,BUF2,16,2) IF (N.EQ.3) CALL CHAR7(BUFF,3,BUF3,25,2) IF (N.EQ.4) CALL CHAR7(BUFF,4,BUF4,34,2) IF (N.EQ.5) CALL CHAR7(BUFF,5,BUF5,43,2) IF (N.EQ.6) CALL CHAR7(BUFF,6,BUF6,52,2) IF (N.EQ.7) CALL CHAR7(BUFF,7,BUF7,61,2) IF (N.EQ.8) CALL CHAR7(BUFF,8,BUF8,70,2) C 400 DO 410 J=1,7 IF (N.EQ.1) WRITE (5,5001) (BUF1(I,J),I=1, 7) IF (N.EQ.2) WRITE (5,5002) (BUF2(I,J),I=1,16) IF (N.EQ.3) WRITE (5,5003) (BUF3(I,J),I=1,25) IF (N.EQ.4) WRITE (5,5004) (BUF4(I,J),I=1,34) IF (N.EQ.5) WRITE (5,5005) (BUF5(I,J),I=1,43) IF (N.EQ.6) WRITE (5,5006) (BUF6(I,J),I=1,52) IF (N.EQ.7) WRITE (5,5007) (BUF7(I,J),I=1,61) IF (N.EQ.8) WRITE (5,5008) (BUF8(I,J),I=1,70) 410 CONTINUE GOTO 100 C 999 CALL QUIT C 5001 FORMAT (1X, 7A1) 5002 FORMAT (1X,16A1) 5003 FORMAT (1X,25A1) 5004 FORMAT (1X,34A1) 5005 FORMAT (1X,43A1) 5006 FORMAT (1X,52A1) 5007 FORMAT (1X,61A1) 5008 FORMAT (1X,70A1) END .DISABLE DATA .CLOSE F4P TSTCHAR7,TSTCHAR7/-SP=TSTCHAR7 PIP ADSCHAR7.DMP=TSTCHAR7.LST/AP PIP TSTCHAR7.FTN;*/DE,TSTCHAR7.LST;* .ASK ANST DO YOU WANT TO TASK BUILD .IFF ANST .GOTO 500 .OPEN TSTCHAR7.CMD .ENABLE DATA TSTCHAR7,TSTCHAR7/-SP=TSTCHAR7,CHAR7 / LIBR=F4PRES:RO // .DISABLE DATA .CLOSE TKB @TSTCHAR7 PIP ADSCHAR7.DMP=TSTCHAR7.MAP/AP,TSTCHAR7.CMD/AP PIP TSTCHAR7.CMD;*/DE,TSTCHAR7.MAP;* .ASK ANSTST DO YOU WANT TO PAUSE TO TEST THE PROGRAM .IFF ANSTST .GOTO 500 .PAUSE .SETS USER .SETS COMA USER[3:3] .IF COMA NE "," .GOTO 500 .ASK ANSC DO YOU WANT THIS INSERTED IN SYSLIB.OLB .IFF ANSC .GOTO 500 .ASK ANSL DO YOU WANT A LISTING OF NEW SYSLIB.OLB .IFNINS LBR INS $LBR .IFF ANSL LBR [1,1]SYSLIB/RP=CHAR7 .IFT ANSL LBR [1,1]SYSLIB/RP,ADSSYSLIB.DMP/SP/FU=CHAR7 PIP CHAR7.OBJ;*/DE .500: PIP ADSCHAR7.DMP/SP .IFT TSTP PIP TSTCHAR7.OBJ;*/DE ; CHAR7.SUB - FINISHED.