[comp.os.cpm] how to do it

mwilson@pnet01.cts.COM (Marc Wilson) (05/11/88)

     Sorry to all, but the only address I have for Don bounced.  Twice.  What
follows is the original message.


--------Forwarded Message--------

>From mwilson Tue May 10 10:46:59 1988
Date: Tue, 10 May 88 10:46:56 PDT
From: mwilson (Marc Wilson)
To: crash!ucbvax.Berkeley.EDU!donk
Subject: How to do it
Cc: mwilson


     Sorry it took me so long to get back to you with this, but I've been so 
busy lately, I just haven't had time to cook up a good example.

     I usually don't use M80/L80.  If I *do* use M80, then I use one of the 
public domain linkers, like PDLN, or ProLink.  My preferred linker is DRI's 
LINK, but I use SLR Systems SLRNK when I want speed.  All of them are in the 
ASM: directory.

     Ok, what we need here is a good example.  Take a look at the file below.  
As you can see, the only thing in it is a CSEG.  Note the *absence* of any ORG 
statement.

-----

C0:SCRATCH>lt test.z80


^S pause, ^C abort, ^X next file, ^Z no paging, space next line, others page
TEST.Z80

; Program:      TEST.Z80
; Author:       Marc Wilson
; Version:      1.0
; Date:         10 May 1988

; This is a test to cause M80/L80 to generate a .HEX file with an origin
; other than 100h

        cseg

start:  ld      c,9
        ld      de,msg
        jp      5

msg:    db      'This is a test.$'

        end

-----
Ok, we've got a test file.  Let's assemble it...

My copy of M80 has been patched to return flags for warnings ant fatal errors
in the Z-System registers.  It is otherwise *identical* to M80 v3.44.
-----

C0:SCRATCH>asm:m80 =test.z80/z

M80 v3.44 for LB/Z80 Z-System

No Fatal error(s)

-----
Well, it assembled with no errors, let's try linking it.
-----

C0:SCRATCH>asm:l80 /p:1000,test,test/n/x/e


Link-80  3.44  09-Dec-81  Copyright (c) 1981 Microsoft

Data    1000    1018    <   24>

38940 Bytes Free
[0000   1018       16]

-----
Hmmm... it looks like L80 has indeed created a zero-filled .HEX file.  However, 
if you look again, you can see that the data area goes from 1000 to 1018.  
Since I didn't specify a separate address for the data segment, the code 
segment is there.

Let's look at the .HEX file.
-----

C0:SCRATCH>lt test.hex


^S pause, ^C abort, ^X next file, ^Z no paging, space next line, others page
TEST.HEX

:181000000E09110810C3050054686973206973206120746573742E2489
:00000001FF

-----
Uh oh, awful short.  No zero-fill records here.
-----

C0:SCRATCH>mload test

MLOAD ver. 2.5   Copyright (C) 1983, 1984, 1985, 1987
by NightOwl Software, Inc.
Loaded 24 bytes (0018H) to file C0:TEST.COM
Start address: 1000H  Ending address: 1017H  Bias: 0000H
Saved image size: 128 bytes (0080H, - 1 records)

++ Warning: program origin NOT at 100H ++

-----
Well, what do you know?  MLOAD says that the start address is 1000h, and the 
ending address is 1017H.  Definately no zero-fill here.

As another check, let's look at the .COM file generated by MLOAD.  Note that we 
*cannot* run this file, as MLOAD warned us its ORiGin wasn't at 100h, but at 
1000h.
-----

C0:SCRATCH>ddt test.com

DDT VERS 2.2
NEXT  PC
0180 0100
-l100

  0100  MVI  C,09
  0102  LXI  D,1008
  0105  JMP  0005
[ ... ]
-d108

0108 54 68 69 73 20 69 73 20 This is 
0110 61 20 74 65 73 74 2E 24 00 00 00 00 00 00 00 00 a test.$........
[ ... ]
-g0

-----
Look at the address field of the LXI D instruction.  It's 1008h.  This
indicates that this file does indeed have an origin above 100h.
-----

     Well, I'd say that that fits your requirements.

     On another related subject, why are you using a .HEX file at all?  That 
requires much tedious calculation of offsets, etc.  Why not just assemble to a 
binary file and install?  Much simpler, and faster.

     If I can help with anything else, please don't hesitate to ask.

                                                 -- Marc Wilson
                                                 -- mwilson@crash.CTS.COM


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Marc Wilson
     ARPA: ...!crash!mwilson@nosc.mil
           ...!crash!pnet01!pro-sol!mwilson@nosc.mil
     UUCP: [ cbosgd | hp-sdd!hplabs | sdcsvax | nosc ]!crash!mwilson
     INET: mwilson@crash.CTS.COM
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

--------End Forwarded Message--------


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Marc Wilson
     ARPA: ...!crash!mwilson@nosc.mil
           ...!crash!pnet01!pro-sol!mwilson@nosc.mil
     UUCP: [ cbosgd | hp-sdd!hplabs | sdcsvax | nosc ]!crash!mwilson
     INET: mwilson@crash.CTS.COM
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

dg@lakart.UUCP (David Goodenough) (05/12/88)

> Long article about assembly & linkage with odd offsets.

If I may be permitted to throw in my 2 cents worth here, I have an assembler /
linker pair that will place anything you like anywhere you like. For example
it has created code to be burnt into an EPROM (code and initialised data at
0000H, uninitialised data at 4000H), or a BIOS (everything starting at
0F200H), or if you leave it alone, it produces a regular CP/M flavour .COM
file: starting at 0100H. It's all done with flags to the linker: basically
when you link, you just tell the linker where to put everything, and voila -
there you are.

CAVEAT - It is *_NOT_* compatible with M80, so sources will need to
be massaged, but I use it all the time, and it does work.

P.S. I wrote it myself, so I have no problem at all about shipping a copy
to anyone who is interested.
-- 
	dg@lakart.UUCP - David Goodenough		+---+
							| +-+-+
	....... !harvard!adelie!cfisun!lakart!dg	+-+-+ |
						  	  +---+