My love affair with VAX Macro-32 (one of a few of my favourite assembly languages) lead me to investigate how well the latest Claude Code models could write programs in VAX assembly language. I’m a professional software engineer (albeit trying to slowly step out the door to retirement) and I rarely write code by hand any more, at least at work.
The results of my experimentation, and applying the skills I’ve learnt interacting with Claude, are here: https://github.com/urbancamo/macro-32
The reference library that the Claude Skill uses in this repository are Markdown versions of the relevant manuals: VAX Macro-32 manual itself, the Hunter Goatley ‘macro made simple’ course, and various other VAX/VMS manuals that provide the RTL and other useful routines.
So far it’s done a great job of short programs.
I’ve also resurrected my PP404 dot matrix line printer (I’m having to refill my existing cartridges with ribbons from a different model - guaranteed to invoke swearing and black inked hands) which is by far the best way of reading VAX Macro-32 assembler listing files. It’s kind of addictive.
MANDELBROT ASCII Mandelbrot (user W x H) written to 22-APR-2026 17:01:26 VAX MACRO V5.4-3 Page 1
V1.2 22-APR-2026 17:01:24 [MSW.CLAUDE]MANDELBROT.MAR;6 (1)
0000 1 .TITLE MANDELBROT ASCII Mandelbrot (user W x H) written to MANDELBROT.TXT
0000 2 .IDENT /V1.2/
0000 3
0000 4 ;++
0000 5 ; MANDELBROT.MAR
0000 6 ;
0000 7 ; Prompts the user for a width (columns) and height (rows) on
0000 8 ; SYS$INPUT, then renders the Mandelbrot set as ASCII art at that
0000 9 ; resolution into the file MANDELBROT.TXT in the current default
0000 10 ; directory -- one record (one line) per row.
0000 11 ;
0000 12 ; Width is capped at MAX_W (512) -- the static row buffer size.
0000 13 ; Height is capped at MAX_H (4096) -- a sanity bound.
0000 14 ;
0000 15 ; Prompts and any error messages still go to SYS$OUTPUT so the user
0000 16 ; can interact; only the rendered image is written to the file.
0000 17 ;
0000 18 ; On invalid input (non-digit, zero, or out-of-range) a short error
0000 19 ; message is printed and the image exits with SS$_BADPARAM.
0000 20 ;
0000 21 ; Algorithm (unchanged):
0000 22 ;
0000 23 ; For each pixel (col, row):
0000 24 ; c = Cr + Ci*i ; linear map from pixel coords to
0000 25 ; ; REAL_MIN..REAL_MAX / IMAG_MIN..IMAG_MAX
0000 26 ; z = 0; iter = 0
0000 27 ; while iter < MAX_ITER:
0000 28 ; if |z|^2 > 4: break ; escaped
0000 29 ; z = z*z + c
0000 30 ; iter += 1
0000 31 ; plot GRADIENT[iter/3] or INSET_CHAR if iter == MAX_ITER
0000 32 ;
0000 33 ; Inline squaring:
0000 34 ; Zr_new = Zr^2 - Zi^2 + Cr
0000 35 ; Zi_new = 2*Zr*Zi + Ci
0000 36 ; Escape test compares squared magnitude (Zr^2 + Zi^2 > 4) -- no sqrt.
0000 37 ;
0000 38 ; Output file characteristics:
0000 39 ; FNM = SYS$DISK:[]MANDELBROT.TXT (current default directory)
0000 40 ; FAC = PUT
0000 41 ; ORG = SEQ
0000 42 ; RFM = VAR (variable-length records)
0000 43 ; RAT = CR (carriage-return carriage control -- one record = one line)
0000 44 ; MRS = MAX_W (max record size; actual RSZ patched at runtime)
0000 45 ;
0000 46 ; Error handling:
0000 47 ; - LIB$GET_INPUT / OTS$CVT_TU_L failure -> RET with R0.
0000 48 ; - WIDTH / HEIGHT out of bounds -> message + SS$_BADPARAM.
0000 49 ; - $CREATE failure -> RET with R0 (no cleanup needed).
0000 50 ; - $CONNECT / $PUT failure -> best-effort $CLOSE, return R0.
0000 51 ;
0000 52 ; References consulted:
0000 53 ; reference/VAX-VMS-731/vax-macro-ref-2001.md
0000 54 ; Chapter 9 -- ADDF2/3, SUBF3, MULF3, DIVF3, CMPF, CLRF, CVTLF,
0000 55 ; DIVL3, MOVW, conditional branches.
0000 56 ; Chapter 5 -- indexed addressing label[Rn] scaled by operand size.
0000 57 ; reference/VAX-VMS-731/rtl-lib.md
................................................
........................................................
.........................................,,=:,..................
............................................,,,-:,,,,.................
..............................................,,,:=::-::,.................
................................................,,,,::--::,,,...................
.................................................,,,::@=@=*:,,,.....................
................................................,,,:-@=++@@@=--#,,......................
..............................................,,,,,,,:-@@@@@@@@%-:,,,.....................
............................................,,,,,,,,,,:-#@@@@@@@@#-,,,,,,,....................
..........................................,,,,::,,,,:::::-@@@@@@@@-::::,,,,,,,,,:,..............
..........................................,,,:=@+--::*@*=@@#@@@@@@@@@@@@-*@:,,,,,:=,,..............
.........................................,,,,,:-*@@@*+@@@@@@@@@@@@@@@@@@@@@+=::=#=-%+:...............
........................................,,,,,,,:-*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@-:,,................
.......................................,,,,,,,:-:-+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@=:,,,................
.......................,,,,,,.......,,,,,,,,:*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@-:,,,,................
......................,,:=,,,,,,,,,,,,,,,,,,,::-%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@-:::,.................
......................,,,==::::,,:%-::,,,,,,::+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@+:,.................
......................,,,,:-=#+@---*@-@-::::::*#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@=:,,,.................
......................,,,,,::=@@@*@@@@@@@+=-:--@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@=:*,...................
.....................,,,,,-:-+%@@@@@@@@@@@@@===@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*:,...................
.................,,,,-:::::=@@@@@@@@@@@@@@@@@+*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@+,,...................
...........,,,,,,,,,::+---=+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@:,,....................
.....,,,,:,,,,,,,,,:::-#%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@:,,,....................
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@=::,,,,....................
.....,,,,:,,,,,,,,,:::-#%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@:,,,....................
...........,,,,,,,,,::+---=+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@:,,....................
.................,,,,-:::::=@@@@@@@@@@@@@@@@@+*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@+,,...................
.....................,,,,,-:-+%@@@@@@@@@@@@@===@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*:,...................
......................,,,,,::=@@@*@@@@@@@+=-:--@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@=:*,...................
......................,,,,:-=#+@---*@-@-::::::*#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@=:,,,.................
......................,,,==::::,,:%-::,,,,,,::+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@+:,.................
......................,,:=,,,,,,,,,,,,,,,,,,,::-%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@-:::,.................
.......................,,,,,,.......,,,,,,,,:*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@-:,,,,................
.......................................,,,,,,,:-:-+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@=:,,,................
........................................,,,,,,,:-*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@-:,,................
.........................................,,,,,:-*@@@*+@@@@@@@@@@@@@@@@@@@@@+=::=#=-%+:...............
..........................................,,,:=@+--::*@*=@@#@@@@@@@@@@@@-*@:,,,,,:=,,..............
..........................................,,,,::,,,,:::::-@@@@@@@@-::::,,,,,,,,,:,..............
............................................,,,,,,,,,,:-#@@@@@@@@#-,,,,,,,....................
..............................................,,,,,,,:-@@@@@@@@%-:,,,.....................
................................................,,,:-@=++@@@=--#,,......................
.................................................,,,::@=@=*:,,,.....................
................................................,,,,::--::,,,...................
..............................................,,,:=::-::,.................
............................................,,,-:,,,,.................
.........................................,,=:,..................
........................................................
Regards, Mark.
Hey folks, before I start digging into this, I figured I'd ask here.
A simple "hello world" program in F77 on RSX-11M-PLUS fails to start thusly:
$ run hello
TT3 -- Exiting due to ERROR 2
Task initialization failure
I was trying to move a larger FORTRAN program to this system (the
11/70 at LSSM) and it was dying with this message, so I wrote a quickie
test case to narrow it down. It's just a write to unit 5:
WRITE(5,10)
10 FORMAT(' Hello World!')
END
...compiled with "FORTRAN HELLO", and linked with:
L HELLO,LB:[1,1]F77FCS/LIB
No warnings or errors. It runs fine on my 11/83 at home with a very
similar config. Before I dig in, can anyone quickly point me to what
I'm missing?
Thanks,
-Dave
--
Dave McGuire, AK4HZ
New Kensington, PA
Jacob,
That is awesome!! I’m glad to see that you made so much progress. I’ll send you some documentation in a few minutes, but you are getting along fine without any.
One of the best pieces of documentation are the Quick Reference cards for Calc and Graph.
However your PDP-11 collection is even MORE awesome!!!
Best,
Mark
> On Apr 15, 2026, at 12:55 PM, Jacob Ritorto <jacob.ritorto(a)gmail.com> wrote:
>
> Off to a decent start, this is AWESOME
>
> <gmail_images20260415_135405.png>
> <gmail_images20260415_135458.png>
>
>
> On Wed, Apr 15, 2026, 7:15 AM Mark Matlock <mark(a)matlockfamily.com <mailto:mark@matlockfamily.com>> wrote:
> I’m working on finalizing a zipped, RL02 disk image with everything once I finish the README.1ST doc and I’ll put it at a system that can be reached with FTP or WGET.
>
> It is sad that named directories are not supported. The code base was designed to run on RT-11 / TSX, RSTS/E and RSX11M/M+ so named directories were not a priority for Saturn at the time. Later, they migrated it to VAX and the VMS version does support named directories. Without source code or even object code, it is very difficult to do much. I’m in communication with the original programmer for Saturn Calc who thinks he might have a CDROM with the source code in a storage unit in Indiana, but he lives in the Caribbean. If/when he ever makes it up there to look for it, we might lucky. Just finding all the user manuals has been a challenge. If we did have the source code, I think it would be possible to make a number of improvements.
>
> Best,
> Mark
>
> > On Apr 15, 2026, at 4:23 AM, Johnny Billquist <bqt(a)softjar.se <mailto:bqt@softjar.se>> wrote:
> >
> > NFT should default to block mode if you don't say anything, and it's between two RSX systems. But if possible, use FTP instead, since it will be much faster.
> >
> > The only sad thing about the Saturn software, so far, seems to be that it don't deal with named directories. Which is annoying. Not trivial to fix, but maybe someone will feel enthusiastic enough to maybe work on that one day...
> >
> > Johnny
> >
> >> On 15/04/2026 05.13, Mark Matlock wrote:
> >> Jacob,
> >> I’m currently working on a README.1ST type of overview document which I can send you tomorrow as I am just adding a new section on the use of Saturn Graph with Rene Richarz TEK4010 emulator. If you have a VT240, VT330 or VT340 you can use the Regis graphics on them. Saturn Calc and WP will work with any VT or VT emulation as long as the PF1-PF4 keys are mapped.
> >> I have a disk image I’m also working on that willmake the distribution easier, but it’s not ready yet so the quickest wayto take a look at it is to start transferring the individual files from RDP1::DU1:[DECNET] I’ve put the ~190 files, ~7500 blocks (lots of examples) in the default DECnet directory. I’d suggest transferring with the NFT /BK block mode transfer switch since we are going from RSX to RSX. NFT is much faster that way.
> >> In the files INSAT.CMD is a command file that will copy the needed .SAT and .HLP files, set the global logical needed and install the various tasks. I just checked and it does expect the Saturn distribution to be at LB:[10,3] so if that works ok for you good, otherwise you can make a quick edit to INSAT.CMD
> >> I have the most documentation for Saturn Calc, a bit on Graph, but little on WP so I’m looking for that. Fortunately, all of theseprograms are quite easy to learn. I’ll also send what documentation I have tomorrow and I know Johnny has some Saturn manuals on MIM.
> >> I’d love to hear about any discoveries or problems you run into with the software. Also, its great to hear you have a running real 11/70 !
> >> Best Regards,
> >> Mark
> >>>> On Apr 14, 2026, at 7:26 PM, Jacob Ritorto <jacob.ritorto(a)gmail.com <mailto:jacob.ritorto@gmail.com>> wrote:
> >>>
> >>> Mark, This is really wonderful news, I am so appreciative of your and Lee’s work!
> >>> I’ll help with anything you say - I have CHOIPN:: and THNITH::, real RSX 11/70 and ‘83 on HECnet and would be very happy to grab the kit and test at the very least. Just let me know what to do and whatyou think needs exercise. I’m most interested in WP and maybe Graph.
> >>>
> >>> Thank you!
> >>> —jake
> >>>
> >>>> On Apr 11, 2026, at 15:54, Mark Matlock <mark(a)matlockfamily.com <mailto:mark@matlockfamily.com>> wrote:
> >>>>
> >>>> Jacob,
> >>>> I have also been waiting a long time to be able to use Saturn Calc and Graph. Over the years, I’ve collected various distributions but the licenses that I had for the RSX version no longer seemed to work. It was distributed as task images, instead of object libraries which would have been easier to hack. The Saturn Calc task would check for a couple files and it is had not been modified by the license key program it just exited.
> >>>>
> >>>> A good friend, Lee Gleason developed some fantastic tools (see https://rsx11.blogspot.com/2026/02/ <https://rsx11.blogspot.com/2026/02/> <https:// rsx11.blogspot.com/2026/02/ <http://rsx11.blogspot.com/2026/02/>> ) to be able to get a t-bit trace of the executing Saturn Calc task that recorded the PC and the first word of the instruction being executed. However RSX works very hard not to allow a task to run with the t-bit trap set. Lee had to modify both INS and FIX in multiple places to NOT clear the t-bit trap in the task header PSW if it is set. When the program exited since the license had not activated it, we would look at the last instruction, an EMT 377, to call RSX EXIT$ directive. Then we would work backward to the conditional branch that could have skipped over the exit and make it unconditional.
> >>>>
> >>>> These tasks are heavily overlaid so one also has to find which overlay has a EMT 377 in the correct PC value, then find the location of that overlay in the task image. This involved a lot of octal decoding to PDP-11 instructions with ZAP. Each of the many Saturn tasks had to be hacked and they had a couple spots that had to be ZAPped. But now we have working versions of Saturn Calc, Graph and WP and are just finishing checking to see if anything is broke.
> >>>>
> >>>> So far it looks good, but there are a couple caveats. First, the RSX Saturn software doesn’t understand named directories so you should be in a UIC based directory when you use it. Second, there is an obscure bug that I have not been able to solve and don’t know if it was always there or was somehow introduced by our hacks and zaps. It involves SUM or AVG calculations across a range when the range of input values are calculated. If they input cells have standard numbers, it works fine. I came up with a work around that can be used if one really needs that functionality.
> >>>>
> >>>> Saturn Graph is working very well. I can create a line, bar orpie chart either in SIG or from a Calc spreadsheet, then display it on a VT240, VT330 or VT340 Regis terminal, then when I’m ready to make a hard copy send it to a (HPGL) HP7550 plotter or even a LA50 (sixel) printer. The VT340 mouse even works with the drawing program.
> >>>>
> >>>> I’ve created a command file that will install everything and I would be interested in a beta tester or two who are somewhat familiar with Saturn to see if there are any issues remaining. Saturn provided many example files and I’m including them as well. There are in total about 7500 blocks in 190 files.
> >>>>
> >>>> If you have an RSX system on HECnet, I can put them where you could NFT them back to your system. If not let me know and I can package things in a disk image for ftp or wget. Ultimately, Johnny said he might be interested in creating an RPM package.
> >>>>
> >>>> Best,
> >>>> Mark Matlock
> >>>>
> >>>>> On Apr 10, 2026, at 6:58 PM, Jacob Ritorto <jacob.ritorto(a)gmail.com <mailto:jacob.ritorto@gmail.com>> wrote:
> >>>>>
> >>>>>
> >>>>>
> >>>>> On Fri, Apr 10, 2026, 7:55 AM Mark Matlock <mark(a)matlockfamily.com <mailto:mark@matlockfamily.com> <mailto:mark@matlockfamily.com <mailto:mark@matlockfamily.com>>> in one of my Saturn Calc spreadsheets (that I can now read once again).
> >>>>>
> >>>>>
> >>>>> Mark! I've been wanting Saturn so long! What's the news that enables you to read your old sheets again? And may I have a copy? :)
> >>>>>
> >>>>> Thx
> >>>>> jake
> >>>>
> >>> _______________________________________________
> >>> HECnet mailing list -- hecnet(a)lists.dfupdate.se <mailto:hecnet@lists.dfupdate.se>
> >>> To unsubscribe send an email to hecnet-leave(a)lists.dfupdate.se <mailto:hecnet-leave@lists.dfupdate.se>
> >