Skip to content

PDP11: slow zmodem uploads #571

Description

@ddrown

I've setup the PDP11 emulator (built make pdp11 from commit a1f57fa) with 2.11 BSD. I'm running on a pi5 with Raspberry Pi OS trixie.

When downloading files via sz (2.11 BSD) -> zmodem + minicom (pi5), I get the full expected speeds:

Bytes received:    7168/  54407   BPS:945    ETA 00:49 

When uploading files via zmodem + minicom (pi5) -> rz (2.11 BSD), I get around 120 bytes/s. It's hard to show the text of this because these files are small enough to fit entirely in simh's TCP receive queue, but here's a quick shell script to watch simh consume the TCP data:

$ while :; do netstat -nt; sleep 1; done | awk '($4 == "127.0.0.1:4001") { print $2, last-$2; last=$2 }'                                                                                                  
18635 -18635
17912 723
17912 0
17912 0
17671 241
17671 0
17671 0
17671 0
17430 241
17430 0
17430 0
17430 0
17189 241
17189 0
17189 0
17189 0
16707 482
15984 723
15984 0
15984 0
15984 0
15743 241
15743 0
15743 0
15743 0
15502 241
15502 0
15502 0
15502 0
15261 241
15261 0
15261 0
14538 723
14297 241
14056 241
14056 0
14056 0
14056 0
13815 241
13815 0
13815 0
13815 0
13574 241
13574 0
13574 0
13574 0
13333 241
13333 0
12610 723
12369 241
12369 0
12128 241
12128 0
12128 0
12128 0
11887 241
11887 0
11887 0
11887 0
11646 241
11646 0
11646 0
11646 0
11405 241

socat command to connect minicom to the emulator:

socat -d -d pty,raw,echo=0,link=/tmp/ttyV0 tcp:localhost:4001

minicom command:

minicom -D /tmp/ttyV0

full build output:

