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.
Mike Hawkins' PureMP / PureMPF MPF-1 emulator.
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.
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.
Pathetic.
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.
-------MK48T08------- --6116-- /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 matchA11 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)Patch
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 SETST0Not 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 A9On 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: SS MM HH
|
Back to Wouter's CCC | (This page last modified 2023-10-24) |