Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

z80pack tech demos

1,201 views
Skip to first unread message

Udo Munk

unread,
Jan 10, 2017, 5:06:28 PM1/10/17
to
Work in progress, but it looks so cool that I thought I produce some videos already:

https://youtu.be/-dZ1cWAU3pA
https://youtu.be/B5ELh3t18Mo

Udo Munk

unread,
Jan 13, 2017, 3:32:27 PM1/13/17
to
And another interesting one:

https://youtu.be/NX1EjURky3o

You can try everything out now with z80pack release 1.32.

Udo Munk

unread,
Feb 27, 2017, 3:32:00 PM2/27/17
to
Here have a preview for z80pack 1.34, I think it's very cool.

https://youtu.be/A9_nIMrqHVA

Don't know how good it is visible in the video, but yes, the CRT got
horizontal scan lines, which you'll also get for the IMSAI VIO CRT.
Configurable, just in case someone won't like this ;-)

Udo Munk

unread,
Mar 23, 2017, 4:05:50 PM3/23/17
to
Improving things further...

https://youtu.be/Z0omWbdjREs

Udo Munk

unread,
Mar 30, 2017, 5:33:13 PM3/30/17
to
And one more preview for 1.35, comes with cassette tape support for the Altair 8800

https://youtu.be/rJ4ptCkX8hI

Enjoy,
Udo

Udo Munk

unread,
Jun 28, 2017, 6:00:22 PM6/28/17
to
Thought I create another video while testing several of the 1.35 features...

https://youtu.be/dNHdmAvG8kY

Udo Munk

unread,
Feb 13, 2018, 12:01:40 PM2/13/18
to
Found this while looking for something:

http://www.vcfed.org/forum/showthread.php?44818-In-memory-editor-with-VI-key-bindings/page4

Click on the picture link in the message.

Do I have to hack some Z80 access system in the next generation of
Doom, Quake, Unreal and the like?? Impressive what some folks are
doing with the stuff, oh boy.

Udo Munk

unread,
Feb 16, 2018, 1:41:22 AM2/16/18
to
And this here is quite interesting for Windows users:

http://www.sydneysmith.com/wordpress/category/articles/cpm/

Have a look at the z80pack related articles, this is a pretty good
native Windows implementation of the machines.

Dan Morriss

unread,
Feb 17, 2018, 6:40:14 AM2/17/18
to
Hello Udo,

Didn't expect to see my post referenced here. Yes that is the intention, in this case I planned to make a Unreal based spaceflight game powered by 8-bit computers. I made the first set of computers Z80 based and decided to make them Z80pack compatible since Z80pack is so complete.

Here is a screenshot of it running Wordstar4:

https://i.imgur.com/Q6307w3.jpg

I also wrote a telnet/zmodem client so we are able to connect to BBS's on the
internet and download files:

https://i.imgur.com/4V2gxVA.png
https://imgur.com/K44GT1W

Finally a corridor shot showing that we are running four of them on the
current test ship, these are all in graphics mode:

https://imgur.com/e3gVLyA

Other things that run well on it are the Hi-Tech C compiler, Microsoft Basic, the Infocom games etc.

It's just an experiment at this stage, I sort of got slowed down in writing the C library and wrapping stdio around the BDOS interface these last few weeks.


Kind regards,

Dan

Udo Munk

unread,
Feb 17, 2018, 7:31:09 AM2/17/18
to
On Saturday, February 17, 2018 at 12:40:14 PM UTC+1, Dan Morriss wrote:

> Hello Udo,
>
> Didn't expect to see my post referenced here. Yes that is the intention, in this case I
> planned to make a Unreal based spaceflight game powered by 8-bit computers. I made
> the first set of computers Z80 based and decided to make them Z80pack compatible
> since Z80pack is so complete.

I was searching about the status of a CP/M vi, so I found your post and the amazing
screenshot. Thought would be a good idea to add it to the thread, for me it's nice to see
what others are doing with the machines.

I've put a levee port for CP/M on my TODO list, it runs nicely on Fuzix, so will
do on CP/M too, didn't find other good options.

> Here is a screenshot of it running Wordstar4:
>
> https://i.imgur.com/Q6307w3.jpg
>
> I also wrote a telnet/zmodem client so we are able to connect to BBS's on the
> internet and download files:
>
> https://i.imgur.com/4V2gxVA.png
> https://imgur.com/K44GT1W
>
> Finally a corridor shot showing that we are running four of them on the
> current test ship, these are all in graphics mode:
>
> https://imgur.com/e3gVLyA

Very cool, so you can connect to anything on the internet with the
ingame computer systems. In all games I've seen the computer systems are
dummies providing pre-programmed content, but a working system that
even can connect to the internet from inside the virtual spaceship really
would add a whole new dimension to such games.

Kind regards,
Udo

Dan Morriss

unread,
Feb 17, 2018, 8:30:25 AM2/17/18
to
On Saturday, 17 February 2018 23:31:09 UTC+11, Udo Munk wrote:
> I've put a levee port for CP/M on my TODO list, it runs nicely on Fuzix, so will
> do on CP/M too, didn't find other good options.

I did start on a vi clone after writing that post you linked, but only did a handful of days work. Just checking it now it doesn't run after a lot of the recent changes I added to my C library, so I can't really recommend it, I think levee is a good choice.

> Very cool, so you can connect to anything on the internet with the
> ingame computer systems. In all games I've seen the computer systems are
> dummies providing pre-programmed content, but a working system that
> even can connect to the internet from inside the virtual spaceship really
> would add a whole new dimension to such games.

There was a game design by the guy who created Minecraft a few years back,
he designed a simple 16-bit CPU and put it in his game prototype before getting bored with it. So I got the idea from that but wanted to use the Z80 since there's so much software out there for it already and because it was easy to add new components (graphics, network etc).

I had plans to make all the spaceship's weapons, shields, flight controls etc. programmable from the Z80 computer. I'm taking a break from it for now since I got a bit burned out on it, but hopefully after doing some other things for a while I will come back to it.

Kind regards,

Dan

roger...@gmail.com

unread,
Feb 17, 2018, 10:06:22 PM2/17/18
to
On Saturday, February 17, 2018 at 4:31:09 AM UTC-8, Udo Munk wrote:
> I was searching about the status of a CP/M vi

