diff --git a/src/bios/exp/EXTENDED/IDE/ATAPI_DRV.ASM b/src/bios/exp/EXTENDED/IDE/ATAPI_DRV.ASM index 53a606c..c24c2a5 100644 --- a/src/bios/exp/EXTENDED/IDE/ATAPI_DRV.ASM +++ b/src/bios/exp/EXTENDED/IDE/ATAPI_DRV.ASM @@ -343,64 +343,8 @@ ATAPI_5x_LONG_WRITE: SCF ;write EX AF,AF' JR ATAPI_BEGIN_RW - ; - ; SAFE_PORTY_2 - ; PUSH BC - ; PUSH IX - ; PUSH HL - ; ; - ; CALL RW_ATAPI_SECTORs - ; ; - ; JP ATA_5x_LONG_READ.shared +;[]================================================================[#53] -;[]================================================================[#57] -;Function: Detect Disk -; A - Disk -;Return: CF=0 - A=Drive type -; B=MediaParameters byte ; [ ] media change -; CF=1 - drive not present, A=#02 -; ATAPI_5x_DETECT: LD C,IDE.Device.ATAPI -; AND %1011'1111 -; .shared: LD D,A -; LD E,C -; PUSH DE -; CALL DRV_DETECT -; POP DE -; RET C -; ; -; PUSH AF -; LD C,SLOT3 -; IN B,(C) -; LD A,SYS_PAGE -; OUT (C),A -; INC HL ;!HARDCODE HDD_INIT_TABLE -; INC HL -; INC HL -; LD A,(HL) -; OUT (C),B -; LD B,A -; AND %0000'0011 ;[ ] media change переделать логику тут и в ДСС? ; !FIXIT -; JR NZ,.error -; ; -; .exit: POP AF -; RET -; ; -; .error: AND %0000'0010 -; JR NZ,.UnitAttention -; ; -; LD A,D -; LD C,E -; CALL SELECT_DRIVE -; CALL ATAPI_CHECK_MEDIA_CHANGED -; JR NC,.exit -; POP BC -; RET -; ; -; .UnitAttention: POP AF -; LD A,BIOS.Error.ATAPI.UnitAttention -; SCF -; RET -;[]================================================================[#57] ;[]================================================================[#57] ;Function: Detect Disk ; A - Disk @@ -469,20 +413,6 @@ ATAPI_CHECK_MEDIA_CHANGED: ;----------------------------------------------------------------------; -;----------------------------------------------------------------------; -; ATAPI_CHECK_ERROR: -; CALL ATAPI_GET_ERROR_REG -; ;CP BIOS.Error.ATAPI.NoSence -; ;JP Z,ATAPI_MEDIA_ERROR -; CP BIOS.Error.ATAPI.NotReady -; JP Z,ATAPI_MEDIA_ERROR -; CP BIOS.Error.ATAPI.UnitAttention -; JP Z,ATAPI_MEDIA_ERROR -; ; -; SCF -; RET -;----------------------------------------------------------------------; - ;----------------------------------------------------------------------; ; HL - указатель на пакетную команду (первый или второй слот) @@ -501,15 +431,15 @@ TRAY_FN: LD HL,ATAPI_CMD_PACKET.CLOSE DEC A JR Z,EXEC_PACKET_COMMAND.start LD HL,ATAPI_CMD_PACKET.OPEN - ;JR EXEC_PACKET_COMMAND + JR EXEC_PACKET_COMMAND.start ; INPUT: HL - AP packet (12bytes) ; DE - address for/with data if needed ; A' - начальная страница для R/W Long ; ; RETURN: CF - ERROR -; ;!FIXIT номера неправильные -; !TODO CD ERRORS to INCLUDES +; !FIXIT номера неправильные +; !TODO CD ERRORS to INCLUDES ; #01 - RECOVERED ERROR ; #02 - NOT READY ; #03 - MEDIUM ERROR @@ -520,10 +450,6 @@ TRAY_FN: LD HL,ATAPI_CMD_PACKET.CLOSE ; #0B - ABORTED COMMAND ; #80 - TIME OUT EXEC_PACKET_COMMAND: -; .error_APLOOP: LD A,BIOS.Error.ATAPI.UnitAttention -; RET - ;CALL ATAPI_GET_ERROR_REG - .error_ex: EX DE,HL .error: CP #FF .error_fail: SCF @@ -685,7 +611,6 @@ EXEC_PACKET_COMMAND: ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ATAPI_IdlePasses: - ;CALL ATAPI_WAITPRT.wait_NZ LD B,_ZIP_WAITS_ DJNZ $ CALL ATAPI_CHECK_DRV @@ -757,18 +682,6 @@ ATAPI_CHECK_DRV: SCF RET ; -; .zeroWait: ;LD B,2 -; LD HL,#800 -; .loop: LD A,high IDE.Read.Status -; IN A,(low IDE.Read.Status) -; AND A -; RET NZ -; DEC HL -; LD A,H -; OR L -; JR NZ,.loop -; ;DJNZ .loop -; RET ATAPI_PREPARE_RW: LD BC,IDE.Read.ByteCountLow @@ -790,30 +703,6 @@ ATAPI_PREPARE_RW: LD BC,IDE.Read.Data SCF RET - - -; .AddrOverflow: EX DE,HL -; AND A -; SBC HL,DE -; EX DE,HL -; RET - -; -; !TODO холостое чтение -; .error_buffer: AND A -; SBC HL,DE -;.NULL: -;.RD_N_CD: IN A,(C) -; DEC B -; IN A,(C) -; DEC B -; DEC DE -; DEC DE -; LD A,D -; OR E -; JR NZ,.RD_N_CD -; ; DE = 0 -; JR .AP_LOOP ;----------------------------------------------------------------------; @@ -855,145 +744,14 @@ ATAPI_WAITPRT: LD DE,256*IDE.CtrlByte.Busy + 0 LD A,H OR L JR NZ,.LOOP - ; - ; LD A,high IDE.Read.Status - ; IN A,(low IDE.Read.Status) - ; CP #FF - ; SCF - ; RET Z - ; - ; 1 392 512 256 DJNZ .LOOP ; - ; LD A,high IDE.Read.Status - ; IN A,(low IDE.Read.Status) - ; INC A ;CP #FF - ; SCF - ; RET Z - ; LD A,BIOS.Error.Busy SCF RET - ; -; .wait_NZ: LD B,2 ; 50 - задержка определённая тестами на IOMEGA ZIP Drive -; .NZ_loop: LD A,high IDE.Read.Status -; IN A,(low IDE.Read.Status) -; LD C,A -; AND A -; CALL NZ,PutHexNumb -; ;INC A -; ;RET NZ -; ;AND IDE.CtrlByte.Busy + IDE.CtrlByte.DataRequest + IDE.CtrlByte.CheckCondition -; ;INC A -; ;AND A -; ;RET NZ -; DJNZ .NZ_loop -; RET ;----------------------------------------------------------------------; -;----------------------------------------------------------------------; -;Процедура преобразования 8битовых чисел в шестнадц. текст -;На вход: -; HL - адрес буфера -; А - байт -;На выход: -; DE - два байта шестнадцатеричного текста -; PutHexNumb: PUSH IX -; PUSH IY -; PUSH AF -; EX AF,AF' -; PUSH AF -; EX AF,AF' -; PUSH DE -; PUSH HL -; PUSH BC -; LD A,C -; EXX -; PUSH DE -; PUSH HL -; PUSH BC -; ; -; PUSH AF -; RRCA -; RRCA -; RRCA -; RRCA -; AND #0F -; ADD A,#90 -; DAA -; ADC A,#40 -; DAA -; LD E,A -; POP AF -; AND #0F -; ADD A,#90 -; DAA -; ADC A,#40 -; DAA -; LD D,A -; ; -; LD HL," " -; PUSH HL -; PUSH DE -; LD L,0 -; ADD HL,SP -; ; -; SCF -; LD B,COLORS.CGA.INK.LGRAY + COLORS.CGA.PAPER.BLACK -; EX AF,AF' -; AND A -; LD A,B -; CALL LP_PR_LINE_DIR.START -; POP HL -; POP HL -; ; -; POP BC -; POP HL -; POP DE -; EXX -; POP BC -; POP HL -; POP DE -; POP AF -; EX AF,AF' -; POP AF -; POP IY -; POP IX -; RET - ; -;----------------------------------------------------------------------; - - -;----------------------------------------------------------------------; -; D - MASK, E - PATTERN -; !!! некоторые функции надеются, что на выходе всегда ZF -; не должна трогать рег. C -; ATAPI_WAITPRT: LD DE,256*IDE.CtrlByte.Busy + 0 -; .Custom: -; .LOOP: LD A,high IDE.Read.Status -; IN A,(low IDE.Read.Status) -; CP #FF -; JR Z,.error -; ; -; AND D -; CP E -; RET Z -; JR .LOOP -; ; -; ; LD A,high IDE.Read.Status -; ; IN A,(low IDE.Read.Status) -; ; INC A ;CP #FF -; ; SCF -; ; RET Z -; ; ; -; ; LD A,BIOS.Error.Busy -; ; RET -; ; -; .error: SCF -; RET -;----------------------------------------------------------------------; - ;----------------------------------------------------------------------; ; DE - buffer ATAPI_READ_CAPACITY_DATA: @@ -1036,13 +794,6 @@ ATAPI_READ_CAPACITY_DATA: ;----------------------------------------------------------------------; -;----------------------------------------------------------------------; -; ATAPI_TEST: LD HL,ATAPI_CMD_PACKET.TEST_UNIT_READY -; LD DE,0 ; маркер того, что не нужно читать с устройства в ОЗУ -; JP EXEC_PACKET_COMMAND -;----------------------------------------------------------------------; - - ;----------------------------------------------------------------------; ATAPI_MEDIA_ERROR: PUSH IX @@ -1078,27 +829,6 @@ ATAPI_MEDIA_ERROR: LD (IY + IDE.HDD_INIT_TABLE.MediaParameters),A ; CALL GET_ATAPI_CAPACITY -; LD DE,SYS_PAGE.TMP_BUFFER -; CALL ATAPI_READ_CAPACITY_DATA -; ; -; LD HL,#FFFF -; LD C,BIOS.Error.ATAPI.MediumError -; JR C,.No_Media -; ; -; LD HL,(SYS_PAGE.TMP_BUFFER) ; media size high -; LD (IY+IDE.HDD_INIT_TABLE.MediaSizeHigh),H -; LD (IY+IDE.HDD_INIT_TABLE.MediaSizeHigh+1),L -; LD HL,(SYS_PAGE.TMP_BUFFER + 2) ; media size low -; LD (IY+IDE.HDD_INIT_TABLE.MediaSizeLow),H -; LD (IY+IDE.HDD_INIT_TABLE.MediaSizeLow+1),L -; LD HL,(SYS_PAGE.TMP_BUFFER + 6) ; sector size -; ; -; LD C,BIOS.Error.ATAPI.UnitAttention -; .No_Media: LD (IY+IDE.HDD_INIT_TABLE.SectorSize),H ;[ ] sector size -; LD (IY+IDE.HDD_INIT_TABLE.SectorSize + 1),L -; JR NC,.exit -; SET 2,(IY + IDE.HDD_INIT_TABLE.MediaParameters) - ; .exit: POP AF POP HL POP IX @@ -1184,7 +914,6 @@ ATAPI_CMD_PACKET: DB #00 ; .WRITE: DB #2E,#00 ; write and verify - ;DB #2A,#00 ; write DB #00,#00,#00,#00 ; sector dword DB #00 DB #00,#01,#00,#00 ; counter dword @@ -1198,24 +927,12 @@ ATAPI_CMD_PACKET: DB MAX_DATA_PACKET_FOR_REQUEST_SENSE DB #00,#00,#00,#00,#00,#00,#00 ; - ATAPI_PACKET: .SECTOR EQU 2 .COUNTER EQU 7 //////////////////////////////////////////////////////////////////////// -; -; E - Second * 10 -; PAUSE LD HL,#0000 -; PAUSE1 DEC L -; JR NZ,PAUSE1 -; DEC H -; JR NZ,PAUSE1 -; DEC E -; JR NZ,PAUSE1 -; RET -; -/* -Если ловится ошибка media changed, то биос должен выставлять в HDD_INIT_TABLE.MediaParameters = 3 -и затирать FF SectorSize. -Дос после получения такой ошибки должен вызывать BIOS.DRV_DETECT и если всё ОК, то ReScanDRV -*/ \ No newline at end of file + + +; Если ловится ошибка media changed, то биос должен выставлять в HDD_INIT_TABLE.MediaParameters = 3 +; и затирать FF SectorSize. +; Дос после получения такой ошибки должен вызывать BIOS.DRV_DETECT и если всё ОК, то ReScanDRV \ No newline at end of file diff --git a/src/bios/exp/FUNC_5x.asm b/src/bios/exp/FUNC_5x.asm index c43c2e5..7ce5449 100644 --- a/src/bios/exp/FUNC_5x.asm +++ b/src/bios/exp/FUNC_5x.asm @@ -33,8 +33,7 @@ DRV_LIST: OUT (SLOT3),A ; !TODO сделать структурой XOR A LD (IX+0),#04 ; DB 0 ;LEN ;!HARDCODE - ;LD (IX+1),A ; DB 0 ;FDD COUNT - LD (IX+1),#02 ; DB 0 ;FDD COUNT + LD (IX+1),#02 ; DB 0 ;FDD COUNT LD (IX+2),A ; DB 0 ;HDD COUNT LD (IX+3),A ; DB 0 ;CDROM COUNT ; ; BLOCK 13,0 ;RESERVED ;!TODO сделать RAMDRIVE тут? diff --git a/src/bios/exp/FUNC_LOW_PRINT.ASM b/src/bios/exp/FUNC_LOW_PRINT.ASM index c0c0467..4f3aa1b 100644 --- a/src/bios/exp/FUNC_LOW_PRINT.ASM +++ b/src/bios/exp/FUNC_LOW_PRINT.ASM @@ -1656,6 +1656,7 @@ LP_PR_LINE_DIR: JP LP_END_P ;;;;;;;;;;;;;;;;; ; A - атрибуты выводимого символа если CF' +; A' - если !=0 то без скролла ; CF - XY-mode ; DE - место символа в окне, если CF=1 ; HL - адрес с выводимой строкой @@ -1674,10 +1675,11 @@ LP_PR_LINE_DIR: LD C,A CALL LP_BEG_P CALL C,LP_SET_CUR ; mode for DE - POP AF ; attr-mode LD A,B ; далее рег B свободен, можно задействовать LD (SYS_PAGE.SYS_WORK2),A ; цвет консоли + POP AF ; attr-mode, scroll on/off + LD B,A ; scroll on/off EXX RL C ; C' - attr-mode. выводить атрибут .loop: LD A,D @@ -1840,6 +1842,13 @@ LP_NEXT_HL_DIR: LD A,SYS_PAGE .end_line: LD A,L SUB 4 ;!HARDCODE длина одного описателя квадратика LD L,A + ; игнорим скрролл или нет? + EXX + LD A,B + EXX + AND A + RET NZ ; ZF=0 игнор скролла + ; PUSH HL DEC L PUSH BC diff --git a/src/bios/shared/RECOVERY.IMG b/src/bios/shared/RECOVERY.IMG index 3df68d9..08b9175 100644 Binary files a/src/bios/shared/RECOVERY.IMG and b/src/bios/shared/RECOVERY.IMG differ diff --git a/src/doc/changes.txt b/src/doc/changes.txt index 6f62241..851f7c5 100644 --- a/src/doc/changes.txt +++ b/src/doc/changes.txt @@ -1,49 +1,48 @@ TODO: -- пункт в сетапе "сохранять страницы спектрума при перезагрузке" -- перед инициализацией страниц спектрума и страницы 41 проверять, не заняты ли они рамдиском -- чистить буфер клавы не втупую, а какими-нибудь командами для этих всяких SIO/PIO, если есть --+ ! в Setup добавить пункт настройки времени и даты +-? пункт в сетапе "сохранять страницы спектрума при перезагрузке" +- чистить буфер клавы не втупую, а какими-нибудь командами для этих всяких SIO/PIO, если есть + Done: + немного доработана система перехвата ресета для устранения некоторых глюков и на будущее -+ в сетап работает сохранение настроек HDD "Setup" после первого удачного автодетекта -+ Сделан универсальный загрузчик битстрима для 1k30 и 1k50 -+ Активирован второй канал IDE -+ Нумерация устройств IDE переделана с последовательной на физическую -+ Выбор загрузочного IDE изменён с последовательного на физический -+ Добавлена возможность установки IDE со второго канала в качестве основного и альтернативного загрузочного диска -+ Убрано залипание клавиш при ресете по Ctrl+Alt+Del -+ При некорректных значениях даты и времени в CMOS данные заменяются на дефолтные значения, выводится сообщение об ошибке -+ В Setup добавлен выбор режима развёртки (--------/Scorpion/Pentagon/Spectrum) -+ В Setup добавлен выбор вертикальной синхронизации (--------/312 50Гц/320 49Гц) -+ Добавлена загрузка системы с RAM Disk -+ Исправлен баг со стеком в BLK_TO_RAMD и ещё несколько багов в процедурах чтения с РАМ-ДИСКА -+ Добавлена загрузка RECOVERY с ROM-Disk в ПЗУ -+ При холодном старте устанавливается инт пентагона (а не скорпиона), если в CMOS не задано иное -+ Функция БИОС FN_SINC (#F2) при удачном завершении не сбрасывала флаг CF на выходе - исправлено -+ Новая функция GET_RAMD_NUM -+ Добавленые дополнительные опции в функцию БИОС FN_SINC (#F2), bit7 регистра A теперь отвечает за переключение старого/нового - варианта работы функции (для сохранения совместимости со старыми программами) -+ Новое лого при старте, разрешение изменено с 256х64 16 цветов на 128х72 256 цветов -+ Изменена процедура вывода логотипа, логотип перенесён в другую страницу ПЗУ -+ Смена языка, развёртки и инта происходит в Setup сразу -+ Изменены некоторые надписи и поправлена структура SETUP -+ Доделана функция FN_RESET -+ Доделана функция DCP_CONFIG - функция управления дешифратором портов -+ Убрано задвоение функций 4х -+ Функции 5х перенесены из 0 в 8 страницу ПЗУ -+ Изменена функция инициализации DCP, освободилось около 4,5 кб -+ Теперь зарезервированные под режим спектрума страницы можно легко освободить, номер блока - 1 -+ Добавлены образы ПЗУ ZX-Sprinter для запуска режима спектрума без загрузки DSS -+ Страница BIOS совместима с адаптированными образами ПЗУ спектрума. Теперь отдельные страницы оригинальных SP_EXP и SP_EXP2 - не требуются. -+ Исправлен баг в режиме спектрума. При выборе Clear RAM в меню и последующим выходом в ДОС по CAD зависало, - потому что вызывалась процедура FullInit для очистки памяти. Теперь вместе с очисткой памяти сбрасывается перехват ресета -+ Поправлены буферы, оптимизированы некоторые процедуры, освобождено ббольше 1,5 кб ОЗУ для работы BIOS во время старта -+ Найдено несколько древних мелких огрехов copy/paste, при работе было незаметно, но приятно, что нашлись -+ Поправлен маловероятный, но возможный глюк с переполнением стека при входе-выходе из SETUP -+ Постепенный рефакторинг кода))) -+ Всего и не вспомнить уже... ++ в сетап работает сохранение настроек HDD "Setup" после первого удачного автодетекта ++ Сделан универсальный загрузчик битстрима для 1k30 и 1k50 ++ Активирован второй канал IDE ++ Нумерация устройств IDE переделана с последовательной на физическую ++ Выбор загрузочного IDE изменён с последовательного на физический ++ Добавлена возможность установки IDE со второго канала в качестве основного и альтернативного загрузочного диска ++ Убрано залипание клавиш при ресете по Ctrl+Alt+Del ++ При некорректных значениях даты и времени в CMOS данные заменяются на дефолтные значения, выводится сообщение об ошибке ++ В Setup добавлен выбор режима развёртки (--------/Scorpion/Pentagon/Spectrum) ++ В Setup добавлен выбор вертикальной синхронизации (--------/312 50Гц/320 49Гц) ++ Добавлена загрузка системы с RAM Disk ++ Исправлен баг со стеком в BLK_TO_RAMD и ещё несколько багов в процедурах чтения с РАМ-ДИСКА ++ Добавлена загрузка RECOVERY с ROM-Disk в ПЗУ ++ При холодном старте устанавливается инт пентагона (а не скорпиона), если в CMOS не задано иное ++ Функция БИОС FN_SINC (#F2) при удачном завершении не сбрасывала флаг CF на выходе - исправлено ++ Новая функция GET_RAMD_NUM ++ Добавленые дополнительные опции в функцию БИОС FN_SINC (#F2), bit7 регистра A теперь отвечает за переключение старого/нового + варианта работы функции (для сохранения совместимости со старыми программами) ++ Новое лого при старте, разрешение изменено с 256х64 16 цветов на 128х72 256 цветов ++ Изменена процедура вывода логотипа, логотип перенесён в другую страницу ПЗУ ++ Смена языка, развёртки и инта происходит в Setup сразу ++ Изменены некоторые надписи и поправлена структура SETUP ++ Доделана функция FN_RESET ++ Доделана функция DCP_CONFIG - функция управления дешифратором портов ++ Убрано задвоение функций 4х ++ Функции 5х перенесены из 0 в 8 страницу ПЗУ ++ Изменена функция инициализации DCP, освободилось около 4,5 кб ++ Теперь зарезервированные под режим спектрума страницы можно легко освободить, номер блока - 1 ++ Добавлены образы ПЗУ ZX-Sprinter для запуска режима спектрума без загрузки DSS ++ Страница BIOS совместима с адаптированными образами ПЗУ спектрума. Теперь отдельные страницы оригинальных SP_EXP и SP_EXP2 + не требуются. ++ Исправлен баг в режиме спектрума. При выборе Clear RAM в меню и последующим выходом в ДОС по CAD зависало, + потому что вызывалась процедура FullInit для очистки памяти. Теперь вместе с очисткой памяти сбрасывается перехват ресета ++ Поправлены буферы, оптимизированы некоторые процедуры, освобождено ббольше 1,5 кб ОЗУ для работы BIOS во время старта ++ Найдено несколько древних мелких огрехов copy/paste, при работе было незаметно, но приятно, что нашлись ++ Поправлен маловероятный, но возможный глюк с переполнением стека при входе-выходе из SETUP ++ Постепенный рефакторинг кода))) ++ Всего и не вспомнить уже... ==================================================================================================================================================================================================================== Новое описание функции БИОС FN_SINC (#F2)