Close
0%
0%

PicoRAM Ultimate Rev. 2

SRAM Emulator and SD Card Interface for Vintage Single Board Computers (such as the Heathkit ET-3400, Lab-Volt 6502, and Microprofessor)

Similar projects worth following
PicoRAM Ultimate Rev. 2 is the ultimate storage solution for single board computers (SBCs) / CPU trainers from the 70s and 80s. It emulates: - up to 4 2112 SRAM chips: it replaces the 512 bytes of stock SRAM in the Heathkit ET-3400; alternatively, - a 2 or 4 KB memory expansion for the Heathkit ET-3400(A) (with expansion header installed), - a single 6116 2 KB SRAM (e.g., for the Multitech Microprofessor MPF-1 / 1B / 1P), - up to 4 2114 SRAM chips (e.g., for the Lab-Volt 6502 and Philips MasterLab MC6400 CPU trainers, or the the 2 2114 SRAM chips in the Heathkit ET-3400A), - ROM emulation. Using the built-in SD card interface, PicoRAM Ultimate allows you to save and load full memory dumps (including programs and data) to and from SD card, hence, rendering the cassette interfaces of these SBCs obsolete (if they even came with one; i.e., the ET-3400 required an extra memory expansion + IO box for the cassette interface, and the Lab-Volt 6502 does not come with one either)

A Raspberry Pi Pico (RP2040)-based (S)RAM / ROM Emulator, and SD Card Interface for vintage Single Board Computers (SBCs) - Revision 2.

About


PicoRAM Ultimate Rev. 2 replaces some (or all) of the (S)RAM or ROM chips of these systems and emulates them in software with a Raspberry Pi Pico (RP2040) microcontroller, slightly overclocked at 250 MHz. PicoRAM is equipped with an SD card to store and load whole memory dumps to and from SD card. These memory dump .RAM files are similar to Intel HEX ASCII format and can be edited easily by hand on the PC or Mac; the utilized FAT file system facilitates data / file exchange.

PicoRAM Heathkit

Currently supported SBCs / host machines are:

  • Stock Heathkit ET-3400: MC6800 CPU, either 2x 2112 (256 Bytes) or 4x 2112 (512 Bytes)
  • Stock Heathkit ET-3400A: MC6808 CPU, 2x 2114 (512 Bytes only!)
  • Heathkit ET-3400 memory expansion mode: MC6800 CPU, 4 KBs via expansion header and additional GAL16V8 address decoder
  • Heathkit ET-3400A memory expansion mode: MC6808 (or MC6802) CPU, 4 KBs via expansion header and additional GAL16V8 address decoder
  • Multitech Microprofessor MPF-1, MPF-1B and MPF-1P: Z80 CPU, 1x 6116, 2 KBs
  • Lab-Volt 6502: 6502 CPU, 2x 2114, 1 KB
  • Philips MC6400 MasterLab: INS8070 SC/MP III CPU, 2x 2114, 1 KB
  • Heathkit ET-3400 & ET-3400A ROM emulation: either 2 or 4 KBs of emulated ROM, and it is possible to replace the monitor (EP|P)ROM (i.e., with your custom ROM monitor program).

The development logs are on Hackaday.

This project is a follow-up to PicoRAM 2090 for the Busch Microtronic Computer SystemPicoRAM 6116 for the Microprofessor MPF-1, and PicoRAM Ultimate Rev. 1. PicoRAM Rev. 1 users, please refer to the Rev. 1 documentation.

In the following, PicoRAM Ultimate refers to the hardware Rev. 2. Please note that this repository contains files for both revisions (rev1rev2). The current firmware Version 2 works with both hardware Rev. 1 and Rev. 2; however, the 4 KB configurations (machine settings) are only supported with Rev. 2 hardware. Some pictures still show the old Rev. 1 - note that the Rev. 1 vs. Rev. 2 differences only matter with regard to the Heathkit ET-3400 machines (and only if PicoRAM is used over the extension header).

Video


