From 030d1aa48d33cd199ff76d211b103c8c20a9994a Mon Sep 17 00:00:00 2001 From: _NetNomad <43683711+TheNetNomad@users.noreply.github.com> Date: Sun, 28 Nov 2021 17:55:16 -0500 Subject: [PATCH] Update GEMINIFM.SRC Preliminary OPM support added --- GEMINIFM.SRC | 679 +++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 664 insertions(+), 15 deletions(-) diff --git a/GEMINIFM.SRC b/GEMINIFM.SRC index 336dd38..d600df4 100644 --- a/GEMINIFM.SRC +++ b/GEMINIFM.SRC @@ -11,6 +11,9 @@ BEGIN SET DOS_CALLF = ^h30; SET DOS_RDSLT = ^h09; SET DOS_WRSLT = ^h11; + SET DOS_ENASLT = ^h21; + + SET BIOS_ENASLT = ^h24; SET CALL_OPCODE = ^hCD; SET RET_OPCODE = ^hC9; @@ -57,6 +60,13 @@ BEGIN FIELD LOOP_STACK LENGTH 32; POINTER TO WORD LOOP_STACK_POINTER VALUE #LOOP_STACK; + BYTE OPM_NOT_FOUND; + + {--------------------------------------- + {-- DOS-SPECIFIC WORK AREA -- + {-- REMOVE THESE IN EMBEDDED REPLAYER -- + {--------------------------------------- + BYTE LASTCHAR; BYTE INCHAR; STRING INBUFFER 512; @@ -150,6 +160,489 @@ BEGIN BYTE OPLL_TM_VOL; BYTE OPLL_CY_VOL; + {------------------ + {-- OPM DEFINES -- + {------------------ + + EXTERNAL BYTE OPM_STATUS_ADDR ADDRESS ^h7FF1; + EXTERNAL BYTE OPM_REG_ADDR ADDRESS ^h7FF0; + EXTERNAL BYTE OPM_DATA_ADDR ADDRESS ^h7FF1; + + SET OPM_NOTE_C = ^h0E; + SET OPM_NOTE_CSHARP = ^h00; + SET OPM_NOTE_D = ^h01; + SET OPM_NOTE_DSHARP = ^h02; + SET OPM_NOTE_E = ^h04; + SET OPM_NOTE_F = ^h05; + SET OPM_NOTE_FSHARP = ^h06; + SET OPM_NOTE_G = ^h08; + SET OPM_NOTE_GSHARP = ^h09; + SET OPM_NOTE_A = ^h0A; + SET OPM_NOTE_ASHARP = ^h0C; + SET OPM_NOTE_B = ^h0D; + + SET OPM_CNTL_REG = ^h08; + SET OPM_OCTNOTE_BASE = ^h18; + SET OPM_ALG_BASE = ^h20; + SET OPM_DETUNE_BASE = ^h30; + SET OPM_OP1VOL_BASE = ^h60; + SET OPM_OP3VOL_BASE = ^h68; + SET OPM_OP2VOL_BASE = ^h70; + SET OPM_OP4VOL_BASE = ^h78; + + POINTER TO BYTE OPM_INST_POINTER; + + {--INSTRUMENT 0; + BYTE OPM_I0_20 VALUE ^hFC; + BYTE OPM_I0_40 VALUE ^h01; + BYTE OPM_I0_48 VALUE ^h01; + BYTE OPM_I0_50 VALUE ^h01; + BYTE OPM_I0_58 VALUE ^h01; + BYTE OPM_I0_60 VALUE ^h1E; + BYTE OPM_I0_68 VALUE ^h7F; + BYTE OPM_I0_70 VALUE ^h19; + BYTE OPM_I0_78 VALUE ^h7F; + BYTE OPM_I0_80 VALUE ^h1F; + BYTE OPM_I0_88 VALUE ^h1F; + BYTE OPM_I0_90 VALUE ^h0F; + BYTE OPM_I0_98 VALUE ^h0F; + BYTE OPM_I0_A0 VALUE ^h1F; + BYTE OPM_I0_A8 VALUE ^h1F; + BYTE OPM_I0_B0 VALUE ^h1F; + BYTE OPM_I0_B8 VALUE ^h1F; + BYTE OPM_I0_C0 VALUE ^h00; + BYTE OPM_I0_C8 VALUE ^h00; + BYTE OPM_I0_D0 VALUE ^h00; + BYTE OPM_I0_D8 VALUE ^h00; + BYTE OPM_I0_E0 VALUE ^h06; + BYTE OPM_I0_E8 VALUE ^h06; + BYTE OPM_I0_F0 VALUE ^h09; + BYTE OPM_I0_F8 VALUE ^h09; + + {--INSTRUMENT 1; + BYTE OPM_I1_20 VALUE ^hFC; + BYTE OPM_I1_40 VALUE ^h33; + BYTE OPM_I1_48 VALUE ^h00; + BYTE OPM_I1_50 VALUE ^h21; + BYTE OPM_I1_58 VALUE ^h01; + BYTE OPM_I1_60 VALUE ^h24; + BYTE OPM_I1_68 VALUE ^h7F; + BYTE OPM_I1_70 VALUE ^h16; + BYTE OPM_I1_78 VALUE ^h7F; + BYTE OPM_I1_80 VALUE ^h5B; + BYTE OPM_I1_88 VALUE ^h1F; + BYTE OPM_I1_90 VALUE ^h1B; + BYTE OPM_I1_98 VALUE ^h9F; + BYTE OPM_I1_A0 VALUE ^h09; + BYTE OPM_I1_A8 VALUE ^h1F; + BYTE OPM_I1_B0 VALUE ^h00; + BYTE OPM_I1_B8 VALUE ^h00; + BYTE OPM_I1_C0 VALUE ^h0B; + BYTE OPM_I1_C8 VALUE ^h1F; + BYTE OPM_I1_D0 VALUE ^h0B; + BYTE OPM_I1_D8 VALUE ^h00; + BYTE OPM_I1_E0 VALUE ^h26; + BYTE OPM_I1_E8 VALUE ^h0F; + BYTE OPM_I1_F0 VALUE ^h0A; + BYTE OPM_I1_F8 VALUE ^h06; + + {--INSTRUMENT 2; + BYTE OPM_I2_20 VALUE ^hEC; + BYTE OPM_I2_40 VALUE ^h03; + BYTE OPM_I2_48 VALUE ^h00; + BYTE OPM_I2_50 VALUE ^h01; + BYTE OPM_I2_58 VALUE ^h00; + BYTE OPM_I2_60 VALUE ^h22; + BYTE OPM_I2_68 VALUE ^h7F; + BYTE OPM_I2_70 VALUE ^h18; + BYTE OPM_I2_78 VALUE ^h7F; + BYTE OPM_I2_80 VALUE ^h5F; + BYTE OPM_I2_88 VALUE ^h1F; + BYTE OPM_I2_90 VALUE ^h1B; + BYTE OPM_I2_98 VALUE ^h1F; + BYTE OPM_I2_A0 VALUE ^h04; + BYTE OPM_I2_A8 VALUE ^h1F; + BYTE OPM_I2_B0 VALUE ^h04; + BYTE OPM_I2_B8 VALUE ^h1F; + BYTE OPM_I2_C0 VALUE ^h03; + BYTE OPM_I2_C8 VALUE ^h1F; + BYTE OPM_I2_D0 VALUE ^h0A; + BYTE OPM_I2_D8 VALUE ^h1F; + BYTE OPM_I2_E0 VALUE ^h06; + BYTE OPM_I2_E8 VALUE ^h0F; + BYTE OPM_I2_F0 VALUE ^h0A; + BYTE OPM_I2_F8 VALUE ^h0F; + + + {--INSTRUMENT 3; + BYTE OPM_I3_20 VALUE ^hFD; + BYTE OPM_I3_40 VALUE ^h01; + BYTE OPM_I3_48 VALUE ^h00; + BYTE OPM_I3_50 VALUE ^h01; + BYTE OPM_I3_58 VALUE ^h01; + BYTE OPM_I3_60 VALUE ^h2A; + BYTE OPM_I3_68 VALUE ^h7F; + BYTE OPM_I3_70 VALUE ^h14; + BYTE OPM_I3_78 VALUE ^h1A; + BYTE OPM_I3_80 VALUE ^h1F; + BYTE OPM_I3_88 VALUE ^h1F; + BYTE OPM_I3_90 VALUE ^h0E; + BYTE OPM_I3_98 VALUE ^h0E; + BYTE OPM_I3_A0 VALUE ^h01; + BYTE OPM_I3_A8 VALUE ^h1F; + BYTE OPM_I3_B0 VALUE ^h1F; + BYTE OPM_I3_B8 VALUE ^h0F; + BYTE OPM_I3_C0 VALUE ^h00; + BYTE OPM_I3_C8 VALUE ^h1F; + BYTE OPM_I3_D0 VALUE ^h00; + BYTE OPM_I3_D8 VALUE ^h1F; + BYTE OPM_I3_E0 VALUE ^h16; + BYTE OPM_I3_E8 VALUE ^h0F; + BYTE OPM_I3_F0 VALUE ^h0A; + BYTE OPM_I3_F8 VALUE ^hFF; + + + {--INSTRUMENT 4; + BYTE OPM_I4_20 VALUE ^hF4; + BYTE OPM_I4_40 VALUE ^h02; + BYTE OPM_I4_48 VALUE ^h00; + BYTE OPM_I4_50 VALUE ^h01; + BYTE OPM_I4_58 VALUE ^h00; + BYTE OPM_I4_60 VALUE ^h1F; + BYTE OPM_I4_68 VALUE ^h7F; + BYTE OPM_I4_70 VALUE ^h17; + BYTE OPM_I4_78 VALUE ^h7F; + BYTE OPM_I4_80 VALUE ^h1F; + BYTE OPM_I4_88 VALUE ^h1F; + BYTE OPM_I4_90 VALUE ^h11; + BYTE OPM_I4_98 VALUE ^h1F; + BYTE OPM_I4_A0 VALUE ^h19; + BYTE OPM_I4_A8 VALUE ^h1F; + BYTE OPM_I4_B0 VALUE ^h1F; + BYTE OPM_I4_B8 VALUE ^h1F; + BYTE OPM_I4_C0 VALUE ^h00; + BYTE OPM_I4_C8 VALUE ^h1F; + BYTE OPM_I4_D0 VALUE ^h00; + BYTE OPM_I4_D8 VALUE ^h1F; + BYTE OPM_I4_E0 VALUE ^h16; + BYTE OPM_I4_E8 VALUE ^h0F; + BYTE OPM_I4_F0 VALUE ^h0A; + BYTE OPM_I4_F8 VALUE ^h0F; + + {--INSTRUMENT 5; + BYTE OPM_I5_20 VALUE ^hEC; + BYTE OPM_I5_40 VALUE ^h01; + BYTE OPM_I5_48 VALUE ^h00; + BYTE OPM_I5_50 VALUE ^h04; + BYTE OPM_I5_58 VALUE ^h00; + BYTE OPM_I5_60 VALUE ^h19; + BYTE OPM_I5_68 VALUE ^h7F; + BYTE OPM_I5_70 VALUE ^h14; + BYTE OPM_I5_78 VALUE ^h7F; + BYTE OPM_I5_80 VALUE ^hDF; + BYTE OPM_I5_88 VALUE ^h1F; + BYTE OPM_I5_90 VALUE ^h11; + BYTE OPM_I5_98 VALUE ^h1F; + BYTE OPM_I5_A0 VALUE ^h1F; + BYTE OPM_I5_A8 VALUE ^h1F; + BYTE OPM_I5_B0 VALUE ^h1F; + BYTE OPM_I5_B8 VALUE ^h1F; + BYTE OPM_I5_C0 VALUE ^h00; + BYTE OPM_I5_C8 VALUE ^h1F; + BYTE OPM_I5_D0 VALUE ^h00; + BYTE OPM_I5_D8 VALUE ^h1F; + BYTE OPM_I5_E0 VALUE ^h06; + BYTE OPM_I5_E8 VALUE ^h0F; + BYTE OPM_I5_F0 VALUE ^h0A; + BYTE OPM_I5_F8 VALUE ^h0F; + + + {--INSTRUMENT 6; + BYTE OPM_I6_20 VALUE ^hFC; + BYTE OPM_I6_40 VALUE ^h01; + BYTE OPM_I6_48 VALUE ^h00; + BYTE OPM_I6_50 VALUE ^h01; + BYTE OPM_I6_58 VALUE ^h00; + BYTE OPM_I6_60 VALUE ^h1E; + BYTE OPM_I6_68 VALUE ^h7F; + BYTE OPM_I6_70 VALUE ^h14; + BYTE OPM_I6_78 VALUE ^h7F; + BYTE OPM_I6_80 VALUE ^h12; + BYTE OPM_I6_88 VALUE ^h1F; + BYTE OPM_I6_90 VALUE ^h16; + BYTE OPM_I6_98 VALUE ^h1F; + BYTE OPM_I6_A0 VALUE ^h06; + BYTE OPM_I6_A8 VALUE ^h1F; + BYTE OPM_I6_B0 VALUE ^h01; + BYTE OPM_I6_B8 VALUE ^h1F; + BYTE OPM_I6_C0 VALUE ^h00; + BYTE OPM_I6_C8 VALUE ^h1F; + BYTE OPM_I6_D0 VALUE ^h00; + BYTE OPM_I6_D8 VALUE ^h1F; + BYTE OPM_I6_E0 VALUE ^h16; + BYTE OPM_I6_E8 VALUE ^h0F; + BYTE OPM_I6_F0 VALUE ^h1A; + BYTE OPM_I6_F8 VALUE ^h0F; + + + {--INSTRUMENT 7; + BYTE OPM_I7_20 VALUE ^hFC; + BYTE OPM_I7_40 VALUE ^h73; + BYTE OPM_I7_48 VALUE ^h33; + BYTE OPM_I7_50 VALUE ^h31; + BYTE OPM_I7_58 VALUE ^h71; + BYTE OPM_I7_60 VALUE ^h3C; + BYTE OPM_I7_68 VALUE ^h23; + BYTE OPM_I7_70 VALUE ^h1E; + BYTE OPM_I7_78 VALUE ^h1E; + BYTE OPM_I7_80 VALUE ^h1F; + BYTE OPM_I7_88 VALUE ^h1F; + BYTE OPM_I7_90 VALUE ^h0F; + BYTE OPM_I7_98 VALUE ^h0F; + BYTE OPM_I7_A0 VALUE ^h1F; + BYTE OPM_I7_A8 VALUE ^h1F; + BYTE OPM_I7_B0 VALUE ^h1F; + BYTE OPM_I7_B8 VALUE ^h1F; + BYTE OPM_I7_C0 VALUE ^h00; + BYTE OPM_I7_C8 VALUE ^h00; + BYTE OPM_I7_D0 VALUE ^h00; + BYTE OPM_I7_D8 VALUE ^h00; + BYTE OPM_I7_E0 VALUE ^h06; + BYTE OPM_I7_E8 VALUE ^h06; + BYTE OPM_I7_F0 VALUE ^h0A; + BYTE OPM_I7_F8 VALUE ^h0A; + + + {--INSTRUMENT 8; + BYTE OPM_I8_20 VALUE ^hF4; + BYTE OPM_I8_40 VALUE ^h01; + BYTE OPM_I8_48 VALUE ^h00; + BYTE OPM_I8_50 VALUE ^h01; + BYTE OPM_I8_58 VALUE ^h00; + BYTE OPM_I8_60 VALUE ^h20; + BYTE OPM_I8_68 VALUE ^h7F; + BYTE OPM_I8_70 VALUE ^h12; + BYTE OPM_I8_78 VALUE ^h7F; + BYTE OPM_I8_80 VALUE ^h10; + BYTE OPM_I8_88 VALUE ^h1F; + BYTE OPM_I8_90 VALUE ^h12; + BYTE OPM_I8_98 VALUE ^h1F; + BYTE OPM_I8_A0 VALUE ^h00; + BYTE OPM_I8_A8 VALUE ^h1F; + BYTE OPM_I8_B0 VALUE ^h1F; + BYTE OPM_I8_B8 VALUE ^h1F; + BYTE OPM_I8_C0 VALUE ^h00; + BYTE OPM_I8_C8 VALUE ^h1F; + BYTE OPM_I8_D0 VALUE ^h00; + BYTE OPM_I8_D8 VALUE ^h1F; + BYTE OPM_I8_E0 VALUE ^h16; + BYTE OPM_I8_E8 VALUE ^h0F; + BYTE OPM_I8_F0 VALUE ^h0A; + BYTE OPM_I8_F8 VALUE ^h0F; + + + + {--INSTRUMENT 9; + BYTE OPM_I9_20 VALUE ^hE8; + BYTE OPM_I9_40 VALUE ^h01; + BYTE OPM_I9_48 VALUE ^h01; + BYTE OPM_I9_50 VALUE ^h01; + BYTE OPM_I9_58 VALUE ^h01; + BYTE OPM_I9_60 VALUE ^h14; + BYTE OPM_I9_68 VALUE ^h21; + BYTE OPM_I9_70 VALUE ^h1C; + BYTE OPM_I9_78 VALUE ^h1B; + BYTE OPM_I9_80 VALUE ^h12; + BYTE OPM_I9_88 VALUE ^h12; + BYTE OPM_I9_90 VALUE ^h12; + BYTE OPM_I9_98 VALUE ^h16; + BYTE OPM_I9_A0 VALUE ^h0C; + BYTE OPM_I9_A8 VALUE ^h0C; + BYTE OPM_I9_B0 VALUE ^h0C; + BYTE OPM_I9_B8 VALUE ^h1F; + BYTE OPM_I9_C0 VALUE ^h00; + BYTE OPM_I9_C8 VALUE ^h00; + BYTE OPM_I9_D0 VALUE ^h00; + BYTE OPM_I9_D8 VALUE ^h00; + BYTE OPM_I9_E0 VALUE ^h36; + BYTE OPM_I9_E8 VALUE ^h36; + BYTE OPM_I9_F0 VALUE ^h36; + BYTE OPM_I9_F8 VALUE ^h0A; + + {--INSTRUMENT 10; + BYTE OPM_IA_20 VALUE ^hD4; + BYTE OPM_IA_40 VALUE ^h03; + BYTE OPM_IA_48 VALUE ^h06; + BYTE OPM_IA_50 VALUE ^h01; + BYTE OPM_IA_58 VALUE ^h02; + BYTE OPM_IA_60 VALUE ^h10; + BYTE OPM_IA_68 VALUE ^h1B; + BYTE OPM_IA_70 VALUE ^h17; + BYTE OPM_IA_78 VALUE ^h1B; + BYTE OPM_IA_80 VALUE ^h1F; + BYTE OPM_IA_88 VALUE ^h1F; + BYTE OPM_IA_90 VALUE ^h1A; + BYTE OPM_IA_98 VALUE ^h1F; + BYTE OPM_IA_A0 VALUE ^h1F; + BYTE OPM_IA_A8 VALUE ^h1F; + BYTE OPM_IA_B0 VALUE ^h00; + BYTE OPM_IA_B8 VALUE ^h00; + BYTE OPM_IA_C0 VALUE ^h00; + BYTE OPM_IA_C8 VALUE ^h00; + BYTE OPM_IA_D0 VALUE ^h0C; + BYTE OPM_IA_D8 VALUE ^h0C; + BYTE OPM_IA_E0 VALUE ^h06; + BYTE OPM_IA_E8 VALUE ^h06; + BYTE OPM_IA_F0 VALUE ^h0A; + BYTE OPM_IA_F8 VALUE ^h0A; + + + {--INSTRUMENT 11; + BYTE OPM_IB_20 VALUE ^hFC; + BYTE OPM_IB_40 VALUE ^h07; + BYTE OPM_IB_48 VALUE ^h00; + BYTE OPM_IB_50 VALUE ^h01; + BYTE OPM_IB_58 VALUE ^h00; + BYTE OPM_IB_60 VALUE ^h30; + BYTE OPM_IB_68 VALUE ^h7F; + BYTE OPM_IB_70 VALUE ^h14; + BYTE OPM_IB_78 VALUE ^h7F; + BYTE OPM_IB_80 VALUE ^h1F; + BYTE OPM_IB_88 VALUE ^h1F; + BYTE OPM_IB_90 VALUE ^h1F; + BYTE OPM_IB_98 VALUE ^h1F; + BYTE OPM_IB_A0 VALUE ^h1F; + BYTE OPM_IB_A8 VALUE ^h1F; + BYTE OPM_IB_B0 VALUE ^h1F; + BYTE OPM_IB_B8 VALUE ^h1F; + BYTE OPM_IB_C0 VALUE ^h0A; + BYTE OPM_IB_C8 VALUE ^h1F; + BYTE OPM_IB_D0 VALUE ^h09; + BYTE OPM_IB_D8 VALUE ^h1F; + BYTE OPM_IB_E0 VALUE ^h06; + BYTE OPM_IB_E8 VALUE ^h0F; + BYTE OPM_IB_F0 VALUE ^h0A; + BYTE OPM_IB_F8 VALUE ^h0F; + + + {--INSTRUMENT 12; + BYTE OPM_IC_20 VALUE ^hF4; + BYTE OPM_IC_40 VALUE ^h01; + BYTE OPM_IC_48 VALUE ^h00; + BYTE OPM_IC_50 VALUE ^h00; + BYTE OPM_IC_58 VALUE ^h00; + BYTE OPM_IC_60 VALUE ^h0D; + BYTE OPM_IC_68 VALUE ^h7F; + BYTE OPM_IC_70 VALUE ^h19; + BYTE OPM_IC_78 VALUE ^h7F; + BYTE OPM_IC_80 VALUE ^h1F; + BYTE OPM_IC_88 VALUE ^h1F; + BYTE OPM_IC_90 VALUE ^h5B; + BYTE OPM_IC_98 VALUE ^h1F; + BYTE OPM_IC_A0 VALUE ^h1F; + BYTE OPM_IC_A8 VALUE ^h1F; + BYTE OPM_IC_B0 VALUE ^h1F; + BYTE OPM_IC_B8 VALUE ^h1F; + BYTE OPM_IC_C0 VALUE ^h0B; + BYTE OPM_IC_C8 VALUE ^h1F; + BYTE OPM_IC_D0 VALUE ^h0B; + BYTE OPM_IC_D8 VALUE ^h1F; + BYTE OPM_IC_E0 VALUE ^h06; + BYTE OPM_IC_E8 VALUE ^h0F; + BYTE OPM_IC_F0 VALUE ^h0A; + BYTE OPM_IC_F8 VALUE ^h0F; + + + + {--INSTRUMENT 13; + BYTE OPM_ID_20 VALUE ^hE4; + BYTE OPM_ID_40 VALUE ^h01; + BYTE OPM_ID_48 VALUE ^h00; + BYTE OPM_ID_50 VALUE ^h01; + BYTE OPM_ID_58 VALUE ^h00; + BYTE OPM_ID_60 VALUE ^h18; + BYTE OPM_ID_68 VALUE ^h7F; + BYTE OPM_ID_70 VALUE ^h14; + BYTE OPM_ID_78 VALUE ^h7F; + BYTE OPM_ID_80 VALUE ^h1F; + BYTE OPM_ID_88 VALUE ^h1F; + BYTE OPM_ID_90 VALUE ^h19; + BYTE OPM_ID_98 VALUE ^h1F; + BYTE OPM_ID_A0 VALUE ^h1F; + BYTE OPM_ID_A8 VALUE ^h1F; + BYTE OPM_ID_B0 VALUE ^h1F; + BYTE OPM_ID_B8 VALUE ^h1F; + BYTE OPM_ID_C0 VALUE ^h09; + BYTE OPM_ID_C8 VALUE ^h1F; + BYTE OPM_ID_D0 VALUE ^h05; + BYTE OPM_ID_D8 VALUE ^h1F; + BYTE OPM_ID_E0 VALUE ^h06; + BYTE OPM_ID_E8 VALUE ^h0F; + BYTE OPM_ID_F0 VALUE ^h0A; + BYTE OPM_ID_F8 VALUE ^h0F; + + + {--INSTRUMENT 14; + BYTE OPM_IE_20 VALUE ^hE4; + BYTE OPM_IE_40 VALUE ^h01; + BYTE OPM_IE_48 VALUE ^h00; + BYTE OPM_IE_50 VALUE ^h01; + BYTE OPM_IE_58 VALUE ^h00; + BYTE OPM_IE_60 VALUE ^h13; + BYTE OPM_IE_68 VALUE ^h7F; + BYTE OPM_IE_70 VALUE ^h14; + BYTE OPM_IE_78 VALUE ^h7F; + BYTE OPM_IE_80 VALUE ^h1F; + BYTE OPM_IE_88 VALUE ^h1F; + BYTE OPM_IE_90 VALUE ^h1B; + BYTE OPM_IE_98 VALUE ^h1F; + BYTE OPM_IE_A0 VALUE ^h1F; + BYTE OPM_IE_A8 VALUE ^h1F; + BYTE OPM_IE_B0 VALUE ^h1F; + BYTE OPM_IE_B8 VALUE ^h1F; + BYTE OPM_IE_C0 VALUE ^h07; + BYTE OPM_IE_C8 VALUE ^h1F; + BYTE OPM_IE_D0 VALUE ^h0A; + BYTE OPM_IE_D8 VALUE ^h1F; + BYTE OPM_IE_E0 VALUE ^h06; + BYTE OPM_IE_E8 VALUE ^h0F; + BYTE OPM_IE_F0 VALUE ^h0A; + BYTE OPM_IE_F8 VALUE ^h0F; + + {--INSTRUMENT 15; + BYTE OPM_IF_20 VALUE ^hE4; + BYTE OPM_IF_40 VALUE ^h07; + BYTE OPM_IF_48 VALUE ^h00; + BYTE OPM_IF_50 VALUE ^h02; + BYTE OPM_IF_58 VALUE ^h00; + BYTE OPM_IF_60 VALUE ^h1E; + BYTE OPM_IF_68 VALUE ^h7F; + BYTE OPM_IF_70 VALUE ^h14; + BYTE OPM_IF_78 VALUE ^h7F; + BYTE OPM_IF_80 VALUE ^h1F; + BYTE OPM_IF_88 VALUE ^h1F; + BYTE OPM_IF_90 VALUE ^h9F; + BYTE OPM_IF_98 VALUE ^h1F; + BYTE OPM_IF_A0 VALUE ^h1F; + BYTE OPM_IF_A8 VALUE ^h1F; + BYTE OPM_IF_B0 VALUE ^h1F; + BYTE OPM_IF_B8 VALUE ^h1F; + BYTE OPM_IF_C0 VALUE ^h08; + BYTE OPM_IF_C8 VALUE ^h1F; + BYTE OPM_IF_D0 VALUE ^h09; + BYTE OPM_IF_D8 VALUE ^h1F; + BYTE OPM_IF_E0 VALUE ^h0F; + BYTE OPM_IF_E8 VALUE ^h0F; + BYTE OPM_IF_F0 VALUE ^h0F; + BYTE OPM_IF_F8 VALUE ^h0F; + + BYTE OPM_REG_OUT; + BYTE OPM_DATA_OUT; + + BYTE OPM_NOTE; + BYTE OPM_OCTAVE; + + {----------------------------------------------------------} {-- FIRST WE SEARCH FOR A YAMAHA SFG DEVICE IN ALL SLOTS --} {----------------------------------------------------------} @@ -166,6 +659,8 @@ BEGIN CALL SUB_SEARCH_FOR_DETECTION_STRING; + MOVE 1 TO OPM_NOT_FOUND; + {---------------------------------------------------------------} {-- NOW WE SEARCH FOR INTERNAL OR CLONE MSX-MUSIC DEVICE --} {-- THESE CAN BE USED IMMEDIATELY AND SHOULD NOT BE ACTIVATED --} @@ -388,24 +883,53 @@ BEGIN IF WAIT_COUNT > 0 THEN SUBTRACT 1 FROM WAIT_COUNT; ELSE + IF OPM_NOT_FOUND = 0 THEN + MCALL BIOS_ENASLT USING ,,^b0100000000000000,DETECT_SLOT; + FI; + WHILE WAIT_COUNT < 1 DO MOVE @GEMINI_COMMAND_POINTER TO GEMINI_COMMAND; - SWITCH ON GEMINI_COMMAND_BYTECODE: - ^h01: MOVE GEMINI_COMMAND_DATA TO TEMPO; - ^h02: CALL SUB_OPLL_NOTE_OFF; - ^h03: MOVE GEMINI_COMMAND_DATA TO WAIT_COUNT; - ^h04: CALL SUB_SET_LOOP; - ^h0F: BEGIN - MOVE 0 TO GEMINI_NOT_PAUSED; - EXIT; - END; - ^h10 - ^h16: CALL SUB_OPLL_NOTE_ON; - ^h20 - ^h25: CALL SUB_OPLL_SET_INSTRUMENT; - ^h30 - ^h3A: CALL SUB_OPLL_SET_VOLUME; - ^h40 - ^h46: CALL SUB_SET_DETUNE; - ENDSWITCH; + IF OPM_NOT_FOUND THEN + SWITCH ON GEMINI_COMMAND_BYTECODE: + ^h01: MOVE GEMINI_COMMAND_DATA TO TEMPO; + ^h02: CALL SUB_OPLL_NOTE_OFF; + ^h03: MOVE GEMINI_COMMAND_DATA TO WAIT_COUNT; + ^h04: CALL SUB_SET_LOOP; + ^h0F: BEGIN + MOVE 0 TO GEMINI_NOT_PAUSED; + EXIT; + END; + ^h10 - ^h16: CALL SUB_OPLL_NOTE_ON; + ^h20 - ^h25: CALL SUB_OPLL_SET_INSTRUMENT; + ^h30 - ^h3A: CALL SUB_OPLL_SET_VOLUME; + ^h40 - ^h46: CALL SUB_OPLL_SET_DETUNE; + ENDSWITCH; + ELSE + SWITCH ON GEMINI_COMMAND_BYTECODE: + ^h01: MOVE GEMINI_COMMAND_DATA TO TEMPO; + ^h02: CALL SUB_OPM_NOTE_OFF; + ^h03: MOVE GEMINI_COMMAND_DATA TO WAIT_COUNT; + ^h04: CALL SUB_SET_LOOP; + ^h0F: BEGIN + MOVE 0 TO GEMINI_NOT_PAUSED; + EXIT; + END; + ^h10 - ^h16: CALL SUB_OPM_NOTE_ON; + ^h20 - ^h25: CALL SUB_OPM_SET_INSTRUMENT; + {--^h30 - ^h3A: CALL SUB_OPM_SET_VOLUME; + {--^h40 - ^h46: CALL SUB_OPM_SET_DETUNE; + ENDSWITCH; + + + + FI; ADD 2 TO GEMINI_COMMAND_POINTER; OD; + + IF OPM_NOT_FOUND = 0 THEN + {-- TODO DON'T ASSUME WHAT PAGE WE CAME FROM!!! + MCALL BIOS_ENASLT USING ,,^b0100000000000000,3; + FI; FI; ELSE ADD 1 TO TEMPO_COUNTER; @@ -662,7 +1186,7 @@ BEGIN CALL SUB_OPLL_WRITE; EXIT; - SUB_SET_DETUNE: + SUB_OPLL_SET_DETUNE: {--------------------------------} {-- SET CHANNEL DETUNE --} {--------------------------------} @@ -672,4 +1196,129 @@ BEGIN ADD #OPLL0_DETUNE TO OPLL_DETUNE; MOVE GEMINI_COMMAND_DATA TO @OPLL_DETUNE; EXIT; + + SUB_OPM_SET_INSTRUMENT: + SWITCH ON GEMINI_COMMAND_DATA: + ^h00: MOVE #OPM_IF_20 TO OPM_INST_POINTER; + ^h01: MOVE #OPM_I0_20 TO OPM_INST_POINTER; + ^h02: MOVE #OPM_I1_20 TO OPM_INST_POINTER; + ^h03: MOVE #OPM_I2_20 TO OPM_INST_POINTER; + ^h04: MOVE #OPM_I3_20 TO OPM_INST_POINTER; + ^h05: MOVE #OPM_I4_20 TO OPM_INST_POINTER; + ^h06: MOVE #OPM_I5_20 TO OPM_INST_POINTER; + ^h07: MOVE #OPM_I6_20 TO OPM_INST_POINTER; + ^h08: MOVE #OPM_I7_20 TO OPM_INST_POINTER; + ^h09: MOVE #OPM_I8_20 TO OPM_INST_POINTER; + ^h0A: MOVE #OPM_I9_20 TO OPM_INST_POINTER; + ^h0B: MOVE #OPM_IA_20 TO OPM_INST_POINTER; + ^h0C: MOVE #OPM_IB_20 TO OPM_INST_POINTER; + ^h0D: MOVE #OPM_IC_20 TO OPM_INST_POINTER; + ^h0E: MOVE #OPM_ID_20 TO OPM_INST_POINTER; + ^h0F: MOVE #OPM_IE_20 TO OPM_INST_POINTER; + ENDSWITCH; + + + + MOVE GEMINI_COMMAND_BYTECODE TO OPM_REG_OUT; + {--ADD ^h20 TO OPM_REG_OUT; + + MOVE @OPM_INST_POINTER TO OPM_DATA_OUT; + + CALL SUB_OPM_WRITE; + + ADD ^h20 TO OPM_REG_OUT; + ADD ^h01 TO OPM_INST_POINTER; + + WHILE OPM_REG_OUT > ^h3F + MOVE @OPM_INST_POINTER TO OPM_DATA_OUT; + + CALL SUB_OPM_WRITE; + + ADD 1 TO OPM_INST_POINTER; + ADD 8 TO OPM_REG_OUT; + + OD; + + EXIT; + + SUB_OPM_NOTE_ON: + {-- TODO OPM DRUMS + + IF GEMINI_COMMAND_BYTECODE = ^h16 THEN + CALL SUB_OPLL_NOTE_ON; + EXIT; + FI; + + + MOVE ^h18 TO OPM_REG_OUT; + ADD GEMINI_COMMAND_BYTECODE TO OPM_REG_OUT; + + DIVIDE GEMINI_COMMAND_DATA BY 12 GIVING OPM_OCTAVE REMAINDER OPM_NOTE; + SWITCH ON OPM_NOTE: + 0: BEGIN + MOVE OPM_NOTE_C TO OPM_DATA_OUT; + SUBTRACT 1 FROM OPM_OCTAVE; + END; + 1: MOVE OPM_NOTE_CSHARP TO OPM_DATA_OUT; + 2: MOVE OPM_NOTE_D TO OPM_DATA_OUT; + 3: MOVE OPM_NOTE_DSHARP TO OPM_DATA_OUT; + 4: MOVE OPM_NOTE_E TO OPM_DATA_OUT; + 5: MOVE OPM_NOTE_F TO OPM_DATA_OUT; + 6: MOVE OPM_NOTE_FSHARP TO OPM_DATA_OUT; + 7: MOVE OPM_NOTE_G TO OPM_DATA_OUT; + 8: MOVE OPM_NOTE_GSHARP TO OPM_DATA_OUT; + 9: MOVE OPM_NOTE_A TO OPM_DATA_OUT; + 10: MOVE OPM_NOTE_ASHARP TO OPM_DATA_OUT; + 11: MOVE OPM_NOTE_B TO OPM_DATA_OUT; + ENDSWITCH; + + SUBTRACT 1 FROM OPM_OCTAVE; + MULTIPLY OPM_OCTAVE BY ^h10; + ADD OPM_OCTAVE TO OPM_DATA_OUT; + + CALL SUB_OPM_WRITE; + + + MOVE OPM_CNTL_REG TO OPM_REG_OUT; + + MOVE GEMINI_COMMAND_BYTECODE TO OPM_DATA_OUT; + SUBTRACT ^h10 FROM OPM_DATA_OUT; + ADD ^b01111000 TO OPM_DATA_OUT; + CALL SUB_OPM_WRITE; + + EXIT; + + SUB_OPM_NOTE_OFF: + {-- TODO OPM DRUMS + + IF GEMINI_COMMAND_DATA = ^h06 THEN + CALL SUB_OPLL_NOTE_OFF; + EXIT; + FI; + + + MOVE OPM_CNTL_REG TO OPM_REG_OUT; + + MOVE GEMINI_COMMAND_DATA TO OPM_DATA_OUT; + CALL SUB_OPM_WRITE; + EXIT; + + SUB_OPM_WRITE: + {--CONVERT OPM_REG_OUT TO HEX STR_OUT; + {--DISPLAY "WRITING ", STR_OUT, " TO 7FF0"; + + WHILE OPM_STATUS_ADDR > ^b01111111 DO + OD; + + MOVE OPM_REG_OUT TO OPM_REG_ADDR; + + {--CONVERT OPM_DATA_OUT TO HEX STR_OUT; + {--DISPLAY "WRITING ", STR_OUT, " TO 7FF1"; + + WHILE OPM_STATUS_ADDR > ^b01111111 DO + OD; + + MOVE OPM_DATA_OUT TO OPM_DATA_ADDR; + EXIT; + END;