Keep us posted on what you find out. Rumor has it that the first versions
of vile were based on microEMACS. I have an ancient CP/M-68K version of
microEMACS that compiles down to a 12K image for my CP/M-ARM, which is great
for running on processors with 96K built-in RAM, but I've not found a
version of vile old enough to be small enough to be useful.
--
roger ivie
roger...@gmail.com

Udo Munk

unread,
Feb 18, 2018, 11:19:09 AM2/18/18
to
On Sunday, February 18, 2018 at 4:06:22 AM UTC+1, roger...@gmail.com wrote:

> Keep us posted on what you find out. Rumor has it that the first versions
> of vile were based on microEMACS. I have an ancient CP/M-68K version of
> microEMACS that compiles down to a 12K image for my CP/M-ARM, which is great
> for running on processors with 96K built-in RAM, but I've not found a
> version of vile old enough to be small enough to be useful.

Early version of elvis were written on CP/M, but when we started to use it 1992 on
COHERENT Steve already had removed all CP/M support and old sources didn't
exist anymore.

And a quick check to compile levee on CP/M:

I>j:c -c -DANSI=1 main.c
HI-TECH C COMPILER (CP/M-80) V3.09
Copyright (C) 1984-87 HI-TECH SOFTWARE
extern.h:
127: autoindent,
^ Out of memory


Martin

unread,
Feb 19, 2018, 5:49:35 PM2/19/18
to
Udo Munk schrieb:
> I was searching about the status of a CP/M vi, so I found your post and the amazing
> screenshot. Thought would be a good idea to add it to the thread, for me it's nice to see
> what others are doing with the machines.
>
> I've put a levee port for CP/M on my TODO list, it runs nicely on Fuzix, so will
> do on CP/M too, didn't find other good options.
>
> Kind regards,
> Udo
>

Hello Udo, long time lurker here :-)

Was also searching for a vi clone for CP/M for a *very* long time.
I found something really useful, and couldn't resist any longer.

Please forgive me, this is my first post ever.


This got me going ...
<https://groups.google.com/forum/?_escaped_fragment_=topic/comp.os.minix/TBmLlEP_nlw>

And after years(!), now found this:
<http://globin.bx.psu.edu/html/software.html>

"software from the book: W. Miller. A Software Tools Sampler,
Prentice-Hall (1987)"

<http://globin.bx.psu.edu/dist/software.tools.tar.gz>


Of course it needed some fixes to compile with an ANSI-C compiler
e.g. Hitech-C (also tried gcc under linux).

But I couldn't stop until it was running, so here it is.


First, submit and link files for CP/M:

[s-cpm.sub]
==== 8< ====
c -c -O s.c
c -c -O commands.c
c -c -O -DCONIO keyboard.c
c -c -O address.c
c -c -O yank.c
c -c -O operator.c
c -c -O Bman.c
c -c -O buffer.c
c -c -O Sman.c
c -c -O screen.c
c -c -O lib.c
c -c -O adjust.c
link <s-cpm.lnk
==== 8< ====

[s-cpm.lnk]
==== 8< ====
-Z -Ptext=0,data,bss -C100h -Os.com \
crtcpm.obj \
s.obj \
commands.obj \
keyboard.obj \
address.obj \
yank.obj \
operator.obj \
Bman.obj \
buffer.obj \
Sman.obj \
screen.obj \
lib.obj \
adjust.obj \
libc.lib
==== 8< ====


A (U**X) shell script to extract just the editor and patch it:

[s-cpm.build]
==== 8< ====
rm -r s_cpm
tar xf software.tools.tar.gz software.tools/s
mv software.tools/s s_cpm
rmdir software.tools

( cd s_cpm
patch -p1 < ../s.static_prototypes.diff
patch -p1 < ../s.ppc_token.diff
patch -p1 < ../s.os_adaption.diff

# CP/M emulator needs "single" case filenames
mv Bman.c bman.c
mv Sman.c sman.c
)
==== 8< ====


Make sure "s-cpm.sub" and "s-cpm.lnk" are in CR/LF format
(e.g. use todos) and place them in the directory "s_cpm"

Then everything should be in place, transfer all files in "s_cpm"
to your machine (or fire up your emulator) and

"submit s-cpm" ....



Hope I woke your interest, and you forgive the following
moderately large patches:


Martin


[s.static_prototypes.diff]
==== 8< ====
--- ./address.c
+++ ./address.c
@@ -98,6 +98,15 @@

#include "s.h"

+static do_up_down();
+static int col_to_pos();
+static int pos_to_col();
+static loc_char();
+static loc_word();
+static int word_start();
+static loc_string();
+static int locate();
+
address(n, c, op)
int n;
char c, op;
--- ./Bman.c
+++ ./Bman.c
@@ -146,6 +146,9 @@
*curr_recs, /* mod recs for current user command */
*prev_recs; /* mod recs for previous user change */

