navi_file.s01

来自「炬力方案176*132软件源码,适用于AK1025」· S01 代码 · 共 2,198 行 · 第 1/3 页

S01
2,198
字号
	NAME	navi_file(17)
	RSEG	MO_EH_FSLAPI(0)
	RSEG	CSTR(0)
	RSEG	UDATA0(0)
	RSEG	MOD_EH_API(0)
	RSEG	MOC_EH_FSLAPI(0)
	PUBLIC	DISC_Location_process
	EXTERN	DRV_ActiveDrive
	PUBLIC	ExtAmv2
	PUBLIC	ExtDsc2
	PUBLIC	ExtMusic2
	PUBLIC	ExtTxt2
	PUBLIC	ExtVoice2
	EXTERN	FS_CD
	EXTERN	FS_Dir
	EXTERN	FS_GetCurDir
	EXTERN	FS_GetName
	EXTERN	FS_Init
	PUBLIC	GetExtBuf
	PUBLIC	GetPathinfo
	PUBLIC	IgnoreExt2
	PUBLIC	Init
	PUBLIC	PageNum
	PUBLIC	RootName2
	EXTERN	SetDspMips
	PUBLIC	StackPathoffset
	PUBLIC	ToDirEntry
	PUBLIC	ToNextExt
	PUBLIC	WrFiletoIDM
	PUBLIC	WrFinfotoIDM
	PUBLIC	WrFoldNextIDM
	PUBLIC	WrFoldertoIDM
	PUBLIC	WrPathtoIDM
	PUBLIC	fselDirLayer
	PUBLIC	fselDirNo
	PUBLIC	fselDiskLetter
	PUBLIC	fselError
	PUBLIC	fselExtNo
	PUBLIC	fselFileNo
	PUBLIC	fselGetLocationC
	PUBLIC	fselInit
	PUBLIC	fselMode
	PUBLIC	fselNextDir
	PUBLIC	fselPLOrCommonDir
	PUBLIC	fselRandCount
	PUBLIC	fselTotal
	PUBLIC	fselType
	EXTERN	g_comval
	PUBLIC	g_offset
	PUBLIC	m_szTemp
	PUBLIC	m_szTemp1
	EXTERN	unitochar
	EXTERN	?CLZ80B_4_04_L00
	EXTERN	?SL_DIV_L03
	EXTERN	?SL_MOD_L03
	EXTERN	?SL_CMP_L03
	EXTERN	?L_ADDASG_L03
	EXTERN	?L_SUBASG_L03
	EXTERN	?BANK_CALL_DIRECT_L08
	EXTERN	?BANK_FAST_LEAVE_L08
	EXTERN	?MEMSET_L11
	RSEG	MO_EH_FSLAPI
