? stack 10*1024 // 20k stack ? include "WRITE.H--" ? include "FILE.H--" // include readfile() and writefile() ? include "PORTS.H--" ? include "STRING.H--" ? include "DOS.H--" ? include "MOUSE.H--" ? include "KEYCODES.H--" ? include "VGA.H--" ? include "VIDEO.H--" // include video mode values ? define CLEARCOLOR 0 // transparent color for icons ? define MAXB 4*4*256-512 ? define MAXBUF 16*1024 // Most of this works fine as it is thus far, after some // corrections in the malloc equivalent MEMGET division, // but I'm quite sure its possible that my array indexing, // though copied from the maker of sphinx c, contains // pointer hazards, knowing that segments are mod 16. byte b[MAXB], bo[MAXB], bo2[MAXB], tc, co, c1,c2,c3, offset; word w1,w2; int i,j,k,k1,k2,k3,o,p, sammax; int x1,x2,x3, y1,y2,y3, z1,z2,z3,z4, u1,u2,u3; long l1,l2,l3; int choice, lastset, sap, maxcomp; char ss[128]; word buf; int v[64], v1[64], v2[64]; word x,y; /* global variable for mouse pointer x and y coordinates */ byte buttons; /* global variable mouse button status */ byte oldbuttons; void getmouse () {@ GETMOUSEXY(); y = DX; buttons = BL; x = CX /2; /* adjust x after so as not to undefine the regs */ } clearm(int m) { i = 0; do { BX=i; b[BX]= 128; bo[BX]= 128; bo2[BX]= 128; i++; } while (i= 10) k1=k1+65-10; else k1=k1+48; WRITE(k1); if (k2 >= 10) k2=k2+65-10; else k2=k2+48; WRITE(k2); } word readsamples() { k1=PARAMCOUNT(); if (k1 != 1) { WRITESTR("Use: zds "); return(-1); } strcpy(#ss,PARAMSTR(0)); WRITESTR("In "); WRITESTR(#ss); WRITESTR(",len "); w2 = b; k1 = readfile(#ss,buf,0,MAXBUF); WRITEINT(k1-8); WRITESTR(" "); if (k1 <= 0) return(-1); i=7;j=0;sammax = k1-8; k3 = 4*1024; k3 -= 0*256; // Now overwrites possible stack and variable space k3 -= 0; k3 = MAXB; offset = 0x80; // add 128 to make positive numbers do { if (i >= k1){ sammax = j-1; return(0); } BX = i; ES=buf; AL = ESBYTE[BX]; BX = j; b[BX] = AL; i++; j++; } while (j< k3); // only fill 4k - stack + var space sammax = j; return(0); } fillz80noprint(int m) { // WRITESTR("#=");WRITEINT(m); i = 0; OUTPORTB(0, , ,0x37A); // start DMA cycle WAITVSYNC(); i = 0 ; do { i++; } while (i < 1000); // Give the dma unit time WAITVSYNC(); WAITVSYNC(); i = 0; do { BX=i; // tc=bo[BX]; tc=bo2[BX]; if (i<-1) {WRITEINT(tc);WRITESTR(" "); } OUTPORTB(tc, , ,0x378); k = tc; OUTPORTB(0, , ,0x37A); OUTPORTB(1, , ,0x37A); i++; } while (i=m) return; } while (j255) y3 = 255; if (y3 < 0 ) y3 = 0; BX = i; bo2[BX] = y3; i++; } while (i < MAXB-1); /* 7005 FOR J = 0 TO 14 7010 FOR I = 0 TO 255 : K=K+1-.15*SIN((I+256*J)/ 96): F =2.2+1*K/ ( 512*1.5) : FF=-(1!+K/ 780) : FF=-(1.35+1) 7020 A = A + ((PEEK(&H7000 + I) + 2*PEEK(&H7000 + I + 1) + PEEK(&H7000 + I - 1) ) / 4 - A) / F + (D - A) / (F*FF/2) 7030 B = B + (A - B) / F 7035 C = C + (B - C) / F 7040 D = D + (C - D) / F 7045 PSET (I, 349 - D ) 7055 IF D<0 THEN POKE &H7800+I+256*J,0 ELSE IF D>255 THEN POKE &H7800+I+256*J,255 ELSE POKE &H7800+I+256*J,INT(D) 7060 NEXT I : PRINT K,F,FF 7065 NEXT J */ } envelope_sample(int m) { y1= 100-v[36]; y1=y1/1; // Attack rate y2= 100-v[38]; y2=y2/1; // Decay rate y3= v[40]; y3=y3/1; // Sustain level i=0; z1 = 32 * y1; // end of attack section z2 = z1; z2+= 32 * y2; // end of decay section z3 = m; if (z3 > MAXB) z3 = MAXB; if (z1 > z3) z1 = z3; if (z2 > z3) z2 = z3; do { BX = i; z3=bo[BX]; z3 -= 128; // y1= (10* i) / ((z2-z1)/10) x2 = i-0; x2 = x2 * 10; x3 = z1-0; x3 = x3 / 10; x3 = x3 + 1; x2 = x2 / x3; z3 = z3 * x2; z3 = z3 / 100; z3 += 128; BX = i; bo[BX] = z3; i++; } while (i < z1); do { BX = i; z3=bo[BX]; z3 -= 128; // y1= (10* i) / ((z2-z1)/10) x2 = i-z1; x2 = x2 * 10; x3 = z2-z1; x3 = x3 / 10; x3 = x3 + 1; x2 = x2 / x3; x1=100-y3; x2=x2*x1; x2 = x2 / 100 ; x2=100-x2; z3 = z3 * x2; z3 = z3 / 100; z3 += 128; BX = i; bo[BX] = z3; i++; } while (i < z2); do { BX = i; z3=bo[BX]; z3 -= 128; // y1= (10* i) / ((z2-z1)/10) x2 = y3; z3= z3 * x2; z3 = z3 / 100; z3 += 128; BX = i; bo[BX] = z3; i++; } while (i < MAXB); } make_sample(int m) { i=0;j=0; do { x1 = 0; k2 = 0; do { y1 = x1; y1 = y1 * 2; BX = y1; x2 = v1[BX]; y2 = v2[BX]; x3 = 0; if (x2 != 0) x3 =1; if (y2 != 0) x3 =2; if (x3 != 0) { x3 = x1+1; x3 = x3 * j; x3 = x3 % m; BX = x3; c1=b[BX]; k = c1; k-=128; z1 = x2; z2 = i/16; z1 = MAXB-16 ; z1 = z1/16; z1 = z1 - z2; z1 = z1 * x2; z3 = y2*z2; z1 = z1 + z3; z2 = MAXB-16; z2 = z2 / 16; z1 = z1 / z2; y1 = x1; y1 = y1 * 2; BX = y1; // v[BX] = z1; k = z1*k; k = k/100; k2 = k2 + k; } x1++; } while (x1 < 16); z3 = i % 200; /* lastset = 1; */ if (z3 == 0) { x1 = 0; GOTOXY(2,0); WRITESTR(" computing sample ");WRITEINT(i); WRITESTR(" "); } BX = i; k2+= 128; bo[BX] = k2; i++; j++; j = j % m; } while (i=m) return; } while (i= 21) return(); j = x1; x1 = x1 * 10; x1 = x1 + 2; // y1 = 190 - y; y2 = y; if (y < 90) y2 = 90; if (y > 190) y2 = 190; y1 = 191 - y2; y3 = y2 - 89; // if ( y1 < 0 ) y1 = 0; bar19( x1, y2, 8, y1, 1); bar19( x1, 89, 8, y3 , 0); y2 = 190 - y2; x1 = x /10; j = j*2; BX = j; v[BX] = y2; x1 = x1 + 1; if (lastset == 1) v1[BX] = y2; if (lastset == 2) v2[BX] = y2; /* GOTOXY(35,5); WRITEINT(y2); WRITESTR(" "); GOTOXY(35,6); WRITEINT(x1); WRITESTR(" "); */ } setbars() { i=0; do { j = i*2; x1 = 10 * i; x1 = x1 + 2; BX = j; y2 = v[BX]; if (y2 < 0) y2 = 0; if (y2 > 100) y2 = 100; y1 = 190 - y2; y3 = 101 - y2; y2 = y2 + 1; bar19( x1, y1, 8, y2, 1); bar19( x1, 89, 8, y3 , 0); i++; } while ( i<21 ); } drawsample() { GOTOXY(2,0); WAITVSYNC(); WRITESTR(" sample ");WRITEINT(sap); WRITESTR(" --> "); bar19(0,16,257,80,CLEARCOLOR); i = 1; z3 = 1; do { j = i-1; x1 = sap +j; x2 = sap +i; BX = x1; y1 = bo[BX]; BX = x2; y2 = bo[BX]; y1 = y1/4; y1= y1+16; y2 = y2/4; y2= y2+16; line19(j,y1,i,y2 ,4); BX = x1; y1 = bo2[BX]; BX = x2; y2 = bo2[BX]; y1 = y1/4; y1= y1+16; y2 = y2/4; y2= y2+16; line19(j,y1,i,y2 ,6); i = i+1; if (i >=256) z3 = 0; if (sap >= MAXB) z3 = 0; } while (z3 == 1); } mousetest() { SHOWMOUSE(); do { getmouse(); x1 = x / 10; j = x1*2; x1 = x1 + 1; BX = j; y2 = v[BX]; if (lastset == 1) y2 = v1[BX]; if (lastset == 2) y2 = v2[BX]; GOTOXY(35,2); WAITVSYNC(); WRITEINT(y2); WRITESTR(" "); GOTOXY(35,3); WRITEINT(x1); WRITESTR(" "); GOTOXY(35,5); WRITEINT(sap); WRITESTR(" "); GOTOXY(35,4); // WRITEINT(buttons); WRITESTR(" "); // WRITEINT(int co); WRITESTR(" "); GOTOXY(0,0); WRITESTR(" Send Reset First Second Prev Next Quit "); // 0 1 2 3 4 5 6 7 GETTEXTPOSITION(,0); if (buttons == 0) { if (oldbuttons == 1) { oldbuttons = 0; GOTOXY(35,2); WRITESTR(" "); if (lastset == 1) { maxcomp = 256; make_sample(sammax); sap = 0; drawsample(); maxcomp = MAXB; } } } if (buttons == 1) { if ( y < 8) { x1 = x; x1 = x1 / 48; // x1 = x1 / 6; choice = x1 + 1; // WRITEINT(choice); WRITESTR(" "); } else { if (oldbuttons == 0) { } dobars(); oldbuttons = 1; } }; if (choice == 2) { choice = 0; i=0; do { j = i * 2; BX = j; v[BX] = 0; if (lastset == 1) v1[BX] = 0; if (lastset == 2) v2[BX] = 0; i++; } while ( i < 21 ); setbars(); } if (choice == 1) { choice = 0; make_sample(sammax); fillz80noprint(MAXB); } if (choice == 3) { choice = 0; i=0; do { j = i * 2; BX = j; // if (lastset == 2) v2[BX] = v[BX]; v[BX] = v1[BX]; i++; } while ( i < 21 ); lastset = 1; setbars(); } if (choice == 4) { choice = 0; i=0; do { j = i * 2; BX = j; // if (lastset == 1) v1[BX] = v[BX]; v[BX] = v2[BX]; i++; } while ( i < 21 ); lastset = 2; setbars(); } if (choice == 5) { // Prev choice = 0; sap = sap -256; if (sap < 0) sap =0; drawsample(); } if (choice == 6) { // Next choice = 0; sap = sap +256; if (sap >= MAXB) sap =MAXB-256; drawsample(); } if (choice == 7) return(); } while ( 1 ); HIDEMOUSE(); } dovideo() { @ SETVIDEOMODE( vid_320x200_256 ); /* set video mode */ IF( @ GETVIDEOMODE() != vid_320x200_256 ) /* check if mode setting worked */ {WRITESTR("Unable to enter 320x200 256 colour video mode."); EXIT(-1);} clearscreen(); WAITVSYNC(); } initbars() { i=0; do { j = i * 2; BX = j; v[BX] = 0; v1[BX] = 0; v2[BX] = 0; i++; } while ( i < 64 ); lastset = 1; // start with first sap = 0; maxcomp = MAXB; } int main() { if (init() != 0) { WRITESTR("Error: couldn't allocate buffer"); EXIT(-1); }; dovideo(); clearm(MAXB); if (readsamples() == 0) { WRITESTR("#=");WRITEINT(sammax); initbars(); mousetest(); } OUTPORTB(1, , ,0x37A); EXIT(0); }