+static add_rec();
+static free_recs();
+
/* b_changed - tell if last command changed the buffer */
int b_changed()
{
--- ./buffer.c
+++ ./buffer.c
@@ -56,6 +56,8 @@
last_id = 0, /* last ID assigned to a buffer line */
ref_nbr; /* number of recently referenced line */

+static reference();
+
/* buf_delete - delete buffer lines */
buf_delete(from, to)
int from, to;
--- ./commands.c
+++ ./commands.c
@@ -144,6 +144,12 @@

static char cur_file[MAXTEXT]; /* remembers name of the current file */

+static do_star();
+static do_io();
+static int do_read();
+static do_write();
+static write_lines();
+
int simp_cmd(n, c)
int n;
char c;
--- ./keyboard.c
+++ ./keyboard.c
@@ -58,6 +61,8 @@
pushed[CMD_MAX], /* pushed-back command */
*push_ptr = pushed; /* next location in pushed */

+static k_flip();
+
/* k_donext - push a command back on the input stream */
k_donext(cmd)
char *cmd;
--- ./operator.c
+++ ./operator.c
@@ -77,6 +77,9 @@

#include "s.h"

+static do_delete();
+static in_chars();
+
/* do_insert - insert text */
do_insert()
{
--- ./s.c
+++ ./s.c
@@ -81,6 +81,8 @@

#include "s.h"

+static int get_count();
+
main(argc, argv)
int argc;
char *argv[];
--- ./screen.c
+++ ./screen.c
@@ -80,6 +80,9 @@
static int cur_row = 0, cur_col; /* cursor location */
static char save = '\0'; /* character in location (NROW, NCOL-1) */

+static errmsg();
+static wait();
+
/* scr_clr - clear the current row */
scr_clr()
{
--- ./Sman.c
+++ ./Sman.c
@@ -144,6 +147,26 @@
*text[MAXROWS+1]; /* text of line at row i (subscript 0 unused) */


+static int after_line();
+static bottom();
+static int can_scroll();
+static changes();
+static chop_arg();
+static chop_cpy();
+static delete();
+static display();
+static displ_text();
+static int expand();
+static int good_first();
+static insert();
+static ins_text();
+static pos_to_seg();
+static repaint();
+static replace();
+static repl_text();
+static int row_of_id();
+static scroll();
+
/* s_errmsg - format and print msg; wait for the user to read it */
s_errmsg(msg, val)
char *msg;
--- ./yank.c
+++ ./yank.c
@@ -57,6 +57,8 @@

static struct y_line *start = NULL;

+static free_ybuf();
+
/* do_put - copy the yank buffer to the file buffer */
do_put(way)
int way;
==== 8< ====

[s.ppc_token.diff]
==== 8< ====
--- ./address.c
+++ ./address.c
@@ -16,7 +16,7 @@
*
* A list of the addressing commands follows. The default value of the
* count <n> is 1, except for commands g (where it is the number of lines
-* in the buffer) and ctrl(d) and ctrl(u) (where it is half of a screen).
+* in the buffer) and ctrl('d') and ctrl('u') (where it is half of a
screen).
* Commands M, 0 (zero), ' (apostrophe), and ` (backquote) ignore the
count.
*
* Line Addresses:
@@ -108,7 +117,7 @@
char ch, text[MAXTEXT-1];

/* set default count to 1, except for three special cases */
- if (n == 0 && c != 'g' && c != ctrl(d) && c != ctrl(u))
+ if (n == 0 && c != 'g' && c != ctrl('d') && c != ctrl('u'))
n = 1;
b_getcur(&cur_line, &cur_pos); /* cursor location */
line_addr = 0; /* reset by commands that address lines */
@@ -137,13 +146,13 @@
case '-':
line_addr = max (cur_line - n, 1);
break;
- case ctrl(d):
+ case ctrl('d'):
/* ad hoc interpretation of the count */
if (n != 0)
scroll_size = n;
line_addr = s_lastline() + scroll_size;
break;
- case ctrl(u):
+ case ctrl('u'):
if (n != 0)
scroll_size = n;
line_addr = max (s_firstline() - scroll_size, 1);
--- ./s.h
+++ ./s.h
@@ -5,7 +5,7 @@
#include <ctype.h>

#define CR '\r' /* sent by <return> key */
-#define ctrl(x) ('x' & 037) /* control character 'x' */
+#define ctrl(x) (x & 037) /* control character 'x' */
#define ESCAPE 27 /* end-of-insertion character */
#define MAXTEXT 1000 /* maximum length of a line */
#define SCROLL_SIZE 12 /* number of rows to scroll */
==== 8< ====


[s.os_adaption.diff]
==== 8< ====
--- ./keyboard.c
+++ ./keyboard.c
@@ -26,6 +26,9 @@
* k_redo()
* Redo the last buffer-change command.
*
+* int k_keyin()
+* Get a character from the keyboard.
+*
*
* External procedure calls:
*
@@ -90,7 +95,7 @@

/* get pushed character (preferably) or read keyboard */
/* use logical AND operation with octal 0177 to strip the parity bit */
- ch = (push_ptr > pushed) ? *(--push_ptr) : getchar() & 0177;
+ ch = (push_ptr > pushed) ? *(--push_ptr) : k_keyin() & 0177;
/* remember character if there is room */
if (cmd_ptr <= command + CMD_MAX)
*cmd_ptr++ = ch;
@@ -141,6 +146,43 @@
k_donext(change);
}

+
+#ifdef TERMIOS
+#include <termios.h>
+#include <unistd.h>
+#include <sys/ioctl.h>
+static struct termios oldt;
+#else
+#ifdef CONIO
+#include <conio.h>
+#include <signal.h>
+#else
+#include <sgtty.h>
+static struct sgttyb oldt;
+#endif
+#endif
+
+/* keyboard input mode */
+static int k_raw = 0;
+
+/*
+* k_keyin - get a character from the keyboard
+* Hide system dependent differences in keyboard input
+*/
+
+int k_keyin()
+{
+#ifdef CONIO
+ if (k_raw) {
+ return getch();
+ } else {
+ return getchar();
+ }
+#else
+ return getchar();
+#endif
+}
+
/*
* k_flip - toggle keyboard input to and from noecho-raw mode (UNIX)
* Normally:
@@ -150,12 +192,45 @@
* Flipping to noecho-raw mode suspends all such input processing.
*/

-#include <sgtty.h>
static k_flip()
{
- struct sgttyb ttyb;
-
- ioctl(0, TIOCGETP, &ttyb);
- ttyb.sg_flags ^= ECHO | RAW;
- ioctl(0, TIOCSETP, &ttyb);
+ if (!k_raw) {
+ k_raw = 1;
+#ifdef CONIO
+ /* Stop SIGINT (<CTRL-C>) detection */
+ /* Keyboard reads during screen redraw kills raw input */
+ signal(SIGINT, SIG_IGN);
+#else
+#ifdef TERMIOS
+ struct termios newt;
+ ioctl(0, TCGETS, &oldt);
+ ioctl(0, TCGETS, &newt);
+ newt.c_lflag &= ~(ISIG|ICANON|ECHO);
+ newt.c_iflag &= ~(INLCR|IGNCR|ICRNL|IUCLC|IXON|IXOFF);
+ newt.c_oflag &= ~OPOST;
+ newt.c_cc[VMIN] = 1;
+ newt.c_cc[VTIME] = 0;
+ ioctl(0, TCSETSW, &newt);
+#else
+ struct sgttyb newt;
+ ioctl(0, TIOCGETP, &oldt);
+ ioctl(0, TIOCGETP, &newt);
+ newt.sg_flags |= RAW;
+ newt.sg_flags &= ~ECHO;
+ ioctl(0, TIOCSETP, &newt);
+#endif
+#endif
+ } else {
+ k_raw = 0;
+#ifdef CONIO
+ /* normal SIGINT handling */
+ signal(SIGINT, SIG_DFL);
+#else
+#ifdef TERMIOS
+ ioctl(0, TCSETSW, &oldt);
+#else
+ ioctl(0, TIOCSETP, &oldt);
+#endif
+#endif
+ }
}
--- ./Sman.c
+++ ./Sman.c
@@ -66,6 +66,9 @@
* int k_getch() .. file keyboard.c
* Return the next character of the current command.
*
+* int k_keyin() .. file keyboard.c
+* Get a character from the keyboard.
+*
* scr_clr() .. file screen.c
* Clear the remainder of the row, i.e., delete the characters
* under, and to the right of, the cursor. Characters to the
@@ -153,7 +176,7 @@

sprintf(message, msg, val);
s_putmsg(message);
- getchar();
+ k_keyin();
}