Init:
; 1.	#include "actos.h"
; 2.	#include "enhanced.h"
; 3.	#include "debug.h"
; 4.	 
; 5.	//global variable should be resident
; 6.	BYTE    fselPLOrCommonDir;
; 7.	BYTE    fselType;      //Type of select,  Music or voice.
; 8.	BYTE    fselMode;    //Mode of select, Sequence, repeat one ...
; 9.	WORD    fselFileNo;    //Number of current file,
; 10.	                //=0 mean NULL, 1 mean first file
; 11.	BYTE    fselExtNo; //Number of current file ext name..
; 12.	                //== 0xff  Initialized status, should restart select.
; 13.	char    fselDiskLetter;
; 14.	BYTE    fselError;    // store error id;
; 15.	WORD    fselRandCount;
; 16.	BYTE    fselDirNo[TOTALDIRLAYER];    //Number of current valid directory
; 17.	long StackPathoffset[TOTALDIRLAYER];
; 18.	char    PageNum;
; 19.	long g_offset;
; 20.	                    //=0 mean NULL, 1 mean first valid directory
; 21.	BYTE    fselDirLayer;   //当前目录层次.与fselDirNo[]共同记录当前目录在目录树中的位置.
; 22.	//************************************************************************
; 23.	//fselDirLayer == 0, fselDirNo[0] == 0; 表示根目录
; 24.	//fselDirLayer == 0, fselDirNo[0] == 1; 表示根目录下第一个子目录.
; 25.	//fselDirLayer == 1, fselDirNo[0] == 1, fselDirNo[1] == 1;表示根目录下第一个子目录中第一个子目录.
; 26.	//************************************************************************
; 27.	WORD    fselTotal;  //Total of current select file
; 28.	
; 29.	extern comval_t g_comval;
; 30.	
; 31.	#pragma memory=constseg(MOD_EH_API)
; 32.	/* music: mp3, wma, asf, wmv
; 33.	 * voice: act, wav
; 34.	 */
; 35.	#ifdef __OGG_SUPPORT 
; 36.	    const char ExtMusic2[][4] = {"MP3", "WMA", "ASF", "WMV", "OGG","APE","WAV","ACT","JPG","BMP","GIF","TXT","AMV"};
; 37.	#endif    
; 38.	#ifndef __OGG_SUPPORT 
; 39.	    const char ExtMusic2[][4] = {"MP3", "WMA", "ASF", "WMV","APE"};
; 40.	#endif        
; 41.	const char ExtVoice2[][4] = {"WAV", "ACT"};
; 42.	const char RootName2[] = {":"};
; 43.	const char IgnoreExt2[4] = {"*  "};
; 44.	
; 45.	const char ExtDsc2[][4] = {"JPG","BMP","GIF"};
; 46.	const char ExtTxt2[][4] = {"TXT"};
; 47.	const char ExtAmv2[][4] = {"AMV"};
; 48.	#pragma memory=default
; 49.	
; 50.	
; 51.	#pragma memory=dataseg(MOC_EH_FSLAPI)
; 52.	char    m_szTemp[12];
; 53.	char    m_szTemp1[12];
; 54.	#pragma memory=default
; 55.	
; 56.	
; 57.	#pragma codeseg(MO_EH_FSLAPI)  
; 58.	BOOL ToDirEntry(char *strDir, const WORD Num); 
; 59.	/********************************************************************************
; 60.	* Description : Initialize the the file selector parament.
; 61.	*
; 62.	* Arguments  : 
; 63.	*            type: music or voice
; 64.	             mode: 6 kinds mode
; 65.	* Returns     :
; 66.	*            TRUE:    Successful
; 67.	*            FALSE:    Fail, detail information in fselError
; 68.	* Notes       :  Should select path in the case of only file name is invalid 
; 69.	*
; 70.	********************************************************************************/
; 71.	void Init(unsigned char type,  BYTE mode)
; 72.	{
	PUSH	IX
	PUSH	BC
	PUSH	DE
; 73.	    BYTE    i;
; 74.	    
; 75.	    fselType = type;
	LD	A,E
	LD	(fselType),A
; 76.	    fselDirLayer = 0;
	XOR	A
	LD	(fselDirLayer),A
; 77.	    fselMode = mode;
	LD	A,C
	LD	(fselMode),A
; 78.	    for(i=0; i<TOTALDIRLAYER; i++)
	LD	IXL,0
?0001:
	LD	A,IXL
	CP	8
	JR	NC,?0000
?0002:
; 79.	        fselDirNo[i] = 0;
	LD	C,IXL
	LD	B,0
	LD	HL,fselDirNo
	ADD	HL,BC
	LD	(HL),B
	INC	IXL
	JR	?0001
?0000:
; 80.	    fselFileNo = 0;
	LD	HL,0
	LD	(fselFileNo),HL
; 81.	    fselExtNo = 0;
	XOR	A
	LD	(fselExtNo),A
; 82.	    fselError = 0;
	LD	(fselError),A
; 83.	    fselTotal = 0;
	LD	(fselTotal),HL
; 84.	    //return root dir
; 85.	    FS_CD(":");
	LD	DE,?0004
	CALL	LWRD FS_CD
; 86.	}
	POP	HL
	POP	HL
	POP	IX
	JP	LWRD ?BANK_FAST_LEAVE_L08
