mirror of
https://github.com/libretro/xmil-libretro.git
synced 2025-02-20 00:01:35 +00:00
opmgen
refs #99 svn merge -r 174:178 https://amethyst.yui.ne.jp/svn-dev/x1/xmil/branches/yui/WORK_02 svn merge -r 210:212 https://amethyst.yui.ne.jp/svn-dev/x1/xmil/branches/yui/WORK_02
This commit is contained in:
parent
2ceaf0244c
commit
f219f1254a
@ -23,7 +23,7 @@ void IOOUTCALL opm_o(UINT port, REG8 dat) {
|
||||
sndboard.opmdat[reg] = dat;
|
||||
x1f_opm(reg, dat);
|
||||
#if !defined(DISABLE_SOUND)
|
||||
opmgen_setreg(reg, dat);
|
||||
opmgen_setreg(&g_opmgen, reg, dat);
|
||||
#endif
|
||||
}
|
||||
else if ((lsb & (~3)) == 0x04) { /* 0704-0707 */
|
||||
@ -113,7 +113,7 @@ void sndboard_update(void) {
|
||||
}
|
||||
#if defined(SUPPORT_TURBOZ) || defined(SUPPORT_OPM)
|
||||
for (i=0x20; i<0x100; i++) {
|
||||
opmgen_setreg((REG8)i, sndboard.opmdat[i]);
|
||||
opmgen_setreg(&g_opmgen, (REG8)i, sndboard.opmdat[i]);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
@ -61,13 +61,6 @@ typedef signed int SINT32;
|
||||
#define SOUND_CRITICAL
|
||||
#define SOUNDRESERVE 100
|
||||
|
||||
#define SUPPORT_CRT15KHZ
|
||||
#define SUPPORT_HOSTDRV
|
||||
#define SUPPORT_SWSEEKSND
|
||||
#define SUPPORT_SASI
|
||||
#define SUPPORT_SCSI
|
||||
|
||||
// #define SUPPORT_ARC
|
||||
// #define SUPPORT_ZLIB
|
||||
#define SUPPORT_OPM
|
||||
|
||||
#define SCREEN_BPP 16
|
||||
|
@ -103,6 +103,7 @@ typedef struct {
|
||||
SINT32 outdr;
|
||||
SINT32 calcremain;
|
||||
UINT8 keyreg[OPMCH_MAX];
|
||||
OPMCH opmch[OPMCH_MAX];
|
||||
} _OPMGEN, *OPMGEN;
|
||||
|
||||
typedef struct {
|
||||
@ -121,10 +122,10 @@ extern "C" {
|
||||
|
||||
void opmgen_initialize(UINT rate);
|
||||
void opmgen_setvol(UINT vol);
|
||||
void opmgen_reset(void);
|
||||
void opmgen_setreg(REG8 reg, REG8 value);
|
||||
void opmgen_reset(OPMGEN opmgen);
|
||||
void opmgen_setreg(OPMGEN opmgen, REG8 reg, REG8 value);
|
||||
|
||||
void SOUNDCALL opmgen_getpcm(void *hdl, SINT32 *pcm, UINT count);
|
||||
void SOUNDCALL opmgen_getpcm(OPMGEN opmgen, SINT32 *pcm, UINT count);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
@ -1,12 +1,15 @@
|
||||
#include "compiler.h"
|
||||
/**
|
||||
* @file opmgenc.c
|
||||
* @brief Implementation of the OPM generator
|
||||
*/
|
||||
|
||||
#if defined(SUPPORT_TURBOZ) || defined(SUPPORT_OPM)
|
||||
#include "compiler.h"
|
||||
|
||||
#ifndef PALMOS
|
||||
#include <math.h>
|
||||
#ifndef PALMOS
|
||||
#include <math.h>
|
||||
#endif
|
||||
#include "sound.h"
|
||||
#include "sndctrl.h"
|
||||
#include "sound.h"
|
||||
#include "opmgen.h"
|
||||
|
||||
|
||||
#define OPM_ARRATE 399128L
|
||||
@ -131,13 +134,13 @@ void opmgen_setvol(UINT vol) {
|
||||
|
||||
/* ---- */
|
||||
|
||||
static void keyon(OPMCH *ch, REG8 value) {
|
||||
static void keyon(OPMGEN opmgen, OPMCH *ch, REG8 value) {
|
||||
|
||||
OPMSLOT *slot;
|
||||
REG8 bit;
|
||||
UINT i;
|
||||
|
||||
opmgen.playing++;
|
||||
opmgen->playing++;
|
||||
ch->playing |= (value >> 3) & 0x0f;
|
||||
slot = ch->slot;
|
||||
bit = 0x08;
|
||||
@ -170,7 +173,7 @@ static void keyon(OPMCH *ch, REG8 value) {
|
||||
}
|
||||
}
|
||||
|
||||
static void set_algorithm(OPMCH *ch, REG8 value) {
|
||||
static void set_algorithm(OPMGEN opmgen, OPMCH *ch, REG8 value) {
|
||||
|
||||
UINT8 feed;
|
||||
SINT32 *outd;
|
||||
@ -188,55 +191,55 @@ static void set_algorithm(OPMCH *ch, REG8 value) {
|
||||
switch ((value >> 6) & 3) {
|
||||
case 0:
|
||||
default:
|
||||
outd = &opmgen.feedback4;
|
||||
outd = &opmgen->feedback4;
|
||||
break;
|
||||
|
||||
case 1:
|
||||
outd = &opmgen.outdl;
|
||||
outd = &opmgen->outdl;
|
||||
break;
|
||||
|
||||
case 2:
|
||||
outd = &opmgen.outdr;
|
||||
outd = &opmgen->outdr;
|
||||
break;
|
||||
|
||||
case 3:
|
||||
outd = &opmgen.outdc;
|
||||
outd = &opmgen->outdc;
|
||||
break;
|
||||
}
|
||||
|
||||
switch(value & 7) {
|
||||
case 0:
|
||||
ch->connect1 = &opmgen.feedback2;
|
||||
ch->connect2 = &opmgen.feedback3;
|
||||
ch->connect3 = &opmgen.feedback4;
|
||||
ch->connect1 = &opmgen->feedback2;
|
||||
ch->connect2 = &opmgen->feedback3;
|
||||
ch->connect3 = &opmgen->feedback4;
|
||||
outslot = 0x08;
|
||||
break;
|
||||
|
||||
case 1:
|
||||
ch->connect1 = &opmgen.feedback3;
|
||||
ch->connect2 = &opmgen.feedback3;
|
||||
ch->connect3 = &opmgen.feedback4;
|
||||
ch->connect1 = &opmgen->feedback3;
|
||||
ch->connect2 = &opmgen->feedback3;
|
||||
ch->connect3 = &opmgen->feedback4;
|
||||
outslot = 0x08;
|
||||
break;
|
||||
|
||||
case 2:
|
||||
ch->connect1 = &opmgen.feedback4;
|
||||
ch->connect2 = &opmgen.feedback3;
|
||||
ch->connect3 = &opmgen.feedback4;
|
||||
ch->connect1 = &opmgen->feedback4;
|
||||
ch->connect2 = &opmgen->feedback3;
|
||||
ch->connect3 = &opmgen->feedback4;
|
||||
outslot = 0x08;
|
||||
break;
|
||||
|
||||
case 3:
|
||||
ch->connect1 = &opmgen.feedback2;
|
||||
ch->connect2 = &opmgen.feedback4;
|
||||
ch->connect3 = &opmgen.feedback4;
|
||||
ch->connect1 = &opmgen->feedback2;
|
||||
ch->connect2 = &opmgen->feedback4;
|
||||
ch->connect3 = &opmgen->feedback4;
|
||||
outslot = 0x08;
|
||||
break;
|
||||
|
||||
case 4:
|
||||
ch->connect1 = &opmgen.feedback2;
|
||||
ch->connect1 = &opmgen->feedback2;
|
||||
ch->connect2 = outd;
|
||||
ch->connect3 = &opmgen.feedback4;
|
||||
ch->connect3 = &opmgen->feedback4;
|
||||
outslot = 0x0a;
|
||||
break;
|
||||
|
||||
@ -248,7 +251,7 @@ static void set_algorithm(OPMCH *ch, REG8 value) {
|
||||
break;
|
||||
|
||||
case 6:
|
||||
ch->connect1 = &opmgen.feedback2;
|
||||
ch->connect1 = &opmgen->feedback2;
|
||||
ch->connect2 = outd;
|
||||
ch->connect3 = outd;
|
||||
outslot = 0x0e;
|
||||
@ -354,15 +357,15 @@ static void channelupdate(OPMCH *ch) {
|
||||
|
||||
/*----------------------------------------------------------------------------- */
|
||||
|
||||
void opmgen_reset(void) {
|
||||
void opmgen_reset(OPMGEN opmgen) {
|
||||
|
||||
OPMCH *ch;
|
||||
UINT i;
|
||||
OPMSLOT *slot;
|
||||
UINT j;
|
||||
|
||||
opmgen.mode = 0;
|
||||
ch = opmch;
|
||||
opmgen->mode = 0;
|
||||
ch = opmgen->opmch;
|
||||
for(i=0; i<OPMCH_MAX; i++) {
|
||||
ch->keynote = 0;
|
||||
slot = ch->slot;
|
||||
@ -381,11 +384,11 @@ void opmgen_reset(void) {
|
||||
ch++;
|
||||
}
|
||||
for (i=0x20; i<0x100; i++) {
|
||||
opmgen_setreg((REG8)i, 0);
|
||||
opmgen_setreg(opmgen, (REG8)i, 0);
|
||||
}
|
||||
}
|
||||
|
||||
void opmgen_setreg(REG8 reg, REG8 value) {
|
||||
void opmgen_setreg(OPMGEN opmgen, REG8 reg, REG8 value) {
|
||||
|
||||
UINT c;
|
||||
UINT i;
|
||||
@ -394,20 +397,20 @@ void opmgen_setreg(REG8 reg, REG8 value) {
|
||||
|
||||
sound_sync();
|
||||
c = reg & 7;
|
||||
ch = opmch + c;
|
||||
ch = opmgen->opmch + c;
|
||||
slot = ch->slot + fmslot[(reg >> 3) & 3];
|
||||
switch(reg & 0xe0) {
|
||||
case 0x00:
|
||||
switch(reg) {
|
||||
case 0x08: /* key on/off */
|
||||
keyon(opmch + (value & 7), value);
|
||||
keyon(opmgen, opmgen->opmch + (value & 7), value);
|
||||
break;
|
||||
|
||||
case 0x14: /* mode */
|
||||
opmgen.mode = value;
|
||||
opmgen->mode = value;
|
||||
if ((value & 0x81) == 0x81) {
|
||||
opmgen.playing++;
|
||||
ch = opmch;
|
||||
opmgen->playing++;
|
||||
ch = opmgen->opmch;
|
||||
for (c=0; c<8; c++) {
|
||||
ch->playing = 0x0f;
|
||||
ch->op1fb = 0;
|
||||
@ -430,7 +433,7 @@ void opmgen_setreg(REG8 reg, REG8 value) {
|
||||
case 0x20:
|
||||
switch(reg & 0x18) {
|
||||
case 0x00: /* pan feedback connection */
|
||||
set_algorithm(ch, value);
|
||||
set_algorithm(opmgen, ch, value);
|
||||
break;
|
||||
|
||||
case 0x08: /* keycode */
|
||||
@ -478,5 +481,3 @@ void opmgen_setreg(REG8 reg, REG8 value) {
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
@ -1,9 +1,11 @@
|
||||
#include "compiler.h"
|
||||
/**
|
||||
* @file opmgeng.c
|
||||
* @brief Implementation of the OPM generator
|
||||
*/
|
||||
|
||||
#if defined(SUPPORT_TURBOZ) || defined(SUPPORT_OPM)
|
||||
|
||||
#include "sound.h"
|
||||
#include "sndctrl.h"
|
||||
#include "compiler.h"
|
||||
#include "sound.h"
|
||||
#include "opmgen.h"
|
||||
|
||||
extern OPMCFG opmcfg;
|
||||
|
||||
@ -43,14 +45,14 @@ extern OPMCFG opmcfg;
|
||||
opmcfg.envtable[(e)]) >> (ENVTBL_BIT+SINTBL_BIT-TL_BITS))
|
||||
|
||||
|
||||
static void calcratechannel(OPMCH *ch) {
|
||||
static void calcratechannel(OPMGEN opmgen, OPMCH *ch) {
|
||||
|
||||
SINT32 envout;
|
||||
SINT32 opout;
|
||||
|
||||
opmgen.feedback2 = 0;
|
||||
opmgen.feedback3 = 0;
|
||||
opmgen.feedback4 = 0;
|
||||
opmgen->feedback2 = 0;
|
||||
opmgen->feedback3 = 0;
|
||||
opmgen->feedback4 = 0;
|
||||
|
||||
/* SLOT 1 */
|
||||
CALCENV(envout, ch, 0);
|
||||
@ -68,7 +70,7 @@ static void calcratechannel(OPMCH *ch) {
|
||||
}
|
||||
/* output slot1 */
|
||||
if (!ch->connect1) {
|
||||
opmgen.feedback2 = opmgen.feedback3 = opmgen.feedback4 = opout;
|
||||
opmgen->feedback2 = opmgen->feedback3 = opmgen->feedback4 = opout;
|
||||
}
|
||||
else {
|
||||
*ch->connect1 += opout;
|
||||
@ -77,21 +79,21 @@ static void calcratechannel(OPMCH *ch) {
|
||||
/* SLOT 2 */
|
||||
CALCENV(envout, ch, 1);
|
||||
if (envout > 0) {
|
||||
*ch->connect2 += SLOTOUT(ch->slot[1], envout, opmgen.feedback2);
|
||||
*ch->connect2 += SLOTOUT(ch->slot[1], envout, opmgen->feedback2);
|
||||
}
|
||||
/* SLOT 3 */
|
||||
CALCENV(envout, ch, 2);
|
||||
if (envout > 0) {
|
||||
*ch->connect3 += SLOTOUT(ch->slot[2], envout, opmgen.feedback3);
|
||||
*ch->connect3 += SLOTOUT(ch->slot[2], envout, opmgen->feedback3);
|
||||
}
|
||||
/* SLOT 4 */
|
||||
CALCENV(envout, ch, 3);
|
||||
if (envout > 0) {
|
||||
*ch->connect4 += SLOTOUT(ch->slot[3], envout, opmgen.feedback4);
|
||||
*ch->connect4 += SLOTOUT(ch->slot[3], envout, opmgen->feedback4);
|
||||
}
|
||||
}
|
||||
|
||||
void SOUNDCALL opmgen_getpcm(void *hdl, SINT32 *pcm, UINT count) {
|
||||
void SOUNDCALL opmgen_getpcm(OPMGEN opmgen, SINT32 *pcm, UINT count) {
|
||||
|
||||
OPMCH *ch;
|
||||
UINT i;
|
||||
@ -99,53 +101,51 @@ void SOUNDCALL opmgen_getpcm(void *hdl, SINT32 *pcm, UINT count) {
|
||||
SINT32 samp_l;
|
||||
SINT32 samp_r;
|
||||
|
||||
if ((!opmgen.playing) || (!count)) {
|
||||
if ((!opmgen->playing) || (!count)) {
|
||||
return;
|
||||
}
|
||||
ch = opmch;
|
||||
ch = opmgen->opmch;
|
||||
do {
|
||||
samp_l = opmgen.outdl * (opmgen.calcremain * -1);
|
||||
samp_r = opmgen.outdr * (opmgen.calcremain * -1);
|
||||
opmgen.calcremain += FMDIV_ENT;
|
||||
samp_l = opmgen->outdl * (opmgen->calcremain * -1);
|
||||
samp_r = opmgen->outdr * (opmgen->calcremain * -1);
|
||||
opmgen->calcremain += FMDIV_ENT;
|
||||
while(1) {
|
||||
opmgen.outdc = 0;
|
||||
opmgen.outdl = 0;
|
||||
opmgen.outdr = 0;
|
||||
opmgen->outdc = 0;
|
||||
opmgen->outdl = 0;
|
||||
opmgen->outdr = 0;
|
||||
playing = 0;
|
||||
for (i=0; i<OPMCH_MAX; i++) {
|
||||
if (ch[i].playing & ch[i].outslot) {
|
||||
calcratechannel(ch + i);
|
||||
calcratechannel(opmgen, ch + i);
|
||||
playing++;
|
||||
}
|
||||
}
|
||||
opmgen.outdl += opmgen.outdc;
|
||||
opmgen.outdr += opmgen.outdc;
|
||||
opmgen.outdl >>= FMVOL_SFTBIT;
|
||||
opmgen.outdr >>= FMVOL_SFTBIT;
|
||||
if (opmgen.calcremain > opmcfg.calc1024) {
|
||||
samp_l += opmgen.outdl * opmcfg.calc1024;
|
||||
samp_r += opmgen.outdr * opmcfg.calc1024;
|
||||
opmgen.calcremain -= opmcfg.calc1024;
|
||||
opmgen->outdl += opmgen->outdc;
|
||||
opmgen->outdr += opmgen->outdc;
|
||||
opmgen->outdl >>= FMVOL_SFTBIT;
|
||||
opmgen->outdr >>= FMVOL_SFTBIT;
|
||||
if (opmgen->calcremain > opmcfg.calc1024) {
|
||||
samp_l += opmgen->outdl * opmcfg.calc1024;
|
||||
samp_r += opmgen->outdr * opmcfg.calc1024;
|
||||
opmgen->calcremain -= opmcfg.calc1024;
|
||||
}
|
||||
else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
samp_l += opmgen.outdl * opmgen.calcremain;
|
||||
samp_l += opmgen->outdl * opmgen->calcremain;
|
||||
samp_l >>= 8;
|
||||
samp_l *= opmcfg.fmvol;
|
||||
samp_l >>= (OPM_OUTSB + FMDIV_BITS + 1 + 6 - FMVOL_SFTBIT - 8);
|
||||
pcm[0] += samp_l;
|
||||
samp_r += opmgen.outdr * opmgen.calcremain;
|
||||
samp_r += opmgen->outdr * opmgen->calcremain;
|
||||
samp_r >>= 8;
|
||||
samp_r *= opmcfg.fmvol;
|
||||
samp_r >>= (OPM_OUTSB + FMDIV_BITS + 1 + 6 - FMVOL_SFTBIT - 8);
|
||||
pcm[1] += samp_r;
|
||||
opmgen.calcremain -= opmcfg.calc1024;
|
||||
opmgen->calcremain -= opmcfg.calc1024;
|
||||
pcm += 2;
|
||||
} while(--count);
|
||||
opmgen.playing = playing;
|
||||
(void)hdl;
|
||||
opmgen->playing = playing;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
@ -7,8 +7,7 @@
|
||||
|
||||
|
||||
#if defined(SUPPORT_TURBOZ) || defined(SUPPORT_OPM)
|
||||
OPMCH opmch[OPMCH_MAX];
|
||||
_OPMGEN opmgen;
|
||||
_OPMGEN g_opmgen;
|
||||
#endif
|
||||
_PSGGEN psggen;
|
||||
|
||||
@ -36,8 +35,8 @@ void sndctrl_deinitialize(void) {
|
||||
void sndctrl_reset(void) {
|
||||
|
||||
#if defined(SUPPORT_TURBOZ) || defined(SUPPORT_OPM)
|
||||
opmgen_reset();
|
||||
sound_streamregist(&opmgen, (SOUNDCB)opmgen_getpcm);
|
||||
opmgen_reset(&g_opmgen);
|
||||
sound_streamregist(&g_opmgen, (SOUNDCB)opmgen_getpcm);
|
||||
#endif
|
||||
psggen_reset(&psggen);
|
||||
sound_streamregist(&psggen, (SOUNDCB)psggen_getpcm);
|
||||
|
@ -9,8 +9,7 @@ extern "C" {
|
||||
#endif
|
||||
|
||||
#if defined(SUPPORT_TURBOZ) || defined(SUPPORT_OPM)
|
||||
extern OPMCH opmch[OPMCH_MAX];
|
||||
extern _OPMGEN opmgen;
|
||||
extern _OPMGEN g_opmgen;
|
||||
#endif
|
||||
extern _PSGGEN psggen;
|
||||
|
||||
|
@ -32,7 +32,7 @@ void IOOUTCALL opm_o(UINT port, REG8 dat) {
|
||||
juliet_YM2151W(reg, dat);
|
||||
}
|
||||
else {
|
||||
opmgen_setreg(reg, dat);
|
||||
opmgen_setreg(&g_opmgen, reg, dat);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
@ -139,7 +139,7 @@ void sndboard_update(void) {
|
||||
}
|
||||
#if defined(SUPPORT_TURBOZ) || defined(SUPPORT_OPM)
|
||||
for (i=0x20; i<0x100; i++) {
|
||||
opmgen_setreg((REG8)i, sndboard.opmdat[i]);
|
||||
opmgen_setreg(&g_opmgen, (REG8)i, sndboard.opmdat[i]);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
@ -87,6 +87,7 @@ EM_OFF equ 0
|
||||
.outdr resd 1
|
||||
.calcremain resd 1
|
||||
.keyreg resb OPMCH_MAX
|
||||
.opmch resb 0
|
||||
endstruc
|
||||
|
||||
struc opmcfg_t
|
||||
@ -101,8 +102,8 @@ EM_OFF equ 0
|
||||
|
||||
section .text
|
||||
|
||||
extern _opmgen
|
||||
extern _opmch
|
||||
; extern _opmgen
|
||||
; extern _opmch
|
||||
extern _opmcfg
|
||||
|
||||
; extern _sinshift
|
||||
@ -166,7 +167,7 @@ ENVTABLE equ (_opmcfg + opmcfg_t.envtable)
|
||||
%%setrr: mov byte [edi + slot_t.env_mode], EM_OFF
|
||||
%%setd2: mov dword [edi + slot_t.env_end], EC_OFF + 1
|
||||
and dword [edi + slot_t.env_inc], byte 0
|
||||
and byte [esi + ch_t.playing], ~(%3)
|
||||
and byte [edi - (slot_t_size * %3) + ch_t.playing], ~(1 << %3)
|
||||
mov eax, EC_OFF
|
||||
jmp near %2
|
||||
%endmacro
|
||||
@ -176,7 +177,7 @@ ENVTABLE equ (_opmcfg + opmcfg_t.envtable)
|
||||
@opmgen_getpcm@12:
|
||||
cmp dword [esp+4], byte 0
|
||||
je near og_noupdate
|
||||
cmp dword [_opmgen + opmgen_t.playing], byte 0
|
||||
cmp dword [ecx + opmgen_t.playing], byte 0
|
||||
je near og_noupdate
|
||||
|
||||
push ebx
|
||||
@ -189,100 +190,101 @@ OPN_SAMPL equ 0
|
||||
OPN_SAMPR equ 4
|
||||
OPN_LENG equ 16 + 8 + 4
|
||||
|
||||
mov esi, ecx
|
||||
mov ebp, edx
|
||||
mov ebx, [_opmgen + opmgen_t.calcremain]
|
||||
mov ebx, [esi + opmgen_t.calcremain]
|
||||
og_fmout_st: mov eax, ebx
|
||||
imul ebx, [_opmgen + opmgen_t.outdl]
|
||||
imul ebx, [esi + opmgen_t.outdl]
|
||||
mov [esp + OPN_SAMPL], ebx
|
||||
mov ebx, FMDIV_ENT
|
||||
sub ebx, eax
|
||||
imul eax, [_opmgen + opmgen_t.outdr]
|
||||
imul eax, [esi + opmgen_t.outdr]
|
||||
mov [esp + OPN_SAMPR], eax
|
||||
og_fmout_lp: mov [_opmgen + opmgen_t.calcremain], ebx
|
||||
and dword [_opmgen + opmgen_t.playing], byte 0
|
||||
and dword [_opmgen + opmgen_t.outdl], byte 0
|
||||
and dword [_opmgen + opmgen_t.outdc], byte 0
|
||||
and dword [_opmgen + opmgen_t.outdr], byte 0
|
||||
og_fmout_lp: mov [esi + opmgen_t.calcremain], ebx
|
||||
and dword [esi + opmgen_t.playing], byte 0
|
||||
and dword [esi + opmgen_t.outdl], byte 0
|
||||
and dword [esi + opmgen_t.outdc], byte 0
|
||||
and dword [esi + opmgen_t.outdr], byte 0
|
||||
mov ch, OPMCH_MAX
|
||||
mov esi, _opmch
|
||||
og_calcch_lp: mov cl, [esi + ch_t.outslot]
|
||||
test cl, [esi + ch_t.playing]
|
||||
lea edi, [esi + opmgen_t.opmch]
|
||||
og_calcch_lp: mov cl, [edi + ch_t.outslot]
|
||||
test cl, [edi + ch_t.playing]
|
||||
je near og_calcch_nt
|
||||
and dword [_opmgen + opmgen_t.feedback2], byte 0
|
||||
and dword [_opmgen + opmgen_t.feedback3], byte 0
|
||||
and dword [_opmgen + opmgen_t.feedback4], byte 0
|
||||
mov edi, esi
|
||||
and dword [esi + opmgen_t.feedback2], byte 0
|
||||
and dword [esi + opmgen_t.feedback3], byte 0
|
||||
and dword [esi + opmgen_t.feedback4], byte 0
|
||||
calcenv envcalc1, envret1 ; slot1 calculate
|
||||
jl near og_calcslot3
|
||||
mov cl, [esi + ch_t.feedback]
|
||||
mov cl, [edi + ch_t.feedback]
|
||||
test cl, cl
|
||||
je short og_nofeed
|
||||
mov eax, [esi + ch_t.op1fb] ; with feedback
|
||||
mov eax, [edi + ch_t.op1fb] ; with feedback
|
||||
mov ebx, eax
|
||||
shr eax, cl
|
||||
op_out
|
||||
mov [esi + ch_t.op1fb], eax
|
||||
mov [edi + ch_t.op1fb], eax
|
||||
add eax, ebx
|
||||
sar eax, 1
|
||||
jmp short og_algchk
|
||||
og_nofeed: xor eax, eax ; without feedback
|
||||
op_out
|
||||
og_algchk: cmp byte [esi + ch_t.algorithm], 5
|
||||
og_algchk: cmp byte [edi + ch_t.algorithm], 5
|
||||
jne short og_calcalg5
|
||||
mov [_opmgen + opmgen_t.feedback2], eax ; case ALG == 5
|
||||
mov [_opmgen + opmgen_t.feedback3], eax
|
||||
mov [_opmgen + opmgen_t.feedback4], eax
|
||||
mov [esi + opmgen_t.feedback2], eax ; case ALG == 5
|
||||
mov [esi + opmgen_t.feedback3], eax
|
||||
mov [esi + opmgen_t.feedback4], eax
|
||||
jmp short og_calcslot3
|
||||
og_calcalg5: mov ebx, [esi + ch_t.connect1] ; case ALG != 5
|
||||
og_calcalg5: mov ebx, [edi + ch_t.connect1] ; case ALG != 5
|
||||
add [ebx], eax
|
||||
og_calcslot3: add edi, byte slot_t_size ; slot3 calculate
|
||||
calcenv envcalc2, envret2
|
||||
jl short og_calcslot2
|
||||
mov eax, [_opmgen + opmgen_t.feedback2]
|
||||
mov eax, [esi + opmgen_t.feedback2]
|
||||
op_out
|
||||
mov ebx, [esi + ch_t.connect2]
|
||||
mov ebx, [edi - (slot_t_size * 1) + ch_t.connect2]
|
||||
add [ebx], eax
|
||||
og_calcslot2: add edi, byte slot_t_size ; slot2 calculate
|
||||
calcenv envcalc3, envret3
|
||||
jl short og_calcslot4
|
||||
mov eax, [_opmgen + opmgen_t.feedback3]
|
||||
mov eax, [esi + opmgen_t.feedback3]
|
||||
op_out
|
||||
mov ebx, [esi + ch_t.connect3]
|
||||
mov ebx, [edi - (slot_t_size * 2) + ch_t.connect3]
|
||||
add [ebx], eax
|
||||
og_calcslot4: add edi, byte slot_t_size ; slot4 calculate
|
||||
calcenv envcalc4, envret4
|
||||
jl short og_calcsloted
|
||||
mov eax, [_opmgen + opmgen_t.feedback4]
|
||||
mov eax, [esi + opmgen_t.feedback4]
|
||||
op_out
|
||||
mov ebx, [esi + ch_t.connect4]
|
||||
mov ebx, [edi - (slot_t_size * 3) + ch_t.connect4]
|
||||
add [ebx], eax
|
||||
og_calcsloted: inc dword [_opmgen + opmgen_t.playing]
|
||||
og_calcch_nt: add esi, ch_t_size
|
||||
og_calcsloted: sub edi, (slot_t_size * 3)
|
||||
inc dword [esi + opmgen_t.playing]
|
||||
og_calcch_nt: add edi, ch_t_size
|
||||
dec ch
|
||||
jne near og_calcch_lp
|
||||
mov eax, [_opmgen + opmgen_t.outdc]
|
||||
add [_opmgen + opmgen_t.outdl], eax
|
||||
add [_opmgen + opmgen_t.outdr], eax
|
||||
sar dword [_opmgen + opmgen_t.outdl], FMVOL_SFTBIT
|
||||
sar dword [_opmgen + opmgen_t.outdr], FMVOL_SFTBIT
|
||||
mov eax, [esi + opmgen_t.outdc]
|
||||
add [esi + opmgen_t.outdl], eax
|
||||
add [esi + opmgen_t.outdr], eax
|
||||
sar dword [esi + opmgen_t.outdl], FMVOL_SFTBIT
|
||||
sar dword [esi + opmgen_t.outdr], FMVOL_SFTBIT
|
||||
mov edx, [_opmcfg + opmcfg_t.calc1024]
|
||||
mov ebx, [_opmgen + opmgen_t.calcremain]
|
||||
mov ebx, [esi + opmgen_t.calcremain]
|
||||
mov eax, ebx
|
||||
sub ebx, edx
|
||||
jbe short og_nextsamp
|
||||
mov [_opmgen + opmgen_t.calcremain], ebx
|
||||
mov [esi + opmgen_t.calcremain], ebx
|
||||
mov eax, edx
|
||||
imul eax, [_opmgen + opmgen_t.outdl]
|
||||
imul eax, [esi + opmgen_t.outdl]
|
||||
add [esp + OPN_SAMPL], eax
|
||||
imul edx, [_opmgen + opmgen_t.outdr]
|
||||
imul edx, [esi + opmgen_t.outdr]
|
||||
add [esp + OPN_SAMPR], edx
|
||||
jmp near og_fmout_lp
|
||||
og_nextsamp: neg ebx
|
||||
mov [_opmgen + opmgen_t.calcremain], ebx
|
||||
mov [esi + opmgen_t.calcremain], ebx
|
||||
mov edx, eax
|
||||
mov ecx, [_opmcfg + opmcfg_t.fmvol]
|
||||
imul eax, [_opmgen + opmgen_t.outdl]
|
||||
imul edx, [_opmgen + opmgen_t.outdr]
|
||||
imul eax, [esi + opmgen_t.outdl]
|
||||
imul edx, [esi + opmgen_t.outdr]
|
||||
add eax, [esp + OPN_SAMPL]
|
||||
add edx, [esp + OPN_SAMPR]
|
||||
sar eax, 8
|
||||
@ -303,8 +305,8 @@ og_nextsamp: neg ebx
|
||||
pop ebx
|
||||
og_noupdate: ret 4
|
||||
|
||||
setenv envcalc1, envret1, 1
|
||||
setenv envcalc2, envret2, 2
|
||||
setenv envcalc3, envret3, 4
|
||||
setenv envcalc4, envret4, 8
|
||||
setenv envcalc1, envret1, 0
|
||||
setenv envcalc2, envret2, 1
|
||||
setenv envcalc3, envret3, 2
|
||||
setenv envcalc4, envret4, 3
|
||||
|
||||
|
@ -712,18 +712,22 @@ SOURCE=..\VRAM\VRAM.C
|
||||
# PROP Default_Filter ""
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\SOUND\OPMGENC.C
|
||||
SOURCE=..\sound\opmgen.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\x86\OPMGENG.X86
|
||||
SOURCE=..\sound\opmgenc.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\x86\opmgeng.x86
|
||||
|
||||
!IF "$(CFG)" == "xmil - Win32 Release JP"
|
||||
|
||||
# Begin Custom Build - 本萏拶拞... $(InputPath)
|
||||
IntDir=.\..\obj\vc\win9xreljp
|
||||
InputPath=.\x86\OPMGENG.X86
|
||||
InputName=OPMGENG
|
||||
InputPath=.\x86\opmgeng.x86
|
||||
InputName=opmgeng
|
||||
|
||||
"$(IntDir)\$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
|
||||
nasm -f win32 $(InputPath) -o $(IntDir)\$(InputName).obj
|
||||
@ -734,8 +738,8 @@ InputName=OPMGENG
|
||||
|
||||
# Begin Custom Build - 本萏拶拞... $(InputPath)
|
||||
IntDir=.\..\obj\vc\win9xrelworld
|
||||
InputPath=.\x86\OPMGENG.X86
|
||||
InputName=OPMGENG
|
||||
InputPath=.\x86\opmgeng.x86
|
||||
InputName=opmgeng
|
||||
|
||||
"$(IntDir)\$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
|
||||
nasm -f win32 $(InputPath) -o $(IntDir)\$(InputName).obj
|
||||
@ -746,8 +750,8 @@ InputName=OPMGENG
|
||||
|
||||
# Begin Custom Build - 本萏拶拞... $(InputPath)
|
||||
IntDir=.\..\obj\vc\win9xtrc
|
||||
InputPath=.\x86\OPMGENG.X86
|
||||
InputName=OPMGENG
|
||||
InputPath=.\x86\opmgeng.x86
|
||||
InputName=opmgeng
|
||||
|
||||
"$(IntDir)\$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
|
||||
nasm -f win32 $(InputPath) -o $(IntDir)\$(InputName).obj
|
||||
@ -758,8 +762,8 @@ InputName=OPMGENG
|
||||
|
||||
# Begin Custom Build - 本萏拶拞... $(InputPath)
|
||||
IntDir=.\..\obj\vc\win9xdbg
|
||||
InputPath=.\x86\OPMGENG.X86
|
||||
InputName=OPMGENG
|
||||
InputPath=.\x86\opmgeng.x86
|
||||
InputName=opmgeng
|
||||
|
||||
"$(IntDir)\$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
|
||||
nasm -f win32 $(InputPath) -o $(IntDir)\$(InputName).obj
|
||||
|
Loading…
x
Reference in New Issue
Block a user