From 934353b970c611787ae6890402132f740f879bbf Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Tue, 1 Oct 2024 05:00:13 +1000 Subject: [PATCH] =?UTF-8?q?=D0=BF=D0=B5=D1=80=D0=B2=D0=B0=D1=8F=20=D0=B1?= =?UTF-8?q?=D0=B5=D1=82=D0=BA=D0=B0=20=D0=B2=D0=BE=D1=81=D1=8C=D0=BC=D0=BE?= =?UTF-8?q?=D0=B9=20=D0=B1=D0=B5=D1=82=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ZX_ROMS/new/SP_TRDOS.bin | Bin 16384 -> 16384 bytes src/bios/exp/EXP.asm | 30 +++--- src/bios/exp/FUNC_SYS.ASM | 7 +- src/bios/rom/SETUP/MAIN.asm | 162 +++++++++++++++----------------- src/bios/rom/SETUP/messages.z80 | 8 +- src/bios/rom/ZX/ZX_FUNC.ASM | 15 +-- src/bios/rom/ZX/ZX_MENU.ASM | 74 ++++++++++----- 7 files changed, 160 insertions(+), 136 deletions(-) diff --git a/src/ZX_ROMS/new/SP_TRDOS.bin b/src/ZX_ROMS/new/SP_TRDOS.bin index 4aaa61c2a730fcd9201be94c977a522ad882adfc..e6088321df545a1381f331e08657f97ab028d657 100644 GIT binary patch delta 165 zcmZo@U~Fh$+~B~$@|p23%VZ~x5|?C73%%FNmEQ&_aDP1bP~zcPpn&Y_yHBs)eR%QX z*R$U_fTHP@Q~V7WS!<`{E9{Zj0Tj4;_vyvE4}p>=feO#sP5#C4m|wB--vsVF@@c>!%~_QXmWQ!QmL;&0z^R9qZlY)!pII z@%7F1lh_Cx2=xfb-R0HIJd^wg;}0Ww{_r>+X<*&q!O`(I$&+CN6|(^fV*&w=lVuDh u0fe)R3`_wYO$Y>2K~_a+3$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$< >$<; -; ENDIF + ;-------------------------------[ #FFE0 ]-------------------------------; ; программа, которая будучи размещенной в #40 странице, ; с адреса RESTARTS, перехватывает RESET @@ -1290,8 +1291,8 @@ RESTARTS_PROG: ; !TODO LDConf NOP NOP .Size EQU $-RESTARTS_PROG - ; LD A,1 - ; OUT (SLOT3),A + ; LD A,1 + ; OUT (SLOT3),A ;-----------------------------------------------------------------------; ;----------------------------[Setup Starter]----------------------------; @@ -1485,8 +1486,6 @@ kbd_loop2: - - ;#######################################################################; ;#######################################################################; ;-----------------------------------------------------------------------; @@ -1504,6 +1503,11 @@ ROM_DISK.Pages: ; ;#######################################################################; ; + + + + + ;---------[Return to EXTENSION]--------- _mInfoBLOCK #3FD0-$,#FF ; ToBIOS_FromEXT ; #3FD0 diff --git a/src/bios/exp/FUNC_SYS.ASM b/src/bios/exp/FUNC_SYS.ASM index 1f560e6..84f215a 100644 --- a/src/bios/exp/FUNC_SYS.ASM +++ b/src/bios/exp/FUNC_SYS.ASM @@ -300,13 +300,16 @@ INIT_CONFIG_ALL: LD DE,CNF_PORT.CNF_0 + ROM.BIOS LD (SYS_PAGE.CONFIG_DE - #4000),DE + + ; LD HL,SYS_PAGE.ZX_TASK.CURRENT - #4000 ; убить все задачи ; LD DE,SYS_PAGE.ZX_TASK.CURRENT+1 - #4000 ; LD BC,_ZX_TASK - 1 ; LD (HL),0 ; LDIR - - + LD A,Spec_Page + OUT (SLOT2),A + LD (Spec_Page.flag_Z - #4000),A EX AF,AF' OUT (SLOT2),A diff --git a/src/bios/rom/SETUP/MAIN.asm b/src/bios/rom/SETUP/MAIN.asm index ca9c74e..67b67aa 100644 --- a/src/bios/rom/SETUP/MAIN.asm +++ b/src/bios/rom/SETUP/MAIN.asm @@ -437,35 +437,19 @@ EXIT_SETUP: CALL INT_OFF ; error XOR A OUT (SYS_PORT.ROM),A - LD D,CMOS_CELL.QuickStartSetUp + LD D,CMOS_CELL.QuickStartSetUp ; обнуляем параметр на всякий случай CALL CMOS_WR - LD A,SYS_PAGE - OUT (SLOT3),A - RET + ; + CALL ScreenPOS.CRLF + LD A,msgStrings.errorZXmode + LD E,COLORS.CGA.INK.RED + CALL POSTMSC +.loop_di: DI + HALT + JR .loop_di - - -; ELSE - ;LD BC,#020E - ;CALL GET_CMOS_VALUE - ;OR A - ;LD A,#EC ;SPRINTER - ;JR Z,XFLEX - ;LD A,#EA ;SPECTRUM -;XFLEX: - ; XOR A ;LD A,ROM.BIOS - ; OUT (SYS_PORT.ROM),A - ; POP HL ; пихается в EXP.ASM в процедуре - ; JP (HL) - ;LD (JMPHL),HL - ;LD C,#F3 - ;RST_to_BIOS -;JMPHL EQU $+1 - ;JP #0000 - ; ENDIF - SetUp_ZX_HDD: LD D,CMOS_CELL.TRDOSmount CALL CMOS_RD AND %1010'1010 ; маска для 4-х HDD @@ -1827,6 +1811,71 @@ init_zx_roms: DI OUT (SYS_PORT.ROM),A LD A,Spec_Page OUT (SLOT3),A +.init_41h: ; забить FF-ами + LD HL,#C000 + LD DE,#C001 + LD BC,#3FFF - 2 + LD (HL),#FF + LDIR + ; Заглушка для страницы #41 + LD HL,PROG_NO_ROM + LD DE,#C000 + Spec_Page.no_zx_rom + LD BC,PROG_NO_ROM.size + LDIR + ; + LD HL,RAM_BIOS_PROG + LD DE,#C000 + Spec_Page.to_bios + LD BC,RAM_BIOS_PROG.Length + LDIR + RET +;---------------------------------------------------------------------[] + + +;--------------------------------------- + INCLUDE 'src/bios/ROM/SETUP/messages.z80' +;--------------------------------------- +; + + STRUCT MAIN_BUFFERS +ID BLOCK #100 +Messages BLOCK MSG_ENG.size +Shared BLOCK 1024 +End BYTE + ENDS + + +memBUFFER MAIN_BUFFERS = $ +STACK EQU #C000 +.Size EQU 128 + + + IF memBUFFER.End-1 > #C000-STACK.Size + DISPLAY 'memBUFFER.Shared overlaps STACK by: ',/A,(memBUFFER.End-1)-(#C000-STACK.size) + ASSERT memBUFFER.End-1 < #C000-STACK.size + ENDIF + + IFDEF PREBUILD + OUTEND + + DISPLAY '-----[Set_Pictures Prebuild start]-----' + MMU 1 e, 0 ; страница 0 в банку 0 и проверка на границы. + ORG ROM_MAP.LOGO + INCLUDE 'src/bios/logo/Set_Pictures.asm' + DISPLAY '-----[Set_Pictures Prebuild done ]-----' + ELSE + DISPLAY '------------------[Main.asm]------------------' + DISPLAY 'End code address: ',/A,$-1 + DISPLAY 'Code size: ',/A,$-COMPILE_ADDR.MAIN + DISPLAY 'End buffers address: ',/A,memBUFFER.End-1 + DISPLAY 'Free memory: ',/A,#C000-(memBUFFER.End-1)-STACK.Size + DISPLAY 'Unused bytes before INT_POINTER: ',/A,INT_POINTER-before_intPointer + ENDIF +; + + + +;======================================================================================================================= + ; ;;;;;;;; ; ELSE ; ;;;;;;;; @@ -1892,65 +1941,4 @@ init_zx_roms: DI ; ; можно задействовать ещё 4 страницы на порты #E4..#E7 ; ;;;;;;;; ; ENDIF -; ;;;;;;;; - -.init_41h: ; забить FF-ами - LD HL,#C000 - LD DE,#C001 - LD BC,#3FFF - 2 - LD (HL),C - LDIR - ; Заглушка для страницы #41 - LD HL,PROG_NO_ROM - LD DE,#C000 + Spec_Page.no_zx_rom - LD BC,PROG_NO_ROM.size - LDIR - ; - LD HL,RAM_BIOS_PROG - LD DE,#C000 + Spec_Page.to_bios - LD BC,RAM_BIOS_PROG.Length - LDIR - RET -;---------------------------------------------------------------------[] - - -;--------------------------------------- - INCLUDE 'src/bios/ROM/SETUP/messages.z80' -;--------------------------------------- -; - - STRUCT MAIN_BUFFERS -ID BLOCK #100 -Messages BLOCK MSG_ENG.size -Shared BLOCK 1024 -End BYTE - ENDS - - -memBUFFER MAIN_BUFFERS = $ -STACK EQU #C000 -.Size EQU 128 - - - IF memBUFFER.End-1 > #C000-STACK.Size - DISPLAY 'memBUFFER.Shared overlaps STACK by: ',/A,(memBUFFER.End-1)-(#C000-STACK.size) - ASSERT memBUFFER.End-1 < #C000-STACK.size - ENDIF - - IFDEF PREBUILD - OUTEND - - DISPLAY '-----[Set_Pictures Prebuild start]-----' - MMU 1 e, 0 ; страница 0 в банку 0 и проверка на границы. - ORG ROM_MAP.LOGO - INCLUDE 'src/bios/logo/Set_Pictures.asm' - DISPLAY '-----[Set_Pictures Prebuild done ]-----' - ELSE - DISPLAY '------------------[Main.asm]------------------' - DISPLAY 'End code address: ',/A,$-1 - DISPLAY 'Code size: ',/A,$-COMPILE_ADDR.MAIN - DISPLAY 'End buffers address: ',/A,memBUFFER.End-1 - DISPLAY 'Free memory: ',/A,#C000-(memBUFFER.End-1)-STACK.Size - DISPLAY 'Unused bytes before INT_POINTER: ',/A,INT_POINTER-before_intPointer - ENDIF -; \ No newline at end of file +; ;;;;;;;; \ No newline at end of file diff --git a/src/bios/rom/SETUP/messages.z80 b/src/bios/rom/SETUP/messages.z80 index 7696466..2d0140b 100644 --- a/src/bios/rom/SETUP/messages.z80 +++ b/src/bios/rom/SETUP/messages.z80 @@ -602,7 +602,7 @@ msgStrings: _mSetStr bootFail, tmp_Counter : DZ ' fail' ; !FIXIT strFail _mSetStr bootOk, tmp_Counter : DZ ' OK' _mSetStr afterBootFail, tmp_Counter : DZ 'PRESS TO REBOOT, TO ENTER SETUP OR TO ZX-MODE . . .' -; _mSetStr noMemZX, tmp_Counter : DZ 'Error! No free memory to start ZX mode. Press CTRL+ALT+DEL or RESET.' + _mSetStr errorZXmode, tmp_Counter : DZ 'Error! Spectrum mode launch failed. Press CTRL+ALT+DEL or RESET.' ; _mSetStr parLang, tmp_Counter : DZ 'Language (язык) : ' _mSetStr valLangEng, tmp_Counter : DZ 'English ' @@ -709,7 +709,7 @@ msgStrings: _mSetStr valQS_SetUpTrDos, tmp_Counter : DZ 'TR-DOS ' _mSetStr valQS_SetUpExp, tmp_Counter : DZ 'Expansion ' _mSetStr valQS_SetUpTrDos48, tmp_Counter : DZ 'TR-DOS 48 ' - _mSetStr valQS_SetUpBasic48, tmp_Counter : DZ 'Basic 48+ ' + _mSetStr valQS_SetUpBasic48, tmp_Counter : DZ 'Basic 48 ' ; _mSetStrRus valLoadZXromsAuto, tmp_Counter : DZ 'On call ' IF NEW_FEATURE _mSetStr parSetTime, tmp_Counter : DZ 'Date and time setup : ' @@ -778,7 +778,7 @@ msgRusStrings: _mSetStrRus bootFail, tmp_Counter : DZ ' невозможен' _mSetStrRus bootOk, tmp_Counter : DZ ' OK' _mSetStrRus afterBootFail, tmp_Counter : DZ 'НАЖМИТЕ ДЛЯ ПЕРЕЗАГРУЗКИ, ДЛЯ НАСТРОЕК ИЛИ ДЛЯ ZX-MODE . . .' -; _mSetStrRus noMemZX, tmp_Counter : DZ 'Ошибка! Недостаточно памяти для старта ZX Mode. Нажмите CTRL+ALT+DEL или RESET.' + _mSetStrRus errorZXmode, tmp_Counter : DZ 'Ошибка! Запуск режима Spectrum не удался. Нажмите CTRL+ALT+DEL или RESET.' ; _mSetStrRus parLang, tmp_Counter : DZ 'Язык (language) : ' _mSetStrRus valLangEng, tmp_Counter : DZ 'English ' @@ -885,7 +885,7 @@ msgRusStrings: _mSetStrRus valQS_SetUpTrDos, tmp_Counter : DZ 'TR-DOS ' _mSetStrRus valQS_SetUpExp, tmp_Counter : DZ 'Expansion ' _mSetStrRus valQS_SetUpTrDos48, tmp_Counter : DZ 'TR-DOS 48 ' - _mSetStrRus valQS_SetUpBasic48, tmp_Counter : DZ 'Basic 48+ ' + _mSetStrRus valQS_SetUpBasic48, tmp_Counter : DZ 'Basic 48 ' ; _mSetStrRus valLoadZXromsAuto, tmp_Counter : DZ 'При вызове ' IF NEW_FEATURE _mSetStrRus parSetTime, tmp_Counter : DZ 'Дата и время : ' diff --git a/src/bios/rom/ZX/ZX_FUNC.ASM b/src/bios/rom/ZX/ZX_FUNC.ASM index 75e8429..2ed7360 100644 --- a/src/bios/rom/ZX/ZX_FUNC.ASM +++ b/src/bios/rom/ZX/ZX_FUNC.ASM @@ -390,7 +390,7 @@ INIT_vROM: LD A,(HL) POP DE POP BC DJNZ .loop - ; установка метки ZX если рамблок не #FF + ; установка метки ZX если рамблок не 0 LD A,(SYS_PAGE.Block_ID.vROM) OR A RET Z @@ -726,7 +726,6 @@ GOTO_SPECTRUM: LD A,BIOS.Error.NotSupported OUT (RGMOD),A ; регистр моды ; LD IY,.BASIC_128 - ;!TODO если 48к то не нужно? ; [ ] free zx pages! JR INIT_PAGES ; инициализация номеров страниц режима спектрума ;start_basic: .BASIC_128: LD SP,#C000 @@ -734,7 +733,6 @@ GOTO_SPECTRUM: LD A,BIOS.Error.NotSupported LD DE,ZX_VARS.PRINTER_BUFFER ; запуск программы на BASIC-е. LD BC,RES128_PROG.Size LDIR - DI JP ZX_VARS.PRINTER_BUFFER ;-----------------------------------------------------------------------; @@ -779,9 +777,14 @@ INIT_PAGES: LD A,SYS_PAGE JR Z,.set_pent ;!FIXIT обработка ошибки DI - HALT +.error_loop: LD A,R + AND 7 + OUT (BorderColor),A + JR .error_loop ; -.set_48k: LD A,(HL) ; SLOT0, SLOT3 page +.set_48k: LD A,5 ; !HARDCODE CONFIG_DE.ZX_START ВХОД В BASIC 48 с закрытыми 128-ми портами + LD (SYS_PAGE.CONFIG_DE.ZX_START - #8000),A + LD A,(HL) ; SLOT0, SLOT3 page INC HL LD E,(HL) ; SLOT1 page INC HL @@ -860,7 +863,7 @@ RES128_PROG: ; 3 ВХОД В EXPANSION ;!TODO пока не работает. Page #45, BIOS (ZX_EXP) #E0 XOR A - OUT (C),A + OUT (C),A ; 7FFD LD A,#02 LD B,#1F OUT (C),A diff --git a/src/bios/rom/ZX/ZX_MENU.ASM b/src/bios/rom/ZX/ZX_MENU.ASM index f40018d..26c25af 100644 --- a/src/bios/rom/ZX/ZX_MENU.ASM +++ b/src/bios/rom/ZX/ZX_MENU.ASM @@ -368,7 +368,7 @@ SERVICE: CALL EXEC_PNT JR SERVICE -SR_TAB: DW UTILIT +SR_TAB: DW RUN_DISK_TRD DW GOTO_TRDOS.m128 DW GOTO_TRDOS.m48 DW TURBO_OFF @@ -481,22 +481,24 @@ Hardware_Menu_TAB: ; DW TR_DOS ; DW SP_DOS DW SPRINTER_ZX - DW ZX_SPECTRUM_128 - DW PENTAGON_128 DW SCORPION_256 + DW Pentagon_48 + DW PENTAGON_128 DW PENTAGON_512 + DW ZX_SPECTRUM_128 DW SPRINTER_reset ;SPRINTER_2X DW RET_FROM_M ; DC - every last character of a string will have bit 7 set Hardware_Menu_STR: - BYTE 8 ; количество пунктов + BYTE 9 ; количество пунктов BYTE 'Hardware',#FF ; заголовок меню DC 'Sprinter ZX ' - DC 'ZX Spectrum' - DC 'Pentagon 128' DC 'Scorpion 256' + DC 'Pentagon 48 ' + DC 'Pentagon 128' DC 'Pentagon 512' + DC 'Spectrum 128' DC 'Restart ' DC 'RETURN' DC " " ; маркер конца @@ -522,21 +524,20 @@ Hardware_Menu_STR: ;************************************************** SPRINTER_ZX: LD L,0 ; точка входа в ПЗУ .custom_ROM: LD H,BIOS.RST_CONF.SP97_1 - LD DE,4*256 + CNF_PORT.TURBO.ON + CNF_PORT.CNF_0 ; !HARDCODE 4 - выделение памяти Scorpion 256k. 2+6+8 страницы LD BC,#FE*256 + %0000'0010 ; !HARDCODE Port All Mode data. int pent, set default palette, 320 строк + LD DE,4*256 + CNF_PORT.TURBO.ON + CNF_PORT.CNF_0 ; !HARDCODE 4 - выделение памяти Scorpion 256k. 2+6+8 страницы JR PREPARE_TO_START_ZX ; ZX_SPECTRUM_128: LD L,0 ; точка входа в ПЗУ .custom_ROM: LD H,BIOS.RST_CONF.AY8910 - LD DE,2*256 + CNF_PORT.CNF_1 + CNF_PORT.TURBO.ON + CNF_PORT.SCORP_RESET ; !HARDCODE 2 - выделение памяти Pentagon 128 LD BC,#FA*256 + %1000'0011 - JR PREPARE_TO_START_ZX + JR PENTAGON_128.zx ; SCORPION_256: LD L,0 ; точка входа в ПЗУ .custom_ROM: LD H,BIOS.RST_CONF.AY8910 - LD DE,4*256 + CNF_PORT.TURBO.ON + CNF_PORT.CNF_1 ; !HARDCODE 4 - выделение памяти Scorpion 256k. 2+6+8 страницы LD BC,#FE*256 + %1000'0001 + LD DE,4*256 + CNF_PORT.TURBO.ON + CNF_PORT.CNF_1 ; !HARDCODE 4 - выделение памяти Scorpion 256k. 2+6+8 страницы PREPARE_TO_START_ZX: DI LD A,CNF_PORT.CNF_0 + CNF_PORT.TURBO.ON @@ -576,15 +577,26 @@ PREPARE_TO_START_ZX: ; PENTAGON_128: LD L,0 ; точка входа в ПЗУ .custom_ROM: LD H,BIOS.RST_CONF.AY8910 - LD DE,2*256 + CNF_PORT.CNF_1 + CNF_PORT.TURBO.ON + CNF_PORT.SCORP_RESET ; !HARDCODE 2 - выделение памяти Pentagon 128 LD BC,#FE*256 + %0000'0010 +.zx: LD DE,2*256 + CNF_PORT.CNF_1 + CNF_PORT.TURBO.ON + CNF_PORT.SCORP_RESET ; !HARDCODE 2 - выделение памяти Pentagon 128 JR PREPARE_TO_START_ZX ; PENTAGON_512: LD L,0 ; точка входа в ПЗУ .custom_ROM: LD H,BIOS.RST_CONF.AY8910 - LD DE,3*256 + CNF_PORT.CNF_1 + CNF_PORT.TURBO.ON + CNF_PORT.CNF_512 + CNF_PORT.SCORP_RESET ; !HARDCODE 3 - выделение памяти Pentagon 512 LD BC,#FE*256 + %0000'0010 - JR PREPARE_TO_START_ZX + LD DE,3*256 + CNF_PORT.CNF_1 + CNF_PORT.TURBO.ON + CNF_PORT.CNF_512 + CNF_PORT.SCORP_RESET ; !HARDCODE 3 - выделение памяти Pentagon 512 + JR PREPARE_TO_START_ZX + ; +Pentagon_48: LD L,0 ; точка входа в ПЗУ +.custom_ROM: LD H,BIOS.RST_CONF.AY8910 + LD BC,#FE*256 + %0000'0010 +.zx: LD DE,1*256 + CNF_PORT.TURBO.ON + CNF_PORT.CNF_1 ; !HARDCODE 1 - выделение памяти 48 кб + JR PREPARE_TO_START_ZX + ; +ZX_Spectrum_48: LD L,0 ; точка входа в ПЗУ +.custom_ROM: LD H,BIOS.RST_CONF.AY8910 + LD BC,#FA*256 + %1000'0011 + JR Pentagon_48.zx ; CONFIG_SET: ; PUSH DE @@ -663,10 +675,13 @@ SPRINTER_reset: ; *** MENU UTILITES *** ;***************************** ;!FIXIT это запуск c:\disk.trd - не думаю, что это нужно, можно заменить -UTILIT: +RUN_DISK_TRD: LD HL,C_DISK_C CALL CALL_DOS1 + LD A,SYS_PORT.CNF_0 + SYS_PORT.EXTENSION + OUT (SYS_PORT.ROM),A + ;CALL DOS_ON ;LD A,0 ; DETECT_HDD ;CALL EXP_HDD @@ -675,12 +690,12 @@ UTILIT: ;CALL DOS_OFF - JR C,DISK_UTILIT + JR C,.DISK_UTILIT LD HL,C_DISK_C3 CALL CALL_DOS1 -UTIL_DISK: +.UTIL_DISK: XOR A LD C,BIOS.FreeMemRMD CALL ToBIOS_FromEXT @@ -692,33 +707,44 @@ UTIL_DISK: LD C,BIOS.GET_RAMD_ST CALL ToBIOS_FromEXT - JR C,UTIL_DISK_L1 - JR Z,UTIL_DISK_L1 + JR C,.UTIL_DISK_L1 + JR Z,.UTIL_DISK_L1 LD HL,C_DISK_C1 CALL CALL_DOS1 + ; [ ] исправлен баг с запуском disk.trd с CNF != 0 + IN A,(SLOT3) + EX AF,AF' + LD A,SYS_PAGE + OUT (SLOT3),A + LD A,(SYS_PAGE.CONFIG_DE.CNF_PORT) + EX AF,AF' + OUT (SLOT3),A + EX AF,AF' + OUT (SYS_PORT.ROM),A + ; LD HL,C_DISK_C2 CALL CALL_DOS1 RET -UTIL_DISK_L1: +.UTIL_DISK_L1: LD A,(ZX_VARS.OPER_DISK) INC A CP 2 - JR Z,DISK_UTIL_RET + JR Z,.DISK_UTIL_RET LD HL,C_DISK_C5 CALL CALL_DOS1 - JR UTIL_DISK + JR .UTIL_DISK -DISK_UTIL_RET: +.DISK_UTIL_RET: LD HL,C_DISK_C6 CALL CALL_DOS1 RET -DISK_UTILIT: +.DISK_UTILIT: LD HL,C_DISK_C4 CALL CALL_DOS1 - JR UTIL_DISK + JR .UTIL_DISK C_DEMO6: DB .Size, ZX_Token.rem, ':/disk.trd', 13,80 .Size EQU $-C_DEMO6-1