diff --git a/Consts.inc b/Consts.inc index ca18d20..742accd 100644 --- a/Consts.inc +++ b/Consts.inc @@ -9,7 +9,7 @@ Help_Msg: DB 13,10 DB 'x - не проверять файл конфы на валидность заголовка и размер',13,10 ;DB 'l - страшный ключ, залитая конфа останется до перезаливки или выключения ПК',13,10 DB 13,10 - DB 'Если указано только имя конфы, то: загрузка конфы -> ресет ->',13,10 + DB 'Если указано только имя конфы (с ключом "c"), то: загрузка конфы -> ресет ->',13,10 DB 'восстановление дефолтной конфы -> ресет -> выход. Пока так.',13,10,13,10 DB 'Программа была зачем-то написана Анатолием Белянским. ',13,10 DB 'Не пишите мне сюда: ',e_mail,' ))))',13,10,13,10 diff --git a/LDCONF.ASM b/LDCONF.ASM index 6c3285d..c2e4a32 100644 --- a/LDCONF.ASM +++ b/LDCONF.ASM @@ -76,7 +76,7 @@ START: LD C,Dss.GetVMod RST ToDSS POP IX - JP NC,1f + JR NC,1f LD HL,error_Vmode JP BadExit 1: @@ -104,7 +104,7 @@ START: LD (dss_line),IX ; Сохраняем указатель на строку запуска. LD A,(IX) ; тут DSS кладёт длину параметров ком.строки AND A ; проверяем на отсутствие параметров - JP NZ,1F ; запуска в ком.строке. Если их нет, + JR NZ,1F ; запуска в ком.строке. Если их нет, LD HL,Help_Msg ; то печатаем инструкцию и выходим _PrintStr ; из программы с нормальным кодом LD B,0 ; завершения. @@ -151,31 +151,12 @@ START: ;-----------------; если норм. завершение Load_conf 1: LD A,(ram_blk_id) - LD B,A - LD A,#FE + LD B,A ; RAM Block ID с битстримом для загрузки + LD A,ACEX.Config_PG.Sp2000_AcexSetUpNow ; перезаливка конфы с возвратом LD C,BIOS.RST_CONF.CUSTOM RST ToBIOS - JP ReloadRET + ;JR ReloadRET ;-----------------; - - -;-----------------; 7 бед - 1 ресет -; RESET: DI -; LD A,DCP_PAGE -; OUT (SLOT1),A ; set DCP page -; LD A,ACEX.RESET -; LD (#4400),A ; open for WR -; LD (#4600),A ; open for RD -; ; -; .LOOP: LD BC,#100 -; OUT (C),C -; LD B,0 -; OUT (C),C -; JR .LOOP ; полностью зациклить! -;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX - - - ; ; ____ _ _ ____ _____ _____ ; | _ \ ___| | ___ __ _ __| | | _ \| ____|_ _| @@ -199,9 +180,9 @@ ReloadRET: DI ;-----------------; Работа программы с новой прошивкой LD A,(e_key) AND A - JP Z,1F + JR Z,1F LD HL,EXEfileBuff ; Запуск EXE - LD BC,0040h + LD BC,Dss.Exec RST ToDSS ;-----------------; @@ -210,13 +191,13 @@ ReloadRET: DI LD A,(a_key) ; Выход без восстановления дефолтной конфы? AND A - - JP NZ,NextReloadRET - LD B,0 - LD A,#FE + JR NZ,NextReloadRET + ; + LD B,0 ; загрузка битстрима из ROM + LD A,ACEX.Config_PG.Sp2000_AcexSetUpNow ; перезаливка конфы с возвратом LD C,BIOS.RST_CONF.CUSTOM RST ToBIOS - JP NextReloadRET + ;JP NextReloadRET ;******************************************************* ; _ _ _ @@ -232,66 +213,14 @@ ReloadRET: DI ; Подготовка к завершению после ресета и ; возврата родной прошивки ;-----------------; -NextReloadRET: - DI - ; -;-----------------; Затираем следы нестоковой конфы - ; LD A,Spec_Page - ; OUT (SLOT3),A ; открыть спец-страницу - - ; LD H,#FF - ; LD L,H - ; LD SP,HL - ; PUSH HL - ; PUSH HL - ; PUSH HL - ; PUSH HL - ; PUSH HL - ; PUSH HL - ; PUSH HL - ; PUSH HL - - ; LD (0FFF3h),A ; сохраняем страницы - ; ld A,(page0_save) - ; LD (0FFF0h),A ; DOS-PAGE - ; ld A,(page1_save) - ; LD (0FFF1h),A - ; ld A,(page2_save) - - ; XOR A ; выставляем страницы, которые ставятся при ресете - ; LD (0FFF0h),A ; page 0 - ; LD A,5 - ; LD (0FFF1h),A ; page 1 - ; LD A,2 - ; LD (0FFF2h),A ; page 2 - ; LD A,40h - ; LD (0FFF3h),A ; page 3 - - ; XOR A - ; LD D,A - ; LD E,A - ; LD (#FFF4),DE ; адрес программы перезапуска - ; LD (#FFFE),DE ; флаг перезапуска - - ; LD A,'Z' - ; LD (#FFFE),A - ; LD A,'X' - ; LD (#FFFF),A ; флаг перезапуска - -;-----------------; -; - ;LD SP,(SP_Save) +NextReloadRET: DI LD A,CNF_PORT.CNF_0 ; конфигурация и отключение ПЗУ OUT (SYS_PORT.OFF),A - - ;LD A,(page0_save) ; SET PAGE DOS - ;OUT (SLOT0),A LD A,(page1_save) OUT (SLOT1),A ; Глянуть, может не надо возвращать одну из страниц??? LD A,(page3_save) OUT (SLOT3),A - ;JP NormExit ;******************************************************* @@ -302,8 +231,7 @@ NextReloadRET: ; |_____/_/\_\_|\__| |_| |_| \___/ \___| |___/ ;-----------------; -NormExit: - LD HL,WellDone +NormExit: LD HL,WellDone _PrintStr LD B,0 JR Exit @@ -318,10 +246,9 @@ BadExit: _PrintStr ;-----------------; Exit: PUSH BC LD HL,FirstHandler - LD C,12h + LD C,Dss.Close LD B,(LastHandler-FirstHandler) -.loop: ; Закрываем все открытые файлы, - LD A,(HL) ; если есть. В цикле. +.loop: LD A,(HL) ; Закрываем все открытые файлы, если есть. AND A JR Z,1F PUSH HL @@ -335,35 +262,34 @@ Exit: PUSH BC ;-----------------; освобождаем память, если клянчили LD A,(ram_blk_id) - CP 0 + AND A JR Z,1F - LD C,#C3 + ; + LD C,BIOS.FreeMem RST ToBIOS ;-----------------; ;-----------------; восстанавливаем экран - LD C,53h + LD C,Dss.Cursor RST ToDSS PUSH DE LD A,(VModPage) LD B,A LD A,(VMod) - LD C,50h + LD C,Dss.SetVMod RST ToDSS - LD C,52h + LD C,Dss.Locate POP DE RST ToDSS ;-----------------; ;-----------------; Выход в DOS -1: - POP BC - LD C,41h +1: POP BC +.loop_exit: LD C,Dss.Exit RST ToDSS - DI - HALT + JR .loop_exit ;-----------------; ;******************************************************* @@ -381,14 +307,15 @@ Set_keys: LD HL,(dss_line) INC HL LD (NextParameter),HL -.CheckChar: - CALL .GetParam - JP NC,1F +.CheckChar: CALL .GetParam + JR NC,1F + ; CCF ; Если последний параметр в строке = 0 RET ; то выходим. Разбор окончен + ; 1: LD A,(Buffer+1) ; В основном цикле CheckChar мы AND A ; ждём только один символ в - JP Z,1F ; ключе. Поэтому если их больше, + JR Z,1F ; ключе. Поэтому если их больше, SCF ; то выходим с ошибкой. RET ; Выход с ошибкой. 1: ; Проверка/установка ключа @@ -411,16 +338,11 @@ Set_keys: ;-----------------; ;-----------------; -.set_keys_l: - INC C -.set_keys_a: - INC C -.set_keys_x: - INC C -.set_keys_e: - INC C -.set_keys_c: - ; EX DE,HL ; НЕ ТЕРЯТЬ УКАЗАТЕЛЬ НА СЛЕДУЮЩИЙ ПАРАМЕТР! +.set_keys_l: INC C +.set_keys_a: INC C +.set_keys_x: INC C +.set_keys_e: INC C +.set_keys_c: ; EX DE,HL ; НЕ ТЕРЯТЬ УКАЗАТЕЛЬ НА СЛЕДУЮЩИЙ ПАРАМЕТР! LD HL,key_buff ; Вычисляем ячейку хранения ключа ADD HL,BC LD A,(HL) ; и проверяем нет ли там уже ключа. @@ -437,7 +359,7 @@ Set_keys: SUB C ; Тут ОЖИДАЕТСЯ, что А=1. Если С>1, то это ключ без параметров ; JR Z,.CheckChar ; если ключ "X" то следующий круг цикла JR C,.CheckChar ; если ключ больше ключа 'e', то следующий круг цикла - + ; PUSH BC CALL .GetParam ; получаем следующий параметр строки DOS к найденому ключу POP BC @@ -451,8 +373,8 @@ Set_keys: ; PUSH HL ; НЕ ТЕРЯТЬ УКАЗАТЕЛЬ НА СЛЕДУЮЩИЙ ПАРАМЕТР! CALL .OpenFile ; Открытие файла (или проверка наличия) по имени из буфера ; POP HL ; НЕ ТЕРЯТЬ УКАЗАТЕЛЬ НА СЛЕДУЮЩИЙ ПАРАМЕТР! - RET C ; выход, если ошибка - JP .CheckChar ; погнали на следующий виток разбора ключей + JR NC,.CheckChar ; погнали на следующий виток разбора ключей + RET ; выход, если ошибка ;-----------------; ;-----------------; @@ -462,7 +384,7 @@ Set_keys: LD DE,Buffer ; буфер для операций со строками RST #10 ; получаем в буфере следующий параметр LD (NextParameter),HL - CCF + ;CCF LD A,(Buffer) AND A RET NZ ; Нормальный возврат C = 0 @@ -474,7 +396,7 @@ Set_keys: .OpenFile: LD HL,key_save ; прописываем ключ в код для проверки на EXE LD (HL),C ; втыкаем значение ключа в код - LD BC,#0045 ; проверяем буфер на корректность имени файла + LD BC,Dss.EX_Path.GET_ALL ; проверяем буфер на корректность имени файла LD HL,Buffer ; ????? сделать проверку на корректность всего пути????? RST ToDSS RET C ; ошибка в строке @@ -483,24 +405,22 @@ Set_keys: SCF RET NZ ; ошибка файла - выход - LD A,0 - LD C,11h + LD A,Dss.Open.R + LD C,Dss.Open LD HL,Buffer RST ToDSS ; открытие файла RET C ; ошибка файла - выход - LD (.fileHandler),A ; сохраняем хендлер -.fileHandler EQU $-2 +.fileHandler+1: LD (.fileHandler),A ; сохраняем хендлер ;-----------------; ;-----------------; Проверяем обрабатываемый ключ -key_save EQU $+1 - LD A,#FF ; сюда воткнётся значение из регистра C +key_save+1: LD A,#FF ; сюда воткнётся значение из регистра C XOR 1 ; если 1, то это ключ "E" RET NZ ; если нет, то выход из процедуры. ;-----------------; ;-----------------; Проверка расширения файла - LD BC,#0445 ; С ключом "E" проверяем файл + LD BC,Dss.EX_Path.GET_TYPE ; С ключом "E" проверяем файл LD HL,Buffer ; на расширение "EXE" выделив LD DE,BufferEXE ; из строки имени расширение RST ToDSS ; файла в отдельный буфер на 4 байта @@ -511,13 +431,15 @@ key_save EQU $+1 LD HL,BufferEXE LD BC,IsEXElength-IsEXE 2: LD A,(DE) - RES 5,(HL) ; делаем маленький символ большим))) + RES 5,(HL) ; делаем маленький символ большим CPI INC DE JP PO,3F ; если последний символ проверен, то JP на проверку - JP Z,2B ; если символ совпадает, то повтор + JR Z,2B ; если символ совпадает, то повтор + ; 3: SCF ; сюда попадём когда BC=0 или символ не совпал RET NZ ; если вышли из цикла и символ не совпал - ошибка, + ; XOR A ; если всё ништяк (???- закрываем открытый EXE и???) выходим EX AF,AF' LD HL,Buffer @@ -527,17 +449,16 @@ key_save EQU $+1 EX AF,AF' CP (HL) JR Z,1F + ; EX AF,AF' JP PE,1B -1: - - LD A,0 + ; +1: XOR A LD (DE),A LD A,(ExeHandler) - LD C,12h - RST ToDSS - - RET + LD C,Dss.Close + JP ToDSS + ;RET ;******************************************************* ; _____ _ ____ __ @@ -549,33 +470,31 @@ key_save EQU $+1 ; (???добавить ключ для отмены???) ;-----------------; -TestConf: - LD A,(ConfHandler) +TestConf: LD A,(ConfHandler) AND A ; проверка на отсутствие хендлера SCF RET Z ; выход с ошибкой если файл не открыт - + ; EX AF,AF' ; сохраняем хендлер, экономим такты))) LD A,(x_key) ; если проверка (ключ X) на хедер и размер AND A ; файла отключена, то пропускаем .TestConfHeader JR NZ,1F - + ; EX AF,AF' ; восстановили хендлер, сэкономили такты))) CALL .TestConfHeader RET C -1: - CALL .TestConfSize + ; +1: CALL .TestConfSize RET ;-----------------; .TestConfHeader: LD HL,Buffer LD DE,8 - LD C,13h ; читаем в буфер первые 8 байт + LD C,Dss.Read ; читаем в буфер первые 8 байт RST ToDSS ; для сравнения с шаблоном RET C - -; ; ковыряем буфер посимвольно + ; ; ковыряем буфер посимвольно LD DE,IsNormConf ; шаблон для сравнения LD HL,Buffer LD BC,IsNormConfLen-IsNormConf @@ -583,9 +502,9 @@ TestConf: CPI INC DE JP PO,3F ; если последний символ проверен, то JP на проверку - JP Z,2B ; если символ совпадает, то повтор -3: ; сюда попадём когда BC=0 или символ не совпал. - RET Z ; если BC=0 и последний символ совпал (Z=1) + JR Z,2B ; если символ совпадает, то повтор + ; ; сюда попадём когда BC=0 или символ не совпал. ; +3: RET Z ; если BC=0 и последний символ совпал (Z=1) SCF ; если BC=0 и символ не совпал - ошибка RET @@ -599,21 +518,21 @@ TestConf: OR L ; 61152 байта, поэтому проверяем, что в HL ноль. SCF RET NZ - + ; LD A,(x_key) ; Сравниваем размер файла с эталлоным для 1K30 (59215 или #E74F) AND A ; либо (при установленном ключе X) с максимально возможным JR NZ,2F ; для текущего загрузчика в BIOS (61152 или #EEE0) -; -; Тут проверка на точное соответствие для 1K30 + ; Тут проверка на точное соответствие для 1K30 LD HL,(ConfSize) LD A,H SUB XH JR NZ,1F + ; LD A,L SUB XL + JR Z,3F 1: SCF - RET NZ - JP 3F + RET ; ; Тут проверка на непривышение 61152 байта 2: @@ -622,18 +541,16 @@ TestConf: POP BC SBC HL,BC RET C - -3: - LD B,0 ; Возвращаем указатель - CALL .set_fp ; в файле на его начало - RET + ; +3: LD B,0 ; Возвращаем указатель + ;CALL .set_fp ; в файле на его начало + ;RET ;-----------------; - -.set_fp: ; Входное значение в регистре B - LD A,(ConfHandler) ; Хэндлер файла с которым сейчас работаем +; Входное значение в регистре B +.set_fp: LD A,(ConfHandler) ; Хэндлер файла с которым сейчас работаем LD HL,0 LD IX,0 - LD C,15h + LD C,Dss.Move_FP RST ToDSS ; установка указателя в файле RET ;******************************************************* @@ -646,12 +563,11 @@ TestConf: ; Выделяем память под загрузку прошивки - 64 кб ;-----------------; -TakeMem: - LD BC,#04C2 ; Запрос на выделение 64 Кб памяти под конфу +TakeMem: LD BC,#04*256 + BIOS.GetMem ; Запрос на выделение 64 Кб памяти под конфу RST ToBIOS RET C ; завершение - нехватка памяти LD (ram_blk_id),A - LD C,#C5 ; запрос номеров выделенных страниц + LD C,BIOS.GetMemBlkPages ; запрос номеров выделенных страниц LD HL,ram_pages ; буфер для перечисления страниц RST ToBIOS RET C ; завершение - ошибка в ID блока @@ -682,8 +598,8 @@ Load_conf: LD HL,ram_pages ; CALL .loopRead ; ; Параметры: DE - сколько считать в страницу LD A,(ConfHandler) ; а куда грузить - рассчитывается (#0000 - DE) - LD HL,#C000 - LD DE,#4000 + LD HL,SLOT3.MEM_ADDR + LD DE,SLOT1.MEM_ADDR LD C,Dss.Read RST ToDSS diff --git a/Shared_Includes b/Shared_Includes index d2ba40c..57f4969 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit d2ba40c4620459681fdc5eb8d4cadcb50eb79aa8 +Subproject commit 57f4969f09a1bfc005af0b60316f03f30ee815ba