GetExtBuf:
; 87.	/********************************************************************************
; 88.	* Description : Get name buffer of current extend 
; 89.	*
; 90.	* Arguments  :  None
; 91.	* Returns     :  the buffer of current file extend name
; 92.	* Notes       :     None
; 93.	*
; 94.	********************************************************************************/
; 95.	char * GetExtBuf(void)
; 96.	{
	PUSH	BC
; 97.	    output8(0x4e,input8(0x4e)|0x8);
	IN	A,(78)
	SET	3,A
	OUT	(78),A
; 98.	    if ( fselType == FSEL_TYPE_MUSIC)
	LD	A,(fselType)
	OR	A
	JR	NZ,?0006
?0005:
; 99.	        return ExtMusic2[fselExtNo];
	LD	HL,(fselExtNo)
	LD	H,A
	ADD	HL,HL
	ADD	HL,HL
	LD	BC,ExtMusic2
	JR	?0166
?0006:
; 100.	    else if( fselType == FSEL_TYPE_VOICE)
	DEC	A
	JR	NZ,?0008
?0007:
; 101.	        return ExtVoice2[fselExtNo];
	LD	HL,(fselExtNo)
	LD	H,A
	ADD	HL,HL
	ADD	HL,HL
	LD	BC,ExtVoice2
	JR	?0166
?0008:
; 102.	    else if( fselType == FSEL_TYPE_DSC)
	LD	A,(fselType)
	CP	3
	JR	NZ,?0010
?0009:
; 103.	        return ExtDsc2[fselExtNo];
	LD	HL,(fselExtNo)
	LD	H,0
	ADD	HL,HL
	ADD	HL,HL
	LD	BC,ExtDsc2
	JR	?0166
?0010:
; 104.	    else if(fselType == FSEL_TYPE_AMV)
	CP	5
	LD	HL,(fselExtNo)
	LD	H,0
	ADD	HL,HL
	ADD	HL,HL
	JR	NZ,?0012
?0011:
; 105.	        return ExtAmv2[fselExtNo];
	LD	BC,ExtAmv2
	JR	?0166
; 106.	    else 
?0012:
; 107.	        return ExtTxt2[fselExtNo];        
	LD	BC,ExtTxt2
?0166:
	ADD	HL,BC
; 108.	}
?0013:
	POP	BC
	JP	LWRD ?BANK_FAST_LEAVE_L08
fselInit:
; 109.	/********************************************************************************
; 110.	* Description : Initialize the FSEL module
; 111.	*
; 112.	* Arguments  :
; 113.	            type:   Select type,  is FSEL_TYPE_MUSIC or FSEL_TYPE_VOICE
; 114.	*            mode: Select mode, is FSEL_ALL_SEQUENCE or  FSEL_ALL_REPEATONE ...
; 115.	*            DirLevel: Directory deep level, 0 or 1 now.
; 116.	*
; 117.	* Returns     :
; 118.	*            TRUE: Successful,
; 119.	*            FALSE: Fail, detail information in fselError.
; 120.	* Notes       :Must call it before call other fsel Module functions
; 121.	*
; 122.	********************************************************************************/
; 123.	BOOL fselInit(unsigned char type,  BYTE mode, BYTE  PlayListOrCommonDir, BYTE    CardOrFlash)
; 124.	{    
	PUSH	BC
	PUSH	DE
; 125.	    fselDiskLetter = 0x00;
	XOR	A
	LD	(fselDiskLetter),A
; 126.	    
; 127.	    if ( CardOrFlash == 'C' )
	LD	HL,10
	ADD	HL,SP
	LD	A,(HL)
	CP	67
	JR	NZ,?0015
?0014:
; 128.	    {
; 129.	        if ( !DRV_ActiveDrive('C', 1) )
	LD	C,1
	LD	E,67
	CALL	LWRD DRV_ActiveDrive
	OR	A
	JR	Z,?0021
?0016:
; 130.	            goto DiskError;
?0017:
; 131.	        fselDiskLetter = 'C';
	LD	A,67
	JR	?0175
?0015:
; 132.	    } 
; 133.	    else if ( CardOrFlash == 'H' )
	CP	72
	JR	NZ,?0021
?0020:
; 134.	    {
; 135.	        if ( !DRV_ActiveDrive('H', 1) )
	LD	C,1
	LD	E,72
	CALL	LWRD DRV_ActiveDrive
	OR	A
	JR	Z,?0021
?0022:
; 136.	            goto DiskError;
?0023:
; 137.	        fselDiskLetter = 'H'; 
	LD	A,72
?0175:
	LD	(fselDiskLetter),A
; 138.	    }
; 139.	    else 
	JR	?0024
?0021:
?0018:
; 140.	    {
; 141.	DiskError:    
; 142.	        fselError = FSEL_ERR_DISK;
	LD	A,22
	JR	?0177
; 143.	        return FALSE;
; 144.	    }
?0024:
?0019:
; 145.	    
; 146.	    if(!FS_Init()) 
	CALL	LWRD FS_Init
	OR	A
	JR	NZ,?0026
?0025:
; 147.	    {
; 148.	        fselError = FSEL_ERR_FS;
	LD	A,20
?0177:
	LD	(fselError),A
; 149.	        return FALSE;
	JR	?0030
; 150.	    }
?0026:
; 151.	    
; 152.	    Init(type,mode);
	LD	HL,2
	ADD	HL,SP
	LD	C,(HL)
	DEC	HL
	DEC	HL
	LD	E,(HL)
	LD	A,BYTE3 Init
	LD	HL,LWRD Init
	CALL	LWRD ?BANK_CALL_DIRECT_L08
; 153.	    
; 154.	    if  (PlayListOrCommonDir == FSEL_TYPE_COMMONDIR)
	LD	HL,8
	ADD	HL,SP
	XOR	A
	OR	(HL)
	JR	Z,?0179
?0027:
; 155.	    {
; 156.	        fselPLOrCommonDir = FSEL_TYPE_COMMONDIR;
; 157.	        return TRUE;
; 158.	    }
?0028:
; 159.	    else if (PlayListOrCommonDir == FSEL_TYPE_PLAYLIST)
	LD	B,A
	DEC	B
	JR	NZ,?0030
?0029:
; 160.	    {
; 161.	        fselPLOrCommonDir = FSEL_TYPE_PLAYLIST;
	LD	A,1
?0179:
	LD	(fselPLOrCommonDir),A
; 162.	    }
; 163.	    else
	JR	?0031
?0030:
; 164.	    {
; 165.	        return FALSE;
	LD	L,0
; 166.	    }
	JR	?0032
?0031:
; 167.	    return TRUE;
	LD	L,1
; 168.	}
?0032:
	POP	AF
	POP	AF
	JP	LWRD ?BANK_FAST_LEAVE_L08
