Jump to content
IGNORED

Sid Master 99


mjnurney

Recommended Posts

I’ve finally plugged in my Sid master in to the PEB. I’m not sure if I ever knew or not but it doesn’t recognise .Sid files but $files. As it’s taken me from 2018 to connect it up I’ve forgotten everything about it but I copied some disk image over tipi and can play some music but the cut out after 15 seconds or so...

 

does anyone have any experience of this device?

 

I was hoping to get ocean loader, commando and various Sid tunes on it...

 

thanks Mike.

3C668658-5E8F-4720-B035-F2019DC5F571.jpeg

  • Like 1
Link to comment
Share on other sites

I’ve finally plugged in my Sid master in to the PEB. I’m not sure if I ever knew or not but it doesn’t recognise .Sid files but $files. As it’s taken me from 2018 to connect it up I’ve forgotten everything about it but I copied some disk image over tipi and can play some music but the cut out after 15 seconds or so...
 
does anyone have any experience of this device?
 
I was hoping to get ocean loader, commando and various Sid tunes on it...
 
thanks Mike.
3C668658-5E8F-4720-B035-F2019DC5F571.thumb.jpeg.b665f82021ea92ae9b7610eab568efe7.jpeg
Yep I have one and so does jedimatt42 you can only play those files no executable stuff as it's all the wrong cpu..

I'll have to dig to see if I have those

Sent from my LM-V600 using Tapatalk

  • Like 1
Link to comment
Share on other sites

1 hour ago, Ksarul said:

Marc included all of the SID music he'd translated in the files he provided with the card (about 8,000 of them, IIRC). I will have to put up a SID section on my website (which is nothing more than a placeholder site at this time).

Thanks I’ve downloaded them or at least a bundle of them. The folders seems to be in the creators names. How are the files converted ? 

Link to comment
Share on other sites

1 hour ago, mjnurney said:
Thanks I’ve downloaded them or at least a bundle of them. The folders seems to be in the creators names. How are the files converted ? 

I can download files from the http://www.c64music.co.uk/ site and play them fine they are just have to import into the ti as a "alien" df128

Sent from my LM-V600 using Tapatalk

  • Like 1
Link to comment
Share on other sites

  • 2 months later...
  • 3 weeks later...

I suppose nobody has an extended basic or Forth examples of creating a sound list for SID99? Actual sounds? I know what the book says, and It's definitely over my head, and it talks about you could use extended basic with call loads but again, no example.

The"extended basic" code I ever found talking about SID99 was just ti-99 sound as it played with it or without the SID card. It's nice to have hardware.

I heard about a player, but I'm not interested in that option even cool as it is. Just looking for what the manual could have referenced with working examples, I think.

examples in 3 languages.

Ex basic, assy and Forth would be nice.

Maybe I'm missing something?

It wouldn't be the first time.

Maybe the forths can't generate tones in this because they only know the ti sounds? So that may not be obtainable.

But surely assembly code examples for this card could be available?

Thank you in advance for clarification.

 

 

 

 

 

 

Link to comment
Share on other sites

@GDMike There is a litany of SID programming examples out there, though 6502-specific and not 9900.  As for Forth, it should be a matter of sending the correct data to the address space the SID99 occupies.  (I cannot recall OTOMH, but there is good documentation of it.)  Bingo bango bongo, and Bob's your uncle.  I cannot see it being practical in XB without loading an assembly language progam.  You would need a lot of CALL LOADs to play something, though sound effects and simple things like a bell using ADSR (did that in CBM BASIC, easily,) should be easy.

 

Check out the "Commodore 64 Progammer's Reference Guide" for some deep info on the SID.

 

The SID99 manual has some TI-centric programming information.

http://www.dsapsc.com/free-sid-music.html

 

Also, the manual provides an answer to my question about the LED and the latches feeding data to the SID.  If I understand correctly, it is done this way to compensate for some timing differences between the 9900 and the SID, in order to make sure the SID does not miss any data being sent to it.

  • Like 2
Link to comment
Share on other sites

4 minutes ago, OLD CS1 said:

Also, the manual provides an answer to my question about the LED and the latches feeding data to the SID.  If I understand correctly, it is done this way to compensate for some timing differences between the 9900 and the SID, in order to make sure the SID does not miss any data being sent to it.

i saw that too

Link to comment
Share on other sites

There are no sound lists on the SID Master card, only POKES (CALL LOADs in our case) to directly write the registers on the card.

 

I only have one example, it's from the C64 manual converted to XB. The purpose IIRC was to demonstrate the wave shape capabilities:

 


10 CALL CLEAR :: CALL INIT
11 FC=0 :: WF=17 :: ATK=132 :: SR=17 :: PH=2 :: PL=255
20 FOR C=22582 TO 22576 :: CALL LOAD(C,0):: NEXT C
30 V=22576 :: W=22536 :: A=22538 :: HF=22530 :: LF=22528 :: S=22540 :: PH=22534 :: PL=22532
35 CALL LOAD(V,15)
40 CALL LOAD(A,ATK):: CALL LOAD(PH,15):: CALL LOAD(PL,15)
45 CALL LOAD(22540,SR)
46 PRINT "WAVEFORM=";WF:"ATTACK/DECAY=";ATK:"SUSTAIN/RELEASE=";SR: :
50 READ H :: IF H=-1 THEN 1000
60 READ L :: READ D
65 CALL LOAD(HF,H):: CALL LOAD(LF,L):: CALL LOAD(W,WF)
70 CALL LOAD(22578,0)
80 FOR T=1 TO D :: NEXT T :: CALL LOAD(W,WF-1)
85 FOR T=1 TO D/(D/2):: NEXT T
90 GOTO 50
100 DATA 34,75,25,43,52,25,51,97,70,43,52,8,51,97
110 DATA 25,57,172,25
120 DATA 51,97,50,0,0,12,43,52,25,51,97,25,57,172
130 DATA 100,51,97,50,-1,-1,-1
1000 CALL LOAD(HF,0):: CALL LOAD(LF,0)
1010 RESTORE
1020 IF WF=17 THEN WF=33 :: GOTO 1030
1021 IF WF=33 THEN WF=65 :: GOTO 1030
1025 IF WF=65 THEN WF=17 :: GOTO 1030
1026 IF WF=65 THEN PH=PH-1 :: PL=PL+2
1029 IF WF=65 THEN PH=PH*2 :: PL=PL/2
1030 CALL LOAD(22532,PH):: CALL LOAD(22534,PL)
1040 IF WF=17 THEN ATK=ATK/2+2 :: SR=SR*2
1500 FC=FC+1 :: IF FC<17 THEN 40
2000 FOR C=22528 TO 22568 :: CALL LOAD(C,0):: NEXT C

