From: sparky4 Date: Fri, 7 Apr 2017 19:44:03 +0000 (-0500) Subject: p16 is being worked on a bunch by me wwww [16_ca needs huge amounts of work and I... X-Git-Url: http://4ch.mooo.com/gitweb/?a=commitdiff_plain;h=5b7cb93f7c6a5a008302efff5f68023005a4daaf;p=16.git p16 is being worked on a bunch by me wwww [16_ca needs huge amounts of work and I should remember what needs to be done soon][OpenVGMFile needs to be ported to 16_snd.c]going to port rest of code to borland c some time so we can use the core components of id engine here [going to add 16_us.c eventually but the debug system and CA_ PM_ and MM_ usage is priority now]older zcroll renamed to xcroll][zcroll is now the pre menu game loop system with PROPER data usage with CAMMPM] MM_ShowMemory is quite buggy on real machines. i need to debug it and fix added a struct printer[gvar.mm is FUCKING HUGE 14402 bytes FAT\!]imfplay works better than vgmtest --- diff --git a/data/02.imf b/data/02.imf new file mode 100755 index 00000000..364012d4 Binary files /dev/null and b/data/02.imf differ diff --git a/data/searchin.imf b/data/searchin.imf new file mode 100755 index 00000000..da8f72a1 Binary files /dev/null and b/data/searchin.imf differ diff --git a/makefile b/makefile index 31a56d0d..9de0c726 100755 --- a/makefile +++ b/makefile @@ -89,6 +89,7 @@ DOSLIB_DOS=$(DOSLIBDIR)/hw/dos DOSLIB_VGA=$(DOSLIBDIR)/hw/vga DOSLIB_8250=$(DOSLIBDIR)/hw/8250 DOSLIB_8254=$(DOSLIBDIR)/hw/8254 +DOSLIB_8259=$(DOSLIBDIR)/hw/8259 DOSLIB_ADLIB=$(DOSLIBDIR)/hw/adlib DOSLIB_JOYSTICK=$(DOSLIBDIR)/hw/joystick DOSLIB_MEMMODE=dos86$(MEMORYMODE) @@ -146,7 +147,7 @@ DOSLIBOBJ += 8250.$(OBJ) # # libraries # -DOSLIBLIBS = $(DOSLIB_CPU)/$(DOSLIB_MEMMODE)/cpu.lib $(DOSLIB_DOS)/$(DOSLIB_MEMMODE)/dos.lib $(DOSLIB_VGA)/$(DOSLIB_MEMMODE)/vga.lib $(DOSLIB_8254)/$(DOSLIB_MEMMODE)/8254.lib $(DOSLIB_ADLIB)/$(DOSLIB_MEMMODE)/adlib.lib +DOSLIBLIBS = $(DOSLIB_CPU)/$(DOSLIB_MEMMODE)/cpu.lib $(DOSLIB_DOS)/$(DOSLIB_MEMMODE)/dos.lib $(DOSLIB_VGA)/$(DOSLIB_MEMMODE)/vga.lib $(DOSLIB_8254)/$(DOSLIB_MEMMODE)/8254.lib $(DOSLIB_8259)/$(DOSLIB_MEMMODE)/8259.lib $(DOSLIB_ADLIB)/$(DOSLIB_MEMMODE)/adlib.lib !ifeq DEBUGSERIAL 1 DOSLIBLIBS += $(DOSLIB_8250)/$(DOSLIB_MEMMODE)/8250.lib !endif @@ -198,7 +199,8 @@ TESTEXEC = & vrstest.exe & tesuto.exe & 0.exe & - maptest.exe + maptest.exe & + imfplay.exe #zcroll.exe & TESTEXEC2 = & pcxtest.exe & @@ -229,7 +231,6 @@ EXEC = & bakapi.exe & $(TESTEXEC) & $(UTILEXEC) & - imfplay.exe & opltest.exe #!ifdef __LINUX__ @@ -273,6 +274,7 @@ fontgfx.exe: fontgfx.$(OBJ) gfx.lib $(DOSLIB) inputest.exe: inputest.$(OBJ) $(16LIB) $(DOSLIB) gfx.lib #inntest.exe: inntest.$(OBJ) $(16LIBNOINOBJS) 16_in_1.$(OBJ) $(DOSLIB) gfx.lib sountest.exe: sountest.$(OBJ) $(16LIB) $(DOSLIB) gfx.lib +imfplay.exe: imfplay.$(OBJ) $(16LIB) $(DOSLIB) gfx.lib pcxtest.exe: pcxtest.$(OBJ) gfx.lib $(DOSLIB) $(16LIB) vrstest.exe: vrstest.$(OBJ) $(16LIB) gfx.lib $(DOSLIB) #vgacamm.exe: vgacamm.$(OBJ) $(16LIB) gfx.lib $(DOSLIB) @@ -317,6 +319,7 @@ fontgfx.$(OBJ):$(SRC)/fontgfx.c inputest.$(OBJ):$(SRC)/inputest.c #inntest.$(OBJ):$(SRC)/inntest.c sountest.$(OBJ): $(SRC)/sountest.c +imfplay.$(OBJ): $(SRC)/imfplay.c #miditest.$(OBJ): $(SRC)/miditest.c #testemm.$(OBJ):$(SRC)/testemm.c #testemm0.$(OBJ): $(SRC)/testemm0.c @@ -352,6 +355,8 @@ $(DOSLIB_8250)/$(DOSLIB_MEMMODE)/8250.lib: cd $(DOSLIB_8250:$(to_os_path)) && $(DOSLIBMAKE) $(DOSLIB_MEMMODE) && cd $(BUILD_ROOT) $(DOSLIB_8254)/$(DOSLIB_MEMMODE)/8254.lib: cd $(DOSLIB_8254:$(to_os_path)) && $(DOSLIBMAKE) $(DOSLIB_MEMMODE) && cd $(BUILD_ROOT) +$(DOSLIB_8259)/$(DOSLIB_MEMMODE)/8259.lib: + cd $(DOSLIB_8259:$(to_os_path)) && $(DOSLIBMAKE) $(DOSLIB_MEMMODE) && cd $(BUILD_ROOT) $(DOSLIB_ADLIB)/$(DOSLIB_MEMMODE)/adlib.lib: cd $(DOSLIB_ADLIB:$(to_os_path)) && $(DOSLIBMAKE) $(DOSLIB_MEMMODE) && cd $(BUILD_ROOT) @@ -359,9 +364,9 @@ joytest.exe: cd $(DOSLIB_JOYSTICK:$(to_os_path)) && $(DOSLIBMAKE) $(DOSLIB_MEMMODE) && cd $(BUILD_ROOT) $(COPYCOMMAND) $(DOSLIB_JOYSTICK:$(to_os_path))$(DIRSEP)$(DOSLIB_MEMMODE)$(DIRSEP)test.exe joytest.exe -imfplay.exe: - cd $(DOSLIB_ADLIB:$(to_os_path)) && $(DOSLIBMAKE) $(DOSLIB_MEMMODE) && cd $(BUILD_ROOT) - $(COPYCOMMAND) $(DOSLIB_ADLIB:$(to_os_path))$(DIRSEP)$(DOSLIB_MEMMODE)$(DIRSEP)imfplay.exe imfplay.exe +#imfplay.exe: +# cd $(DOSLIB_ADLIB:$(to_os_path)) && $(DOSLIBMAKE) $(DOSLIB_MEMMODE) && cd $(BUILD_ROOT) +# $(COPYCOMMAND) $(DOSLIB_ADLIB:$(to_os_path))$(DIRSEP)$(DOSLIB_MEMMODE)$(DIRSEP)imfplay.exe imfplay.exe opltest.exe: cd $(DOSLIB_ADLIB:$(to_os_path)) && $(DOSLIBMAKE) $(DOSLIB_MEMMODE) && cd $(BUILD_ROOT) diff --git a/src/exmmtest.c b/src/exmmtest.c index fe5f0ad2..7e9ba334 100755 --- a/src/exmmtest.c +++ b/src/exmmtest.c @@ -109,18 +109,6 @@ void segatesuto() } #endif -#ifdef __16_PM__ -#ifdef __DEBUG_PM__ - dbg_debugpm=1; //debug pm -#endif -#endif -#ifdef __DEBUG_CA__ - dbg_debugca=1; -#endif -#ifdef __DEBUG_MM__ - dbg_debugmm=1; -#endif - //===========================================================================// //=======================================// @@ -155,6 +143,17 @@ main(int argc, char *argv[]) #ifdef PRINTBBDUMP //0000PRINTBB; KEYP #endif +#ifdef __16_PM__ +#ifdef __DEBUG_PM__ + dbg_debugpm=1; //debug pm +#endif +#endif +#ifdef __DEBUG_CA__ + dbg_debugca=1; +#endif +#ifdef __DEBUG_MM__ + dbg_debugmm=1; +#endif if(argv[1]){ strcpy(bakapee1, argv[1]);//bakapee1[] = *argv[1]; if(argv[2]) strcpy(bakapee2, argv[2]); }//bakapee2[] = argv[2]; } diff --git a/src/imfplay.c b/src/imfplay.c new file mode 100755 index 00000000..7fb6753e --- /dev/null +++ b/src/imfplay.c @@ -0,0 +1,270 @@ +/* midi.c + * + * Adlib OPL2/OPL3 FM synthesizer chipset test program. + * Play MIDI file using the OPLx synthesizer (well, poorly anyway) + * (C) 2010-2012 Jonathan Campbell. + * Hackipedia DOS library. + * + * This code is licensed under the LGPL. + * + * + * Compiles for intended target environments: + * - MS-DOS [pure DOS mode, or Windows or OS/2 DOS Box] + */ + +#include "src/lib/16_head.h" +#include "src/lib/16_tail.h" +#include "src/lib/16_pm.h" +#include "src/lib/16_ca.h" +#include "src/lib/16_mm.h" +#include "src/lib/16_hc.h" +#include "src/lib/16_dbg.h" +// #include +// #include /* this is where Open Watcom hides the outp() etc. functions */ +// #include +// #include +// #include +// #include +// #include +// #include +// #include +// #include + +#include +#include +#include /* 8254 timer */ +#include +#include + +static void (interrupt *old_irq0)(); +static volatile unsigned long irq0_ticks=0; +static volatile unsigned int irq0_cnt=0,irq0_add=0,irq0_max=0; + +#pragma pack(push,1) +struct imf_entry { + uint8_t reg,data; + uint16_t delay; +}; +#pragma pack(pop) + +static struct imf_entry* imf_music=NULL; +static struct imf_entry* imf_play_ptr=NULL; +static struct imf_entry* imf_music_end=NULL; +static uint16_t imf_delay_countdown=0; + +#define PRINTBB {\ + printf("-------------------------------------------------------------------------------\n");\ + printf("buffer:\n");\ + printf("bigbuffer %Fp\t", gvar->ca.audiosegs[0]);\ + printf("&%Fp\n", MEMPTR gvar->ca.audiosegs[0]);\ + printf("imf_music %Fp\t", imf_music);\ + printf("&%Fp\n", imf_music);\ + printf("imf_play_ptr %Fp\t", imf_play_ptr);\ + printf("&%Fp\n", imf_play_ptr);\ + printf("imf_music_end %Fp\t", imf_music_end);\ + printf("&%Fp\n", imf_music_end);\ + printf("-------------------------------------------------------------------------------\n");\ +} + +void imf_free_music(global_game_variables_t *gvar) { + if (imf_music) free(imf_music); + MM_FreePtr(MEMPTR gvar->ca.audiosegs[0], gvar); + imf_music = imf_play_ptr = imf_music_end = NULL; + imf_delay_countdown = 0; +} + +int imf_load_music(const char *path, global_game_variables_t *gvar) { + unsigned long len; + unsigned char buf[8]; + int fd; + + imf_free_music(gvar); + + fd = open(path,O_RDONLY|O_BINARY); + if (fd < 0) return 0; + + len = lseek(fd,0,SEEK_END); + lseek(fd,0,SEEK_SET); + read(fd,buf,2); + if (buf[0] != 0 || buf[1] != 0) // type 1 IMF + len = *((uint16_t*)buf); + else + lseek(fd,0,SEEK_SET); + + if (len == 0 || len > 65535UL) { + close(fd); + return 0; + } + len -= len & 3; + +// imf_music = malloc(len); + MM_GetPtr(MEMPTR gvar->ca.audiosegs[0],len, gvar); + imf_music = (struct imf_entry *)gvar->ca.audiosegs[0]; + if (imf_music == NULL) { + close(fd); + return 0; + } + read(fd,imf_music,len); + close(fd); + + imf_play_ptr = imf_music; + imf_music_end = imf_music + (len >> 2UL); + PRINTBB; + return 1; +} + +/* WARNING: subroutine call in interrupt handler. make sure you compile with -zu flag for large/compact memory models */ +void interrupt irq0() { + irq0_ticks++; + if ((irq0_cnt += irq0_add) >= irq0_max) { + irq0_cnt -= irq0_max; + old_irq0(); + } + else { + p8259_OCW2(0,P8259_OCW2_NON_SPECIFIC_EOI); + } +} + +void imf_tick() { + if (imf_delay_countdown == 0) { + do { + adlib_write(imf_play_ptr->reg,imf_play_ptr->data); + imf_delay_countdown = imf_play_ptr->delay; + imf_play_ptr++; + if (imf_play_ptr == imf_music_end) + { + printf("replay\n"); + imf_play_ptr = imf_music; + } + } while (imf_delay_countdown == 0); + } + else { + imf_delay_countdown--; + } +} + +void adlib_shut_up() { + int i; + + memset(adlib_fm,0,sizeof(adlib_fm)); + memset(&adlib_reg_bd,0,sizeof(adlib_reg_bd)); + for (i=0;i < adlib_fm_voices;i++) { + struct adlib_fm_operator *f; + f = &adlib_fm[i].mod; + f->ch_a = f->ch_b = f->ch_c = f->ch_d = 1; + f = &adlib_fm[i].car; + f->ch_a = f->ch_b = f->ch_c = f->ch_d = 1; + } + + for (i=0;i < adlib_fm_voices;i++) { + struct adlib_fm_operator *f; + + f = &adlib_fm[i].mod; + f->mod_multiple = 1; + f->total_level = 63 - 16; + f->attack_rate = 15; + f->decay_rate = 4; + f->sustain_level = 0; + f->release_rate = 8; + f->f_number = 400; + f->sustain = 1; + f->octave = 4; + f->key_on = 0; + + f = &adlib_fm[i].car; + f->mod_multiple = 1; + f->total_level = 63 - 16; + f->attack_rate = 15; + f->decay_rate = 4; + f->sustain_level = 0; + f->release_rate = 8; + f->f_number = 0; + f->sustain = 1; + f->octave = 0; + f->key_on = 0; + } + + adlib_apply_all(); +} + +void main(int argc,char **argv) { + static global_game_variables_t gvar; + unsigned long tickrate = 700; + unsigned long ptick; + int c; +#ifdef __DEBUG_CA__ + dbg_debugca=1; +#endif +#ifdef __DEBUG_MM_ + dbg_debugmm=1; +#endif + MM_Startup(&gvar); + PM_Startup(&gvar); PM_CheckMainMem(&gvar); PM_UnlockMainMem(&gvar); + CA_Startup(&gvar); + printf("ADLIB FM test program IMFPLAY\n"); + if (argc < 2) { + printf("You must specify an IMF file to play\n"); + return; + } + + if (!init_adlib()) { + printf("Cannot init library\n"); + return; + } + if (!probe_8254()) { /* we need the timer to keep time with the music */ + printf("8254 timer not found\n"); + return; + } + + if (!imf_load_music(argv[1], &gvar)) { + printf("Failed to load IMF Music\n"); + return; + } + + write_8254_system_timer(T8254_REF_CLOCK_HZ / tickrate); + irq0_cnt = 0; + irq0_add = 182; + irq0_max = 1000; /* about 18.2Hz */ + old_irq0 = _dos_getvect(8);/*IRQ0*/ + _dos_setvect(8,irq0); + + adlib_shut_up(); + shutdown_adlib_opl3(); // NTS: Apparently the music won't play otherwise + _cli(); + irq0_ticks = ptick = 0; + _sti(); + + while (1) { + unsigned long adv; + + _cli(); + adv = irq0_ticks - ptick; + if (adv >= 100UL) adv = 100UL; + ptick = irq0_ticks; + _sti(); + + while (adv != 0) { + imf_tick(); + adv--; + } + + if (kbhit()) { + c = getch(); + if (c == 0) c = getch() << 8; + + if (c == 27) { + break; + } + } + } +// printf("contents of the imf_music\n[\n%s\n]\n", imf_music); + + imf_free_music(&gvar); + adlib_shut_up(); + shutdown_adlib(); + _dos_setvect(8,old_irq0); + write_8254_system_timer(0);/* back to normal 18.2Hz */ + PM_Shutdown(&gvar); + CA_Shutdown(&gvar); + MM_Shutdown(&gvar); +} diff --git a/src/lib/16_map.c b/src/lib/16_map.c index bcda288f..e598d36b 100755 --- a/src/lib/16_map.c +++ b/src/lib/16_map.c @@ -20,6 +20,8 @@ * */ +//TODO USE CA AND THIS FILE FORMAT + #include "src/lib/16_map.h" #include diff --git a/src/lib/16_tdef.h b/src/lib/16_tdef.h index c5775387..c87b272e 100755 --- a/src/lib/16_tdef.h +++ b/src/lib/16_tdef.h @@ -594,6 +594,17 @@ typedef struct //========================================================================== +/* +#pragma pack(push,1) +typedef struct imf_entry { + uint8_t reg,data; + uint16_t delay; +} imf_entry_t; +#pragma pack(pop) +*/ + +//========================================================================== + //from 16_ca //========================================================================== diff --git a/src/lib/vgmsnd/vgmSnd.c b/src/lib/vgmsnd/vgmSnd.c index 1bd719f8..d41f2abe 100755 --- a/src/lib/vgmsnd/vgmSnd.c +++ b/src/lib/vgmsnd/vgmSnd.c @@ -137,7 +137,7 @@ static const UINT8 CHN_OPMASK_REV[0x20] = 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; -UINT8 OpenVGMFile(const char* FileName, VGM_FILE* vgmFile) +UINT8 OpenVGMFile(const char* FileName, VGM_FILE* vgmFile, global_game_variables_t *gvar) { size_t hdrSize; size_t readEl; // 'elements' read from file @@ -171,7 +171,9 @@ UINT8 OpenVGMFile(const char* FileName, VGM_FILE* vgmFile) } vgmFile->dataLen = vgmBaseHdr.lngEOFOffset + 0x04; - vgmFile->data = (UINT8*)malloc(vgmFile->dataLen); + //vgmFile->data = (UINT8*)malloc(vgmFile->dataLen); + MM_GetPtr(MEMPTR gvar->ca.audiosegs[0], vgmFile->dataLen, gvar); + vgmFile->data = (UINT8*)gvar->ca.audiosegs[0]; if (vgmFile->data == NULL) { fclose(hFile); @@ -212,9 +214,11 @@ UINT8 OpenVGMFile(const char* FileName, VGM_FILE* vgmFile) return 0x00; } -void FreeVGMFile(VGM_FILE* vgmFile) +void FreeVGMFile(VGM_FILE* vgmFile, global_game_variables_t *gvar) { - free(vgmFile->data); vgmFile->data = NULL; + //if(vgmFile->data){ free(vgmFile->data); vgmFile->data = NULL; } +// if(vgmFile->data) free(vgmFile->data); + MM_FreePtr(MEMPTR gvar->ca.audiosegs[0], gvar); vgmFile->dataLen = 0; return; diff --git a/src/lib/vgmsnd/vgmSnd.h b/src/lib/vgmsnd/vgmSnd.h index 373d73dd..9bfdbc30 100755 --- a/src/lib/vgmsnd/vgmSnd.h +++ b/src/lib/vgmsnd/vgmSnd.h @@ -56,8 +56,8 @@ typedef struct _vgm_file } VGM_FILE; -UINT8 OpenVGMFile(const char* FileName, VGM_FILE* vgmFile); -void FreeVGMFile(VGM_FILE* vgmFile); +UINT8 OpenVGMFile(const char* FileName, VGM_FILE* vgmFile, global_game_variables_t *gvar); +void FreeVGMFile(VGM_FILE* vgmFile, global_game_variables_t *gvar); void InitEngine(void); void DeinitEngine(void); diff --git a/src/vgmtest.c b/src/vgmtest.c index ee9e09fe..ef8d242d 100755 --- a/src/vgmtest.c +++ b/src/vgmtest.c @@ -27,6 +27,12 @@ #include "src/lib/16_sd.h" //#include "src/lib/doslib/adlib.h" #include "src/lib/16_in.h" +#include "src/lib/16_tail.h" +#include "src/lib/16_pm.h" +#include "src/lib/16_ca.h" +#include "src/lib/16_mm.h" +#include "src/lib/16_hc.h" +#include "src/lib/16_dbg.h" void OPL2_Write(UINT8 reg, UINT8 data); UINT8 OPL2_ReadStatus(void); @@ -48,14 +54,16 @@ UINT8 OPL2_ReadStatus(void) void main(int argc, char *argv[]) { -// static global_game_variables_t gvar; + static global_game_variables_t gvar; VGM_FILE pee[9]; - char *bakapee; + char bakapee[64] = "data/adlib.vgm"; - bakapee = malloc(64); - if(argv[1]) bakapee = argv[1]; - else bakapee = "data/adlib.vgm"; - printf("%x\n", OpenVGMFile(bakapee, &pee[0])); + if(argv[1]) strcpy(bakapee, argv[1]); + + MM_Startup(&gvar); +// PM_Startup(&gvar); PM_CheckMainMem(&gvar); PM_UnlockMainMem(&gvar); +// CA_Startup(&gvar); + printf("%x\n", OpenVGMFile(bakapee, &pee[0], &gvar)); // IN_Startup(); IN_Default(0,&gvar.player[0],ctrl_Keyboard1); InitEngine(); PlayMusic(&pee[0]); @@ -66,7 +74,10 @@ main(int argc, char *argv[]) UpdateSoundEngine(); } StopMusic(); - FreeVGMFile(&pee[0]); + FreeVGMFile(&pee[0], &gvar); DeinitEngine(); //IN_Shutdown(); +// PM_Shutdown(&gvar); +// CA_Shutdown(&gvar); + MM_Shutdown(&gvar); }