#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(void){ u8 notes_ix = acc & 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) MOV (acc, n) CALL (g) SWAP (acc) AND (acc, 0x1) MOV (sample, acc) { u8 tmp = i2<<3 | i1>>5;//TODO MOV (acc, tmp) XOR (acc, n) CALL (g) } //tmp SR (acc) AND (acc, i2) SR (acc) AND (acc, 3) ADD (sample, acc) { u8 tmp2 = (i2<<5|i1>>3)%3;//TODO MOV (acc, tmp2) ADD (acc, n) CALL (g) } //tmp2 SR (acc) SR (acc) { u8 tmp1 = i2/6; AND (acc, tmp1) } //tmp1 AND (acc, 3) ADD (sample, acc) MOV (acc, n) { u8 tmp3 = (i2<<6|i1>>2)%3; SUB (acc, tmp3) } // tmp3 ADD (acc, 8) CALL (g) 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 } }