void gem_main(void) { WORD i; sh_rdinf(); /* get start of emudesk.inf */ if (!gl_changerez) /* can't be here because of rez change, */ process_inf1(); /* so see if .inf says we need to change rez */ if (gl_changerez) { switch(gl_changerez) { #if CONF_WITH_ATARI_VIDEO case 1: /* ST(e) or TT display */ Setscreen(-1L,-1L,gl_nextrez-2,0); initialise_palette_registers(gl_nextrez-2,0); break; #endif #if CONF_WITH_VIDEL case 2: /* Falcon display */ Setscreen(-1L, -1L, FALCON_REZ, gl_nextrez); initialise_palette_registers(FALCON_REZ,gl_nextrez); break; #endif } gsx_wsclear(); /* avoid artefacts that may show briefly */ /* * resolution change always resets the default drive to the * boot device. TOS3 issues a Dsetdrv() when this happens, * which Hatari's GEMDOS drive emulation uses to keep track * of the current drive. we do the same. */ dos_sdrv(bootdev); } ml_ocnt = 0; gl_changerez = FALSE; mn_init(); /* initialise variables for menu_register() */ num_accs = count_accs(); /* puts ACC names in acc_name[] */ D.g_acc = NULL; if (num_accs) D.g_acc = dos_alloc(num_accs*sizeof(AESPROCESS)); if (D.g_acc) memset(D.g_acc,0x00,num_accs*sizeof(AESPROCESS)); else num_accs = 0; totpds = num_accs + 2; disable_interrupts(); set_aestrap(); /* set trap#2 -> aestrap */ /* init event recorder */ gl_recd = FALSE; gl_rlen = 0; gl_rbuf = NULL; /* link up all the evb's to the event unused list */ eul = NULL; for (i = 0; i < 2; i++) ev_init(D.g_int[i].a_evb,EVBS_PER_PD); for (i = 0; i < num_accs; i++) ev_init(D.g_acc[i].a_evb,EVBS_PER_PD); /* initialize sync blocks */ wind_spb.sy_tas = 0; wind_spb.sy_owner = NULL; wind_spb.sy_wait = 0; /* * init processes - TODO: should go in gempd or gemdisp. */ /* initialize list and unused lists */ nrl = drl = NULL; dlr = zlr = NULL; fph = fpt = fpcnt = 0; /* init initial process */ for(i=totpds-1; i>=0; i--) { rlr = pd_index(i); if (i < 2) { rlr->p_uda = &D.g_int[i].a_uda; rlr->p_cda = &D.g_int[i].a_cda; } else { rlr->p_uda = &D.g_acc[i-2].a_uda; rlr->p_cda = &D.g_acc[i-2].a_cda; } rlr->p_qaddr = rlr->p_queue; rlr->p_qindex = 0; memset(rlr->p_name, ' ', AP_NAMELEN); rlr->p_appdir[0] = '\0'; /* by default, no application directory */ /* if not rlr then initialize his stack pointer */ if (i != 0) rlr->p_uda->u_spsuper = &rlr->p_uda->u_supstk; rlr->p_pid = i; rlr->p_stat = 0; } curpid = 0; rlr->p_pid = curpid++; rlr->p_link = NULL; /* end of process init */ /* restart the tick */ enable_interrupts(); /* * screen manager process init. this process starts out owning the mouse * and the keyboard. it has a pid == 1 */ gl_mowner = ctl_pd = iprocess("SCRENMGR", ctlmgr); /* * run the accessories and the desktop until termination * (for shutdown or resolution change) */ aes_run_rom_program(accdesk_start); /* restore previous trap#2 address */ disable_interrupts(); unset_aestrap(); enable_interrupts(); if (D.g_acc) dos_free((LONG)D.g_acc); }
void sh_ldapp() { WORD ret, badtry, retry; SHELL *psh; psh = &sh[rlr->p_pid]; strcpy(sh_apdir, D.s_cdir); /* initialize sh_apdir */ badtry = 0; /* Set default DESKTOP if there isn't any yet: */ if(psh->sh_desk[0] == 0) { strcpy(&psh->sh_desk[0], DEF_DESKTOP); strcpy(&psh->sh_cdir[0], &D.s_cdir[0]); } do { sh_chdef(psh); /* set up so that we */ /* will exec the */ /* default next time */ /* unless the */ /* application does */ /* a set command */ psh->sh_dodef = TRUE; /* init graph/char mode */ sh_chgrf(psh); if (gl_shgem) { wm_start(); ratinit(); } /* fix up/parse cmd tail*/ sh_fixtail(psh->sh_fullstep == 2); sh_draw(D.s_cmd, 0, 0); /* redraw the desktop */ /* clear his desk field */ desk_tree[rlr->p_pid] = 0x0L; /* exec it */ /* handle bad try msg */ if (badtry) { ret = fm_show(badtry, NULLPTR, 1); if (badtry == ALNOFIT) break; badtry = 0; } do { retry = FALSE; Dprintf(("sh_ldapp: Starting %s\n", D.s_cmd)); if(psh->sh_isdef && strcmp(D.s_cmd, DEF_DESKTOP) == 0) { /* Start the ROM desktop: */ sh_show(D.s_cmd); p_nameit(rlr, sh_name(&D.s_cmd[0])); p_setappdir(rlr, D.s_cmd); aes_run_rom_program(deskstart); } #if WITH_CLI != 0 else if(strcmp(D.s_cmd, "EMUCON") == 0) { /* start the EmuCON shell: */ aes_run_rom_program(coma_start); } #endif else if ( sh_find(D.s_cmd) ) { /* Run a normal application: */ sh_show(D.s_cmd); p_nameit(rlr, sh_name(&D.s_cmd[0])); p_setappdir(rlr, D.s_cmd); if (psh->sh_fullstep == 0) { dos_exec(0, D.s_cmd, ad_stail, ad_envrn); /* Run the APP */ /* If the user ran an alternative desktop and quitted it, return now to the default desktop: (experimental) */ if(psh->sh_isdef && psh->sh_dodef) { Dprintf(("sh_ldapp: Returning to ROM desktop!\n")); strcpy(&psh->sh_desk[0], DEF_DESKTOP); strcpy(&psh->sh_cdir[0], &D.s_cdir[0]); } } else if (psh->sh_fullstep == 1) { dos_exec(0, D.s_cmd, ad_stail, ad_envrn); DOS_ERR = psh->sh_doexec = FALSE; } if (DOS_ERR) badtry = (psh->sh_isdef) ? ALNOFIT : AL08ERR; /* 02/11/86 LKW begin */ if (wind_spb.sy_owner == rlr) /* if he still owns screen*/ unsync(&wind_spb); /* then take him off. */ /* 02/11/86 LKW end */ } else { if ( (gl_shgem) && (psh->sh_isdef) ) { ret = fm_show(ALOKDESK, NULLPTR, 1); if (ret == 1) retry = TRUE; else retry = psh->sh_doexec = FALSE; } else badtry = AL18ERR; } } while (retry && !badtry); desk_tree[rlr->p_pid] = 0x0L; /* clear his desk field */ } while(psh->sh_doexec && !gl_changerez); }