• Please review our updated Terms and Rules here

NOVA Assembler

Qbus

Veteran Member
Joined
Feb 23, 2011
Messages
958
Location
Salisbury Maryland
Have never been accused of being the sharpest tool in the shed and in the last couple years been trying to teach myself assembler for the Data General NOVA/Rolm military platform. Been lots of fun, something like being in a dark room with no idea of where anything is or how to turn on the lights. I am slowly making progress, maybe.
Why is it that all the books written about working in assembler appear to be written by people who have no idea how to convey information or is it a plot where the people who know assembler want to keep the understanding limited to just themselves?

I have a couple working systems and a small understanding of the layout and experience loading and working with the 16 bit systems.
The problem I have now is how to use the JSR (jump sub routine) command, can use the JMP all day long to drive the PC to another location but need to be able to call a jump to a sub routine for doing things like printing but cannot see how you get the routine to go back to the next address in the PC when finished? Think the manual says something about putting the return address in A3 but just cant see how that works, use to doing things like in Basic where you put return on the end of the sub routine but don’t understand the syntax for NOVA speak.
The problem is I want to have the system print out a string of characters to TT0, right now have to do a LDA(020100)from a fixed address to A0. You can only print from one of the four accumulators, A0, A1, A2 and A3.
Then test TT0 for ready (063511), If TT0 is not finished pushing out the last character then JMP back until TT0 ready (000777), once the port is good then print DOA (061111) and start all over again with loading the next address into A0.
I want to have a JSR that executes Test TT0 063511, jump back until ready 000777 and when ready print A0 061111 so I don’t have to enter that string for each character that gets printed.

This is what I currently have to do:

1000 020100 LDA 0 100
1001 063511 Test TT0
1002 000777 JMP back 1
1003 061111 DOAS print to TT0
1004 020101 LDA 0 101
1005 063511
1006 000777
1007 061111
1010 020102 LDA 0 102
1011 063511
1012 000777
1013 061111
1014 020103 LDA 103

I am using addresses 100 to around 150 for the stuff that gets printed out. But the executable program starts at 1000
 
In my experience, the manuals/documentation is reference material only - you have to go on the training course to actually learn anything...

Hmmm, now how do I get on a training course for something that has been obsolete for ‘x’ decades? Replacing ‘x’ for the machine you are working with...

I learned much more by going on the DEC MACRO assembler and Intel 286 assembler courses than I ever did by just reading the manuals before I went on the courses.

The microprocessor books (e.g. Z80, 6502 and 6800 etc.) started a bit of a revolution (in my opinion).

The makers of mainframes and minis wanted a slice of the training market as a paid-for add-on.

Never used the DG Nova though...

Dave
 
Sounds surprisingly simple just use the JMP command back three. The problem is I am a hardware guy and not a software person.
I have the book and have spent hours trying to read but somehow my brain is too small to take it all in! It starts with a simple explanation of a command, then devolves into some weird argument into how the memory is partitioned and somehow by the third or forth line I am so confused I have no clue what they are saying.
Slowly, in microscopic increments I have been moving forward in trying to get these systems to do things that regular people can appreciate but without formal education and all my training and education being in analog systems and broadcasting working on teaching yourself NOVA speak can be a painful process.
Thanks for the help and with the guidance from groups like this perhaps we can all move forward into the past.
 
The Nova is a very simple machine with only a few instruction formats. If your impression is that it's complicated, you're overthinking things.

Pretty much everything is a 16-bit word. Addresses refer to 16-bit words; operations operate on 16 bit words and all instructions are single 16 bit words-- and there are only 4 types of those:

  • Memory modification: (increment, decrement, jump and jump to subroutine)
  • Data moving - e.g., load, store.
  • Arithmetic; which are basically ALU operations that include shifting and skipping on the result. None of these address memory (they work through the accumulators). There are numerous variations on these, obviously, and you can perform, say, an add and left shift and skip on zero all in the same instruction. Further, the result of any operation need not be stored into any register. The assembler syntax for all of these can look daunting at first, but basically, it's a root operation, followed by modifiers (e.g. # = don't actualize the result) as well as a final action (e.g. SZR = skip on zero). Study the instruction word makeup and then the assembler will make sense.
  • I/O instructions - these are device-specific and you need to refer to the applicable manual for these. Some are a bit peculiar; for example, on some Novas, multiply and divide is relegated to an I/O unit.

Because of the limited instruction set, and the limit of an 8 bit displacement, the Nova has a varied addressing scheme. Not only can an address be indexed by an accumulator, but if the high-order bit (bit 0 in DG parlance) is set in the referenced, the reference is indirect; that is the addressed word points to another word. Some low-memory addresses have special properties; there are 8 auto-increment and 8 auto-decrement memory locations in page 0.

Again, the Nova is a very simple machine. If you can get your mind around the basic instruction set, by looking at the instruction word layout, the assembly mnemonics will make sense.
 
The Nova has "designed by the guy behind the PDP-8" written all over it, in the sense that it initially seems baffling and constrictive until you wrap your head around it to the point where the solutions to your problems start to become obvious. I'm not sure I've ever seen another architecture so dedicated to the concept of building complex operations out of combinations of simple operations.
 
