Discussion:
Any M80 L80 experts out there?
(too old to reply)
John Crane
2010-01-13 16:30:04 UTC
Permalink
I normally tinker around in ASM to get my assembly chores done. But I
started playing with Microsoft's M80 & it's associated linker, L80. I was
wondering, can I take an assembly source file used for ASM and just rename
it *.MAC to get it to work? I tried a simple "hello world" that worked fine
in ASM, but didn't work at all in M80. No errors reported but when I ran
it, it made my Osborne reboot, and my Horizon go nuts and alternately access
drive A and B endlessly.

Perhaps I'm not using the right invocation:

M80 =hello
L80 hello,hello/N/E

Anybody remember this stuff?

-John
s100guy
2010-01-13 19:08:44 UTC
Permalink
On Jan 13, 8:30 am, "John Crane" <***@yahoo.com> wrote:
**** <snip> ******
Post by John Crane
M80 =hello
L80 hello,hello/N/E
Anybody remember this stuff?
-John
Hi John --

Maybe you're not creating the object file out of M80? (M80
objfile,listfile=sourcefile). Try M80 hello=hello? Makes me wonder
what L80 is loading? ALSO, just an added tip. I've found that an
ASEG in your .MAC file (rather than ORG) makes for a cleaner .COM file
from L80.

Hope this helps.

Roger
Mr Emmanuel Roche, France
2010-01-13 19:13:47 UTC
Permalink
Post by John Crane
I normally tinker around in ASM to get my assembly chores done.
MAC is more powerful, and is nicely integrated to work with SID and
ED. All 3 constitutes the best Intel 8080 Assembly Language
development system. (Don't miss the two UTL utilities of SID.) SID was
sold separately from CP/M 2.2 (for $75, the price of CP/M alone...),
so it seems that 99% of the Americans CP/M fans did not understood
that it was intended for serious professional programmers. Just re-
read those old CP/M advertisements. Gary Kildall was a Computer
Science professor, and did not lie. I think that the "MAC User's
Guide" is one of the top 5 best CP/M manuals. Just re-read what Dave
Cortesi (and Alan R. Miller) had to say about macros, at the time.
Post by John Crane
 But I started playing with Microsoft's M80 & it's associated linker, L80.
 I was wondering, can I take an assembly source file used for ASM and
just rename it *.MAC to get it to work?
Yes. By default, M80 assembles 8080 code (and is programmed only in
8080 code).
Post by John Crane
 I tried a simple "hello world" that worked fine
in ASM, but didn't work at all in M80.  No errors reported but when I ran
it, it made my Osborne reboot, and my Horizon go nuts and alternately access
drive A and B endlessly.
M80 =hello
L80 hello,hello/N/E
Anybody remember this stuff?
Hahaha! Are you sure that you are still using CP/M, John? Don't you
remember that programs used to come with a manual, explaining how to
use it?

Or reading the comp.os.cpm Newsgroup? Starting the 12th September
2009, there was a "Macro Assembler for Z80" thread where I explained
Post by John Crane
A>m80 RELfile,PRNfile=MACfile
The shortest command line is m80 =MACfile: this tests the MAC file,
to see if there is any error in the MAC source code file.
To locate the error in the listing, you use m80 PRNfile=MACfile.
When you want a REL file, you use m80 RELfile,=MACfile.
(Sometimes, I wonder why I write to the comp.os.cpm Newsgroup, if
people are not learning by heart what I wrote.)

With ASM or MAC, DDT or SID read directly the HEX file produced. (No
need to create a COM file with LOAD, as explained in the manual.) With
M80, no matter how simple what you do (like this case), you need to
use a linker. (By the way, the Digital Research LINK-80 is much more
powerful, and much more simpler to use, than L80, which shows its Unix
roots.) Linker = slow. So slow that I remember advertisements claiming
to assemble REL files 6 times faster than L80... I hate linkers, for
good reasons (re-read my message about PLMX, where I found a bug
generated by the L80 linker).

With MAC, you can use a library of macros to generate Z-80 code (as
Dave Cortesi did in his book).

Just re-read my messages. I am getting old: I could have forgotten
something.

With experience, I found the Z-80 too complex, with many non-
orthogonal instructions and, above all, more than 100 instructions
that were never officially documented (those dealing with the IX and
IY registers). The only way to create them is by using macros. And
ZSID does not display all of them correctly. In short, the Z-80 is
flawed. In fact, at the time, there were at least 4 different syntaxes
for the Zilog instructions, before M80 became the standard (remember
TDL?). The 8080 is simpler, and more logical. Except Turbo Pascal, I
know no great CP/M program that used Z-80 instructions.

Finally, if you have time and money, you could investigate the 916
instructions of the Z-80. Me, I never finished. (I had made a 20-pages
file generating them with DB statements.) If you are retired, you are
sure to spend some time on them!

Yours Sincerely,
Mr. Emmanuel Roche, France
Holger Petersen
2010-01-13 21:02:18 UTC
Permalink
Post by Mr Emmanuel Roche, France
Post by John Crane
I normally tinker around in ASM to get my assembly chores done.
MAC is more powerful, and is nicely integrated to work with SID and
ED. All 3 constitutes the best Intel 8080 Assembly Language
development system.
And don't forget that there used to exist CROMENCO.
They had an Z80-Assembler which could as well pro-
duce .HEX-Files or .REL ones.
Post by Mr Emmanuel Roche, France
(Don't miss the two UTL utilities of SID.) SID was
sold separately from CP/M 2.2 (for $75, the price of CP/M alone...),
so it seems that 99% of the Americans CP/M fans did not understood
that it was intended for serious professional programmers. Just re-
read those old CP/M advertisements.
And read in Dr.Dobbs Journal[*] about one Patch to ZSID...


Yours, Holger

[*] From DDJ, Dec. 1981, p. 4
Zsid bug and (risky?) patch
by some german...

Other Info in:

http://www.retroarchive.org/cpm/cdrom/CPMINFO/CPMPATS6.TXT
Mr Emmanuel Roche, France
2010-01-14 10:12:57 UTC
Permalink
Hello, Holger!
Post by Holger Petersen
And don't forget that there used to exist CROMENCO.
Yes, exactly! I am taking this opportunity to ask a Z-80 question to
the others Old Timers. My memory is beginning to fail: impossible to
remember the names of the various syntaxes used to describe the Z-80
instructions.

In the end, thanks to M80, the Zilog syntax became standard. But,
during many years, there were other syntaxes being widely used. Just
see the number of programs written using the TDL syntax in the CP/M
Software Library of the CP/M User's Group.

So, my question is: What was the names of the various Z-80 syntaxes?
Me, I remember 4 totally different ones being widely used.

1) Zilog
2) TDL
3) Extended Intel (Example: DRI's Z80.LIB)
4) ?

