OSDN Git Service

p16 is being worked on a bunch by me wwww [16_ca needs huge amounts of work and I...
authorsparky4 <sparky4@cock.li>
Fri, 7 Apr 2017 20:30:15 +0000 (15:30 -0500)
committersparky4 <sparky4@cock.li>
Fri, 7 Apr 2017 20:30:15 +0000 (15:30 -0500)
doc/If this image offends you, then please GTFO wwww.jpg [new file with mode: 0755]
makefile
src/imfplay.c
src/lib/16_sd.c
src/lib/16_sd.h
src/lib/16_tdef.h

diff --git a/doc/If this image offends you, then please GTFO wwww.jpg b/doc/If this image offends you, then please GTFO wwww.jpg
new file mode 100755 (executable)
index 0000000..eba189c
Binary files /dev/null and b/doc/If this image offends you, then please GTFO wwww.jpg differ
index 9de0c72..ee61e51 100755 (executable)
--- a/makefile
+++ b/makefile
@@ -135,10 +135,10 @@ LIBFLAGS=$(WLIBQ) -b -n
 #
 # objects
 #
-VGMSNDOBJ = vgmSnd.$(OBJ) 16_sd.$(OBJ)
+VGMSNDOBJ = vgmSnd.$(OBJ)
 #OLDLIBOBJS=bitmap.$(OBJ) 16render.$(OBJ)
 GFXLIBOBJS = 16_vl.$(OBJ) 16_vl_1.$(OBJ) 16_vlpal.$(OBJ) 16text.$(OBJ) bakapee.$(OBJ) scroll16.$(OBJ) 16_vrs.$(OBJ) 16_spri.$(OBJ) $(OLDLIBOBJS)
-16LIBOBJS = 16_mm.$(OBJ) 16_pm.$(OBJ) 16_ca.$(OBJ) 16_tail.$(OBJ) 16_head.$(OBJ) 16_enti.$(OBJ) 16_dbg.$(OBJ) 16_in.$(OBJ) kitten.$(OBJ) 16_hc.$(OBJ) 16_wcpu.$(OBJ) 16_timer.$(OBJ) jsmn.$(OBJ) 16_map.$(OBJ) 16text.$(OBJ)
+16LIBOBJS = 16_mm.$(OBJ) 16_pm.$(OBJ) 16_ca.$(OBJ) 16_tail.$(OBJ) 16_head.$(OBJ) 16_enti.$(OBJ) 16_dbg.$(OBJ) 16_in.$(OBJ) kitten.$(OBJ) 16_hc.$(OBJ) 16_wcpu.$(OBJ) 16_timer.$(OBJ) jsmn.$(OBJ) 16_map.$(OBJ) 16text.$(OBJ) 16_sd.$(OBJ)
 DOSLIBOBJ = adlib.$(OBJ) 8254.$(OBJ) 8259.$(OBJ) dos.$(OBJ) cpu.$(OBJ)
 !ifeq DEBUGSERIAL 1
 DOSLIBOBJ += 8250.$(OBJ)
index 7fb6753..3aefa2d 100755 (executable)
@@ -19,6 +19,8 @@
 #include "src/lib/16_mm.h"
 #include "src/lib/16_hc.h"
 #include "src/lib/16_dbg.h"
+#include "src/lib/16_sd.h"
+
 // #include <stdio.h>
 // #include <conio.h> /* this is where Open Watcom hides the outp() etc. functions */
 // #include <stdlib.h>
 // #include <fcntl.h>
 // #include <math.h>
 // #include <dos.h>
-
-#include <hw/vga/vga.h>
-#include <hw/dos/dos.h>
-#include <hw/8254/8254.h>              /* 8254 timer */
-#include <hw/8259/8259.h>
-#include <hw/adlib/adlib.h>
+struct glob_game_vars  *ggvv;
 
 static void (interrupt *old_irq0)();
+/*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;
 
@@ -112,19 +110,20 @@ int imf_load_music(const char *path, global_game_variables_t *gvar) {
        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;
+*/
+// WARNING: subroutine call in interrupt handler. make sure you compile with -zu flag for large/compact memory models
+void interrupt irq0()
+{
+       ggvv->ca.sd.irq0_ticks++;
+       if ((ggvv->ca.sd.irq0_cnt += ggvv->ca.sd.irq0_add) >= ggvv->ca.sd.irq0_max) {
+               ggvv->ca.sd.irq0_cnt -= ggvv->ca.sd.irq0_max;
                old_irq0();
        }
        else {
                p8259_OCW2(0,P8259_OCW2_NON_SPECIFIC_EOI);
        }
 }
-
+/*
 void imf_tick() {
        if (imf_delay_countdown == 0) {
                do {
@@ -185,7 +184,7 @@ void adlib_shut_up() {
        }
 
        adlib_apply_all();
-}
+}*/
 
 void main(int argc,char **argv) {
        static global_game_variables_t gvar;
@@ -198,6 +197,7 @@ void main(int argc,char **argv) {
 #ifdef __DEBUG_MM_
        dbg_debugmm=1;
 #endif
+       ggvv=&gvar;
        MM_Startup(&gvar);
        PM_Startup(&gvar); PM_CheckMainMem(&gvar); PM_UnlockMainMem(&gvar);
        CA_Startup(&gvar);
@@ -216,35 +216,35 @@ void main(int argc,char **argv) {
                return;
        }
 
-       if (!imf_load_music(argv[1], &gvar)) {
+       if (!SD_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 */
+       gvar.ca.sd.irq0_cnt = 0;
+       gvar.ca.sd.irq0_add = 182;
+       gvar.ca.sd.irq0_max = 1000; /* about 18.2Hz */
        old_irq0 = _dos_getvect(8);/*IRQ0*/
        _dos_setvect(8,irq0);
 
-       adlib_shut_up();
+       SD_adlib_shut_up();
        shutdown_adlib_opl3(); // NTS: Apparently the music won't play otherwise
        _cli();
-       irq0_ticks = ptick = 0;
+       gvar.ca.sd.irq0_ticks = ptick = 0;
        _sti();
 
        while (1) {
                unsigned long adv;
 
                _cli();
-               adv = irq0_ticks - ptick;
+               adv = gvar.ca.sd.irq0_ticks - ptick;
                if (adv >= 100UL) adv = 100UL;
-               ptick = irq0_ticks;
+               ptick = gvar.ca.sd.irq0_ticks;
                _sti();
 
                while (adv != 0) {
-                       imf_tick();
+                       SD_imf_tick(&gvar);
                        adv--;
                }
 
@@ -259,8 +259,8 @@ void main(int argc,char **argv) {
        }
 //     printf("contents of the imf_music\n[\n%s\n]\n", imf_music);
 
-       imf_free_music(&gvar);
-       adlib_shut_up();
+       SD_imf_free_music(&gvar);
+       SD_adlib_shut_up();
        shutdown_adlib();
        _dos_setvect(8,old_irq0);
        write_8254_system_timer(0);/* back to normal 18.2Hz */
index 63e17e5..f48ae2c 100755 (executable)
@@ -22,6 +22,9 @@
 \r
 #include "src/lib/16_sd.h"\r
 \r
+//static void (interrupt *old_irq0)();\r
+extern struct glob_game_vars   *ggvv;\r
+\r
 void opl2out(word reg, word data)\r
 {\r
        __asm\r
@@ -192,3 +195,139 @@ void FMSetVoice(int voiceNum, FMInstrument *ins){
        opCellNum = (byte)0xC0 + (byte)voiceNum;\r
        opl2out(opCellNum, ins->Feedback);\r
 } /* End of FMSetVoice */\r
+\r
+\r
+void SD_Initimf(global_game_variables_t *gvar)\r
+{\r
+       gvar->ca.sd.irq0_ticks=\r
+       gvar->ca.sd.irq0_cnt=\r
+       gvar->ca.sd.irq0_add=\r
+       gvar->ca.sd.imf_delay_countdown=\r
+       gvar->ca.sd.irq0_max=0;\r
+       gvar->ca.sd.imf_music=\r
+       gvar->ca.sd.imf_play_ptr=\r
+       gvar->ca.sd.imf_music_end=NULL;\r
+}\r
+\r
+void SD_imf_free_music(global_game_variables_t *gvar)\r
+{\r
+       if (gvar->ca.sd.imf_music) free(gvar->ca.sd.imf_music);\r
+       MM_FreePtr(MEMPTR gvar->ca.audiosegs[0], gvar); //TODO make behave like id engine\r
+       gvar->ca.sd.imf_music = gvar->ca.sd.imf_play_ptr = gvar->ca.sd.imf_music_end = NULL;\r
+       gvar->ca.sd.imf_delay_countdown = 0;\r
+}\r
+\r
+int SD_imf_load_music(const char *path, global_game_variables_t *gvar)\r
+{\r
+       unsigned long len;\r
+       unsigned char buf[8];\r
+       int fd;\r
+\r
+       SD_imf_free_music(gvar);\r
+\r
+       fd = open(path,O_RDONLY|O_BINARY);\r
+       if (fd < 0) return 0;\r
+\r
+       len = lseek(fd,0,SEEK_END);\r
+       lseek(fd,0,SEEK_SET);\r
+       read(fd,buf,2);\r
+       if (buf[0] != 0 || buf[1] != 0) // type 1 IMF\r
+               len = *((uint16_t*)buf);\r
+       else\r
+               lseek(fd,0,SEEK_SET);\r
+\r
+       if (len == 0 || len > 65535UL) {\r
+               close(fd);\r
+               return 0;\r
+       }\r
+       len -= len & 3;\r
+\r
+       MM_GetPtr(MEMPTR gvar->ca.audiosegs[0],len, gvar);\r
+       gvar->ca.sd.imf_music = (struct imf_entry *)gvar->ca.audiosegs[0];\r
+       if (gvar->ca.sd.imf_music == NULL) {\r
+               close(fd);\r
+               return 0;\r
+       }\r
+       read(fd,gvar->ca.sd.imf_music,len);\r
+       close(fd);\r
+\r
+       gvar->ca.sd.imf_play_ptr = gvar->ca.sd.imf_music;\r
+       gvar->ca.sd.imf_music_end = gvar->ca.sd.imf_music + (len >> 2UL);\r
+       return 1;\r
+}\r
+\r
+// WARNING: subroutine call in interrupt handler. make sure you compile with -zu flag for large/compact memory models\r
+/*void interrupt irq0()\r
+{\r
+       ggvv->ca.sd.irq0_ticks++;\r
+       if ((ggvv->ca.sd.irq0_cnt += ggvv->ca.sd.irq0_add) >= ggvv->ca.sd.irq0_max) {\r
+               ggvv->ca.sd.irq0_cnt -= ggvv->ca.sd.irq0_max;\r
+               old_irq0();\r
+       }\r
+       else {\r
+               p8259_OCW2(0,P8259_OCW2_NON_SPECIFIC_EOI);\r
+       }\r
+}*/\r
+\r
+void SD_imf_tick(global_game_variables_t *gvar)\r
+{\r
+       if (gvar->ca.sd.imf_delay_countdown == 0) {\r
+               do {\r
+                       adlib_write(gvar->ca.sd.imf_play_ptr->reg,gvar->ca.sd.imf_play_ptr->data);\r
+                       gvar->ca.sd.imf_delay_countdown = gvar->ca.sd.imf_play_ptr->delay;\r
+                       gvar->ca.sd.imf_play_ptr++;\r
+                       if (gvar->ca.sd.imf_play_ptr == gvar->ca.sd.imf_music_end)\r
+                       {\r
+//                             printf("replay\n");\r
+                               gvar->ca.sd.imf_play_ptr = gvar->ca.sd.imf_music;\r
+                       }\r
+               } while (gvar->ca.sd.imf_delay_countdown == 0);\r
+       }\r
+       else {\r
+               gvar->ca.sd.imf_delay_countdown--;\r
+       }\r
+}\r
+\r
+void SD_adlib_shut_up() {\r
+       int i;\r
+\r
+       memset(adlib_fm,0,sizeof(adlib_fm));\r
+       memset(&adlib_reg_bd,0,sizeof(adlib_reg_bd));\r
+       for (i=0;i < adlib_fm_voices;i++) {\r
+               struct adlib_fm_operator *f;\r
+               f = &adlib_fm[i].mod;\r
+               f->ch_a = f->ch_b = f->ch_c = f->ch_d = 1;\r
+               f = &adlib_fm[i].car;\r
+               f->ch_a = f->ch_b = f->ch_c = f->ch_d = 1;\r
+       }\r
+\r
+       for (i=0;i < adlib_fm_voices;i++) {\r
+               struct adlib_fm_operator *f;\r
+\r
+               f = &adlib_fm[i].mod;\r
+               f->mod_multiple = 1;\r
+               f->total_level = 63 - 16;\r
+               f->attack_rate = 15;\r
+               f->decay_rate = 4;\r
+               f->sustain_level = 0;\r
+               f->release_rate = 8;\r
+               f->f_number = 400;\r
+               f->sustain = 1;\r
+               f->octave = 4;\r
+               f->key_on = 0;\r
+\r
+               f = &adlib_fm[i].car;\r
+               f->mod_multiple = 1;\r
+               f->total_level = 63 - 16;\r
+               f->attack_rate = 15;\r
+               f->decay_rate = 4;\r
+               f->sustain_level = 0;\r
+               f->release_rate = 8;\r
+               f->f_number = 0;\r
+               f->sustain = 1;\r
+               f->octave = 0;\r
+               f->key_on = 0;\r
+       }\r
+\r
+       adlib_apply_all();\r
+}\r
index a2cb96c..611982f 100755 (executable)
@@ -26,6 +26,9 @@
 #include "src/lib/16_head.h"\r
 #include <hw/8254/8254.h>              /* 8254 timer */\r
 #include <hw/adlib/adlib.h>\r
+#include <hw/vga/vga.h>\r
+#include <hw/dos/dos.h>\r
+#include <hw/8259/8259.h>\r
 \r
 #define MIN_REGISTER                   0x01\r
 #define MAX_REGISTER                   0xF5\r
@@ -58,4 +61,11 @@ void FMKeyOff(int voice);
 void FMKeyOn(int voice, int freq, int octave);\r
 void FMSetVoice(int voiceNum, FMInstrument *ins);\r
 \r
+void SD_Initimf(global_game_variables_t *gvar);\r
+void SD_imf_free_music(global_game_variables_t *gvar);\r
+int SD_imf_load_music(const char *path, global_game_variables_t *gvar);\r
+//void interrupt irq0(global_game_variables_t *gvar);\r
+void SD_imf_tick(global_game_variables_t *gvar);\r
+void SD_adlib_shut_up();\r
+\r
 #endif /*__16_SND_H_*/\r
index c87b272..22e9812 100755 (executable)
@@ -594,14 +594,25 @@ typedef struct
 \r
 //==========================================================================\r
 \r
-/*\r
+//for 16_sd\r
+//==========================================================================\r
 #pragma pack(push,1)\r
-typedef struct imf_entry {\r
+typedef struct imf_entry\r
+{\r
        uint8_t         reg,data;\r
        uint16_t        delay;\r
 } imf_entry_t;\r
 #pragma pack(pop)\r
-*/\r
+\r
+typedef struct\r
+{\r
+       volatile unsigned long irq0_ticks;//=0;\r
+       volatile unsigned int irq0_cnt,irq0_add,irq0_max;//=0;\r
+       imf_entry_t*    imf_music;//=NULL;\r
+       imf_entry_t*    imf_play_ptr;//=NULL;\r
+       imf_entry_t*    imf_music_end;//=NULL;\r
+       uint16_t                imf_delay_countdown;//=0;\r
+} sd_t;\r
 \r
 //==========================================================================\r
 \r
@@ -660,8 +671,9 @@ typedef struct      //TODO: USE THIS!!!!
        word            _seg    *grstarts;      // array of offsets in egagraph, -1 for sparse//long\r
        word            _seg    *audiostarts;   // array of offsets in audio / audiot//long\r
 \r
-       huffnode huffnode;\r
+       huffnode        huffnode;\r
 \r
+       sd_t            sd;\r
        //TODO: extend! and learn from keen/wolf/catacomb's code wwww\r
        memptr  spribuff;\r
 } ca_t;\r