Using HVSC and smart search of specific parts in the music player for 1987 Street Sports Basketball (C64) I was surprised to see that the player went back to 1983's Mountain King. In fact, the player was found in more games. here's a list: 

; Mountain King 				1983    Beyond
; Donkey Kong					1983    Nintendo
; Track and Field				1984    Atarisoft
; WarGames					1984    Coleco Vision
; Sesame Street letter Go Round	                1984    CCW, CBS Software
; Pole Position					1984	Atarisoft
; Math Mileage					1984	Douglas D. Dragin
; Chevytech			                1985	Chrevrolet, unknown programmers. 
; Crystal Castles				1986	Unknown
; World Games 					1986	Epyx
; Street Sports Basketball		        1987	Epyx
; Street Sports Soccer			        1988	Epyx
; Street Sports Football		        1988	Epyx
; Chevytech					1988	Chrevrolet 
; The Sporting News Baseball	                1988	Epyx 

I went on and disassembled the player that is in Mountain King, which I consider the first version for now and since Douglas D. Dragin is the one credited as programmer (and also on some other games in the list above) I think it is safe to assume it was Dragin that coded the player. 

In the file you can read up on the player specifics and the source code as well. 

But I will show some details in this post, and provide example programs (PRG) to run. See below. 

So I wanted to generate an audio wave using the SERIAL port of the Commodore 64. Since the lines ride at 5 V DC, but can alternate between 0V (signal on) and 5V (signal off), pulses should be possible. I wondered if I could modify the waves further, by changing the rise time. But that was not possible. 

Using ATN line to generate pulse waves

See picture from my oscilloscope above. When the C64 is idle, the ATN line stays at 5V. If we want the attention of devices connected to the serial port, we do this by dropping the line to 0V. In my code I made that the default situation. So "do nothing' in my case means keep the ATN line at 0V. Then, when wanting a pulse-wave, "let go" and the line will rise to 5V DC, but at the cost of a peak, as you can see. The pulse-width is 50%, as you can see, so at 50% of the period, I drop the line back to 0. Again at the cost of a peak, before it goes back to 0V. In this instance above, the peak-to-peak voltage is a total of 8.6. 

The rise time (or drop time) is very fast. I am unable to modify it with software. It is within microseconds. Even if I set it to go to 5V and follow immediately with a call to drop it to 0V, the peak is there. 

I had a plan to feed that back to EXT-IN on the SID, to passively mix with the other three channels, but that is impossible with this Vpp level. The recommendation is for any EXT-IN signal coming in the SID, to ride at 6 DC, but only at 3 Vpp. 

With 8.6 Vpp I am nowhere near that max limit, so let's not do it!

Example of music with SERIAL port ATN pulse wave

Nevertheless, it is possible to just hook up the pulse-wave to an audio set and have that extra channel. As a proof of concept I simply modified my PULSE-FX player and have the player not use gate on/off to generate the pulse wave on a channel, but use the SERIAL port ATN line low/high for the wave. 

Check the MP3 of the result (serial port pulse wave at left channel): 

http://c64.xentax.com/media/ATN-PULSE_XNTX.mp3

 

To play 8 bit samples on an OPL2 there is a simple technique to use the test bit to freeze the voltage output from the chip, which can then be controlled by setting the lower 8 bits of the frequency to an 8-bit sample value. 

The original trick was written by Mitsutaka Okazaki.
 
Some background info from Grauw, who helped me get this trick to OPL2. 
 
Details on TEST register and the undocumented bit 2 function
(if 1, resets (and holds, while active) the PG count for Car/Mod at 0 )
 
You can in fact simply write an 8 bit unsigned sample to a channel when the test bit is set (after a bit more preparation) at a proper sample rate and you will hear the sample play. However, the voltage is taken from the sine table on the chip, and that has a slightly different output than you might expect if you were dealing with a linear type of relationship with your unsigned value (you know, $80 being silence, 0 most negative output and 255 most positive). 
The result is that samples may sound slightly different, a bit more "sharp". Grauw took a look at the outputs and constructed a table that accounts for that internal chip look-up. 
 
Here I compare the two methods. The fast, don't look up, just output the sample method, and the Grauw's table method. (Of course, you can convert your samples using Grauw's table before and then still have a fast no-look-up method, but it takes an extra step. 
 
I take a simple approach, play a sample that goes from 0 to 255 and then back to 0 in steps of 1, and that 4 times. I do it without Grauw's conversion and with that conversion. 
 
 
The picture above illustrates how well Grauw's table is doing the trick. Note that the non-converted left wave is a bit louder, but not in proper phase. Where you would expect a maximum (positive or negative) at end of each half of a period, this is the case only after conversion, you see two quarter sines (inverted). So Grauw neatly matched it to the quarter sine output table on the chip. :) 
 
Will you hear a lot difference in the samples? Probably not, especially if you don't know how it should sound. But to the trained ear, there is a slight difference. Nothing to worry about. But we do want things to be perfect. So great work, Grauw! 
 
 
 
 

On the Commodore 64, talking about SID DIGI (sample) play routines, there are many forms. What they all have in common is that they need to use a Timer routine to play samples at a certain rate. The time in cycles that it takes for that Timer interrupt driven sample playback determines the maximum sample rate. 

On a PAL machine, one cycle equals 1.015 microsecond. 

This means, if you wish to have a sample play at 8000 hz (update 8000 times a second), you need to call the sample play routine every 1/8000 = 0.000125 seconds. Or 125 microseconds. This is 125/1.015 = ~123 cycles. Meaning the Timer will need to be set to cause the interrupt at $7b cycles. It also means that the sample playback routine should not spend more than 123 cycles to complete in total, otherwise the next update will start when the previous did not finish yet. Also, if any other stuff needs to be done, like scrollers, graphical stuff, or even a whole game running (for example using other interrupts) things can get tricky if the sample play routine is taking too long, leaving no cycles for other things. 

So let's take a look at some sample playback routines used in the Commodore 64 music scene.