/* 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; }