diff --git a/GEMINIFM.SRC b/GEMINIFM.SRC index d600df4..c8e3fa4 100644 --- a/GEMINIFM.SRC +++ b/GEMINIFM.SRC @@ -642,6 +642,12 @@ BEGIN BYTE OPM_NOTE; BYTE OPM_OCTAVE; + BYTE OPM0_INST; + BYTE OPM1_INST; + BYTE OPM2_INST; + BYTE OPM3_INST; + BYTE OPM4_INST; + BYTE OPM5_INST; {----------------------------------------------------------} {-- FIRST WE SEARCH FOR A YAMAHA SFG DEVICE IN ALL SLOTS --} @@ -847,10 +853,10 @@ BEGIN OD; CLOSE INFILE; - DISPLAY "SONG DATA START ADDRESS:"; + DISPLAY "DATA START ADDRESS:"; CONVERT GEMINI_COMMAND_POINTER TO HEX STR_OUT; DISPLAY STR_OUT; - DISPLAY "SONG DATA END ADDRESS:" + DISPLAY "DATA END ADDRESS:"; CONVERT SONG_LOAD_POINTER TO HEX STR_OUT; DISPLAY STR_OUT; MOVE 1 TO GEMINI_NOT_PAUSED; @@ -912,12 +918,13 @@ BEGIN ^h04: CALL SUB_SET_LOOP; ^h0F: BEGIN MOVE 0 TO GEMINI_NOT_PAUSED; + MCALL BIOS_ENASLT USING ,,^b0100000000000000,3; 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; + ^h30 - ^h3A: CALL SUB_OPM_SET_VOLUME; + ^h40 - ^h46: CALL SUB_OPM_SET_DETUNE; ENDSWITCH; @@ -1097,7 +1104,8 @@ BEGIN 11: MOVE OPLL_FNUM_B TO @OPLL_FNUM; ENDSWITCH; MOVE @OPLL_FNUM TO OPLL_DATA_OUT; - SUBTRACT @OPLL_DETUNE FROM OPLL_DATA_OUT; + {--SUBTRACT @OPLL_DETUNE FROM OPLL_DATA_OUT; + ADD @OPLL_DETUNE TO OPLL_DATA_OUT; MOVE OPLL_FNUM_BASE TO OPLL_REG_OUT; ADD GEMINI_COMMAND_BYTECODE TO OPLL_REG_OUT; CALL SUB_OPLL_WRITE; @@ -1198,6 +1206,12 @@ BEGIN EXIT; SUB_OPM_SET_INSTRUMENT: + MOVE GEMINI_COMMAND_BYTECODE TO OPM_INST_POINTER; + SUBTRACT ^h20 FROM OPM_INST_POINTER; + ADD #OPM0_INST TO OPM_INST_POINTER; + MOVE GEMINI_COMMAND_DATA TO @OPM_INST_POINTER; + + SWITCH ON GEMINI_COMMAND_DATA: ^h00: MOVE #OPM_IF_20 TO OPM_INST_POINTER; ^h01: MOVE #OPM_I0_20 TO OPM_INST_POINTER; @@ -1303,6 +1317,66 @@ BEGIN CALL SUB_OPM_WRITE; EXIT; + SUB_OPM_SET_DETUNE: + MOVE GEMINI_COMMAND_BYTECODE TO OPM_REG_OUT; + SUBTRACT ^h10 FROM OPM_REG_OUT; + + MOVE GEMINI_COMMAND_DATA TO OPM_DATA_OUT; + + {--TODO THIS IS A DUMB HACK + MULTIPLY OPM_DATA_OUT BY ^h10; + + CALL SUB_OPM_WRITE; + + + EXIT; + + SUB_OPM_SET_VOLUME: + {-- TODO OPM DRUMS + IF GEMINI_COMMAND_BYTECODE > ^h35 THEN + CALL SUB_OPLL_SET_VOLUME; + EXIT; + FI; + + SUBTRACT ^h30 FROM GEMINI_COMMAND_BYTECODE; + MOVE GEMINI_COMMAND_BYTECODE TO OPM_INST_POINTER; + ADD #OPM0_INST TO OPM_INST_POINTER; + + SWITCH ON GEMINI_COMMAND_DATA: + ^hF: MOVE 20 TO OPM_DATA_OUT; + ^hE: MOVE 27 TO OPM_DATA_OUT; + ^hD: MOVE 34 TO OPM_DATA_OUT; + ^hC: MOVE 41 TO OPM_DATA_OUT; + ^hB: MOVE 48 TO OPM_DATA_OUT; + ^hA: MOVE 55 TO OPM_DATA_OUT; + ^h9: MOVE 62 TO OPM_DATA_OUT; + ^h8: MOVE 69 TO OPM_DATA_OUT; + ^h7: MOVE 76 TO OPM_DATA_OUT; + ^h6: MOVE 83 TO OPM_DATA_OUT; + ^h5: MOVE 90 TO OPM_DATA_OUT; + ^h4: MOVE 97 TO OPM_DATA_OUT; + ^h3: MOVE 104 TO OPM_DATA_OUT; + ^h2: MOVE 111 TO OPM_DATA_OUT; + ^h1: MOVE 118 TO OPM_DATA_OUT; + ^h0: MOVE 127 TO OPM_DATA_OUT; + + ENDSWITCH; + + {-- TODO RETURN TO THIS ONCE ALTERNATE VOICES ARE IMPLEMENTED + + MOVE GEMINI_COMMAND_BYTECODE TO OPM_REG_OUT; + ADD OPM_OP4VOL_BASE TO OPM_REG_OUT; + CALL SUB_OPM_WRITE; + + IF @OPM_INST_POINTER <> 10 THEN + MOVE GEMINI_COMMAND_BYTECODE TO OPM_REG_OUT; + ADD OPM_OP3VOL_BASE TO OPM_REG_OUT; + CALL SUB_OPM_WRITE; + FI; + + + EXIT; + SUB_OPM_WRITE: {--CONVERT OPM_REG_OUT TO HEX STR_OUT; {--DISPLAY "WRITING ", STR_OUT, " TO 7FF0";