Symposia – TI99/4A – TI Extended Basic

Rivista: – Anno: – Numero: – Trascrizione: Ermanno Betori

Il Texas Instruments TI-99/4A nascondeva un chip sonoro dalle notevoli potenzialità per l’epoca: il TMS9919 (o SN94624), derivato dal famoso SN76489 della Texas Instruments stessa. Questo generatore di suoni programmabile offriva quattro canali distinti: tre canali per toni puri (square wave) e un canale dedicato al rumore (white noise), ciascuno con un controllo del volume a 16 livelli. Sebbene non disponesse di un canale d’onda campionata (PCM) per riprodurre voci o musica digitale, la sua architettura permetteva una polifonia chiara e precisa, ideale per melodie, effetti sonori arcade e basi ritmiche, ponendosi come avversario diretto del SID del Commodore 64 e del PSG dell’MSX.

I programmatori più abili riuscirono a spingere il chip oltre i suoi limiti apparenti, sfruttando tecniche avanzate come il “software mixing” e la modulazione di impulsi (PWM) per simulare timbri più complessi e persino una rudimentale sintesi del parlato, come nel programma “TI-Talk”. La vera sfida consisteva nel programmare il chip a basso livello, spesso ricorrendo al linguaggio Assembly per un controllo diretto e tempestivo dei registri, dato che il BASIC integrato non offriva comandi audio sofisticati. Questo sforzo di ottimizzazione era cruciale nei giochi, dove gli effetti sonori dovevano coesistere senza interferenze con l’azione sullo schermo.

Nonostante le limitazioni, anche il TI-BASIC offriva gli strumenti per creare suoni e musiche riconoscibili, aprendo la porta alla programmazione audio ai principianti. Il comando fondamentale era CALL SOUND, uno strumento potente ma che richiedeva pazienza e ingegno per essere sfruttato al meglio. Con una sola istruzione, si potevano controllare fino a tre dei quattro canali del chip sonoro, specificando per ciascuno la frequenza (in Hertz), il volume (da 0 a 30) e la durata (in decimi di secondo). La vera sfida consisteva nell’orchestrare questi parametri in loop e sequenze per costruire qualcosa di più di un semplice beep.

Dopo Bumble-Boogie e la Toccata e fuga in D minore di Johann Sebastian Bach e’ il momento di questo Symposia.

Titolo: Symposia
Piattaforma: TI99/4A
Linguaggio: TI Extended Basic
Versione originale: –
Pubblicazione: –
Anno: –
Trascrizione: Ermanno Betori
Anno: 2025
Download: N/A
Note: Usare il TI Extended Basic.

Qui di seguito trovate il codice da copiare sul vostro TI99/4A oppure su un emulatore, noi suggeriamo Classic99.

Di seguito le istruzioni per caricare il listato sull’emulatore Classic99:
– Copiare il listato di cui sotto
– Avviare l’emulatore
– Da Cartridge -> Apps, selezionare Extended Basic
– Premere un tasto qualsiasi
– Dopodiché premere 1 per avviare il TI Extended Basic
– Dal comando Edit, selezionare Paste XB per incollare il listato
– Digitare RUN per eseguire il codice
Buon divertimento!

Attenzione – Ci siamo resi conto che nel listato i caratteri ‘>’ e ‘<‘ potrebbero venir sostituiti dai rispettivi encoding html ‘&gt’ e ‘&lt’. Nel caso, sostituite questi valori nel listato prima di copiarlo sull’emulatore.