fselNextDir:
; 169.	/********************************************************************************
; 170.	* Description : Select the next directory of current select directory
; 171.	*
; 172.	* Arguments  : 
; 173.	*                 strDir: Dos 8.3 directory name of the next.
; 174.	*
; 175.	* Returns     : 
; 176.	*    TRUE:  success.
; 177.	*    FALSE: fail, detail info store in fselError.
; 178.	* Notes       :  None
; 179.	*
; 180.	********************************************************************************/
; 181.	BOOL fselNextDir(char *strDir)
; 182.	{
	PUSH	BC
	PUSH	IX
	PUSH	DE
; 183.	    WORD wtemp;
; 184.	    wtemp = fselDirNo[fselDirLayer];
	LD	BC,(fselDirLayer)
	LD	B,0
	LD	HL,fselDirNo
	ADD	HL,BC
	LD	C,(HL)
	PUSH	BC
	POP	IX
; 185.	    wtemp ++;   //指向下一个文件
; 186.	    if (! ToDirEntry(strDir, wtemp))
	INC	IX
	PUSH	IX
	POP	BC
	LD	A,BYTE3 ToDirEntry
	LD	HL,LWRD ToDirEntry
	CALL	LWRD ?BANK_CALL_DIRECT_L08
	INC	L
	DEC	L
	JR	Z,?0035
?0033:
; 187.	    {
; 188.	        return FALSE;
; 189.	    }
?0034:
; 190.	    fselDirNo[fselDirLayer] = wtemp;
	LD	BC,(fselDirLayer)
	LD	B,0
	LD	HL,fselDirNo
	ADD	HL,BC
	PUSH	IX
	POP	BC
	LD	(HL),C
; 191.	    return TRUE;
	LD	L,1
; 192.	}
?0035:
	POP	AF
	POP	IX
	POP	BC
	JP	LWRD ?BANK_FAST_LEAVE_L08
