home *** CD-ROM | disk | FTP | other *** search
/ 8bitfiles.net/archives / archives.tar / archives / genie-commodore-file-library / C64-128Toolkit / SID-DEMO.ARC / SIDDEMO.C
Encoding:
C/C++ Source or Header  |  2019-04-13  |  8.0 KB  |  247 lines

  1. /*
  2.  *   SIDDEMO.C, ╓ERSION 2
  3.  *
  4.  *   ╞OR THE ├-64 AND ├-╨OWER. 
  5.  *
  6.  *   BY: ╙TEVE ╥EISMAN
  7.  *       50 ─AVID ├OURT
  8.  *       ─AYTON, ╬╩ 08810
  9.  *       ATTMAIL!SREISMAN
  10.  *
  11.  *   ╨ROGRAM IS BASED ON:
  12.  *       "═╒╙╔├2"
  13.  *       ┴╚╧┘ ═AGAZINE, ╩UNE 1986
  14.  *
  15.  *   ╒NLIKE VERSION 1, THIS DEMO CONSISTANTLY
  16.  *   PLAYS FULL, CRISP NOTES.
  17.  *   
  18.  *   ╨ROGRAM DEMONSTRATES SEVERAL DISCRETE 
  19.  *   CONCEPTS WHILE HARNESSING A POWERFUL
  20.  *   FEATURE OF THE ├-64; SOUND GENERATION.
  21.  *   
  22.  *   1.  ╞ROM ├, THE ├64'S NORMAL INTERRUPT PROCESSING
  23.  *       IS DYNAMICALLY ALTERED TO PERFORM AN INDEPENDENT
  24.  *       MACHINE LANGUAGE BASED ROUTINE.  ╔N THIS CASE,
  25.  *       A TIGHT 6502 ROUTINE TIMES EACH NOTE'S PLAY
  26.  *       WITHOUT REGARD TO ANYTHING ELSE GOING ON.
  27.  *   
  28.  *   2.  ╘HE KEYBOARD IS ACCESSED DIRECTLY AND WITHOUT
  29.  *       ANY COSTLY OVERHEAD.  ╟RANTED THAT THE KEY'S SCAN
  30.  *       CODE ONLY IS RETURNED, BUT THE METHOD HAS MANY
  31.  *       PRACTICAL APPLICATIONS FOR OTHER SOFTWARE.
  32.  *   
  33.  *   3.  ╘HE EMPLOYED ═╠ ROUTINES, UNLIKE THE EARLIER VERSION
  34.  *       OF THIS PROGRAM, ARE STATIONARY.  ╘HEY ARE NO LONGER
  35.  *       POKED ELSEWHERE IN ╥┴═.  ╘HEIR ADDRESSES ARE CULLED
  36.  *       FOR SYS() CALLS USING POINTERS AND INDIRECTION.
  37.  *   
  38.  *   4.  ╠ASTLY, THE PROGRAM EMPLOYS THE GOOD SENSE OF
  39.  *       CLEANING-UP AFTER ITSELF (THOUGH ONE LAST BUG
  40.  *       LINGERS ON HERE; YOU'LL SEE IT WHEN YOU END
  41.  *       PRACTICING YOUR TUNES).
  42.  *   
  43.  *   ┘OUR COMMENTS WILL BE APPRECIATED.  ─ROP ME A LINE AT
  44.  *   MY ADDRESS (LISTED ABOVE), OR THROUGH THE ╨╥╧-╠╔╬┼ BBS.
  45.  *   
  46.  *   ╚AVE FUN!
  47.  */
  48.  
  49. #INCLUDE <STDIO.H>
  50.  
  51. #DEFINE PEEK(X) *((CHAR *)X)
  52. #DEFINE POKE(X,Y) *((CHAR *)X)=Y
  53.  
  54. #DEFINE ╙╞─╪   0X├┬     /* ╦EYBOARD SCAN CODE TAKEN */
  55.                         /* FROM HERE.               */
  56.  
  57. #DEFINE ╘╔═┼╥  0X╞┬     /* ZERO-PAGE VARIABLE/FIELD */
  58.  
  59. #DEFINE ╒╙╥┴─1 0X311
  60. #DEFINE ╒╙╥┴─2 0X312
  61. #DEFINE ├╔╬╓1  0X314
  62. #DEFINE ├╔╬╓2  0X315
  63.  
  64. #DEFINE ╙╔─    0X─400
  65. #DEFINE ╞╥┼╠╧1 0X─400
  66. #DEFINE ╞╥┼╚╔1 0X─401
  67. #DEFINE ╨╫╠╧1  0X─402
  68. #DEFINE ╨╫╚╔1  0X─403
  69. #DEFINE ╓├╥┼╟1 0X─404
  70. #DEFINE ┴╘─├┘1 0X─405
  71. #DEFINE ╙╒╥┼╠1 0X─406
  72. #DEFINE ╙╔╟╓╧╠ 0X─418
  73.  
  74. /* ╦EYBOARD SCAN CODES FOR PROGRAM'S VALID KEYS.
  75.  */
  76. STATIC  CHAR MATRIX[] =
  77.          █62,10, 9,13,18,17,21,22,26,29,30,
  78.           34,33,37,38,42,45,46,50,49,53 ▌;
  79.  
  80. /* ╞REQUENCY TABLES FOR PIANO NOTES USED HEREIN
  81.  * ╞/┘/╔ - THE SID CHIP USED A 12-BIT VALUE FOR
  82.  *         A DESIRED FREQUENCY.  ╘HE HIFREQ VALUES
  83.  *         ARE PLACED INTO THE REQUIRED NYBBLE,
  84.  *         AND THE LOFREQ'S ARE PLACED AS WHOLE
  85.  *         BYTES.
  86.  */
  87. STATIC  CHAR HIFREQ[] =
  88.          █13,14,14,15,16,17,18,19,21,22,23,25,
  89.           26,28,29,31,33,35,37,39,42 ▌;
  90.  
  91. STATIC  CHAR LOFREQ[] =
  92.          █ 78,24,239,210,195,195,209,239,31,96,181,
  93.            30,156,49,223,165,135,134,162,223,62 ▌;
  94.  
  95. /* ╘HIS ═╠ IS USED TO TIME NOTE DURATION.
  96.  */
  97. STATIC  CHAR ML[] =
  98.          █
  99.           0X┴6,0X╞┬,      /* ╫┴╔╘  LDX ╘╔═┼╥      */
  100.           0X├┴,           /*       DEX            */
  101.           0X─0,0X07,      /*       BNE ╥╘╥╬       */
  102.           0X┴9,0X40,      /*       LDA #64        */
  103.           0X8─,0X04,0X─4, /*       STA ╓├╥┼╟1     */
  104.           0X┴2,0X00,      /*       LDX #0         */
  105.           0X86,0X╞┬,      /* ╥╘╥╬  STX ╘╔═┼╥      */
  106.           0X6├,0X11,0X03, /* ╩═╨   JMP (╒╙╥┴─1/2) */
  107.           0X00            /*       BRK            */
  108.          ▌;
  109.  
  110. /* ╞OLLOWING ARE TWO EXTREMELY SHORT ML ROUTINES
  111.  * CALLED WITH SYS() TO DISABLE AND THEN RE-ENABLE
  112.  * THE 64'S INTERRUPT MACHINE.
  113.  * ╘HE POINTER FIELDS ARE USED TO SYS() TO THE ML.
  114.  */
  115.  
  116. STATIC  CHAR SEI[] =█ 0X78,0X60 ▌;
  117. STATIC  CHAR CLI[] =█ 0X58,0X60 ▌;
  118.         CHAR *SEIRTN, *CLIRTN, *MLRTN;
  119.  
  120. MAIN()
  121. REGISTER INT   I;
  122. STATIC   CHAR  C;
  123. STATIC   CHAR  CC;
  124.          CHAR  DMY;
  125. UNSIGNED INT   MLñADR, MLñLO, MLñHI;
  126.          
  127.          /* ╙ET UP INTERRUPT VECTOR.
  128.           *
  129.           * ╞IRST, GET CURRENT ╔╥╤ VECTOR BYTE
  130.           * AND INSERT INTO ╒╙┼╥ VECTOR. 
  131.           */
  132.          C = PEEK(├╔╬╓1);
  133.          POKE(╒╙╥┴─1, C);
  134.  
  135.          C = PEEK(├╔╬╓2);
  136.          POKE(╒╙╥┴─2, C);
  137.  
  138.          /* ╥ETRIEVE AND CONVERT ADDRESS
  139.           * FOR ARITHMETIC OPERATIONS.
  140.           * ╥ESULTS ARE USED FOR SETTING
  141.           * A NEW ├╔╬╓ VECTOR.
  142.           */
  143.          SEIRTN = &SEI[0];
  144.          CLIRTN = &CLI[0];
  145.          MLRTN  = &ML[0];
  146.          MLñADR = MLRTN;
  147.          MLñHI  = MLñADR / 256;
  148.          MLñLO  = MLñADR - (MLñHI * 256);
  149.  
  150.          /* ╥ESET ├╔╬╓ FOR NEW VECTOR.
  151.           */
  152.          SYS(SEIRTN, &DMY, &DMY, &DMY);
  153.          POKE(├╔╬╓1, MLñLO);
  154.          POKE(├╔╬╓2, MLñHI);
  155.          SYS(CLIRTN, &DMY, &DMY, &DMY);
  156.  
  157.          /* ╔NITIALIZE AND LOAD SID FOR DEMO.
  158.           */
  159.          POKE(╘╔═┼╥, 60);
  160.          CLSID();
  161.          POKE( ╙╔╟╓╧╠, 15 );
  162.          POKE( ┴╘─├┘1,  9 );
  163.          POKE( ╙╒╥┼╠1,  0 );
  164.          POKE( ╨╫╚╔1,   0 );
  165.          POKE( ╨╫╠╧1, 255 );
  166.          POKE( ╓├╥┼╟1, 64 );
  167.  
  168.          MAPOUT();         /* DISPLAY INSTRUCTIONS      */
  169.          CC = 0X00;        /* INITIALIZE ╠AST-╦EY-╚IT   */
  170.  
  171.          /* ═AINLINE ROUTINE; PLAY THE KEYS.
  172.           * ┼SCAPE BY PRESSING 'X';
  173.           */
  174. ╠╧╧╨:
  175.          C = PEEK(╙╞─╪);   /* GET SCAN CODE             */
  176.          IF(C == 0X40)█    /* 0X40 = '╬O ╦EY ╨RESSED    */
  177.              CC = 0X00;    /* UPDATE ╠AST-╦EY-╚IT       */
  178.              GOTO ╠╧╧╨;
  179.          ▌
  180.          IF(C == 0X17)█    /* 0X17 IS SCAN CODE FOR 'X' */
  181.              MOPUP();
  182.              EXIT(0);
  183.          ▌
  184.          IF(C == CC)                   /* KEY MUST BE LIFTED ..  */
  185.              GOTO ╠╧╧╨;                /* .. TO PLAY IT AGAIN    */
  186.          FOR(I=0; I<21; I++)█          /* SEARCH FOR A VALID KEY */
  187.              IF(C == MATRIX[I])█       /* GOT ONE; PLAY IT       */
  188.                  CC = C;               /* UPDATE ╠AST-╦EY-╚IT    */
  189.                  POKE(╘╔═┼╥,  60);
  190.                  POKE(╓├╥┼╟1, 64);          /* TURN ╓OICE-1 OFF  */
  191.                  POKE(╞╥┼╚╔1, HIFREQ[I]);   /* ╙ET FREQUENCY     */
  192.                  POKE(╞╥┼╠╧1, LOFREQ[I]);
  193.                  POKE(╓├╥┼╟1, 65);          /* TURN ╓OICE-1 ON   */
  194.                  GOTO ╠╧╧╨;
  195.              ▌
  196.          ▌
  197.          GOTO ╠╧╧╨;
  198.  
  199. CLSID()
  200. REGISTER INT I;
  201.   
  202.          FOR(I = 0; I < 24; I++)
  203.              POKE(╙╔─ + I, 0);
  204.  
  205. MAPOUT()
  206.          PUTCHAR(147);
  207.          PUTCHAR('\N');
  208.          PUTCHAR('\N');
  209.          PUTS(" ╙╔──┼═╧.├ -- ┴ DEMO PIANO PLAYER");
  210.          PUTCHAR('\N');
  211.          PUTCHAR('\N');
  212.          PUTCHAR('\N');
  213.          PUTS("          ╒SE INDICATED KEYS.");
  214.          PUTCHAR('\N');
  215.          PUTCHAR('\N');
  216.          PUTS("┬╠┴├╦ ╦┼┘╙ ╤╫ ╥╘ ╒╔╧ @*");
  217.          PUTS("  NOTES -> GA CD FGA CD");
  218.          PUTS("           ## ## ### ##");
  219.          PUTCHAR('\N');                   
  220.          PUTS("╫╚╔╘┼ ╦┼┘╙  ┴╙─╞╟╚╩╦╠:;=");
  221.          PUTS("  NOTES ->  ABCDEFGABCDE");  
  222.          PUTCHAR('\N');
  223.          PUTCHAR('\N');
  224.          PUTS("          ┬EGIN NOW.  ┼NJOY!");
  225.          PUTCHAR('\N');
  226.          PUTS("          ╨RESS <X> TO EXIT."); 
  227.  
  228. MOPUP()
  229. CHAR C, DMY;
  230.  
  231.          SYS(SEIRTN, &DMY, &DMY, &DMY);     /* DISABLE INTERUPTS       */
  232.          C = PEEK(╒╙╥┴─1);                  /* RESTORES                */
  233.          POKE(├╔╬╓1, C);                    /*        TO               */
  234.          C = PEEK(╒╙╥┴─2);                  /*         ORIGINAL        */
  235.          POKE(├╔╬╓2, C);                    /*                VECTORS  */
  236.          SYS(CLIRTN, &DMY, &DMY, &DMY);     /* ENABLE INTERRUPTS       */
  237.          CLSID();                           /* ZAP ╙╔─'S REGISTERS     */
  238. /* END */
  239.