; EBCASC.MAC 6-JUL-78 ; .TITLE EBCASC .IDENT /V01/ ; ; * * * * * * * * * ; ; EBCASC - TRANSLATE FROM EBCDIC TO ASCII ; ; 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 EBCASC(A1,K1,A2,K2,L) ; ; THIS ROUTINE MOVES L BYTES FROM A1,K1 TO A2,K2, CONVERTING EACH ; BYTE FROM EBCDIC TO ASCII. ; ; 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 EBCDIC/ASCII TRANSLATION PERFORMED BY ; THE IBM 360 OPERATING SYSTEM. ; ; * * * * * * * * * ; ; ; ; ; ; WRITTEN BY BOB TURKELSON, NASA/GSFC CODE 626 ; ; .EVEN ; TABLE FOR TRANSLATING FROM EBCDIC TO ASCII TABLE: .BYTE 0, 1, 2, 3, 32, 11, 32,177 ; 000102031A091A7F .BYTE 32, 32, 32, 13, 14, 15, 16, 17 ; 1A1A1A0B0C0D0E0F .BYTE 20, 21, 22, 23, 32, 32, 10, 32 ; 101112131A1A081A .BYTE 30, 31, 32, 32, 34, 35, 36, 37 ; 18191A1A1C1D1E1F .BYTE 32, 32, 32, 32, 32, 12, 27, 33 ; 1A1A1A1A1A0A171B .BYTE 32, 32, 32, 32, 32, 5, 6, 7 ; 1A1A1A1A1A050607 .BYTE 32, 32, 26, 32, 32, 32, 32, 4 ; 1A1A161A1A1A1A04 .BYTE 32, 32, 32, 32, 24, 25, 32, 32 ; 1A1A1A1A14151A1A .BYTE 40, 32, 32, 32, 32, 32, 32, 32 ; 201A1A1A1A1A1A1A .BYTE 32, 32,133, 56, 74, 50, 53, 41 ; 1A1A5B2E3C282B21 .BYTE 46, 32, 32, 32, 32, 32, 32, 32 ; 261A1A1A1A1A1A1A .BYTE 32, 32,135, 44, 52, 51, 73,136 ; 1A1A5D242A293B5E .BYTE 55, 57, 32, 32, 32, 32, 32, 32 ; 2D2F1A1A1A1A1A1A .BYTE 32, 32,174, 54, 45,137, 76, 77 ; 1A1A7C2C255F3E3F .BYTE 32, 32, 32, 32, 32, 32, 32, 32 ; 1A1A1A1A1A1A1A1A .BYTE 32,140, 72, 43,100, 47, 75, 42 ; 1A603A2340273D22 .BYTE 32,141,142,143,144,145,146,147 ; 1A61626364656667 .BYTE 150,151, 32, 32, 32, 32, 32, 32 ; 68691A1A1A1A1A1A .BYTE 32,152,153,154,155,156,157,160 ; 1A6A6B6C6D6E6F70 .BYTE 161,162, 32, 32, 32, 32, 32, 32 ; 71721A1A1A1A1A1A .BYTE 32,176,163,164,165,166,167,170 ; 1A7E737475767778 .BYTE 171,172, 32, 32, 32, 32, 32, 32 ; 797A1A1A1A1A1A1A .BYTE 32, 32, 32, 32, 32, 32, 32, 32 ; 1A1A1A1A1A1A1A1A .BYTE 32, 32, 32, 32, 32, 32, 32, 32 ; 1A1A1A1A1A1A1A1A .BYTE 173,101,102,103,104,105,106,107 ; 7B41424344454647 .BYTE 110,111, 32, 32, 32, 32, 32, 32 ; 48491A1A1A1A1A1A .BYTE 175,112,113,114,115,116,117,120 ; 7D4A4B4C4D4E4F50 .BYTE 121,122, 32, 32, 32, 32, 32, 32 ; 51521A1A1A1A1A1A .BYTE 134, 32,123,124,125,126,127,130 ; 5C1A535455565758 .BYTE 131,132, 32, 32, 32, 32, 32, 32 ; 595A1A1A1A1A1A1A .BYTE 60, 61, 62, 63, 64, 65, 66, 67 ; 3031323334353637 .BYTE 70, 71, 32, 32, 32, 32, 32, 32 ; 38391A1A1A1A1A1A EBCASC:: 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