#include #include "fakeasm.h" typedef unsigned char u8; u8 i0, i1, i2; //MEM u8 n; //MEM u8 sample; //MEM u8 tmp_1; //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) MOV (acc, i2) SL (acc) SL (acc) SL (acc) MOV (tmp_1, acc) // fresh tmp_1: MOV (acc, i1) SWAP (acc) AND (acc, 0xf) SR (acc) OR (acc, tmp_1) // tmp_1 done. XOR (acc, n) CALL (g) 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) MOV (tmp_1, acc) // acc saved in tmp_1; fresh acc MOV (acc, i2) // shift-divide by six acc = i2/6;//TODO // end divide by six AND (acc, tmp_1) // acc restored from tmp_1 AND (acc, 3) ADD (sample, acc) MOV (acc, n) ADD (acc, 8) { u8 tmp3 = (i2<<6|i1>>2)%3; SUB (acc, tmp3) } // tmp3 CALL (g) SR (acc) MOV (tmp_1, acc) // acc saved in tmp_1; fresh acc // shift-divide by ten acc = i2/10;//TODO // end divide by ten AND (acc, tmp_1) // acc restored from tmp_1 AND (acc, 3) ADD (sample, acc) MOV (acc, sample) SWAP (acc) putchar(acc); INC (i0) i1 += !i0; // ADDC i1 i2 += !i1 && !i0; // ADDC i2 } }