ToDirEntry:
; 193.	/********************************************************************************
; 194.	* Description : seek to  specify Directory Entry 
; 195.	*
; 196.	* Arguments  : 
; 197.	*        strDir: Dos 8.3 Directory name
; 198.	*            num: number of the Directory Entry to seek
; 199.	*
; 200.	* Returns     :
; 201.	*            TRUE: Successful
; 202.	*            FALSE: Fail,  detail information in fselError
; 203.	* Notes       : 
; 204.	*
; 205.	********************************************************************************/
; 206.	BOOL ToDirEntry(char *strDir, const WORD Num)
; 207.	{
	PUSH	IY
	PUSH	IX
	LD	IX,0
	ADD	IX,SP
	PUSH	BC
	PUSH	DE
	LD	HL,100
	AND	A
	SBC	HL,BC
	JR	C,?0184
; 208.	   WORD temp;
; 209.	
; 210.	    if ( Num > FSEL_MAX_DIRNUM || Num < 1 )
	LD	BC,1
	LD	L,(IX-2)
	LD	H,(IX-1)
	SBC	HL,BC
	JR	C,?0184
?0038:
?0039:
?0036:
; 211.	    {
; 212.	        fselError = FSEL_ERR_OUTOF;
; 213.	        return FALSE;
; 214.	    }
?0037:
; 215.	
; 216.	    memset(strDir,0x00,12);
	LD	C,12
	LD	L,B
	CALL	LWRD ?MEMSET_L11
; 217.	    if (!FS_Dir(strDir,  IgnoreExt2, FS_DIR_DIR))
	LD	C,129
	PUSH	BC
	LD	BC,IgnoreExt2
	CALL	LWRD FS_Dir
	POP	HL
	OR	A
	JR	Z,?0184
?0040:
; 218.	    {
; 219.	        fselError = FSEL_ERR_OUTOF;
; 220.	        return FALSE;
; 221.	    }
?0041:
; 222.	    if (Num ==1)
	LD	A,1
	XOR	(IX-2)
	OR	(IX-1)
	JR	Z,?0180
?0042:
; 223.	        return TRUE;
?0043:
; 224.	
; 225.	    ///seek to the specify directory entry
; 226.	    temp = 2;
	LD	IY,2
?0045:
; 227.	    while ( temp <= Num)
	PUSH	IY
	POP	BC
	LD	L,(IX-2)
	LD	H,(IX-1)
	AND	A
	SBC	HL,BC
	JR	C,?0044
?0046:
; 228.	    {
; 229.	        if (!FS_Dir(strDir,  IgnoreExt2, FS_DIR_DIR_CONT))
	LD	C,1
	PUSH	BC
	LD	BC,IgnoreExt2
	LD	E,(IX-4)
	LD	D,(IX-3)
	CALL	LWRD FS_Dir
	POP	HL
	OR	A
	JR	NZ,?0048
?0047:
; 230.	        {
; 231.	            fselError = FSEL_ERR_OUTOF;
?0184:
	LD	A,1
	LD	(fselError),A
; 232.	            return FALSE;
	LD	L,0
; 233.	        }
	JR	?0049
?0048:
; 234.	        temp++;           
	INC	IY
	JR	?0045
?0044:
; 235.	    }
; 236.	    output8(0x4e,input8(0x4e)|0x8);
	IN	A,(78)
	SET	3,A
	OUT	(78),A
; 237.	    return TRUE;
?0180:
	LD	L,1
; 238.	}
?0049:
	LD	SP,IX
	POP	IX
	POP	IY
	JP	LWRD ?BANK_FAST_LEAVE_L08
