Analysing the raw video signal of the Philips P2000M
Introduction
The Philips P2000M exposes a proprietary monochrome raster-video signal that is much closer to the machine’s internal timing than to a modern, ready-to-display monitor signal. It is not standard PAL composite video, VGA, MDA, or CGA, although its line timing is closely related to the 15.625 kHz line frequency used by European 625-line television systems.
Instead of a single composite output, the captured signal separates horizontal sync, vertical sync, and one-bit video data. That makes it slightly awkward to use directly, but it also makes the port interesting: with an oscilloscope capture and the service manual timing, the screen can be reconstructed almost dot by dot.
The raw analysis files and scripts are available in the p2000m-video-signal-analysis repository.
Capturing the signal
The video connector on the P2000M is a typical DIN 5 socket. Looking into the socket with the central contact downwards, the socket positions can be read from left to right as:
GNDDOT/SIGNALGNDHSYNCVSYNC
For this first analysis I used a Siglent oscilloscope capture with three channels:
CH1: horizontal syncCH2: monochrome video levelCH3: vertical sync
The capture is stored as a binary waveform file and then decoded with small Python scripts. The scripts convert the oscilloscope samples back into voltages, detect the sync edges, and align the waveform with the P2000M video timing from the service manual.
Electrically, the video line is analog in the sense that it is a voltage waveform, but the information it carries is essentially binary: each dot is either dark or bright. A threshold comparator or Schmitt-trigger input should therefore be enough to turn it into a clean digital pixel stream, provided the timing is handled correctly.
Reconstructing the frame
The useful part of the timing is the familiar text-mode geometry: 80 characters by 24 visible rows, with an 8 by 12 dot character cell. The character generator therefore produces a 640 x 288 active monochrome image:
80 characters x 8 dots = 640 visible dots
24 character rows x 12 lines = 288 visible linesInternally, the timing is larger than the visible area. The dot clock is 12 MHz, so one dot period is approximately 83.33 ns. A complete horizontal line contains 96 character times, or 768 dot-clock periods:
96 characters x 8 dots = 768 total dots per line
12,000,000 / 768 = 15,625 HzThis gives a horizontal line period of 64 us. Of the 96 character periods, 80 are visible and the remaining 16 are used for horizontal blanking and synchronization.
Vertically, a complete frame contains 26 character rows, with 12 scanlines per row:
26 rows x 12 scanlines = 312 total lines per frame
24 rows x 12 scanlines = 288 visible lines
15,625 / 312 = 50.08 HzThe complete raster is therefore 768 x 312 timing positions, with a 640 x 288 active image area. The signal is progressive rather than interlaced, so it can be described informally as a 312-line, approximately 50 Hz progressive monochrome format derived from PAL-family timing.
The analysis script finds two vertical sync edges to bound a frame, then uses
the horizontal sync edges to locate individual scanlines. In this capture the
VSYNC-bounded row order starts with row R25, then R00, followed by the
visible rows R01 through R24. After discarding the blank rows, the video
channel can be thresholded into a monochrome bitmap.
In decoder terms, the job is straightforward: sample one video bit on each 12 MHz dot-clock cycle, use horizontal sync to identify the start of each 768-position line, and use vertical sync to identify the start of each 312-line frame. Once the blanking regions are discarded, the resulting framebuffer is 640 x 288 pixels, matching the 80 x 24 text display exactly.
Timing map
The timing diagram combines the measured signals with the service manual’s dot and character counters. The green area marks the 80 by 24 display window, white dots are video samples above the chosen threshold, red marks horizontal sync, and blue marks vertical sync. This makes the raw nature of the port very clear: the display information is there, but an adapter or monitor still has to respect the machine’s separate sync and blanking structure.
Next steps
This is still a first pass, but it already gives a useful basis for a practical video adapter. The next questions are how stable the timing is across captures, which voltage thresholds are most reliable, and how best to turn the separated P2000M signals into something a modern display can accept.