Impossible to remember the name of the 4th one... Damn!
Post by Holger Petersen
And read in Dr.Dobbs Journal about one Patch to ZSID...
I assume that you are referring to Version 1.4 of ZSID. For some
unknown reason, this is the only one know by American CP/M 2.2 fans.
However, under CP/M Plus (which is a single user version of MP/M-II),
it was widely known that you could use Version 2.5 from MP/M-II. This
is even mentioned in the book "The Amstrad CP/M Plus", with a patch...

(I think that "someone" disassembled this last version of ZSID...)

Yours Sincerely,
Mr. Emmanuel Roche, France
Ole Christensen
2010-01-14 18:08:03 UTC
Permalink
Post by Holger Petersen
Post by Mr Emmanuel Roche, France
Post by John Crane
I normally tinker around in ASM to get my assembly chores done.
MAC is more powerful, and is nicely integrated to work with SID and
ED. All 3 constitutes the best Intel 8080 Assembly Language
development system.
And don't forget that there used to exist CROMENCO.
They had an Z80-Assembler which could as well pro-
duce .HEX-Files or .REL ones.
Yes,... beside from an little "wired" macro syntax,
Debug was very nice to,...!
<ole>

; file: EXAMPLE4.Z80
;
ReBoot Equ 0000h
Bdos Equ 0005h
;
Print: Macro #String
Jr K#Sym ;; Jump over data
V#Sym: DefB #String ;; Pass argument
DefB '$' ;; Terminator
K#Sym: Ld DE,V#Sym ;; DE point to String
Ld C,9 ;; Bdos print string
Call Bdos ;; Let Bdos do the work
EndM
;
System: Macro
Jp ReBoot ;; Boot CCP
EndM
;

Main:
Print 'Hello'
Print ' World!'
System
;
End Main
John Crane
2010-01-16 17:49:14 UTC
Permalink
Very interesting. But for some reason my version of M80 chokes on the '#'
characters. I presume they are for enumeration of label names during macro
expansion.

I got in the habit of avoiding macros as they tended to cause code bloat.
Back in the day (when I was a high-schooler), I relegated macros to just a
fancy cut & paste tool. I tended to use subroutines instead of macros for
efficiency. But then, I couldn't afford much memory by just sacking
groceries on the weekend!

One of my favorites was the in-line print. Sometimes it was handy to spit
out some text and not have all your strings in another part of the code with
all your other data. At least it was easier for the short programs I wrote.



;--------------------------------------
; Inline Print
;--------------------------------------
;
;THE CALL TO ILPRT IS FOLLOWED BY A MESSAGE,
;BINARY 0 AS THE END.
;
; Example:
;quit:
; CALL ilprt
; db cr,'System Shutdown... bye',cr,00h
;--------------------------------------

ilprt: XTHL ;SAVE HL, GET HL=MSG
ilplp: MOV A,M ;GET CHAR
ORA A ;END OF MSG?
JZ ilpret ;..YES, RETURN
CALL outt ;TYPE THE MSG
INX H ;TO NEXT CHAR
JMP ilplp ;LOOP
ilpret: XTHL ;RESTORE HL
RET ;PAST MSG

;------------------
Ole Christensen
2010-01-16 23:57:56 UTC
Permalink
Post by John Crane
Very interesting. But for some reason my version of M80 chokes on the '#'
characters. I presume they are for enumeration of label names during macro
expansion.
This don't come as a surprise to me as the Cromemco ZASM was, (are),
a "strange animal", but Your right, the "#" are just what You presume
and the best "companion" are the manual for the assembler Your using
by Your side at the "workplace", everything in that example one can do
with the "intel syntax", (i think it is), used by MAC & RMAC (and the SLR).
the "Programmers Utilities Guide", (for CP/M 3), are everything You need.
Post by John Crane
I got in the habit of avoiding macros as they tended to cause code bloat.
Back in the day (when I was a high-schooler), I relegated macros to just a
fancy cut & paste tool. I tended to use subroutines instead of macros for
efficiency. But then, I couldn't afford much memory by just sacking
groceries on the weekend!
Of cause there are macro's and macro's,... in "my" school the only thing
with a keyboard beside from the organ was Adler typewriters...
Post by John Crane
One of my favorites was the in-line print. Sometimes it was handy to spit
out some text and not have all your strings in another part of the code with
all your other data. At least it was easier for the short programs I wrote.
Yes,... that was some kind of "standard"...

Here come another variant, the macro only generate the code for
the subroutine the first time used, next time it call the code:
<ole>

---snip---
;; Macro Libarary for ZASM & ASMB
;; file: EX4b.Z80
;;

Bdos: Macro #Fnc
Ld C,#Fnc ;; Bdos function in (C)
Call 0005h
EndM

?Write DefV 0 ;; Not defined yet
Write: Macro #String
IF NOT ?Write ;; defined ?
?Write DefV NOT ?Write ;; no, define it
Jr P#Sym ;; jump past subroutine
@Write: Ex (SP),HL ;; HL = pointer
Ld A,(HL) ;; char -> (A)
Inc HL ;; opdate and save
Ex (SP),HL ;; pointer,
Push AF ;; and char
And 7FH ;; mask bit 7
Ld E,A ;; char -> (E)
Bdos 2 ;; print it
Pop AF ;; restore char,
And A ;; bit 7 on ?
Ret M ;; yes, return
Jr @Write ;; else, do next
EndIF
P#Sym: Call @Write ;; call routine
V#Sym: DefM #String ;; data-spaces
EndM

Exit: Macro
Bdos 0 ;; do WarmBoot
EndM
;;

Main:
Write 'Hello'
Write ' World!'
Exit
End Main
---snip---

D>zasm ex4b.cdx liston
CROMEMCO MACRO ASSEMBLER ver 3.07

CROMEMCO Z80 Macro Assembler CP/M ver 3.07 Page 0001
*** EX4B ***

