Z8000 Assembler anyone?

dwight dkelvey at hotmail.com
Sat Nov 14 18:36:24 CST 2015

You might check with Chris Groessler at Chris at groessler.org.
He has an assembler that you should be able to run that should be
able to switch from non-segmented to segmented.
I have an assembler on my M20 but it only allows non-segmented code.
I suspect to protect the OS. It has a funny memory model that separates
the physical memory of  instruction form the data. This gives 128K in non-segmented
but it is confusing to debug because the segment address of the instructions is not
the same as the address where the instructions are fetched from. The debugger
needs read/write and the instruction space is read only. A handle in a hardware
memory manager.

From: cctalk <cctalk-bounces at classiccmp.org> on behalf of Oliver Lehmann <lehmann at ans-netz.de>
Sent: Friday, November 13, 2015 2:30 PM
To: cctalk at classiccmp.org
Subject: Re: Z8000 Assembler anyone?


it is a working Z8000 system with a ZEUS clone (SYSIII UNIX).
Somehow the assembler must be able to put the segment information
for the absolute adress of this array in the object. No idea how tho,
as $abs will only work on segment 1.
I have the original .o file from Zilog and there is the fixed adress
already in it. But no idea how they did it. The assembler can not be
called with a segment number to work on. The linker can, but the linker
is not involved in creating the .o file....

the original object from the system:

#67 nm /usr/sys/conf/u.o
3e00f600 A _u
01000000 s u_d
     0000 s u_p

my object generated from my u.s:

#68 nm u.o
0100f600 A _u
01000000 s u_d
     0000 s u_p

Regards, Oliver

jwsmobile <jws at jwsss.com> wrote:

> Putting things at an absolute address requires putting things into
> segments that are handle by the linker or loader (depending on what
> era you are working in).
> the linker may place the output of your assembler into different
> segments.  They may be set up to be relocatable at run time (most
> OSs insist on this feature).
> Once you are dealing with either a debugger or loader, or OS you
> have to find out how to get that segment assigned to the space you
> desire in the absolute addressing space.
> Usually the assembler will have directives to direct things to I/O
> or such depending on the architecture.
> I'd use this info to see if you have any luck figuring out what you
> need to do.
> you didn't mention whether this is a cross assembly tool, or if you
> have a working Z8000 OS with the tool.
> Others may infer that by knowing more about the things you refer to.
>  however working Z8000 systems running an OS are a bit rare these
> days.
> thanks
> Jim
> On 11/13/2015 12:06 PM, Oliver Lehmann wrote:
>> Hi,
>> I found out so far, that %3e00.... means, that the data is put on
>> segment 62 (0x3e). Regarding to the Z8000 ASM handbook, segmented
>> adresses are notated as <<segment>>offset, so in my case
>> <<62>>%F600 - but of course it does not work and the assembler
>> yields and error :(
>> Oliver Lehmann <lehmann at ans-netz.de> wrote:
>>> Hi,
>>> is someone on the list able to write Z8000 PLZ/ASM code? I have an
>>> the following source:
>>>  u module
>>>  $segmented
>>>  $abs %3E00F600
>>>    global
>>>  _u array [%572 byte]
>>>  end u
>>> The problem is, that it is vital that _u has to be located absolute
>>> on the virtual memory address 0x3E00F600. The problem is now, that
>>> the while the object is compiled, _u is available on 0x0100f600 and
>>> I have no clue why.....

More information about the cctech mailing list