PROJEKT OS JX-3P - Neues Betriebssystem für den Roland JX-3P Synthesizer
Jeder, der ihn besitzt, weiss dass der JX-3P ein sehr leistungsfähiger (soll heissen: extrem gut klingender) Synthesizer ist. Die MIDI-Implementierung des Synths hingegen kommt aus der Steinzeit: Note On / Off, Bend, Hold On / Off, Program Change. Das wars auch schon. Mein Ziel ist es, dem JX-3P eine neue MIDI-Implementierung zu verpassen, die alle Controller-Daten senden und empfangen kann, Soundbänke via SysEx laden und speichern kann, usw.
Ein paar Informationen, die ich aus Schaltplänen und dem Sourcecode des JX-3P herausgezogen habe:
STBBUS
Der Steuerbus I/O STBBUS wird aus den Adressleitungen A9..A12 durch einen 74LS42 (1 aus 10 Dekoder) generiert.
A12 | A11 | A10 | A9 | |
0 | 0 | 0 | 0 | Y0 = /WR (Prog. Divider Master Osc. ??) |
0 | 0 | 0 | 1 | Y1 = 0 (Progr. Counter IC50) |
0 | 0 | 1 | 0 | Y2 = 0 (Progr. Counter IC49) |
0 | 0 | 1 | 1 | Y3 = 0 (Progr. Counter IC48) |
0 | 1 | 0 | 0 | Y4 = 0 (Progr. Counter IC47) |
0 | 1 | 0 | 1 | Y5 = /WR (DAC) |
0 | 1 | 1 | 0 | Y6 = /RD (Keyboard/Switches) |
0 | 1 | 1 | 1 | Y7 = /WR (LED-Matrix) |
1 | 0 | 0 | 0 | Y8 = /WR (SW-Interface) |
Sonst Y0..Y8=1
DAC
Der DAC hat eine Genauigkeit von 12 Bit. Um diese Genauigkeit zu erreichen und trotzdem pro Wertübertragung nur einen 8-Bit-Schreibzyklus zu benötigen, wurde der Wandler wie folgt realisiert:
Ansteuerung über Y5W (MKS-30 Schaltplan), im JX-3P Schaltplan nicht eindeutig erkennbar.
12 Bits: D0-D7, A4-A7, D7 MSB, A4 LSB
Memory Mapping
Vom EPROM abgesehen, das über /PSEN in den Adressraum eingeblendet wird, sieht die Belegung des Adressraums folgendermaßen aus:
$From | $To | SELECT | $0000 | $01FF | Y0 = /WR |
$0200 | $03FF | Y1 = 0 (Programmable Counter IC50) |
$0400 | $05FF | Y2 = 0 (Programmable Counter IC49) |
$0600 | $07FF | Y3 = 0 (Programmable Counter IC48) |
$0800 | $09FF | Y4 = 0 (Programmable Counter IC47) |
$0A00 | $0BFF | Y5 = /WR |
$0C00 | $0DFF | Y6 = /RD (Keyboard/Switch-Matrix-Abfrage) A3=0 -> A0..A2 = Keyboard-Row, D0..D7 = Keyboard-Col A3=1 -> A0..A2 = Panelswitches-Row, D0..D7 = Panelswitches-Col |
$0E00 | $0FFF | Y7 = /WR (LED-Matrix) |
$1000 | $11FF | Y8 = /WR |
$1800 | $18FF | unprotected RAM |
$1900 | $27FF | protected RAM (abhängig von /PROTECT) |
LED-Matrix, Aufbau und Ansteuerung
A12..A0 | $Address | Led-Spalte |
0111X1110XXXX | $0EE0 | LED-Spalte 0 (LEDSCN0) |
0111X1101XXXX | $0ED0 | LED-Spalte 1 (LEDSCN1) |
0111X1011XXXX | $0EB0 | LED-Spalte 2 (LEDSCN2) |
0111X0111XXXX | $0E70 | LED-Spalte 3 (LEDSCN3) |
LEDSC0 ($0EE0) | LEDSC1 ($0ED0) | LEDSC2 ($0EB0) | LEDSC3 ($0E70) | |
D7 | 8 | 16 | D | CMT |
D6 | 7 | 15 | C | R/S SEQ |
D5 | 6 | 14 | B | REST |
D4 | 5 | 13 | A | TIE |
D3 | 4 | 12 | KEYT | WR SEQ |
D2 | 3 | 11 | HOLD | WR EDIT |
D1 | 2 | 10 | MUTE | GROUP B |
D0 | 1 | 9 | CHORUS | GROUP A |
Switch Matrix (Panel), Aufbau und Abfrage
A12..A0 | $Address | Switch-Spalte |
0110XXXXX1000 | $0C08 | Switch-Spalte 0 (SWSCN0) |
0110XXXXX1001 | $0C09 | Switch-Spalte 1 (SWSCN1) |
0110XXXXX1010 | $0C0A | Switch-Spalte 2 (SWSCN2) |
0110XXXXX1011 | $0C0B | Switch-Spalte 3 (SWSCN3) |
0110XXXXX1100 | $0C0C | Switch-Spalte 4 (SWSCN4) |
SWSCN0 ($0C08) | SWSCN1 ($0C09) | SWSCN2 ($0C0A) | SWSCN3 ($0C0B) | SWSCN4 ($0C0C) | |
D7 | 8 | 16 | D | CMT | |
D6 | 7 | 15 | C | R/S SEQ | |
D5 | 6 | 14 | B | REST | LFO TRIG |
D4 | 5 | 13 | A | TIE | RX MODE |
D3 | 4 | 12 | KEYT | WR SEQ | HOLD PDL |
D2 | 3 | 11 | HOLD | WR EDIT | BEND POL |
D1 | 2 | 10 | MUTE | GROUP B | BEND RNG W |
D0 | 1 | 9 | CHORUS | GROUP A | BEND RNG M |
Eine gedrückte Taste liefert eine Null auf der entspr. Datenleitung.
Da der ADC nur eine positive Spannung wandeln kann, liefert der Pitch-Bend-Hebel in beide Richtungen 0 .. Max. Die Richtung, in die der Hebel gedrückt wird, wird über BEND POL signalisiert. (BEND POL gedrückt = positive Richtung)
BEND RNG W = Bender Range Wide, wenn gedrückt dann weiter Stellbereich.
BEND RNG M = Bender Range Mid, wenn gedrückt, dann mittlerer Stellbereich.
wenn beide nicht gedrückt, dann kleiner Stellbereich.
Program-Memory
Das EPROM (2764, 8Kx8) wird über A0-A12 angesteuert, /OE wird vom 8031 über die Leitung /PSEN geliefert. Diese Leitung ist auf Low, wenn externer Programmspeicher angesteuert wird. Daher dürfte eine Erweiterung des EPROM auf 27128 (16KB) oder 27256 (32KB) kein Problem sein (A13 bzw. A14 mitbenutzen).
CMT-Interface
Kassetten-Speicher-Interface
Write-To-Tape Leitung P1.7 (Pin 8, 8031)
Read-From-Tape Leitung T1 (Pin 15, 8031)
ADC
Realisierung über Komparator und den 12Bit-DAC, Ausgang des Komparators an T0 (Pin 14, 8031).
Interrupts
SERCLK liegt auf Interrupt-Eingang INT1
SEQRST liegt auf Interrupt-Eingang INT0
Timer0 läuft im 16 Bit Mode und löst Interrupts aus (Sprung nach $1000, main() ?)
Serieller Interrupt, im Source-Code dokumentiert
Analog Address Bus
Für die Auswahl des richtigen S/H-Opamps (Verbindung des DAC-Ausgangs mit einem der Sample/Hold-Glieder) wird der Analog-Address-Bus (P1.0 - P1.6) verwendet. Die Bits 0..2 (P1.0 - P1.2) werden von Analog-Multiplexern 4051 ausgewertet. Der entsprechende Multiplexer wird von einem 74LS138 (1 aus 8 Dekoder) ausgewählt. Der 74LS138 wird von P1.3 - P1.6 angesteuert.
P1.6 | P1.5 | P1.4 | P1.3 | P1.2 | P1.1 | P1.0 | section |
1 | 0 | 0 | 0 | X | X | X | DCO1 |
1 | 0 | 0 | 1 | X | X | X | DCO2 |
1 | 0 | 1 | 0 | X | X | X | VCF |
1 | 0 | 1 | 1 | X | X | X | VCA |
1 | 1 | 0 | 0 | X | X | X | Bender/Sense (Switchboard) |
JX-3P Sourcecode (2764 EPROM, 8Kx8)
Den Quellcode des Roland JX-3P (version 4, von mir teilweise dokumentiert) gibt es hier,
den Speicherauszug (binary) hier.
8253 Counter-Baustein
gefunden im Sharp-Computermuseum Overview of the 8253 functions
JX-3P Schaltplan
Vielen Dank an Florian Anwander. Schaltplan JX3P, leider relativ schlechte Qualität. Wenn jemand einen qualitativ besseren Schaltplan besitzt bzw. eingescannt hat, bitte an mich !! (jx3p-schematics.zip)
Vielen Dank an Phil Gallo für den MKS-30 Schaltplan. In vielen Dingen dem JX-3P recht ähnlich, jedoch gravierende Unterschiede in der PG-200 Anbindung (Eigener Prozessor. Das muss doch auch ohne gehen...). Einige Unterschiede im I/O-Dekoder rund um IC58 (MKS30). Der Plan ist deutlich besser lesbar als der des JX-3P, von daher ganz hilfreich. (mks30-schematics.gif)
Zusätzliche Informationen
Über zusätzliche Informationen wäre ich sehr dankbar, nehmt doch einfach per Kontakt mit mir auf.
zum seitenanfang
letzte aktualisierung am 04.01.2004
(c) 2002 - 2004