Non-decimal radices/Convert: Difference between revisions

Add PL/M
(Add PL/M)
Line 2,581:
end convert;
</lang>
 
=={{header|PL/M}}==
<lang pli>100H:
 
/* CONVERT A NUMBER TO A GIVEN BASE */
TO$BASE: PROCEDURE (N, BASE, BUF) ADDRESS;
DECLARE (N, BUF, I, J, K) ADDRESS;
DECLARE (D, BASE, STR BASED BUF) BYTE;
/* GENERATE DIGITS */
I = 0;
DIGIT:
D = N MOD BASE;
N = N / BASE;
IF D < 10 THEN STR(I) = D + '0';
ELSE STR(I) = (D - 10) + 'A';
I = I + 1;
IF N > 0 THEN GO TO DIGIT;
/* PUT DIGITS IN HIGH-ENDIAN ORDER */
J = 0;
K = I-1;
DO WHILE (J < K);
D = STR(K);
STR(K) = STR(J);
STR(J) = D;
K = K-1;
J = J+1;
END;
STR(I) = '$';
RETURN BUF;
END TO$BASE;
 
 
/* READ A NUMBER IN A GIVEN BASE */
FROM$BASE: PROCEDURE (BUF, BASE) ADDRESS;
DECLARE (BUF, RESULT) ADDRESS;
DECLARE (D, BASE, CHAR BASED BUF) BYTE;
RESULT = 0;
DO WHILE CHAR <> '$';
D = CHAR - '0';
IF D >= 10 THEN D = D - ('A' - '0') + 10;
RESULT = (RESULT * BASE) + D;
BUF = BUF + 1;
END;
RETURN RESULT;
END FROM$BASE;
 
/* CP/M BDOS ROUTINES */
BDOS: PROCEDURE (F,A); DECLARE F BYTE, A ADDRESS; GO TO 5; END BDOS;
EXIT: PROCEDURE; CALL BDOS(0,0); END EXIT;
PRINT: PROCEDURE (S); DECLARE S ADDRESS; CALL BDOS(9,S); END PRINT;
CRLF: PROCEDURE; CALL PRINT(.(13,10,'$')); END CRLF;
 
/* EXAMPLES */
DECLARE I BYTE, N ADDRESS;
 
CALL PRINT(.'1234 IN BASES 2-36: $'); CALL CRLF;
DO I=2 TO 36;
CALL PRINT(.'BASE $');
CALL PRINT(TO$BASE(I, 10, .MEMORY));
CALL PRINT(.(': ',9,'$'));
CALL PRINT(TO$BASE(1234, I, .MEMORY));
CALL CRLF;
END;
 
CALL PRINT(.'''25'' IN BASES 10-36: $'); CALL CRLF;
DO I=10 TO 36;
CALL PRINT(.'BASE $');
CALL PRINT(TO$BASE(I, 10, .MEMORY));
CALL PRINT(.(':',9,'$'));
N = FROM$BASE(.'25$', I);
CALL PRINT(TO$BASE(N, 10, .MEMORY));
CALL CRLF;
END;
 
CALL EXIT;
EOF</lang>
{{out}}
<pre style='height:50ex;'>1234 IN BASES 2-36:
BASE 2: 10011010010
BASE 3: 1200201
BASE 4: 103102
BASE 5: 14414
BASE 6: 5414
BASE 7: 3412
BASE 8: 2322
BASE 9: 1621
BASE 10: 1234
BASE 11: A22
BASE 12: 86A
BASE 13: 73C
BASE 14: 642
BASE 15: 574
BASE 16: 4D2
BASE 17: 44A
BASE 18: 3EA
BASE 19: 37I
BASE 20: 31E
BASE 21: 2GG
BASE 22: 2C2
BASE 23: 27F
BASE 24: 23A
BASE 25: 1O9
BASE 26: 1LC
BASE 27: 1IJ
BASE 28: 1G2
BASE 29: 1DG
BASE 30: 1B4
BASE 31: 18P
BASE 32: 16I
BASE 33: 14D
BASE 34: 12A
BASE 35: 109
BASE 36: YA
'25' IN BASES 10-36:
BASE 10: 25
BASE 11: 27
BASE 12: 29
BASE 13: 31
BASE 14: 33
BASE 15: 35
BASE 16: 37
BASE 17: 39
BASE 18: 41
BASE 19: 43
BASE 20: 45
BASE 21: 47
BASE 22: 49
BASE 23: 51
BASE 24: 53
BASE 25: 55
BASE 26: 57
BASE 27: 59
BASE 28: 61
BASE 29: 63
BASE 30: 65
BASE 31: 67
BASE 32: 69
BASE 33: 71
BASE 34: 73
BASE 35: 75
BASE 36: 77</pre>
 
=={{header|Pop11}}==
2,093

edits