0001 ;; Macro Libarary for ZASM & ASMB
0002 ;; file: EX4b.Z80
0003 ;;
0004
0005 Bdos: Macro #Fnc
0006 Ld C,#Fnc ;; Bdos function in (C)
0007 Call 0005h
0008 EndM
0009
(0000) 0010 ?Write DefV 0 ;; Not defined yet
0011 Write: Macro #String
0012 IF NOT ?Write ;; defined ?
0013 ?Write DefV NOT ?Write ;; no, define it
0014 Jr P#Sym ;; jump past subroutine
0015 @Write: Ex (SP),HL ;; HL = pointer
0016 Ld A,(HL) ;; char -> (A)
0017 Inc HL ;; opdate and save
0018 Ex (SP),HL ;; pointer,
0019 Push AF ;; and char
0020 And 7FH ;; mask bit 7
0021 Ld E,A ;; char -> (E)
0022 Bdos 2 ;; print it
0023 Pop AF ;; restore char,
0024 And A ;; bit 7 on ?
0025 Ret M ;; yes, return
0026 Jr @Write ;; else, do next
0027 EndIF
0028 P#Sym: Call @Write ;; call routine
0029 V#Sym: DefM #String ;; data-spaces
0030 EndM
0031
0032 Exit: Macro
0033 Bdos 0 ;; do WarmBoot
0034 EndM
0035 ;;
0036
0037 Main:
0000' 0038 Write 'Hello'
(FFFF) 0040+ ?Write DefV NOT ?Write
0000' 1812 0041+ Jr P0000
0002' E3 0042+ @Write: Ex (SP),HL
0003' 7E 0043+ Ld A,(HL)
0004' 23 0044+ Inc HL
0005' E3 0045+ Ex (SP),HL
0006' F5 0046+ Push AF
0007' E67F 0047+ And 7FH
0009' 5F 0048+ Ld E,A
000A' 0049+ Bdos 2
000A' 0E02 0050+ Ld C,2
000C' CD0500 0051+ Call 0005h
000F' F1 0052+ Pop AF
0010' A7 0053+ And A
0011' F8 0054+ Ret M
0012' 18EE 0055+ Jr @Write
0014' CD0200' 0057+ P0000: Call @Write
0017' 48656C6C 0058+ V0000: DefM 'Hello'
001C' 0059 Write ' World!'
001C' CD0200' 0076+ P0002: Call @Write
001F' 20576F72 0077+ V0002: DefM ' World!'
0026' 0078 Exit
0026' 0079+ Bdos 0
0026' 0E00 0080+ Ld C,0
0028' CD0500 0081+ Call 0005h
002B' (0000') 0082 End Main


Errors 0
Range Count 0
Parity Count 0

Program Length 002B (43)

End of assembly

D>link ex4b
LINK 1.31

ABSOLUTE 0000
CODE SIZE 002B (0100-012A)
DATA SIZE 0000
COMMON SIZE 0000
USE FACTOR 00

D>ex4b
Hello World!
D>
Rolf Harrmann
2010-01-13 19:34:40 UTC
Permalink
Hi John,
Post by John Crane
I normally tinker around in ASM to get my assembly chores done. But I
started playing with Microsoft's M80 & it's associated linker, L80. I was
wondering, can I take an assembly source file used for ASM and just rename
it *.MAC to get it to work? I tried a simple "hello world" that worked fine
in ASM, but didn't work at all in M80. No errors reported but when I ran
it, it made my Osborne reboot, and my Horizon go nuts and alternately access
drive A and B endlessly.
M80 =hello
L80 hello,hello/N/E
Anybody remember this stuff?
-John
http://www.retroarchive.org/cpm/lang/lang.htm

PDF Documentation for Microsoft Macro-80 M80.COM

http://www.retroarchive.org/cpm/lang/MACRO-80.PDF

PDF Documentation for Microsoft LINK-80 L80.COM

http://www.retroarchive.org/cpm/lang/LINK-80.PDF

Rolf
John Crane
2010-01-14 08:14:46 UTC
Permalink
Thank you Mr Harrmann, for the links to the docs.

Looks like I need an ENTRY MAIN at the top and an END MAIN at the end for
L80 to make a COM file that actually works (the label MAIN: being the start
of my program). Evidently, the default must be for a
macro/module/library/whatever, but it's definitely not an executable file.

And Mr. Roche, my invocation works just fine as is. Sorry you had a fit
trying to remember Microsoft's arcane methods.

And yes, I will get around to the DRI products. So much CP/M software, so
little time! But it's certainly better than running dry.

Thanks all,

-John


FYI... Here's the copy that worked....

;================================================
; CP/M "Hello World" for M80/L80
;=================================================
;
;------------------
; COMMON EQUATES

CR EQU 0DH ; ASCII Carriage return
LF EQU 0AH ; ASCII Line feed
BDOS EQU 5 ; CPM BDOS entry point
DMABUF EQU 80H ; CPM DMA Buffer location
PRSTR EQU 9H ; BDOS Print String Function
BOOT EQU 0H ; CPM Reboot
;------------------
; Assembler Setups

.Z80 ;Use Z80 mnemonics (delete for 8080)
ORG 100H ;CPM TPA starts @ 0100H
ENTRY MAIN ;REQUIRED by L80 !

;------------------
; MAIN

MAIN:

; 8080 code
; LXI SP,STACK ;SET LOCAL STACK POINTER
; LXI D,MSG
; MVI C,PRSTR
; CALL BDOS
; JMP BOOT

; Z80 code
LD SP,STACK
LD DE,MSG
LD C,PRSTR
CALL BDOS
JP BOOT

MSG:
DB CR,LF,'Hello World',CR,LF,'$'

;------------------
; STACK AREA

DS 100H ;MODIFY STACK SIZE AS NEEDED
STACK EQU $ ;TOP OF STACK

;------------------
END MAIN ;END <startlabel> REQUIRED by L80 !
;------------------
Mr Emmanuel Roche, France
2010-01-14 10:16:44 UTC
Permalink
Hello, John!
Post by John Crane
And Mr. Roche, my invocation works just fine as is.
Really? I stand by my words.
Post by John Crane
M80 =hello
There is no output file in your command line...

So, M80 cannot generate something that L80 could link.

QED!

(I am pretty sure, too, that ENTRY is not needed, since I have never
used it...)

Yours Sincerely,
Mr. Emmanuel Roche, France
p***@acm.org
2010-01-14 18:32:34 UTC
Permalink
Post by Mr Emmanuel Roche, France
Hello, John!
Post by John Crane
And Mr. Roche, my invocation works just fine as is.
Really? I stand by my words.
Post by John Crane
M80 =hello
There is no output file in your command line...
So, M80 cannot generate something that L80 could link.
QED!
(I am pretty sure, too, that ENTRY is not needed, since I have never
used it...)
Yours Sincerely,
Mr. Emmanuel Roche, France
Actually (using MACRO-80 3.44 09-Dec-81 and Link-80 3.44 09-Dec-81):

A>type hello.mac
CR EQU 0DH ; ASCII Carriage return
LF EQU 0AH ; ASCII Line feed
BDOS EQU 5 ; CPM BDOS entry point
PRSTR EQU 9H ; BDOS Print String Function
BOOT EQU 0H ; CPM Reboot

.Z80 ;Use Z80 mnemonics (delete for 8080)
ORG 100H ;CPM TPA starts @ 0100H