This YouTube video (of the Rev. 1 board) shows most currently suported machines (with the exception of the MPF-1P):

YouTube Video

Here is a YouTube Video of the Rev. 2 board, showing both the Heathkit ET-3400 and the ET-3400A.

YouTube Video Rev. 2

Latest News


February 2026


Firmware version 2.1 adds some experimental IO capabilities to PicoRAM for the ET-3400 (not A currently); namely, text and graphics commands.

To use this experimental mode, the 0x1000 to 0x1fff address decoder is required, and the 4x 2112 SRAM chips for 512 Bytes of SRAM memory are retained. In this mode, PicoRAM acts as a ROM emulator for now, so writes to the memory from 0x1000 to 0x1fff are protected, with the exception of address 0x1800 (for now) which acts as a "one byte serial" communication channel from the ET-3400 to PicoRAM for driving the text and graphics display (i.e., for sending IO commands). There are a number of demo programs in this folder. that demonstrate how to utilize the provided text and graphics commands. Note that the machine identifier is 3400IO for this mode; also see the supplied ULTIMATE.INI and the three demo programs which are supplied in .A68 assembly format. Large portions were written by CoPilot, especially for the visual / graphical Towers of Hanoi program HANOIG.RAM.

It should be noted that this mode is still experimental and not fully stable yet; but have a look at this, this, and this YT video to get an impression. Overall, it already works pretty well. In particular, it is necessary to not send IO bytes to address 0x1800 too fast; processing speed also...

Read more »

picoram_ultimate.uf2

PicoRAM Ultimate Firmware Version 1.2

uf2 - 152.50 kB - 06/22/2025 at 19:49

Download

et3400_decoder_16v8_gal.jed

GAL 16V8 JED File

jed - 618.00 bytes - 06/22/2025 at 19:49

