fix: WIN_SET_ZG теперь возможно буфер шрифта устанавливать в SLOT3, а стэк в SLOT2

This commit is contained in:
Anatoliy Belyanskiy 2024-02-11 05:02:04 +10:00
parent 746c2c882f
commit 9260afe3b5
8 changed files with 168 additions and 275 deletions

@ -1 +1 @@
Subproject commit 93f04cc30f6a3c20f382c8b467bca79718c9ab2e
Subproject commit 97bdf22c00800ecee2dd714647a2892d3aa4476a

View File

@ -520,10 +520,10 @@ FN_SYNC:
jr .end_set_v_sinc
.SetCmosLines:
LD D,CMOS.Cell.ScreenSET
LD D,CMOS_CELL.ScreenSET
CALL CMOS_RD
AND CMOS.Cell.ScreenSET.Mask.Sinc ; ¢ ॣ¨áâॠA §­ ç¥­¨¥ ScreenSET
AND high CMOS_CELL.ScreenSET.Mask.Sinc ; ¢ ॣ¨áâॠA §­ ç¥­¨¥ ScreenSET
jr z,.SetDefLines
bit 6,a
@ -576,10 +576,10 @@ FN_SYNC:
LD DE,(SYS_PAGE.CONFIG_ALL)
OUT (C),B
LD D,CMOS.Cell.ScreenSET
LD D,CMOS_CELL.ScreenSET
CALL CMOS_RD
AND CMOS.Cell.ScreenSET.Mask.Int ; ¢ ॣ¨áâॠA §­ ç¥­¨¥ ScreenSET
AND high CMOS_CELL.ScreenSET.Mask.Int ; ¢ ॣ¨áâॠA §­ ç¥­¨¥ ScreenSET
JR NZ,.skiptest
CALL Test_CONFIG_ALL

View File

