/*
runtime.c for illgol.c
*/
byte * trig_table = NULL;
byte * sin_routine = NULL;
byte * cos_routine = NULL;
int trig_installed = 0;
int trigtab[] =
{ 0, 24, 49, 73, 98, 122, 146, 170,
195, 219, 242, 266, 290, 313, 336, 359,
382, 405, 427, 449, 471, 492, 514, 534,
555, 575, 595, 615, 634, 653, 671, 689,
707, 724, 740, 757, 773, 788, 803, 817,
831, 844, 857, 870, 881, 893, 903, 914,
923, 932, 941, 949, 956, 963, 970, 975,
980, 985, 989, 992, 995, 997, 998, 999 };
void runtime_trig(void)
{
byte * l;
if (trig_installed) return;
trig_table = stalloc(128);
memcpy(trig_table, trigtab, 128);
l = g_lambda();
/* gen code */
/* PROC Sin
; al = unsigned 0-255 digital degrees
; returns cx = sin(al)
; sin(x) = sin(x+256) when x < 0 */
g_xor_ah_ah();
g_xor_bx_bx();
g_xor_dx_dx();
g_cmp_al(63);
g_ja(+17); /* ; sin(x) = tab(x) when 63 >= x >= 0 */
g_label(); g_mov_bl_al();
g_label(); g_shl_bl_1();
g_add_bx(caddr(trig_table));
g_mov_cx_BX();
g_or_dx_dx();
g_jz(+2);
g_neg_cx();
g_ret();
g_label(); /* ; sin(x) = tab(127-x) when 127 >= x >= 64 */
g_cmp_al(127);
g_ja(+7);
g_mov_bl(127);
g_sub_bx_ax();
g_jmp(-26);
g_label(); /* ; sin(x) = tab(x-128) * -1 when 191 >= x >= 128 */
g_cmp_al(191);
g_ja(+8);
g_sub_al(128);
g_mov_dx(0x8000);
g_jmp(-40);
g_label(); /* ; sin(x) = tab(255-x) * -1 when 255 >= x >= 192 */
g_mov_bl(255);
g_sub_bx_ax();
g_mov_dx(0x8000);
g_jmp(-48);
g_ret();
sin_routine = g_close_lambda(l);
l = g_lambda();
g_cmp_al(192);
g_jb(+7);
/* cos(x) = sin(x-192) when x >= 192 */
g_sub_al(192);
g_mov_bx(caddr(sin_routine));
g_jmp_bx();
/* cos(x) = sin(x+64) when x < 192 */
g_label();
g_add_al(64);
g_mov_bx(caddr(sin_routine));
g_jmp_bx();
cos_routine = g_close_lambda(l);
trig_installed = 1;
}
byte * hgr_routine = NULL;
byte * text_routine = NULL;
byte * hplot_routine = NULL;
byte * hline_routine = NULL;
byte * hindex_routine = NULL;
byte * hget_routine = NULL;
byte * hput_routine = NULL;
byte * hlay_routine = NULL;
int gfx_installed = 0;
void runtime_gfx(void)
{
byte * l;
if (gfx_installed) return;
l = g_lambda();
g_mov_ax(0x0013);
g_int(0x10);
g_mov_ax(0xA000);
g_mov_es_ax(); /* make es point to video ram */
g_ret();
hgr_routine = g_close_lambda(l);
l = g_lambda();
g_mov_ax(0x0003);
g_int(0x10);
g_mov_ax_ds();
g_mov_es_ax(); /* make es point to ds */
g_ret();
text_routine = g_close_lambda(l);
l = g_lambda();
/*
; ax = y coordinate
; bx = x coordinate
; cx = colour
; VGA[(py<<8)+(py<<6)+px]=color;
*/
g_mov_ah_al();
g_xor_al_al();
g_mov_dx_ax();
g_shr_ax_1();
g_shr_ax_1();
g_add_ax_dx();
g_add_ax_bx();
g_push_ax();
g_pop_di();
g_es(); g_mov_DI_cl();
g_ret();
hplot_routine = g_close_lambda(l);
l = g_lambda();
g_mov_ah_al();
g_xor_al_al();
g_mov_dx_ax();
g_shr_ax_1();
g_shr_ax_1();
g_add_ax_dx();
g_add_ax_bx();
g_push_ax();
g_pop_di();
g_ret();
hindex_routine = g_close_lambda(l);
l = g_lambda();
/*
col = 0; row = 0; done = 0;
while not done
{
copy es:di to cx
inc es:di; inc col;
if col == w
{
col = 0; es:di += (320 - w)
inc row;
if row == h done = 1;
}
}
*/
g_ret();
hget_routine = g_close_lambda(l);
gfx_installed = 1;
}