Download

  • Blue PCBs look splendid!

    Michael Wessel02/21/2026 at 19:22 0 comments

    Assembled one of the blue PCBs by now - I really love the look of it! 

  • Thanks to Gareth Halfacree for posting about PicoRAM on Hackster.io!

    Michael Wessel02/18/2026 at 06:18 0 comments
  • Claude Sonnet 4.5 Coded the Appleman Fractal

    Michael Wessel02/17/2026 at 05:25 0 comments


    ... well, it wasn't easy and required a lot of stubbornness and perseverance on my side. Several of Sonnet's high-level "thinking" errors / road blocks needed to be overcome first. But once I pointed out that it needed to use SIGNED multiplication for the main iteration loop, and UNSIGNED multiplication for the coordinate transformations, everything finally fell into place. From the basic B&W Appleman it then created this dithered / shaded version - flawless in one attempt, no errors. Now, there certainly isn't that much MC-6800 assembly code out there in the training data... after all, this CPU is from 1974 (!), and my ET-3400 from 1977. I just entered first grade in 1977. Also, the situation is not comparable to Python at all, and testing is entirely manual. It had to rely on textual input from me, the "human interface", operating the ET-3400. It hence had to create test cases, ask me for test case results, re-iterate for fixing bugs, etc. I am impressed that it was able to do that. It certainly needs strong supervision for use cases such as this. But I can easily see that this could work fully autonomously with a bunch of agents (one agent playing the role of me, the supervisor and high-level guidance giving agent, one testing agent, etc.) and proper tool access. A storm is coming! I believe the days of stochastic parroting and regurgitating are finally over, and that these models are becoming increasingly useful for non-trivial, real-world programming tasks. Note that assembly is REALLY HARD. You need to understand every instruction down to the level of INDIVIDUAL BITS, AND know all the side effects. Reasoning over states and side effects is notoriously difficult, yet Sonnet succeeded. Wow.

  • More Vibe Coding - Sierpinski Triangle

    Michael Wessel02/13/2026 at 06:59 0 comments

    ... as always, it took a bit of trial & error, and Copilot didn't get it right until I supplied the following hint: 

    Hence, previous attempts looked like this:

    ;
    ; Largely written by Copilot, with some help by Michael Wessel
    ; 2/12/2026 (i.e., to get the display "shearing" right - it was stuck there)
    ;
    
    ; =========================================================
    ; Firmware ROM Routines (ET‑3400 Monitor)
    ; =========================================================
    
    RESET       = $FC00
    INCH        = $FDF4
    ENCODE      = $FDBB
    OUTCH       = $FE3A
    OUTHEX      = $FE28
    OUTBYT      = $FE20
    OUTST1      = $FE50
    OUTST0      = $FD8D
    DSPLAY      = $FD7B
    REDIS       = $FCBC
    
    
    ; =========================================================
    ; ET‑3400 + 128×32 OLED
    ; Sierpinski fractal using logical coordinates (LX, LY)
    ; Display shear applied only during plotting:
    ;
    ;     ScreenX = LX + (LY >> 1)
    ;     ScreenY = LY
    ;
    ; This preserves the pure Sierpinski logic (LX & LY == 0)
    ; while visually tilting the triangle on the OLED.
    ;
    ; Variables at $0100, code at $1000
    ; =========================================================
    
                ORG   $0100
    
    ; -----------------------------
    ; Logical fractal coordinates
    ; -----------------------------
    LX:         RMB   1      ; logical X coordinate
    LY:         RMB   1      ; logical Y coordinate
    
    ; -----------------------------
    ; Screen coordinates (after shear)
    ; -----------------------------
    SX:         RMB   1      ; screen X = LX + (LY >> 1)
    SY:         RMB   1      ; screen Y = LY
    
    COL:        RMB   1      ; pixel color (0xFF = on)
    
    
    ; -----------------------------
    ; Temporary scratch
    ; -----------------------------
    T1:         RMB   1      ; holds LY >> 1
    
    
    ; =========================================================
    ; CODE SECTION
    ; =========================================================
                ORG   $1000
    
    
    ; ---------------------------------------------------------
    ; MAIN — Sierpinski in logical space, sheared only in plotting
    ; ---------------------------------------------------------
    MAIN:
                JSR   CLEARSCREEN
                JSR   INCH
    
                CLR   LY          ; start at logical Y = 0
    
    Y_LOOP:
                CLR   LX          ; start each row at logical X = 0
    
    X_LOOP:
    ; ---------------------------------------------------------
    ; Sierpinski test in logical space:
    ;     (LX & LY) == 0  → pixel is part of the fractal
    ; ---------------------------------------------------------
                LDAA  LX
                ANDA  LY
                BNE   SKIP_PLOT   ; if nonzero → skip pixel
    
    ; ---------------------------------------------------------
    ; Compute screen coordinates:
    ;
    ;   SX = LX + (LY >> 1)
    ;   SY = LY
    ;
    ; This applies a gentle shear to the right, visually
    ; turning the square-grid Sierpinski into a triangular one.
    ; ---------------------------------------------------------
                LDAA  LY
                LSRA               ; LY >> 1
                STAA  T1           ; T1 = LY/2
    
                LDAA  LX
                ADDA  T1           ; SX = LX + (LY/2)
                STAA  SX
    
                LDAA  LY
                STAA  SY           ; SY = LY
    
    ; ---------------------------------------------------------
    ; Plot pixel at (SX, SY)
    ; ---------------------------------------------------------
                LDAA  #$FF
                STAA  COL
                JSR   PLOTNU       ; your non-updating plot routine
    
    SKIP_PLOT:
    ; ---------------------------------------------------------
    ; Advance logical X
    ; ---------------------------------------------------------
                INC   LX
                LDAA  LX
                CMPA  #128
                BCS   X_LOOP       ; continue while LX < 128
    
    ; ---------------------------------------------------------
    ; Advance logical Y
    ; ---------------------------------------------------------
                INC   LY
                LDAA  LY
                CMPA  #32
                BCS   CONT         ; continue while LY < 32
    
    ; ---------------------------------------------------------
    ; Finished — start over after keypress
    ; ---------------------------------------------------------
    DONE:
                JSR INCH
    	    JSR MAIN
    
    ; ---------------------------------------------------------
    ; End-of-row housekeeping
    ; ---------------------------------------------------------
    CONT:
                JSR   PLOT         ; your update/refresh routine
                BCS   Y_LOOP       ; branch always (BCS always true after JSR)
    
    
    ; ---------------------------------------------------------
    ; CLEARSCREEN
    ; ---------------------------------------------------------
    CLEARSCREEN:
            PSHA
            LDAA  #$00
            JSR   EXEC
            PULA
            
            JSR LDELAY
            JSR LDELAY 
            
            RTS
    
    
    ;...
    Read more »

  • Milestone Reached -Visual Towers of Hanoi!

    Michael Wessel02/09/2026 at 02:28 0 comments

    Thanks to CoPilot, who wrote 80% of the code, a piece of non-trivial MC-6800 no longer takes hours to code, but can be implemented in 2 hours on a Sunday morning before breakfast: 

  • Towers of Hanoi with Scrolling Text Display

    Michael Wessel02/08/2026 at 02:59 0 comments

    ... stay tuned for the graphical version soon... 

  • Graphics on the ET-3400!

    Michael Wessel02/07/2026 at 17:16 0 comments

    ... making progress. Hoping to have Mandebrot Fractals soon, but will need to find MC6800 floating point routines. Anybody has some handy? Please contact me!

  • The new PCBs are in!

    Michael Wessel02/04/2026 at 14:32 0 comments

    Aren't they beautiful? I think the blue is a good match! 


  • PicoRAM Ultimate Rev. 2 + Firmware Version 2 online!

    Michael Wessel01/28/2026 at 14:39 0 comments

    Revision 2 and version 2 firmware online: 

    https://github.com/lambdamikel/picoram-ultimate 

    Demo video: 

    4 KB ROM emulation:

    4 KB RAM emulation:

  • PicoRAM Ultimate Revison 2

    Michael Wessel01/24/2026 at 16:41 0 comments

    Revision 2 that fixes the /RE pin header layout flaw is working: 

    Also, I extended the RAM emulation to 4 KBs (!) - shown with a decoder config from 0x0000 to 0x0fff here. 

    When I built it I also encountered an issue with 74LS373 chips - turns out not all TTL LS latches were created equally... some troubleshooting advice for PicoRAM builders is in this video: 