@ -605,8 +605,13 @@ WIN_SET_ZG: ; LP_SET_ZG:
LD L,0
LD BC,#0800 ;!HARDCODE
EX DE,HL
;!TEST 11/02/2024 ãáâ ­®¢ª  èà¨äâ  ¡®«¥¥ £¨¡ª ï ¡¥§ § ¯«ñ⮢
LD A,H
SUB #C0
JR NC,.change
;
LDIR
EX DE,HL
.cont: EX DE,HL
LD A,H
RRCA
RRCA
@ -629,6 +634,14 @@ WIN_SET_ZG: ; LP_SET_ZG:
LD A,(SYS_PAGE.COPY_SLOT1)
OUT (SLOT1),A
RET
;!TEST 11/02/2024 ãáâ ­®¢ª  èà¨äâ  ¡®«¥¥ £¨¡ª ï ¡¥§ § ¯«ñ⮢
.change:
LD A,(SYS_PAGE.COPY_SLOT3)
OUT (SLOT3),A
LDIR
LD A,SYS_PAGE
OUT (SLOT3),A
JR .cont
;------------------------------------------------------------------[#B6]
;
@ -656,23 +669,22 @@ LP_SIZE: ;
LP_AT_D: ; !!!!! ®¦¨¤ ¥âáï, çâ® ¯®àâïâáï ⮫쪮  «ìâ¥à­ â¨¢­ë¥ ॣ¨áâàë ¨ â¥, çâ® ª ª ¯ à ¬¥âàë ­  ¢å®¤¥
LD A,(WIN_ID_0.USER.SIZE_V)
EXX
LD L,A
LD L,A
EXX
LD A,D
EXX
.loop: SUB L
JR NC,.loop
.loop: SUB L
JR NC,.loop
ADD A,L
ADD A,A
ADD A,A
LD L,A
LD A,(WIN_ID_0.V_BEG)
ADD A,L
LD L,A
INC L
LD H,#C3
ADD A,L
ADD A,A
ADD A,A
LD L,A
LD A,(WIN_ID_0.V_BEG)
ADD A,L
LD L,A
INC L
LD H,#C3
EXX
RET
;
@ -682,30 +694,29 @@ LP_AT_D: ; !!!!!
LP_TAB_E:
LD A,(WIN_ID_0.SIZE_REL)
EXX
LD D,A
LD D,A
EXX
LD A,E
EXX
.loop: SUB D
JR NC,.loop
JR Z,.loop
.loop: SUB D
JR NC,.loop
JR Z,.loop
NEG
LD B,A ; á®åà ­¨âì ᪮«ìª® ®áâ «®áì ᨬ¢®«®¢ ¢ áâப¥
NEG
ADD A,D
LD D,A
LD A,(WIN_ID_0.USER.MODE)
AND %0010'0000
JR Z,.skip_Dx2
LD A,D
ADD A,A
LD D,A
NEG
LD B,A ; á®åà ­¨âì ᪮«ìª® ®áâ «®áì ᨬ¢®«®¢ ¢ áâப¥
NEG
ADD A,D
LD D,A
LD A,(WIN_ID_0.USER.MODE)
AND %0010'0000
JR Z,.skip_Dx2
LD A,D
ADD A,A
LD D,A
.skip_Dx2:
LD A,(WIN_ID_0.H_BEG)
ADD A,D
LD D,A
LD A,(WIN_ID_0.H_BEG)
ADD A,D
LD D,A
EXX
RET
;*************************************************************
@ -1601,7 +1612,7 @@ WIN_MOVE:
POP DE
LD B,SHARED_PAGE
LD IX,SLOT3.MEM_ADDR
CALL WIN_REST_WIN1
CALL WIN_RESTORE.Start
AND A
RET
@ -1631,53 +1642,49 @@ WIN_COPY_WIN1:
OUT (SLOT1),A
EXX
RES 7,H
LD C,D
RES 7,H
LD C,D
EXX
.COPY_loop2:
LD A,L
EXX
LD B,A
ADD A,A
ADD A,XL
LD XL,A
JR NC,.NO_INC_XH
INC XH
LD B,A
;
ADD A,A
ADD A,XL
LD XL,A
JR NC,.NO_INC_XH
INC XH
.NO_INC_XH:
LD SP,IX
LD A,C
ADD A,B
LD SP,IX
;
LD A,C
ADD A,B
.COPY_loop:
DEC A
OUT (PORT_Y),A
LD E,(HL)
INC L
LD D,(HL)
DEC L
PUSH DE
DJNZ .COPY_loop
INC HL
INC HL
INC HL
INC HL
DEC A
OUT (PORT_Y),A
LD E,(HL)
INC L
LD D,(HL)
DEC L
PUSH DE
DJNZ .COPY_loop
;
INC HL
INC HL
INC HL
INC HL
EXX
DEC H
JR NZ,.COPY_loop2
;
LD A,SYS_PAGE
OUT (SLOT3),A
LD SP,(SYS_PAGE.SYS_WORK1)
;
POP AF
OUT (SLOT1),A
JP LP_END_P.short
;AND A
;RET
@ -1690,55 +1697,47 @@ WIN_RESTORE:
AND A
SCF
RET NZ
WIN_REST_WIN1:
.Start:
CALL LP_BEG_P
;
IN A,(SLOT1)
PUSH AF
;
CALL LP_AT_D
CALL LP_TAB_E
;
LD (SYS_PAGE.SYS_WORK1),SP
LD SP,IX
;
LD A,B
OUT (SLOT3),A
LD A,#50
OUT (SLOT1),A
;
EXX
RES 7,H
LD C,D
RES 7,H
LD C,D
EXX
LP_REST_L2:
LD A,L
.L2: LD A,L
EXX
LD B,A
LD A,C
LP_REST_L1:
OUT (PORT_Y),A
INC A
POP DE
LD (HL),E
INC L
LD (HL),D
DEC L
DJNZ LP_REST_L1
INC HL
INC HL
INC HL
INC HL
LD B,A
LD A,C
.L1: OUT (PORT_Y),A
INC A
POP DE
LD (HL),E
INC L
LD (HL),D
DEC L
DJNZ .L1
;
INC HL
INC HL
INC HL
INC HL
EXX
DEC H
JR NZ,LP_REST_L2
JR NZ,.L2
LD A,SYS_PAGE
OUT (SLOT3),A

View File

@ -228,7 +228,7 @@ INIT_SYS_ALL:
;
;-----------[new code start]------------; !!!!! ¯®á¬®âà¥âì-¯à¨ç¥á âì
INIT_VSyncAndWaits:
LD D,CMOS.Cell.ScreenSET
LD D,CMOS_CELL.ScreenSET
CALL CMOS_RD
ld d,a
jr nc,.cmos_OK
@ -238,7 +238,7 @@ INIT_VSyncAndWaits:
jr z,INIT_CONFIG_ALL.setDefaultINT
.cmos_OK:
and CMOS.Cell.ScreenSET.Mask.Sinc
and high CMOS_CELL.ScreenSET.Mask.Sinc
and #40
ld a,3 ; 320 lines & no waits
jr z,.setVSyncAndWaits
@ -249,10 +249,10 @@ INIT_VSyncAndWaits:
INIT_CONFIG_ALL:
ld a,d
and CMOS.Cell.ScreenSET.Mask.Int
and high CMOS_CELL.ScreenSET.Mask.Int
jr z,.setDefaultINT ; set default int
xor CMOS.Cell.ScreenSET.Mask.Int
xor high CMOS_CELL.ScreenSET.Mask.Int
LD HL,SCREEN_TABLES.ORIGINAL ; set original int
jr z,.setINT

View File

@ -211,22 +211,22 @@ STEP1_GETCMOS:
LD A,H
;
AND A
LD BC,#3011 ;CMOS VALUE
LD BC,CMOS_CELL.DrivesSetup_1.Mask.PriIDEmaster ;#3011
LD L,msgStrings.detectIdePrMA
JR Z,.choose
;
DEC A
LD BC,#C011 ;CMOS VALUE
LD BC,CMOS_CELL.DrivesSetup_1.Mask.PriIDEslave ;#C011
LD L,msgStrings.detectIdePrSL
JR Z,.choose
;
DEC A
LD BC,#3020
LD BC,CMOS_CELL.DrivesSetup_2.Mask.SecIDEmaster
LD L,msgStrings.detectIdeSecMA
JR Z,.choose
;
DEC A
LD BC,#C020
LD BC,CMOS_CELL.DrivesSetup_2.Mask.SecIDEslave
LD L,msgStrings.detectIdeSecSL
JR Z,.choose
SCF
@ -246,11 +246,9 @@ STEP1_GETCMOS:
JR Z,SETUP_FROM_CMOS ;Get from CMOS (SETUP)
;
DEC A
JR Z,IT_IS_ATAPI ;CD-ROM
RET ;DON'T CHECK THIS DEVICE
RET NZ ;DON'T CHECK THIS DEVICE
;JR Z,IT_IS_ATAPI ;CD-ROM
/////////////////////////////////////////////////////////////////////[^]
/////////////////////////////////////////////////////////////////////[v]
IT_IS_ATAPI:
LD A,L ;DETECT MESSAGE

View File

@ -274,7 +274,7 @@ CLEARM: IN A,(SLOT3)
CALL .MEMLOOP
;
CALL EMM.InitMem
LD BC,#400E ;!HARDCODE
LD BC,CMOS_CELL.BootUpParams.Mask.SaveRAMdisks ;#400E
CALL G_VALUE
OR A
CALL NZ,CCHAIN
@ -521,7 +521,7 @@ START:
CALL RESCREEN
;R06
LD BC,#010E ; QUICK START
LD BC,CMOS_CELL.BootUpParams.Mask.QuickStart ;#010E
CALL G_VALUE
POP BC
INC B
@ -663,7 +663,7 @@ INFO_MESSAGE: ;!FIXIT
CALL TSETUP
LD BC,#0710 ; !HARDCODE ¬ áª  ¨ ï祩ª  ¤«ï ç⥭¨ï §­ ç¥­¨ï ª¬®á ¤«ï ®á­®¢­®£® § £à㧮筮£® ¤à ©¢ 
LD BC,CMOS_CELL.BootDrives.Mask.SysDisk ;#0710
CALL PrepareToBOOT
LD A,msgStrings.bootFail
LD E,COLORS.CGA.INC.LRED
@ -676,7 +676,7 @@ ABOOT: LD A,msgStrings.bootAltDrv
;CALL C,POSTMSG
CALL C,POSTMSC
LD BC,#7010 ; !HARDCODE ¬ áª  ¨ ï祩ª  ¤«ï ç⥭¨ï §­ ç¥­¨ï ª¬®á ¤«ï  «ìâ¥à­ â¨¢­®£® § £à㧮筮£® ¤à ©¢ 
LD BC,CMOS_CELL.BootDrives.Mask.AltSysDisk ;#7010
CALL PrepareToBOOT
LD A,msgStrings.bootFail
LD E,COLORS.CGA.INC.LRED
@ -685,7 +685,7 @@ ABOOT: LD A,msgStrings.bootAltDrv
CALL ScreenPOS.CRLF
;NO START DISK - RESTART / SETUP / ZX SPECTRUM mode
LD BC,#021D
LD BC,CMOS_CELL.Options.Mask.RebootMSG ;#021D
CALL G_VALUE
OR A
JP Z,EXIT_SETUP
@ -1065,7 +1065,7 @@ FINSTAL:
;
EX AF,AF'
OUT (SLOT3),A
LD BC,#0311 ; !HARDCODE
LD BC,CMOS_CELL.DrivesSetup_1.Mask.FirstFDD ;#0311
CALL G_VALUE
LD HL,FD720A
OR A
@ -1084,7 +1084,7 @@ SETFD0:
EX AF,AF'
OUT (SLOT3),A
NOFDD0:
LD BC,#0C11
LD BC,CMOS_CELL.DrivesSetup_1.Mask.SecondFDD ;#0C11
CALL G_VALUE
LD HL,FD720A
OR A
@ -1280,7 +1280,7 @@ RCHAIN:
CCHAIN:
LD HL,MEMMAP2
LD DE,#C200
LD DE,SYS_PAGE.RAMD_FAT
XOR A
CCHAINC:
CP (HL)
@ -1303,16 +1303,16 @@ TRQUICK:
; %0000'1100 - TR DOS B: Default / FDD / HDD / RMD
; %0011'0000 - TR DOS C: Default / FDD / HDD / RMD
; %1100'0000 - TR DOS D: Default / FDD / HDD / RMD
LD BC,#031E
LD BC,CMOS_CELL.TRDOSmount.Mask.A ;#031E
LD A,0
CALL TRDOSX
LD BC,#0C1E
LD BC,CMOS_CELL.TRDOSmount.Mask.B ;#0C1E
LD A,1
CALL TRDOSX
LD BC,#301E
LD BC,CMOS_CELL.TRDOSmount.Mask.C ;#301E
LD A,2
CALL TRDOSX
LD BC,#C01E
LD BC,CMOS_CELL.TRDOSmount.Mask.D ;#C01E
LD A,3
TRDOSX:
@ -1408,87 +1408,6 @@ ElementsBuffer:
.DownCenter: BYTE "Á" ; DC - DownCenter
.Size EQU $-ElementsBuffer
;
/*
SDOUBLE:
DB #C9
DB #BB
DB #CD
DB #BA
DB #C8
DB #BC
DB #CC
DB #B9
DB #CB
DB #CA
SSINGLE:
DB #DA
DB #BF
DB #C4
DB #B3
DB #C0
DB #D9
DB #C3
DB #B4
DB #C2
DB #C1
SSIN_DW:
DB #C9
DB #BB
DB #C4
DB #BA
DB #C7
DB #B6
DB #C7
DB #B6
DB #D1
DB #C1
SSIN_UP:
DB #C7
DB #B6
DB #C4
DB #BA
DB #C8
DB #BC
DB #C7
DB #B6
DB #C2
DB #CF
SSIN_AL:
DB #C7
DB #B6
DB #C4
DB #BA
DB #C7
DB #B6
DB #C7
DB #B6
DB #C2
DB #C1
;
SELEM:
UL: DB #DA
UR: DB #BF
ZL: DB #C4
VL: DB #B3
LL: DB #C0
LR: DB #D9
LC: DB #C3
RC: DB #B4
UC: DB #C2
DC: DB #C1
;
*/
INCLUDE 'VIDEO_IO.asm'
INCLUDE 'AUTOIDE.asm'
@ -1510,21 +1429,21 @@ FindStringAddr:
LD H,(HL)
LD L,A
RET
/*
Get_Item_Address:
LD L,A
LD H,0
LD BC,MSG_Buffer
ADD HL,HL
ADD HL,BC
LD A,(HL)
INC HL
LD H,(HL)
LD L,A
INC HL
INC HL
RET
*/
; Get_Item_Address:
; LD L,A
; LD H,0
; LD BC,MSG_Buffer
; ADD HL,HL
; ADD HL,BC
; LD A,(HL)
; INC HL
; LD H,(HL)
; LD L,A
; INC HL
; INC HL
; RET
POSTLEN:
CALL FindStringAddr
LD BC,#0100
@ -1594,34 +1513,11 @@ PRINT_CHANEL:
LD D,#FF
JP LP_PRINT_LINE6
;
/*
Detecting IDE Primary Master ... [Press F4 to skip]
Ž¯à¥¤¥«ï¥¬ <EFBFBD>¥à¢¨ç­ë© IDE Master ... [F4 ¤«ï ¯à®¯ã᪠]
Boot from HDD Primary IDE Master OK
Boot from HDD Primary IDE Slave OK
Boot from HDD Secondary IDE Master OK
Boot from HDD Secondary IDE Slave OK
 ¯ã᪠á HDD Secondary IDE Master OK
 ¯ã᪠á CD-ROM Secondary IDE Master OK
Boot from ATAPI Secondary IDE Master OK
*/
;---------------------------------------
INCLUDE 'src/bios/ROM/SETUP/messages.z80'
;---------------------------------------
;
/*
MSG_Buffer_Length EQU MSG_ENG_END-MSG_ENG
STACK EQU $+128
MSG_Buffer EQU STACK+2
TMP_BUFFER EQU MSG_Buffer+MSG_Buffer_Length
IF TMP_BUFFER+1024 > #C000
DISPLAY 'Page limit exceeded by: ',/A,$-#C000
ASSERT TMP_BUFFER+1024 > #C000
ENDIF
*/
STRUCT MAIN_BUFFERS
ID BLOCK #100

View File

@ -1,8 +1,8 @@
;U_SETUP:
SETTINGS:
LD A,CMOS.Cell.ScreenSET
LD A,CMOS_CELL.ScreenSET
CALL READCMS
AND CMOS.Cell.ScreenSET.Mask.ColorStyle
AND high CMOS_CELL.ScreenSET.Mask.ColorStyle
LD L,A
CALL CSET
LD DE,0
@ -248,13 +248,13 @@ DECITM:
JP PCURSOR
CCHANGE:
LD A,CMOS.Cell.ScreenSET
LD A,CMOS_CELL.ScreenSET
CALL READCMS
INC A
AND CMOS.Cell.ScreenSET.Mask.ColorStyle
AND high CMOS_CELL.ScreenSET.Mask.ColorStyle
LD L,A
LD B,A
LD A,CMOS.Cell.ScreenSET
LD A,CMOS_CELL.ScreenSET
CALL WRITCMS
CSET:
LD H,0
@ -826,9 +826,9 @@ setXYpos:
JP RESCREEN
setVsinc:
ld a,CMOS.Cell.ScreenSET
ld a,CMOS_CELL.ScreenSET
call READCMS
and CMOS.Cell.ScreenSET.Mask.Sinc
and high CMOS_CELL.ScreenSET.Mask.Sinc
SCF
jr z,.skip ;320
SLA A
@ -843,9 +843,9 @@ setLang:
ld (ITEM_Restore),a
pop hl ; delete return adress from stack
jp SETTINGS
setInt: ld a,CMOS.Cell.ScreenSET
setInt: ld a,CMOS_CELL.ScreenSET
call READCMS
and CMOS.Cell.ScreenSET.Mask.Int
and high CMOS_CELL.ScreenSET.Mask.Int
jr nz,.skipDefaultInt
ld a,2 ; Pentagon sync - default
jr .set

View File

@ -227,7 +227,7 @@ PRSYM: ;LD BC,1*256 + BIOS.LP_PRINT_SYM
LOGOTYP:
CALL LOGOX
LD BC,#180E
LD BC,CMOS_CELL.BootUpParams.Mask.StartDelay
CALL G_VALUE
OR A
JR Z,EASYDLY ;MIN (DISABLE)
@ -262,7 +262,7 @@ NOWLOGO:
CALL WIN_OPEN
LD DE,0
LD HL,#0920 ;LOGOTYPE SIZE
LD HL,#0920 ;!HARDCODE LOGOTYPE SIZE
LD B,7
JP LP_CLS_WIN
@ -329,24 +329,24 @@ LOGOX: LD IX,win_descriptor.tab320x256
win_descriptor:
.tab80x32 Window_UserVars{
40, ; £®à¨§®­â «ì­ë© à §¬¥à ®ª­  ¢ §­ ª®¬¥áâ å
32, ; ¢¥à⨪ «ì­ë© à §¬¥à ¢ §­ ª®¬¥áâ å
0, ; ¯®«®¦¥­¨¥ ®ª­  ¯® £®à¨§®­â «¨ ­  íªà ­¥
0, ; ¯®«®¦¥­¨¥ ®ª­  ¯® ¢¥à⨪ «¨ ­  íªà ­¥
%0001'1011, ; ०¨¬ §­ ª®¬¥áâ 
0, ; ¤®¯®«­¨â¥«ì­ë© ०¨¬ §­ ª®¬¥áâ 
0, ; ¯®«®¦¥­¨¥ ¯® X ¢ ¯®«¥ £à ä¨ª¨ (¯® §­ ª®¬¥áâ ¬)
0 ; ¯®«®¦¥­¨¥ ¯® Y ¢ ¯®«¥ £à ä¨ª¨ (¯® §­ ª®¬¥áâ ¬)
40, ; £®à¨§®­â «ì­ë© à §¬¥à ®ª­  ¢ §­ ª®¬¥áâ å
32, ; ¢¥à⨪ «ì­ë© à §¬¥à ¢ §­ ª®¬¥áâ å
0, ; ¯®«®¦¥­¨¥ ®ª­  ¯® £®à¨§®­â «¨ ­  íªà ­¥
0, ; ¯®«®¦¥­¨¥ ®ª­  ¯® ¢¥à⨪ «¨ ­  íªà ­¥
%0001'1011, ; ०¨¬ §­ ª®¬¥áâ 
0, ; ¤®¯®«­¨â¥«ì­ë© ०¨¬ §­ ª®¬¥áâ 
0, ; ¯®«®¦¥­¨¥ ¯® X ¢ ¯®«¥ £à ä¨ª¨ (¯® §­ ª®¬¥áâ ¬)
0 ; ¯®«®¦¥­¨¥ ¯® Y ¢ ¯®«¥ £à ä¨ª¨ (¯® §­ ª®¬¥áâ ¬)
}
.tab320x256 Window_UserVars{
16, ; £®à¨§®­â «ì­ë© à §¬¥à ®ª­  ¢ §­ ª®¬¥áâ å
9, ; ¢¥à⨪ «ì­ë© à §¬¥à ¢ §­ ª®¬¥áâ å
0, ; ¯®«®¦¥­¨¥ ®ª­  ¯® £®à¨§®­â «¨ ­  íªà ­¥
0, ; ¯®«®¦¥­¨¥ ®ª­  ¯® ¢¥à⨪ «¨ ­  íªà ­¥
%0010'0000, ; ०¨¬ §­ ª®¬¥áâ 
0, ; ¤®¯®«­¨â¥«ì­ë© ०¨¬ §­ ª®¬¥áâ 
8, ; ¯®«®¦¥­¨¥ ¯® X ¢ ¯®«¥ £à ä¨ª¨ (¯® §­ ª®¬¥áâ ¬)
0 ; ¯®«®¦¥­¨¥ ¯® Y ¢ ¯®«¥ £à ä¨ª¨ (¯® §­ ª®¬¥áâ ¬)
16, ; £®à¨§®­â «ì­ë© à §¬¥à ®ª­  ¢ §­ ª®¬¥áâ å
9, ; ¢¥à⨪ «ì­ë© à §¬¥à ¢ §­ ª®¬¥áâ å
0, ; ¯®«®¦¥­¨¥ ®ª­  ¯® £®à¨§®­â «¨ ­  íªà ­¥
0, ; ¯®«®¦¥­¨¥ ®ª­  ¯® ¢¥à⨪ «¨ ­  íªà ­¥
%0010'0000, ; ०¨¬ §­ ª®¬¥áâ 
0, ; ¤®¯®«­¨â¥«ì­ë© ०¨¬ §­ ª®¬¥áâ 
8, ; ¯®«®¦¥­¨¥ ¯® X ¢ ¯®«¥ £à ä¨ª¨ (¯® §­ ª®¬¥áâ ¬)
0 ; ¯®«®¦¥­¨¥ ¯® Y ¢ ¯®«¥ £à ä¨ª¨ (¯® §­ ª®¬¥áâ ¬)
}
;