Modula-2 (Hamburg VAX-11 Modula-2 V3.2) for OpenVMS VAX 7.3 -- kit, 12-OCT-2026 ================================================================================ Douglas P. Fields, Jr. (symbolics@lisp.engineer) The VAX-11 Modula-2 compiler of the DBPL research project of the University of Hamburg (version 3.2, compiler banner "VAX-11 Modula-2 V3.2-25"), with its run-time library, the foreign definition modules for the VMS system services, RMS, the run-time library and SMG, a pretty printer, an EBNF tool, the user guide and examples, as a BACKUP saveset with a DCL installer and a DCL uninstaller. The compiler is written in Modula-2 and compiles itself. The target machine needs no compiler of any kind: only LINK and BACKUP, which every OpenVMS VAX has. Nothing in the Hamburg sources was changed. What is ours is the installer, the uninstaller, the setup procedure, the one-line change to the MODULA command definition, the examples and the tools. Section 3 says whose is what, and what the licence situation is. 1. FILES MODULA2_VAX_20261011.BCK The kit: 2,903,040 bytes, 271 entries (267 files and the directory files), 4,855 blocks installed. MODULA2_INSTALL.COM Installer. MODULA2_UNINSTALL.COM Uninstaller. MODULA2_VAX_20261011_LIST.LIS BACKUP/LIST of the saveset: every file, with size and date. modula2-3.2-openvms-vax-source-kit-20261011.zip The Hamburg V3.2 text sources as shipped, their provenance and hashes, our patch, the build procedures, the host tools, the installer sources and the recipe to recreate the kit from scratch. modula2-3.2-openvms-vax-examples-20261011.zip Eight example programs and their tests, with expected output. SHA256SUMS.TXT SHA-256 of every file above. README.TXT This file. You need the saveset and the two procedures. 2. REQUIREMENTS * OpenVMS VAX V7.3. (Tested on nothing else.) * SYSTEM, or another account with SYSPRV, to install or uninstall. * The system disk: the kit installs to SYS$COMMON:[SYSLIB.MODULA2...] and nowhere else. About 12,500 blocks must be free while installing (the saveset, 5,670 blocks, plus the 4,855 blocks of the tree plus cluster rounding; 12,240 blocks were used on a VAXstation 4000/96 with the saveset still present). The installer does not check free space. Nothing system-wide is changed: no startup file, SYLOGIN, DCLTABLES, system logical name, installed image, UAF record or quota -- and not STARLET: the 1989 VMSINSTAL kit of this compiler inserts its run-time library into STARLET; this kit keeps its own MODULA.OLB. 3. LICENCE AND PROVENANCE -- PLEASE READ The compiler, run-time library, definition modules, documents and tools in this kit are the work of the DBPL (Database Programming Languages) research project, Fachbereich Informatik, Universitaet Hamburg -- J. W. Schmidt; J. Koch, M. Mall, P. Putfarken, H. Eckhardt -- after the Modula-2 compiler of N. Wirth's group at ETH Zuerich, supported by the Deutsche Forschungsgemeinschaft (DFG, grant Schm 450/2-1). THE MEDIA STATE NO LICENCE. The files carry the authors' names and the grant, and nothing else. The software has circulated freely for decades (the bitsavers.org archive carries the 1983 V3.1 tape image; the DECUS VAX SIG library carried V3.2), and the project's own page once said the VAX/VMS systems were available on request, but that is not a licence. I publish the kit with full attribution, unmodified, as a non-commercial preservation effort. I am asking the University of Hamburg for permission. If you are entitled to speak for the copyright holders and object, write to me and I will take it down. Where the sources came from, with SHA-256 sums of every archive, is in the source kit (sources/README.md, sources/ARCHIVES.SHA256). What is mine (Douglas P. Fields, Jr.): MODULA2_INSTALL.COM, MODULA2_UNINSTALL.COM, MODULA2_SETUP.COM, the "image" line and the batch default of MODULA.CLD (sources/patches/MODULA.CLD.DIFF), RUN_TESTS.COM, the examples, the build procedures and the Python tools. The three Python tools are in the public domain (CC0). 4. INSTALLING 1. Copy the saveset and both .COM files into one directory on the system disk of the VAX. TRANSFER MODES MATTER. Send the .BCK saveset in BINARY. Send the .COM files as TEXT (FTP "ascii"). A procedure sent in binary arrives as 512-byte fixed records and DCL refuses it (%RMS-W-RTB). 2. A binary transfer loses the saveset's record attributes (FTP leaves it as fixed 512-byte records, RCP as Stream_LF). The installer puts them back itself: $ SET FILE/ATTRIBUTE=(RFM:FIX,LRL:32256,MRS:32256,RAT:NONE) - MODULA2_VAX_20261011.BCK (do it first yourself if you want to BACKUP/LIST the saveset). 3. As SYSTEM, in that directory: $ @MODULA2_INSTALL or, over an existing installation of this kit: $ @MODULA2_INSTALL "" REPLACE The installer checks privilege and the saveset, restores the tree with BACKUP/VERIFY through a concealed root, sets owner and protection, writes a manifest of every file it installed (MODULA2_MANIFEST.LIS in the top directory) and runs a smoke test in a subprocess (compile, link and run a program), which ends: MODULA2_INSTALL: 267 files, 4855 blocks restored (...) MODULA2_INSTALL: smoke test passed (compile, link, run) It took 8.5 seconds on a simulated MicroVAX 3900 and 30 seconds on a VAXstation 4000/96. It refuses, changing nothing, without SYSPRV, for a missing saveset, or if the tree exists and REPLACE was not given. 4. Each user, at the prompt or in LOGIN.COM: $ @SYS$COMMON:[SYSLIB.MODULA2]MODULA2_SETUP $ MODULA HELLO ! HELLO.MOD -> HELLO.OBJ $ LINK HELLO $ RUN HELLO MODULA2_SETUP defines MOD$SYSTEM, the MODULA command, the foreign commands PRETTY and EBNF, the first free LNK$LIBRARY (so a plain LINK finds the run-time library) and M2HELP, for that process only. Compile a definition module (MODULA X.DEF makes X.SYM) before the modules that import it, then link the main module first: LINK MAIN,X,Y. Use /NOLIST in a batch job: the compiler's default of /LIST there crashes with an integer divide by zero (the MODULA command of this kit does not default to it). Reserved words and standard names are upper case, identifiers are case sensitive, and the first nine characters of a module name are its file name. 5. UNINSTALLING As SYSTEM, in the directory holding MODULA2_UNINSTALL.COM: $ @MODULA2_UNINSTALL CHECK ! report only, changes nothing $ @MODULA2_UNINSTALL ! remove Modula-2 It deletes only files the manifest lists, one explicit file;version at a time, and only if each still has the size and revision date it was installed with; then the directories left empty, then the manifest. Anything else in the tree stays and is listed ("kept (changed)", "kept (not empty)"): files you changed, programs you added. The exit status is 4 if anything was kept. It refuses, changing nothing, if the manifest is missing or damaged. A second run says "not installed". Tested many times on a simulator (the lifecycle test of section 9), and on a VAXstation 4000/96: CHECK found "would remove 267 files, keep 0, 0 already missing". 6. CHECKING THE INSTALLATION As an ordinary user, after MODULA2_SETUP: $ @SYS$COMMON:[SYSLIB.MODULA2.EXAMPLES]RUN_TESTS builds each of eight programs in [.M2TEST] under your login directory, runs it, and compares its output with an expected file made by independent Python code. It ends "PASS 8 of 8" (2.9 seconds on the simulator, 13 seconds on the VAXstation 4000/96). The examples are also in modula2-3.2-openvms-vax-examples-20261011.zip, with their README. Key built file (SHA-256, the compiler built by itself, stage 3 of the recipe; 180,224 bytes): 83e6cd71aa225a8043145bb12afe52459addfde7598421a56ef63d8d0532eab6 MODULA.EXE 7. WHAT IS DIFFERENT FROM THE DISTRIBUTION * No source file is changed: the .DEF, .MOD, .MAR, .MSG and documents are those of the DECUS V3.2 saveset, byte for byte. * MODULA.CLD: the image is MOD$SYSTEM:MODULA (the DECUS kit has SYS$SYSTEM:MODULA), and /LIST is not the default in a batch job. * The library and compiler modules were compiled with /NOCHECK (a command flag): InOut.WriteText relies on unchecked CARDINAL arithmetic (n-LEN(s)+1) and with range checks WriteCard(c, 0) raises %MODULA-F-SUBVALERR. The shipped object code behaved that way. * The compiler was compiled by the shipped compiler (stage 1), and that result by itself twice (stages 2 and 3); the kit holds stage 3. The three stages are the same program: the linked images differ only in the image header (8 and 6 bytes, link date and time). * The run-time library MODULA.OLB is private, found through LNK$LIBRARY; STARLET is not modified. * MODULA.HLB is made from the shipped MODULA.HLP. HELP MODULA does not find it from HLP$LIBRARY_n on 7.3; use M2HELP MODULA. 8. KNOWN LIMITS * Files made with DCL OPEN/WRITE are VFC records with print carriage control, and the compiler reads the two header bytes of each record as source text. Edit with a real editor, or CONVERT them. * LINK says %LINK-E-ENTIDMTCH when an object was compiled against a different version of an imported symbol file: recompile the importers after recompiling a definition module. * Modula-2 of 1983-1989: no ISO Modula-2 (1996) features. VAX code only. * Terminal and batch only. SMG, DEBUG with Modula-2 symbols, /MACHINE_CODE and /CROSS_REFERENCE output were run but not studied. * Not tried on Alpha or Itanium. 9. HOW IT WAS BUILT AND TESTED Built on a simulated MicroVAX 3900 (Open SIMH) running OpenVMS VAX V7.3, from the DECUS VAX SIG library kit MODULA032 (modula32.zip, 1989), with the V3.1 tape image of bitsavers.org as a baseline. Everything in the recipe, from the shipped objects to an installed kit, takes about two and a half minutes of simulated time; REBUILD.md in the source kit has the commands, the times and the hashes. Tests: RUN_TESTS 8 of 8; the lifecycle test (install, refuse a second install, CHECK, change and add files, uninstall which keeps them, REPLACE, clean uninstall, reinstall) 20 of 20, on the simulator. The kit was installed system-wide on a VAXstation 4000/96 on 12-OCT-2026 and RUN_TESTS passed 8 of 8 as an ordinary user there. It has not been run on another real machine. The kit is not reproducible bit for bit (BACKUP records dates); the contents are.