home *** CD-ROM | disk | FTP | other *** search
-
- This is the first posting of the Z80 microemacs source.
-
- 1. HISTORY
-
- I started with microemacs 3.6, which said
- " * This program is in public domain; written by Dave G. Conroy."
-
- All the files being edited in the buffers are kept in
- memory; it was fairly easy to compile the version of
- microemacs I used, and produce a runnable program, but the
- first version had no space at all for files!
- (March 1989).
-
- Porting to cp/m was easy because I used AZTEC C ( version
- 1.05c, from 1982 ). I really would have preferred BDS/C
- because compilation is so fast, but: no static initializers,
- no typedefs, no "long"... I'm not sure if BDS has overlays.
-
- If BDS has overlays, it would be worth while porting my
- version to BDS. If it doesn't, an overlay system could
- be added.
-
- I started making overlays and optimizing, and soon
- ( June 1989 )
- could edit about 24KB of one file ( 58KB TPA ).
-
- As soon as I could edit 3K, I started using the editor to
- maintain itself; editors are always well-tested if you use
- them to maintain themselves.
-
- This is why the original files were split up into very
- small pieces, and some comments removed.
- The comments removed include the microemacs authors'
- names, but microemacs is freely available with
- attribution. No attempt to hide the origin is intended.
-
- I think the version of microemacs I used was 3.6,
- but I can't be sure.
-
- Then I stopped and created a program for customization of
- the binaries, figuring to distribute the z80me program in
- that fashion.
-
- There is one customization program that patches
- terminal-control sequences into the binary, and another that
- patches keystroke-to-command bindings.
-
- I could find no CP/M BBS to post it to, and gave up.
- ( July 1989 ).
-
- Documentation was never written, especially for the
- customization, and now I have to work from memory.
-
- In fact, I find no program to patch terminal-control;
- the term-control module was written to make this
- possible, though.
-
- In August or September, 1991, I saw a message in comp.os.cpm
- asking about editors. I posted a notice about microemacs for
- cp/m and got many helpful and encouraging replies.
-
- ----------------------------
-
- 2. PHILOSOPHY AND FEATURES
-
- This program also embodies some of my thoughts about the
- nature of editors. Programmers use the editor more than any
- tool, and think about it less than any other. Even with a simple
- editor like vi, most programmers don't bother to learn every
- command...
-
- The version of microemacs that I started with was an awful
- editor, and I hated it. Some things had to change if I was
- to use it, so I changed them.
-
- If an editor's bindings are perfect from the standpoint of
- having neat little mnemonics ( ^N for "next line" ), they
- may are unlikely to be perfect from the standpoint of making
- frequently-used commands easy to type. A prime example is
- the emacs binding of Meta-f for "word forwards"; this is a
- frequently-used command, and should be ONE KEYSTROKE!
-
- The default Z80EMACS word forward is ^F, word back is
- ^B, del word forward is ^W.
-
- If an editor's bindings are perfect from both of the above
- standpoints, they still will run into trouble with the
- keyboard: yes, the dreaded ARROW KEYS.
-
- If you're alert, and leaning forward over the keyboard,
- you may not want to use the arrow keys; such is the
- argument in favor of vi's "hjkl".
-
- If you're thinking instead of typing, browsing instead
- of hacking, you want the arrow keys to work.
-
- Z80EMACS has predefined arrow keys that fit most
- ASCII terminals, ^H^J^K^L, and ^V the same as ^J.
-
- If a command is hard to type, so what? If you use it twice
- in a row, simply use the "REPEAT LAST COMMAND" key!
- It appears that I never put this feature into Z80EMACS.
-
- vi has two different kinds of word commands, "W" and "w"
- ( it also provides forward, backward, and forward-to-end
- directions for them ).
- Z80EMACS has word-forward and word-backward commands, just
- two commands, but there is another command that changes the
- way these two work -- you can use vi-style or emacs-style
- words, and stop at end-of-word or at beginning-of-word.
-
- Z80EMACS doesn't implement the vi ^^ ( control-carat )
- command, that you use to toggle between buffers, but it does
- have the vi :n command, that you use to sequentially walk
- the linked list of buffers. It is inexcusable for any editor
- to be without at least one of these two commands.
- Both commands SHOULD exist.
-
- Z80EMACS can display more than one buffer on the screen at
- the same time; this capability was part of the original
- microemacs. With more than one buffer on the screen,
- however, you must remember to type very slowly!
-
- Z80EMACS stores its keyboard macro in a file; it uses the
- same mechanism as the "execute-file" command, which
- microemacs didn't have.
- Keyboard macro execution is slow, but it's better than
- retyping commands.
- Storing the keyboard macro in a file means that you can use
- it again after you exit and restart the editor.
-
- It looks like Z80EMACS still doesn't have "execute
- file"; however, internally, "execfile" would use the same
- mechanisms that you use to execute the keyboard macro
- from a file, and so "exec file" can be added with
- relative ease.
-
- Z80EMACS makes ".BAK" files when it saves or writes.
-
- Z80EMACS has the "vikill" command; kills whole lines, no
- matter where the cursor is in the line. I despise the emacs
- ^K command, except when used as "kill-to-end" ( the
- emacs-style kill is still there ).
-
- Z80EMACS has funny vertical arrows. Up-arrow moves two
- lines. Both up-arrow and down-arrow can wrap from the last
- line of the buffer to the first line. These are both bugs
- that would have been easy to fix; both are interesting
- features.
-
- I put the funny up-arrow in my unix version of emacs,
- and used it for at least a year before deciding I
- didn't like it after all ( it was that close to being a
- wash! ). The idea is, if you don't specify a parameter,
- up-arrow moves by two lines; if you do specify, it moves
- the correct number. If you want to move up 1, 2, 3, 4,
- 5, or 6 lines, it takes 2, 1, 3, 2, 4, or 3 keystrokes
- instead of 1, 2, 3, 4, 5, or 6 keystrokes; an average
- savings of one keystroke per line. However, moving up 1
- line is the most common case, and the extra mental
- effort involved in overshooting and moving down one is
- distracting. ( As I type this, I have funny-up-arrow in
- effect on UNIX; you really do get used to it. )
-
- Z80EMACS has two different command introducers; one for
- positive values ( ^U, "universal parameter" ), one for
- negative ( ^\ ). Many commands have special meanings with
- negative parameters.
-
- According to my editor theories, it's easier to learn
- and remember some of the odd commands if they're
- shoehorned onto normal commands with special parameters.
-
- For example, take the "go-to-start-of-line" command,
- with the normal emacs binding of ^A; if you just enter
- ^A with no parameters, you go to column 0; with the
- "shoehorn" theory in effect, if you specify a positive
- parameter, you go to column N, and if you specify a
- negative parameter, you go to the first non-white-space
- character in the line. I feel this is better than having
- three separate commands ( vi "0", "|", and "_",
- respectively.
-
- Metadigits start arguments.
- They start arguments between those who like their emacs to
- accept escape-9 as a command, and those who like it to
- supply an argument of 9 to the next command.
- I am in the latter camp, so in Z80EMACS,
- Metadigits start arguments.
-
- Z80EMACS has the vi "find-character-in-line" command.
-
- Z80EMACS has the "goto line by line number" command.
- (but doesn't display line numbers, so it's not as useful a
- command as it should be).
-
- Z80EMACS allows you to change the buffer name as well as the
- file name.
-
- Z80EMACS has the vi "go to column number" command: "go to
- start of line" with a positive parameter goes to a specific
- column in the line. ( with a negative parameter, it goes to
- end-of-line. )
-
- -----------------------------------------------
-
- Alas, no regular expressions, no search-replace.
-
- -----------------------------------------------
-
- 3. OPTIMIZATION TO SAVE SPACE
-
- In order to have more room for editing files, the program
- had to be made smaller. A large part of this was done by
- moving things to overlays, but some of it was pure
- byte-squeezing.
-
- Most of the optimization was done in the root segment, but
- several overlays were optimized to make the overlay area
- smaller.
-
- The key to good performance with overlays is to have all the
- most-often-used commands in one overlay: this is ovudfb31.c
- ( overlay up down forward back, overlay 31 )
-
- Almost every file was touched.
-
- Simple things like "putting the most-often-used structure
- member first in the structure" can save a lot of bytes.
- Using exactly the right number of register variables helps.
- Making exactly the right variables into registers helps.
- You have to experiment with your compiler...
-
- #define temp_int (*(int *)0xc0)
- saves bytes, compared to a stack variable; if ZCPR uses this
- area, too bad. I used a simple CP/M 2.2, with CCPPLUS,
- and the original ( Digital Research ) BDOS.
- I used zsid on the program to find out where in main() the
- main processing loop starts, and used up those addresses as
- variable addresses; I also discovered that nobody was using
- 0xc0 to 0xcf, and used those locations as well.
-
- Using temporary variables instead of repeated
- curwp->w_bufp->b_dotp->something->something_else
- saves a lot of bytes.
-
- Rewriting the whole thing with a better algorithm also saves
- a lot sometimes!
-
- When microemacs lengthens a line, or when it creates a new
- line, it allocates 16 bytes. Z80EMACS allocates 4 bytes.
- The savings is tremendous, especially when there are blank
- lines in the file.
-
- This is in line.c; for a while, I had COHERENT 3.0,
- which came with microemacs 3.8 as its only editor.
- I made the same change there, because they only had
- small-model compiler, and it dumped core!
-
- The AZTEC C library was available in source form. I chopped
- it down by quite a few bytes. Goodbye, stderr!
-
- Replacing shared, duplicated code with a "goto" is an
- optimization that a real C compiler will perform.
- The one that comes free with UNIX doesn't do it, and neither
- does CP/M AZTEC C. ( "gcc" does, though. )
-
- Making the messages more terse saves bytes!
-
- 4. STRUCTURE OF THE PROGRAM AND OF THE POSTINGS
-
- comp.os.cpm isn't a "source-files" newsgroup.
- The whole source adds up to just under 600KB, uncompressed.
- One is not supposed to post so much to comp.os.cpm...
-
- I don't have direct internet access, so I can't just pop it
- into an archive site.
-
- I've decided to handle the source by mailing it to a volunteer
- >> acknowledged in the Internet version ofthis file <<
- who can simply stick it into an internet archive site.
-
- This will be part00, and it will run to about 8 parts.
-
- The Z80EMACS editing system now consists of 3 ".COM" files,
- a slew of overlay files, a text data file, a ".SYM" file,
- source of one module, and minimal documentation.
-
- It supports ASCII and ANSI terminals, but the user has to
- patch it by hand; this uses the source file and the ".SYM"
- file.
-
- Binding of keystrokes to editor commands is a two-step
- procedure, using two of the ".COM" files, the text file, and
- the ".SYM" file. mapkeys.com makes a mapping, writing it to
- an intermediate file; meconfig.com uses the intermediate
- file to patch ME.COM.
-
- Z80EMACS can find its overlays if they are on the current
- drive, on drive a:, or on drive b:, or on drive c:, but only
- ( I think ) in the current user area -- checking other user
- areas is a job for a more advanced BDOS than the one I used,
- not a job for an application program.
-
- There are only two known bugs:
-
- 1. Random crashes, about once every three or four hours.
- No clues, and it doesn't happen often enough to make it
- easy to track down.
-
- 2. The file you name on the command line doesn't get read
- in. The buffer gets named okay, but the file is never
- read.
-
- Note: both the bugs were fixed since the above was written.
- Several other things were also corrected.