MAIN: LD SP,STACK
LD DE,MSG
LD C,PRSTR
CALL BDOS
JP BOOT

MSG: DB CR,LF,'Hello World',CR,LF,'$'

DS 100H ;MODIFY STACK SIZE AS NEEDED
STACK EQU $ ;TOP OF STACK

END MAIN ;END <startlabel> REQUIRED by L80 !

A>m80 =hello

No Fatal error(s)

A>l80 hello,hello/n/e

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

Data 0103 0321 < 542>

45596 Bytes Free
[0203 0321 3]

A>hello

Hello World

A>


To summarize
- m80 =hello works fine if hello.mac exists. It will create hello.rel.
- ENTRY is not needed but END MAIN is.

Peter
---
***@acm.org
Steven Hirsch
2010-01-14 12:51:38 UTC
Permalink
Post by John Crane
Thank you Mr Harrmann, for the links to the docs.
Looks like I need an ENTRY MAIN at the top and an END MAIN at the end for
L80 to make a COM file that actually works (the label MAIN: being the start
of my program). Evidently, the default must be for a
macro/module/library/whatever, but it's definitely not an executable file.
I used/abused M80/L80 extensively "back in the day" and have never even heard
of the psuedo-ops you refer to. I think those are for linking with high-level
languages (Fortan, perhaps?).

You should not need anything other than ORG 100H and the appropriate
compile/link flags. Might be worth giving the manuals a careful read, as I
think somewhere you have the assembler and linker working at cross-purposes.

One possibility: I _think_ there were variants of L80 available that were
particular to Microsoft's high-level languages. Is it possible you using one
of those? What is the full version number and product name displayed when you
run it?
John Crane
2010-01-14 15:10:43 UTC
Permalink
Post by Steven Hirsch
One possibility: I _think_ there were variants of L80 available that were
particular to Microsoft's high-level languages. Is it possible you using
one of those? What is the full version number and product name displayed
when you run it?
I think that's the key. I'm using copies of M80 and L80 I took off my old
Fortran disk for the Osborne. I had no idea there were variants. L80 says
its Link-80 version 3.43. It would make sense to have this assembler/linker
package default to producing linkable modules for F80. I guess that's why I
need the pseudo-ops. Maybe there's a command line option to get around it,
so I don't have to produce "non-standard" code. I'll have to dig a little
more on that. Great memory! Thanks.

-John
James Moxham (Dr_Acula)
2010-01-14 12:55:17 UTC
Permalink
Yes, a bit sad to say, but not only do I remember this, I was actually
using it when the message came through. (my crazy wireless CP/M
network is nearly ready...)

1) I can never remember the exact syntax of L80 and M80 so I wrote a
tiny .SUB to do this. I called it ZASM.SUB

It contains two lines with switches (which you can change if you like)
and a third line which runs the program as that is usually what I want
to do next.

M80 =$1 /Z/C/L/M
L80 $1,$1/N/E
$1

2) to compile,
SUPERSUB ZASM MYFILE

where MYFILE is MYFILE.MAC, but you don't include the .MAC as M80
assumes a .MAC extension

3) There are a number of syntax variations. I have found these by
trial and error and they are not exhaustive, but there is a subtle
difference between EQU and .EQU for example.

So I document these at the beginning of each program and copy that
over to each new one so I don't forget. Below is a simple "Hello
World" that uses strings and BDOS calls (which are safer than raw IN
and OUT and hence less likely to cause the computer to crash and go
haywire)

Hello World Program

; changing from tasm mnemonics - replace all $nn with nnH
; remove . in front of equ
; remove : in equ lines
; must have a CR/LF after END
; use zasm.sub with supersub
; eg supersub zasm myfile (where myfile is called myfile.mac but do
not put the
; mac in the instruction - m80 knows it is
implied)
; zasm.sub is the following two lines
;M80 =$1 /Z/C/L/M
;L80 $1,$1/N/E

JP MAIN ; jump to the main program

FDOS EQU 0005H ; COMMON ENTRY POINT FOR BIOS AND BDOS
READBUFF: DB 'ABCDEFGHIJKLMNOPQRSTUVWXYZ$' ; buffer for text strings
CRLF: DB 13,10,'$' ; carriage return line feed
FCB: DB 0,'TEST TXT',0,0,0,0,0 ; dummy entries for the fcb
TEST_TEXT: DB 'HELLO WORLD$'

; **************** Main
*************************************************************

MAIN:

LD DE,TEST_TEXT ; print hello
CALL WRITE_STRING_CR ; print it
RET ; back to CP/M

;***************** Useful BDOS subroutines pass DE
**********************************

WARM_BOOT:
LD C,0
CALL FDOS
RET
READ_CONSOLE:
LD C,1
CALL FDOS
RET
WRITE_CONSOLE:
LD C,2 ; FUNCTION NUMBER
CALL FDOS
RET
WRITE_STRING:
LD C,9
CALL FDOS
RET
WRITE_STRING_CR:
LD C,9
CALL FDOS
LD DE,CRLF
LD C,9
CALL FDOS
RET

READ_BUFFER:
LD C,10
LD DE,READBUFF
CALL FDOS
RET
OPEN_FILE:
CALL SET_DMA
LD C,15
LD DE,FCB
CALL FDOS
RET
CLOSE_FILE:
LD C,16
LD DE,FCB
CALL FDOS
RET
DELETE_FILE:
LD C,19
LD DE,FCB
CALL FDOS
RET
READ_SEQ:
LD C,20
LD DE,FCB
CALL FDOS
RET
WRITE_SEQ:
LD C,21
LD DE,FCB
CALL FDOS
RET
CREATE_FILE:
CALL SET_DMA
LD C,22
LD DE,FCB
CALL FDOS
RET
GET_DRIVE:
LD C,25
CALL FDOS
RET
SET_DMA:
LD C,26
LD DE,080H ; STANDARD DMA ADDRESS IS 80H
CALL FDOS
RET


END
Mr Emmanuel Roche, France
2010-01-14 14:42:13 UTC
Permalink
Hello, James!

I have not understood everything you said, so I just mention a few
little points.
Post by James Moxham (Dr_Acula)
1) I can never remember the exact syntax of L80 and M80
so I wrote a tiny .SUB to do this. I called it ZASM.SUB
Me, I simply wrote "m80 RELfile,PRNfile=MACfile" on the cover of my
M80 manual. There are so many M80 and L80 switches, that I always have
the manual when I use them.
Post by James Moxham (Dr_Acula)
It contains two lines with switches (which you can change if you like)
and a third line which runs the program as that is usually what I want
to do next.
M80 =$1 /Z/C/L/M
L80 $1,$1/N/E
$1
With CP/M's SUBMIT, you can have up to 9 inline parameters. You could
also write M80 $1,=$1 (for example). I note that you do not debug your
program (no /Y switch). Me, I must be a worse programmer than you,
because the command line I use (Under CP/M Plus, you can re-execute a
previously-executed command line as long as you want -- I have done
this several entire days.) ends with "start SID". It is only when the
program satisfy me, that I make the COM file. (Either with LOAD or
with SID.)

