diff final_isi/fisitime.c @ 0:acb5694e93d9

Initial import.
author Matti Hamalainen <ccr@tnsp.org>
date Tue, 18 May 2010 04:25:44 +0300
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/final_isi/fisitime.c	Tue May 18 04:25:44 2010 +0300
@@ -0,0 +1,224 @@
+#include "fisimusa.h"
+
+#ifdef MSDOS
+  #include <dos.h>
+#endif
+
+#define NUMCH 3
+
+char cord=0,cpat=0,crow=0,drmt=0xff,drms=0;
+
+char auditype;
+
+int plrbeep[2];
+int musatempo=5;
+
+#ifdef MSDOS
+
+/***************** h00KiNG nEW iNTERRuPT hANDLeRs **************/
+
+#define setadlib adlib
+
+unsigned int taimeri;
+
+void interrupt int_8();
+void interrupt (*old_int8)();
+
+kellovauhti(char spiidi)
+{
+      disable();
+      outportb(0x43,0x36);
+      outportb(0x40,0x00);
+      outportb(0x40,spiidi);
+      enable();
+}
+
+timer_on()
+{   taimeri=0;
+
+    if(auditype){initsound();
+                 cpat=patord[0];}
+    disable();
+    old_int8=getvect(0x08);
+    setvect(0x08,int_8);
+    enable();
+    kellovauhti(64);
+}
+
+timer_off()
+{
+      disable();
+      setvect(0x08,old_int8);
+      enable();
+      kellovauhti(0);
+
+      if(auditype)initsound();
+}
+
+void interrupt int_8()
+{
+      taimeri++;
+      if (!(taimeri&3)) (*old_int8)(); else outport(0x20,0x20);
+      if(auditype)playtick();
+}
+
+/**********************************************************/
+/******************* pLAYVVERr RUTiNE ********************/
+
+char instru[2][11]={
+    0xa1,0xa1,0xff,0xff,0x0f,0x0f,0x03,0x03,0x01,0x00,0x00,  /* bass? */
+    0xa2,0xa2,0xff,0xff,0x0f,0x0f,0x03,0x03,0x01,0x00,0x00,  /* ohrgan */
+};
+
+adl_ldinstr(int kanava,int i)
+{
+    char*ins=instru[i];
+    char osotte[11] = {
+    0x20,0x23,0x60,0x63,0x80,0x83,0xe0,0xe3,0xc0,0x40,0x43 };
+      char *tmp=ins; char l;
+      for(l=0;l<11;l++) adlib(kanava+osotte[l],*tmp++);
+}
+
+initsound()
+{
+      int l;
+
+      if(auditype==1) nosound();
+
+      if(auditype==2){
+            for(l=0;l<244;l++) adlib(l,0);
+            adlib(0x01,0x20);
+	    adl_ldinstr(0,1);
+	    adl_ldinstr(1,1);
+	    adl_ldinstr(2,1);}
+
+}
+#endif
+
+int freku[12] = {
+		0x157,0x16b,0x181,0x198,0x1b0,0x1ca,
+		 0x1e5,0x202,0x220,0x241,0x263,0x287
+		 };
+char plst=0;
+
+/**********************
+ **********************/
+
+playtick()
+{
+      plst++;
+
+      #ifdef MSDOS
+
+      if(auditype==1){
+	      if(plst==musatempo/3){
+                  if (plrbeep[0]) sound(plrbeep[0]>>3);
+			      else
+			      if(plrbeep[0])sound(plrbeep[0]>>3);else nosound();
+			      }
+	    if(plst==musatempo/2){
+                  if (plrbeep[1]) sound(plrbeep[1]>>3);
+			      else
+			      if(plrbeep[2])sound(plrbeep[2]>>3);else nosound();
+			      }
+
+			      }
+
+      if (auditype==2){int l;for(l=0;l<NUMCH;l++)
+		if (plrbeep[l]<0xf0){
+			adlib(0x40+l,2);
+			adlib(0x43+l,1);}}
+
+      #endif
+
+      if (plst==musatempo) { uusinuotti(); plst=0; }
+}
+
+/*char ison[3]={1,1,1};*/
+char hvilk[3]={0xfe,0xfe,0xfe};
+
+int lizayz=0;
+
+uusinuotti()
+{
+      int l;
+      unsigned char mark,mkrl;
+
+      for(l=0;l<NUMCH;l++) {
+
+	    mkrl=mark=trax[cpat][l][crow];
+
+	    if(mark<0xf0)mkrl=mark+=lizayz;
+
+	    if (auditype==2) plrbeep[l]=mark;
+
+	    if(mark==0xfa){musatempo=8;lizayz=-16;}
+
+	    if (mark==0xfb)if(auditype==2){
+		  if(crow&1)mark=0xfe;else
+			    mark=hvilk[l];
+			    plrbeep[l]=mark;
+			    }
+
+	    if (mark==0xfe)
+	    #ifdef MSDOS
+	     {if(auditype==2){adlib(0x40+l,63);
+					     adlib(0x43+l,63);}
+					else plrbeep[l]=0;
+			      /*ison[l]=0;*/
+		}
+	    #else
+	        gbsound(l,0);
+	    #endif
+
+	    if (mark==0xfd) musatempo=16;
+	    if (mark==0xfc) musatempo=4;
+
+            if (mark<0xf0) {
+
+		if(mark==mkrl)hvilk[l]=mark;
+		if((mark&15)>=12)mark+=4;
+
+            #ifdef MSDOS
+
+            /*********  ADLiB ********/
+
+	     if(auditype==2){
+
+              int hum=(freku[mark&15])             /* note */
+                       |(32*256)|                  /* key on */
+		      (((mark&(255-15))-32) *64);  /* octave */
+
+              adlib(0xb0+l,hum>>8);
+              adlib(0xa0+l,hum&255);
+	      adlib(0x40+l,12);
+	      adlib(0x43+l,15);
+	      }
+
+            /******** iBM sPEAKER *****/
+
+              if(auditype==1){
+
+		plrbeep[l]=freku[mark&15];
+		plrbeep[l]<<=((( (mark&(255-15)) >>4)&15)-2);
+
+		/*
+		if (plrbeep[0]) sound(plrbeep[0]>>3);
+			   else if (plrbeep[1]) sound(plrbeep[1]>>3);
+					else nosound();*/
+
+		}
+
+            /*********************/
+
+            #else
+              gbsound(l,(mark&15)+((mark>>4)*12));
+            #endif
+
+      }       }
+
+     crow++;   if (crow==64) {
+                crow=0;cord++;
+                cpat=patord[cord];
+                if (cpat==99) { cord=0; cpat=patord[cord]; }}
+}