чёт поковырял

This commit is contained in:
Tolik 2024-08-07 23:08:26 +10:00
parent 2d0ee5e639
commit 8cc1bd11af
13 changed files with 310 additions and 326 deletions

@ -1 +1 @@
Subproject commit 93ab93917db326a86a0ffecc02a62f6f6ef7a938 Subproject commit 1535d92eeecb8aa730ae7fe6eb82e9d32a4acb4d

View File

@ -137,7 +137,9 @@
OUTEND OUTEND
;--------------------------------------- ;---------------------------------------
; ;
EXPORT ROM_NUMBER ; !FIXIT part1, part2 ¤«ï Flasher ;EXPORT ROM_NUMBER ; !FIXIT part1, part2 ¤«ï Flasher
EXPORT BOARD_INFO.number
EXPORT BOARD_INFO.type
EXPORT BoardID.start EXPORT BoardID.start
EXPORT BoardID.end EXPORT BoardID.end
EXPORT FN_CRIPT.cnf EXPORT FN_CRIPT.cnf

View File

@ -43,8 +43,6 @@
Set_Block 'ROM free space: ', #4000 Set_Block 'ROM free space: ', #4000
; ;
;PAGE 1 ;PAGE 1
; INCBIN 'Build/Bin/LOGO_PAL.BIN'
; INCBIN 'Build/Bin/LOGO_DAT.BIN'
INCBIN 'Build/Bin/LOGO.BIN' INCBIN 'Build/Bin/LOGO.BIN'
Set_Block 'LOGO free space: ', #8000 Set_Block 'LOGO free space: ', #8000
; ;
@ -76,7 +74,6 @@
;PAGE 9-11 (#09, #0A, #0B) Recovery image part 2 ;PAGE 9-11 (#09, #0A, #0B) Recovery image part 2
INCBIN IMG_RECOVERY,#C000,#C000 INCBIN IMG_RECOVERY,#C000,#C000
DISPLAY "ROM Disk recovery part2, pages 9..11: 2x4000..3x0000" DISPLAY "ROM Disk recovery part2, pages 9..11: 2x4000..3x0000"
Set_Block 'Empty space: ', #30000 Set_Block 'Empty space: ', #30000
; ;
;PAGE 12-15 (#0C, #0D, #0E, #0F) ;PAGE 12-15 (#0C, #0D, #0E, #0F)

View File

@ -12,14 +12,13 @@
; CCED/AAAAAAAAA ; CCED/AAAAAAAAA
; NN1OW116517210 ; NN1OW116517210
; FF2SR54 3 ; FF2SR54 3
;DCP_DATA: 108 ; 108
; ....0..11.1110 ;DCP_DATA: ....0..11.1110
; WORD %00000001101110 ; -  ¤à¥á ; WORD %00000001101110 ; - b13..12 cnf, b11 pent512, b10 dos, b9 r/w, b8..0  ¤à¥á
; WORD %00001001101111 ; - ¬ áª  - 0 ¨§¬¥­ï¥¬ë¥ ¡¨âë, 1 ­¥¨§¬¥­ï¥¬ë¥ ; WORD %00001001101111 ; - ¬ áª  - 0 ¨§¬¥­ï¥¬ë¥ ¡¨âë, 1 ­¥¨§¬¥­ï¥¬ë¥
; BYTE ACEX.Border_FE ; - ¯®àâ ; BYTE ACEX.Border_FE ; - ¯®àâ
; DCP END MARKER
; DW 0,0,0
;-----------------------------------------------------------------------; ;-----------------------------------------------------------------------;
; ;
; ;
@ -135,30 +134,6 @@
DB ACEX.CMOS_DATA.WRITE DB ACEX.CMOS_DATA.WRITE
; ;
;---------HDD[v] ;---------HDD[v]
/*
Write:
.Data EQU #0150 ; cnf 20 ; HDW_DAT W170 ; #1F0 Data register
.Features EQU #0151 ; cnf 21 ; HDW_ERR W171 ; #1F1 Features register
.Counter EQU #0152 ; cnf 22 ; HDW_CNT P_S_CNT W172 ; #1F2 Counter register
.Sector EQU #0153 ; cnf 23 ; HDW_SEC P_S_NUM W173 ; #1F3 Sector register
.CylinderLow EQU #0154 ; cnf 24 ; HDW_CLL P_C_LOW W174 ; #1F4 Cylinder Low register
.CylinderHigh EQU #0155 ; cnf 25 ; HDW_CLH P_C_HIG W175 ; #1F5 Cylinder High register
.DeviceHead EQU #4152 ; cnf 26 ; HDW_DRV P_HD_CS ; #1F6 Device/Head register
.Command EQU #4153 ; cnf 27 ; HDW_COM P_CMD ; #1F7 Command register
.DeviceControl EQU #4154 ; cnf 28 ; ; #3F6 Device Control register
Read:
.Data EQU #0050 ; cnf 20 ; HDR_DAT P_DATS R170 ; #1F0 Data register
.Error EQU #0051 ; cnf 21 ; HDR_ERR P_ERR R171 ; #1F1 Error register
.Counter EQU #0052 ; cnf 22 ; HDR_CNT R172 ; #1F2 Counter register
.Sector EQU #0053 ; cnf 23 ; HDR_SEC R173 ; #1F3 Sector register
.CylinderLow EQU #0054 ; cnf 24 ; HDR_CLL R174 ; #1F4 Cylinder Low register
.CylinderHigh EQU #0055 ; cnf 25 ; HDR_CLH R175 ; #1F5 Cylinder High register
.Control EQU #4052 ; cnf 26 ; HDR_DRV R176 ; #1F6 Device/Head register
.Status EQU #4053 ; cnf 27 ; HDR_CTL P_HDST R177 ; #1F7 Status (Control) register
.AltStatus EQU #4054 ; cnf 28 ; ; #3F6 Alternate Status register
.DrvAddress EQU #4055 ; cnf 29 ; ; #3F7
*/
DW %00'000'0'0100'0000 DW %00'000'0'0100'0000
DW %11'000'0'0110'1111 DW %11'000'0'0110'1111
DB ACEX.IDE_DATA_1F0 DB ACEX.IDE_DATA_1F0

View File

@ -15,9 +15,12 @@ EXP_START:
JP GLOBAL_RESET JP GLOBAL_RESET
;--------------------------------------- ;---------------------------------------
ROM_NUMBER: ;ROM_NUMBER:
.part1: DW MotherBoardID ;.part1: DW MotherBoardID
.part2: DB 0 ;.part2: DB 0
BOARD_INFO:
.number: DW MotherBoardID
.type: DB MotherBoardType
;--------------------------------------- ;---------------------------------------
;--------------------------------------- ;---------------------------------------
@ -305,20 +308,19 @@ NO_RESTART:
OUT (Z84.SIO.Ch_A.Ctrl),A OUT (Z84.SIO.Ch_A.Ctrl),A
LD A,#62 LD A,#62
OUT (Z84.SIO.Ch_A.Ctrl),A OUT (Z84.SIO.Ch_A.Ctrl),A
;
LD A,#CF ; BITS I/O LD A,#CF ; BITS I/O
OUT (Z84.PIO.Port_A.Command),A OUT (Z84.PIO.Port_A.Command),A
XOR A XOR A
OUT (Z84.PIO.Port_A.Command),A OUT (Z84.PIO.Port_A.Command),A
OUT (Z84.PIO.Port_A.Data),A ; PRINTER - PORT - all zeros OUT (Z84.PIO.Port_A.Data),A ; PRINTER - PORT - all zeros
; -¨­¨æ¨ «¨§ æ¨ï á¨á⥬­ëå ¯®à⮢ Z84C15- ; -¨­¨æ¨ «¨§ æ¨ï á¨á⥬­ëå ¯®à⮢ Z84C15-
LD BC,#FF*256 + Z84.SYS.Control LD BC,#FF*256 + Z84.SYS.Control
XOR A ; Z84.REG.WaitState_Ctrl XOR A ; Z84.REG.WaitState_Ctrl
OUT (C),A ; Z84.SYS.Control OUT (C),A ; Z84.SYS.Control
INC C ; Z84.REG.WaitState_MemBound INC C ; Z84.REG.WaitState_MemBound
OUT (C),A ; Z84.SYS.Data ; set 0 Waits OUT (C),A ; Z84.SYS.Data ; set 0 Waits
;
DEC C DEC C
LD A,3 ; Z84.REG.Misc_Ctrl LD A,3 ; Z84.REG.Misc_Ctrl
OUT (C),A ; Z84.SYS.Control OUT (C),A ; Z84.SYS.Control
@ -767,14 +769,14 @@ set_config:
OUT (RGMOD),A OUT (RGMOD),A
OUT (SLOT3),A OUT (SLOT3),A
OUT (SLOT0),A OUT (SLOT0),A
LD A,5 LD A,5 ; !HARDCODE page 5
OUT (SLOT1),A OUT (SLOT1),A
LD A,2 LD A,2 ; !HARDCODE page 2
OUT (SLOT2),A OUT (SLOT2),A
;********************************* ;*********************************
; Don't use stack (SP) before this point if it`s normal booting!!! ; Don't use stack (SP) before this point if it`s normal booting!!!
LD SP,#BFFE ; <20> ç «® ¨á¯®«ì§®¢ ­¨ï á⥪ !!! LD SP,#C000 ; <20> ç «® ¨á¯®«ì§®¢ ­¨ï á⥪ !!!
PUSH HL ; á®åà ­¨âì ­®¬¥à ¯à®è¨¢ª¨ PUSH HL ; á®åà ­¨âì ­®¬¥à ¯à®è¨¢ª¨
CALL PORTS_INIT ; ¨­¨æ¨ «¨§¨à®¢ âì ¯®àâë CALL PORTS_INIT ; ¨­¨æ¨ «¨§¨à®¢ âì ¯®àâë
@ -782,20 +784,7 @@ set_config:
OUT (BorderColor),A OUT (BorderColor),A
CALL EMM.CheckColdInit ; ¨­¨æ¨ «¨§ æ¨ï ¯ ¬ï⨠CALL EMM.CheckColdInit ; ¨­¨æ¨ «¨§ æ¨ï ¯ ¬ïâ¨
POP HL ; ª®­ä¨£ãà æ¨ï POP HL ; ª®­ä¨£ãà æ¨ï
JR Reset_Handler.start ; JR Reset_Handler.start
; *************************************
; ‘ç¨â ¥¬, çâ® ¢å®¤ ¢ SETUP ¢á¥£¤  !!!
; *************************************
; LD A,H
; CP #FF
; JR NZ,NO_SETUP_1
; LD A,L
; JR NZ,NO_SETUP_2
;[---------------------------------------------------------------------]
MODULE Reset_Handler MODULE Reset_Handler
start: DI start: DI
@ -908,7 +897,7 @@ init_rom_address EQU #8200 ;!HARDCODE
LD BC,RAM_BIOS_PROG.Length LD BC,RAM_BIOS_PROG.Length
LDIR LDIR
*/ */
No_Need_To_Load_ZXROMS: ;No_Need_To_Load_ZXROMS:
POP AF POP AF
OUT (SLOT3),A OUT (SLOT3),A
;-------------------------------------------------------------------------------------------------------------------; ;-------------------------------------------------------------------------------------------------------------------;

View File

@ -256,8 +256,7 @@ FN_HDD_READ_NEXT:
RET C RET C
CALL NEXT_ADD_SEC CALL NEXT_ADD_SEC
JR FN_HDD_READ.L1 JR FN_HDD_READ.L1
;
; HL - BUFER, A - PAGE ; HL - BUFER, A - PAGE
FN_HDD_READ: FN_HDD_READ:
AND A AND A
@ -488,7 +487,7 @@ FN_HDD_TEST_IDE:
; <20>¥ ¤®«¦­  ¯®àâ¨âì ॣ¨áâà E!!! ; <20>¥ ¤®«¦­  ¯®àâ¨âì ॣ¨áâà E!!!
TEST_HDD_DRV: TEST_HDD_DRV:
; EXP_HDD.ASM variant ; EXP_HDD.ASM variant
LD HL,#01FE ; ????? LD HL,#01FE
LD BC,IDE.Write.Counter LD BC,IDE.Write.Counter
OUT (C),L OUT (C),L
IF IDE_Optimization IF IDE_Optimization
@ -496,27 +495,27 @@ TEST_HDD_DRV:
OUT (C),H ; IDE.Write.Sector OUT (C),H ; IDE.Write.Sector
; ;
DEC C DEC C
INC B DEC B
IN A,(C) ; ????? IDE.Write.Counter+#100 IN A,(C) ; IDE.Read.Counter
CP L CP L
RET NZ RET NZ
INC C INC C
ELSE ELSE
LD BC,IDE.Write.Sector LD BC,IDE.Write.Sector
OUT (C),H OUT (C),H
LD BC,IDE.Write.Counter+#100 LD BC,IDE.Read.Counter
IN A,(C) IN A,(C)
CP L CP L
RET NZ RET NZ
LD BC,IDE.Write.Sector+#100 LD BC,IDE.Read.Sector
ENDIF ENDIF
IN A,(C) ; ????? IDE.Write.Sector+#100 IN A,(C) ; IDE.Read.Sector
CP H CP H
RET RET
; TEST_HDD_DRV: ; TEST_HDD_DRV:
; ; EXTENDED.ASM variant ; ; EXTENDED.ASM variant
; LD HL,#00FF ;????? ; LD HL,#00FF
; LD BC,IDE.Write.CylinderLow ; LD BC,IDE.Write.CylinderLow
; OUT (C),L ; OUT (C),L
; IF IDE_Optimization ; IF IDE_Optimization
@ -525,7 +524,7 @@ TEST_HDD_DRV:
; INC B ; INC B
; DEC C ; DEC C
; IN A,(C) ; ????? ’ãâ ॣ¨áâà BC = #0254 - çâ® §  ¯®àâ â ª®© ¨ çâ® ®ââ㤠 ¯à®ç¨â ¥âáï? ; IN A,(C) ; ’ãâ ॣ¨áâà BC = #0254 - .CylinderLow
; CP L ; CP L
; RET NZ ; RET NZ
; INC C ; INC C
@ -533,14 +532,14 @@ TEST_HDD_DRV:
; ELSE ; ELSE
; LD BC,IDE.Write.CylinderHigh ; LD BC,IDE.Write.CylinderHigh
; OUT (C),H ; OUT (C),H
; LD BC,#0254 ;???!!!! ; LD BC,#0254
; IN A,(C) ; IN A,(C)
; CP L ; CP L
; RET NZ ; RET NZ
; LD BC,#0255 ;???!!!! ; LD BC,#0255
; ENDIF ; ENDIF
; IN A,(C) ; ????? ’ãâ ॣ¨áâà BC = #0255 - çâ® §  ¯®àâ â ª®© ¨ çâ® ®ââ㤠 ¯à®ç¨â ¥âáï? ; IN A,(C) ; ’ãâ ॣ¨áâà BC = #0255 - .CylinderHigh
; CP H ; CP H
; RET ; RET
@ -628,7 +627,7 @@ FN_HDD_INIT:
LD A,IDE.ATA.IdentifyDevice ;!FIXIT ¯¥à¥¤¥« âì LD A,IDE.ATA.IdentifyDevice ;!FIXIT ¯¥à¥¤¥« âì
OUT (C),A OUT (C),A
WAIT_HDD WAIT_HDD
BIT IDE.ControlBit.DataRequest,A AND IDE.ControlByte.DataRequest
;JR NZ,.L2 ;JR NZ,.L2
SCF SCF
RET Z RET Z
@ -704,22 +703,21 @@ HD_WAIT:
PUSH BC PUSH BC
PUSH AF PUSH AF
LD DE,0 LD DE,0
HD_WAIT1: .loop: LD BC,IDE.Read.Status
LD BC,IDE.Read.Status
IN A,(C) IN A,(C)
AND IDE.ControlByte.Busy AND IDE.ControlByte.Busy
JR Z,HD_W_EXIT JR Z,.EXIT
DEC DE DEC DE
LD A,D LD A,D
OR E OR E
JR NZ,HD_WAIT1 JR NZ,.loop
POP AF POP AF
POP BC POP BC
POP DE POP DE
SCF SCF
RET RET
HD_W_EXIT: ;
POP AF .EXIT: POP AF
POP BC POP BC
POP DE POP DE
AND A AND A

View File

@ -1221,12 +1221,12 @@ LP_MODE_LINE3: ;
LD A,#50 LD A,#50
OUT (SLOT3),A OUT (SLOT3),A
LD A,L ; ¢¥à⨪ «ì­®¥ ¯®«®¦¥­¨¥ LD A,L ; ¢¥à⨪ «ì­®¥ ¯®«®¦¥­¨¥
CP 80H CP #80
JR NC,LP_EXIT_MODE3 JR NC,LP_EXIT_MODE3
LP_MODE_RECURSE3: LP_MODE_RECURSE3:
LD A,D ; £®à¨§®­â «ì­®¥ ¯®«®¦¥­¨¥ LD A,D ; £®à¨§®­â «ì­®¥ ¯®«®¦¥­¨¥
AND 7FH AND #7F
SUB 80 SUB 80
JR C,LP_MODE_LL3 JR C,LP_MODE_LL3
SUB 48 SUB 48
@ -1238,7 +1238,7 @@ LP_MODE_RECURSE3:
LD A,E ; ¢®ááâ ­®¢¨âì LD A,E ; ¢®ááâ ­®¢¨âì
RRA RRA
AND 3FH AND #3F
SUB C SUB C
JR NC,LP_EXIT_MODE3 JR NC,LP_EXIT_MODE3
NEG NEG
@ -1248,7 +1248,7 @@ LP_MODE_RECURSE3:
LP_MODE_LL3: LP_MODE_LL3:
NEG NEG
RRA RRA
AND 3FH AND #3F
CP C CP C
JR NC,LP_MODE_LR3 JR NC,LP_MODE_LR3
LD C,A LD C,A

View File

@ -42,7 +42,7 @@ EMM.InitMem:
LD C,A LD C,A
LD A,SYS_PAGE LD A,SYS_PAGE
OUT (SLOT3),A OUT (SLOT3),A
LD HL,SYS_PAGE.RAMD_FAT; - #4000 - #4000 ; €¤à¥á FAT އ“. LD HL,SYS_PAGE.RAMD_FAT ; €¤à¥á RAM FAT ¢ އ“.
; ®¡­ã«ï¥¬ â ¡«¨æã ; ®¡­ã«ï¥¬ â ¡«¨æã
XOR A XOR A
.loopFree: .loopFree:

View File

@ -391,33 +391,30 @@ REINIT: DEC B
; ;
;[x] ;[x]
.Restart: .Restart: DI
DI XOR A
LD A,0
LD BC,#1FFD LD BC,#1FFD
OUT (C),A OUT (C),A
LD B,#7F LD B,#7F
OUT (C),A OUT (C),A
LD A,#40 OUT (RGADR),A
OUT (SLOT3),A OUT (RGMOD),A
OUT (SLOT0),A
LD A,5 LD A,5
OUT (SLOT1),A OUT (SLOT1),A
LD A,2 LD A,2
OUT (SLOT2),A
LD A,DCP_PAGE
OUT (SLOT3),A OUT (SLOT3),A
LD A,0
OUT (SLOT0),A
OUT (RGADR),A
OUT (RGMOD),A
JP 0 ;Restart JP 0 ;Restart
; ;
; ;
.SoftReset: .SoftReset: DI
DI
LD A,#10 LD A,#10
LD BC,#1FFD LD BC,#1FFD
OUT (C),A ; 8-ï áâà ­¨æ  !! OUT (C),A ; 8-ï áâà ­¨æ  !!
;
LD A,RESET_PAGE LD A,RESET_PAGE
OUT (SLOT3),A OUT (SLOT3),A
LD A,CNF_PORT.TURBO.OFF LD A,CNF_PORT.TURBO.OFF

View File

@ -63,8 +63,8 @@ FN_CRIPT:
; BoardID_start old address #312A ; BoardID_start old address #312A
; BoardID_end old address #312D ; BoardID_end old address #312D
.board_id: .board_id:
LD HL,(ROM_NUMBER.part1) ;rdlow-ok LD HL,(BOARD_INFO.number) ;rdlow-ok
LD A,(ROM_NUMBER.part2) ;rdlow-ok LD A,(BOARD_INFO.type) ;rdlow-ok
LD BC,(BoardID.start) ;rdlow-ok LD BC,(BoardID.start) ;rdlow-ok
LD DE,(BoardID.end) ;rdlow-ok LD DE,(BoardID.end) ;rdlow-ok
AND A AND A

View File

@ -811,7 +811,7 @@ RESCREEN: ;R06
; LD E,A ; LD E,A
; LD A,DCP_PAGE ; LD A,DCP_PAGE
; OUT (SLOT3),A ; OUT (SLOT3),A
; LD A,(#C400) ;c400 for first cfg 50176 ; !TODO ¬®¦­® ¯¥à¥¤¥« âì ­  ¢ë§®¢ ä㭪樨 ¡¨®á  ; LD A,(#C400) ;c400 for first cfg 50176
; LD D,A ; LD D,A
; LD A,ACEX.HOLD ; LD A,ACEX.HOLD
; LD (#C400),A ; LD (#C400),A
@ -1142,9 +1142,11 @@ PIDNUM: LD HL,memBUFFER.ID
CALL PRINTZ CALL PRINTZ
RET RET
PIDBOARD: PIDBOARD: CALL FN_CRIPT.board_id
CALL FN_CRIPT.board_id ;
IF MotherBoardType > 0
PUSH AF
ENDIF
PUSH DE PUSH DE
PUSH HL PUSH HL
PUSH BC PUSH BC
@ -1165,7 +1167,39 @@ PIDBOARD:
CALL PRNHEX CALL PRNHEX
POP DE POP DE
LD A,E LD A,E
IF MotherBoardType == 0
JP PRNHEX JP PRNHEX
ELSE
CALL PRNHEX
LD A,' '
CALL PRINT_CHAR
POP AF
; type 0 - Classic
RET Z
; type 1 - DX
LD HL,.ver_DX
DEC A
JP Z,PRINTZ
; type 2 - DP
LD HL,.ver_DP
DEC A
JP Z,PRINTZ
; type 3 - Max
LD HL,.ver_Max
DEC A
JP Z,PRINTZ
; type 4 - test
LD HL,.Test
DEC A
JP Z,PRINTZ
RET
;
.ver_DX: DZ "DX"
.ver_DP: DZ "DP"
.ver_Max: DZ "Max"
.Test DZ "0123456789A"
ENDIF
CNF_VER_PRINT: CNF_VER_PRINT:
LD HL,memBUFFER.ID LD HL,memBUFFER.ID

View File

@ -259,7 +259,7 @@ SHOW_LOGO: LD IX,win_descriptor.tab320x256
SAFE_PORTY SAFE_PORTY
DI DI
LD A,1 LD A,SYS_PORT.PAGE0
OUT (SYS_PORT.ON),A OUT (SYS_PORT.ON),A
OUT (ROM.SLOT0),A OUT (ROM.SLOT0),A
@ -283,21 +283,12 @@ SHOW_LOGO: LD IX,win_descriptor.tab320x256
SAFE_PORTY SAFE_PORTY
DI DI
LD A,1 LD A,SYS_PORT.PAGE0
OUT (SYS_PORT.ON),A OUT (SYS_PORT.ON),A
;LD A,1
OUT (ROM.SLOT0),A OUT (ROM.SLOT0),A
LD HL,MAIN_LOGO.Raster ; ­ ç «® ª à⨭ª¨ ¢ ¡ ­ª¥ <20>‡“ LD HL,MAIN_LOGO.Raster ; ­ ç «® ª à⨭ª¨ ¢ ¡ ­ª¥ <20>‡“
; CALL DECODE ; CALL DECODE
CALL LOGO_TO_SCREEN CALL LOGO_TO_SCREEN
;
;--------------[<5B> áå «ª ]--------------[]
IF Pashalki
_PASHALKI_CODE
ENDIF
;--------------------------------------[]
;
XOR A XOR A
OUT (SYS_PORT.ON),A OUT (SYS_PORT.ON),A
OUT (ROM.SLOT0),A OUT (ROM.SLOT0),A

View File

@ -14,6 +14,7 @@ BIOS_ver_hex EQU EXP_ID.VER*256+EXP_ID.MOD
DEFINE BoardID_start #5283 DEFINE BoardID_start #5283
DEFINE BoardID_end #47E8 DEFINE BoardID_end #47E8
DEFINE MotherBoardID #0000 DEFINE MotherBoardID #0000
DEFINE MotherBoardType #00 ; !TODO 0 - Legacy, 1 - DX, 2 - Max
;======================================= ;=======================================
;============[For ROM part]============= ;!FIXIT ¢ë ­¥ ¯®­¨¬ ¥â¥, íâ® ¤à㣮¥)) ;============[For ROM part]============= ;!FIXIT ¢ë ­¥ ¯®­¨¬ ¥â¥, íâ® ¤à㣮¥))