comparison 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
comparison
equal deleted inserted replaced
-1:000000000000 0:acb5694e93d9
1 #include "fisimusa.h"
2
3 #ifdef MSDOS
4 #include <dos.h>
5 #endif
6
7 #define NUMCH 3
8
9 char cord=0,cpat=0,crow=0,drmt=0xff,drms=0;
10
11 char auditype;
12
13 int plrbeep[2];
14 int musatempo=5;
15
16 #ifdef MSDOS
17
18 /***************** h00KiNG nEW iNTERRuPT hANDLeRs **************/
19
20 #define setadlib adlib
21
22 unsigned int taimeri;
23
24 void interrupt int_8();
25 void interrupt (*old_int8)();
26
27 kellovauhti(char spiidi)
28 {
29 disable();
30 outportb(0x43,0x36);
31 outportb(0x40,0x00);
32 outportb(0x40,spiidi);
33 enable();
34 }
35
36 timer_on()
37 { taimeri=0;
38
39 if(auditype){initsound();
40 cpat=patord[0];}
41 disable();
42 old_int8=getvect(0x08);
43 setvect(0x08,int_8);
44 enable();
45 kellovauhti(64);
46 }
47
48 timer_off()
49 {
50 disable();
51 setvect(0x08,old_int8);
52 enable();
53 kellovauhti(0);
54
55 if(auditype)initsound();
56 }
57
58 void interrupt int_8()
59 {
60 taimeri++;
61 if (!(taimeri&3)) (*old_int8)(); else outport(0x20,0x20);
62 if(auditype)playtick();
63 }
64
65 /**********************************************************/
66 /******************* pLAYVVERr RUTiNE ********************/
67
68 char instru[2][11]={
69 0xa1,0xa1,0xff,0xff,0x0f,0x0f,0x03,0x03,0x01,0x00,0x00, /* bass? */
70 0xa2,0xa2,0xff,0xff,0x0f,0x0f,0x03,0x03,0x01,0x00,0x00, /* ohrgan */
71 };
72
73 adl_ldinstr(int kanava,int i)
74 {
75 char*ins=instru[i];
76 char osotte[11] = {
77 0x20,0x23,0x60,0x63,0x80,0x83,0xe0,0xe3,0xc0,0x40,0x43 };
78 char *tmp=ins; char l;
79 for(l=0;l<11;l++) adlib(kanava+osotte[l],*tmp++);
80 }
81
82 initsound()
83 {
84 int l;
85
86 if(auditype==1) nosound();
87
88 if(auditype==2){
89 for(l=0;l<244;l++) adlib(l,0);
90 adlib(0x01,0x20);
91 adl_ldinstr(0,1);
92 adl_ldinstr(1,1);
93 adl_ldinstr(2,1);}
94
95 }
96 #endif
97
98 int freku[12] = {
99 0x157,0x16b,0x181,0x198,0x1b0,0x1ca,
100 0x1e5,0x202,0x220,0x241,0x263,0x287
101 };
102 char plst=0;
103
104 /**********************
105 **********************/
106
107 playtick()
108 {
109 plst++;
110
111 #ifdef MSDOS
112
113 if(auditype==1){
114 if(plst==musatempo/3){
115 if (plrbeep[0]) sound(plrbeep[0]>>3);
116 else
117 if(plrbeep[0])sound(plrbeep[0]>>3);else nosound();
118 }
119 if(plst==musatempo/2){
120 if (plrbeep[1]) sound(plrbeep[1]>>3);
121 else
122 if(plrbeep[2])sound(plrbeep[2]>>3);else nosound();
123 }
124
125 }
126
127 if (auditype==2){int l;for(l=0;l<NUMCH;l++)
128 if (plrbeep[l]<0xf0){
129 adlib(0x40+l,2);
130 adlib(0x43+l,1);}}
131
132 #endif
133
134 if (plst==musatempo) { uusinuotti(); plst=0; }
135 }
136
137 /*char ison[3]={1,1,1};*/
138 char hvilk[3]={0xfe,0xfe,0xfe};
139
140 int lizayz=0;
141
142 uusinuotti()
143 {
144 int l;
145 unsigned char mark,mkrl;
146
147 for(l=0;l<NUMCH;l++) {
148
149 mkrl=mark=trax[cpat][l][crow];
150
151 if(mark<0xf0)mkrl=mark+=lizayz;
152
153 if (auditype==2) plrbeep[l]=mark;
154
155 if(mark==0xfa){musatempo=8;lizayz=-16;}
156
157 if (mark==0xfb)if(auditype==2){
158 if(crow&1)mark=0xfe;else
159 mark=hvilk[l];
160 plrbeep[l]=mark;
161 }
162
163 if (mark==0xfe)
164 #ifdef MSDOS
165 {if(auditype==2){adlib(0x40+l,63);
166 adlib(0x43+l,63);}
167 else plrbeep[l]=0;
168 /*ison[l]=0;*/
169 }
170 #else
171 gbsound(l,0);
172 #endif
173
174 if (mark==0xfd) musatempo=16;
175 if (mark==0xfc) musatempo=4;
176
177 if (mark<0xf0) {
178
179 if(mark==mkrl)hvilk[l]=mark;
180 if((mark&15)>=12)mark+=4;
181
182 #ifdef MSDOS
183
184 /********* ADLiB ********/
185
186 if(auditype==2){
187
188 int hum=(freku[mark&15]) /* note */
189 |(32*256)| /* key on */
190 (((mark&(255-15))-32) *64); /* octave */
191
192 adlib(0xb0+l,hum>>8);
193 adlib(0xa0+l,hum&255);
194 adlib(0x40+l,12);
195 adlib(0x43+l,15);
196 }
197
198 /******** iBM sPEAKER *****/
199
200 if(auditype==1){
201
202 plrbeep[l]=freku[mark&15];
203 plrbeep[l]<<=((( (mark&(255-15)) >>4)&15)-2);
204
205 /*
206 if (plrbeep[0]) sound(plrbeep[0]>>3);
207 else if (plrbeep[1]) sound(plrbeep[1]>>3);
208 else nosound();*/
209
210 }
211
212 /*********************/
213
214 #else
215 gbsound(l,(mark&15)+((mark>>4)*12));
216 #endif
217
218 } }
219
220 crow++; if (crow==64) {
221 crow=0;cord++;
222 cpat=patord[cord];
223 if (cpat==99) { cord=0; cpat=patord[cord]; }}
224 }