RosettaCodeData/Task/Integer-sequence/PL-M/integer-sequence-2.plm

65 lines
1.2 KiB
Plaintext

100H:
/* CP/M CALL */
BDOS: PROCEDURE (FN, ARG);
DECLARE FN BYTE, ARG ADDRESS;
GO TO 5;
END BDOS;
PUT$CHAR: PROCEDURE (CHAR);
DECLARE CHAR BYTE;
CALL BDOS(2, CHAR);
END PUT$CHAR;
/* PRINT STRING BACKWARDS UNTIL ZERO */
PRINT$BACK: PROCEDURE (S);
DECLARE S ADDRESS, C BASED S BYTE;
DO WHILE C <> 0;
CALL PUT$CHAR(C);
S = S - 1;
END;
CALL PUT$CHAR(13);
CALL PUT$CHAR(10);
END PRINT$BACK;
/* INCREMENT NUMBER STORED AS ASCII DIGITS */
INCR$BIGINT: PROCEDURE (BI) ADDRESS;
DECLARE (BI, R) ADDRESS, D BASED BI BYTE;
R = BI;
DO WHILE D <> 0; BI = BI - 1; END;
INCR$DIGIT:
BI = BI + 1;
IF D = 0 THEN DO;
D = '1';
D(1) = 0;
RETURN BI;
END;
ELSE IF D = '9' THEN DO;
D = '0';
GO TO INCR$DIGIT;
END;
ELSE DO;
D = D + 1;
RETURN R;
END;
END INCR$BIGINT;
/* STORE INITIAL 'BIG INTEGER' */
INIT$BIGINT: PROCEDURE (X) ADDRESS;
DECLARE X ADDRESS, D BASED X BYTE;
D(0) = 0;
D(1) = '0';
D(2) = 0;
RETURN .D(1);
END INIT$BIGINT;
/* LOOP PRINTING NUMBERS FOREVER */
DECLARE I ADDRESS;
I = INIT$BIGINT(.MEMORY);
DO WHILE 1;
I = INCR$BIGINT(I);
CALL PRINT$BACK(I);
END;
EOF