• position-independent code (was Re: CMS, Self-hosting and the 6502)

    From Kragen Javier Sitaker@3:633/10 to All on Friday, September 11, 2026 09:42:23
    Lynn Wheeler <lynn@garlic.com> writes:
    W/o location independence and requiring executable image to be otherwise preloaded to have address constants to be modified to their executing position ... would have required every executing program image to have
    unique address across the whole system

    I?ve never programmed the PDP-8, but, as I understand it, its 7-bit
    address field in the 12-bit instruction format effectively divides the 4096-word address space into 128-word ?pages?. An 8th bit specifies
    which page the address field is interpreted relative to: either a
    6502-like zero page, or the current page. So, in effect, you have two
    5-bit ?base registers?: one hardwired to 00000, and the other one that?s
    the high 5 bits of the program counter. (Later PDP-8s extended the
    address bus to the left and needed additional registers to select which
    12-bit memory space you were running in.)

    To reference words in other pages (again, as I understand it), you would
    store their absolute 12-bit address in a word in either the zero page or
    your current page, and set the indirection bit in your instructions to
    use that address as a pointer. But often you would receive that pointer
    at run time, for example as a return address or an argument.

    Mark Smotherman?s PDP-8 background/reference, for afc: <https://mark.people.clemson.edu/subroutines/pdp8.html>

    It occurred to me that a subroutine or set of related subroutines that
    fit into a single 128-word page could be ?position-independent? merely
    by containing no absolute 12-bit addresses when loaded. This would not
    require a PC-relative addressing mode, which would have required an
    expensive addition operation before the memory access. On a machine
    with a larger word size, you might be able to fit a whole library on
    such a ?page?, which would act more like a segment.

    On such a machine, a loader could load libraries onto whatever page it
    felt like, without requiring any of load-time relocations, globally
    unique addresses, or PC-relative addressing.

    Of course, the PDP-8 wasn?t available as an example to follow when the
    IBM 360 was being designed, and I don?t know of any pre-360 machines
    that offered such a mechanism. The LINC, in particular, had 12-bit
    instruction words and 10-bit addresses, and the address field in the
    three Full Address Class instructions (STC, ADD, and JUMP) was 10 bits, according to <https://mirrors.meulie.net/bitsavers.org/pdf/washingtonUniversity/linc/Programming_the_LINC_Second_Edition_Jan69.pdf>.

    The Data General Nova, IIRC, expanded the PDP-8?s global/current page
    bit to a two-bit fields which selected which of four base registers you
    used as the base address. Smalltalk, originally written on Xerox?s ?Alto? clone of the Nova, has a very similar structure in its bytecode???there
    are bytecodes for fetching constants, local variables, global variables,
    and instance variables of the current object, and corresponding
    bytecodes for storing (except for the constants).

    John Cowan?s 32-bit extension of the PDP-8, the PDP-8/X <https://github.com/johnwcowan/pdp8x/blob/master/arch.md>, has pages of
    2048 words instead of 128 words, as well as a BASE register to relocate
    the zero page to wherever you like and a STACK register so that the
    standard subroutine call mechanism can become reentrant. You might be
    able to do some variant of this randomly-placed-page mechanism on a
    PDP-8/X, but the potential program linkage table (for one page of code
    to find another) would be huge.

    Kragen

    --- PyGate Linux v1.5.19
    * Origin: Dragon's Lair, PyGate NNTP<>Fido Gate (3:633/10)
  • From Lynn Wheeler@3:633/10 to All on Saturday, September 12, 2026 15:12:56
    Kragen Javier Sitaker <kragen@canonical.org> writes:
    I?ve never programmed the PDP-8, but, as I understand it, its 7-bit
    address field in the 12-bit instruction format effectively divides the 4096-word address space into 128-word ?pages?. An 8th bit specifies
    which page the address field is interpreted relative to: either a
    6502-like zero page, or the current page. So, in effect, you have two
    5-bit ?base registers?: one hardwired to 00000, and the other one that?s
    the high 5 bits of the program counter. (Later PDP-8s extended the
    address bus to the left and needed additional registers to select which 12-bit memory space you were running in.)

    OS/360 compilers generated TXT decks that had RLD (relocation directory) unresolved addresses for other programs that were being loaded in one
    large group (their "ESD" entry, the ID of program being referenced and displacement within the program). The "loader" would resolve the "fixed" desired addresses (from combination of ESD and displacement) before execution.

    CP67/CMS adopted OS/360 compilers (and later VM370/CMS the OS/370
    compilers).

    By comparison TSS/360 kept an external map for each virtual address
    space .... where its programs were loaded. Issue was initially virtual
    address space was 16 1mbyte virtual address segments. Somebody might 1st
    load the fortran compiler into its segment one and somebody else might
    have first loaded something else into segment one and then also wanted
    to load the ("same") fortran compiler image into its virtual address
    space.

    The OS/360 paradigm wouldn't support it ... it needed either

    1) a different copy of the fortran compiler image loaded, if it was to
    run at different address or

    2) had a predefined location for every application in the system (in
    order to have virtual address space to have a single shared application
    image). With only 16 shared segments, would only be able to have 16
    locations for predefined "shared image" application copies.


    --
    virtualization experience starting Jan1968, online at home since Mar1970

    --- PyGate Linux v1.5.19
    * Origin: Dragon's Lair, PyGate NNTP<>Fido Gate (3:633/10)
  • From John Levine@3:633/10 to All on Sunday, September 13, 2026 01:54:08
    According to Kragen Javier Sitaker <kragen@canonical.org>:
    I?ve never programmed the PDP-8, but, as I understand it, its 7-bit
    address field in the 12-bit instruction format effectively divides the >4096-word address space into 128-word ?pages?. An 8th bit specifies
    which page the address field is interpreted relative to: either a
    6502-like zero page, or the current page. So, in effect, you have two
    5-bit ?base registers?: one hardwired to 00000, and the other one that?s
    the high 5 bits of the program counter. (Later PDP-8s extended the
    address bus to the left and needed additional registers to select which >12-bit memory space you were running in.)

    Actually, the original PDP-8 had the extended addressing as an option,
    adding a pair of three-bit bank registers.

    To reference words in other pages (again, as I understand it), you would >store their absolute 12-bit address in a word in either the zero page or
    your current page, and set the indirection bit in your instructions to
    use that address as a pointer. But often you would receive that pointer
    at run time, for example as a return address or an argument.

    Yup.

    It occurred to me that a subroutine or set of related subroutines that
    fit into a single 128-word page could be ?position-independent? merely
    by containing no absolute 12-bit addresses when loaded. ...

    That's true, but I never heard of anyone doing that. PDP-8 software was
    pretty simple and something that swapped 128 word chunks of code could
    have worked but would be way more complicated than anything I saw. TSS/8 swapped full 4K memory banks.

    --
    Regards,
    John Levine, johnl@taugh.com, Primary Perpetrator of "The Internet for Dummies",
    Please consider the environment before reading this e-mail. https://jl.ly

    --- PyGate Linux v1.5.19
    * Origin: Dragon's Lair, PyGate NNTP<>Fido Gate (3:633/10)
  • From John Levine@3:633/10 to All on Sunday, September 13, 2026 01:57:54
    According to Lynn Wheeler <lynn@garlic.com>:
    By comparison TSS/360 kept an external map for each virtual address
    space .... where its programs were loaded. Issue was initially virtual >address space was 16 1mbyte virtual address segments. Somebody might 1st
    load the fortran compiler into its segment one and somebody else might
    have first loaded something else into segment one and then also wanted
    to load the ("same") fortran compiler image into its virtual address
    space.

    The OS/360 paradigm wouldn't support it ... it needed either

    1) a different copy of the fortran compiler image loaded, if it was to
    run at different address or

    2) had a predefined location for every application in the system (in
    order to have virtual address space to have a single shared application >image). With only 16 shared segments, would only be able to have 16 >locations for predefined "shared image" application copies.

    What TSS actually did was to divide each module into position independent read-only CSECTs and relocatable read-write PSECTs, and extend the calling sequence so each routine had a pair of addresses, the code address in its
    CSECT and the base of its data PSECT. So all of the CSECT pages were
    shared, and the PSECT pages had a separate copy in each process.

    See my book for more details.

    --
    Regards,
    John Levine, johnl@taugh.com, Primary Perpetrator of "The Internet for Dummies",
    Please consider the environment before reading this e-mail. https://jl.ly

    --- PyGate Linux v1.5.19
    * Origin: Dragon's Lair, PyGate NNTP<>Fido Gate (3:633/10)
  • From Peter Flass@3:633/10 to All on Saturday, September 12, 2026 21:14:26
    On 9/12/26 18:57, John Levine wrote:
    According to Lynn Wheeler <lynn@garlic.com>:
    By comparison TSS/360 kept an external map for each virtual address
    space .... where its programs were loaded. Issue was initially virtual
    address space was 16 1mbyte virtual address segments. Somebody might 1st
    load the fortran compiler into its segment one and somebody else might
    have first loaded something else into segment one and then also wanted
    to load the ("same") fortran compiler image into its virtual address
    space.

    The OS/360 paradigm wouldn't support it ... it needed either

    1) a different copy of the fortran compiler image loaded, if it was to
    run at different address or

    2) had a predefined location for every application in the system (in
    order to have virtual address space to have a single shared application
    image). With only 16 shared segments, would only be able to have 16
    locations for predefined "shared image" application copies.

    What TSS actually did was to divide each module into position independent read-only CSECTs and relocatable read-write PSECTs, and extend the calling sequence so each routine had a pair of addresses, the code address in its CSECT and the base of its data PSECT. So all of the CSECT pages were
    shared, and the PSECT pages had a separate copy in each process.

    See my book for more details.


    I was going to say something, but I couldn't remember exactly how this
    worked. Unfortunately none of the TSS compilers have source available.

    --- PyGate Linux v1.5.19
    * Origin: Dragon's Lair, PyGate NNTP<>Fido Gate (3:633/10)
  • From James Dow Allen@3:633/10 to All on Sunday, September 13, 2026 07:31:36

    Lynn Wheeler <lynn@garlic.com> posted:

    OS/360 compilers generated TXT decks that had RLD (relocation directory) unresolved addresses for other programs that were being loaded in one
    large group (their "ESD" entry, the ID of program being referenced and displacement within the program). The "loader" would resolve the "fixed" desired addresses (from combination of ESD and displacement) before execution.

    It was half a century ago that I handled physical TXT card decks.
    All my programs were standalone: Slap a "six-card loader" at the front of
    the TXT deck, and IPL.

    The source code for my programs always started with
    USING *,0
    Did that suppress any RLDs? Don't remember. The six-card loader ignored
    RLDs anyway. Actually -- never one to overlook a pointless micro-
    optimization -- I "optimized" down to a three-card loader, good enough if
    the TXT deck had no REP (hexadecimal patch) cards.

    - - - - - - - - - - - -

    Speaking of virtual vs physical addresses, was there any IBM operating system which could map one physical address to two different virtual addresses,
    both visible from the same address space? If so, such a program MIGHT encounter an unusually weird bug on the 370/135. See
    https://james.fabpedigree.com/sbe135.htm

    Cheers,
    James






    --- PyGate Linux v1.5.19
    * Origin: Dragon's Lair, PyGate NNTP<>Fido Gate (3:633/10)
  • From Peter Flass@3:633/10 to All on Sunday, September 13, 2026 07:45:18
    On 9/13/26 00:31, James Dow Allen wrote:

    Lynn Wheeler <lynn@garlic.com> posted:

    OS/360 compilers generated TXT decks that had RLD (relocation directory)
    unresolved addresses for other programs that were being loaded in one
    large group (their "ESD" entry, the ID of program being referenced and
    displacement within the program). The "loader" would resolve the "fixed"
    desired addresses (from combination of ESD and displacement) before execution.

    It was half a century ago that I handled physical TXT card decks.
    All my programs were standalone: Slap a "six-card loader" at the front of the TXT deck, and IPL.

    The source code for my programs always started with
    USING *,0
    Did that suppress any RLDs? Don't remember. The six-card loader ignored RLDs anyway. Actually -- never one to overlook a pointless micro- optimization -- I "optimized" down to a three-card loader, good enough if
    the TXT deck had no REP (hexadecimal patch) cards.

    I also wrote my own three-card loader, although I didn't have physical
    cards. I think I assembled it and stripped what I didn't need, although
    it's been quite a few years, I believe the USING *,0 here would just be comments, since it was the default, and did nothing about RLDs. The RLDs
    just relocated relative to location zero, so if you loaded at zero they
    did nothing, and the absolute loader would just ignore them if present.

    I keypunched Stuart Madnick's toy OS, and used the loader to boot it.


    - - - - - - - - - - - -

    Speaking of virtual vs physical addresses, was there any IBM operating system which could map one physical address to two different virtual addresses,
    both visible from the same address space? If so, such a program MIGHT encounter an unusually weird bug on the 370/135. See
    https://james.fabpedigree.com/sbe135.htm

    Cheers,
    James

    TSS, as has been mentioned (which I don't think ran, or ever was run on
    a /135). John Levine has mentioned TSS relocation briefly. Without
    analyzing it in detail I believe it was basically the same scheme as
    used for Linux PIC.


    --- PyGate Linux v1.5.19
    * Origin: Dragon's Lair, PyGate NNTP<>Fido Gate (3:633/10)
  • From John Levine@3:633/10 to All on Sunday, September 13, 2026 16:50:23
    According to Peter Flass <Peter@Iron-Spring.com>:
    TSS, as has been mentioned (which I don't think ran, or ever was run on
    a /135).

    Probably not, it'd be rather underpowered and I gather the only customer
    for TSS/370 was Bell Labs using it as a platform for ESS development.

    John Levine has mentioned TSS relocation briefly. Without
    analyzing it in detail I believe it was basically the same scheme as
    used for Linux PIC.

    Sort of. TSS didn't have anything like the GOT which has pointers to
    data in othe libraries, nor the PLT which let them keep using a single
    pointer to a routine.

    You probably won't be surprised to hear that's in my book too.




    --
    Regards,
    John Levine, johnl@taugh.com, Primary Perpetrator of "The Internet for Dummies",
    Please consider the environment before reading this e-mail. https://jl.ly

    --- PyGate Linux v1.5.19
    * Origin: Dragon's Lair, PyGate NNTP<>Fido Gate (3:633/10)
  • From Kragen Javier Sitaker@3:633/10 to All on Sunday, September 13, 2026 14:53:00
    John Levine <johnl@taugh.com> writes:
    According to Kragen Javier Sitaker <kragen@canonical.org>:
    [...] (Later PDP-8s extended the address bus to the left and needed >>additional registers to select which 12-bit memory space you were
    running in.)

    Actually, the original PDP-8 had the extended addressing as an option,
    adding a pair of three-bit bank registers.

    I appreciate the correction. So it wasn?t so much ?later PDP-8s? as it
    was ?higher-end PDP-8s??

    It occurred to me that a subroutine or set of related subroutines that
    fit into a single 128-word page could be ?position-independent? merely
    by containing no absolute 12-bit addresses when loaded. ...

    That's true, but I never heard of anyone doing that. PDP-8 software was pretty simple and something that swapped 128 word chunks of code could
    have worked but would be way more complicated than anything I saw. TSS/8 swapped full 4K memory banks.

    Yes, I think it would be hard to justify such a thing when you had 4096 instructions for your whole program. I think there?s probably some
    middle ground of CPU sizes, maybe something roughly Nova-sized, where
    such a semi-position-independent scheme would have been a good tradeoff,
    where you had room for tens or hundreds of thousands of instructions
    rather than single-digit thousands like the -8. That would have allowed
    you to avoid *both* a slow load-time relocation pass *and* the adder
    necessary to offset all memory accesses by a base register, like most
    PDP-11s ended up having.

    And, once you have room for millions of instructions, you can probably
    afford the adder.

    The 8086 did achieve such a sort of semi-position-independence with its 4-bit-shifted ?segment? registers, which weren?t really segments in the
    usual sense, like the PDP-11 had, but it had to pay for a 16-bit wide
    add on every memory access to get it. The result was that a 64-kibibyte segment could be located anywhere in RAM, down to 16-byte granularity,
    and MS-DOS took advantage of this in practice. I suspect that a larger
    shift, like 8 bits, would have been more advantageous by the mid-80s,
    but you don?t avoid the adder unless you?re swapping full 64-kibibyte
    memory banks, TSS/8-style.

    kragen

    --- PyGate Linux v1.5.19
    * Origin: Dragon's Lair, PyGate NNTP<>Fido Gate (3:633/10)
  • From John Levine@3:633/10 to All on Sunday, September 13, 2026 22:18:30
    According to Kragen Javier Sitaker <kragen@canonical.org>:
    Actually, the original PDP-8 had the extended addressing as an option,
    adding a pair of three-bit bank registers.

    I appreciate the correction. So it wasn?t so much ?later PDP-8s? as it
    was ?higher-end PDP-8s??

    Right. Later PDP-8s were not much faster than the original -8 but were
    cheaper and smaller and made formerly optional stuff standard.

    The 8086 did achieve such a sort of semi-position-independence with its >4-bit-shifted ?segment? registers, which weren?t really segments in the
    usual sense, like the PDP-11 had, but it had to pay for a 16-bit wide
    add on every memory access to get it. The result was that a 64-kibibyte >segment could be located anywhere in RAM, down to 16-byte granularity,
    and MS-DOS took advantage of this in practice.

    Sure did. I wasted way too much time futzing with medium model C code.

    I suspect that a larger
    shift, like 8 bits, would have been more advantageous by the mid-80s,

    The 286 had real segments of up to 64K each, but changing the segment
    register was so slow that we avoided doing so if at all possible.

    --
    Regards,
    John Levine, johnl@taugh.com, Primary Perpetrator of "The Internet for Dummies",
    Please consider the environment before reading this e-mail. https://jl.ly

    --- PyGate Linux v1.5.19
    * Origin: Dragon's Lair, PyGate NNTP<>Fido Gate (3:633/10)
  • From Peter Flass@3:633/10 to All on Sunday, September 13, 2026 16:18:00
    On 9/13/26 09:50, John Levine wrote:
    According to Peter Flass <Peter@Iron-Spring.com>:
    TSS, as has been mentioned (which I don't think ran, or ever was run on
    a /135).

    Probably not, it'd be rather underpowered and I gather the only customer
    for TSS/370 was Bell Labs using it as a platform for ESS development.

    John Levine has mentioned TSS relocation briefly. Without
    analyzing it in detail I believe it was basically the same scheme as
    used for Linux PIC.

    Sort of. TSS didn't have anything like the GOT which has pointers to
    data in othe libraries, nor the PLT which let them keep using a single pointer to a routine.

    You probably won't be surprised to hear that's in my book too.


    Probably not. I have a copy of your book sitting on a shelf in my
    office. I'm not familiar enough with anyone's PIC to comment.


    --- PyGate Linux v1.5.19
    * Origin: Dragon's Lair, PyGate NNTP<>Fido Gate (3:633/10)
  • From Peter Flass@3:633/10 to All on Sunday, September 13, 2026 16:24:37
    On 9/13/26 10:53, Kragen Javier Sitaker wrote:
    John Levine <johnl@taugh.com> writes:
    According to Kragen Javier Sitaker <kragen@canonical.org>:
    [...] (Later PDP-8s extended the address bus to the left and needed
    additional registers to select which 12-bit memory space you were
    running in.)

    Actually, the original PDP-8 had the extended addressing as an option,
    adding a pair of three-bit bank registers.

    I appreciate the correction. So it wasn?t so much ?later PDP-8s? as it
    was ?higher-end PDP-8s??

    Was there actually such a thing?


    It occurred to me that a subroutine or set of related subroutines that
    fit into a single 128-word page could be ?position-independent? merely
    by containing no absolute 12-bit addresses when loaded. ...

    That's true, but I never heard of anyone doing that. PDP-8 software was
    pretty simple and something that swapped 128 word chunks of code could
    have worked but would be way more complicated than anything I saw. TSS/8
    swapped full 4K memory banks.

    Yes, I think it would be hard to justify such a thing when you had 4096 instructions for your whole program. I think there?s probably some
    middle ground of CPU sizes, maybe something roughly Nova-sized, where
    such a semi-position-independent scheme would have been a good tradeoff, where you had room for tens or hundreds of thousands of instructions
    rather than single-digit thousands like the -8. That would have allowed
    you to avoid *both* a slow load-time relocation pass *and* the adder necessary to offset all memory accesses by a base register, like most
    PDP-11s ended up having.

    And, once you have room for millions of instructions, you can probably
    afford the adder.

    The 8086 did achieve such a sort of semi-position-independence with its 4-bit-shifted ?segment? registers, which weren?t really segments in the
    usual sense, like the PDP-11 had, but it had to pay for a 16-bit wide
    add on every memory access to get it. The result was that a 64-kibibyte segment could be located anywhere in RAM, down to 16-byte granularity,
    and MS-DOS took advantage of this in practice. I suspect that a larger shift, like 8 bits, would have been more advantageous by the mid-80s,
    but you don?t avoid the adder unless you?re swapping full 64-kibibyte
    memory banks, TSS/8-style.


    808x segments were the worst of all possible worlds. I still can't wrap
    my head around the fact that there were multiple ways of encoding the
    same address.


    --- PyGate Linux v1.5.19
    * Origin: Dragon's Lair, PyGate NNTP<>Fido Gate (3:633/10)
  • From Lawrence D?Oliveiro@3:633/10 to All on Monday, September 14, 2026 01:51:02
    On Sun, 13 Sep 2026 16:24:37 -0700, Peter Flass wrote:

    808x segments were the worst of all possible worlds. I still can't
    wrap my head around the fact that there were multiple ways of
    encoding the same address.

    I can think of something worse: Z8000 segmentation. An address
    consisted of 32 bits, but the only significant bits were the bottom 16
    plus some more in another part near the top.

    --- PyGate Linux v1.5.19
    * Origin: Dragon's Lair, PyGate NNTP<>Fido Gate (3:633/10)
  • From Scott Lurndal@3:633/10 to All on Monday, September 14, 2026 14:53:01
    Kragen Javier Sitaker <kragen@canonical.org> writes:
    John Levine <johnl@taugh.com> writes:
    According to Kragen Javier Sitaker <kragen@canonical.org>:
    [...] (Later PDP-8s extended the address bus to the left and needed >>>additional registers to select which 12-bit memory space you were
    running in.)

    Actually, the original PDP-8 had the extended addressing as an option,
    adding a pair of three-bit bank registers.

    I appreciate the correction. So it wasn?t so much ?later PDP-8s? as it
    was ?higher-end PDP-8s??

    It occurred to me that a subroutine or set of related subroutines that >>>fit into a single 128-word page could be ?position-independent? merely
    by containing no absolute 12-bit addresses when loaded. ...

    That's true, but I never heard of anyone doing that. PDP-8 software was
    pretty simple and something that swapped 128 word chunks of code could
    have worked but would be way more complicated than anything I saw. TSS/8
    swapped full 4K memory banks.

    Yes, I think it would be hard to justify such a thing when you had 4096 >instructions for your whole program.

    A program had 4096 memory locations - a significant fraction of that
    was data, not instructions.

    Running under TSS8, a program was limited to a single 4k field. Under
    OS/8, the application was allowed use multiple 4k fields (up to 7,
    IIRC).

    --- PyGate Linux v1.5.19
    * Origin: Dragon's Lair, PyGate NNTP<>Fido Gate (3:633/10)
  • From Lynn Wheeler@3:633/10 to All on Monday, September 14, 2026 14:41:47

    James Dow Allen <user4353@newsgrouper.org.invalid> writes:
    It was half a century ago that I handled physical TXT card decks.
    All my programs were standalone: Slap a "six-card loader" at the front of the TXT deck, and IPL.

    The source code for my programs always started with
    USING *,0
    Did that suppress any RLDs? Don't remember. The six-card loader ignored RLDs anyway. Actually -- never one to overlook a pointless micro- optimization -- I "optimized" down to a three-card loader, good enough if
    the TXT deck had no REP (hexadecimal patch) cards.

    I had taken two credit hr intro to Fortran/Computers. At the end of
    semester was hired to rewrite 1401 MPIO in 360 assembler for 360/30
    (64kbyte memory and 2311s). Univ was getting 360/67 for tss/360
    replacing 709/1401 (709 tape->tape, 1401 unit record frontend) and got
    360/30 temporarily replacing 1401 pending arrival of 360/67.

    The univ. shutdown the datacenter on weekends and I would have the place dedicated. They gave a bunch of hardware and software manuals and I got
    to design and implement my own monitor, device drivers, interrupt
    handlers, storage management, error recovery, etc ... and within a few
    weeks I had a 2000 card assembler program. I didn't know about rep
    cards, so learned to read TXT deck cards, duplicate cards, and
    multi-punch hex patches.

    Univ. 360/67 arrived within year of taking intro class and I was hired
    fulltime responsible for OS/360 (768kbte memory and 2314s; TSS/360 not
    coming to production, so ran as 360/65). 709 did student fortran in less
    than second. 360/67 (as 360/65) os/360 (MFT9.5) took over a minute, I
    install HASP cutting time in half. MFT11, I start redoing SYSGEN STAGE2
    to carefully place datasets and PDS members to optimize arm seek and
    (PDS directory) multi-track search, cutting another 2/3rds to
    12.9secs. OS/360 never got better than 709 until I install Univ Waterloo WATFOR; as 360/65, WATFOR clocked at 20,000 statements/min (333 statements/sec), student fortran tended to run 30-60 statements.

    Then IBM CSC came out to install (virtual machine, precursor to vm370)
    CP/67 (3rd after CSC itself and MIT Lincoln Labs) and I mostly get to
    play with it during my weekend 48hr window. I then spend a few months
    rewriting pathlengths for running OS/360 in virtual machine. Source was
    in OS/360 files which had to be modified, assembled, mark txt deck and
    merge it into a tray of txt decks (that was CP67 executable). BPS loader
    IPL the tray of TXT decks which then writes core image to disk, for
    ipl'ing the system.

    Bare machine test ran 322secs ... initially 856secs (CP67 CPU
    534secs). After a few months I had CP67 CPU down from 534secs to
    113secs. I then start rewriting the dispatcher/scheduler , (dynamic
    adaptive resource manager/default fair share scheduling policy), paging,
    adding ordered seek queuing (from FIFO) and mutli-page transfer channel programs (from FIFO and optimized for transfers/revolution, getting 2301
    paging drum from 70-80 4k transfers/sec to channel transfer peak of
    270). Six months after univ initial CP/67 install, CSC was giving one
    week class in LA. I arrive on Sunday afternoon and asked to teach the
    class, it turns out that the people that were going to teach it had
    resigned the Friday before to join one of the 60s CSC CP67 online
    commercial spin-offs (one offered Mathematica RAMIS, when RAMIS was also offered to TYMSHARE, they did Nomad, then some former Mathematica do
    FOCUS at Information Builders)

    Before I graduate, I'm hired fulltime into small group in Boeing CFO
    office to help with formation of Boeing Computer Services (consolidate
    all dataprocessing into independent business unit). I think Renton,
    largest datacenter in the world, 360/65s arriving faster than they could
    be installed, boxes constantly staged in hallways around machine room
    (did have lone 360/75, when doing classified work; black rope around
    area, guards at corners, heavy black felt covering console lights and
    visible 1403 printer areas). Lots of politics between Renton director
    and CFO, who only had a 360/30 up at Boeing Field for payroll, although
    they enlarge the room to install 360/67 for me to play with when I
    wasn't doing other stuff. I had mid-level management badge so could park
    in lots closer to the bldgs.

    747-3 was flying skies of Seattle getting FAA flt certification. Tours
    of mock-up of 747 cabin just south of Boeing field would claim 747s
    carried so many passengers, they would never be serviced with fewer than
    four jetways. Both Boeing and IBM told stories about 360 announcement
    day, Boeing submitted an order making the IBM marketing rep, highest
    paid IBM employee that year. Sales were still straight commission; IBM
    shifts to quota the following year.

    At Boeing I modified CP67 to support portions as pageable
    kernel. Problem was adding more CSECTs (dividing pageable kernel into 4k segments). Problem was I ran into BPS loader had 255 csect limit ...
    and I was constantly doing hacks to keep the pageable kernel within 255
    limit.

    When I graduated, I joined CSC (instead of staying with Boeing CFO) and
    one of my hobbies was enhanced production operating systems for internal datacenters (one of the first was the branch office online
    sales&marketing support HONE was one of the 1st & long time customers).

    CSC had several card drawer cabinets up on the 9th flr attic ... and
    prowling through them found source for BPS loader, and modified it to
    double the maximem csects ... greatly simplifying pageable kernel
    (wasn't released to customers, but picked up for VM370 follow-on).

    Co-worker was responsible for CP67-based scientific centers wide-area
    network. He had three "PUNCH" statements at front of the network
    assembler source ... that punched hex for a 3card loader. This morphs
    into the internal corporate network (larger than arpanet/internet from
    the beginning until sometime mid/late 80s, about the time it was forced
    to convert to SNA/VTAM).

    Some of the MIT CTSS/7094 had gone to the 5th flr to do MULTICS and
    others went to the scientific center on the 4th flr and done virtual
    machines, networking, invented GML 1969 (morphs into SGML a decade
    later, after another decade morphs into HTML at CERN), etc

    Looking at what they were doing for MULTICS on the 5th flr, I created page-mapped filesystem for CP67/CMS ... want to be able to just map
    virtual memory addresses to pages on disk (w/o having to preload them
    for the loader could modify the addresses) and support location
    independent R/O shared (executable) files ... which I later migrate to VM370/CMS.

    For VM370R3, there is a very small subset released as DCSS, extending
    shared segment to more than kernel supported with more than just the IPL command.

    --
    virtualization experience starting Jan1968, online at home since Mar1970

    --- PyGate Linux v1.5.19
    * Origin: Dragon's Lair, PyGate NNTP<>Fido Gate (3:633/10)
  • From Lawrence D?Oliveiro@3:633/10 to All on Tuesday, September 15, 2026 04:21:25
    On Sun, 13 Sep 2026 07:45:18 -0700, Peter Flass wrote:

    Without analyzing it in detail I believe it was basically the same
    scheme as used for Linux PIC.

    Linux distros commonly use ELF for their userland executable/linkable
    format these days. That originally came from AT&T, I believe.

    --- PyGate Linux v1.5.19
    * Origin: Dragon's Lair, PyGate NNTP<>Fido Gate (3:633/10)
  • From Scott Lurndal@3:633/10 to All on Tuesday, September 15, 2026 14:33:11
    Lawrence =?iso-8859-13?q?D=FFOliveiro?= <ldo@nz.invalid> writes:
    On Sun, 13 Sep 2026 07:45:18 -0700, Peter Flass wrote:

    Without analyzing it in detail I believe it was basically the same
    scheme as used for Linux PIC.

    Linux distros commonly use ELF for their userland executable/linkable
    format these days. That originally came from AT&T, I believe.


    USL[*], when SVR4 was being developed, was a distinct entity.

    [*] Unix System Laboratories, partially owned by AT&T.

    --- PyGate Linux v1.5.19
    * Origin: Dragon's Lair, PyGate NNTP<>Fido Gate (3:633/10)
  • From Peter Flass@3:633/10 to All on Tuesday, September 15, 2026 07:37:29
    On 9/14/26 21:21, Lawrence D?Oliveiro wrote:
    On Sun, 13 Sep 2026 07:45:18 -0700, Peter Flass wrote:

    Without analyzing it in detail I believe it was basically the same
    scheme as used for Linux PIC.

    Linux distros commonly use ELF for their userland executable/linkable
    format these days. That originally came from AT&T, I believe.

    That's only the wrapper. I was thinking about the underlying mechanism.

    --- PyGate Linux v1.5.19
    * Origin: Dragon's Lair, PyGate NNTP<>Fido Gate (3:633/10)
  • From Lawrence D?Oliveiro@3:633/10 to All on Tuesday, September 15, 2026 23:35:48
    On Tue, 15 Sep 2026 07:37:29 -0700, Peter Flass wrote:

    On 9/14/26 21:21, Lawrence D?Oliveiro wrote:

    On Sun, 13 Sep 2026 07:45:18 -0700, Peter Flass wrote:

    Without analyzing it in detail I believe it was basically the same
    scheme as used for Linux PIC.

    Linux distros commonly use ELF for their userland
    executable/linkable format these days. That originally came from
    AT&T, I believe.

    That's only the wrapper. I was thinking about the underlying
    mechanism.

    ld.so?

    --- PyGate Linux v1.5.19
    * Origin: Dragon's Lair, PyGate NNTP<>Fido Gate (3:633/10)