Was es ist
Der Math-Coprozessor verwandelt die Hardware-DSP-Blöcke des FPGA in eine Peripherie, die die CPU mit wenigen Store/Load-Befehlen ansteuert. Der 6502 hat keinen Multiplikationsbefehl — in Software kostet ein Festkomma-Produkt rund 250 Zyklen. Eine vorzeichenbehaftete Multiplikation bildet hier auf einen einzigen Hardware-DSP ab und ist in einem Takt fertig.
Was es macht
Die Einheit multipliziert kontinuierlich, was in den Operanden-Registern A und B liegt,
und liefert sowohl das volle 64-Bit-Produkt als auch ein arithmetisch nach rechts
geschobenes Ergebnis. Der Shift ist über ein Register wählbar (0…63), sodass dasselbe
Werkzeug jedes Q-Format bedient — SHIFT = 24 ergibt 8.24,
SHIFT = 12 ergibt 4.12.
Warum das wichtig ist
| Software (4.12) | Coprozessor (8.24) | |
|---|---|---|
| Pro Multiplikation | ~250 Zyklen | ~12–20 Zyklen |
| Vorzeichen | manuell in 6502 | in Hardware |
| Normalisierung | 4× lsr/ror-Kette | gratis (Hardware) |
| Genauigkeit | 12 Nachkommabits | 24 Nachkommabits |
| Mandelbrot 320×200 | ~5–8 min | ~10 s |
Register ($88B0)
| Adresse | Schreiben | Lesen |
|---|---|---|
| $88B0–$88B3 | Operand A (4 Byte, LE) | rohes Produkt, Byte 0–3 |
| $88B4–$88B7 | Operand B (4 Byte, LE) | rohes Produkt, Byte 4–7 |
| $88B8–$88BB | — | Ergebnis (A·B) >> SHIFT (4 Byte) |
| $88BC | SHIFT (0…63) | SHIFT |
Alle Werte sind little-endian — passend dazu, wie der 6502 Mehrbyte-Wörter ablegt. Es gibt kein „Start"-Strobe: Das Ergebnis folgt den Operanden zwei Takte später, und weil der 6502 ohnehin mehrere Zyklen bis zum nächsten Lesezugriff braucht, sind keine Wait-States nötig.
Verwendung vom 6502
MUL = $88B0 MUL_A = MUL+0 ; Operand A (4 Byte) MUL_B = MUL+4 ; Operand B (4 Byte) MUL_RES = MUL+8 ; Ergebnis (4 Byte) lda #24 ; einmalig: 8.24 wählen sta MUL+12 ; A schreiben, B schreiben, Ergebnis lesen ...
Der Selbsttest copro_selftest.s rechnet 2.0 × 3.0,
prüft auf $06000000 und färbt den Bildschirm bei Erfolg grün, sonst rot.