home *** CD-ROM | disk | FTP | other *** search
- /*
- * SIDDEMO.C, ╓ERSION 2
- *
- * ╞OR THE ├-64 AND ├-╨OWER.
- *
- * BY: ╙TEVE ╥EISMAN
- * 50 ─AVID ├OURT
- * ─AYTON, ╬╩ 08810
- * ATTMAIL!SREISMAN
- *
- * ╨ROGRAM IS BASED ON:
- * "═╒╙╔├2"
- * ┴╚╧┘ ═AGAZINE, ╩UNE 1986
- *
- * ╒NLIKE VERSION 1, THIS DEMO CONSISTANTLY
- * PLAYS FULL, CRISP NOTES.
- *
- * ╨ROGRAM DEMONSTRATES SEVERAL DISCRETE
- * CONCEPTS WHILE HARNESSING A POWERFUL
- * FEATURE OF THE ├-64; SOUND GENERATION.
- *
- * 1. ╞ROM ├, THE ├64'S NORMAL INTERRUPT PROCESSING
- * IS DYNAMICALLY ALTERED TO PERFORM AN INDEPENDENT
- * MACHINE LANGUAGE BASED ROUTINE. ╔N THIS CASE,
- * A TIGHT 6502 ROUTINE TIMES EACH NOTE'S PLAY
- * WITHOUT REGARD TO ANYTHING ELSE GOING ON.
- *
- * 2. ╘HE KEYBOARD IS ACCESSED DIRECTLY AND WITHOUT
- * ANY COSTLY OVERHEAD. ╟RANTED THAT THE KEY'S SCAN
- * CODE ONLY IS RETURNED, BUT THE METHOD HAS MANY
- * PRACTICAL APPLICATIONS FOR OTHER SOFTWARE.
- *
- * 3. ╘HE EMPLOYED ═╠ ROUTINES, UNLIKE THE EARLIER VERSION
- * OF THIS PROGRAM, ARE STATIONARY. ╘HEY ARE NO LONGER
- * POKED ELSEWHERE IN ╥┴═. ╘HEIR ADDRESSES ARE CULLED
- * FOR SYS() CALLS USING POINTERS AND INDIRECTION.
- *
- * 4. ╠ASTLY, THE PROGRAM EMPLOYS THE GOOD SENSE OF
- * CLEANING-UP AFTER ITSELF (THOUGH ONE LAST BUG
- * LINGERS ON HERE; YOU'LL SEE IT WHEN YOU END
- * PRACTICING YOUR TUNES).
- *
- * ┘OUR COMMENTS WILL BE APPRECIATED. ─ROP ME A LINE AT
- * MY ADDRESS (LISTED ABOVE), OR THROUGH THE ╨╥╧-╠╔╬┼ BBS.
- *
- * ╚AVE FUN!
- */
-
- #INCLUDE <STDIO.H>
-
- #DEFINE PEEK(X) *((CHAR *)X)
- #DEFINE POKE(X,Y) *((CHAR *)X)=Y
-
- #DEFINE ╙╞─╪ 0X├┬ /* ╦EYBOARD SCAN CODE TAKEN */
- /* FROM HERE. */
-
- #DEFINE ╘╔═┼╥ 0X╞┬ /* ZERO-PAGE VARIABLE/FIELD */
-
- #DEFINE ╒╙╥┴─1 0X311
- #DEFINE ╒╙╥┴─2 0X312
- #DEFINE ├╔╬╓1 0X314
- #DEFINE ├╔╬╓2 0X315
-
- #DEFINE ╙╔─ 0X─400
- #DEFINE ╞╥┼╠╧1 0X─400
- #DEFINE ╞╥┼╚╔1 0X─401
- #DEFINE ╨╫╠╧1 0X─402
- #DEFINE ╨╫╚╔1 0X─403
- #DEFINE ╓├╥┼╟1 0X─404
- #DEFINE ┴╘─├┘1 0X─405
- #DEFINE ╙╒╥┼╠1 0X─406
- #DEFINE ╙╔╟╓╧╠ 0X─418
-
- /* ╦EYBOARD SCAN CODES FOR PROGRAM'S VALID KEYS.
- */
- STATIC CHAR MATRIX[] =
- █62,10, 9,13,18,17,21,22,26,29,30,
- 34,33,37,38,42,45,46,50,49,53 ▌;
-
- /* ╞REQUENCY TABLES FOR PIANO NOTES USED HEREIN
- * ╞/┘/╔ - THE SID CHIP USED A 12-BIT VALUE FOR
- * A DESIRED FREQUENCY. ╘HE HIFREQ VALUES
- * ARE PLACED INTO THE REQUIRED NYBBLE,
- * AND THE LOFREQ'S ARE PLACED AS WHOLE
- * BYTES.
- */
- STATIC CHAR HIFREQ[] =
- █13,14,14,15,16,17,18,19,21,22,23,25,
- 26,28,29,31,33,35,37,39,42 ▌;
-
- STATIC CHAR LOFREQ[] =
- █ 78,24,239,210,195,195,209,239,31,96,181,
- 30,156,49,223,165,135,134,162,223,62 ▌;
-
- /* ╘HIS ═╠ IS USED TO TIME NOTE DURATION.
- */
- STATIC CHAR ML[] =
- █
- 0X┴6,0X╞┬, /* ╫┴╔╘ LDX ╘╔═┼╥ */
- 0X├┴, /* DEX */
- 0X─0,0X07, /* BNE ╥╘╥╬ */
- 0X┴9,0X40, /* LDA #64 */
- 0X8─,0X04,0X─4, /* STA ╓├╥┼╟1 */
- 0X┴2,0X00, /* LDX #0 */
- 0X86,0X╞┬, /* ╥╘╥╬ STX ╘╔═┼╥ */
- 0X6├,0X11,0X03, /* ╩═╨ JMP (╒╙╥┴─1/2) */
- 0X00 /* BRK */
- ▌;
-
- /* ╞OLLOWING ARE TWO EXTREMELY SHORT ML ROUTINES
- * CALLED WITH SYS() TO DISABLE AND THEN RE-ENABLE
- * THE 64'S INTERRUPT MACHINE.
- * ╘HE POINTER FIELDS ARE USED TO SYS() TO THE ML.
- */
-
- STATIC CHAR SEI[] =█ 0X78,0X60 ▌;
- STATIC CHAR CLI[] =█ 0X58,0X60 ▌;
- CHAR *SEIRTN, *CLIRTN, *MLRTN;
-
- MAIN()
- █
- REGISTER INT I;
- STATIC CHAR C;
- STATIC CHAR CC;
- CHAR DMY;
- UNSIGNED INT MLñADR, MLñLO, MLñHI;
-
- /* ╙ET UP INTERRUPT VECTOR.
- *
- * ╞IRST, GET CURRENT ╔╥╤ VECTOR BYTE
- * AND INSERT INTO ╒╙┼╥ VECTOR.
- */
- C = PEEK(├╔╬╓1);
- POKE(╒╙╥┴─1, C);
-
- C = PEEK(├╔╬╓2);
- POKE(╒╙╥┴─2, C);
-
- /* ╥ETRIEVE AND CONVERT ADDRESS
- * FOR ARITHMETIC OPERATIONS.
- * ╥ESULTS ARE USED FOR SETTING
- * A NEW ├╔╬╓ VECTOR.
- */
- SEIRTN = &SEI[0];
- CLIRTN = &CLI[0];
- MLRTN = &ML[0];
- MLñADR = MLRTN;
- MLñHI = MLñADR / 256;
- MLñLO = MLñADR - (MLñHI * 256);
-
- /* ╥ESET ├╔╬╓ FOR NEW VECTOR.
- */
- SYS(SEIRTN, &DMY, &DMY, &DMY);
- POKE(├╔╬╓1, MLñLO);
- POKE(├╔╬╓2, MLñHI);
- SYS(CLIRTN, &DMY, &DMY, &DMY);
-
- /* ╔NITIALIZE AND LOAD SID FOR DEMO.
- */
- POKE(╘╔═┼╥, 60);
- CLSID();
- POKE( ╙╔╟╓╧╠, 15 );
- POKE( ┴╘─├┘1, 9 );
- POKE( ╙╒╥┼╠1, 0 );
- POKE( ╨╫╚╔1, 0 );
- POKE( ╨╫╠╧1, 255 );
- POKE( ╓├╥┼╟1, 64 );
-
- MAPOUT(); /* DISPLAY INSTRUCTIONS */
- CC = 0X00; /* INITIALIZE ╠AST-╦EY-╚IT */
-
- /* ═AINLINE ROUTINE; PLAY THE KEYS.
- * ┼SCAPE BY PRESSING 'X';
- */
- ╠╧╧╨:
- C = PEEK(╙╞─╪); /* GET SCAN CODE */
- IF(C == 0X40)█ /* 0X40 = '╬O ╦EY ╨RESSED */
- CC = 0X00; /* UPDATE ╠AST-╦EY-╚IT */
- GOTO ╠╧╧╨;
- ▌
- IF(C == 0X17)█ /* 0X17 IS SCAN CODE FOR 'X' */
- MOPUP();
- EXIT(0);
- ▌
- IF(C == CC) /* KEY MUST BE LIFTED .. */
- GOTO ╠╧╧╨; /* .. TO PLAY IT AGAIN */
- FOR(I=0; I<21; I++)█ /* SEARCH FOR A VALID KEY */
- IF(C == MATRIX[I])█ /* GOT ONE; PLAY IT */
- CC = C; /* UPDATE ╠AST-╦EY-╚IT */
- POKE(╘╔═┼╥, 60);
- POKE(╓├╥┼╟1, 64); /* TURN ╓OICE-1 OFF */
- POKE(╞╥┼╚╔1, HIFREQ[I]); /* ╙ET FREQUENCY */
- POKE(╞╥┼╠╧1, LOFREQ[I]);
- POKE(╓├╥┼╟1, 65); /* TURN ╓OICE-1 ON */
- GOTO ╠╧╧╨;
- ▌
- ▌
- GOTO ╠╧╧╨;
- ▌
-
- CLSID()
- █
- REGISTER INT I;
-
- FOR(I = 0; I < 24; I++)
- POKE(╙╔─ + I, 0);
- ▌
-
- MAPOUT()
- █
- PUTCHAR(147);
- PUTCHAR('\N');
- PUTCHAR('\N');
- PUTS(" ╙╔──┼═╧.├ -- ┴ DEMO PIANO PLAYER");
- PUTCHAR('\N');
- PUTCHAR('\N');
- PUTCHAR('\N');
- PUTS(" ╒SE INDICATED KEYS.");
- PUTCHAR('\N');
- PUTCHAR('\N');
- PUTS("┬╠┴├╦ ╦┼┘╙ ╤╫ ╥╘ ╒╔╧ @*");
- PUTS(" NOTES -> GA CD FGA CD");
- PUTS(" ## ## ### ##");
- PUTCHAR('\N');
- PUTS("╫╚╔╘┼ ╦┼┘╙ ┴╙─╞╟╚╩╦╠:;=");
- PUTS(" NOTES -> ABCDEFGABCDE");
- PUTCHAR('\N');
- PUTCHAR('\N');
- PUTS(" ┬EGIN NOW. ┼NJOY!");
- PUTCHAR('\N');
- PUTS(" ╨RESS <X> TO EXIT.");
- ▌
-
- MOPUP()
- █
- CHAR C, DMY;
-
- SYS(SEIRTN, &DMY, &DMY, &DMY); /* DISABLE INTERUPTS */
- C = PEEK(╒╙╥┴─1); /* RESTORES */
- POKE(├╔╬╓1, C); /* TO */
- C = PEEK(╒╙╥┴─2); /* ORIGINAL */
- POKE(├╔╬╓2, C); /* VECTORS */
- SYS(CLIRTN, &DMY, &DMY, &DMY); /* ENABLE INTERRUPTS */
- CLSID(); /* ZAP ╙╔─'S REGISTERS */
- ▌
- /* END */