
Restoration comments May/2018
By Roberto Sancho

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


            