/* s_finish - terminate the edit session */
==== 8< ====

That's all folks.

Udo Munk

unread,
Feb 19, 2018, 6:34:21 PM2/19/18
to
On Monday, February 19, 2018 at 11:49:35 PM UTC+1, Martin wrote:

> Hello Udo, long time lurker here :-)
>
> Was also searching for a vi clone for CP/M for a *very* long time.
> I found something really useful, and couldn't resist any longer.
>
> Please forgive me, this is my first post ever.
...
...

Hello Martin,

there is nothing to forgive, thanks for the post, this is just what many wanted.
I was looking at reverting levee to K&R C and maybe get it compiled with Aztec C
or something, but I'll try out your port now... as everyone else ;-)

Udo

Martin

unread,
Feb 19, 2018, 7:45:54 PM2/19/18
to
Udo Munk schrieb:
> On Monday, February 19, 2018 at 11:49:35 PM UTC+1, Martin wrote:
>
>> Hello Udo, long time lurker here :-)
>>
>> Was also searching for a vi clone for CP/M for a *very* long time.
>> I found something really useful, and couldn't resist any longer.
>>
>> Please forgive me, this is my first post ever.
> ....
> ....
>
> Hello Martin,
>
> there is nothing to forgive, thanks for the post, this is just what many wanted.
> I was looking at reverting levee to K&R C and maybe get it compiled with Aztec C
> or something, but I'll try out your port now... as everyone else ;-)
>
> Udo
>

Thanks for the welcome!

Saw some minor white space mangling in my post, if you don't
get the patches right, please complain :-)

I didn't post in uuencoded form because I never saw this here.


Some short comments, what the patches should do:

"s.static_prototypes.diff":
No further decription possible, I think.


"s.ppc_token.diff":
ANSI preprocessors need this because they expect 'preprocessor tokens'


"s.os_adaption.diff":
This is the interesting part, I would say....

In the original code, getchar() is used together with k_flip(),
where "ttyb.sg_flags ^= ECHO | RAW;" toggles with XOR between
raw and coooked mode.

This had the drawback that you didn't know which mode currently was
active, you must made sure it exactly was called twice.

For U**X I had to replace the old "sgtty" with the more modern
"termios".

And Hitech-C has a non-echoning console I/O function getch().

Btw, Hitech's checking for CTRL-C during any I/O took me the most
time to fix. I first just didn't even understand what was going on,
just ugly screen update corruption.

The new function k_keyin() now hides all the differences.


Happy hacking, Martin

jdhadd...@gmail.com

unread,
Feb 19, 2018, 9:49:53 PM2/19/18
to
I really like the idea of a vi clone for CP/M,hoawever I'm finding it difficult to copy/paste the code out of this post. Can the files be posted somewhere or are you willing to email them to me?

Udo Munk

unread,
Feb 20, 2018, 12:27:24 AM2/20/18
to
On Tuesday, February 20, 2018 at 1:45:54 AM UTC+1, Martin wrote:

> Saw some minor white space mangling in my post, if you don't
> get the patches right, please complain :-)
>
> I didn't post in uuencoded form because I never saw this here.

Uuencoded post would be fine, even for CP/M uudecode is available.
I doubt that someone is reading the group with a CP/M UUCP system,
but many are using Google groups and such, which totally screws
the formatting, making diffs unusable.

Also may I suggest to continue this in a new thread with a more appropriate
subject line for vi on CP/M, it will be easier to find later for others, if it's not
hidden deep inside a thread with another topic.

Martin

unread,
Feb 20, 2018, 1:12:07 AM2/20/18
to
Martin schrieb:
>
> Hope I woke your interest, and you forgive the following
> moderately large patches:
>
>
> Martin
>

I found it really tedious to get my own post back into
a usable form :-/.

So here are the diffs in my message again in un unusual
format. Just for fun, linux combined with CP/M ;-)


From the following HEX-file, create "diffstgz.hex" in CR/LF format
and ...

load diffstgz


FIRST ADDRESS 0100
LAST ADDRESS 0D7F
BYTES READ 0C80
RECORDS WRITTEN 19


Now this should work :-)

$ tar xvf diffstgz.com
s.static_prototypes.diff
s.ppc_token.diff
s.os_adaption.diff

gzip: stdin: decompression OK, trailing garbage ignored
tar: Child returned status 2
tar: Error is not recoverable: exiting now


Just ignore the error coming from the CTRL-Z's appended to the tgz.
tar begins to process them as if another tar-file follows and
freaks out.

Martin



