From 7c9cb9d192aba799b905d96b69c944750a52dbee Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Mon, 4 Sep 2023 04:53:26 +1000 Subject: [PATCH] fixed bug with saving RAM Disk --- Shared_Includes | 2 +- mountima.asm | 140 +++++++++++++++++++++++++++--------------------- 2 files changed, 79 insertions(+), 63 deletions(-) diff --git a/Shared_Includes b/Shared_Includes index 6e27011..9a65a38 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 6e27011b6259b0256ce65d91a53ef1185223eafa +Subproject commit 9a65a386bfb6aaccc7fb476a3e159a684af65743 diff --git a/mountima.asm b/mountima.asm index fd63765..50cc86a 100644 --- a/mountima.asm +++ b/mountima.asm @@ -140,7 +140,14 @@ RMD_UNMOUNT: ;LD A,(key_buff.DRVsave) ;-------------[] ;Сохранение образа рамдиска в файл -RMD_SAVE: IN A,(SLOT3) +RMD_SAVE: XOR A ;LD A,FileAttrib.Normal + LD HL,SaveName + LD C,Dss.Create + RST ToDSS + JP C,EXIT.error.writeFile + LD (key_buff.FM),A ; сохраняем файловый манипулятор + + IN A,(SLOT3) LD (.SavePage),A LD A,(key_buff.DRVsave) @@ -151,7 +158,6 @@ RMD_SAVE: IN A,(SLOT3) LD C,BIOS.GetMemBlkPages RST ToBIOS - ;LD HL,PagesBuffer LD C,Dss.Write .loop: PUSH BC PUSH HL @@ -169,21 +175,19 @@ RMD_SAVE: IN A,(SLOT3) POP HL POP BC ;!TODO удалять файл если ошибка записи - JP C,EXIT.error.writeFile + JP C,EXIT.error.writeFile INC HL DJNZ .loop -.SavePage+*: LD A,0 - OUT (SLOT3),A - LD C,Dss.RescanDrives - RST ToDSS +.SavePage+*: LD A,0 + OUT (SLOT3),A + LD C,Dss.RescanDrives + RST ToDSS - LD A,(key_buff.FM) - LD C,Dss.Close - RST ToDSS - - RET + LD A,(key_buff.FM) + LD C,Dss.Close + JP ToDSS ;-------------[] @@ -362,11 +366,11 @@ error: LD HL,messages.writeFile JP printANDexit -.WrongKeys: LD B,DSS_Error.sys.GENERAL_FAILURE +.WrongKeys: LD B,DSS_Error.sys.COMMON_ERROR LD HL,messages.WrongKeys JP printANDexit -.UNDEFINED: LD B,DSS_Error.sys.GENERAL_FAILURE +.UNDEFINED: LD B,DSS_Error.sys.COMMON_ERROR LD HL,messages.UNDEFINED JP printANDexit @@ -386,7 +390,7 @@ error: LD HL,messages.readFile JP printANDexit -.noFreeRAMdsk: LD B,DSS_Error.sys.GENERAL_FAILURE +.noFreeRAMdsk: LD B,DSS_Error.sys.COMMON_ERROR LD HL,messages.noFreeRAMdsk JP printANDexit ; @@ -443,20 +447,20 @@ Set_keys: LD HL,(dss_line) RET NZ ; Проверка/установка ключа - LD HL,key_buff ; начало хранения ключей - LD E,L ; для проверки на ключ U - LD A,(Buffer+1) - AND %11011111 ; делаем маленький символ большим))) - CP 'U' ; проверяем параметр mount image - JR Z,.set_key - INC HL ; следующий ключ - CP 'M' ; проверяем параметр unmount image - JR Z,.set_key - INC HL ; следующий ключ - CP 'S' ; проверяем параметр save image - JR Z,.set_key - SCF ; ошибка в параметре - RET ; выход с ошибкой + LD HL,key_buff ; начало хранения ключей + LD E,L ; для проверки на ключ U + LD A,(Buffer+1) + AND %11011111 ; делаем маленький символ большим))) + CP 'U' ; проверяем параметр mount image + JR Z,.set_key + INC HL ; следующий ключ + CP 'M' ; проверяем параметр unmount image + JR Z,.set_key + INC HL ; следующий ключ + CP 'S' ; проверяем параметр save image + JR Z,.set_key + SCF ; ошибка в параметре + RET ; выход с ошибкой ;-----------------; ;-----------------; @@ -473,7 +477,7 @@ Set_keys: LD HL,(dss_line) RET C ; выход, если ошибка XOR A -.save_a+*: OR 0 +.save_a+1: OR 0 JR NZ,.file_key CALL .GetDRVnum @@ -500,27 +504,45 @@ Set_keys: LD HL,(dss_line) LD (key_buff.DRVsave),A ; сохраняем номер рамдиска для BIOS.FreeMemRMD */ -;!FIXIT -.file_key: - LD HL,Buffer - LD A,(key_buff.M) - AND A - JR Z,.noRD - CALL .OpenRDfile ; Открытие файла (или проверка наличия) по имени из буфера - RET C ; выход, если ошибка - JP .CheckChar ; погнали на следующий виток разбора ключей +.file_key: LD A,(key_buff.M) + AND A + JR Z,.noRD + LD HL,Buffer + CALL .OpenRDfile ; Открытие файла (или проверка наличия) по имени из буфера + RET C ; выход, если ошибка + JP .CheckChar ; погнали на следующий виток разбора ключей -.noRD: CALL .OpenWRfile - RET C ; выход, если ошибка - LD A,(key_buff.DRVsave) - INC A - JP NZ,.CheckChar +.noRD: LD HL,(.NextParam) ; проверка, что есть следующий параметр + LD A,H + OR L + SCF + RET Z + ; + LD HL,Buffer + LD BC,256 + XOR A + CPIR + JP PE,.yes_filename + SCF + RET + ; +.yes_filename: LD DE,Buffer + SBC HL,DE + SCF + RET Z + ; + LD B,H + LD C,L + EX DE,HL + LD DE,SaveName + LDIR - LD HL,(.NextParam) - INC HL + LD HL,(.NextParam) + INC HL LD A,(HL) CP ':' - JP NZ,.CheckChar + SCF + RET NZ CALL .GetParam CCF @@ -529,8 +551,7 @@ Set_keys: LD HL,(dss_line) CALL .GetDRVnum RET C LD (key_buff.DRVsave),A ; сохраняем номер рамдиска для save ram drive - - JP .CheckChar ; погнали на следующий виток разбора ключей + RET ;-----------------; ;-----------------; @@ -538,11 +559,13 @@ Set_keys: LD HL,(dss_line) .NextParam+1: LD HL,0 LD DE,Buffer ; буфер для операций со строками LD C,Dss.GSwitch ; тут выделяем параметр запуска - RST #10 ; получаем в буфере следующий параметр + RST ToDSS ; получаем в буфере следующий параметр LD (.NextParam),HL LD A,(Buffer) AND A RET NZ ; Нормальный возврат C = 0 + LD HL,0 ; Маркер конца разбора + LD (.NextParam),HL SCF RET ; Возврат с ошибкой C = 1 ;-----------------; @@ -559,13 +582,7 @@ Set_keys: LD HL,(dss_line) LD A,Dss.Open.R LD HL,Buffer LD C,Dss.Open - RST 10h ; открытие файла - LD (key_buff.FM),A ; сохраняем файловый манипулятор - RET -; -.OpenWRfile: XOR A ;LD A,FileAttrib.Normal - LD C,Dss.Create - RST ToDSS + RST ToDSS ; открытие файла LD (key_buff.FM),A ; сохраняем файловый манипулятор RET ;-----------------; @@ -583,7 +600,7 @@ Set_keys: LD HL,(dss_line) LD BC,0*256 + 8 LD DE,#55AA - RST #18 ; из логического в физический номер диска + RST ToDSS.DRV ; из логического в физический номер диска EX AF,AF' LD C,A AND #F0 @@ -593,8 +610,6 @@ Set_keys: LD HL,(dss_line) LD A,C AND #0F - - RET ;-----------------; ;******************************************************* @@ -604,6 +619,7 @@ Loader_length EQU $-BEGIN ;!FIXIT PagesBuffer EQU $ Buffer EQU PagesBuffer+256 +SaveName EQU Buffer+256 ;----------------------------------------------[End Code section] STACK_CHECK_MACRO stack_point, (stack_buffer+256) @@ -625,7 +641,7 @@ Test: LD (dss_line),IX ; GetParam: LD HL,(NextParameter) ; LD C,43h ; тут выделяем параметр запуска LD DE,Buffer ; буфер для операций со строками - RST #10 ; получаем в буфере следующий параметр + RST ToDSS ; получаем в буфере следующий параметр ld (NextParameter),hl ; CCF ; LD A,(Buffer) ; @@ -638,7 +654,7 @@ GetParam: LD HL,(NextParameter) ; LD HL,COMLINE ;HL указывает на командную строку .loop: LD DE,BUFFER ;DE указывает на буфер для параметров LD C,43h ;Функция выделения параметра - RST 10h ;Выполнение функции + RST ToDSS ;Выполнение функции PUSH AF PUSH HL