#include #include "fakeasm.h" typedef unsigned char u8; u8 i0, i1, i2; //MEM u8 n; //MEM u8 sample; //MEM u8 acc; //ACC u8 notes[] = { 0x84, 0x9d, 0xb0, 0x69, 0x9d, 0x84, 0x69, 0x58, 0x75, 0x8c, 0xb0, 0x69, 0x8c, 0x75, 0x69, 0x58 }; void g(u8 t){ u8 notes_ix = t & 0x7; if(3&i2) notes_ix += 8; u8 result = ((i1<<8|i0)*notes[notes_ix])>>8; // keep hi byte acc = result; } void main(void){ CLEAR (i0) CLEAR (i1) CLEAR (i2) for(;;) { /*n = i2<<2 | i1>>6;*/ MOV (n, i2) SL (n) SL (n) MOV (acc, i1) SWAP (acc) AND (acc, 0xf) SR (acc) SR (acc) OR (n, acc) g(n); //^TODO SWAP (acc) AND (acc, 0x1) MOV (sample, acc) { u8 tmp; tmp = i2<<3 | i1>>5; tmp ^= n; g(tmp); //^TODO } //tmp SR (acc) AND (acc, i2) SR (acc) AND (acc, 3) ADD (sample, acc) { u8 tmp2; tmp2 = (i2<<5|i1>>3)%3; tmp2 += n; g(tmp2); //^TODO } //tmp2 SR (acc) SR (acc) { u8 tmp1 = i2/6; AND (acc, tmp1) } //tmp1 AND (acc, 3) ADD (sample, acc) { u8 tmp2 = n; { u8 tmp3 = (i2<<6|i1>>2)%3; tmp2 -= tmp3; } // tmp3 tmp2 += 8; g(tmp2); } //tmp2 SR (acc) { u8 tmp1 = i2/10; AND (acc, tmp1) } //tmp1 AND (acc, 3) ADD (sample, acc) putchar(sample<<4); INC (i0) i1 += !i0; // ADDC i1 i2 += !i1 && !i0; // ADDC i2 } }