X-Git-Url: http://4ch.mooo.com/gitweb/?a=blobdiff_plain;f=src%2Flib%2F16_tail.c;h=4d6040cb640fcbb51a9907bf805aeb7998b76c3d;hb=adefd71cb8a3e70da10523e4eb97e442a655a6cd;hp=d7a86f56e9a5f8b981c2a75575c0051ed8138482;hpb=63fe6f02c681d5afb8c32f6eadaacfc5f67d27cc;p=16.git diff --git a/src/lib/16_tail.c b/src/lib/16_tail.c index d7a86f56..4d6040cb 100755 --- a/src/lib/16_tail.c +++ b/src/lib/16_tail.c @@ -1,5 +1,5 @@ /* Project 16 Source Code~ - * Copyright (C) 2012-2016 sparky4 & pngwen & andrius4669 & joncampbell123 & yakui-lover + * Copyright (C) 2012-2017 sparky4 & pngwen & andrius4669 & joncampbell123 & yakui-lover * * This file is part of Project 16. * @@ -20,7 +20,7 @@ * */ /* - * 16 library + * 16 tail library */ #include "src/lib/16_tail.h" @@ -36,54 +36,19 @@ ========================== */ -void Startup16(global_game_variables_t *gvar) +void Startup16 (global_game_variables_t *gvar) { -#ifdef __WATCOMC__ - start_timer(gvar); - - // DOSLIB: check our environment - probe_dos(); - - // DOSLIB: what CPU are we using? - // NTS: I can see from the makefile Sparky4 intends this to run on 8088 by the -0 switch in CFLAGS. - // So this code by itself shouldn't care too much what CPU it's running on. Except that other - // parts of this project (DOSLIB itself) rely on CPU detection to know what is appropriate for - // the CPU to carry out tasks. --J.C. - cpu_probe(); - - // DOSLIB: check for VGA - if (!probe_vga()) { - printf("VGA probe failed\n"); - return; - } - // hardware must be VGA or higher! - if (!(vga_state.vga_flags & VGA_IS_VGA)) { - printf("This program requires VGA or higher graphics hardware\n"); - return; - } - - if (_DEBUG_INIT() == 0) { -#ifdef DEBUGSERIAL - printf("WARNING: Failed to initialize DEBUG output\n"); -#endif - } - _DEBUG("Serial debug output started\n"); // NTS: All serial output must end messages with newline, or DOSBox-X will not emit text to log - _DEBUGF("Serial debug output printf test %u %u %u\n",1U,2U,3U); - - textInit(); -#endif + gvar->video.VL_Started=0; + TL_VidInit(gvar); gvar->mm.mmstarted=0; gvar->pm.PMStarted=0; - MM_Startup(gvar); + StartupCAMMPM(gvar); #ifdef __WATCOMC__ #ifdef __DEBUG_InputMgr__ - if(!dbg_notest) + if(!dbg_nointest) #endif IN_Startup(gvar); #endif - PM_Startup(gvar); - PM_UnlockMainMem(gvar); - CA_Startup(gvar); } //=========================================================================== @@ -98,20 +63,83 @@ void Startup16(global_game_variables_t *gvar) ========================== */ -void Shutdown16(global_game_variables_t *gvar) +void Shutdown16 (global_game_variables_t *gvar) { - PM_Shutdown(gvar); #ifdef __WATCOMC__ #ifdef __DEBUG_InputMgr__ - if(!dbg_notest) + if(!dbg_nointest) #endif IN_Shutdown(gvar); +#endif + ShutdownCAMMPM(gvar); +#ifdef __WATCOMC__ + if(gvar->video.VL_Started) + VL_Shutdown (gvar);//VGAmodeX(0, 1, gvar); +#endif +} + +//=========================================================================== + +/* +========================== += += StartupCAMMPM += +========================== +*/ + +void StartupCAMMPM (global_game_variables_t *gvar) +{ +/* + MM_Startup (); // so the signon screen can be freed + + SignonScreen (); + + VW_Startup (); + IN_Startup (); + PM_Startup (); + PM_UnlockMainMem (); + SD_Startup (); + CA_Startup (); + US_Startup (); +*/ + MM_Startup(gvar); +#ifdef __16_PM__ + PM_Startup(gvar); +//???? PM_CheckMainMem(gvar); + PM_UnlockMainMem(gvar); +#endif + CA_Startup(gvar); +} + +//=========================================================================== + +/* +========================== += += ShutdownCAMMPM += +========================== +*/ + +void ShutdownCAMMPM (global_game_variables_t *gvar) +{ +/* + US_Shutdown (); + SD_Shutdown (); + PM_Shutdown (); + IN_Shutdown (); + VW_Shutdown (); + CA_Shutdown (); + MM_Shutdown () +*/ +#ifdef __16_PM__ + PM_Shutdown(gvar); #endif CA_Shutdown(gvar); MM_Shutdown(gvar); } - //=========================================================================== /* @@ -121,25 +149,25 @@ void Shutdown16(global_game_variables_t *gvar) = ==================== */ - -/*void ReadConfig(void) +#if 0 +void ReadConfig(void) { - int file; - SDMode sd; - SMMode sm; - SDSMode sds; + int file; +// SDMode sd; +// SMMode sm; +// SDSMode sds; - if ( (file = open(configname,O_BINARY | O_RDONLY)) != -1) + if ( (file = open(CONFIGNAME,O_BINARY | O_RDONLY)) != -1) { // // valid config file // - read(file,Scores,sizeof(HighScore) * MaxScores); +// read(file,Scores,sizeof(HighScore) * MaxScores); - read(file,&sd,sizeof(sd)); - read(file,&sm,sizeof(sm)); - read(file,&sds,sizeof(sds)); +// read(file,&sd,sizeof(sd)); +// read(file,&sm,sizeof(sm)); +// read(file,&sds,sizeof(sds)); read(file,&mouseenabled,sizeof(mouseenabled)); read(file,&joystickenabled,sizeof(joystickenabled)); @@ -157,7 +185,7 @@ void Shutdown16(global_game_variables_t *gvar) close(file); - if (sd == sdm_AdLib && !AdLibPresent && !SoundBlasterPresent) + /*if (sd == sdm_AdLib && !AdLibPresent && !SoundBlasterPresent) { sd = sdm_PC; sd = smm_Off; @@ -165,7 +193,7 @@ void Shutdown16(global_game_variables_t *gvar) if ((sds == sds_SoundBlaster && !SoundBlasterPresent) || (sds == sds_SoundSource && !SoundSourcePresent)) - sds = sds_Off; + sds = sds_Off;*/ if (!MousePresent) mouseenabled = false; @@ -180,7 +208,7 @@ void Shutdown16(global_game_variables_t *gvar) // // no config file, so select by hardware // - if (SoundBlasterPresent || AdLibPresent) +/* if (SoundBlasterPresent || AdLibPresent) { sd = sdm_AdLib; sm = smm_AdLib; @@ -196,7 +224,7 @@ void Shutdown16(global_game_variables_t *gvar) else if (SoundSourcePresent) sds = sds_SoundSource; else - sds = sds_Off; + sds = sds_Off;*/ if (MousePresent) mouseenabled = true; @@ -213,7 +241,7 @@ void Shutdown16(global_game_variables_t *gvar) SD_SetMusicMode (sm); SD_SetSoundMode (sd); SD_SetDigiDevice (sds); -}*/ +} /* @@ -224,20 +252,20 @@ void Shutdown16(global_game_variables_t *gvar) ==================== */ -/*void WriteConfig(void) +void WriteConfig(void) { - int file; + int file; - file = open(configname,O_CREAT | O_BINARY | O_WRONLY, + file = open(CONFIGNAME,O_CREAT | O_BINARY | O_WRONLY, S_IREAD | S_IWRITE | S_IFREG); if (file != -1) { - write(file,Scores,sizeof(HighScore) * MaxScores); +// write(file,Scores,sizeof(HighScore) * MaxScores); - write(file,&SoundMode,sizeof(SoundMode)); - write(file,&MusicMode,sizeof(MusicMode)); - write(file,&DigiMode,sizeof(DigiMode)); +// write(file,&SoundMode,sizeof(SoundMode)); +// write(file,&MusicMode,sizeof(MusicMode)); +// write(file,&DigiMode,sizeof(DigiMode)); write(file,&mouseenabled,sizeof(mouseenabled)); write(file,&joystickenabled,sizeof(joystickenabled)); @@ -250,15 +278,200 @@ void Shutdown16(global_game_variables_t *gvar) write(file,&buttonmouse,sizeof(buttonmouse)); write(file,&buttonjoy,sizeof(buttonjoy)); - write(file,&viewsize,sizeof(viewsize)); +// write(file,&viewsize,sizeof(viewsize)); write(file,&mouseadjustment,sizeof(mouseadjustment)); close(file); } -}*/ +} +#endif +//=========================================================================== + +/* +=================== += += FizzleFade += +=================== +*/ + +boolean FizzleFade (unsigned source, unsigned dest, unsigned width, unsigned height, unsigned frames, boolean abortable, global_game_variables_t *gvar) +{ + word p,pixperframe; + unsigned drawofs,pagedelta; + byte mask,maskb[8] = {1,2,4,8}; + unsigned x,y,frame; + long rndval; + word screenseg; +#ifdef __WATCOMC__ + unsigned esorig;//,q; +#endif + + pagedelta = dest-source; + rndval = 1; +#ifdef __WATCOMC__ + esorig = 0;// q = 16; +#endif + x = y = 0; + pixperframe = (dword)(gvar->video.page[0].width*gvar->video.page[0].height)/frames; + screenseg = SCREENSEG; + + IN_StartAck (gvar); + +// modexClearRegion(&(gvar->video.page[0]), 0, 0, gvar->video.page[0].width, gvar->video.page[0].height, 0); +// modexClearRegion(&(gvar->video.page[1]), 0, 0, gvar->video.page[0].width, gvar->video.page[0].height, 15); + +#ifdef __WATCOMC__ + __asm { + mov [esorig],es + } +#endif +// TimeCount= + frame=0; + do // while (1) + { + if (abortable && IN_CheckAck (gvar) ) + return true; + + __asm { + mov es,[screenseg] + } + + for (p=0;pwidth || y>height) +// if ((x>width || y>height) && (xvideo.ofs.ylookup[y]) + (x>>2); + drawofs = source+(y*gvar->video.page[0].stridew) + (x>>2); + + // + // copy one pixel + // + mask = x&3; + VGAREADMAP(mask); + mask = maskb[mask]; + VGAMAPMASK(mask); + + __asm { + mov di,[drawofs] + mov al,[es:di] + add di,[pagedelta] + mov [es:di],al + } + + if (rndval == 1) // entire sequence has been completed + return false; + } + frame++; +//-- while (TimeCountca.audiosegs[STARTMUSIC + i]) + { + MM_SetPurge(MEMPTRCONV gvar->ca.audiosegs[STARTMUSIC + i],3, gvar); + MM_SetLock(MEMPTRCONV gvar->ca.audiosegs[STARTMUSIC + i],false, gvar); + } +} + +//========================================================================== + + +/* +================= += += StartMusic += +================= +*/ + +void TL_StartMusic(global_game_variables_t *gvar) +{ + musicnames chunk; + + SD_MusicOff(); + chunk = 0;//++++songs[gamestate.mapon+gamestate.episode*10]; + +// if ((chunk == -1) || (MusicMode != smm_AdLib)) +//DEBUG control panel return; + +//++++ MM_BombOnError (false,gvar); +//++++ CA_CacheAudioChunk(STARTMUSIC + chunk, gvar); +//++++ MM_BombOnError (true,gvar); +//++++ if (gvar->mm.mmerror) +//++++ gvar->mm.mmerror = false; +//++++ else +//++++ { + MM_SetLock(MEMPTRCONV gvar->ca.audiosegs[STARTMUSIC + chunk],true, gvar); + SD_StartMusic((MusicGroup far *)gvar->ca.audiosegs[STARTMUSIC + chunk]); +//++++ } +} + /* ================== = @@ -274,9 +487,9 @@ void DebugMemory_(global_game_variables_t *gvar, boolean q) US_CPrint ("Memory Usage"); US_CPrint ("------------"); - US_Print ("Total :"); + US_Print ("Total :"); US_PrintUnsigned (mminfo.mainmem/1024); - US_Print ("k\nFree :"); + US_Print ("k\nFree :"); US_PrintUnsigned (MM_UnusedMemory()/1024); US_Print ("k\nWith purge:"); US_PrintUnsigned (MM_TotalFree()/1024); @@ -297,9 +510,131 @@ void DebugMemory_(global_game_variables_t *gvar, boolean q) #ifdef __WATCOMC__ //IN_Ack (); #endif - if(q) MM_ShowMemory (gvar); +// if(q) MM_ShowMemory (gvar); +} + +/* +=================== += += TestSprites += +=================== +*/ + +#if 0 +#define DISPWIDTH 110 +#define TEXTWIDTH 40 +void TestSprites(void) +{ + int hx,hy,sprite,oldsprite,bottomy,topx,shift; + spritetabletype far *spr; + spritetype _seg *block; + unsigned mem,scan; + + + VW_FixRefreshBuffer (); + US_CenterWindow (30,17); + + US_CPrint ("Sprite Test"); + US_CPrint ("-----------"); + + hy=PrintY; + hx=(PrintX+56)&(~7); + topx = hx+TEXTWIDTH; + + US_Print ("Chunk:\nWidth:\nHeight:\nOrgx:\nOrgy:\nXl:\nYl:\nXh:\nYh:\n" + "Shifts:\nMem:\n"); + + bottomy = PrintY; + + sprite = STARTSPRITES; + shift = 0; + + do + { + if (sprite>=STARTTILE8) + sprite = STARTTILE8-1; + else if (spritewidth);US_Print ("\n");PrintX=hx; + US_PrintUnsigned (spr->height);US_Print ("\n");PrintX=hx; + US_PrintSigned (spr->orgx);US_Print ("\n");PrintX=hx; + US_PrintSigned (spr->orgy);US_Print ("\n");PrintX=hx; + US_PrintSigned (spr->xl);US_Print ("\n");PrintX=hx; + US_PrintSigned (spr->yl);US_Print ("\n");PrintX=hx; + US_PrintSigned (spr->xh);US_Print ("\n");PrintX=hx; + US_PrintSigned (spr->yh);US_Print ("\n");PrintX=hx; + US_PrintSigned (spr->shifts);US_Print ("\n");PrintX=hx; + if (!block) + { + US_Print ("-----"); + } + else + { + mem = block->sourceoffset[3]+5*block->planesize[3]; + mem = (mem+15)&(~15); // round to paragraphs + US_PrintUnsigned (mem); + } + + oldsprite = sprite; + do + { + // + // draw the current shift, then wait for key + // + VWB_Bar(topx,hy,DISPWIDTH,bottomy-hy,WHITE); + if (block) + { + PrintX = topx; + PrintY = hy; + US_Print ("Shift:"); + US_PrintUnsigned (shift); + US_Print ("\n"); + VWB_DrawSprite (topx+16+shift*2,PrintY,sprite); + } + + VW_UpdateScreen(); + + scan = IN_WaitForKey (); + + switch (scan) + { + case sc_UpArrow: + sprite++; + break; + case sc_DownArrow: + sprite--; + break; + case sc_LeftArrow: + if (--shift == -1) + shift = 3; + break; + case sc_RightArrow: + if (++shift == 4) + shift = 0; + break; + case sc_Escape: + return; + } + + } while (sprite == oldsprite); + + } while (1); + + } +#endif + /* ========================== = @@ -310,8 +645,10 @@ void DebugMemory_(global_game_variables_t *gvar, boolean q) void ClearMemory (global_game_variables_t *gvar) { +#ifdef __16_PM__ PM_UnlockMainMem(gvar); - //snd +#endif + //sd MM_SortMem (gvar); } @@ -325,7 +662,7 @@ void ClearMemory (global_game_variables_t *gvar) void Quit (global_game_variables_t *gvar, char *error) { - //unsigned finscreen; + //unsigned finscreen; memptr screen=0; ClearMemory (gvar); @@ -346,7 +683,7 @@ void Quit (global_game_variables_t *gvar, char *error) if (error && *error) { - movedata((unsigned)screen,7,0xb800,0,7*160); + //movedata((unsigned)screen,7,0xb800,0,7*160); gotoxy (10,4); fprintf(stderr, "%s\n", error); gotoxy (1,8); @@ -372,6 +709,63 @@ void Quit (global_game_variables_t *gvar, char *error) //=========================================================================== +#ifdef __WATCOMC__ +// +// for mary4 (XT) +// this is from my XT's BIOS +// http://www.phatcode.net/downloads.php?id=101 +// +void turboXT(byte bakapee) +{ + __asm { + push ax + push bx + push cx + in al, 61h //; Read equipment flags + xor al, bakapee //; toggle speed + out 61h, al //; Write new flags back + + mov bx, 0F89h //; low pitch blip + and al, 4 //; Is turbo mode set? + jz @@do_beep + mov bx, 52Eh //; high pitch blip + + @@do_beep: + mov al, 10110110b //; Timer IC 8253 square waves + out 43h, al //; channel 2, speaker + mov ax, bx + out 42h, al //; send low order + mov al, ah //; load high order + out 42h, al //; send high order + in al, 61h //; Read IC 8255 machine status + push ax + or al, 00000011b + out 61h, al //; Turn speaker on + mov cx, 2000h + @@delay: + loop @@delay + pop ax + out 61h, al //; Turn speaker off + pop cx + pop bx + pop ax + } +} +#endif + +const char *word_to_binary(word x) +{ + static char b[17]; + int z; + + b[0] = '\0'; + for (z = 16; z > 0; z >>= 1) + { + strcat(b, ((x & z) == z) ? "1" : "0"); + } + return b; +} + const char *nibble_to_binary(nibble x) { static char b[9];