adjust video timing to be as close as possible to original VT52 when using VT52 font add bitmaps of fonts update readme.md update the python script that generates the font bit map to be more flexible
12 KiB
VT52 Terminal Core for MiSTer
by Fred Van Eijk
Overview
This core implements a VT52-compatible terminal emulator for the MiSTer FPGA platform. It provides a terminal interface with keyboard input and UART communication capabilities.
Features
- 80x24 character display
- Basic VT52 control sequences
- Hardware scrolling buffer (25 rows total)
- PS/2 keyboard interface
- UART communication (115200 baud, 8N1)
- Configurable text color (White, Red, Green, Blue)
- Multiple aspect ratio options
Setup
UART Connection - User I/O port
The UART interface is available through the User I/O port on the MiSTer:
- User port pin 1 (D-/TX): Connect to RX of your USB-to-Serial adapter
- User port pin 0 (D+/RX): Connect to TX of your USB-to-Serial adapter
- User port GND: Connect to GND of your USB-to-Serial adapter
Most USB-to-Serial adapters should work. Tested adapters include:
- FTDI FT232RL
- CH340
- CP2102
Note: Make sure your adapter supports 115200 baud and is configured for 8N1 operation.
USB/Serial cable: For more information see the Serial Port section of the Altair8800_MiSTer repository: https://github.com/MiSTer-devel/Altair8800_MiSTer
For UART/Serial with PuTTY
- Connect at 115200 baud, 8 bits, no parity to the COM port. Note this uses is the console port on the DE10-Nano
For SSH with PuTTY
- Connect to the ip address of your MiSTer fpga.
Linux command line to establish the connection to the core
-
Identify the UART device:
-
Usually mapped to
/dev/ttyS1or/dev/ttyUSB0 -
Use this command to help identify the correct device:
dmesg | grep tty
-
-
Access the serial terminal:
-
Use
screenorminicom -
Example command with
screen:screen /dev/ttyS1 115200 -
Replace
/dev/ttyS1with the correct device identifier -
Change 115200 to the appropriate baud rate if different
-
OSD Menu Options
Access the On-Screen Display (OSD) menu using the Menu button on your MiSTer setup.
Available options:
-
Aspect Ratio
- Original (4:3) (default)
- Full Screen
-
Text Color
- White (default)
- Red
- Green
- Blue
-
UART Selection
- User IO port (default)
- Console Port
-
Font Selection
- Terminus 8x16 (default)
- VT52 rom 8x8
Reset Options
- Soft Reset: Available through OSD menu
- Hard Reset: Use the MiSTer reset button or OSD reset option
Terminal Commands
Control Characters
Ctrl+HorBackspace: Move cursor leftTab: Move to next tab stop (every 8 columns)LF(Line Feed): Move cursor down one lineCR(Carriage Return): Move cursor to start of current line
Implemented VT52 Escape Sequences
All escape sequences start with the ESC character (0x1B):
ESC A: Cursor upESC B: Cursor downESC C: Cursor rightESC D: Cursor leftESC H: Cursor home (upper left corner)ESC I: Reverse line feedESC J: Erase screen from cursor and home cursorESC K: Erase to end of current lineESC Y row col: Direct cursor addressing- Row and column are sent as ASCII codes: space (0x20) + row/column number
- Example: To move to row 5, column 10:
ESC Y % *(% = 0x20 + 5, * = 0x20 + 10)
Display Characteristics
- Character Set: Standard ASCII (32-126)
- Cursor: Blinking block cursor
- Hardware scrolling using 25-row buffer (24 visible + 1 scroll buffer)
- Duplicate original video timing with VT52 font
Test Server
A Python test server script (vt52-test-server.py) is included to verify terminal functionality. The server supports both serial and telnet connections.
Requirements
pip install pyserial
Usage
Serial mode (default):
python vt52-test-server.py --port COM9 --baudrate 115200
Telnet mode:
python vt52-test-server.py --mode telnet --port 2323
Test Suite Components
The server tests the following implemented features:
-
Control Characters
- Backspace behavior
- Line Feed/Carriage Return
- Tab spacing (8-column stops)
-
Cursor Positioning
- Absolute positioning using ESC Y sequences
- Relative movement (up, down, left, right)
- Pattern drawing demonstration
-
Erase Functions
- Erase to end of line (ESC K)
- Erase screen (ESC J)
- Cursor positioning after erase
-
Scroll Behavior
- Forward scrolling using hardware scroll buffer
- Reverse scrolling with ESC I
- Line wrapping at screen boundaries
-
Box Drawing Demo
- Demonstrates cursor movement with visual pattern
- Tests cursor positioning accuracy
Note: The test suite includes proper timing delays to account for hardware scrolling operations.
Guess the Animal Game
A sample game application is included (vt52-guess-the-animal-game.py) that demonstrates interactive terminal usage. The game implements a word-guessing game similar to Hangman, specifically themed around animals.
Game Features
- Visual ASCII art display of game progress
- 15 different animals to guess
- 6 attempts allowed per round
- Hardware-synchronized screen updates
- Proper handling of terminal scroll operations
- Support for both serial and telnet connections
Game Display Layout
+---+
| | Title and game status at top
O |
/|\ | Word display in center
/ \ |
| Input prompts at bottom
=========
Usage
Serial mode (default):
python vt52-guess-the-animal-game.py --mode serial --port COM9 --baudrate 115200
Telnet mode:
python vt52-guess-the-animal-game.py --mode telnet --port 2323
Command Line Options
--mode : Connection mode (serial or telnet)
--port : Serial port or telnet port number
--baudrate : Serial baudrate (default: 115200)
--host : Telnet server host (default: 0.0.0.0)
VT52 Features Used
ESC H: Clear screen and home cursorESC J: Erase screenESC Y: Direct cursor addressing for UI elements- Character output with proper timing
- Hardware scroll consideration
Technical Implementation
- Synchronous screen updates accounting for VT52 timing
- Proper handling of hardware scroll operations
- Clean connection handling for both serial and telnet modes
- Error detection and graceful disconnection handling
- Configurable timing delays for hardware operations
Connection Handling
- Supports multiple simultaneous telnet clients
- Automatic connection cleanup on client disconnect
- Proper serial port release on program exit
- Error handling for connection loss during gameplay
Requirements
pip install pyserial
The game serves as both a practical example of terminal usage and a test tool for various VT52 features including cursor positioning, screen clearing, and character I/O timing considerations.
Command Line Options
--mode : Connection mode (serial or telnet)
--port : Serial port or telnet port number
--baudrate : Serial baudrate (default: 115200)
--host : Telnet server host (default: 0.0.0.0)
LED Status Indicator
The LED indicates various system states:
- Cursor blink
- UART errors (overrun, framing, parity)
- Keyboard activity
- PS/2 errors
- Scroll operation in progress
Known Limitations
- No graphics character set support
- No alternate keypad mode
- Fixed character set (ASCII 32-126)
- Fixed UART parameters
- Hardware scrolling operations require timing considerations
Error Handling
The terminal provides visual feedback through the LED for:
- UART overrun errors
- UART framing errors
- UART parity errors
- PS/2 keyboard frame errors
- Scroll buffer busy states
Technical Notes
- Core Clock: 29.4MHz
- Video output compatible with standard VGA/HDMI displays
- Full hardware implementation with no CPU requirements
- 25-row buffer implementation (24 visible + 1 scroll)
- Synchronous scroll operations with busy/done signaling [Previous sections remain unchanged until Technical Notes]
Technical Architecture
Core Components
- Terminal Control Modules
- VT52_terminal: Top-level module integrating all components
- Command Handler: Processes VT52 commands and screen operations
- 8251 like UART: Serial communication at 115200 baud, 8N1
- Display Modules
-
Character Buffer: 25-row display buffer with hardware scrolling
- 24 visible rows + 1 scroll buffer row
- Synchronous read/write operations
- Hardware-accelerated scroll operations
-
Character ROM: Font storage and rendering
- 4K x 8 ROM using Terminus Latin-1 Font 8x16
- 1K x 8 ROM using Original VT52 Font 8x8
- Synchronous font data access
-
Video Generator: Display timing and rendering
- VGA/HDMI signal generation
- Character and cursor rendering
- Blanking signal control
- Close to original VT52 timing
- Input Processing Modules
-
Input Multiplexer: Input stream arbitration
- Prioritizes keyboard input over UART
- Handshaked data transfer
- Source tracking (keyboard/UART)
-
Keyboard Controller: PS/2 keyboard interface
- Full PS/2 protocol implementation
- Keycode to ASCII conversion
- Modifier key handling (Shift, Control, Meta)
- Error detection and reporting
- Special key sequence processing
- Repeating key support on appropriate keys
-
Keymap ROM: Key translation tables
- 2KB ROM for keycode mapping
- Multiple keyboard planes (normal, shifted, caps)
- Extended keycode support
- Cursor Management
-
Cursor: Position and state tracking
- X/Y coordinate management
- Synchronous position updates
- Integration with command handler
-
Cursor Blinker: Visual cursor control
- ~1Hz blink rate using 6-bit counter
- vblank-synchronized timing
- Reset on cursor movement
- Support Modules
- Simple Register: Generic storage element
- Parameterized width
- Synchronous operation
- Reset support
Data Flow
Input Stage:
PS/2 Keyboard → Keyboard Controller →\
Input Multiplexer → Command Handler
UART RX ───────→ UART Controller ───/ ↑ ↓
↑ | Character Buffer
| | ↓
Keyboard Data ←── Command Handler ←── UART TX ───┘ Character ROM
↓
Video Generator
↓
VGA/HDMI Output
This diagram shows:
- Both keyboard and UART inputs being arbitrated by the Input Multiplexer
- Bidirectional UART communication (keyboard data is echoed to UART TX)
- Character ROM providing font data to the Video Generator
- Character Buffer storing the screen contents
- Command Handler coordinating all operations
- Video Generator producing the final display output
Key Features
- Synchronous Design
- Single 29.4 MHz clock domain
- Clean handshaking between modules
- Proper reset propagation
- Input Processing
- PS/2 protocol with error detection
- Priority-based input arbitration
- Special key sequence handling
- Full modifier key support
- Display System
- Hardware scroll buffer
- Efficient character rendering
- Smooth cursor management
- VGA/HDMI output generation
- Error Management
- PS/2 frame error detection
- UART error detection
- Input overflow prevention
- LED status indication
Debugging
If you encounter issues:
- Check the LED status for error conditions and scroll operations
- Verify UART connections and settings
- Ensure PS/2 keyboard is properly connected
- Allow sufficient time for scroll operations to complete
- Try resetting the core through the OSD menu
Future Enhancements
Planned features:
- Graphics character set support
- Alternate keypad mode
- Configurable UART parameters
- Extended character set support
- Save/restore terminal state