fselGetLocationC:
; 239.	/********************************************************************************
; 240.	* Description : Get the selected location
; 241.	*
; 242.	* Arguments  : 
; 243.	*            location:    the buffer to store location
; 244.	* Returns     :
; 245.	*            TRUE: Successful
; 246.	*            FALSE: Fail, detail information in fselError.
; 247.	* Notes       :  None
; 248.	*
; 249.	********************************************************************************/
; 250.	BOOL fselGetLocationC(file_location_t  *location)
; 251.	{
	PUSH	DE
; 252.	#if 0    
; 253.	    BYTE    i;
; 254.	    long    lEntry;
; 255.	    location->disk = fselDiskLetter;
; 256.	    
; 257.	    for(i=0; i<TOTALDIRLAYER; i++)
; 258.	        location->DirNo[i] = fselDirNo[i];
; 259.	    
; 260.	    location->ClusterNo = FS_GetCurDir();
; 261.	    location->dirLayer = fselDirLayer;
; 262.	
; 263.	    lEntry = FS_GetCurDirEntry();
; 264.	    if (fselFileNo != 0 )
; 265.	    {
; 266.	        if ( !fselGetByNO(location->filename, fselFileNo) )
; 267.	         {
; 268.	            location->filename[0] = 0x00;
; 269.	            location->path[0] = ':';
; 270.	            location->dirLayer = 0;
; 271.	            return FALSE;
; 272.	        }
; 273.	    }
; 274.	    else
; 275.	        location->filename[0] = 0x00;
; 276.	      
; 277.	    // 只有在fselDirNo[0] == 0时,当前目录是根目录.
; 278.	    if ( fselDirLayer > 7 || fselDirNo[0] == 0)
; 279.	    {
; 280.	         m_szTemp1[0] = ':';
; 281.	         fselDirNo[0] = 0;
; 282.	         fselDirLayer = 0;
; 283.	    }
; 284.	    else
; 285.	    {
; 286.	         FS_CD("\\");
; 287.	         ToDirEntry(m_szTemp1,fselDirNo[fselDirLayer]);
; 288.	    }
; 289.	    output8(REG4E_RTC_WATCH_DOG, input8(REG4E_RTC_WATCH_DOG) | 0x08);  
; 290.	    memcpy(location->path, m_szTemp1, 11);
; 291.	    FS_CD(m_szTemp1);
; 292.	            
; 293.	    FS_SetCurDirEntry(lEntry);
; 294.	    return TRUE;
; 295.	#endif    
; 296.	}
	POP	HL
	JP	LWRD ?BANK_FAST_LEAVE_L08
ToNextExt:
; 297.	/********************************************************************************
; 298.	* Description : Seek to the next file extend name 
; 299.	*
; 300.	* Arguments  : none
; 301.	* Returns     :
; 302.	            TRUE: Successful
; 303.	            FALSE: fail.
; 304.	* Notes       :  None
; 305.	*
; 306.	********************************************************************************/
; 307.	bool ToNextExt(void)
; 308.	{
; 309.	    fselExtNo ++;
	LD	HL,fselExtNo
	INC	(HL)
; 310.	    output8(REG4E_RTC_WATCH_DOG, input8(REG4E_RTC_WATCH_DOG) | 0x08);  
	IN	A,(78)
	SET	3,A
	OUT	(78),A
; 311.	    if ( fselType == FSEL_TYPE_MUSIC)
	LD	A,(fselType)
	OR	A
	JR	NZ,?0051
?0050:
; 312.	    {
; 313.	        if (fselExtNo>=NAVI_FILE_TYPE_NUM)
	LD	A,(fselExtNo)
	CP	13
	JR	C,?0073
?0052:
; 314.	        {
; 315.	            fselExtNo = 0;
	JR	?0196
; 316.	            return FALSE;
; 317.	        }
?0053:
?0051:
; 318.	    }
; 319.	   else if(fselType == FSEL_TYPE_VOICE)
	DEC	A
	JR	NZ,?0056
?0055:
; 320.	
; 321.	    {
; 322.	      if (fselExtNo>=FSEL_VOICE_EXTNUM)
	LD	A,(fselExtNo)
	CP	2
	JR	C,?0073
?0057:
; 323.	        {
; 324.	            fselExtNo = 0;
	JR	?0196
; 325.	            return FALSE;
; 326.	        }
?0058:
?0056:
; 327.	    }
; 328.	
; 329.	   else if(fselType == FSEL_TYPE_DSC)
	LD	A,(fselType)
	CP	3
	JR	NZ,?0061
?0060:
; 330.	
; 331.	     {
; 332.	      if(fselExtNo>=FSEL_DSC_EXTNUM)
	LD	A,(fselExtNo)
	CP	3
	JR	C,?0073
?0062:
; 333.	
; 334.	        {
; 335.	             fselExtNo = 0;
	JR	?0196
; 336.	            return FALSE;
; 337.	        }
?0063:
?0061:
; 338.	
; 339.	     }
; 340.	   else if(fselType == FSEL_TYPE_AMV)
	CP	5
	JR	NZ,?0066
?0065:
; 341.	     {
; 342.	      if(fselExtNo>=FSEL_AMV_EXTNUM)

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?