Yup, Edson de Castro definitely left his mark on the PDP-8 as well as the Nova.

The Fairchild 9440 MPU as well as the MicroNova are direct implementations of the Nova. The 4 16-bit accumulator model was used with the National Semi PACE and the multi-chip IMP-16, although a stack was added and traditional CISC instruction set.

The idea of low-memory "direct cells" is much older than the Nova or PDP-8; it's used, for example on the CDC 160 computer.
 
Ok, so jump to address located in A3 is 001400 or binary 00000110000000 with the JMP instruction being bits 0,1 and 2 and 6 and 7 being the address of the accumulator, 8 thru 15 don’t matter.
The PC doesn’t matter because it will go to the addresses located in the JSR but A3 will hold the valid return address. But will A3 increment the address by one or am I setting up a loop?
 
If you look at the description of the JSR carefully, you'll note that it stores P+1 in AC3. So no need to increment.

To add a bit of color to the discussion, it was common practice to stash arguments to the subroutine after the JSR. So you could pick up the arguments relative to AC3 and then jump to the return address, indexed by the number of arguments. So, if you had 2 argument words stored after the JSR, you'd return with a

JSR 2,3

That is, AC3 indexed by 2 words.
 
My JSR statement just isn’t working! I can do jumps no problem. My print sub starts at page 1 address 300 and runs to 304 where it’s sent back with the JMP to address set by A3 001400.
The issue now is that when I want to branch to the sub I have been trying 010300 to send the PC down to 300 but that don’t work, I can do a JMP 000300 and that sends the PC down to 300 but it will not write to A3 so going to assume that’s the difference that in JMP you are just transferring down to that address and in JSR you transfer down to that address but it also increments A3?
What am I missing here?
 
Well, that's the idea with JSR:

The effective address 'E' is computed. Then the present value of the program counter is incremented by one and the result is placed in AC3. 'E' is then placed in the program counter and sequential operation continues with the word addressed by the updated value of the program counter.

Seems to be pretty straightforward to me. JMP just omits the AC3 stuff (second sentence).
 
Will post when completed, have a simple version that works now but want to reduce the lines of code by using a JSR command and just have to work out the particulars of the command into a version that runs on my hardware.
Once a year some friends and I get together and we do a Ham Radio related event commemorating Able Archer 83, a Cold War event and this involves us dragging lots of period correct radio equipment out to a remote site and setting up and operating for a weekend using only that technology. We use to set up on top of mountains and the like but in the past couple years we have been operating from historical locations like a former Nike Missile site in Davidsonville Maryland and this last year from the site of a former Navy SOSUS facility located at Fort Miles, Cape Henlopen State Park in Delaware.
Working in a public setting we have people who stop by to see what’s going on and last year we set up a AA 83 information table with information on what this was all about and stuff including a set of 1980 military field telephones that we allowed people to try and it was a big hit with all that tried them.
Thinking for this year I want to also put a rack up by the public table that will hold the Rolm 1602 (AN/YUK-19) and a MX-101059 terminal that will be displaying a scrolling message about the event. The MX Terminal has a huge fount and is easily visible from a distance and figure it will be a good example of state of the art from 1983
There are other ways of doing this, have already built up PROM and Uart that can play back a message to the terminal and know that the smart people can do this with an Arduino and imagine I may be able to do it with a Basic Stamp being that s more my generation but because we make a big effort to use period correct radio equipment would like to do this with a period correct computer and think people will be impressed by a huge rack full of stuff that can barley do what they do when they send text messages.
This last year we ran over a hundred voice radio contacts on SSB, some on old tactical wide band FM and several teletype contacts and had around two hundred people stop by and see what we were doing. The state park people loved it and have already invited us back for this year so I think a vintage military communications terminal and computer would be something people would like to see.
 
Have it working now. Finlay learned how the JMP and JSR commands work. This is a copy of the program that I have running on the hardware now.
Data to be printed is stored in locations 100 to 113; you cannot print from memory directly with all I/O commands having to go thru an accumulator.
I am using the A0 accumulator to feed TT 0



1000 020100 LDA A0 100
1001 004300 JSR 300 This command also stores PC +1 in A3
1002 020101 LDA A0 101
1003 004300 JSR 300
1004 020102 LDA A0 102
1005 004300 JSR 300
1006 020103 LDA A0 103
1007 004300 JSR 300
1010 020104 LDA A0 104
1011 004300 JSR 300
1012 020105 LDA A0 105
1013 004300 JSR 300
1014 020106 LDA A0 106
1015 004300 JSR 300
1016 020107 LDA A0 107
1017 004300 JSR 300
1020 020110 LDA A0 110
1021 004300 JSR 300
1022 020111 LDA A0 111
1023 004300 JSR 300
1024 020112 LDA A0 112
1025 004300 JSR 300
1026 020113 LDA A0 113
1027 004300 JSR 300
1030 063077 HALT

Print Sub Routine

300 063511 Test TT0 if ready
301 000777 JMP back one until ready
302 061111 DOA print out (A0) to TT0
303 001400 JMP to address in A3
 
Back
Top