📄 masnddrv.c
字号:
UINT32 dBlink; /* blink */
UINT32 dFreq; /* frequency */
} MASNDDRVLEDINFO, *PMASNDDRVLEDINFO;
typedef struct _MASNDDRVMTRINFO
{
UINT32 dCtrl; /* control */
UINT32 dBlink; /* blink */
UINT32 dFreq; /* frequency */
} MASNDDRVMTRINFO, *PMASNDDRVMTRINFO;
typedef struct _MASNDDRVSEQBUFINFO
{
UINT8 bSequenceFlag; /* sequence flag */
UINT8 * pbBufPtr; /* pointer to the buffer */
UINT32 dBufSize; /* size of the buffer */
UINT8 bQueueFlag; /* queue flag */
UINT32 dQueueSize; /* size of data in queue */
UINT32 dQueueWPtr; /* write pointer */
UINT32 dWroteSize; /* size of wrote data */
UINT8 bQueue[2048]; /* queue */
} MASNDDRVSEQBUFINFO, *PMASNDDRVSEQBUFINFO;
typedef struct _MASNDDRVINFO
{
UINT8 bStatus; /* status */
UINT8 bDrumMode; /* drum mode */
UINT8 bDvaMode; /* dva mode */
UINT8 bMelodyMode; /* melody mode */
UINT8 bDrumType; /* drum type */
UINT8 bWtVolMode; /* wt volume mode */
UINT8 bHvType; /* hv language type */
UINT8 bBalVolumeL; /* balance volume L */
UINT8 bBalVolumeR; /* balance volume R */
UINT8 bFmVolume; /* fm volume */
UINT8 bWtVolume; /* wt volume */
UINT8 bSaVolume; /* sa volume */
UINT8 bHvVolume; /* hv volume */
UINT8 bMasterVolShiftL; /* shift value of master volume L */
UINT8 bMasterVolShiftR; /* shift value of master volume R */
UINT8 bFmVolShift; /* shift value of fm volume */
UINT8 bWtVolShift; /* shift value of wt volume */
UINT8 bSaVolShift; /* shift value of stream volume */
UINT8 bHvVolShift; /* shift value of hv volume */
UINT8 bMasterVolume; /* master volume */
UINT8 bWaveSlave; /* wave slave number */
UINT8 bSpeed; /* speed */
SINT8 sbKeyOffset; /* key offset for key control */
UINT8 bSaLedMtrSync; /* stream LED/Motor sync flag bit0:LED bit1:Motor 0:off 1:on */
UINT8 bHvLedMtrSync; /* HV LED/Motor sync flag bit0:LED bit1:Motor 0:off 1:on */
UINT8 bHvChannel; /* channel number for HV */
UINT32 dTimeBase; /* time base */
UINT32 dChNum; /* number of channel */
UINT32 dFmNum; /* number of FM slot */
UINT32 dWtNum; /* number of WT slot */
UINT32 dSaNum; /* number of stream audio slot */
UINT32 dAlNum; /* number of AL slot */
UINT32 dHvNum; /* number of HV slot */
UINT32 dRbNum; /* number of ram block */
UINT32 dChMap; /* bit mapping of channel */
UINT32 dFmMap; /* bit mapping of FM slot */
UINT32 dWtMap; /* bit mapping of WT slot */
UINT32 dSaMap; /* bit mapping of stream audio slot */
UINT32 dAlMap; /* bit mapping of AL slot */
UINT32 dHvMap; /* bit mapping of HV slot */
UINT32 dRbMap; /* bit mapping of ram block */
UINT32 dLdMap; /* bit mapping of led */
UINT32 dMtMap; /* bit mapping of motor */
UINT32 dEosFlag; /* end of sequence flag */
UINT32 dMinSlot[3]; /* minimum slot number */
UINT32 dMaxSlot[3]; /* maximum slot number */
} MASNDDRVINFO, *PMASNDDRVINFO;
#define MASNDDRV_STMSTAT_MONO0 (0x01)
#define MASNDDRV_STMSTAT_MONO1 (0x02)
#define MASNDDRV_STMSTAT_STEREO (0x04)
typedef struct _MASNDDRVSTMCTRLINFO {
UINT32 dQueFlag; /* 0:not exist 1:exist */
UINT32 dType[2]; /* 0x00(00000000):not exist */
/* 0x01(00000001):Mono */
/* 0x02(00000010):Stereo */
/* 0x80(10000000):ON bit */
UINT32 dRamVal[2];
UINT32 dStreamStatus; /* ........1 mono#0 */
/* .......1. mono#1 */
/* ......1.. stereo */
UINT32 dWaveId[2];
} MASNDDRVSTMCTRLINFO, *PMASNDDRVSTMCTRLINFO;
typedef struct _MASNDDRVSTMPARAM
{
UINT8 bPanpot; /* panpot */
UINT8 bStm; /* stream */
UINT8 bPe; /* pan enable */
UINT8 bPanOff; /* pan off */
UINT8 bMode; /* mode */
UINT8 bSaId; /* stream audio id */
UINT8 bVoVolume; /* voice volume */
UINT16 wPitch; /* pitch */
UINT16 wEndPoint; /* end point */
} MASNDDRVSTMPARAM, *PMASNDDRVSTMPARAM;
typedef struct _MASNDDRVGROBALINFO
{
UINT8 bCtrlSequencer[MASMW_NUM_SEQTYPE];
UINT8 bPacketBuf[MASMW_NUM_SEQTYPE][256];
UINT32 dHvEventInfo[MASMW_NUM_SEQTYPE];
/* x.......:exist bit (0:not exist 1:exist) */
/* .xxxxxxx:ram value */
SINT32 (* pfnSrmCnv[MASMW_NUM_SEQTYPE])( void );
MASNDDRVINFO sSndDrvInfo[MASMW_NUM_SEQTYPE];
MASNDDRVSTMINFO sStreamInfo[MASMW_NUM_SEQTYPE][MA_MAX_REG_STREAM_AUDIO];
MASNDDRVVOICEINFO sVoiceInfo[MASNDDRV_NUM_VOICEINFO][MASNDDRV_MAX_REG_VOICE*2];
UINT8 bVoiceIndex[MASNDDRV_MAX_RAM_BANK*2*128]; /* (Bank[16+16]) * Prog */
/* index of sVoiceInfo */
/* NULL if index = 0xff */
MASNDDRVALVOICEINFO sAlVoiceInfo[MASNDDRV_NUM_ALVOICE];
MASNDDRVCHINFO sChInfo[MASNDDRV_NUM_CHANNEL];
MASNDDRVSLOTINFO sSlotInfo[MASNDDRV_NUM_SLOT];
MASNDDRVLEDINFO sLedInfo;
MASNDDRVMTRINFO sMtrInfo;
MASNDDRVSEQBUFINFO sSeqbufInfo;
MASNDDRVSTMCTRLINFO sStreamCtrlInfo;
} MASNDDRVGROBALINFO, *PMASNDDRVGROBALINFO;
static MASNDDRVGROBALINFO gMaSndDrvInfo;
static PMASNDDRVGROBALINFO gpMaSndDrvInfo;
static SINT32 MaSndDrv_Nop ( SINT32 sid, SINT32 dt, UINT32 tp, UINT32 p2, UINT32 p3 );
static SINT32 MaSndDrv_NoteOn ( SINT32 sid, SINT32 dt, UINT32 ch, UINT32 key, UINT32 vel );
static SINT32 MaSndDrv_NoteOnMa2 ( SINT32 sid, SINT32 dt, UINT32 ch, UINT32 key, UINT32 vel );
static SINT32 MaSndDrv_NoteOnMa2Ex ( SINT32 sid, SINT32 dt, UINT32 ch, UINT32 key, UINT32 vel );
static SINT32 MaSndDrv_NoteOff ( SINT32 sid, SINT32 dt, UINT32 ch, UINT32 key, UINT32 p3 );
static SINT32 MaSndDrv_NoteOffMa2 ( SINT32 sid, SINT32 dt, UINT32 ch, UINT32 key, UINT32 p3 );
static SINT32 MaSndDrv_NoteOffMa2Ex ( SINT32 sid, SINT32 dt, UINT32 ch, UINT32 key, UINT32 p3 );
static SINT32 MaSndDrv_ProgramChange ( SINT32 sid, SINT32 dt, UINT32 ch, UINT32 bkn, UINT32 prg );
static SINT32 MaSndDrv_ModulationDepth ( SINT32 sid, SINT32 dt, UINT32 ch, UINT32 dph, UINT32 p3 );
static SINT32 MaSndDrv_ChannelVolume ( SINT32 sid, SINT32 dt, UINT32 ch, UINT32 vol, UINT32 p3 );
static SINT32 MaSndDrv_Panpot ( SINT32 sid, SINT32 dt, UINT32 ch, UINT32 pan, UINT32 p3 );
static SINT32 MaSndDrv_Expression ( SINT32 sid, SINT32 dt, UINT32 ch, UINT32 vol, UINT32 p3 );
static SINT32 MaSndDrv_Hold1 ( SINT32 sid, SINT32 dt, UINT32 ch, UINT32 val, UINT32 p3 );
static SINT32 MaSndDrv_AllSoundOff ( SINT32 sid, SINT32 dt, UINT32 ch, UINT32 p2, UINT32 p3 );
static SINT32 MaSndDrv_ResetAllControllers ( SINT32 sid, SINT32 dt, UINT32 ch, UINT32 p2, UINT32 p3 );
static SINT32 MaSndDrv_AllNoteOff ( SINT32 sid, SINT32 dt, UINT32 ch, UINT32 p2, UINT32 p3 );
static SINT32 MaSndDrv_MonoModeOn ( SINT32 sid, SINT32 dt, UINT32 ch, UINT32 p2, UINT32 p3 );
static SINT32 MaSndDrv_PolyModeOn ( SINT32 sid, SINT32 dt, UINT32 ch, UINT32 p2, UINT32 p3 );
static SINT32 MaSndDrv_PitchBend ( SINT32 sid, SINT32 dt, UINT32 ch, UINT32 val, UINT32 p3 );
static SINT32 MaSndDrv_BendRange ( SINT32 sid, SINT32 dt, UINT32 ch, UINT32 rng, UINT32 p3 );
static SINT32 MaSndDrv_StreamOn ( SINT32 sid, SINT32 dt, UINT32 ch, UINT32 wid, UINT32 vel );
static SINT32 MaSndDrv_StreamOff ( SINT32 sid, SINT32 dt, UINT32 ch, UINT32 wid, UINT32 p3 );
static SINT32 MaSndDrv_StreamSlave ( SINT32 sid, SINT32 dt, UINT32 ch, UINT32 wid, UINT32 vel );
static SINT32 MaSndDrv_StreamPanpot ( SINT32 sid, SINT32 dt, UINT32 wv, UINT32 pan, UINT32 p3 );
static SINT32 MaSndDrv_MasterVolume ( SINT32 sid, SINT32 dt, UINT32 vl, UINT32 p2, UINT32 p3 );
static SINT32 MaSndDrv_SystemOn ( SINT32 sid, SINT32 dt, UINT32 p1, UINT32 p2, UINT32 p3 );
static SINT32 MaSndDrv_UserEvent ( SINT32 sid, SINT32 dt, UINT32 vl, UINT32 p2, UINT32 p3 );
static SINT32 MaSndDrv_LedSyncCh ( SINT32 sid, SINT32 dt, UINT32 p1, UINT32 p2, UINT32 p3 );
static SINT32 MaSndDrv_MotorSyncCh ( SINT32 sid, SINT32 dt, UINT32 p1, UINT32 p2, UINT32 p3 );
static SINT32 MaSndDrv_StreamPause ( SINT32 sid, SINT32 dt, UINT32 p1, UINT32 p2, UINT32 p3 );
static SINT32 MaSndDrv_StreamRestart ( SINT32 sid, SINT32 dt, UINT32 p1, UINT32 p2, UINT32 p3 );
static SINT32 MaSndDrv_VolumeDirect ( SINT32 sid, SINT32 dt, UINT32 p1, UINT32 p2, UINT32 p3 );
static SINT32 MaSndDrv_SetLpfQ ( SINT32 sid, SINT32 dt, UINT32 p1, UINT32 p2, UINT32 p3 );
static SINT32 MaSndDrv_SetLpfCof ( SINT32 sid, SINT32 dt, UINT32 p1, UINT32 p2, UINT32 p3 );
static SINT32 MaSndDrv_HvNoteOn ( SINT32 sid, SINT32 dt, UINT32 p1, UINT32 p2, UINT32 p3 );
static SINT32 MaSndDrv_HvNoteOff ( SINT32 sid, SINT32 dt, UINT32 p1, UINT32 p2, UINT32 p3 );
static SINT32 MaSndDrv_HvProgramChange ( SINT32 sid, SINT32 dt, UINT32 p1, UINT32 p2, UINT32 p3 );
static SINT32 MaSndDrv_HvPitchBend ( SINT32 sid, SINT32 dt, UINT32 p1, UINT32 p2, UINT32 p3 );
static SINT32 MaSndDrv_HvBendRange ( SINT32 sid, SINT32 dt, UINT32 p1, UINT32 p2, UINT32 p3 );
static SINT32 MaSndDrv_HvProsodicBendRange ( SINT32 sid, SINT32 dt, UINT32 p1, UINT32 p2, UINT32 p3 );
static SINT32 MaSndDrv_HvChannelVolume ( SINT32 sid, SINT32 dt, UINT32 p1, UINT32 p2, UINT32 p3 );
static SINT32 MaSndDrv_HvPanpot ( SINT32 sid, SINT32 dt, UINT32 p1, UINT32 p2, UINT32 p3 );
static SINT32 MaSndDrv_HvAllSoundOff ( SINT32 sid, SINT32 dt, UINT32 p1, UINT32 p2, UINT32 p3 );
static SINT32 MaSndDrv_StreamSeek ( SINT32 sid, SINT32 dt, UINT32 p1, UINT32 p2, UINT32 p3 );
static SINT32 MaSndDrv_HvEvent ( SINT32 sid, SINT32 dt, UINT32 p1, UINT32 p2, UINT32 p3 );
static SINT32 MaSndDrv_CoaseTune ( SINT32 sid, SINT32 dt, UINT32 p1, UINT32 p2, UINT32 p3 );
static SINT32 MaSndDrv_FineTune ( SINT32 sid, SINT32 dt, UINT32 p1, UINT32 p2, UINT32 p3 );
static SINT32 dummy_mahvdrv_Initialize ( UINT32 dTimeBase );
static SINT32 dummy_mahvdrv_SetDictionary ( UINT8 *pbDict, UINT32 dSize, UINT32 dMode, void *pvExtArgs );
static SINT32 dummy_mahvdrv_SetCommand ( UINT32 dCmd, UINT32 dParam1, UINT32 dParam2 );
static SINT32 dummy_mahvdrv_Generate ( UINT8 *pbPacket );
static SINT32 dummy_mahvdrv_Terminate ( void );
static SINT32 (* ma_snddrv_command[])( SINT32 sid, SINT32 dt, UINT32 p1, UINT32 p2, UINT32 p3 ) =
{
MaSndDrv_NoteOn, /* 0 */
MaSndDrv_NoteOnMa2, /* 1 */
MaSndDrv_NoteOnMa2Ex, /* 2 */
MaSndDrv_NoteOff, /* 3 */
MaSndDrv_NoteOffMa2, /* 4 */
MaSndDrv_NoteOffMa2Ex, /* 5 */
MaSndDrv_ProgramChange, /* 6 */
MaSndDrv_ModulationDepth, /* 7 */
MaSndDrv_ChannelVolume, /* 8 */
MaSndDrv_Panpot, /* 9 */
MaSndDrv_Expression, /* 10 */
MaSndDrv_Hold1, /* 11 */
MaSndDrv_AllSoundOff, /* 12 */
MaSndDrv_ResetAllControllers, /* 13 */
MaSndDrv_AllNoteOff, /* 14 */
MaSndDrv_MonoModeOn, /* 15 */
MaSndDrv_PolyModeOn, /* 16 */
MaSndDrv_PitchBend, /* 17 */
MaSndDrv_BendRange, /* 18 */
MaSndDrv_StreamOn, /* 19 */
MaSndDrv_StreamOff, /* 20 */
MaSndDrv_StreamSlave, /* 21 */
MaSndDrv_StreamPanpot, /* 22 */
MaSndDrv_MasterVolume, /* 23 */
MaSndDrv_SystemOn, /* 24 */
MaSndDrv_Nop, /* 25 */
MaSndDrv_Nop, /* 26 */
MaSndDrv_Nop, /* 27 */
MaSndDrv_Nop, /* 28 */
MaSndDrv_UserEvent, /* 29 */
MaSndDrv_Nop, /* 30 */
MaSndDrv_LedSyncCh, /* 31 */
MaSndDrv_MotorSyncCh, /* 32 */
MaSndDrv_StreamPause, /* 33 */
MaSndDrv_StreamRestart, /* 34 */
MaSndDrv_VolumeDirect, /* 35 */
MaSndDrv_SetLpfQ, /* 36 */
MaSndDrv_SetLpfCof, /* 37 */
MaSndDrv_Nop, /* 38 */
MaSndDrv_Nop, /* 39 */
MaSndDrv_HvNoteOn, /* 40 */
MaSndDrv_HvNoteOff, /* 41 */
MaSndDrv_HvProgramChange, /* 42 */
MaSndDrv_HvPitchBend, /* 43 */
MaSndDrv_HvBendRange, /* 44 */
MaSndDrv_HvProsodicBendRange, /* 45 */
MaSndDrv_Nop, /* 46 */
MaSndDrv_HvChannelVolume, /* 47 */
MaSndDrv_HvPanpot, /* 48 */
MaSndDrv_Nop, /* 49 */
MaSndDrv_HvAllSoundOff, /* 50 */
MaSndDrv_StreamSeek, /* 51 */
MaSndDrv_HvEvent, /* 52 */
MaSndDrv_CoaseTune, /* 53 */
MaSndDrv_FineTune /* 54 */
};
/*** Global value for HV ***********************************************************/
typedef struct _MAHVDRVFUNC
{
SINT32 (* Initialize) ( UINT32 dTimeBase );
SINT32 (* SetDictionary) ( UINT8 *pbDict, UINT32 dSize, UINT32 dMode, void *pvExtArgs );
SINT32 (* SetCommand) ( UINT32 dCmd, UINT32 dParam1, UINT32 dParam2 );
SINT32 (* Generate) ( UINT8 *pbPacket );
SINT32 (* Terminate) ( void );
} MAHVDRVFUNC, *PMAHVDRVFUNC;
static MAHVDRVFUNC pfnHvFunc[MASNDDRV_NUM_HVTYPE] =
{
#if MASMW_SRMCNV_HVS
{ /* 0 */
MaHvDrvJP_Initialize,
MaHvDrvJP_SetDictionary,
MaHvDrvJP_SetCommand,
MaHvDrvJP_Generate,
MaHvDrvJP_Terminate
},
#else
MASNDDRV_DUMMY_HVDRVFUNC,
#endif
MASNDDRV_DUMMY_HVDRVFUNC /* 1 */
};
/************************************************************************************/
/*--- for DeviceControl */
#if (MA_DEVICETYPE != MASMW_DEVICETYPE_MA5)
static const UINT8 bImRegJudgeW[MASNDDRV_NUM_DEVICETYPE-1][MASNDDRV_NUM_BANK3] =
{
{
/* MA-5S */
0, 0, 0, 0, 0, 1, 1, 1, 1, 1,
1, 1, 1, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0
},
{
/* MA-5i */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1, 1, 1, 0, 0, 0, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 0, 0
}
};
static const UINT8 bImRegJudgeR[MASNDDRV_NUM_DEVICETYPE-1][MASNDDRV_NUM_BANK3] =
{
{
/* MA-5S */
0, 0, 0, 0, 0, 0, 0, 0, 1, 1,
1, 1, 1, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0
},
{
/* MA-5i */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1, 1, 1, 0, 0, 0, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 0, 1
}
};
#endif
/*--- for SetCommand */
static const UINT8 bCmdJudge[MASMW_NUM_SEQTYPE][MASNDDRV_NUM_COMMAND] =
{
{
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* note on - panpot */
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* expression - stream on */
1, 1, 1, 1, 1, 0, 0, 0, 0, 1, /* stream off - user event */
1, 1, 1, 0, 0, 1, 1, 1, 0, 0, /* nop - hv reset wait */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* hv note on - hv key control */
0, 0, 1, 1, 1 /* hv all sound off - fine tune */
},
{
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* noteon - panpot */
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* expression - streamon */
1, 1, 1, 1, 1, 0, 0, 0, 0, 0, /* stream off - user event */
1, 1, 1, 1, 1, 1, 1, 1, 0, 0, /* nop - hv reset wait */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* hv note on - hv key control */
0, 1, 1, 1, 1 /* hv all sound off - fine tune */
},
{
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* noteon - panpot */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* expression - streamon */
0, 0, 0, 0, 1, 0, 0, 0, 0, 0, /* stream off - user event */
0, 1, 1, 0, 0, 0, 0, 0, 0, 0, /* nop - hv reset wait */
1, 1, 1, 1, 1, 1, 0, 1, 1, 0, /* hv note on - hv key control */
1, 0, 0, 0, 0 /* hv all sound off - fine tune */
}
};
static const UINT8 bChannelCmd[MASNDDRV_NUM_COMMAND] =
{
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* noteon - panpot */
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* expression - streamon */
1, 1, 0, 0, 0, 0, 0, 0, 0, 0, /* stream off - user event */
0, 0, 0, 0, 0, 1, 1, 1, 0, 0, /* nop - hv reset wait */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* hv note on - hv key control */
0, 0, 0, 1, 1 /* hv all sound off - fine tune */
};
extern void machdep_memcpy( UINT8 *d, UINT8 *s, UINT32 size );
extern void machdep_EnterCriticalSection(void);
extern void machdep_LeaveCriticalSection(void);
/*--------------------------------------------------------------------------*
Dummy Functions
*--------------------------------------------------------------------------*/
static SINT32 dummy_mahvdrv_Initialize( UINT32 dTimeBase )
{
(void)dTimeBase;
return MASMW_ERROR;
}
static SINT32 dummy_mahvdrv_SetDictionary( UINT8 *pbDict, UINT32 dSize, UINT32 dMode, void *pvExtArgs )
{
(void)pbDict;
(void)dSize;
(void)dMode;
(void)pvExtArgs;
return MASMW_ERROR;
}
static SINT32 dummy_mahvdrv_SetCommand( UINT32 dCmd, UINT32 dParam1, UINT32 dParam2 )
{
(void)dCmd;
(void)dParam1;
(void)dParam2;
return MASMW_SUCCESS;
}
static SINT32 dummy_mahvdrv_Generate( UINT8 *pbPacket )
{
(void)pbPacket;
return MASMW_SUCCESS;
}
static SINT32 dummy_mahvdrv_Terminate( void )
{
return MASMW_ERROR;
}
/*--------------------------------------------------------------------------*
Functions for pitch
*--------------------------------------------------------------------------*/
/****************************************************************************
* GetMa5FmPitch
*
* Description:
* Calc Block&Fnum. (FM/MA-5)
* Argument:
* dBank NoteOn Bank# (0..255)
* dProg NoteOn Prog# (0..127)
* dKey RealKey (0..127)
* Return:
* (BLOCK << 10) + FNUM
****************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -