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.

A12A11A10A9 
0000Y0 = /WR (Prog. Divider Master Osc. ??)
0001Y1 = 0 (Progr. Counter IC50)
0010Y2 = 0 (Progr. Counter IC49)
0011Y3 = 0 (Progr. Counter IC48)
0100Y4 = 0 (Progr. Counter IC47)
0101Y5 = /WR (DAC)
0110Y6 = /RD (Keyboard/Switches)
0111Y7 = /WR (LED-Matrix)
1000Y8 = /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$AddressLed-Spalte
0111X1110XXXX$0EE0LED-Spalte 0 (LEDSCN0)
0111X1101XXXX$0ED0LED-Spalte 1 (LEDSCN1)
0111X1011XXXX$0EB0LED-Spalte 2 (LEDSCN2)
0111X0111XXXX$0E70LED-Spalte 3 (LEDSCN3)


LEDSC0 ($0EE0)LEDSC1 ($0ED0)LEDSC2 ($0EB0)LEDSC3 ($0E70)
D7816DCMT
D6715CR/S SEQ
D5614BREST
D4513ATIE
D3412KEYTWR SEQ
D2311HOLDWR EDIT
D1210MUTEGROUP B
D019CHORUSGROUP A

Switch Matrix (Panel), Aufbau und Abfrage

A12..A0$AddressSwitch-Spalte
0110XXXXX1000$0C08Switch-Spalte 0 (SWSCN0)
0110XXXXX1001$0C09Switch-Spalte 1 (SWSCN1)
0110XXXXX1010$0C0ASwitch-Spalte 2 (SWSCN2)
0110XXXXX1011$0C0BSwitch-Spalte 3 (SWSCN3)
0110XXXXX1100$0C0CSwitch-Spalte 4 (SWSCN4)


SWSCN0 ($0C08)SWSCN1 ($0C09)SWSCN2 ($0C0A)SWSCN3 ($0C0B)SWSCN4 ($0C0C)
D7816DCMT 
D6715CR/S SEQ 
D5614BRESTLFO TRIG
D4513ATIERX MODE
D3412KEYTWR SEQHOLD PDL
D2311HOLDWR EDITBEND POL
D1210MUTEGROUP BBEND RNG W
D019CHORUSGROUP ABEND 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