Showing posts with label MINITEL. Show all posts
Showing posts with label MINITEL. Show all posts

Friday, May 7, 2021

Easy Z80: A very cool Z80 CP/M SBC

Since my last post about this Easy Z80 board, I installed the integrated circuits in 10MHz version. And that changes everything. At this frequency of 10 MHz, the system is very responsive and becomes very pleasant to use.

Hum... The first time I order a Zilog 10MHz CPU, SIO and CTC directly from Mouser. Brand new and all manufactured in 2020! My first contact with the Z80 was in 1987 with the µPF1+. Wow! And now, 34 years later, a real CP / M system version 2.2:


In summary, this system has a read-only storage unit including the CP / M system plus some necessary utilities. 384K writable storage space is available for downloading external applications. In addition, two communication ports are available in the 115200 Bauds version. 

Note that the RAM storage space is backed up by an external battery. The system has an extension bus but unfortunately no I / O port. It's a bit regrettable. So how to test this system?

So I decided to check if I could create the same type of app that I created earlier using a Color Maximite 2 board. This consisted in using the temperature sensor of the expansion board that I created for the Colour Maximite 2 and sending the information to a French Minitel:


It works perfectly with the Coulour Maximite 2. As the Easy Z80 board does not have an I / O port, I therefore decided to recover the temperature from Maximite and send it to the Minitel using Easy Z80. Obviously, this application may seem 'without interest', except that it allows to implement the entire development chain around CP / M.

The development system used is the Z88dk kit : https://github.com/z88dk/z88dk
Nothing more than this kit is necessary except a little knowledge of C and assembly language.

The principle of the application consists in sending the home page from the Easy Z80 SRAM disk to the Minitel, then retrieving the temperature via the serial link coming from the Maximite 2, and sending this information to the Minitel.

The only difficulty of this project is to use the second communication port of Easy Z80 in configuration 1200, E, 7, 1. This is not particularly obvious because the system is designed to operate from at 115200 Bauds. Fortunately, it is planned to be able to use the CTC present on Easy Z80 to generate the clock to the UARTS.

It is therefore necessary to connect the output of channel 2 of the CTC to the channel 2 clock of the SIO. This connection is available on the printed circuit board. It is enough to connect it with a small soldered wire after having cut the original connection.

Once this intervention is done, it is necessary to write a few lines of assembler to configure the CTC and the SIO. Do not forget to remove the RS232 converter U8 from the board because Minitel uses TTL signals.

Finally, the source code is simple and easy to understand:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
//
// Ressources :
//
// https://www.seasip.info/Cpm/bdos.html
// https://github.com/wwarthen/RomWBW
// https://github.com/z88dk/z88dk/wiki/Platform---CPM
// http://www.z80.info/zip/um0081.pdf
// https://pila.fr/wordpress/?p=361
// https://www.goto10.fr/minitel/specifications/stum1b.pdf
//
// Compilation : zcc +cpm -lm -o main.com main.c
//
#include <stdio.h>
int main()
{
FILE *fp;
int Data;
unsigned char Index, Misc ;
   
	// Start application
	printf("Starting the Minitel application\n"); 
	// Configure the SIO chanel B for 7, E, 1 & NOT CTS ctrl
	#asm
		PUSH AF
		LD A, 0x33	; PTR WR3
		OUT(0x83), A	; ACESS WR3
		LD A, 0x41	; 7 bits RX, NO CTS, RX enable
		OUT(0x83), A	; WRITE WR3	
		LD A, 0x34	; PTR WR4
		OUT(0x83), A	; ACESS WR4
		LD A, 0x47	; E parity, 1 stop
		OUT(0x83), A	; WRITE WR4
		LD A, 0x35	; PTR WR5
		OUT(0x83), A	; ACESS WR5
		LD A, 0x28	; 7 bits TX
		OUT(0x83), A	; WRITE WR5
		POP AF
	#endasm
	// Configure the Com port n#2 baudrate (CTC) at 1200 for the Minitel
	#asm
		PUSH AF
		LD A, 0x47	; Counter mode
		OUT(0x89), A	; Control Word
		LD A, 0x60	; Counter value for 1200 bauds
		OUT(0x89), A	; Counter Word
		POP AF
	#endasm
	// Opening the Minitel Home page
	fp = fopen("Home.dat", "r");
	if (fp == NULL) {
		printf("Error opening Home.dat");
	return 0; }
	// Send the Home page to the Minitel
	Data = fgetc(fp);
	while ( Data != EOF ) {
		bdos(4, Data );
		Data = fgetc(fp); }
	// Infinite loop
	while (1) {
		// Print the 3 char for the display coordinate + 
		// the 5 char from the Colour Maximite II temperature
		// formatted as : 12.55
		// So, 8 char to relay
		for ( Index = 8; Index; Index-- ) {
			Data = bdos(3, Misc);
			bdos(4, Data ); } }
	// Close the Home page file	
	fclose(fp);
	// End main
    return 0;
}

Note also that CP / M offers 'services' in the form of a generic call by providing some information. This interface is provided in the form of the 'bdos ()' function and is used here to communicate with the communication port # 2.

And the result:


Conclusion: this CP / M board is really very pleasant to use and program with the Z88dk kit. It has an RC2014 type connector for the connection of various extensions. It could be interesting to install a PPI8255 or a Zilog PIO there.

RESSOURCES :