DIFFSTGZ;
:100100001F8B0800E6B48B5A0003ED5A6D73DB3683
:1001100012CE57FA57A0ED4C4CD99222FA4D499481
:10012000A4F1294EAA3947EE58EE2573698E4791FE
:1001300090C43145F00832B65AE77EFBED2E008AB6
:10014000A4EC249DC9A57337DC496512C0028B0756
:100150008B7D636557665E16FA6E928A4C64AB843B
:10016000CB6E10CE66F7BE22F5808E0E0EF0AFD3AA
:100170003FECD1BBA3DE910EF70EFAF79C7DE77042
:10018000FFA877D0779C7B3DE7D0E9EFDD63BDAF7B
:1001900029C45D94C3FE53C6EE2DBD340BE34F8DD1
:1001A000E3A9FC16027D5BEA743AACFBC00B8294B7
:1001B0004BD9F5B77677772BEFCF9FB3CEA387EDEB
:1001C00023B60BBFCE217BFE7C8B6DB11FC2D88FB7
:1001D000F280B3EF6577F13DB4EC2A2D628170F3C4
:1001E000C40DC4556CB706456B1867CC17919B09B5
:1001F0003711B2DE034DD80303CA3D91F05D7FE1B4
:10020000A5F5B62B9106F519B0CDC573CCEAA3655B
:100210009686F1BC3E1E7ABC8C53EB16D37BB5E3BD
:1002200036F3DB4C24AD2D1A130FB618AEAF1A07F8
:100230005B0AA8BF2CBDB84049BF2044CEC11162A3
:10024000847F1E1146D68E9FA7A99B725FB62DEBA9
:10025000C10E5B8A80E11B9B099813FA382C824AF5
:1002600005C82C61A280ED3C40B624E51F886DB026
:10027000C9867DA1C8A5E65B78F19C135BB13BD82C
:100280000C3297373C4B39A709F57E61D2A9AB7880
:1002900003D661198F2216CE58E4C9AC10C5746715
:1002A0000BCEA6F96C06ABE132884BC16B0350BF95
:1002B0006B58D4980298E215A1392464E0F7A102A2
:1002C000061772C3803D653D850CAD3C7AC13C2963
:1002D000C3798CAB0AE69965A330565BB4523E7382
:1002E000E369AA6089F3E5147AC50CC10124A3155A
:1002F0003CC0781EFB3041C1548050749640C867A2
:100300006EC0239E7140413F94169534C17A903D52
:100310004BC5B20DB269FD30AF46333474EB3B547C
:100320006A501A72A034E4A0EDECE96BA485536A1C
:1003300096A7EE2C8CF8BBD7C76F2F4EDE5EBC1F86
:10034000E03E53BEE4B853C9626FC971BF7824461A
:100350007D707C759F70FFF01E94CF1F9A4251BF35
:1003600001D098722FA88DBB4A437D2D741B35B8E0
:100370000487060E9965B84C5C7F19D095D9B82EC4
:1003800006904BBE9A0A2F0D0A404A0DA4176455D9
:100390008E1CA317492E173C78377CFDC20508DE5A
:1003A000B771FBAAAD33F5FCCBFA35811E37C952C4
:1003B00050233588E08AF9B5BEDDA188412EDD578E
:1003C000C5E8D29D4561B256844BB057C4D8A1E16F
:1003D000A07B66295A172642CCC338C961EB19C0E5
:1003E000B6A4F90C9B0D48B4F4E677E0D9EC5F2491
:1003F0003CF532B1BE15A506DC7FBF8FFB87DF471A
:100400005F6054B50E564E91CC63E956E341C76028
:10041000187023FA21C36DA1B0455FF9D6AE75D52A
:1004200028E94307657A68CEE41332E199CF79066B
:10043000563B8F332DC3D20B63DB4BE76031E1F7C3
:1004400083D60C6C30CAB183EDEFDE1B88A40FB6E7
:10045000696D4F8B5712A547A2F4343C654F0237A4
:100460002515576440E8053C079D3E3C4BB092C5BE
:10047000F9E3C6CB574C7A1F38706DFFDADB56E3D1
:10048000A1D1F333B8F0A02905973D3E3F7BD36659
:10049000E3E1D969C769555587A7E95256DCC99583
:1004A0001766EB23801DB87E94C201F8118715CB27
:1004B0009715452689D498F2414CCA5E6552F62AB2
:1004C000DA66F4DB7B47DAADE091A28D002127BB31
:1004D0008EB21274CC601BC8EE796AA990D9329F93
:1004E000C2626192B11ECB63F01981DE4EF518BD78
:1004F00019404097BCBCB1A9C832B1DCF0E25EEC57
:10050000C29C22AAF86AE51164B549242E9CF646DD
:100510009B9FAC2A566743B183502691B7DA687225
:1005200071977579F8750217B5DE3A172200639A4C
:10053000CADA7875012A2D1BB3EA6844F28AE829E1
:100540004F40B9B35A53E4F9BCDE74AB987020AE97
:100550009881D72B77947054CAE32AF502ED01678E
:10056000BF8473441B94A43801340F48D7280E402D
:10057000B5A210003C259A7116AA5B6E66B0E1BF69
:1005800036FBE045855D427EAD6C2B2FBE2C944D35
:10059000BF903D267B04BF0FABDE094C5EEE676C5F
:1005A000E52AAF4A6116DCA2F12FA7A78392265154
:1005B00098B1027F5931486833E13288644542E39B
:1005C00072C6C982ECD8443EAC14632826FBCA5BD1
:1005D00069FB014F83AD3F3B4CFEBF25D94D121F38
:1005E00014FE120CEFD7CEFB0C7D26FFDBEF1D1E99
:1005F00014F9DF51AF0FF9DFFEFEE17E93FF7D0BB3
:10060000FA92FCCF396AF7C10BE12F5A861DF867C1
:100610001D83B391990948F57848B54CEC84094B92
:1006200014892BD965EC0246047CE6E551864629FF
:1006300037712CCE43F1037B123F63A1644E1B0C38
:10064000BACF1365E58A99E6CCBE5A40F88E660E9D
:1006500046E182EBF89F82D3ADCE8E15C6A574A578
:1006600045B6D3CFD2C80E4ACF79AB3AD5C28B6646
:100670003889C754ECD1EA6EEDDE3DD376B05D7EAD
:10068000CBB73F3F1BEC7068B6F1BA0D7ED8FE8D3C
:10069000A7A2D566DBCCF6C0D564A948161CDE71CE
:1006A000DA7F321B23CE7FE522E32D06B99080A9A5
:1006B00029844090BA1A79CB3A45437CAC20E7F2C2
:1006C000B13AA3DE433A24A7AF4FC952D1F8A2CD25
:1006D0004CC4805945072206B4ED1835489E15C70D
:1006E000A28E014C72F508B205EC83C984FBA117F8
:1006F00081F3972A2DEA589030DA317B0A2118BB12
:100700007F9FF9EC3B08ABE6DBC5B301BEF29EB7B9
:100710005A5BBB5FC44940575B006CF0079605AC61
:10072000CC812D585317C24F88ADECFB1802A2168E
:10073000B4193D02AAAD3BC3410B07BAA8AE183E9F
:10074000EA140B8198AED6FA962DD0F72A7CD7B949
:1007500020A1BCDF6F3BFB2ACF87BF84B385B0B03D
:10076000EDCEF6637CA92CB0F4AE996DC4033F08BE
:10077000F992D31AD0B029F8ED4B70C99A5D03F6FF
:1007800018002A35200E6A569013DCFC425038C1FE
:10079000D324E599DA94C908E9FC6887968618A0FD
:1007A000EB116496A5220D5786BF61FC1B0F360422
:1007B000952E26E12A0464BBAC34FE6E69F30D6904
:1007C0007323ED1F178090922A66D36274CA622841
:1007D000E04CDAB228D296850A5D50F50FB5E217E3
:1007E00029CB131FCB99DDC5334A6440D3F1108662
:1007F000E796B5FD6BBA6DA91B10D3C93F0138F35D
:10080000146C10A4A8A4DF6634EDEBBA6559F6F6B3
:1008100035E828EBEDF75BA45A22869B1B9532083E
:10082000EC07CEDD4DCEEB2FE12BE43B990C8F7F17
:100830003EB1ACBD3E49C8E3A023661D15BAE279BE
:10084000AF39CB5CFA765B9603FE54D58DBCEB706A
:10085000992F59C4E379B65056A9288B18B6C9F018
:10086000FCECF4D49D8CFE7E62397BF5C20A186FD5
:10087000B408EA1490EFCFF6550D7D7D925DC877F0
:10088000BCC04B50BBFE4B11E0E7EAFF8747A6FE1A
:10089000EF1C3A877B18FFF57B4E13FF7D0BFAB2F6
:1008A0005ADD1ED570F74C717BC7BA74531E08AC65
:1008B000614040720E8FE485A892ABC2A68EAE4E08
:1008C0006BA74AC10B855619BB7461F63006666882
:1008D000B05E81F3F54A660DEBAA345921020C5340
:1008E000A10F3BB98611314422492A7C1EE4101E17
:1008F000F95E14410804FDF4A5A2879EE0917105FC
:100900002ACE8138C1D401D7CBD8099584BD69B42A
:100910006A318812288D364B2A470AAC70E8103F9E
:10092000CC4358851D8F5F3055C2433B7C15A25583
:10093000F533E800A5EE93A1CCD23021D1132F0DD1
:10094000B3159BAAB4BC03A118B838BB28593ED331
:10095000E2B4D88F6CC7EE744C478B3D4661D557D7
:100960000FF41A3031E4D27F84BDC0B66067E5323F
:1009700072B9E4458103C6AE124CBD50354DF2DC70
:10098000FE32A0759E3C2D0AA1BB4C9765C99FEF16
:10099000E811A029306431D0B52AC77C01393091E3
:1009A000D1BA444ACA80A1CF472C19809B0C67E07A
:1009B00083D8C5C9F9EBD1D904DF8DD306D996A167
:1009C00090E8B64BAD790CD946506B942BF9208446
:1009D0003388A8BD5AAED0D33011051960F8038F03
:1009E000242F961D9E8D4767E599C02F87A23E3B19
:1009F00004E09E9ABAE02EFAE659B6BA65556A9FA7
:100A0000AE178DC1A0AEFF6EED62B5D9E8982A2869
:100A10002F45403EB95C2D82CBE5517973A0782CEF
:100A2000B801E664212C9A7FEEC6E0F09F42981749
:100A300000CAF81282FC0424C05807EDBBFA0E224B
:100A4000B1E6599505D81EE082B53BFA7B1D3652BA
:100A50001292B1C57EC71050454F4A75A9FA637D01
:100A60006488D866AFFE32617D2C30BDADDBE0F529
:100A700051D5912CBCFAAA68CFF0839598CF235E0C
:100A8000C711BF1981A21216B1E0FE427410448250
:100A900097D9BF8C47A8BA3B6C8C85B5285AE9A476
:100AA000E9B0871F63769D477BED03F56D7387BDC6
:100AB000847512CC6461CAFA4C329708A564300779
:100AC000BCC0C554AB933DA2FC170D1D96583BB757
:100AD000288BA9A8990F105400B6AAAA833F10E842
:100AE000628A859A6DF7DAEC6274367C7572F1333E
:100AF000E437D88B71B0850F5D398789BCB964FF45
:100B000078CA4E863F9DB11B767EFC6650E79D54A9
:100B100078D5F17D573E3FA36FCE60E3A8D1784CE6
:100B20003291B0C9E8D5687CC1EC27C38BF3D3CE32
:100B3000F0590BB42AE3BE49ACD4C8BF9A33416B19
:100B40002A191868C45125C3D016E0329721186CB1
:100B5000864F0A3AC5AC2E9BAD5669E36AEEE8D5DE
:100B6000B8B571730B836159B58B1EF32BBC7356EB
:100B700069EF88DA04768ED7B175471FB2A93E7C3B
:100B8000EAFA6E8490B2FB4FD9BFED118871331A27
:100B90001E8FCFC637886F655C581A373E1D9EDFA3
:100BA00080BCF83B3C1F9FDE8C7E199E0E6F466F0B
:100BB00081117E5EBEAC708A82F3ECE7B3C945B9A1
:100BC000CBF7DFFDEDF568FC9EE9D3A8745C8C5E85
:100BD0009FBCD766A1B21538E0C99BD25ECCD5AA1E
:100BE000A9D62D08AD35EB368CD6BD35940AC5BBDC
:100BF00079AA346EA3037787906DCE38A9CE58B703
:100C00009115D3513684B728664C97D9A826B89841
:100C100020427DBB53A35EBC3CFDA446DD02A981FE
:100C2000A580F4B6BDAC07D5F782FEEED39F788ED3
:100C300028B23A5A4756CAFA6A5B8AB9B3D5EDAABE
:100C400022792926535117194EAA86E1F79FB543F9
:100C5000A87D25FE540876D7027F2432B38A2F5A06
:100C600095D98AAF7928ECB0F81C06A1881782378D
:100C70002AC4843CB3CDC22EEFB6CD577812DE2CF9
:100C80002B893F470E5525D3DF0DD270BEC0FA63C6
:100C9000DBEC558AB4CBD8B0E0D303B5A1DFA7EA2B
:100CA00058FF681D194AFAB232B39760B8BD396F60
:100CB000B3E2A309064D12BF42D0A714D54D56B7D3
:100CC000E2C30A0C7554A33EE1405E1DCA05FD7FD8
:100CD000156097624F6F8707100B4A7411CA5EFE4A
:100CE000D9617F430D35D450430D35D450430D3574
:100CF000D450430D35D450430D35D450430D35D425
:100D000050430D35D450430D35D450430D35D45098
:100D1000430D35D45043FFA3F41F994B06E8005010
:100D200000001A1A1A1A1A1A1A1A1A1A1A1A1A1A57
:100D30001A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A13
:100D40001A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A03
:100D50001A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1AF3
:100D60001A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1AE3
:100D70001A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1AD3
:00010001FE


