Interface Manual: Appendix C - Useful Locations Within the Chroma
The memory address space within the Chroma is accessible through the use of the Peek, Peek Two Bytes, Poke and Poke Two Bytes commands. Although the usefulness of these commands depends upon an understanding of the internal structure of the Chroma firmware, there are some locations within the Chroma's address space that can be manipulated without really knowing what goes on inside the instrument. A few of these are documented here as an aid to anyone who wishes to experiment with them.
Revisions often involve rearranging the locations of things inside the computer's address space. The only things that are likely to move, though, are those items contained in volatile RAM between locations 0100 and 0FFF.
Once you issue the unlock command and start Poking into the Chroma, you have the capability of crashing the Chroma's computer. A crashed Chroma must be powered down and up again to restart it. It is possible that a crash may corrupt the programs stored in non-volatile RAM (possibly only a byte here and there). Therefore, the 50 programs should be reloaded via cassette (or via the interface) in the event of a crash.
Be sure to use the Peek Two Bytes and Poke Two Bytes commands whenever you are accessing a two byte value. This ensures that the interface's access to the locations does not get interleaved with the Chroma's access to the same locations.
0020-0029: Display image
This contains the image of the ten display digits. Changes made to the first eight locations (the Data Readout) only last until some action occurs on the panel that involves the display. Changes made to the last two locations (the Program Number) last until a program is selected or stored.
This contains the image of those eight LEDS that are capable or being flashed. Writing to this location will cause the appropriate LEDS to change state, as this location is copied to the LED port byte 1 at regular intervals.
This contains the image of those eight LEDS that never flash. Writing to this location does not make the LEDs change state, so the LED port byte 2 should be written as well.
002C: LED blink image
This byte is XORed with the LED image byte 1 at regular intervals to cause LEDS to flash. This should normally be set whenever the image byte is set.
0048, 0049: Master tune
This two-byte number contains the master tune setting for the instrument. Whenever the tune slider is moved, this will be set to an even number between -256 and +246, which represents a range from -1 to almost +1 semitones. As long as the master tune slider is not moved, this location can be played with through the interface.
005A, 005B: Safe buffer program number, modified flag
This contains information about the contents of the safe buffer. Whenever a program is selected or stored, the safe buffer is used to store a backup copy of whatever is written over.
006A, 006B: Major loop hook
Every 20 milliseconds or so, an indirect subroutine call la made through this location. Normally, this contains C100, the address or a Return instruction.
006C, 006D: Minor loop hook
Every 1.25 milliseconds or so, an indirect subroutine call is made through this location. Normally, this contains C100, the address, of a Return instruction.
0140-017A: Safe buffer
Whenever a program is selected or stored, whatever is written over is first copied here.
The stack grows from high memory to low, and we have never seen it go below 0190, so that leaves twenty locations that are probably free. Assign from 017B up, to be safe.
01BF-02BF: Cassette buffer
These 257 bytes are where each packet is stored as it is read from or written to the tape. Although it is possible to have a packet that fills the buffer, the packets used in ordinary cassette operations never exceed sixty bytes, so locations 01FB to 02BF are generally free. Assign from 02BF down, to be safe. Note: In REV 1 and 2, the cassette buffer is located in 0BFF to 0CFF.
1000 to 13FF: Empty
These locations correspond to the two empty chip locations on the computer board.
1400 to 1FC0: Programs
The 51 programs (0 to 50) are packed into this area. Each program occupies 59 bytes.
1FC1 to 1FF0: Free non-volatile memory
These 48 locations are not currently used. Assign from 1FC1 up, to be safe.
1FF1: Cassette type
If bit 2 of this byte is set, normal cassette motor sense/control functions are enabled. If bit 2 is clear, the cassette motor is ignored.
1FF2: Program number
The current program number, as shown in the display, is kept here.
1FF3: Modified flag
The modified flag appears in bit 7 of this bye. The other bits must be zero.
1FFC: Attack threshold
General modulation selection 13 (Threshold Velocity) and Ampl Touch settings 6 and 7 [see for instance Amplitude Touch : Threshold Values in "Panel Parameter Descriptions" from the Programming Manual] compare the velocity or each attack to this number, which must be between 0 and 31.
1FFD: Release threshold
Envelope Release setting 31 causes each release velocity to be compared to this number, which must be between 0 and 31.
1FFE: Release slow value
Envelope Release setting 31 causes this number to be used as the release parameter for releases slower than the above threshold. It should be between 0 and 31.
1FFF: Release fast value
Envelope Release setting 31 causes this number to be used as the release parameter for releases faster than the above threshold. It should be between 0 and 31.
This write-only location directly controls those eight LEDS that are capable of flashing. This location should not be directly referenced, as it is automatically rewritten from the LED image byte 1 at regular intervals.
This write-only location directly controls those eight LEDS that never flash. When this location is written, the LED image byte 2 should also be written.
This location contains a Return instruction. Software hook cells should always contain C100 when not in use.