MICH_SID

 

  • Like 3
  • Thanks 1
Link to comment
Share on other sites

There are no comments and possibly a few bugs, the bugs are probably my fault. ;)

 

10 - Clear screen, and CALL INIT so we can CALL LOAD later
11 - init variables:
  FC just counts loops, after 16 times through the program will exit
  WF sets the "waveform" type, and is written to voice 1 control. Starting value of 17 sets a triangle wave
  ATK sets the attack/decay durations. The starting value is 132 is 8 frames of attack and 4 frames of decay (>84)
  SR holds the sustain/release durations. The starting value of 17 is 1 frame of each.
  PH is supposed to hold the high byte of the pulse duty cycle, but the code is buggy.
  PL is supposed to hold the low byte of same. Both of these variables are used as the data and address, thus the bug.
20 - seems to be a typo here too... it is meant to be zeroing all the registers, that would be 22528 to 22568, also should STEP 2
30 - sets up some variables to be addresses of registers
  V is the filter mode/volume
  W is the voice 1 waveform control
  A is the voice 1 attack/decay control
  HF is voice 1 frequency high byte
  LF is the voice 1 frequency low byte
  S is the voice 1 sustain/release control
  PH is the pulse wave duty high byte (and conflicts with the earlier PH, meant to hold the value. One or the other should change)
  PL is the pulse wave duty low byte (and conflicts with the earlier PL, meant to hold the value. One or the other should change)
35 - sets the master volume to maximum (15) with no filters enabled
40 - loads the current value for attack/decay, and sets the duty cycle to >F0F (and I'm not even sure what that value means)
45 - loads the current value for sustain/release
46 - prints the current settings
50 - start of music play - reads the high frequency byte. If it gets -1, branch to 1000 for end of song
60 - read the low frequency byte, and read a duration value
65 - load the high frequency byte, then the low frequency byte, and finally the current waveform (which also re-triggers the note)
70 - writes out of range (to a read-only register) in order to move the latch off the waveform register and let the SID process it - this is SID Master specific, so you won't find this in SID tutorials!
80 - delay for the time read from the DATA, and then clear the 'gate' bit in the waveform register to end the note (starts release)
85 - brief delay which is always 1 to 2, so I don't know why it looks like that... ;)
90 - loop around and read the next note
100-130 - note data for the little tune, ends with -1 (only needs one, but has three for safety)
1000 - when the song ends, we come here. First we zero the high and low frequency bytes.
1010 - reset the DATA pointer
1020-1025 - select a new waveform. 33 is sawtooth, 65 is pulse (square wave), and then it loops back to 17
1026-1029 - when the waveform loops back to 17, it probably meant here to adjust the pulse width, but the tests and the math are both out to lunch, and as written this code is never executed.
1030 - loads the pulse width registers (high and low), but due to the above bugs, they are always loaded with the least significant byte of their addresses, that being >06 for high and >04 for low.
1040 - each time the WF loops around to 17, this line will cut ATK in half (then add 2, presumably to avoid 0) and double SR
1500 - increment the loop count, if not 16 loops yet, go start the music with the new settings
2000 - clear all the voice registers, probably should STEP 2.

 

Despite the minor bugs, it does work (except for never changing the pulse width).

 

Here's a Google Doc with the TI addresses... the meanings of the SID registers you can get from lots of sources online.

https://docs.google.com/spreadsheets/d/1pEtKO53lmclql6GdIq14aL7T3CBKNCKLO7-0_79ocSA/edit?usp=sharing


 

  • Like 4
Link to comment
Share on other sites

Did this for fun tonight.  Here is Example Program 10 from the "Commodore 64 Programmer's Reference Guide" page 208, from the chapter "Sound and Music on Your Commodore 64."  It is not optimized (could combine multiple CALL LOADs into one,) the register loads in lines 30 through 80, are pre-calculated as register*2 (as the 9900 is 16-bit, so registers are word-aligned,) and the timing between dings is longer than it would be on the 64 (try changing to 100 rather than 1000.)

 

10 S=22528 :: CALL INIT
20 FOR L=0 TO 24 :: CALL LOAD(S+L*2,0):: NEXT L
30 CALL LOAD(S+2,130)
40 CALL LOAD(S+10,9)
50 CALL LOAD(S+30,30)
60 CALL LOAD(S+48,15)
70 FOR L=1 TO 12 :: CALL LOAD(S+8,21)
80 FOR T=1 TO 1000 :: NEXT T :: CALL LOAD(S+8,20)
90 FOR T=1 TO 1000 :: NEXT T :: NEXT L

 

  • Like 4
  • Thanks 1
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...