Restoration comments May/2018 | |
Fortransit | |
From Bitsavers Manual CarnegieInternalTranslator.pdf (listings) | |
and fortransit.pdf (reference manual) | |
Fortansit comes in 4 versions: Fortransit I, I (S), II, II (S). | |
"(S)" means special character support on IBM 533 card read-punch. | |
"I" means basic IBM 650, "II" means IBM 650 + IBM 653 Storage Unit | |
that provides Floating Point and Index instructions. | |
We are using Version II (S). | |
In the original listing on IT for Fortransit II there an error | |
on lines 670, 671. These lines are in fact a bugfix replacement | |
for lines 660 and 661. The missing 670 and 671 lines has been | |
recovered for the IT for Fortransit I listing: | |
ALO 8001 1455 15 8001 1864 RSV: ADDED MISSING CARDS | |
ALO UBSR 1864 15 0664 1419 | |
On the original manual, the following pieces of software are | |
missing: | |
SOAP-PACKAGE (SOAP II modified to be used by Fortransit) | |
Subroutines PACKAGE (with built in functions to be called | |
by object program in run-time) | |
Add function title program | |
The compilation and run procedure has been slightly modified | |
in its implementation in run_fortransit.ini script from what | |
it is stated in manual. This is to allow the use of standard | |
SOAP II assembler and the Subroutines package. | |
Also an Add function title program (fortransit_addfn_listing.txt) | |
has been rewritten to allow the usage of function title cards | |
as stated in manual, and to populate the standard fortransit | |
functions to be recognized by the translator. | |
The missing subroutines PACKAGE has been re-created adapting the | |
available IT run-time PACKAGES P1, P2, P3 and P4 to | |
FORTRANSIT. PUNCH and READ routines has been written from | |
scratch according to functional description from manual. | |
The PACKAGE provides the subroutines stated in fortransit.pdf | |
in page 36, and also provides a set of functions to be | |
used in fortransit source code: | |
A=LOGF(B) base 10 Logarithm: log 10 | |
A=EXPF(B) base 10 exponent: 10^(B) | |
A=LNF(B) base e logarithm: neperian log e | |
A=EXPNF(B) base e exponent: e^(float) | |
A=COSF(B) cosine | |
A=SINF(B) sine | |
A=SQRT(B) square root | |
A=ABSF(B) absolute value | |
A=INTF(B) integer part | |
A=MAXF(B,C,...) returns maximum value of argument list | |
All functions has FLOAT arguments and returns FLOAT value. | |
If a FIXED argument is given, the program will stop with AR=9099 | |
9099 ALARM FUNCTION ARG IS FIX BUT SHOULD BE FLOAT | |
There is no check on number nor type of MAXF arguments. | |
A maximum of 10 is safe, more will overwrite the program. | |
FORTRANSIT object program only needs few functions to be | |
present in run time PACKAGE. These are identified as | |
BUILT-IN SUBROUTINES (180 WORDS) in file pack_listing.txt | |
Any other function can be deleted from source code | |
PACKAGE (pack_src.txt) to free storage for program or data. | |
List of functions that can be removed to free drum memory: | |
SOAP Description IT number | |
label | |
E00AK FIX ** FIX 10 | |
E00AL FLOAT ** FIX 11 | |
E00LQ FLOAT ** FLOAT 302 | |
E00AB LOGF 1 | |
E00AC EXPF 2 | |
E00LO LNF 300 | |
E00LP EXPNF 301 | |
E00AV COSF 21 | |
E00AW SINF 22 | |
E00AX SQRTF 23 | |
E00AY ABSF 24 | |
E00AZ INTF 25 | |
E00BA MAXF 26 | |
If functions 10,11 are removed, the corresponding | |
** power operator with these types should not be used | |
FIX ** FLOAT or FLOAT ** FLOAT requires the presence of | |
302, 1 and 2 functions. | |
LNF requires LOGF, EXPNF requires EXPF. | |
SINF requires COSF. | |
All other functions are independent. | |
Any attempt to use a non present function will stop the | |
program with AR=90nn where nn is the IT number of function: | |
9010 ALARM FIX ** FIX UNDEF | |
9011 ALARM FLOAT ** FIX UNDEF | |
9302 ALARM FLOAT ** FLOAT UNDEF | |
9001 ALARM LOGF UNDEF | |
9002 ALARM EXPF UNDEF | |
9300 ALARM LNF UNDEF | |
9301 ALARM EXPNF UNDEF | |
9021 ALARM COSF UNDEF | |
9022 ALARM SINF UNDEF | |
9023 ALARM SQRTF UNDEF | |
9024 ALARM ABSF UNDEF | |
9025 ALARM INTF UNDEF | |
9026 ALARM MAXF UNDEF | |
The functions for power to a FIX value (10 and 11) provides | |
exact values. Raise power to FLOAT value is calculated using | |
LOGF and EXPF, that are implemented with a polynomial | |
approximation. | |
The type or a FIX**FIX is also FIX (10**I for example). This | |
means that the maximum value allowed is 999999999. If the | |
computed value of a power to fix is bigger than this maximum | |
value, the program will stop with AR=0003 (so halt 0003 occurs | |
on E00AK routine, not in E00LQ as stated in manual) | |
SQRTF square root function requires a zero or positive argument. | |
If argument is negative, program will stop with AR=0012 | |
0012 ALARM SQRT WITH NEGATIVE ARGUMENT | |
COSF and SINF function expects a float argument in radians | |
(thus cosf(pi/2) = 0, sinf(pi/2) = 0). If argument is greater | |
that 1E10, program will stop with AR=0013 | |
0013 ALARM RADIAN ARG TOO BIG | |
As FORTRANSIT uses index register for DO loop variable control | |
only values in range 0..1999 are safe for start and end loop | |
values. Any other values can be used (e.g. DO 10, I=-5,15) | |
and will compiled without warning, but the generated compiler | |
code is wrong. The construct | |
J=-5 | |
DO 10 I=J,15 | |
c do stuff | |
10 continue | |
will compile and work fine iterating but only iterates once. | |
This DO is implemented as | |
i=j | |
for(;;) { | |
// do stuff | |
if (i-15 < 0) break; | |
} | |
So DO does not support any negative initial value. | |
DO loop variable con only get vaues in | |
range 0 to 9999. For example, | |
J=10000 | |
K=15000 | |
DO 10 I=J,K | |
will iterate from 0 to 5000 (modulo 10000 on supplied values). | |
PACKAGE occupies drum address 1401 up to 1999, leaving | |
address 1 to 1400 for fortransit program and data. By deleting | |
non build in routines, the pack can be reduced to occupy | |
only locations 1780 to 1999. | |
Floating point numbers are encoded as | |
2300000049 = 0.023 | |
1000000050 = 0.1 | |
1000000051 = 1.0 | |
1500000052 = 15.0 | |