Listato: Symposia – TI99/4A – TI Basic


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
70 REM  'MAIN SCREEN                  SYMPOSIA'
80 REM  PGM BY SAM MOORE JR.
100 CL=9 :: S=900 :: LB=247 :: LLA=110 :: LLAS,LLBF=117 :: LLB=123 :: HHA=1760 :: HHB=1976 :: HHAS,HHBF=1864 :: Q=40000
110 LC=131 :: LCS,LDF=139 :: LD=147 :: LDS,LEF=156 :: LE=165 :: LF=175 :: LFS,LGF=185 :: LG=196 :: LGS,LAF=208 :: LA=220 :: LAS,LBF=233
120 HB=988 :: C=262 :: CS,DF=277 :: D=294 :: DS,EF=311 :: E=330 :: F=349 :: FS,GF=370 :: G=392 :: GS,AF=415 :: A=440 :: AS,BF=466 :: B=494
130 HC=523 :: HCS,HDF=554 :: HD=587 :: HDS,HEF=622 :: HE=659 :: HF=698 :: HFS,HGF=740 :: HG=784 :: HGS,HAF=831 :: HA=880 :: HAS,HBF=932
140 HHC=1047 :: HHCS,HHDF=1109 :: HHD=1175 :: HHDS,HHEF=1245 :: HHE=1319 :: HHF=1397 :: HHFS,HHGF=1480 :: HHG=1568 :: HHGS,HHAF=1661
150 GOSUB 660 :: CALL CLEAR
160 CALL COLOR(14,3,3) :: CALL COLOR(13,11,11) :: CALL COLOR(12,14,14)
170 CALL COLOR(11,16,16) :: CALL COLOR(10,5,5) :: CALL COLOR(9,9,9)
180 NF$=CHR$(95)&CHR$(95)&CHR$(95)&CHR$(95) :: NT$=CHR$(93)&CHR$(93)&CHR$(93)&CHR$(93)
190 DISPLAY AT(1,3):"Y";CHR$(95);NF$;NF$;NF$;CHR$(92)
200 DISPLAY AT(2,3):CHR$(95);"&           #";CHR$(95)
210 DISPLAY AT(3,3):CHR$(95);"             ";CHR$(95)
220 FOR RW=4 TO 9 :: DISPLAY AT(RW,3):CHR$(95);"             ";CHR$(95);"  )";NF$;NF$ :: NEXT RW
230 DISPLAY AT(10,3):CHR$(95);"P           8";CHR$(95);"  )";NF$;NF$
240 DISPLAY AT(11,3):"/";CHR$(95);NF$;NF$;NF$;"W 9/";CHR$(95);CHR$(95);"X";CHR$(95);"X";CHR$(95);"X";CHR$(95)
250 DISPLAY AT(12,4):CHR$(95);CHR$(95);NT$;CHR$(95);CHR$(95);CHR$(95);NF$;"  >XXXXXXXP"
260 DISPLAY AT(13,27):"?@"
270 DISPLAY AT(14,2):")''''''''''''''''/3''>   )D"
280 DISPLAY AT(15,2):"2                2D  L";CHR$(92);"X@)D"
290 DISPLAY AT(16,2):CHR$(92);"XXXXXXXXXXXXXXXXMXXY;";CHR$(95);CHR$(95);"^S$"
300 DISPLAY AT(17,1):")";"XXXXXXXXXXXXX";NF$;")  )+";CHR$(95);CHR$(95);"F"
310 DISPLAY AT(18,1):")888888888888;W''/)  ))"
320 DISPLAY AT(19,1):")PPPPPPPPPPPPPV  ))  ))"
330 DISPLAY AT(20,1):")^8888888888882  ))XXY&"
340 DISPLAY AT(21,1):")VPPPPPPPPPPXX2  ) D"
350 DISPLAY AT(22,1):")VPPXXXXXXXPP8R  ) D"
360 DISPLAY AT(23,1):")^XXXXXXXXXXX";CHR$(91);"^XXY(D"
370 DISPLAY AT(24,1):"!";NF$;NF$;NF$;CHR$(93);CHR$(95);"Z";CHR$(93);CHR$(95);"&"
380 RESTORE :: FOR I=6 TO 18 :: READ Z :: CALL VCHAR(3,I,Z,2) :: CALL VCHAR(8,I,Z,2) :: NEXT I
390 DATA 136,95,128,120,112,104,136,120,96,112,104,96,128
400 GOSUB 650 :: FOR I=1 TO 2
410 J=LA :: L=HA :: GOSUB 630 :: J=E :: L=HAF :: GOSUB 630 :: J=C :: L=HA :: GOSUB 630 :: J=E :: L=HB :: GOSUB 630
420 J=LA :: L=HHC :: GOSUB 630 :: J=E :: L=HB :: GOSUB 630 :: J=C :: L=HHC :: GOSUB 630 :: J=E :: L=HHD :: GOSUB 630
430 J=LAF :: L=HHE :: GOSUB 630 :: J=D :: L=HHF :: GOSUB 630 :: J=LB :: L=HHE :: GOSUB 630 :: J=D :: L=HHF :: GOSUB 630
440 J=LAF :: L=HHE :: GOSUB 630 :: J=D :: L=HHD :: GOSUB 630 :: J=LF :: L=HHC :: GOSUB 630 :: J=D :: L=HB :: GOSUB 630
450 J=LA :: L=HHA :: GOSUB 630 :: J=E :: L=HHE :: GOSUB 630 :: J=C :: L=HHC :: GOSUB 630 :: J=E :: L=HHA :: GOSUB 630
460 J=LG :: L=HHG :: GOSUB 630 :: J=D :: L=HHD :: GOSUB 630 :: J=LB :: L=HB :: GOSUB 630 :: J=D :: L=HHD :: GOSUB 630
470 J=LF :: L=HHF :: GOSUB 630 :: J=C :: L=HHC :: GOSUB 630 :: J=LA :: L=HA :: GOSUB 630 :: L=C :: L=HHC :: GOSUB 630
480 J=LE :: L=HHE :: GOSUB 630 :: J=LB :: L=HHD :: GOSUB 630 :: J=LAF :: L=HHC :: GOSUB 630 :: J=LB :: L=HB :: GOSUB 630
490 NEXT I :: GOSUB 650 :: FOR I=1 TO 2
500 J=LA :: L=HA :: GOSUB 630 :: J=E :: L=Q :: GOSUB 630 :: J=C :: L=HA :: GOSUB 620 :: L=HG :: GOSUB 620 :: J=E :: L=HHC :: GOSUB 630
510 J=LE :: L=HB :: GOSUB 630 :: J=LB :: L=Q :: GOSUB 630 :: J=LAF :: L=Q :: GOSUB 630 :: J=LB :: L=HE :: GOSUB 630
520 IF Z=1 THEN 560
530 J=LA :: L=HA :: GOSUB 630 :: J=E :: L=Q :: GOSUB 630 :: J=C :: L=HA :: GOSUB 620 :: L=HB :: GOSUB 620 :: J=E :: L=HHC :: GOSUB 630
540 J=LE :: L=HHE :: GOSUB 630 :: J=LB :: L=Q :: GOSUB 630 :: J=LAF :: L=HHD :: GOSUB 630 :: J=LB :: L=HE :: GOSUB 630
550 Z=1 :: GOTO 500
560 Z=0 :: J=LA :: L=HA :: GOSUB 630 :: J=E :: L=HHC :: GOSUB 630 :: J=LAF :: L=HB :: GOSUB 630 :: J=LB :: L=HHF :: GOSUB 630
570 J=LA :: L=HA :: GOSUB 630 :: J=E :: GOSUB 630 :: J=C :: L=HHA :: GOSUB 630 :: J=E :: GOSUB 630 :: NEXT I
580 J=LA :: L=Q :: GOSUB 610 :: J=C :: GOSUB 610 :: J=E :: GOSUB 610 :: J=A :: GOSUB 610
590 J=HA :: GOSUB 610 :: J=HHC :: GOSUB 610 :: J=HHE :: GOSUB 610 :: J=HHA :: GOSUB 610
600 FOR DL=1 TO 999 :: NEXT DL :: GOTO 400
610 CALL SOUND(-S,J,0,J*2,0) :: RETURN
620 CALL SOUND(-S,L,4,L/2,7,J*7.5,30,-4,9) :: FOR DL=1 TO 3 :: NEXT DL :: RETURN
630 CALL SOUND(-S,L,4,L/2,7,J*7.5,30,-4,9) :: FC=INT(RND*16+1) :: CL=CL+1 :: IF CL>14 THEN CL=9
640 CALL COLOR(CL,FC,FC) :: RETURN
650 J=LA :: L=Q :: GOSUB 630 :: J=E :: GOSUB 630 :: J=C :: GOSUB 630 :: J=E :: GOSUB 630 :: J=LA :: GOSUB 630 :: J=E :: GOSUB 630 :: J=C :: GOSUB 630 :: J=E :: L=HE :: GOSUB 630 :: RETURN
660 A$(0)="00000000"
670 A$(1)="03030303"
680 A$(2)="1C1C1C1C"
690 A$(3)="1F1F1F1F"
700 A$(4)="E0E0E0E0"
710 A$(5)="E3E3E3E3"
720 A$(6)="FCFCFCFC"
730 A$(7)="FFFFFFFF"
740 FOR C1=0 TO 7 :: FOR D1=0 TO 7 :: CALL CHAR(D1+32+C1*8,A$(D1)&A$(C1)) :: NEXT D1 :: NEXT C1
750 RETURN

Share

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

This site uses Akismet to reduce spam. Learn how your comment data is processed.