; ASCEBC.MAC 6-JUL-78 ; .TITLE ASCEBC .IDENT /V01/ ; ; * * * * * * * * * ; ; ASCEBC - TRANSLATE FROM ASCII TO EBCDIC ; ; THIS IS ONE OF A SET OF BYTE MANIPULATION ROUTINES IN WHICH THE ; BEGINNING OF A STRING IS SPECIFIED BY AN ADDRESS,COUNT PAIR A,K WHERE ; A IS A BASE ADDRESS (OF A VARIABLE OR ARRAY) AND K IS A TWO-BYTE ; INTEGER WORD SPECIFYING AT WHICH BYTE OF A THE STRING BEGINS. K MAY BE ; POSITIVE, ZERO, OR NEGATIVE. K=1 MEANS THE FIRST BYTE OF A. ; ; CALL ASCEBC(A1,K1,A2,K2,L) ; ; THIS ROUTINE MOVES L BYTES FROM A1,K1 TO A2,K2, CONVERTING EACH ; BYTE FROM ASCII TO EBCDIC. ; ; A1,K1 - SPECIFIES THE BEGINNING OF THE SOURCE STRING. A1 MAY BE ; A LITERAL CONSTANT. ; A2,K2 - SPECIFIES THE BEGINNING OF THE DESTINATION STRING. ; L - A TWO-BYTE INTEGER COUNT OF THE NUMBER OF BYTES TO MOVE. ; IF L IS ZERO OR NEGATIVE, NO BYTES ARE MOVED. ; ; ; IF THE SOURCE AND DESTINATION STRINGS ARE THE SAME, THEN THE ; CONVERSION IS DONE IN PLACE. ; ; THIS ROUTINE DOES NOTHING IF PASSED THE WRONG NUMBER OF ARGUMENTS. ; ; THIS ROUTINE USES THE SAME ASCII/EBCDIC TRANSLATION PERFORMED BY ; THE IBM 360 OPERATING SYSTEM. ; ; * * * * * * * * * ; ; ; ; ; ; WRITTEN BY BOB TURKELSON, NASA/GSFC CODE 626 ; ; .EVEN ; TABLE FOR TRANSLATING FROM ASCII TO EBCDIC TABLE: .BYTE 0, 1, 2, 3, 67, 55, 56, 57 ; 00010203372D2E2F .BYTE 26, 5, 45, 13, 14, 15, 16, 17 ; 1605250B0C0D0E0F .BYTE 20, 21, 22, 23, 74, 75, 62, 46 ; 101112133C3D3226 .BYTE 30, 31, 77, 47, 34, 35, 36, 37 ; 18193F271C1D1E1F .BYTE 100,117,177,173,133,154,120,175 ; 404F7F7B5B6C507D .BYTE 115,135,134,116,153,140,113,141 ; 4D5D5C4E6B604B61 .BYTE 360,361,362,363,364,365,366,367 ; F0F1F2F3F4F5F6F7 .BYTE 370,371,172,136,114,176,156,157 ; F8F97A5E4C7E6E6F .BYTE 174,301,302,303,304,305,306,307 ; 7CC1C2C3C4C5C6C7 .BYTE 310,311,321,322,323,324,325,326 ; C8C9D1D2D3D4D5D6 .BYTE 327,330,331,342,343,344,345,346 ; D7D8D9E2E3E4E5E6 .BYTE 347,350,351,255,340,275,137,155 ; E7E8E9ADE0BD5F6D .BYTE 171,201,202,203,204,205,206,207 ; 7981828384858687 .BYTE 210,211,221,222,223,224,225,226 ; 8889919293949596 .BYTE 227,230,231,242,243,244,245,246 ; 979899A2A3A4A5A6 .BYTE 247,250,251,300,152,320,241, 7 ; A7A8A9C06AD0A107 .BYTE 77, 77, 77, 77, 77, 77, 77, 77 ; 3F3F3F3F3F3F3F3F .BYTE 77, 77, 77, 77, 77, 77, 77, 77 ; 3F3F3F3F3F3F3F3F .BYTE 77, 77, 77, 77, 77, 77, 77, 77 ; 3F3F3F3F3F3F3F3F .BYTE 77, 77, 77, 77, 77, 77, 77, 77 ; 3F3F3F3F3F3F3F3F .BYTE 77, 77, 77, 77, 77, 77, 77, 77 ; 3F3F3F3F3F3F3F3F .BYTE 77, 77, 77, 77, 77, 77, 77, 77 ; 3F3F3F3F3F3F3F3F .BYTE 77, 77, 77, 77, 77, 77, 77, 77 ; 3F3F3F3F3F3F3F3F .BYTE 77, 77, 77, 77, 77, 77, 77, 77 ; 3F3F3F3F3F3F3F3F .BYTE 77, 77, 77, 77, 77, 77, 77, 77 ; 3F3F3F3F3F3F3F3F .BYTE 77, 77, 77, 77, 77, 77, 77, 77 ; 3F3F3F3F3F3F3F3F .BYTE 77, 77, 77, 77, 77, 77, 77, 77 ; 3F3F3F3F3F3F3F3F .BYTE 77, 77, 77, 77, 77, 77, 77, 77 ; 3F3F3F3F3F3F3F3F .BYTE 77, 77, 77, 77, 77, 77, 77, 77 ; 3F3F3F3F3F3F3F3F .BYTE 77, 77, 77, 77, 77, 77, 77, 77 ; 3F3F3F3F3F3F3F3F .BYTE 77, 77, 77, 77, 77, 77, 77, 77 ; 3F3F3F3F3F3F3F3F .BYTE 77, 77, 77, 77, 77, 77, 77, 77 ; 3F3F3F3F3F3F3F3F ASCEBC:: CMPB #5,(R5) ; ARE 5 ARGUMENTS PASSED? BNE RTR ; IF NE NO MOV @12(R5),R0 ; GET NO. OF BYTES TO PROCESS (ARG 5) BLE RTR ; IF LE ZERO RETURN TST (R5)+ ; ADVANCE POINTER TO ARGUMENT 1 MOV (R5)+,R1 ; GET BASE ADDRESS OF SOURCE (ARG 1) ADD @(R5)+,R1 ; ADD SOURCE BYTE NUMBER (ARG 2) DEC R1 ; SUBTRACT 1 FOR ADDRESS OF 1ST SOURCE BYTE MOV (R5)+,R2 ; GET BASE ADDRESS OF DESTINATION (ARG 3) ADD @(R5)+,R2 ; ADD DESTINATION BYTE NUMBER (ARG 4) DEC R2 ; SUBTRACT 1 FOR ADDR OF 1ST DESTINATION BYTE ; ; MOV #TABLE,R4 ; GET ADDRESS OF TRANSLATION TABLE RPT: MOVB (R1)+,R3 ; GET NEXT SOURCE BYTE BIC #177400,R3 ; CLEAR UPPER BYTE OF REGISTER ADD R4,R3 ; CALC ADDR IN TABLE OF TRANSLATED CHAR MOVB (R3),(R2)+ ; MOVE TRANSLATED CHAR TO DESTINATION SOB R0,RPT ; REPEAT IF MORE BYTES TO PROCESS ; RTR: RTS PC ; DONE .END