View all 37 project logs

Enjoy this project?

Share

Discussions

dmilholen wrote 06/24/2025 at 13:20 point

My issue is time I dont have.. I still have a day job. This is still my passion though and love to work in my shop every chance I get. I have a really awesome project I am working on involving both arduino atmega 2560 and the NUCLEO-H723ZG for an In Circuit Tester for 8 bit  arcade pcbs to help diagnose and repair more quickly.  It has been in my list of to-do for a very long time but each time I get started on it  some better technology comes along to make it better and add more features. 

  Are you sure? yes | no

dmilholen wrote 06/18/2025 at 19:04 point

Jetzt sprichst du meine Sprache!

I love these old 8bit microprocessors and all the modern integration that can be done. I have been working with electronics and computers since 1980. I have degrees in industrial automation and tons of certs for telecom and networking but this is one of my favorite hobbies working in the shop repairing 80's arcade PCBs watching them come to life. I learned how to write machine code on the ET3400 back in the 90's :) I joined this just to be able to post and let you know how impressive you did on this project. When I get the time I want to build this and give it a try on my trainer. I also want to expand on this further using arduino and nucleo products. 

Dave

  Are you sure? yes | no

Michael Wessel wrote 06/19/2025 at 01:25 point

Thanks Dave, that means a lot to me from someone like you who worked in the field since its infancy! Happy to collaborate on any further developments on that  - let me know how it goes when you get to it. Until then, cheers, Michael 

  Are you sure? yes | no

Similar Projects

Does this project spark your interest?

Become a member to follow this project and never miss any updates