lib paths are: /lib/ /lib/aarch64-linux-gnu/ /usr/lib/aarch64-linux-gnu/libfakeroot/ /usr/local/lib/ /usr/lib/
include paths are:  /usr/lib/gcc/aarch64-linux-gnu/14/include /usr/local/include /usr/include/aarch64-linux-gnu /usr/include
using libm: /lib/aarch64-linux-gnu/libm.so
using librt: /lib/aarch64-linux-gnu/librt.a
using libpthread: /lib/aarch64-linux-gnu/libpthread.a /usr/include/pthread.h
using libpcre2-8: /lib/aarch64-linux-gnu/libpcre2-8.so /usr/include/pcre2.h
using semaphore: /usr/include/semaphore.h
using libdl: /lib/aarch64-linux-gnu/libdl.a /usr/include/dlfcn.h
using libedit: /usr/include/editline/readline.h
using libpng: /lib/aarch64-linux-gnu/libpng.so /usr/include/png.h
using zlib: /lib/aarch64-linux-gnu/libz.so /usr/include/zlib.h
using mman: /usr/include/aarch64-linux-gnu/sys/mman.h
using libSDL2: /usr/include/SDL2/SDL.h
*** No SDL ttf support available.  BESM-6 video panel disabled.
***
*** Info *** Install the development components of libSDL2-ttf
*** Info *** packaged for your Linux operating system distribution:
*** Info ***        $ sudo apt-get install libsdl2-ttf-dev
using libpcap: /usr/include/pcap.h
using libvdeplug: /lib/aarch64-linux-gnu/libvdeplug.so /usr/include/libvdeplug.h
***
*** pdp11 Simulator being built with:
*** - compiler optimizations and no debugging support. GCC Version: 14.2.0.
*** - dynamic networking support using Linux provided libpcap components.
*** - Local LAN packet transports: PCAP VDE TAP NAT(SLiRP)
*** - video capabilities provided by libSDL2 (Simple Directmedia Layer).
*** - Per simulator tests will be run.
***
*** git commit id is a1f57fa3738ed31148d31126ba1a7278ff845c6d.
*** git commit time is 2026-07-03T13:48:11+0200.
***
gcc -std=gnu99 -U__STRICT_ANSI__  -O2 -DNDEBUG=1 -finline-functions -fgcse-after-reload -fpredictive-commoning -fipa-cp-clone -fno-unsafe-loop-optimizations -fno-strict-overflow -DSIM_GIT_COMMIT_ID=a1f57fa3738ed31148d31126ba1a7278ff845c6d -DSIM_GIT_COMMIT_TIME=2026-07-03T13:48:11+0200  -DSIM_COMPILER="GCC Version: 14.2.0" -DSIM_BUILD_TOOL=simh-makefile -I . -Werror -D_GNU_SOURCE -DHAVE_PCRE2_H -DHAVE_SEMAPHORE -DHAVE_SYS_IOCTL -DHAVE_LINUX_CDROM -DSIM_HAVE_DLOPEN=so -DHAVE_EDITLINE -DHAVE_UTIME -DHAVE_LIBPNG -DHAVE_ZLIB -DHAVE_GLOB -DHAVE_SHM_OPEN  ./PDP11/pdp11_fp.c ./PDP11/pdp11_cpu.c ./PDP11/pdp11_dz.c ./PDP11/pdp11_cis.c ./PDP11/pdp11_lp.c ./PDP11/pdp11_rk.c ./PDP11/pdp11_rl.c ./PDP11/pdp11_rp.c ./PDP11/pdp11_rx.c ./PDP11/pdp11_stddev.c ./PDP11/pdp11_sys.c ./PDP11/pdp11_tc.c ./PDP11/pdp11_tm.c ./PDP11/pdp11_ts.c ./PDP11/pdp11_io.c ./PDP11/pdp11_rq.c ./PDP11/pdp11_tq.c ./PDP11/pdp11_pclk.c ./PDP11/pdp11_ry.c ./PDP11/pdp11_pt.c ./PDP11/pdp11_hk.c ./PDP11/pdp11_xq.c ./PDP11/pdp11_xu.c ./PDP11/pdp11_vh.c ./PDP11/pdp11_rh.c ./PDP11/pdp11_tu.c ./PDP11/pdp11_cpumod.c ./PDP11/pdp11_cr.c ./PDP11/pdp11_rf.c ./PDP11/pdp11_dl.c ./PDP11/pdp11_ta.c ./PDP11/pdp11_rc.c ./PDP11/pdp11_kg.c ./PDP11/pdp11_ke.c ./PDP11/pdp11_dc.c ./PDP11/pdp11_dmc.c ./PDP11/pdp11_kmc.c ./PDP11/pdp11_dup.c ./PDP11/pdp11_rs.c ./PDP11/pdp11_vt.c ./PDP11/pdp11_td.c ./PDP11/pdp11_io_lib.c ./PDP11/pdp11_rom.c ./PDP11/pdp11_ch.c ./PDP11/pdp11_dh.c ./PDP11/pdp11_ng.c ./PDP11/pdp11_daz.c ./PDP11/pdp11_tv.c ./PDP11/pdp11_mb.c ./PDP11/pdp11_rr.c ./display/display.c ./display/sim_ws.c ./display/ng.c ./display/vt11.c ./scp.c ./sim_console.c ./sim_fio.c ./sim_timer.c ./sim_sock.c ./sim_tmxr.c ./sim_ether.c ./sim_tape.c ./sim_disk.c ./sim_serial.c ./sim_video.c ./sim_imd.c ./sim_card.c -DVM_PDP11 -I ./PDP11 -DHAVE_PCAP_NETWORK -I/usr/include/ -DBPF_CONST_STRING -DUSE_SHARED -DHAVE_VDE_NETWORK -DHAVE_TAP_NETWORK -Islirp -Islirp_glue -Islirp_glue/qemu -DHAVE_SLIRP_NETWORK -DUSE_SIMH_SLIRP_DEBUG slirp/*.c slirp_glue/*.c -DUSE_DISPLAY -DHAVE_LIBSDL -DUSE_SIM_VIDEO `sdl2-config --cflags` `sdl2-config --libs` -DUSE_READER_THREAD -DSIM_ASYNCH_IO -o BIN/pdp11 -lm -lrt -lpthread -lpcre2-8 -ldl -ledit -ltermcap -lpng -lz -lvdeplug -Wl,-R,/lib/aarch64-linux-gnu/ -L/lib/aarch64-linux-gnu/ 
BIN/pdp11 RegisterSanityCheck  </dev/null 
 Running internal register sanity checks on PDP-11 simulator.
*** Good Registers in PDP-11 simulator.

SHOW VERSION output:

sim> show version
PDP-11 simulator Open SIMH V4.1-0 Current
    Simulator Framework Capabilities:
        32b data
        32b addresses
        Threaded Ethernet Packet transports:PCAP:TAP:VDE:NAT:UDP
        Idle/Throttling support is available
        Virtual Hard Disk (VHD) support
        RAW disk and CD/DVD ROM support
        Asynchronous I/O support (Lock free asynchronous event queue)
        Asynchronous Clock support
        FrontPanel API Version 12
    Host Platform:
        Compiler: GCC 14.2.0
        Simulator Compiled as C (Release Build) on Aug  1 2026 at 22:20:39
        Build Tool: simh-makefile
        Memory Access: Little Endian
        Memory Pointer Size: 64 bits
        Large File (>2GB) support
        SDL Video support: SDL Version 2.32.4, PNG Version 1.6.48, zlib: 1.3.1
        PCRE2 RegEx (Version 10.46) support for EXPECT commands
        OS clock resolution: 1ms
        Time taken by msleep(1): 1ms
        Ethernet packet info: libpcap version 1.10.5 (with TPACKET_V3)
        OS: Linux pi5.lan 6.18.33+rpt-rpi-2712 #1 SMP PREEMPT Debian 1:6.18.33-1+rpt1 (2026-06-01) aarch64 GNU/Linux
        Processor Name: Cortex-A76
        tar tool: tar (GNU tar) 1.35
        curl tool: curl 8.14.1 (aarch64-unknown-linux-gnu) libcurl/8.14.1 OpenSSL/3.5.6 zlib/1.3.1 brotli/1.1.0 zstd/1.5.7 libidn2/2.3.8 libpsl/0.21.2 libssh2/1.11.1 nghttp2/1.64.0 nghttp3/1.8.0 librtmp/2.3 OpenLDAP/2.6.10
        git commit id: a1f57fa3
        git commit time: 2026-07-03T13:48:11+0200

my boot.ini:

set cpu 11/70 4096K fpp idle
set clk 60hz

set tto 8b

set rq ena
set rq0 rauser=1000
att rq0 2.11BSD_rq.dsk

set dz ena
set dz lines=8
set dz 8b
att dz 127.0.0.1:4000
att dz -am line=5,127.0.0.1:4001;notelnet
att dz -am line=7,127.0.0.1:1108;notelnet

set tq ena
att -R tq0 -F TAR pine-0dc9f7e6209a1e62a7f1882df2ffb6048414dd58.tar

set dz vector=310

boot rq0

Digging into what may be causing this, my theory is the DZ driver only adds 1 byte to the queue at every driver interrupt (dz_update_rcvi) and 2.11 BSD is only polling at ~100Hz. I have never used the actual hardware, but my assumption is that the actual DZ hardware would be placing bytes into the silo as they arrived, asynchronously until the silo was full. I am interested to hear if my assumption is flawed.

I have a patch to simulate multiple bytes per port per poll - is there any interest in testing that out? It fixes the zmodem uploads for me.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions