TITLE IBCD FUNCTION CONVERS ASCII TO BCD INTERNAL IBCD ; ;PDP-10 ROUTINE TO PULL ASCII CODED CHARACTER FROM ALPHAMERIC ;STRING AND RETURN ITS BCD EQUIVALENT. ; ;THIS IS CALLED AS A FORTRAN FUNCTION WITH 2 ARGUMENTS, THE ;STRING ADDRESS AND THE SERIAL NUMBER OF THE CHARACTER DESIRED. ;THE BCD EQUIVALENT IS RETURNED IN ACCUMULATOR ZERO. ;LTTR=IBCD('THIS IS A STRING',9) IN A FORTRAN PROGRAM ;WOULD GIVE LTTR THE VALUE 17 (OCTAL 21), THE BCD CODE FOR A, ;THE 9TH CHARACTER IN THE STRING. ; ;DONALD BARTH, CHEMISTRY DEPT., HARVARD UNIVERSITY ; AC0=0 ;AC TO RECEIVE BCD CODE AC1=1 ;AC USED AS SCRATCH AREA AC2=16 ;AC CONTAINING RETURN ADDRESS IBCD: 0 ; ;OBTAIN ASCII CHARACTER FROM STRING ; MOVE AC0, @1(AC2) ;MOVE SERIAL NUMBER TO AC0 ADDI AC0, 4 ;ADD 4 AND DIVIDE BY 5 TO FIND IDIVI AC0, 5 ;OUT WHAT WORD IN STRING CONTAINS SOS AC0 ;THE DESIRED CHARACTER. ADD AC0, (AC2) ;ADD THIS TO STRING ADDRESS. IMULI AC1, 7 ;MULTIPLY REMAINDER (IN AC0+1) MOVN AC1, AC1 ;BY 7 (ASCII CHARACTER IS 7 BITS) ADDI AC1, 35 ;AND SUBTRACT FROM 29 (OCTAL 35) ;TO FIND NUMBER OF BITS TO RIGHT ;OF THE CHARACTER. LSH AC1, 36 ;SHIFT NUMBER OF BITS RIGHT OF ;BYTE INTO BITS 0-5 OF BYTE POINTER. IOR AC1, [000700000000] ;PUT BYTE SIZE (7) INTO ;BITS 6-11 OF BYTE POINTER. HRR AC1, AC0 ;PUT ADDRESS INTO BITS 18-35. LDB AC0, AC1 ;OBTAIN CODE AND PLACE INTO AC0 ; ;CONVERT CODE FROM 7 BIT ASCII TO 6 BIT BCD ; ADDI AC0, 6 ;ADD 6 TO AC0 TO INSURE THAT ;DIVISION BY 6 WILL GIVE A ;POSITIVE REMAINDER. IDIVI AC0, 6 ;DIVIDE BY 6, PLACING RESULT IN ;AC0 AND REMAINDER IN AC0+1 (AC1) SOS AC0 ;SUBTRACT 1 FROM RESULT AND ADD ADDI AC0, TABLE ;TO ADDRESS OF FIRST TABLE ENTRY ;TO OBTAIN ADDRESS OF TABLE ;ENTRY CONTAINING THE CONVERSION ;INFORMATION FOR PRESENT CHARACTER. IMULI AC1, 6 ;MULTIPLY BY 6 AND SUBTRACT FROM MOVN AC1, AC1 ;30 (OCTAL 36) TO OBTAIN NUMBER ADDI AC1, 36 ;OF BITS TO RIGHT IN TABLE ENTRY. LSH AC1, 36 ;SHIFT NUMBER OF BITS TO RIGHT ;OF BYTE INTO BITS 0 TO 5. IOR AC1, [000600000000] ;PUT BYTE SIZE (6) INTO ;BITS 6 TO 11. HRR AC1, AC0 ;PUT ADDRESS INTO BITS 18-35. LDB AC0, AC1 ;CONVERT CODE AND PLACE INTO AC0. JRA AC2, 2(AC2) ;RETURN ; ;FOLLOWING IS THE ASCII TO BCD CONVERSION TABLE. ; TABLE: BYTE(6) 60,60,60,60,60,60 ;CODES 0- 5 BYTE(6) 60,60,60,60,60,60 ;CODES 6- 11 BYTE(6) 60,60,60,60,60,60 ;CODES 12- 17 BYTE(6) 60,60,60,60,60,60 ;CODES 18- 23 BYTE(6) 60,60,60,60,60,60 ;CODES 24- 29 BYTE(6) 60,60,60,60,60,60 ;CODES 30- 35 , , ,!,",# BYTE(6) 53,60,60,14,74,34 ;CODES 36- 41 $,%,&,',(,) BYTE(6) 54,20,73,40,33,61 ;CODES 42- 47 *,+,,,-,.,/ BYTE(6) 0, 1, 2, 3, 4, 5 ;CODES 48- 53 0,1,2,3,4,5 BYTE(6) 6, 7,10,11,60,60 ;CODES 54- 59 6,7,8,9,:,; BYTE(6) 60,13,60,60,60,21 ;CODES 60- 65 <,=,>,?,@,A BYTE(6) 22,23,24,25,26,27 ;CODES 66- 71 B,C,D,E,F,G BYTE(6) 30,31,41,42,43,44 ;CODES 72- 77 H,I,J,K,L,M BYTE(6) 45,46,47,50,51,62 ;CODES 78- 83 N,O,P,Q,R,S BYTE(6) 63,64,65,66,67,70 ;CODES 84- 89 T,U,V,W,X,Y BYTE(6) 71,60,60,60,60,60 ;CODES 90- 95 Z,[,\,],^,_ BYTE(6) 60,21,22,23,24,25 ;CODES 96-101 @,a,b,c,d,e BYTE(6) 26,27,30,31,41,42 ;CODES 102-107 f,g,h,i,j,k BYTE(6) 43,44,45,46,47,50 ;CODES 108-113 l,m,n,o,p,q BYTE(6) 51,62,63,64,65,66 ;CODES 114-119 r,s,t,u,v,w BYTE(6) 67,70,71,60,60,60 ;CODES 120-125 x,y,z,{,|, BYTE(6) 60,60, 0, 0, 0, 0 ;CODES 126-127 END