Martin

unread,
Feb 20, 2018, 1:48:29 AM2/20/18
to
Thanks for the little help, Udo.

> Uuencoded post would be fine, even for CP/M uudecode is available.
> I doubt that someone is reading the group with a CP/M UUCP system,
> but many are using Google groups and such, which totally screws
> the formatting, making diffs unusable.

Sorry again, I was a little bit too optimistic here.

> Also may I suggest to continue this in a new thread with a more appropriate
> subject line for vi on CP/M, it will be easier to find later for others, if it's not
> hidden deep inside a thread with another topic.

Will do next time. I saw this a little bit too late.
Began to write just after jdhaddoxster's post, testing out my unusual
combination of tools took too long.

At least, it's fun to extract the diffs this way :-)

Martin

jdhadd...@gmail.com

unread,
Feb 20, 2018, 3:26:56 PM2/20/18
to
I was almost able to follow the process with the .hex file but got confused along the way. Looks like we load the hex file into CP/M then save it back as a .COM file. Then take the COM file back into Unix and somehow use tar to merge it together with .diff files?

If you do end up starting a new thread on the topic of vi for CP/M, hopefully we can follow up there on how to end up with an executable version of your code, it will be fun.

Udo Munk

unread,
Jul 6, 2018, 7:39:44 AM7/6/18
to
Some previews/examples of what is in the works with 1.37-dev:

