5.0 KiB
MegaFlash Hardware FPU Support for PLASMA
Overview
This pull request adds hardware-accelerated floating-point support for PLASMA programs running on Apple IIc/IIc+ systems equipped with the MegaFlash storage device.
What is MegaFlash?
MegaFlash is an internal storage device for Apple IIc/IIc+ computers featuring:
- 128/256MB flash storage
- Raspberry Pi Pico W microcontroller
- Hardware-accelerated floating-point unit (FPU)
- Real-time clock, WiFi, and other features
The FPU acceleration uses the Pico's ARM Cortex-M0+ processor to perform IEEE 754 double-precision calculations, providing significant speedup over the 6502's software floating-point routines.
Changes in This PR
New Files
src/inc/megaflash.plh: Header file defining MegaFlash constants and I/O registerssrc/libsrc/fpu_mf.pla: Drop-in replacement FPU library with hardware accelerationsrc/libsrc/README_fpu_mf.md: Documentation for the MegaFlash FPU librarysrc/samplesrc/fptest_mf.pla: Test program demonstrating the library
API Compatibility
The fpu_mf.pla library maintains 100% API compatibility with the existing fpu.pla library. Users can switch between implementations by simply changing:
import fpu // Old: SANE software FPU
to:
import fpu_mf // New: MegaFlash hardware FPU
All function calls remain identical.
Technical Implementation
Format Conversion
The library handles automatic conversion between:
- SANE Extended Format (80-bit): Used by PLASMA for maximum precision
- MBF Format (40-bit Microsoft Binary Format): Used by MegaFlash for hardware calculations
Hardware Detection
On initialization (reset), the library:
- Attempts to detect MegaFlash hardware via ID register
- If found: Enables hardware acceleration for supported operations
- If not found: Falls back transparently to SANE software implementation
This ensures programs work on any Apple II system, whether or not MegaFlash is present.
Accelerated Operations
The library provides 31 hardware-accelerated functions out of 40 total SANE operations (78% coverage):
- Direct Hardware FPU (9 functions):
mul,div,sqrt,sin,cos,tan,atan,lnX,powEX - Via Mathematical Identities (22 functions):
neg,abs,log2X,log21X,ln1X,pow2X,pow21X,powE1X,powE21X,powXInt,powXY,asin,acos,sinh,cosh,tanh,sec,csc,cot,scalb,compXY,annuityXY
The remaining 9 operations (add, sub, rem, type, cmp, trunc, round, logb, randNum) use SANE fallback.
Performance
Expected speedups with hardware acceleration:
- Transcendental functions (sin, cos, tan, log, exp): 10-100x faster
- Multiplication/Division: 3-5x faster
- Operations using SANE fallback: Same performance as
fpu.pla
Usage Example
include "inc/cmdsys.plh"
import fpu_mf
import console
byte[80] result
// Initialize FPU
fpu_mf:reset
// Calculate sin(PI/2)
fpu_mf:constPi
fpu_mf:pushStr("2.0")
fpu_mf:div
fpu_mf:sin
// Print result
fpu_mf:pullStr(@result, 1, 6, FPSTR_FIXED)
puts(@result) // Prints: 1.000000
Testing
A comprehensive test program is provided in src/samplesrc/fptest_mf.pla that exercises:
- Basic arithmetic (mul, div, sqrt, squared)
- Trigonometric functions (sin, cos, tan, atan)
- Logarithmic/exponential (ln, exp)
- Constants (PI, E)
- Performance benchmark
Backwards Compatibility
This PR:
- Adds new optional functionality
- Does not modify any existing PLASMA code
- Does not break any existing programs
- Requires no changes to existing programs unless users opt-in
Hardware Requirements
To use hardware acceleration:
- Apple IIc or IIc+ computer
- MegaFlash storage device installed
- MegaFlash firmware v1.0 or later with FPU support enabled
Programs using fpu_mf will run on systems without MegaFlash (using SANE fallback).
Future Enhancements
Possible future improvements:
- Optimize format conversion routines
- Add direct MBF mode for programs that don't need full SANE precision
- Support for other slots (currently hardcoded to slot 4)
- Assembly optimization of hot paths
Documentation
Complete documentation is provided in:
src/libsrc/README_fpu_mf.md: Library documentation- Inline code comments: Implementation details
src/samplesrc/fptest_mf.pla: Working examples
Building
The library builds as part of the standard PLASMA build process:
cd PLASMA/src
make
License
This code follows the PLASMA project's existing license.
Credits
- MegaFlash hardware/firmware: Thomas Fok
- PLASMA language: David Schmenk
- MegaFlash FPU integration: Brendan Robert
Questions?
For questions about:
- MegaFlash hardware: See MegaFlash repository
- PLASMA integration: Open an issue in this repository
- Usage examples: See
fptest_mf.platest program