ROMAN$
======
Convert a number to Roman numerals
Usage:
======
romnum$ = ROMAN$(arabic%)
where
romnum$ is a string representing the number in Roman numerals.
and
arabic% is an integer between 1 and 3999
Limitations:
============
Romans didnt use zero, so ROMAN$(0) returns an empty string. In later
times sometimes N (nulla) was used to represent zero.
Values above 3999 use lines above the standard numerals to indicate
multiples of thousands. They cant be represented here without the use of
a special character set, so ROMAN$ is limited to values between (0) 1 and
3999.
Negative numbers and numbers above 3999 return an Out of Range error.
About:
======
This routine was written long ago as part of a general purpose date
handling toolkit. Most of the useful bits from that toolkit have either
been extracted or replaced by better things - except for this, so I
thought I might as well..
There was no good reason to write this in assembler except for keeping
all the relevant stuff together in a single package - and for fun and
practise, of course.
Basically it is just an implementation of:
100 DEFine FuNction RomanNum$(n)
110 LOCal ll, n%, m, r$(15)
120 IF n < 0 OR n% >= 4000: RETurn 'nonsense'
130 IF n = 0: RETurn 'N'
140 r$ = '': n% = n
150 FOR m = 1000,900,500,400,100,90,50,40,10,9,5,4,1
160 REPeat ll
170 n% = n% - m: IF n% < 0: n% = n% + m: EXIT ll
180 r$ = r$ & Rn$
190 END REPeat ll
200 END FOR m
210 RETurn r$
220 END DEFine RomanNum$
230 :
240 DEFine FuNction Rn$
250 SELect ON m
260 = 1: RETurn 'I'
270 = 4: RETurn 'IV'
280 = 5: RETurn 'V'
290 = 9: RETurn 'IX'
300 = 10: RETurn 'X'
310 = 40: RETurn 'XL'
320 = 50: RETurn 'L'
330 = 90: RETurn 'XC'
340 = 100: RETurn 'C'
350 = 400: RETurn 'CD'
360 = 500: RETurn 'D'
370 = 900: RETurn 'CM'
380 = 1000: RETurn 'M'
390 END SELect
400 END DEFine Rn$
410 :
Software status:
================
V0.01, pjw, 1992 Dec 19
V0.02, pjw, 2023 Sep 03, extracted, tweaked, re-tested and repackaged
Conditions of use and DISCLAIMER as per Knoware.no
Generated by QuickHTM, 2023 Sep 05