https://github.com/udo-munk/z80pack/issues/39
https://github.com/udo-munk/z80pack/issues/38

Udo Munk

unread,
Aug 9, 2018, 8:50:54 AM8/9/18
to
Dave McNaughton has implemented an emulation of Cromemco's
88-CCC Cyclops Camera Controller. It can be used with a
nowadays web cam, so one won't need to build a Cyclops replica.

Details including a screenshot are here:
https://github.com/udo-munk/z80pack/issues/59

I implemented the MITS 88-DCDD floppy disk controller, it
is tested with Lifeboot CP/M 1.4 and Burcon CP/M 2.2.
If you want to test it get the current z80pack development
sources here:
https://github.com/udo-munk/z80pack/tree/dev

Udo Munk

unread,
Aug 14, 2018, 10:27:24 AM8/14/18
to
The 88-CCC is released, you can play with it and it is really cool.

Get the z80pack-dev release from GitHub:
https://github.com/udo-munk/z80pack/tree/dev

First build the front panel library as usual. Then build the embedded
web server:

cd z80pack-dev/webfrontend/civetweb
make

Then build the IMSAI emulation:
cd z80pack-dev/imsaisim/srcsim
make

Mount CP/M 2.2 disk as A: and cyclops.dsk as B:

Run with imsaisim -f4 -r -x mpu-a-vio-rom.hex

Instructions how to use the Cyclops together with the Dazzler are here:
https://github.com/udo-munk/z80pack/issues/59

wh.su...@gmail.com

unread,
Oct 4, 2018, 7:37:33 PM10/4/18
to
Here's a link to my modification of the ccc3 utility. This is what I was
running on real hardware at VCF East 2018:

http://wsudbrink.dyndns.org:8080/cyclops/ccc3fs2.asm

I have not tried it on z80pack. There are a few things to note:

1) On the real hardware, the Cyclops and Dazzler bus control
frequently clash. This results in interruptions to the field
stream from the Cyclops and "artifacts" in the image. To avoid
this, this code disables the Dazzler while the Cyclops image is
captured. I'm not sure how the emulation will react to this. If
it turns out to be a problem, those instructions can be removed
for emulator operation.

2) This program uses a binary search method to determine which field
a particular cell "flipped" in. This is much more efficient than
walking the entire field array for every pixel. As a result, this
program can operate at close to four frames per second on a 2MHz
8080 as demonstrated at VCF.

3) This program provides a lot of options that are implemented "live",
that is, during operation. These include: the ability to switch the
Dazzler between color and gray scale mode, the ability to switch
between several preprogrammed palettes, the ability to freeze a
frame, the ability to toggle the bias light, the ability to modify
the inter-field gap time and the ability to print an ASCII-fied
version of the frozen frame to the console.

The program starts in capture mode, bias light off, 2ms inter-frame gaps,
continuous gray scale.

Capture mode commands:
x or q - exit to CP/M
0 (zero) - switch to palette zero (default gray scale)
1 - switch to palette one (four level, high contrast)
2 - switch to palette two (reverse gray scale)
3 - switch to palette three (stretch middle)
4 - switch to palette four (color, pseudo heat)
5 - switch to palette five (two level, monochrome)
f - freeze frame, go to freeze frame mode (see below)
l - toggle bias light
g - increment inter-field gap
c - toggle Dazzler color mode

Freeze frame mode commands:
x, q, and c are the same as capture mode
l and g operate but obviously don't take effect until
capture mode resumes
b - brighten the frozen image... run through the Dazzler
buffer, incrementing each pixel value
v - reverse the frozen image... XOR each pixel in the
Dazzler buffer with 0x0F
z - zero out the Dazzler buffer... set all pixels to zero
p - print an ASCII-fied version of the Dazzler buffer to the
console.
r - resume... return to capture mode

Final notes:
The inter-field gap is an unsigned number. Pressing 'g' repeatedly
will wrap back to zero (2ms gap). Dazzler pixel values behave in a
similar fashion with repeated presses of the 'b' key.

I am very curious as to how this will run on the emulator. I would
love to see a YouTube video of it.

By the way, if you have not seen my Cyclops web pages, they are at:

http://wsudbrink.dyndns.org:8080/cyclops/index.html

Bill Sudbrink

wh.su...@gmail.com

