News:

Latest Previous 4.4 build: r1848

Main Menu

Recent posts

#11
Hardware / Re: reading a NeXT magneto opt...
Last post by mikeboss - Jul 07, 2026, 06:41 PM
asking around here is a good starting point. you might also try and join the Discord channel: https://discord.gg/KKqSA8fx4
#12
Hardware / reading a NeXT magneto optical...
Last post by ezrateboul - Jul 07, 2026, 05:52 PM
Hello everyone! first time poster. I did my best to make sure I followed the rules but let me know if I missed anything.

I am a historian of signal processing and electronic sound and I recently was entrusted with a NeXT magneto optic disc in very good condition containing some computer music code from a U.S. composer I am working with. It contains programs made on a NeXT machine between the late 80s and late 90s. It was last written to probably in 1997.

I am based in Montréal, and I am looking for anyone within a 10-12 hour drive of here that may have a functional setup to copy the contents of the disc / image it.

the kind folks at tinkerdifferent directed me to your forum (https://tinkerdifferent.com/threads/imaging-mo-disc.5462/)

thanks very much in advance for any tips or suggestions!
happy to answer questions if extra info might help orient this inquiry.

ezra
#13
Virtualization / Re: What Needs to be done for ...
Last post by andreas_g - Jul 07, 2026, 06:02 AM
I fixed the error in the SDL2 branch and the warning about the potentially uninitialised variable. Please try again.

SDL 3.1.5 was a beta version. The minimum requirement for Previous is SDL 3.2.0. I hope the problem with the menu has been fixed in the latest version of SDL3. I did not experience that problem though.
#14
Virtualization / Re: What Needs to be done for ...
Last post by Rhetorica - Jul 07, 2026, 02:02 AM
Yeah, I suppose I'll probably retire the SDL2 builds at this point entirely if the branch is no longer viable. I was keeping them going for the sake of completeness.
#15
Virtualization / Re: What Needs to be done for ...
Last post by wmlive - Jul 06, 2026, 10:32 PM
Quote from: Rhetorica on Jul 06, 2026, 09:27 PMIs it time to deprecate SDL2 (at least on Windows)? I'm not sure which branch @wmlive builds for i386.
The builds for Debian (aka wmlive-trixie) are done using "libsdl3-0 (>= 3.2.0)" as included in Debian/Trixie.

Unless faulty memory deceives, SDL3 has officially become the default for Previous since a few releases already.
See https://nextcommunity.net/forums/index.php?msg=418 for reference.
#16
Virtualization / Re: What Needs to be done for ...
Last post by Rhetorica - Jul 06, 2026, 09:38 PM
Update: Built the trunk branch, no differences from the filesharing branch. The binary for r1847 runs with SDL 3.2.1 but not SDL 3.1.5. To reiterate why I've been stuck on such an old SDL version, Previous doesn't refresh the screen reliably when opening the menu with the F12 key. Later today I will try building a newer SDL3 to see if the behavior has improved.
#17
Virtualization / Re: What Needs to be done for ...
Last post by Rhetorica - Jul 06, 2026, 09:27 PM
On the Windows side, it looks like we have some trouble.

I was not able to build an SDL2 (softfloat branch) binary for this release:

FAILED: src/gui-sdl/CMakeFiles/GuiSdl.dir/sdlaudio.c.obj
C:\Base\msys64\mingw64\bin\cc.exe -DCONFDIR=\".\" -DSDL_MAIN_HANDLED -ID:/Emulation/previous-src/pre
vious-r1847-softfloat/src/includes -ID:/Emulation/previous-src/previous-r1847-softfloat/src/debug -I
D:/Emulation/previous-src/previous-r1847-softfloat/src/dsp -ID:/Emulation/previous-src/previous-r184
7-softfloat/src/softfloat -ID:/Emulation/previous-src/previous-r1847-softfloat/src/dimension -ID:/Em
ulation/previous-src/previous-r1847-softfloat/src/slirp -ID:/Emulation/previous-src/previous-r1847-s
oftfloat/build -ID:/Emulation/previous-src/previous-r1847-softfloat/src/cpu -ID:/Emulation/previous-
src/previous-r1847-softfloat/src/gui-sdl/. -ID:/Emulation/previous-src/previous-r1847-softfloat/src/
gui-sdl/../.. -ID:/Emulation/previous-src/previous-r1847-softfloat/src/gui-sdl/../debug -ID:/Emulati
on/previous-src/previous-r1847-softfloat/src/gui-sdl/../includes -isystem C:/Base/msys64/mingw64/inc
lude/SDL2 -std=gnu99 -Wcast-qual -Wbad-function-cast -Wpointer-arith -Wmissing-prototypes -Wstrict-p
rototypes -Wall -Wwrite-strings -Wsign-compare -Wformat-security -g -O0 -D__USE_MINGW_ANSI_STDIO=1 -
Wno-conversion -Wimplicit-fallthrough=0 -Wshadow=local -Wvla -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS
=64 -Wno-write-strings -O3 -DNDEBUG -MD -MT src/gui-sdl/CMakeFiles/GuiSdl.dir/sdlaudio.c.obj -MF src
\gui-sdl\CMakeFiles\GuiSdl.dir\sdlaudio.c.obj.d -o src/gui-sdl/CMakeFiles/GuiSdl.dir/sdlaudio.c.obj
-c D:/Emulation/previous-src/previous-r1847-softfloat/src/gui-sdl/sdlaudio.c
D:/Emulation/previous-src/previous-r1847-softfloat/src/gui-sdl/sdlaudio.c: In function 'Audio_Output
_Queue_Put':
D:/Emulation/previous-src/previous-r1847-softfloat/src/gui-sdl/sdlaudio.c:38:46: error: passing argu
ment 1 of 'SDL_QueueAudio' makes integer from pointer without a cast [-Wint-conversion]
   38 |                 SDL_QueueAudio(audio_playback.device, data, len);
      |                                ~~~~~~~~~~~~~~^~~~~~~
      |                                              |
      |                                              SDL_AudioDeviceID * {aka unsigned int *}
In file included from C:/Base/msys64/mingw64/include/SDL2/SDL.h:36,
                 from D:/Emulation/previous-src/previous-r1847-softfloat/src/gui-sdl/sdlaudio.h:11,
                 from D:/Emulation/previous-src/previous-r1847-softfloat/src/gui-sdl/sdlaudio.c:13:
C:/Base/msys64/mingw64/include/SDL2/SDL_audio.h:1229:62: note: expected 'SDL_AudioDeviceID' {aka 'un
signed int'} but argument is of type 'SDL_AudioDeviceID *' {aka 'unsigned int *'}
 1229 | extern DECLSPEC int SDLCALL SDL_QueueAudio(SDL_AudioDeviceID dev, const void *data, Uint32 l
en);
      |                                            ~~~~~~~~~~~~~~~~~~^~~
D:/Emulation/previous-src/previous-r1847-softfloat/src/gui-sdl/sdlaudio.c: In function 'Audio_Output
_Queue_Size':
D:/Emulation/previous-src/previous-r1847-softfloat/src/gui-sdl/sdlaudio.c:44:65: error: passing argu
ment 1 of 'SDL_GetQueuedAudioSize' makes integer from pointer without a cast [-Wint-conversion]
   44 |                 int size = SDL_GetQueuedAudioSize(audio_playback.device);
      |                                                   ~~~~~~~~~~~~~~^~~~~~~
      |                                                                 |
      |                                                                 SDL_AudioDeviceID * {aka uns
igned int *}
C:/Base/msys64/mingw64/include/SDL2/SDL_audio.h:1311:73: note: expected 'SDL_AudioDeviceID' {aka 'un
signed int'} but argument is of type 'SDL_AudioDeviceID *' {aka 'unsigned int *'}
 1311 | extern DECLSPEC Uint32 SDLCALL SDL_GetQueuedAudioSize(SDL_AudioDeviceID dev);
      |                                                       ~~~~~~~~~~~~~~~~~~^~~
D:/Emulation/previous-src/previous-r1847-softfloat/src/gui-sdl/sdlaudio.c: In function 'Audio_Output
_Queue_Clear':
D:/Emulation/previous-src/previous-r1847-softfloat/src/gui-sdl/sdlaudio.c:57:52: error: passing argu
ment 1 of 'SDL_ClearQueuedAudio' makes integer from pointer without a cast [-Wint-conversion]
   57 |                 SDL_ClearQueuedAudio(audio_playback.device);
      |                                      ~~~~~~~~~~~~~~^~~~~~~
      |                                                    |
      |                                                    SDL_AudioDeviceID * {aka unsigned int *}
C:/Base/msys64/mingw64/include/SDL2/SDL_audio.h:1345:69: note: expected 'SDL_AudioDeviceID' {aka 'un
signed int'} but argument is of type 'SDL_AudioDeviceID *' {aka 'unsigned int *'}
 1345 | extern DECLSPEC void SDLCALL SDL_ClearQueuedAudio(SDL_AudioDeviceID dev);
      |                                                   ~~~~~~~~~~~~~~~~~~^~~
D:/Emulation/previous-src/previous-r1847-softfloat/src/gui-sdl/sdlaudio.c: In function 'Audio_Data_G
et':
D:/Emulation/previous-src/previous-r1847-softfloat/src/gui-sdl/sdlaudio.c:69:61: error: passing argu
ment 1 of 'SDL_DequeueAudio' makes integer from pointer without a cast [-Wint-conversion]
   69 |                         audio->size = SDL_DequeueAudio(audio->device, audio->data, sizeof(au
dio->data));
      |                                                        ~~~~~^~~~~~~~
      |                                                             |
      |                                                             SDL_AudioDeviceID * {aka unsigne
d int *}
C:/Base/msys64/mingw64/include/SDL2/SDL_audio.h:1277:67: note: expected 'SDL_AudioDeviceID' {aka 'un
signed int'} but argument is of type 'SDL_AudioDeviceID *' {aka 'unsigned int *'}
 1277 | extern DECLSPEC Uint32 SDLCALL SDL_DequeueAudio(SDL_AudioDeviceID dev, void *data, Uint32 le
n);
      |                                                 ~~~~~~~~~~~~~~~~~~^~~
D:/Emulation/previous-src/previous-r1847-softfloat/src/gui-sdl/sdlaudio.c: In function 'Audio_Input_
Buffer_Size':
D:/Emulation/previous-src/previous-r1847-softfloat/src/gui-sdl/sdlaudio.c:89:62: error: passing argu
ment 1 of 'SDL_GetQueuedAudioSize' makes integer from pointer without a cast [-Wint-conversion]
   89 |                 return SDL_GetQueuedAudioSize(audio_recording.device);
      |                                               ~~~~~~~~~~~~~~~^~~~~~~
      |                                                              |
      |                                                              SDL_AudioDeviceID * {aka unsign
ed int *}
C:/Base/msys64/mingw64/include/SDL2/SDL_audio.h:1311:73: note: expected 'SDL_AudioDeviceID' {aka 'un
signed int'} but argument is of type 'SDL_AudioDeviceID *' {aka 'unsigned int *'}
 1311 | extern DECLSPEC Uint32 SDLCALL SDL_GetQueuedAudioSize(SDL_AudioDeviceID dev);
      |                                                       ~~~~~~~~~~~~~~~~~~^~~
D:/Emulation/previous-src/previous-r1847-softfloat/src/gui-sdl/sdlaudio.c: In function 'Audio_Enable
':
D:/Emulation/previous-src/previous-r1847-softfloat/src/gui-sdl/sdlaudio.c:117:62: error: passing arg
ument 1 of 'SDL_GetAudioDeviceStatus' makes integer from pointer without a cast [-Wint-conversion]
  117 |                 if (bEnable && SDL_GetAudioDeviceStatus(audio->device) == SDL_AUDIO_PAUSED)
{
      |                                                         ~~~~~^~~~~~~~
      |                                                              |
      |                                                              SDL_AudioDeviceID * {aka unsign
ed int *}
C:/Base/msys64/mingw64/include/SDL2/SDL_audio.h:722:84: note: expected 'SDL_AudioDeviceID' {aka 'uns
igned int'} but argument is of type 'SDL_AudioDeviceID *' {aka 'unsigned int *'}
  722 | extern DECLSPEC SDL_AudioStatus SDLCALL SDL_GetAudioDeviceStatus(SDL_AudioDeviceID dev);
      |                                                                  ~~~~~~~~~~~~~~~~~~^~~
D:/Emulation/previous-src/previous-r1847-softfloat/src/gui-sdl/sdlaudio.c:120:51: error: passing arg
ument 1 of 'SDL_PauseAudioDevice' makes integer from pointer without a cast [-Wint-conversion]
  120 |                         SDL_PauseAudioDevice(audio->device, 0);
      |                                              ~~~~~^~~~~~~~
      |                                                   |
      |                                                   SDL_AudioDeviceID * {aka unsigned int *}
C:/Base/msys64/mingw64/include/SDL2/SDL_audio.h:785:69: note: expected 'SDL_AudioDeviceID' {aka 'uns
igned int'} but argument is of type 'SDL_AudioDeviceID *' {aka 'unsigned int *'}
  785 | extern DECLSPEC void SDLCALL SDL_PauseAudioDevice(SDL_AudioDeviceID dev,
      |                                                   ~~~~~~~~~~~~~~~~~~^~~
D:/Emulation/previous-src/previous-r1847-softfloat/src/gui-sdl/sdlaudio.c:121:70: error: passing arg
ument 1 of 'SDL_GetAudioDeviceStatus' makes integer from pointer without a cast [-Wint-conversion]
  121 |                 } else if (!bEnable && SDL_GetAudioDeviceStatus(audio->device) == SDL_AUDIO_
PLAYING) {
      |                                                                 ~~~~~^~~~~~~~
      |                                                                      |
      |                                                                      SDL_AudioDeviceID * {ak
a unsigned int *}
C:/Base/msys64/mingw64/include/SDL2/SDL_audio.h:722:84: note: expected 'SDL_AudioDeviceID' {aka 'uns
igned int'} but argument is of type 'SDL_AudioDeviceID *' {aka 'unsigned int *'}
  722 | extern DECLSPEC SDL_AudioStatus SDLCALL SDL_GetAudioDeviceStatus(SDL_AudioDeviceID dev);
      |                                                                  ~~~~~~~~~~~~~~~~~~^~~
D:/Emulation/previous-src/previous-r1847-softfloat/src/gui-sdl/sdlaudio.c:123:51: error: passing arg
ument 1 of 'SDL_PauseAudioDevice' makes integer from pointer without a cast [-Wint-conversion]
  123 |                         SDL_PauseAudioDevice(audio->device, 1);
      |                                              ~~~~~^~~~~~~~
      |                                                   |
      |                                                   SDL_AudioDeviceID * {aka unsigned int *}
C:/Base/msys64/mingw64/include/SDL2/SDL_audio.h:785:69: note: expected 'SDL_AudioDeviceID' {aka 'uns
igned int'} but argument is of type 'SDL_AudioDeviceID *' {aka 'unsigned int *'}
  785 | extern DECLSPEC void SDLCALL SDL_PauseAudioDevice(SDL_AudioDeviceID dev,
      |                                                   ~~~~~~~~~~~~~~~~~~^~~
D:/Emulation/previous-src/previous-r1847-softfloat/src/gui-sdl/sdlaudio.c: In function 'Audio_Open':
D:/Emulation/previous-src/previous-r1847-softfloat/src/gui-sdl/sdlaudio.c:150:31: error: assignment
to 'SDL_AudioDeviceID *' {aka 'unsigned int *'} from 'SDL_AudioDeviceID' {aka 'unsigned int'} makes
pointer from integer without a cast [-Wint-conversion]
  150 |                 audio->device = SDL_OpenAudioDevice(NULL, iscapture, &request, NULL, 0);
      |                               ^
D:/Emulation/previous-src/previous-r1847-softfloat/src/gui-sdl/sdlaudio.c: In function 'Audio_Close'
:
D:/Emulation/previous-src/previous-r1847-softfloat/src/gui-sdl/sdlaudio.c:181:43: error: passing arg
ument 1 of 'SDL_CloseAudioDevice' makes integer from pointer without a cast [-Wint-conversion]
  181 |                 SDL_CloseAudioDevice(audio->device);
      |                                      ~~~~~^~~~~~~~
      |                                           |
      |                                           SDL_AudioDeviceID * {aka unsigned int *}
C:/Base/msys64/mingw64/include/SDL2/SDL_audio.h:1490:69: note: expected 'SDL_AudioDeviceID' {aka 'un
signed int'} but argument is of type 'SDL_AudioDeviceID *' {aka 'unsigned int *'}
 1490 | extern DECLSPEC void SDLCALL SDL_CloseAudioDevice(SDL_AudioDeviceID dev);
      |                                                   ~~~~~~~~~~~~~~~~~~^~~
D:/Emulation/previous-src/previous-r1847-softfloat/src/gui-sdl/sdlaudio.c: In function 'Audio_Handle
_Disconnect':
D:/Emulation/previous-src/previous-r1847-softfloat/src/gui-sdl/sdlaudio.c:210:62: error: passing arg
ument 1 of 'SDL_GetAudioDeviceStatus' makes integer from pointer without a cast [-Wint-conversion]
  210 |         if (audio->freq > 0 && SDL_GetAudioDeviceStatus(audio->device) == SDL_AUDIO_STOPPED)
 {
      |                                                         ~~~~~^~~~~~~~
      |                                                              |
      |                                                              SDL_AudioDeviceID * {aka unsign
ed int *}
C:/Base/msys64/mingw64/include/SDL2/SDL_audio.h:722:84: note: expected 'SDL_AudioDeviceID' {aka 'uns
igned int'} but argument is of type 'SDL_AudioDeviceID *' {aka 'unsigned int *'}
  722 | extern DECLSPEC SDL_AudioStatus SDLCALL SDL_GetAudioDeviceStatus(SDL_AudioDeviceID dev);
      |                                                                  ~~~~~~~~~~~~~~~~~~^~~
D:/Emulation/previous-src/previous-r1847-softfloat/src/gui-sdl/sdlaudio.c:211:43: error: passing arg
ument 1 of 'SDL_CloseAudioDevice' makes integer from pointer without a cast [-Wint-conversion]
  211 |                 SDL_CloseAudioDevice(audio->device);
      |                                      ~~~~~^~~~~~~~
      |                                           |
      |                                           SDL_AudioDeviceID * {aka unsigned int *}
C:/Base/msys64/mingw64/include/SDL2/SDL_audio.h:1490:69: note: expected 'SDL_AudioDeviceID' {aka 'un
signed int'} but argument is of type 'SDL_AudioDeviceID *' {aka 'unsigned int *'}
 1490 | extern DECLSPEC void SDLCALL SDL_CloseAudioDevice(SDL_AudioDeviceID dev);
      |                                                   ~~~~~~~~~~~~~~~~~~^~~
[25/184] Building C object src/softfloat/CMakeFiles/SoftFloat.dir/softfloat.c.obj

Is it time to deprecate SDL2 (at least on Windows)? I'm not sure which branch @wmlive builds for i386.

Additionally, the filesharing branch binary fails to run, with:

The procedure entry point SDL_AudioStreamDevicePaused could not be located in the dynamic link library D:\Emulation\Previous_r1847-filesharing\previous.exe.

I assume these both pertain to a feature in a newer SDL3 build, in which case the outstanding problem with the main menu not refreshing the screen properly needs to be addressed before a Windows release can be made.

I've been shipping an outdated SDL3.dll that was more compatible, but it seems that will no longer suffice.

The compilation of the filesharing branch worked fine, aside from a warning about some possibly uninitialized variables in dlgMouse.c:

-- Build files have been written to: D:/Emulation/previous-src/previous-r1847-filesharing/build
[28/184] Building C object src/gui-sdl/CMakeFiles/GuiSdl.dir/dlgMouse.c.obj
In function 'Dialog_TabletDlg',
    inlined from 'Dialog_MouseDlg' at D:/Emulation/previous-src/previous-r1847-filesharing/src/gui-s
dl/dlgMouse.c:388:5:
D:/Emulation/previous-src/previous-r1847-filesharing/src/gui-sdl/dlgMouse.c:245:28: warning: 'after'
 may be used uninitialized [-Wmaybe-uninitialized]
  245 |         if (bTabletEnabled && (after != before)) {
      |             ~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~
D:/Emulation/previous-src/previous-r1847-filesharing/src/gui-sdl/dlgMouse.c: In function 'Dialog_Mou
seDlg':
D:/Emulation/previous-src/previous-r1847-filesharing/src/gui-sdl/dlgMouse.c:200:29: note: 'after' wa
s declared here
  200 |         TABLET_TYPE before, after;
      |                             ^~~~~
[184/184] Linking CXX executable src\previous.exe

I did not check the trunk branch—if I should be using it instead of filesharing, please remind me!

I have posted the 4.4 binaries for Mac and Debian to previous.nextcommunity.net. The Windows version will just have to be stuck at 4.3 until we get this sorted out.

Since this is partly (mostly?) my fault for not compiling every revision to catch this problem sooner, I will look into setting up some means of automating Windows builds on my workstation, though I cannot promise a specific timeline for that. I do already have an RSS feed that tells me when each update hits Sourceforge (this is how the forums know the current revision; I update it manually) but I have not yet taken the step of automating any actions based on it.
#18
Virtualization / Re: What Needs to be done for ...
Last post by wmlive - Jul 06, 2026, 07:21 PM
Quote from: andreas_g on Jul 06, 2026, 06:39 AMI am happy to release Previous v4.4!
[...]
Have fun with the new version and please report any issues.
Thanks a lot, Andreas!

For the Linux based bug hunters, the Debian/Trixie packages for amd64/arm64/i386 at wmlive.rumbero.org/repo/pool/main/p/previous/ have been updated to release Previous v4.4 (r1847).
#19
Virtualization / Re: What Needs to be done for ...
Last post by andreas_g - Jul 06, 2026, 06:39 AM
Hello all,

I am happy to release Previous v4.4! It adds support for saving prints and screenshots to TIFF files which can be opened by NeXTstep. It also improves PNG file saving the generate smaller file sizes. You might also notice improved efficiency when running a monochrome guest system as the screen drawing routine has been optimised. Another new feature is support for recording sound through the DSP serial port (sndrecord -d file.snd). Last but not least it replaces the bad low-pass filter for sound output with a more accurate de-emphasis filter (the filter is enabled by the guest system when playing emphasised audio).

As always I have built a binary for macOS 10.13 and later (Intel and Apple Silicon) which you can load here.

Have fun with the new version and please report any issues.
#20
Hardware / NeXT Laser Printer not working...
Last post by kamiru - Jul 05, 2026, 05:24 PM
Hi,

I recently bought a NeXT Cube with the original 400 dpi laser printer and it has been really exciting so far. The printer verifiably worked days before I picked it up as the seller printed test pages on this exact Cube and cable, and I have them (toner is crisp and fully fused).

Somehow though, the printer now refused to print anything. After troubleshooting for two days without result, I've decided to take it to the forums  ;D 

Setup:
- NeXTcube (1990)
- NeXTSTEP 3.3 (fresh install)
- NeXT 400 dpi Laser Printer (N2000, European unit)

Symptoms:

Any print job: printer powers up (fan/motor spin briefly), no paper feed, then fails. Terminal usually shows "np0: serial command parity error"
Sometimes it shows"np0: ioctl error; fatal + Cannot get device status: I/O error"
Printer→Cube status works flawlessly: cover-open, no-paper, cassette-type alerts arrive instantly and correctly, never corrupted. nppower on/off also works (audible). So the link is NOT fully dead — specifically the Cube→printer command exchanges fail.
The fuser never heats. Stone cold after 3+ minutes powered, tested properly: fully reassembled printer (all covers incl. rear door), toner cartridge + paper in, and respecting the 10-minute-off heater lockout from the service manual before testing.
TEST PRINT button on the DC controller: no reaction (consistent with engine never reaching READY, since RDY requires fuser at temperature).
Interesting history: even when the printer worked at the seller's, jobs sometimes hung and he'd routinely fix it with pause+resume in the print queue — so the link was already marginal before transport.


Already done/ruled out: fresh OS install (no change); cable ends inspected/cleaned/reseated many times; wiggle tests while tailing /usr/adm/messages (no correlation — errors drift on their own between "modes"); J112 and J851 reseated; CB101 breaker checked (springy, doesn't feel tripped); voltage selector verified; full reassembly; interlock conditions met. No multimeter measurements yet (being fixed this week — I know J112 fuser-side should read ~3.5–4 Ω per powerlot/Paolo B, thermistor 1.0–1.6 MΩ).

My working theory (heavily informed by a VCFed thread): either two independent faults (transport-killed lamp/thermoswitch + flaky command path), or one common root — aged AC module / LVPS electrolytics producing dirty rails that both corrupt serial command sampling AND starve the heater control chain (à la Paolo B's under-specced optocoupler resistor / C152+C156 story).

Questions:


Has anyone traced np0: serial command parity error to a specific cause? (cable conductor vs interface PCB vs supply rails?)

Is a simultaneous dead-heater + corrupt-command-link failure a known signature of the AC module / LVPS caps?

Any other ideas?

Thanks a lot in advance! :)
If any more information or photos are needed, then that's absolutely doable.