Unified the 400x state machine for address latching

Fixed timing issues
This commit is contained in:
Jan-Peter von Hunnius 2025-11-14 18:51:10 +01:00
parent e17d6ad177
commit 633463e370
26 changed files with 11904 additions and 2471 deletions

View file

@ -18,31 +18,35 @@ provides:
### System Components
The emulator implements the complete Intel MCS-4 system:
The emulator implements the complete Intel MCS-4 system using a unified state machine architecture:
```
Intel 4004 CPU (4-bit microprocessor)
├── 16 × 4-bit register file
├── ALU with carry/borrow logic
├── Program counter and stack
└── Two-phase clock interface
├── Two-phase clock interface
└── Unified state machine (FetchInstruction, ExecuteInstruction states)
Intel 4001 ROM (256 bytes with I/O)
├── Mask-programmable ROM storage
├── 4-bit I/O port interface
├── Two-phase addressing
└── 500ns typical access time
├── 500ns typical access time
└── Unified state machine (Idle, AddressPhase, WaitLatency, DriveData states)
Intel 4002 RAM (320 bits with output)
├── 80 × 4-bit character storage
├── 4-bit output port
├── Refresh circuitry
└── Banked memory organization
├── Banked memory organization
└── Unified state machine (Idle, AddressPhase, WaitLatency, ReadData, WriteData, OutputPort states)
Intel 4003 Shift Register (10-bit serial I/O)
├── 10-bit static shift register
├── Serial input/output
└── 200ns access time
├── 200ns access time
└── Unified state machine (Idle, ShiftData, LoadData states)
```
### Key Features
@ -55,6 +59,64 @@ Intel 4003 Shift Register (10-bit serial I/O)
- **Graphical User Interface**: Modern desktop application with real-time monitoring
- **Interactive Console**: Terminal-based interface with live system monitoring
## Unified Intel 400x State Machine
The emulator implements a generalized state machine architecture for all Intel 400x series components, replacing individual chip state machines with a unified framework. This approach provides consistency, maintainability, and extensibility across all supported components.
### Architecture Overview
The unified state machine is built around several key components:
- **Intel400xComponentType**: Enumeration identifying specific Intel 400x chip type (4001 ROM, 4002 RAM, 4003 I/O Port, 4004 CPU)
- **Intel400xUnifiedState**: Comprehensive state enumeration covering all possible states for any Intel 400x component
- **Intel400xEvent**: Event system that triggers state transitions (clock edges, control signals, etc.)
- **Intel400xStateMachine**: Core state machine engine handling transitions and timing
- **Intel400xComponentBehavior**: Trait defining component-specific behavior while using the common framework
### Supported Components
The unified state machine supports all major Intel 400x components:
#### Intel 4001 ROM (256 bytes with I/O)
- **States**: Idle, AddressPhase, WaitLatency, DriveData
- **Functionality**: Mask-programmable ROM storage with 4-bit I/O port interface
- **Access Time**: 500ns typical access time
- **Special Features**: Two-phase addressing, I/O port operations
#### Intel 4002 RAM (320 bits with output)
- **States**: Idle, AddressPhase, WaitLatency, ReadData, WriteData, OutputPort
- **Functionality**: 80 × 4-bit character storage with 4-bit output port
- **Access Time**: 500ns typical access time
- **Special Features**: Banked memory organization, refresh circuitry, status output
#### Intel 4003 Shift Register (10-bit serial I/O)
- **States**: Idle, ShiftData, LoadData
- **Functionality**: 10-bit static shift register for I/O expansion
- **Access Time**: 200ns access time (faster than memory components)
- **Special Features**: Ignores address transmission, operates in shift mode only
### Benefits of the Unified Approach
1. **Code Reuse**: Common state transition logic is shared across all components, reducing duplication
2. **Consistency**: All components follow the same timing patterns and state conventions
3. **Maintainability**: Changes to common behavior only need to be made in one place
4. **Extensibility**: New chip types can be added by implementing the Intel400xComponentBehavior trait
5. **Testability**: The state machine can be tested independently of specific components
6. **Type Safety**: Rust's type system ensures correct state transitions and prevents invalid states
### Implementation Details
The unified state machine handles the 4-bit multiplexed address/data bus used by the Intel 400x series:
1. **Address Phase**: Components receive address information in two 4-bit phases (high nibble first, then low nibble)
2. **Latency Wait**: After address latching, components wait for the required access time
3. **Data Transfer**: Components either drive data onto the bus (read) or accept data (write)
4. **Return to Idle**: Operations complete and components return to the idle state
Each component implements the `Intel400xComponentBehavior` trait to provide its specific functionality while using the common state machine framework. This approach maintains the unique characteristics of each chip while ensuring consistent behavior across the system.
For more detailed information about the unified state machine implementation, see the documentation in [`src/components/common/intel_400x.rs`](src/components/common/intel_400x.rs).
## Project Structure
```
@ -144,9 +206,9 @@ cargo add egui eframe rfd
```rust
use rusty_emu::components::memory::intel_4001::Intel4001;
use rusty_emu::components::common::intel_400x::TimingState;
use rusty_emu::components::common::intel_400x::{Intel400xComponentBehavior, Intel400xUnifiedState};
// Create a ROM component
// Create a ROM component with unified state machine
let mut rom = Intel4001::new("ROM1".to_string());
// Load program data
@ -155,6 +217,9 @@ rom.load_rom_data(program, 0) ?;
// Use in simulation
rom.update(); // Process one clock cycle
// Components now use unified state machine internally
// States: Idle -> AddressPhase -> WaitLatency -> DriveData -> Idle
```
### JSON Configuration System
@ -466,7 +531,17 @@ The test suite demonstrates:
- ✅ **Pin-Level Connection Management**: Automatic wiring of component interconnections
- ✅ **Runtime System Selection**: Support for multiple system configurations
### 2. Testability Demonstration
### 2. Unified State Machine Architecture
**Groundbreaking Component Framework:**
- ✅ **Generalized State Machine**: Single framework for all Intel 400x components
- ✅ **Intel400xComponentBehavior Trait**: Component-specific logic with common infrastructure
- ✅ **Event-Driven Design**: Clean separation of state transitions and component behavior
- ✅ **Type-Safe Implementation**: Rust's type system ensures correct state transitions
- ✅ **Code Deduplication**: Eliminated duplicate state machine implementations
### 3. Testability Demonstration
**Answer to Original Question: CONFIRMED**
@ -476,7 +551,7 @@ The test suite demonstrates:
- ✅ **Deterministic behavior**: State machines have predictable outcomes
- ✅ **Integration testing**: Real components work correctly with common traits
### 3. Comprehensive Test Suite
### 4. Comprehensive Test Suite
- **416+ lines** of comprehensive test code
- **Multiple testing strategies**: Unit, mock-based, property-based, integration
@ -484,7 +559,7 @@ The test suite demonstrates:
- **Working examples**: Demonstrates practical usage patterns
- **System-level testing**: End-to-end verification of complete systems
### 4. Clean Architecture
### 5. Clean Architecture
- **Trait-based design**: Enables code reuse and testing
- **Separation of concerns**: Clear boundaries between components
@ -501,6 +576,7 @@ The test suite demonstrates:
- Intel 4004 CPU structure and instruction framework
- Intel 4002 RAM implementation with refresh circuitry
- Intel 4003 Shift Register implementation
- **Unified state machine architecture for all Intel 400x components**
- JSON-based system configuration architecture
- Comprehensive test suite (416+ lines of tests)
- Documentation system