unread,
Oct 4, 2018, 7:58:39 PM10/4/18
to
I forgot to mention that the code is set for alternate Cyclops I/O
ports. The default values are in the code, just commented out. The
default values conflict with the MITS 2sio serial interface.

Bill Sudbrink

Udo Munk

unread,
Oct 4, 2018, 10:09:05 PM10/4/18
to
On Friday, October 5, 2018 at 1:58:39 AM UTC+2, wh.su...@gmail.com wrote:
> On Thursday, October 4, 2018 at 7:37:33 PM UTC-4, wh.su...@gmail.com wrote:

> > Here's a link to my modification of the ccc3 utility. This is what I was
> > running on real hardware at VCF East 2018:
> >
> > http://wsudbrink.dyndns.org:8080/cyclops/ccc3fs2.asm
> >
> > I have not tried it on z80pack. There are a few things to note:
> >
> > 1) On the real hardware, the Cyclops and Dazzler bus control
> > frequently clash. This results in interruptions to the field
> > stream from the Cyclops and "artifacts" in the image. To avoid
> > this, this code disables the Dazzler while the Cyclops image is
> > captured. I'm not sure how the emulation will react to this. If
> > it turns out to be a problem, those instructions can be removed
> > for emulator operation.

Not a problem, disabling the Dazzler is emulated and works same as
with real hardware.

> > 2) This program uses a binary search method to determine which field
> > a particular cell "flipped" in. This is much more efficient than
> > walking the entire field array for every pixel. As a result, this
> > program can operate at close to four frames per second on a 2MHz
> > 8080 as demonstrated at VCF.

With a 2MHz 8080 the emulation shows 0.8 fps with the original software
and 2.8 fps with your version.

> > 3) This program provides a lot of options that are implemented "live",
> > that is, during operation. These include: the ability to switch the
> > Dazzler between color and gray scale mode, the ability to switch
> > between several preprogrammed palettes, the ability to freeze a
> > frame, the ability to toggle the bias light, the ability to modify
> > the inter-field gap time and the ability to print an ASCII-fied
> > version of the frozen frame to the console.

Well done, this shows features of the hardware much better than
the original program does.

> > I am very curious as to how this will run on the emulator. I would
> > love to see a YouTube video of it.

Seems to work perfectly, probably looks close to the original hardware.
I'll see that I find some time at the WE to create a YouTube video so that
you can have a look.

> I forgot to mention that the code is set for alternate Cyclops I/O
> ports. The default values are in the code, just commented out. The
> default values conflict with the MITS 2sio serial interface.

No problem, commented the alternate ports and used the default ones
in the IMSAI emulation.

Is it OK for you to include this version on the z80pack Cyclops disk image?

Thanks,
Udo

wh.su...@gmail.com

unread,
Oct 5, 2018, 11:07:16 AM10/5/18
to
On Thursday, October 4, 2018 at 10:09:05 PM UTC-4, Udo Munk wrote:
> Not a problem, disabling the Dazzler is emulated and works same as
> with real hardware.

I was wondering whether the Dazzler window would keep popping up and
then disappearing.

> With a 2MHz 8080 the emulation shows 0.8 fps with the original software
> and 2.8 fps with your version.

Huh. During development, I tied my o-scope to the busy latch,
expressed as the high bit of control word A, and got around 3.7.
Possible explanations, in descending order of probability:

1) Maybe I tied to the wrong pin or misread my scope display. This is
very likely.
2) Maybe my CPU board is overclocked. I always assumed it was a stock
MITS 8800 CPU but it has never given me any trouble so I have never
examined it closely.
3) How does the emulator implement the "bus mastering" of the Dazzler
and Cyclops? Maybe the timing is a little pessimistic and "waits"
the CPU longer than the actual hardware.

> Well done, this shows features of the hardware much better than
> the original program does.

Thanks. The original software was intended to be toggled into the
front panel, so it was small and simple. You wouldn't want to toggle
in my implementation.

> Seems to work perfectly

Glad to hear it.

> I'll see that I find some time at the WE to create a
> YouTube video so that you can have a look.

Thanks.

> Is it OK for you to include this version on the
> z80pack Cyclops disk image?

Absolutely.

Bill S.

Udo Munk

unread,
Oct 6, 2018, 7:02:30 AM10/6/18
to
On Friday, October 5, 2018 at 5:07:16 PM UTC+2, wh.su...@gmail.com wrote:
> On Thursday, October 4, 2018 at 10:09:05 PM UTC-4, Udo Munk wrote:

> > Not a problem, disabling the Dazzler is emulated and works same as
> > with real hardware.
>
> I was wondering whether the Dazzler window would keep popping up and
> then disappearing.

No, the video logic is stopped and the screen blanked with black.

>
> > With a 2MHz 8080 the emulation shows 0.8 fps with the original software
> > and 2.8 fps with your version.
>
> Huh. During development, I tied my o-scope to the busy latch,
> expressed as the high bit of control word A, and got around 3.7.
> Possible explanations, in descending order of probability:
>
> 1) Maybe I tied to the wrong pin or misread my scope display. This is
> very likely.
> 2) Maybe my CPU board is overclocked. I always assumed it was a stock
> MITS 8800 CPU but it has never given me any trouble so I have never
> examined it closely.
> 3) How does the emulator implement the "bus mastering" of the Dazzler
> and Cyclops? Maybe the timing is a little pessimistic and "waits"
> the CPU longer than the actual hardware.

There is no bus mastering implemented, on modern systems a thread can read memory,
while another thread is writing it. But for running the CPU and video DMA logic
at correct timing, millisecond timers are used, which are not accurate, just good
enough for an impression, how the original hardware performs.

> > I'll see that I find some time at the WE to create a
> > YouTube video so that you can have a look.
>
> Thanks.

Video is up here:
https://youtu.be/I1nkrHQ64WM

> > Is it OK for you to include this version on the
> > z80pack Cyclops disk image?
>
> Absolutely.

Thanks, will put it on the release disk with Cyclops software.

David McNaughton

unread,
Nov 28, 2018, 3:19:20 PM11/28/18
to
There is a new video on YouTube of the ESP32 port with the replica CP-A
front panel at
https://www.youtube.com/watch?time_continue=1&v=K060twi_7h4 (0:28 - 5:57)

Udo Munk

unread,
Nov 28, 2018, 4:36:01 PM11/28/18
to
Cool machine, looks great, thanks for showing it.
0 new messages