Virtual Reality

Live coding a vi for CP/M, from scratch

The other day, being unable to find a suitable open-source text editor for
cpmish, I sat down and wrote a simple vi-like editor. It took
nine hours. I have it all on video.

This was a marathon. My original plan turned out to simply be not fast
enough: I’m using the Amsterdam Compiler Kit
compiler, because it’s the only one which will generate 8080 machine code,
but the code quality isn’t good and is very slow. So partway in I had to redo
the entire display layer when I realised that I couldn’t do screen updates
fast enough. (It would totally have worked had I written it in raw machine
code…) I also took several other wrong turns later, all of which wasted
time. But I did eventually produce an adequate, working text editor,
supporting most of the basic vi editing commands I use.

  • 00:01:30 Boilerplate
  • 00:05:30 First, broken version of the refresh code
  • 00:58:35 Start work on the editor
  • 01:36:00 Initial text rendering works; start work on command loop
  • 01:36:30 Realise that I need direct BIOS access and I add support to the ACK
  • 01:54:40 Continue on the command loop and cursor movement
  • 02:39:00 Realisation that the screen refresh code won’t work
  • 02:44:00 Start ripping out the refresh code
  • 03:07:00 First redraw with the new refresh code
  • 03:22:00 Horizontal cursor movement works
  • 03:48:30 Vertical movement works, slowly
  • 03:56:57 Dinner break, decision to drastically simplify editor model
  • 04:28:05 Cursor movement with the new model works
  • 04:51:10 Cursor movement with the new model works quickly
  • 05:00:00 Insert mode works
  • 05:21:30 Motion by words works
  • 05:37:45 Repetition count works
  • 05:49:40 Inserting newlines works
  • 06:30:00 Scrolling works, up to a point
  • 07:17:30 Lots of commands work, start thinking about batching redraws
  • 07:34:45 Notice a hanging problem with scrolling over big lines
  • 07:39:30 Tea break, remove all the batching redraw stuff
  • 08:07:08 Finally figure out the horrible scrolling bug
  • 08:53:15 Saving documents works
  • 09:09:07 Simple colon commands work

Right now it’s a shade under 10kB, allowing files of up to 49kB on a Kaypro
II; that’s not bad. If I were to recompile it with sdcc it’d be both faster
and about half the size but sdcc’s CP/M support is very poor and I keep
running into code generation bugs, so I’m sticking with the ACK for now.
(Maybe when z88dk reaches Debian…)

The main missing features are search and a yank buffer. Neither would be hard
to add, although I don’t think this will ever get regular expressions, and
the yank buffer is most easily implemented by keeping the buffer on disk;
that’d be slow, though.

Since doing the video above I’ve done some polishing, bugfixing, and a few
more features. Terminal support is now factored out into a standalone
library, making it easy to support multiple terminal types, and for the
Kaypro II and NC200 it supports the erase-until-end-of-line control code,
making redraws a lot faster.

The code is BSD-2 clause licensed, meaning you can pretty much do with it
what you like!

Read More

Related posts

Facebook plans June 18th cryptocurrency debut. Here’s what we know

admin2 admin2

The Exit: The acquisition charting Salesforce’s future

admin2 admin2

Gatik’s self-driving vans have started shuttling groceries for Walmart

admin2 admin2

Leave a Reply