Binary coded decimal: Difference between revisions

Content deleted Content added
Davgot (talk | contribs)
Forth version
Added PL/M
Line 450:
<span style="color: #000000;">test3</span><span style="color: #0000FF;">(</span><span style="color: #000000;">99</span><span style="color: #0000FF;">,</span><span style="color: #008000;">'+'</span><span style="color: #0000FF;">)</span>
<!--</lang>-->
 
=={{header|PL/M}}==
{{works with|8080 PL/M Compiler}} ... under CP/M (or an emulator)
The 8080 PL/M compiler supports packed BCD by wrapping the 8080/Z80 DAA instruction (see [[#Z80]] with the DEC built in function, demonstrated here. This allows unsigned BCD addition and subtraction to be performed on arbitrary length BCD numbers.
<lang pli>100H: /* DEMONSTRATE PL/M'S BCD HANDLING */
 
BDOS: PROCEDURE( FN, ARG ); /* CP/M BDOS SYSTEM CALL */
DECLARE FN BYTE, ARG ADDRESS;
GOTO 5;
END BDOS;
PR$CHAR: PROCEDURE( C ); DECLARE C BYTE; CALL BDOS( 2, C ); END;
PR$STRING: PROCEDURE( S ); DECLARE S ADDRESS; CALL BDOS( 9, S ); END;
PR$NL: PROCEDURE; CALL PR$CHAR( 0DH ); CALL PR$CHAR( 0AH ); END;
 
PR$BCD: PROCEDURE( V ); /* PRINT A 2-DIGIT BCD NUMBER */
DECLARE V BYTE;
DECLARE D BYTE;
D = SHR( V AND 0F0H, 4 );
CALL PR$CHAR( D + '0' );
D = V AND 0FH;
CALL PR$CHAR( D + '0' );
END PR$BCD ;
 
DECLARE ( A, B, C, D, E, F, I ) BYTE;
 
F = 1H; /* CONSTRUCT 12345678901 AS A 12 DIGIT BCD NUMBER */
E = 23H; /* IN F, E, D, C, B. A */
D = 45H;
C = 67H;
B = 89H;
A = 01H;
 
DO I = 1 TO 10; /* REPEATEDLY ADD 123456789 TO THE NUMBER AND DISPLAY IT */
CALL PR$BCD( F );
CALL PR$BCD( E );
CALL PR$BCD( D );
CALL PR$BCD( C );
CALL PR$BCD( B );
CALL PR$BCD( A );
CALL PR$STRING( .' + 123456789 = $' );
A = DEC( A + 89H ); /* THE PARAMETER TO THE DEC BUILTIN FUNCTION */
B = DEC( B PLUS 67H ); /* MUST BE A CONSTANT OR UNSCRIPTED VARIABLE */
C = DEC( C PLUS 45H ); /* +/-/PLUS/MINUS ANOTHER CONSTANT OR */
D = DEC( D PLUS 23H ); /* UNSUBSCRIPTED VARIABLE */
E = DEC( E PLUS 1H ); /* ( WHICH MUST CONTAIN 2-DIGIT BCD VALUES ).*/
F = DEC( F PLUS 0 ); /* PLUS/MINUS PERFORM ADDITION/SUBTRACTION */
CALL PR$BCD( F ); /* INCLUDING THE CARRY FROM THE PREVIOUS */
CALL PR$BCD( E ); /* OPERATION, +/- IGNORE THE CARRY. */
CALL PR$BCD( D ); /* THE RESULT IS ADJUSTED TO BE A 2-DIGIT */
CALL PR$BCD( C ); /* BCD VALUE AND THE CARRY FLAG IS SET */
CALL PR$BCD( B ); /* ACCORDINGLY */
CALL PR$BCD( A );
CALL PR$NL;
END;
 
A, B, C, D, E, F = 099H; /* SET THE 12 DIGIT BCD NUMBER TO 999999999999 */
 
DO I = 1 TO 10; /* REPEATEDLY SUBTRACT 987654321 AND DISPLAY THE RESULT */
CALL PR$BCD( F );
CALL PR$BCD( E );
CALL PR$BCD( D );
CALL PR$BCD( C );
CALL PR$BCD( B );
CALL PR$BCD( A );
CALL PR$STRING( .' - 987654321 = $' );
A = DEC( A - 21H );
B = DEC( B MINUS 43H );
C = DEC( C MINUS 65H );
D = DEC( D MINUS 87H );
E = DEC( E MINUS 9H );
F = DEC( F MINUS 0 );
CALL PR$BCD( F );
CALL PR$BCD( E );
CALL PR$BCD( D );
CALL PR$BCD( C );
CALL PR$BCD( B );
CALL PR$BCD( A );
CALL PR$NL;
END;
 
EOF</lang>
{{out}}
<pre>
012345678901 + 123456789 = 012469135690
012469135690 + 123456789 = 012592592479
012592592479 + 123456789 = 012716049268
012716049268 + 123456789 = 012839506057
012839506057 + 123456789 = 012962962846
012962962846 + 123456789 = 013086419635
013086419635 + 123456789 = 013209876424
013209876424 + 123456789 = 013333333213
013333333213 + 123456789 = 013456790002
013456790002 + 123456789 = 013580246791
999999999999 - 987654321 = 999012345678
999012345678 - 987654321 = 998024691357
998024691357 - 987654321 = 997037037036
997037037036 - 987654321 = 996049382715
996049382715 - 987654321 = 995061728394
995061728394 - 987654321 = 994074074073
994074074073 - 987654321 = 993086419752
993086419752 - 987654321 = 992098765431
992098765431 - 987654321 = 991111111110
991111111110 - 987654321 = 990123456789
</pre>
 
=={{header|Wren}}==