The goal of the Fortran 66 committee seemed to be mostly to harmonize existing practice, and not develop the language. At that point in time, most were using some variation of IBM FORTRAN II, and moving towards their FORTRAN IV. So Fortran 66 was a large subset of FORTRAN IV.
I certainly punched cards back then, both on IBM 026 and 029 card punches. (Each with slightly different character sets than the other…) Then fed into the wonderfully fast CDC 405 card readers. IIRC, the 405 could read cards at a blindingly fast 1200 cards/minute!
There was no character data type in Fortran 66. So one had to suffer using packed Hollerith constants in integer “numeric storage units”. (Yes, one could use reals or logicals. But beware of your characters getting ‘normalized’, wierdness during comparisons, etc…) The number of characters per integer, and number of bits per character varied quite a bit. We found for best space vs portability to use 4 characters/integer. A little inefficient on machines that allowed more. E.g., the DEC-10 with 5 7-bit characters/word or the 60-bit CDC machines with 10 6-bit characters/word. On the other end of the spectrum, the PFORT guys at AT&T recommended 1 character/integer - which we considered pretty wasteful of memory. Packed characters meant that to process individual characters, non-standard bit manipulation needed to be done to unpack/repack, extract, replace, search, etc. To say the character data type in Fortran 77 was a huge improvement is an understatement!
DO loops were restricted compared to F77 and were commonly allowed to be extended in various incompatible ways. Also a related and big pain point was the restriction on subscript expressions - again commonly extended.
I/O was another big area of incompatibility. No OPEN/CLOSE/INQUIRE in Fortran 66. Remember that a lot of computers at that time didn’t even have a disk operating system. Or an operating system at all. By the time Fortran 77 was finally standardized, disk operating systems had become mainstream. Related to this was random access (access=‘direct’) I/O. FORTRAN IV had the beginnings of this, and each manufacturer had their own take. But it wasn’t standardized until Fortran 77.
Fortran 77 also gave us IF/ELSE IF/ELSE/ENDIF. But strangely, no END DO for DO loops. A Mil-spec extension was published shortly thereafter which required END DO, DO … WHILE, INCLUDE, and a set of bit manipulation intrinsics. But the Mil-spec extensions were not universally implemented until they went into Fortran 90.
One other aspect of ancient Fortran programs was that core memory was small and expensive. So larger programs often used overlaying techniques to cram more stuff into less memory. Every vendor had different ways of doing overlays. And even on a given system there might be multiple ways of doing them… And on a similar note, I remain astonished that local memory in procedures was allowed to be either static or on a stack. ALGOL 60 paved the way on this by requiring stack based allocation (and overridable via OWN). Fortran 66 should have learned that lesson. Would have saved a lot of overlaying hassle.