
회로 수준 PDP-11/34 에뮬레이터
ll/34은 PDP-11/34A(1976)의 회로 수준 에뮬레이터로, 실제 PDP-11/34A의 회로도, 마이크로코드, 로직 캡처로부터 역설계된 가상 CPU를 실행합니다.
원래는 신호 수준에서 문제 해결을 돕기 위해 실제 CPU의 디지털 복제품으로 설계되었습니다. 가상 KD11-EA CPU는 기본적으로 회로도를 C 언어로 변환하고 ROM 테이블을 참조하는 방식으로 구성됩니다. 모든 조합 ROM은 역설계되었으며, 클록 생성기는 정밀하게 모델링되었습니다.
회로 수준(ROM 진리표 + 조합 논리)은 게이트 수준(Verilog) 대신 선택되었는데, 이는 하드웨어 버그를 재현할 수 있을 만큼 낮은 수준이면서도 프로그램을 실행할 수 있을 만큼 빠르기 때문입니다.
모든 장치는 UNIBUS 백플레인(unibus.c)에 연결되어 있으며, 이 백플레인은 주소 디코딩, 타이밍 및 버스 사이클을 수행합니다.
내부적으로 CPU는 다음과 같은 구성 요소로 이루어져 있습니다:
| 파일 | 설명 |
|---|---|
ucode_rom.h | Bitsavers Verilog 및 덤프를 기반으로 한 512x48비트 마이크로코드 저장소(바이폴라 PROM). 각 마이크로워드는 하나의 마이크로사이클 동안 ALU, 스크래치패드, 버스 인터페이스 및 분기를 제어합니다. |
combo_roms.h | 조합 ROM(E51-E83, E107), IR 디코드(E59/E60/E63/E69/E70/E71/E74), ALU 기능 선택(E61/E82/E83), 트랩/서비스 우선순위(E52/E53), 조건 코드 로직(E68/E107) 등이 회로도와 로직 캡처로부터 재구성되었습니다. 오픈 컬렉터 ROM은 MPC 버스에 와이어-OR로 연결됩니다. |
kd11ea.c | 데이터패스 엔진. 사이클당 하나의 마이크로워드로 마이크로코드를 단계별로 실행합니다. 기본 74xx 게이트는 C 논리 연산자(!, &&, >> 등)를 사용하여 시뮬레이션됩니다. 74S181 비트 슬라이스 ALU가 완전히 모델링되었습니다(4개 슬라이스, 16비트). |
mmu.c | 메모리 관리. 커널/사용자 주소 공간, 18비트 재배치(3개의 74S283 가산기), 16개의 PAR/PDR 쌍, 프리즈 로직이 있는 SR0/SR2 중단 레지스터. |
clockgen.c | 클록 생성기. E106 지연 라인(TAP 30/90/120 피드백, TRAN INH 버스 대기)을 모델링합니다. 짧은 사이클: 180ns, 긴 사이클: 240ns, 버스 전송은 SSYN이 반환될 때까지 지연됩니다. |
clock.c | 실시간 속도 조절. 시뮬레이션 시간을 벽시계 시간과 동기화합니다. |
int.c | 인터럽트 중재자. BR4-BR7 우선순위 큐, UNIBUS 데이지 체인 부여 순서를 근사화합니다. |
PDP-11/34A의 전면 패널 스위치 및 표시기를 에뮬레이트합니다. CPU가 정지되어 있을 때(전원 켜짐, HALT 명령어 또는 Ctrl-P) 활성화됩니다.
버스 초기화, CPU 부팅, 코드 단일 스텝 실행, 임의 주소에 데이터 검사 및 저장, 에뮬레이터 종료가 가능합니다.
프론트엔드는 엔진과 분리되어 있으므로, 포토리얼리스틱 전면 패널 GUI도 WebAssembly로 제공됩니다.
디버그 콘솔은 마이크로코드 수준 및 명령어 수준 코드를 위한 대화형 디버거를 제공합니다:
s [n]: n개의 마이크로 명령어를 단일 스텝 실행하며 전체 상태 덤프(MPC, ALU, 버스, 레지스터)를 출력b addr: PC 브레이크포인트 설정(8진수), bl로 목록 보기, bd n으로 삭제g: 실행 재개u [addr] [n]: 명령어 디스어셈블c [addr] [n]: 메모리 덤프(8진수)mmu: MMU 상태 표시(커널 + 사용자 PAR/PDR, 현재 모드 표시)r: 레지스터 덤프ll-34 개발 중 문제 해결은 실제 하드웨어 문제 해결과 매우 유사한 것으로 드러나, 신호를 추적하고 데이터패스를 프로브하기 위해 내부 로직 분석기가 구현되었습니다. 이는 가상 CPU의 미묘한 ROM 및 타이밍 버그를 추적하는 데 결정적인 역할을 했습니다. 또한 실제 하드웨어 문제 해결을 위한 참고 자료로도 사용할 수 있으며, 마찬가지로 작동하는 하드웨어가 에뮬레이터 개발에 도움이 되었습니다.
로직 분석기는 주요 CPU 신호의 102개 지점을 프로브할 수 있으며, 물리적 칩 핀(DEC 회로도 K1-5 ~ K2-9에 해당하는 KD1:Exx:pin 표기법)에 매핑됩니다. 편의를 위해 논리적 별칭(MPC, ALU_OUT, IR, PSW 등)이 제공됩니다.
샘플 속도는 실시간 CPU 클록(5,555,556 Hz)이며 분해능은 샘플당 180ns입니다. 구성 가능한 분할기를 사용하여 더 긴 캡처 윈도우를 위해 샘플 속도를 낮출 수 있습니다.
캡처는 링 버퍼(최대 64K 샘플)를 사용하며, 모든 신호에 구성 가능한 트리거, 조정 가능한 트리거 위치(사전/사후 비율), 그리고 오프라인 분석을 위한 CSV 내보내기를 제공합니다.
로직 캡처는 프로젝트 전반에 걸쳐 제대로 이해되지 않은 멀티플렉싱 경로를 매핑하고 디버깅하는 데 널리 사용되었습니다.
ll-34에는 시도해 볼 수 있는 몇 가지 프로그램과 시스템이 포함되어 있습니다: Game of Life, V6 UNIX, 원래 Tetris 게임이 포함된 RT-11 V4, 그리고 ATTN/11(자기 주의를 갖춘 작은 학습 가능한 Transformer)입니다.
./ll-34 --rk ./wasm/demos/rtv4_rk.dsk
부트 ROM이 자동으로 RK11에서 로드되어 운영 체제를 시작합니다. DIR은 파일을 나열하고, HELP는 도움말을 출력하며, RUN TETRIS는 Tetris 데모를 시작합니다($TERM이 잘못되었을 가능성이 있지만). RUN ADVENT는 실제 PDP-11/34에서 제작된 Colossal Cave Adventure를 시작합니다.
./ll-34 --rk ./wasm/demos/v6bin.rk
부트로더가 최소한의 @ 프롬프트를 출력합니다. rkunix를 입력하고 Enter를 누르면 몇 초 후에 login: 프롬프트가 나타납니다. 사용자 이름 root를 입력하고 비밀번호 없이 로그인하면 됩니다! 한 가지 참고 사항은 cd가 초기 유닉스에서는 chdir로 명명되었다는 것입니다.
make + C11 컴파일러만 있으면 되며, 다른 의존성은 없습니다.
Linux(x86_64 및 aarch64)에서 musl과 glibc 모두, macOS aarch64, NetBSD 10 aarch64에서 경고 없이 컴파일되는 것이 확인되었습니다.
CLI 외에도 사진과 같은 GUI를 갖춘 독립형 WebAssembly 버전이 다음에서 제공됩니다: https://dbrll.github.io/ll-34
참고: ll-34는 리소스 집약적인 에뮬레이터입니다. 명령어 수준 에뮬레이터와 달리, 마이크로코드를 한 사이클씩 단계별로 실행하고 각 단계에서 ALU, 조합 ROM, 스크래치패드, 클록 생성기 및 버스 타이밍을 실행합니다. 호스트는 사이클 정확도를 유지하기 위해 5.5MHz 클록 생성기 속도를 지속적으로 유지해야 합니다.
시작 시 에뮬레이터는 자체 벤치마크를 수행하고 실제 KD11-EA 대비 속도를 보고합니다. 비율이 1x 미만이면 호스트가 따라잡을 수 없으며 타이밍 정확도가 보장되지 않습니다. WebAssembly 버전에서는 브라우저 타이머 분해능으로 인해 벤치마크를 사용할 수 없습니다. WASM 빌드는 네이티브보다 느리므로 스마트폰에서 실행하는 것은 일반적으로 너무 느립니다.