Your SUBmit file has a different name than the COMmand file. Under CP/
M Plus, you can have SUB, COM (and PRL, and ASM, and WS4) all with the
same filename. You can even tell CP/M Plus the order of filetype to
process (for exampe: SUB before COM). This way, you could have a
M80.SUB, also containing a L80 line. (They have different filetypes,
so they are different files.)

Under CP/M Plus, no longer need to type "SUBMIT M80 program": "M80
program" is enough. (You can also create a small SUB file containing
the actual filename: in this case, I usually use 2-letters filenames,
like ED and AS.)
Post by James Moxham (Dr_Acula)
3) There are a number of syntax variations. I have found these by
trial and error and they are not exhaustive, but there is a subtle
difference between EQU and .EQU for example.
The one I remember well is SET (8080 instruction) and SET (Z-80 pseudo-
instruction)...
Post by James Moxham (Dr_Acula)
; remove : in equ lines
Well, actualy, M80 is said to be Intel assembler-compatible, and this
one allows colons only after labels of the code section, not in the
data section which, for it, are differents.
Post by James Moxham (Dr_Acula)
; must have a CR/LF after END
Seems reasonable for CP/M... (Don't forget the CP/M EOF, too, or
strange things could happen!)
Post by James Moxham (Dr_Acula)
; use zasm.sub with supersub
Hum... Maybe a little bit too much bla-bla-bla for me. I noticed that
Digital Research's CP/M-86 programs contains the lines needed to
generate the files, since there is so much things that could be put in
the "Header Record" without the source code knowing it. In general,
you now see:

ASM86 program
GENCMD program
Post by James Moxham (Dr_Acula)
        JP      MAIN                                    ; jump to the main program
Big problem: why would you jump to the program in a "8080 Memory
model"? Why put the data section at the beginning of the program? If
you are using a relocatable macro-assembler (remember M80?), it uses 4
different "location counters": no matter where you put your data
section (like in the code section, like in this case), the elements of
the data section will be put in the data section. (I hope that you
understand what I means.) In addition, all the CP/M programs that I
have seen have their data section at the end of the program, before
the stack section. It simply seems simpler and better to do it this
way. So, use sections.
Post by James Moxham (Dr_Acula)
FDOS            EQU     0005H                           ; COMMON ENTRY POINT FOR BIOS AND BDOS
What??? A *COMMON* entry point for both the BDOS and the BIOS? I could
not believe my eyes! For me, BIOS = 0000H, and BDOS = 0005H.
Post by James Moxham (Dr_Acula)
READBUFF:       DB      'ABCDEFGHIJKLMNOPQRSTUVWXYZ$'   ; buffer for text strings
Well... Personally, I use:

ORG 0080H
Buffer:
RS 128
Post by James Moxham (Dr_Acula)
CRLF:           DB      13,10,'$'                       ; carriage return line feed
Hahaha! Personally, I use:

;--------------------------
; ASCII characters used.

bel EQU 07H
lf EQU 0AH
cr EQU 0DH

;-------------------------

So, crlf db cr, lf, '$' (It is a data section label, so no colon.)
Post by James Moxham (Dr_Acula)
;***************** Useful BDOS subroutines
With MAC, you can have an INCLUDE file containing all of them, outside
the source code file. With LINK-80, it can search the subroutines used
in a LIB file. In both cases, no need to include them in the source
code. Especially if they are not used. The source code file is also
faster to assemble...
Post by James Moxham (Dr_Acula)
        END
If it is a simple CP/M 2.2 COMmand file, I always use END 0100H.

Ho, by the way, I saw that you use:

LD DE,080H ; STANDARD DMA ADDRESS IS 80H

Sorry to contradict you, James, but the DMA Buffer is at location
0080H. It is a WORD value (an address), not a BYTE value.
Post by James Moxham (Dr_Acula)
(my crazy wireless CP/M network is nearly ready...)
Finally, something interesting!

Hope to hear from you soon.

Yours Sincerely,
Mr. Emmanuel Roche, France
Tom Lake
2010-01-14 18:55:50 UTC
Permalink
Post by Mr Emmanuel Roche, France
Big problem: why would you jump to the program in a "8080 Memory
model"? Why put the data section at the beginning of the program?
We MS-DOS programmers learned to do it that way because of a bug
in early versions of the Microsoft/IBM assembler which didn't always
generate correct code for forward references. Why old CP/M
programmers would do it is beyond me although all the examples in
the TRS-80 Editor/Assembler manual also show data items first.

Tom Lake
John Crane
2010-01-14 19:20:19 UTC
Permalink
Post by Tom Lake
Post by Mr Emmanuel Roche, France
Big problem: why would you jump to the program in a "8080 Memory
model"? Why put the data section at the beginning of the program?
We MS-DOS programmers learned to do it that way because of a bug
in early versions of the Microsoft/IBM assembler which didn't always
generate correct code for forward references. Why old CP/M programmers
would do it is beyond me although all the examples in
the TRS-80 Editor/Assembler manual also show data items first.
Tom Lake
Maybe because the programmers learned programming on a high level language
compiler before they started to use assembly? There you must declare your
variables before you use them. And the habit stuck.

-J
James Moxham (Dr_Acula)
2010-01-15 12:54:04 UTC
Permalink
Post by John Crane
Maybe because the programmers learned programming on a high level language
compiler before they started to use assembly? There you must declare your
variables before you use them.  And the habit stuck.
Yes, guilty as charged!

Thanks ++ to Mr Roche for all the tips on programming. I taught
myself, and hence learned lots of bad habits. It is very helpful to
get advice from an expert like yourself.

I spent tonight moving my data to the *end* of my programs and fixing
up some other things as suggested.

Re the wireless network, this is slightly off topic (but relevant as
it is written in assembler), but it started working tonight. Able to
log into any named board within radio range (up to 3km line of sight).
Run Mbasic/Wordstar etc on the remote machine. Write a program.
Compile it remotely via wireless. Even run XMODEM R MYFILE on the
remote machine, then log out, then run XMODEM S MYFILE on the local
machine and transfer files over. I change the color of the text on the
screen when it is running a remote machine to remind me whether it is
local or remote.

Compiled high level languages were not fast enough, especially when
lots of data was streaming back eg a DIR. So good old M80 and L80 are
getting lots of work. It is fun to write a new version in Wordstar,
compile it and then send it off to other machines wirelessly. No PC
needed!
Mr Emmanuel Roche, France
2010-01-15 16:48:50 UTC
Permalink
Hello, James!

As usual, I find your messages fascinating... Too bad you live so far
away!
Post by James Moxham (Dr_Acula)
Thanks ++ to Mr Roche for all the tips on programming. I taught
myself, and hence learned lots of bad habits. It is very helpful to
get advice from someone like him.
Well, you are too kind: 2 minutes after publishing my last message, I
Post by James Moxham (Dr_Acula)
The one I remember well is SET (8080 instruction) and SET (Z-80 pseudo-instruction)...
The irony is that I wrote "remember well", and mixed the instruction
with the pseudo-instruction: SET is a 8080 pseudo-instruction, and a
Z-80 instruction. I don't know why nobody spotted this obvious error.

By the way, just a few days ago, the "Dr. Dobbs Z80 Toolbox" book was
mentioned: I highly recommend it. (I never liked SYSLIB and the
Zstuff.)
Post by James Moxham (Dr_Acula)
I spent tonight moving my data to the *end* of my programs and fixing
up some other things as suggested.
Hahaha! I only gave advices based on experience: if your experience
tell you otherwise, follow your experience. Me, I separate pseudo-
instructions from instructions with "--------" lines, like:

;--------------------
.Z80
ORG 0100H
ASEG
;--------------------

and, now that I learned the 8086, I now separate carefully the
sections:

;-------------------
CSEG
;-------------------

bla-bla-bla

;--------------------
DSEG
;--------------------

bla-bla-bla

;-------------------
SSEG
;-------------------

bla-bla-bal

;-----------------
END (0100H for standard CP/M COMmand file, nothing
for REL files)
;-----------------

("COMMON" is used when several modules linked separately use a common
memory area.)

Except that, I am pretty standard. But also re-read carefully what I
wrote in the "Macro Assembler for Z80" thread. For example, all the
programs published so far, using M80, that is to say: a relocatable
macro-assembler, did not use either (separately relocatable) sections
or macros. In short, there are 2 ways to shorten ASM programs: macros
and "!". By "!", I mean: writing several instructions on the same
line, as shown in the "Macro Assembler for Z80" thread.

Macros allows you to build higher and higher instructions, until you
no longer have a single CPU instruction in your whole source code, but
only some high-level statements. Several Programming Languages were
written only in macros: SNOBOL was a standard example. Only the LIB
files were containing CPU instructions. This way, a program as
difficult as the SNOBOL language could be ported from CPU to CPU,
simply by assembling the source code with a different LIB file. ("The
Amstrad CP/M Plus" book shows how to emulate most of the C language
PRINTF command in a macro, to give you a simple example.)
Post by James Moxham (Dr_Acula)
Re the wireless network, this is slightly off topic (but relevant as
it is written in assembler), but it started working tonight.
You are starting to make CP/M history. Ralf Kästner is also improving
his TCP/IP stack for CP/M 2.2, using Z-80 code. But he is less vocal
than you.
Post by James Moxham (Dr_Acula)
I change the color of the text on the
screen when it is running a remote machine to remind me whether it is
local or remote.
Hahaha! Excellent! This reminds me of the black/red ink used by some
early CP/M microcomputers!
Post by James Moxham (Dr_Acula)
Compiled high level languages were not fast enough, especially when
lots of data was streaming back eg a DIR. So good old M80 and L80 are
getting lots of work.
Well, as I wrote several times, I prefer MAC and SID, and 8080 stuff.
But the most important thing is for you to know and like the programs
that you use. (If you are in the Z-80, there is a faster (4 times
faster) Z-80 assembler available (SLR Z80ASM). For Old Timers like me,
there is even an "Extended Intel mnemonics" version available, but it
needs a separate pass to generate a SYM file, compared to MAC.
Post by James Moxham (Dr_Acula)
It is fun to write a new version in Wordstar,
compile it and then send it off to other machines wirelessly. No PC
needed!
Yes, that's why I wrote the WS4-to-HTML File Converter: the idea is to
publish an entire Web site only with 8-bit CP/M programs. Ralf Kästner
is very near this goal.

Yours Sincerely,
Mr. Emmanuel Roche, France
Mr Emmanuel Roche, France
2010-01-15 22:53:53 UTC
Permalink
Upon re-reading what I wrote, I am struck by the fact that I talked
about the various "sections" of a CP/M program (when I finally read
the manual, I discovered that, in 1972, Gary Kildall was already
dividing the output of its PL/M compiler in separate code, data, and
stack segments, even before the 8080). That's why I am always
surprised when someone mentions that he does not understand the
concept of "sections" of the M80. Especially if you considered how
many persons used it.

Anyway, before the code section, I put the various declarations.
However, over the years, I developed a way of doing it.

So, I start by the comments (name of the file: *ALWAYS*, author,
references/purpose of the program and, now, the command lines used to
generate the COM file). (Yes, I know: I never write the date. And,
until Version 3 of WS4HTM, I never put version numbers, too.)

After that, I start the EQUates, but I divide them according to their
purposes. Example:

;-----------------------
false EQU 0
true EQU NOT false

;-----------------------
; ASCII characters used.

;----------------------
; BDOS calls used.

;----------------------
; Page Zero locations used.

As you can see, I go from the simpler (logical, byte) to the bigger
(addresses). I also put them in alphabetical order: this makes it
easier to find a given label.

Some people use "loc EQU 1234H", me, I usually use:

ORG 1234H
loc DB/DS 12

(Note that DB puts an *initialized* field in an Intel HEX file, while
a DS leave a "hole" in the HEX file which, when loaded (for example,
by SID) will leave there what was in memory before loading the HEX
file. Normally, LOAD fills DS fields with 00H, but some programs fill
them with 1AH.)

Since the code section begins with a ORG 0100H, I usually put the
memory locations in sequential order, like:

ORG 0000H
bios

ORG 0005H
bdos

ORG 005CH
fcb1

ORG 0080H
DMAbuffer

and finish, of course, by the classical ORG 0100H.

When I need to know the last byte used, I use:

the END

and "the" is last location + 1 (the NEXT address displayed by DDT/SID
when you debug the program).

Well, I hope not to have forgotten too many things.

Yours Sincerely,
Mr. Emmanuel Roche, France
Mr Emmanuel Roche, France
2010-01-16 08:11:45 UTC
Permalink
(...) I also put them (the labels) in alphabetical order: this makes it
easier to find a given label.
Argh! I meant: numerical order... (For example, the BDOS system call
names.)

Yours Sincerely,
Mr. Emmanuel Roche, France
s100guy
2010-01-18 00:30:29 UTC
Permalink
I normally tinker around in ASM to get my assembly chores done.  But I
started playing with Microsoft's M80 & it's associated linker, L80.
***** snip ******

Just a couple of other comments, John. If you are interested in the
Cromemco assemblers, there are source files for three (v. 2.15, 3.01
and 3.15) on my Web site (www.hanscom.us, in the "boneyard") and a
copy of the manual. I think that at least some are CDOS specific, so
that may be a limiting factor.

Lastly, don't let anybody (even a Frenchman) make you feel bad about
using an assembler that you like. The fastest linker in the world
isn't going to make a hill of beans difference for most things. Maybe
if you are assembling the equivalent of Word* on a daily basis, it
would save some time? Otherwise, who cares?

Use what you like -- like what you use.

Roger
Ole Christensen
2010-01-18 23:41:40 UTC
Permalink
s100guy skrev:
---snip---
Post by s100guy
If you are interested in the
Cromemco assemblers, there are source files for three (v. 2.15, 3.01
and 3.15) on my Web site (www.hanscom.us, in the "boneyard") and a
copy of the manual. I think that at least some are CDOS specific, so
that may be a limiting factor.
Thanks,... on that site i found "asmb3_10.mac":
;
; disassembly of Cromemco CDOS assembler
; version 3.10 rzh 7/2009
;
---snip---
ORG 100h

JP start

h103: db ':'
h104: db 80h
h105: db 0
h106: db 14h
h107: db 0
h108: db 40h
db 7

---snip---

Here are the "keys" for those bit's & byte's:
<ole>

---
Appendix C - MODIFYING ZASM OPTIONS

The default value of various Assembler options can be
changed by modifying locations 103H to 109H for ZASM
(403H to 409H in case of ASMB).
These changes may be accomplished by assemble the
configurations file present in the next section to a
hex file with ZASM and then using the Cromemco DEBUG
program to first load ZASM.COM into memory and then
overlay the ZASM-CF.HEX file with DEBUG's 'R' command,
after that your ready to saving the modified ZASM.COM.

ZASM - ASMB
Hex Location Current bit Default Option
103 403 3AH PAGE=
104 404 80H WIDTH=
105 405 00H TOP=
106 406 0 0 Unused
1 0 Unused
2 0 XREF
3 0 SYMB
4 0 RANGE
5 0 PARITY
6 0 Unused
7 0 Unused
107 407 0 0 Unused
1 1 NOGEN
2 1 NOCOND
3 0 OPCODE
4 0 DEBUG (Unused)
5 0 COND
6 0 GEN
7 0 Unused
108 408 0 0 Unused
1 0 Unused
2 0 TEXT
3 1 NOTEXT
4 1 LISTON
5 0 LISTOFF
6 0 TRUNC
7 0 Unused
109 (number of chars for ENTRY & EXTRN
should only be 6 or 7)
---snip---

Title ZASM ConFig V1.01
Title2 File: ZASM-CF.Z80
; ************************************************
; Constants, Don't change!
; ************************************************
ON Equ -1
OFF Equ NOT ON
; ************************************************
; Assemble with: D>ZASM zasm-cf hex<cr>
; then
; Load: D>DEBUG zasm.com<cr>
; then
; -Fzasm-cf.hex<cr>
; -R<cr>
; and
; -Fzasm.com<cr>
; -W<cr>
; -^C
; and, I hope, you have perfect working -
; copy of your favorite assembler
; ************************************************
; Select paper size
; ************************************************
Top Equ 0 ; Line(s)/ before Title
Length Equ 66 ; Lines / Page
Width Equ 80 ; Char / Width
; ************************************************
; Select ON or OFF for options
; ************************************************
Xref Equ OFF ; Xref Tabl.
Symbol Equ OFF ; Symbol Tabl.
Range Equ OFF ; mark (Jp)
Parity Equ OFF ; Parity (8080)
Opcode Equ OFF ; Opcode
Debug Equ OFF ; unused ?
Cond Equ OFF ; List Cond
Gen Equ OFF ; List Gen
Text Equ OFF ; List Text
List Equ ON ; List On, Off
Trunc Equ OFF ; Trunc
; ************************************************
; # char in EXTRN & ENTRY
; ************************************************
NameL Equ 7 ; Fill in (6 or 7)
; ************************************************
; Select Cromemco Inc. version
; ************************************************
ZASM Equ ON ; Without CDOS simulator
ASMB Equ NOT ZASM ; With CDOS simulator
; ************************************************
; <<<<<<<<<<<<<----------->>>>>>>>>>>>>>>>
; ************************************************
; Don't change in the rest of this code!
; Start address for overlay
; ************************************************
IF ZASM
Org 0103H
ELSE
Org 0403H
EndIF
; ************************************************
; let a macro do the hard work
; ************************************************
Auto: Macro #B0,#B1,#B2,#B3,#B4,#B5,#B6,#B7
Byte DefV 0 ; Reset to zero
Bit DefV 1 ; first bit
Irp #Bx,#B0,#B1,#B2,#B3,#B4,#B5,#B6,#B7
IF #Bx = ON
Byte DefV Byte OR Bit ; set bit if true
EndIF
Bit DefV Bit SHL 1 ; next bit
EndM
DefB Byte
EndM
; ************************************************
; Data area starts here
; ************************************************
Lx03: DefB Length
Lx04: DefB Width
Lx05: DefB Top
Lx06: Auto OFF,OFF,Xref,Symbol,Range,Parity,OFF,OFF
Lx07: Auto OFF,NOT Gen,NOT Cond,Opcode,Debug,Cond,Gen,OFF
Lx08: Auto OFF,OFF,Text,NOT Text,List,NOT List,Trunc,OFF
Lx09: DefB NameL AND 7
; ************************************************
; End of overlay file
; ************************************************
End
---snip---
Mr Emmanuel Roche, France
2010-01-19 08:20:54 UTC
Permalink
Hello, Ole!

Hahaha! Excellent! Just a few days ago, I mentioned some points of
writing assembly language programs, and you provide a nice little
example of macro use.
        Title   ZASM ConFig V1.01
        Title2  File: ZASM-CF.Z80
So, you use the TITLE pseudo-op. Me, I would simply have used:

; ZASM-CF.Z80
; --------------------

Two lines shorter (no title line), when you print the program.
; ************************************************
        ; Constants, Don't change!
; ************************************************
Hahaha! I cannot remember mentioning "constants" in one of my
programs! I was told (many years ago), that programs were using
"variables" (according to statistics, 50% of the bugs are located in
their definitions, so PLs without previous declarations of variables,
like BASIC, have a big advantage that is not obvious to C
Newbies),that's why there are EQUate lines at the start.

Also, me, I prefer lines of "-------". Since they are comments, with
"extended ASCII" characters, it is even possible to have real
contiguous lines on screen and paper. You like to have 2 lines
enclosing a comment. Me, I now prefer one single line of "------",
followed by the label of the subroutine, followed by a paragraph of
comments (if needed), followed by the code of the subroutine.
Something like:

;------------------------
Label:

; bla-bla-bla
; bla-bla-bla

mvi c, RetBDOSVerNum! call bdos
jmp bios

etc, until the next line of "---------". (Singles ";" at the beginning
of lines take time to be processed. The human eye needs an empty line
to separate stuff in a page. With practice, he will skip automatically
";" lines. But it is even simpler not to write single ";" lines.

Normally, a register loads something from somewhere, does something on
it, then saves the result to somewhere else. This is the ASM
equivalent of LET A=B+3. So, it seems more logical (to some) to write
assembly language programs this way. (Notice that the order of CALL
parameters is, of course, reversed, compared to a high-level PL.) With
indentation, ASM programs look like high-level PL programs. After a
while, you can translate from one to the other almost automatically.

(With "Literate Programming", you can put those paragraphs in your
source file: they will be removed when the assembler processes the
file, thus speeding the assembly, and they will not take place in the
PRN file. A big, practical advantage. All that thanks to WordStar.)
ON      Equ     -1
OFF     Equ     NOT ON
Hahaha! One more stylistic difference! "-1" is a shortcut for "FFFF",
which, itself, is a shortcut for "INTEGER 65535". The NOT reverses all
the bits, leading to 0. Me, I prefer:

false EQU 0
true EQU NOT false

Notice also that you speak of ON and OFF, while they are LOGICAL
predicates. Me, I prefer to reserve ON and OFF for switches.

(I don't know why your program appeared garbled on my screen. Me, when
I publish a WordStar file, it appears nicely right-justified, with all
the tabs properly aligned vertically.)

Finally, I note that you use "Equ" and "Org" and "DefB" (I prefer the
DB of Intel). Since they are pseudo-ops, I prefer to write them in
uppercase, and the variables in lowercase (for lone label names, I use
UC characters for multi-word names). At the beginning, maybe because I
had an ASR-33 Teletype, I was writing everything, except comments, in
uppercase. Now that I use "!" lines, I no longer write the mnemonics
in uppercase.

Yours Sincerely,
Mr. Emmanuel Roche, France
Ole Christensen
2010-01-19 19:14:49 UTC
Permalink
Post by Mr Emmanuel Roche, France
Hello, Ole!
Hahaha! Excellent! Just a few days ago, I mentioned some points of
writing assembly language programs, and you provide a nice little
example of macro use.
Hello Emmanuel,
Thanks,... glad You like it,...
Post by Mr Emmanuel Roche, France
Title ZASM ConFig V1.01
Title2 File: ZASM-CF.Z80
; ZASM-CF.Z80
; --------------------
Two lines shorter (no title line), when you print the program.
Of cause to use both "Title" & "Title2" in a "program" of
this size are the total overkill, anyway the 2 lines ARE there,
why? Because this is "copy / past" from the manual, or
maybe i should say: from my extension to the manual, and as so
i did try to show some of the features of the assembler in
those simple "Examples"...

I do believe that a "tool", like an assembler, are as good
as it's manual, i mean: if You can't figure out easy how
to call or start the program it's not of much use..
And i must say that the MAC & RMAC manual are some of the
best i ever seen. And so, for long time ago, i did try to
make the Cromemco Zasm manual a better manual...
Post by Mr Emmanuel Roche, France
; ************************************************
; Constants, Don't change!
; ************************************************
Hahaha! I cannot remember mentioning "constants" in one of my
programs!
It is not to be changed if You don't understand the meaning
with them and if You do then You don't change anyway...!

---snip--- (a lot of interesting stuff)
Post by Mr Emmanuel Roche, France
ON Equ -1
OFF Equ NOT ON
Hahaha! One more stylistic difference! "-1" is a shortcut for "FFFF",
which, itself, is a shortcut for "INTEGER 65535". The NOT reverses all
false EQU 0
true EQU NOT false
Notice also that you speak of ON and OFF, while they are LOGICAL
predicates. Me, I prefer to reserve ON and OFF for switches.
I see this as "switches",... "ON" or "OFF"...
; ************************************************

; Select ON or OFF for options

; ************************************************

Xref Equ OFF ; Xref Tabl.

Symbol Equ OFF ; Symbol Tabl.

...
Post by Mr Emmanuel Roche, France
(I don't know why your program appeared garbled on my screen. Me, when
I publish a WordStar file, it appears nicely right-justified, with all
the tabs properly aligned vertically.)
I sure can tell You why:
It is You that, after all those years, still can't figure out
how to set up a news-reader,...! What people in France cypher-cafe's
are using i don't care, but i do expect a man of Your caliber to
select a "mono-space" font-style when reading messages with code before
complaining, or, a least "copy / past" to an editor before writing
bullshit like that...!

How hard can it be(?)
<ole>
Mr Emmanuel Roche, France
2010-01-19 22:01:34 UTC
Permalink
Hello, Ole!

Ok. This thread seems to reach its end. I only have one more thing to
say.
Post by Ole Christensen
Post by Mr Emmanuel Roche, France
(I don't know why your program appeared garbled on my screen. Me, when
I publish a WordStar file, it appears nicely right-justified, with all
the tabs properly aligned vertically.)
It is You that, after all those years, still can't figure out
how to set up a news-reader,...! What people in France
cypher-cafe's are using i don't care, but i do expect a
man of Your caliber to select a "mono-space" font-style
when reading messages with code before complaining,
or, a least "copy / past" to an editor before writing
bullshit like that...!
Hahaha! But, Ole, it is precisely *me* who explained how to display
the comp.os.cpm Newsgroup messages with Outlook Express, using a fixed
font! And you published 2 messages in this thread! Remember? "Hacking
the Atari 1050 as a CP/M drive"... My 2 messages of the 29 December
2009, timed 17:10 and 17:29, explained how to read properly tab-
aligned messages.

In the present case, my guess is that you did not convert the tabs to
spaces. I think that's the cause of the problem, since all my WS4
files (using spaces) display properly tab-aligned columns. (Just re-
read "WS4HTM Version 3".)

It is precisely to solve this problem that I published the "ASM-to-WS4
File Converter" (the 20 June 2009, at 07:41!). Remember? This way,
publishing assembly language programs on the Internet is a breeze.

By the way: Fair Winds!

Yours Sincerely,
Mr. Emmanuel Roche, France

Continue reading on narkive:
Loading...