Multitech Micro-Professor MPF-1

The MPF-1B can still be bought from Flite Electronics

Sam Bergmans' Legendary MPF-1 pages including hexperiments.

PDF documentation and ROM dumps for the Multitech MPF-1 computer

The Bugbook Historical Microcomputer Museum

Some day I will research the different versions out there. Hans Otten has pictures of two different versions and neither is the one I have. My one matches the MPF-1B at the Centre for Computer History.

The Old Computer has ROM dumps.

MPF-EPB is a board with four memory devices and an EPROM programmer that connects to the Z80 CPU BUS connector.

Other expansion devices.

Mike Hawkins' PureMP / PureMPF MPF-1 emulator.

My MPF-1

This is my MPF-1, serial number 4229.

One RAM is a Hitachi HM6116, the other a Mitsubushi M58725. Both are 2k x 8.

I replaced the 6116 with a 2716 with the CTC interrupt driven clock program from the Experiment Manual, relocated to $2000. Built it into a shadow box for display.

The second pic shows what happened when I took a photograph with the flash on... the EPROM puts out garbage for a few cycles and the CPU reboots. Guess I should put stickers on the EPROMs.

Also, you need to use nylon spacers (or washers, I suppose), the PCB has a power track on the one side and a ground track on the other, right by the mounting holes.

Experiment Manual CTC Clock Example

I am flabbergasted at how kak this code is. It's simple, catch an interrupt, increment a counter, do nothing all day.

So they take the 1789800 Hz system clock, run it through the divide-by-256 prescaler, divide it by another 32 in the CTC, and then count to 218 in the code for a total division of 1785856 to give an error of 2.2 ms per second. So this thing runs slow by almost 8 seconds an hour. Enough power to land a man on the moon, and 8 seconds error each hour.


OK, to get the absolute best accuracy you need a 16-bit counter for the last stage, and maybe that was too advanced. But even if they had used 30 in the CTC and 233 in the software the error would have decreased by an order of magnitude. Some spreadsheeting shows that the best 8-bit software counter value is 184 with the CTC counting to 38, for an error if 85 us per second, almost 26 times better than the example. The best possible result is with a 16-bit software counter running to 6991 with the CTC just providing the divide-by-256 prescaler -- 58 us per second.

There might be a better solution using the divide-by-16 prescaler but I have not investigated that.

So change location 1823H to B8H and location 1809H to 26H and enjoy a much-improved clock.

At this stage I need to set the time manually, but it would be nice to add a real-time clock, so...


In my stash of stuff I found two MK48T08 Timekeeper ICs. These have a relatively easily removable battery although that removes the crystal as well. Fortunately I have a large stock of 32768kHz crystals.

/INT              Vcc
A12                /W  Write Enable
A7     A7   Vcc    E2  Chip Enable
A6     A6    A8    A8
A5     A5    A9    A9
A4     A4   /WE   A11
A3     A3   /OE    /G  Output Enable
A2     A2   A10   A10
A1     A1   /CS   /E1  Chip Enable
A0     A0    D7    D7
.....................  All other pins match
A11 and A12 need to be pulled high since the clock registers live at the top of the address space -- fortunately the monitor ROM uses memory up to 1FF2h, from there on up it won't step on anything.

Now to patch the ROM -- I figure if the ROM can check whether there is code in RAM and then execute it, the code can live in NVRAM.

For a patch, 06E1h to 0736h is available. One has to take cognisance of

0037: DEFB ZSUM (checksum)
A good place to hook the patch is
0062: C3 D0 00 JMP SETST0 (00D0)
0062: C3 E1 06 JMP PATCH (06E1)

06E1 3A 00 18   LD A,(0x1800)
06E4 FE D5      CP 0xD5 if A == N : Z is set
06E6 20 11      JR NZ, RET Jump if Z not set
06E8 3A 01 18   LD A,(0x1801)
06EB FE AA      CP 0xAA
06ED 20 0A      JR NZ,RET
06EF 3A 02 18   LD A,(0x1802)
06F2 FE 96      CP 0x96
06F4 20 03      JR NZ,RET
06F6 C3 03 18   JP 0x1803
06F9 C3 D0 00   RET: JP SETST0
Not great code, but it's been a while since I wrote Z-80-ish code (for my Sharp 1500. 1988 maybe. A. While.), and then, like now, hand assembly. It works. Wotthehell. Tojours Gai.

Test code

1800 D5 AA 96
1803 DD 21 0A 18     ld ix, 180A
1807 C3 D0 00        jp 00d0
180A 30 02 02 2b 03 A9
On reset, this displays "wrm--1" (for MPF-1-centric values of "w" and "m")

So let's make it work.

1800 D5 AA 96
1803 C3 40 18   JP CLOCK
1806 HH MM SS
1809 SET:
     3E 80      LD A, 80h
180B 32 F8 1F   LD (1ff8h), A
180E 3A 06 18   LD A, (1806)
1811 32 FB 1F   LD (1ffb), A
1814 3A 07 18   LD A, (1807)
1817 32 FA 1F   LD (1ffa), A
181A 3A 08 18   LD A, (1808)
181D 32 F9 1F   LD (1ff9),A 
1820 3E 00      LD A, 0
1822 32 F8 1F   LD (1ff8), A
1825 C3 40 18   JP CLOCK

1840 CLOCK:
     21 80 18   LD HL, BUFF
1843 3E 40      LD A, 40 ; read
1845 32 F8 1F   LD (1ff8h), A
1848 3A F9 1F   LD A, (1ff9) ; SS
184B CD 78 06   CALL HEX7SG 
184E 3A FA 1F   LD A, (1ffa) ; MM
1851 CD 78 06   CALL HEX7SG 
1854 3A FB 1F   LD A, (1ffb) ; HH
1857 CD 78 06   CALL HEX7SG 
185A 3E 00      LD A, 0
185C 32 F8 1F   LD (1ff8), A
185F DD21 80 18 LD IX, 1880
1863 06 64      LD B,100
1865 LOOP2:
     CD 24 06   CALL SCAN1 ; Carry clear if key
1868 10 FB      DJNZ LOOP2
186A D2 D0 00   JP NC, SETST0
186D C3 40 18   JP CLOCK

1880 BUFF:

[Image] Hit Count
hits since 2016-05-11.

Back to Wouter's CCC (This page last modified 2023-10-24)