81 lines
2.4 KiB
Text
81 lines
2.4 KiB
Text
100H:
|
|
BDOS: PROCEDURE (FN, ARG); DECLARE FN BYTE, ARG 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;
|
|
|
|
DECLARE FCB$NAME LITERALLY '5DH'; /* CP/M STORES COMMAND ARGUMENT HERE */
|
|
|
|
/* READ ASCII NUMBER */
|
|
READ$NUMBER: PROCEDURE (PTR) ADDRESS;
|
|
DECLARE PTR ADDRESS, C BASED PTR BYTE, RSLT ADDRESS;
|
|
RSLT = 0;
|
|
DO WHILE '0' <= C AND C <= '9';
|
|
RSLT = RSLT * 10 + C - '0';
|
|
PTR = PTR + 1;
|
|
END;
|
|
RETURN RSLT;
|
|
END;
|
|
|
|
/* SPELL 16-BIT NUMBER */
|
|
SPELL: PROCEDURE (N);
|
|
DECLARE N ADDRESS;
|
|
IF N=0 THEN DO;
|
|
CALL PRINT(.'ZERO$');
|
|
RETURN;
|
|
END;
|
|
SMALL: PROCEDURE (N) ADDRESS;
|
|
DECLARE N BYTE;
|
|
DO CASE N;
|
|
RETURN .'$'; RETURN .'ONE$'; RETURN .'TWO$';
|
|
RETURN .'THREE$'; RETURN .'FOUR$'; RETURN .'FIVE$';
|
|
RETURN .'SIX$'; RETURN .'SEVEN$'; RETURN .'EIGHT$';
|
|
RETURN .'NINE$'; RETURN .'TEN$'; RETURN .'ELEVEN$';
|
|
RETURN .'TWELVE$'; RETURN .'THIRTEEN$'; RETURN .'FOURTEEN$';
|
|
RETURN .'FIFTEEN$'; RETURN .'SIXTEEN$'; RETURN .'SEVENTEEN$';
|
|
RETURN .'EIGHTEEN$'; RETURN .'NINETEEN$';
|
|
END;
|
|
END SMALL;
|
|
TEENS: PROCEDURE (N) ADDRESS;
|
|
DECLARE N BYTE;
|
|
DO CASE N-2;
|
|
RETURN .'TWENTY$';
|
|
RETURN .'THIRTY$';
|
|
RETURN .'FORTY$';
|
|
RETURN .'FIFTY$';
|
|
RETURN .'SIXTY$';
|
|
RETURN .'SEVENTY$';
|
|
RETURN .'EIGHTY$';
|
|
RETURN .'NINETY$';
|
|
END;
|
|
END TEENS;
|
|
LESS$100: PROCEDURE (N);
|
|
DECLARE N BYTE;
|
|
IF N >= 20 THEN DO;
|
|
CALL PRINT(TEENS(N/10));
|
|
N = N MOD 10;
|
|
IF N > 0 THEN CALL PRINT(.'-$');
|
|
END;
|
|
CALL PRINT(SMALL(N));
|
|
END LESS$100;
|
|
LESS$1000: PROCEDURE (N);
|
|
DECLARE N ADDRESS;
|
|
IF N >= 100 THEN DO;
|
|
CALL LESS$100(N/100);
|
|
CALL PRINT(.' HUNDRED$');
|
|
N = N MOD 100;
|
|
IF N > 0 THEN CALL PRINT(.' $');
|
|
END;
|
|
CALL LESS$100(N);
|
|
END LESS$1000;
|
|
IF N >= 1000 THEN DO;
|
|
CALL LESS$1000(N/1000);
|
|
CALL PRINT(.' THOUSAND$');
|
|
N = N MOD 1000;
|
|
IF N > 0 THEN CALL PRINT(.' $');
|
|
END;
|
|
CALL LESS$1000(N);
|
|
END SPELL;
|
|
|
|
CALL SPELL(READ$NUMBER(FCB$NAME));
|
|
CALL EXIT;
|
|
EOF
|