From 7bbdc8de36e38e87e6b1d63332f6ab09f6440d82 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Thu, 28 Sep 2023 05:08:25 +1000 Subject: [PATCH] new SCANDRV in DSS. in SHELL fixed bug in READBAT proc. --- DOS/DOS.ASM | 2 +- DSS/DOS5.ASM | 2 +- DSS/DOS_FM.ASM | 6 +- DSS/DOS_X.ASM | 4 +- DSS/DRV-MAIN.ASM | 231 +++----- DSS/DSS-MAIN.ASM | 7 +- DSS/DSS_MACROSES.Z80 | 24 +- DSS/Media_drivers/ide-drv.asm | 57 +- DSS/Media_drivers/ram_disk-drv.asm | 96 +++- DSS/Media_drivers/shared-drv.asm | 16 +- DSS/NScanDRV.ASM | 818 ++++++++++++++++++++++++++++- DSS/ScanDRV.ASM | 2 +- DSS/Structures.inc | 4 +- DSS/VIDEO.ASM | 15 +- DSS/build.txt | 2 +- DSS/defines.inc | 8 +- SHELL/BATCH.ASM | 6 +- SHELL/build.txt | 2 +- Shared_Includes | 2 +- 19 files changed, 1040 insertions(+), 264 deletions(-) diff --git a/DOS/DOS.ASM b/DOS/DOS.ASM index 80d8a4a..fd9bb15 100755 --- a/DOS/DOS.ASM +++ b/DOS/DOS.ASM @@ -1163,7 +1163,7 @@ A10AB: pop af ; 6 - принтер готов/выводит очередной символ (1/0) ; 7 - принтер свободен/занят (1/0) ; -; вход: A - символ +; вход: A - символ ; выход: B - символ ; CF - ошибка, A=байт состояния (биты 7..3) ;///////////////////////////////////////////////////////////////////// diff --git a/DSS/DOS5.ASM b/DSS/DOS5.ASM index b46492d..9104c75 100644 --- a/DSS/DOS5.ASM +++ b/DSS/DOS5.ASM @@ -1065,7 +1065,7 @@ DIRSIZE: WORD 0 ; раз ; Массив лог. номеров банок расширения ДОС -BANKTBL: BLOCK USING_MEMPAGES,#FF +BANKTBL: BLOCK USING_MEMPAGES+1,#FF ; +1 для COREPAGE diff --git a/DSS/DOS_FM.ASM b/DSS/DOS_FM.ASM index b34e010..3d1d678 100644 --- a/DSS/DOS_FM.ASM +++ b/DSS/DOS_FM.ASM @@ -43,7 +43,7 @@ FM_BUF: _sFM ; на выходе без ошибок IY указывает на файловый манипулятор MACRO _mFM_FIND - CP FMCOUNT+1 + CP FMCOUNT JR NC,ABS_FM PUSH DE @@ -63,7 +63,7 @@ FM_BUF: _sFM SET_FM: _mFM_FIND - LD A,0 ;!HARDCODE номер ошибки + LD A,DSS_Error.sys.NO_ERROR RET NZ ABS_FM LD A,DSS_Error.sys.INVALID_HANDLE SCF @@ -72,7 +72,7 @@ ABS_FM LD A,DSS_Error.sys.INVALID_HANDLE RES_FM: _mFM_FIND - LD A,5 + LD A,DSS_Error.sys.INVALID_HANDLE EXX SCF RET Z diff --git a/DSS/DOS_X.ASM b/DSS/DOS_X.ASM index f44cd3f..aa59cf1 100644 --- a/DSS/DOS_X.ASM +++ b/DSS/DOS_X.ASM @@ -570,8 +570,8 @@ BACK_CUR_PATH: ; вход: нет ; выход: A - номер последнего лог. диска в системе ;/////////////////////////////////////////////////////////////////////// - INCLUDE 'ScanDRV.asm' -; INCLUDE 'NScanDRV.asm' +; INCLUDE 'ScanDRV.asm' + INCLUDE 'NScanDRV.asm' ;/////////////////////////////////////////////////////////////////////// ; diff --git a/DSS/DRV-MAIN.ASM b/DSS/DRV-MAIN.ASM index 9d25bfa..db4701e 100644 --- a/DSS/DRV-MAIN.ASM +++ b/DSS/DRV-MAIN.ASM @@ -65,11 +65,13 @@ A0010: ;JP DRV_PAGE.RST_10 ; ; <[DRIVE API]> ; BLOCK #18-$,#C7 ; #C7 - "RST 0" opcode ;A0018 JP INTDISK ; -A0018: PUSH AF ; - PUSH BC ; +A0018: ;PUSH AF ; + ;PUSH BC ; + SCF + RET DRV_PAGE.MAIN_PAGE_NUMBER+2: ; LD BC,0*256 + SLOT0 ; !FIXIT сюда не должны вставляться номера выделенных страниц? - JP PORTAL.outDRV ; + ;JP PORTAL.outDRV ; ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; @@ -207,13 +209,13 @@ ADCALL+1: CALL DISPATCH ; ;!FIXIT чёт не то тут ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; - LD B,#00; ; - OUT (C),A ; -;--- ; - POP BC ; - RET ; -PORTAL.outDRV: ; - RET ; +; LD B,#00; ; +; OUT (C),A ; +;--- ; +; POP BC ; +; RET ; +;PORTAL.outDRV: ; +; RET ; ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; @@ -441,11 +443,13 @@ INITDVC_RET_DRIVE: INCLUDE 'dss/media_drivers/fdd-drv.asm' INCLUDE 'dss/media_drivers/ram_disk-drv.asm' +/////////////////////////// [ DRIVE TABLES ] \\\\\\\\\\\\\\\\\\\\\\\\\\\; ; ;------------------------[shared-drv.asm table]------------------------; -DEVICE: ;BLOCK DSS_MAX_DRIVES_AMOUNT * .TBL_Entry,#FF +DEVICE EQU $ .TBL_Entry EQU 3 -.Size: EQU DSS_MAX_DRIVES_AMOUNT * .TBL_Entry ;DB #FF +.Size EQU DSS_MAX_DRIVES_AMOUNT * .TBL_Entry +.End EQU DEVICE.Size + 1 ; для стоп-байта #FF ;----------------------------------------------------------------------; ; @@ -456,17 +460,32 @@ DEVICE: ;BLOCK DSS_MAX_DRIVES_AMOUNT * .TBL_Entry,#FF ;+05 LONG SIZE IN SECTORS ;+09 FREE ;+15 -LOGDRV EQU $ + DEVICE.Size +LOGDRV EQU DEVICE + DEVICE.End .TBL_Entry EQU 16 -.Size EQU .TBL_Entry * DSS_MAX_DRIVES_AMOUNT +.Size EQU DSS_MAX_DRIVES_AMOUNT * .TBL_Entry +; ВХОД: L - логический номер в таблице +; ВЫХОД: IY - начало записи +; ПОРТИТ: HL, IY. HL<-->DE +; MACRO LOGDRV_ENTRY_FIND tbl_addr +; LD H,0 +; ADD HL,HL +; ADD HL,HL +; ADD HL,HL +; ADD HL,HL +; ;LD B,H +; ;LD C,L +; EX DE,HL +; LD IY,tbl_addr +; ADD IY,DE +; ENDM ;----------------------------------------------------------------------; ; ; ;-----------------------[ram_disk-drv.asm table]-----------------------; ; ТАБЛИЦА СООТВЕТСТВИЯ МЕЖДУ ФИЗИЧЕСКИМ НОМЕРОМ РАМДИСКА И ЕГО RAM-DISK ID -; Log Number: DB RAM_DRIVE_ID, RAM_DRIVE_NUMBER -RAMDTBL EQU $ + DEVICE.Size + LOGDRV.Size +; Log Number: DB RAM_Drive_Log_Number, RAM_Drive_ID ;(BIOS 0-15), (Block ID for BIOS) +RAMDTBL EQU LOGDRV + LOGDRV.Size .TBL_Entry EQU 2 .Size EQU .TBL_Entry * MAX_RAMDRIVES ; RAMDTBL: DUP MAX_RAMDRIVES * RAMDTBL.TBL_Entry @@ -475,10 +494,57 @@ RAMDTBL EQU $ + DEVICE.Size + LOGDRV.Size ; .Size EQU $-RAMDTBL ;----------------------------------------------------------------------; ; +////////////////////////////////////////////////////////////////////////; +///////////////////////// [ DRIVE TABLES COPY] \\\\\\\\\\\\\\\\\\\\\\\\\; + MODULE OLD_TABLES +; +;------------------------[shared-drv.asm table]------------------------; +DEVICE EQU @RAMDTBL + @RAMDTBL.Size +.TBL_Entry EQU @DEVICE.TBL_Entry +.Size: EQU @DEVICE.Size +.End EQU @DEVICE.End +;----------------------------------------------------------------------; +; + ; -DRV_TEMP_BUFFER: +;-------------------------[ IDE-DRV.ASM table]-------------------------; +;+00 BYTE MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/... +;+01 LONG SECTOR OFFSET +;+05 LONG SIZE IN SECTORS +;+09 FREE +;+15 +LOGDRV EQU DEVICE + DEVICE.End +.TBL_Entry EQU @LOGDRV.TBL_Entry +.Size EQU @LOGDRV.Size +;----------------------------------------------------------------------; +; + +; +;-----------------------[ram_disk-drv.asm table]-----------------------; +; ТАБЛИЦА СООТВЕТСТВИЯ МЕЖДУ ФИЗИЧЕСКИМ НОМЕРОМ РАМДИСКА И ЕГО RAM-DISK ID +; Log Number: DB RAM_Drive_Log_Number, RAM_Drive_ID ;(BIOS 0-15), (Block ID for BIOS) +RAMDTBL EQU LOGDRV + LOGDRV.Size +.TBL_Entry EQU @RAMDTBL.TBL_Entry +.Size EQU @RAMDTBL.Size +; RAMDTBL: DUP MAX_RAMDRIVES * RAMDTBL.TBL_Entry +; DB #FF +; EDUP +; .Size EQU $-RAMDTBL +;----------------------------------------------------------------------; +; + ENDMODULE +////////////////////////////////////////////////////////////////////////; + DISPLAY "DEVICE start: ", /H, DEVICE + DISPLAY "Old DEVICE start: ", /H, OLD_TABLES.DEVICE + DISPLAY "LOGDRV start: ", /H, LOGDRV + DISPLAY "Old LOGDRV start: ", /H, OLD_TABLES.LOGDRV + DISPLAY "RAMDTBL start: ", /H, RAMDTBL + DISPLAY "Old RAMDTBL start: ", /H, OLD_TABLES.RAMDTBL + +; +;DRV_TEMP_BUFFER: ;---------[256 bytes stack for return pages of RST #18 callers]--------; ; #3F00 - #3FFF @@ -487,133 +553,4 @@ DRV_PAGE.RSTx18_RET_PAGES EQU #3FFF ; ASSERT ((#4000-DRV_TEMP_BUFFER-256) > (DEVICE.Size + LOGDRV.Size + RAMDTBL.Size)), "No space for DRV_TEMP_BUFFER in DRV-MAIN page" ; ENDMODULE ; OUTEND -;[END] - -/* -; -; NEW RESCAN -;=====================================================================[] -; логический номер устройства + адрес обработчика. -; Порядковый номер * 3 = буква диска + "A" -DEVICE: BLOCK DSS_MAX_DRIVES_AMOUNT*3,#FF -.Size: EQU $-DEVICE - -; Логический номер раздела. -;Номер группы = логический номер раздела HDD из DEVICE -LOGDRV: BLOCK 16*LD_DSK,0 -.Size: EQU $-LOGDRV -;+00 BYTE MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/... -;+01 LONG SECTOR OFFSET -;+05 LONG SIZE IN SECTORS (SECTORS ON LOGICAL DISK) -;+09 FREE -;+15 - -; ТАБЛИЦА СООТВЕТСТВИЯ МЕЖДУ ФИЗИЧЕСКИМ НОМЕРОМ РАМДИСКА И ЕГО RAM-DISK ID -; DB RAM_DRIVE_ID, RAM_DRIVE_NUMBER -RAMDTBL: DUP MAX_RAMDRIVES * 2 - DB #FF - EDUP -.Size EQU $-RAMDTBL - - - - -INTDISK: - ;R01 - CP #FF - JR NZ,.noNeedRescan - CP C - JR Z,INITDVC_RET_DRIVE -.noNeedRescan: - ; - PUSH HL - PUSH BC - ADD A,A - ADD A,A - LD C,A - LD B,0 - LD HL,DEVICE - ADD HL,BC - LD A,(HL) - CP #FF - JR Z,NODEV - INC HL - INC HL - LD C,(HL) - INC HL - LD H,(HL) - LD L,C - POP BC - EX (SP),HL - RET -NODEV: POP BC - POP HL - LD A,DSS_Error.drv.INVALID_DRIVE - SCF - RET - - - -INITDVC: XOR A - LD (DRV_PAGE.LDRIVE),A ; сбр. ячейку - LD HL,DEVICE - LD (PDEVICE),HL ; восст. ячейку - ; FDD девайсы - CALL FDDRIVE.INIT ; узнать число FDD-девайсов - LD DE,FDDRIVE ; адрес обработчика тек. девайса - CALL MAKEDVC ; иниц. таблицу переходов - ; HDD девайсы - ; если на старте версия BIOS не подходит, то грузиться можно только с дискеты, для этого тут замена кода на XOR A : RET -.if_old: CALL INIT_H - ;CALL .CHECK_HDD - LD DE,HDDRIVE - CALL MAKEDVC - ; RAM-диски - CALL INIT_RD - LD DE,RMDRIVE - CALL MAKEDVC - XOR A - RET -.CHECK_HDD: - - RET - - - ;R01 -INITDVC_RET_DRIVE: - LD DE,DRV_TEMP_BUFFER - LD HL,DEVICE - LD BC,DEVICE.Size - LDIR - LD HL,LOGDRV - LD BC,LOGDRV.Size - LDIR - LD HL,RAMDTBL - LD BC,RAMDTBL.Size - LDIR - - CALL INITDVC - - ; Сравниваем старый DEVICE буфер с новым, если в новом нет устройства, то затираем в старых буферах его - LD HL,DEVICE - LD DE,DRV_TEMP_BUFFER - LD B,DEVICE.Size -.loop_DEVICE: - LD A,(DE) - CP (HL) - CALL NZ,.FIND_DEV - INC HL - INC DE - DJNZ .loop_DEVICE - - LD A,(DRV_PAGE.LDRIVE) - AND A - RET - ; - - -DEVICE: BLOCK DSS_MAX_DRIVES_AMOUNT*4,#FF -;=====================================================================[] -; -; -*/ \ No newline at end of file +;[END] \ No newline at end of file diff --git a/DSS/DSS-MAIN.ASM b/DSS/DSS-MAIN.ASM index fca761f..e5fff67 100644 --- a/DSS/DSS-MAIN.ASM +++ b/DSS/DSS-MAIN.ASM @@ -540,7 +540,12 @@ DEPLOY: LD HL,BANKTBL + #C000 LD C,BIOS.GetMemBlkPages RST ToBIOS - + ; должна идти после GetMemBlkPages, чтоб вместо + ; закрывашки #FF поставить страницу COREPAGE + LD HL,BANKTBL + COREPAGE + IN A,(SLOT0) + LD (HL),A + POP AF OUT (SLOT3),A diff --git a/DSS/DSS_MACROSES.Z80 b/DSS/DSS_MACROSES.Z80 index cf1ca15..7a5b496 100644 --- a/DSS/DSS_MACROSES.Z80 +++ b/DSS/DSS_MACROSES.Z80 @@ -98,9 +98,31 @@ XLAT_T: DB #00,#43,#00,#3F,#3D,#3B,#3C,#46,#00,#44,#42,#40,#3E,#0F,#00,#00 ;00 ENDM ; +; +; ВХОД: L - логический номер в таблице +; ВЫХОД: IY - начало записи +; ПОРТИТ: HL, IY. HL<-->DE + MACRO LOGDRV_ENTRY_FIND tbl_addr + LD H,0 + ADD HL,HL + ADD HL,HL + ADD HL,HL + ADD HL,HL + ;LD B,H + ;LD C,L + EX DE,HL + LD IY,tbl_addr + ADD IY,DE + ENDM +; + ; MACRO _CALC_DEVICE_ENTRY tbl_addr - LD C,A + CP DSS_MAX_DRIVES_AMOUNT+1 + JR C,.norm + ; Error! + LD A,DSS_MAX_DRIVES_AMOUNT +.norm: LD C,A ADD A,A ADD A,C LD C,A diff --git a/DSS/Media_drivers/ide-drv.asm b/DSS/Media_drivers/ide-drv.asm index 68a298c..db56665 100644 --- a/DSS/Media_drivers/ide-drv.asm +++ b/DSS/Media_drivers/ide-drv.asm @@ -213,13 +213,6 @@ INIT_H: PUSH IY ;!TEST ;[ ] XOR A LD (DRVCLC.count),A - ; Зачистка таблицы. Необязательно, но мало ли чё будет дальше... - ; LD HL,LOGDRV - ; LD (HL),#FF - ; LD DE,LOGDRV+1 - ; LD BC,LOGDRV.Size-1 - ; LDIR - ; LD HL,LOGDRV LD (OFFSECT),HL @@ -285,29 +278,14 @@ DRVCLC: ; INC A ; .TBL_Entry EQU 16 ; .Size EQU $-LOGDRV + SELHDD: PUSH DE PUSH BC PUSH HL - ;!TEST - ; SLA A - ; RLA - ; SLA A - ; LD L,A - ; LD H,0 - ; RL H - ; ADD HL,HL - ; - ; original - LD L,A - LD H,0 - ADD HL,HL - ADD HL,HL - ADD HL,HL - ADD HL,HL ; - EX DE,HL - LD IY,LOGDRV - ADD IY,DE + LD L,A + LOGDRV_ENTRY_FIND LOGDRV + ; LD C,(IY+1) LD B,(IY+2) LD E,(IY+3) @@ -396,15 +374,8 @@ HGETPRM: ; PUSH IX PUSH IY - LD H,0 - ADD HL,HL - ADD HL,HL - ADD HL,HL - ADD HL,HL - LD B,H - LD C,L - LD IY,LOGDRV - ADD IY,BC + ; + LOGDRV_ENTRY_FIND LOGDRV ; LD A,(IY+0) ;MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/... PUSH IY @@ -449,8 +420,8 @@ STAT_H: XOR A CHEK_H: ;!TEST - ;LD A,#FF - XOR A + LD A,#FF + ;XOR A ; AND A RET @@ -460,15 +431,9 @@ CHEK_H: GBPB_H: PUSH IY PUSH DE LD L,A - LD H,0 - ADD HL,HL - ADD HL,HL - ADD HL,HL - ADD HL,HL - LD B,H - LD C,L - LD IY,LOGDRV - ADD IY,BC + ; + LOGDRV_ENTRY_FIND LOGDRV + ; LD E,(IY+1) LD D,(IY+2) LD L,(IY+3) diff --git a/DSS/Media_drivers/ram_disk-drv.asm b/DSS/Media_drivers/ram_disk-drv.asm index c907f7a..1d6948e 100644 --- a/DSS/Media_drivers/ram_disk-drv.asm +++ b/DSS/Media_drivers/ram_disk-drv.asm @@ -301,24 +301,73 @@ LWRITE_RD: ; XOR A ; RET +; +;; +;;; +;----------------------------------------------------------------------;!TEST +; ;S_P_P DB #00 +; INIT_RD: +; ; .SectorSize EQU 512 ;!HARDCODE +; ; LD HL,.SectorSize +; ; LD A,#80 +; ; .loop: SRL A +; ; RR H +; ; JR NC,.loop +; ; LD (S_P_P),A + +; LD BC,#0*256 + BIOS.GET_RAMD_ST ; Получение идентификатора блока, назначенного на RAM-Disk +; LD DE,RAMDTBL +; .initLoop: +; PUSH BC +; LD A,B +; PUSH DE +; RST ToBIOS +; POP DE +; OR A +; JR Z,.noDRV + +; LD (DE),A +; INC DE +; POP BC +; LD A,B +; LD (DE),A +; INC DE +; JP 1F +; .noDRV: POP BC +; 1: INC B +; LD A,RAMDTBL.Size / RAMDTBL.TBL_Entry +; CP B +; JR NZ,.initLoop + +; LD HL,RAMDTBL ;!FIXIT LD HL,-RAMDTBL +; EX DE,HL +; AND A ;!FIXIT ---- +; SBC HL,DE ;!FIXIT ADD HL,DE +; SRL L +; LD A,L +; ; LD HL,ENDDRVR +; AND A +; RET +;----------------------------------------------------------------------;!TEST +;;; +;; +; + +; +;; +;;; +;----------------------------------------------------------------------;!TEST ;S_P_P DB #00 INIT_RD: -; .SectorSize EQU 512 ;!HARDCODE -; LD HL,.SectorSize -; LD A,#80 +; .SectorSize EQU 512 ;!HARDCODE +; LD HL,.SectorSize +; LD A,#80 ; .loop: SRL A ; RR H ; JR NC,.loop ; LD (S_P_P),A - ; Зачистка таблицы. Необязательно, но мало ли чё будет дальше... ;[ ] - ; LD HL,RAMDTBL - ; LD (HL),#FF - ; LD DE,RAMDTBL+1 - ; LD BC,RAMDTBL.Size-1 - ; LDIR - - LD BC,#0*256 + BIOS.GET_RAMD_ST ; Получение идентификатора блока, назначенного на RAM-Disk + LD BC,0*256 + BIOS.GET_RAMD_ST ; Получение идентификатора блока, назначенного на RAM-Disk LD DE,RAMDTBL .initLoop: PUSH BC @@ -328,29 +377,38 @@ INIT_RD: POP DE OR A JR Z,.noDRV - - LD (DE),A + ; INC DE + LD (DE),A + DEC DE + ; POP BC LD A,B LD (DE),A INC DE + INC DE + ; JP 1F + ; .noDRV: POP BC 1: INC B LD A,RAMDTBL.Size / RAMDTBL.TBL_Entry CP B JR NZ,.initLoop - LD HL,RAMDTBL + LD HL,RAMDTBL ;!FIXIT LD HL,-RAMDTBL EX DE,HL - AND A - SBC HL,DE + AND A ;!FIXIT ---- + SBC HL,DE ;!FIXIT ADD HL,DE SRL L LD A,L ; LD HL,ENDDRVR AND A RET +;----------------------------------------------------------------------;!TEST +;;; +;; +; ; ; ; ; ТАБЛИЦА СООТВЕТСТВИЯ МЕЖДУ ФИЗИЧЕСКИМ НОМЕРОМ РАМДИСКА И ЕГО RAM-DISK ID @@ -466,15 +524,17 @@ IOCTL_RD: ; AND A ; RET +;!!!!! вызывается в SCANDRV, когда эта процедура в SLOT3, а не в SLOT0 GET_RAMDRV_NUM: - ADD A,A LD BC,RAMDTBL +.skip_tbl: + ADD A,A ADD A,C LD C,A LD A,0 ADC A,B LD B,A - INC BC + ;INC BC LD A,(BC) OR #60 ;!HARDCODE сделать номера разных устройств через метки RET diff --git a/DSS/Media_drivers/shared-drv.asm b/DSS/Media_drivers/shared-drv.asm index 3ec6149..3fdd291 100644 --- a/DSS/Media_drivers/shared-drv.asm +++ b/DSS/Media_drivers/shared-drv.asm @@ -133,20 +133,10 @@ INTDISK: ; PUSH HL PUSH BC - - _CALC_DEVICE_ENTRY DEVICE - ; LD C,A - ; ADD A,A - ; ADD A,C - ; LD C,A - ; LD B,0 - ; LD HL,DEVICE - ; ADD HL,BC - + _CALC_DEVICE_ENTRY DEVICE LD A,(HL) - INC A + CP #FF JR Z,NODEV - DEC A INC HL LD C,(HL) INC HL @@ -210,7 +200,7 @@ INITDVC: XOR A LD (DRV_PAGE.LDRIVE),A ; сбр. ячейку LD HL,DEVICE LD (PDEVICE),HL ; восст. ячейку - ; Зачистка таблицы. Необязательно, но мало ли чё будет дальше... ;[ ] + ; Зачистка таблиц. Необязательно, но мало ли чё будет дальше... ;[ ] LD HL,DEVICE LD (HL),#FF LD DE,DEVICE+1 diff --git a/DSS/NScanDRV.ASM b/DSS/NScanDRV.ASM index a94eb3e..68c2d84 100644 --- a/DSS/NScanDRV.ASM +++ b/DSS/NScanDRV.ASM @@ -1,3 +1,4 @@ +/* ; !TODO запоминать прерывания, отключать на старте, восстанавливать на выходе SCANDRV: ;1 [-----------] [-----------] [-----------] [-----------] [-----------] @@ -22,14 +23,10 @@ SCANDRV: ;3 [-----------] [-----------] [-----------] [-----------] [-----------] - ;!TEST в DRV-MAIN могут быть проблемы с прерываниями - ;DI - LD A,Dss.DRV.RescanDRV - LD C,Dss.DRV.RescanDRV - RST ToDSS.DRV - LD (LDRIVE),A - ;EI - ; + LD A,Dss.DRV.RescanDRV + LD C,Dss.DRV.RescanDRV + RST ToDSS.DRV + LD (LDRIVE),A ; [-----------] ;4 [-----------] [-----------] [-----------] [-----------] [-----------] @@ -158,23 +155,816 @@ SCANDRV: ; .old_letter: DB #FF ; .old_DRIVE_ID: DB #FF ; .new_letter: DB #FF +*/ + IF 1 +SCANDRV: +; 0. запоминаем состояние прерываний +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; + LD A,R + DI + PUSH AF +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; + +; 1. запоминаем бут-диск +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; + CALL GETBOOT + LD (.old_letter),A + ;; A = bootdisk Log.number + ;;!FIXIT можно доставать из сохраненной таблицы когда понадобится + ; LD DE,Dss.DRV.GenIOCTL.Enter + ; LD BC,Dss.DRV.GenIOCTL.GetParams + ; RST ToDSS.DRV + ; EX AF,AF' + ;; A = bootdisk number + ; LD (.old_DRIVE_ID),A +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; + +; 2. копируем в буфер таблицы DEVICE, LOGDRV, RAMDTBL +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; + SET_PAGE_X DRVPAGE + PUSH AF + + LD HL,DEVICE + #C000 + LD DE,OLD_TABLES.DEVICE + #C000 + LD BC,OLD_TABLES.DEVICE - DEVICE + LDIR + ; + LD A,2 ;!HARDCODE количество таблиц второго уровня (LOGDRV, RMDRIVE) + LD (Fill_if_Exists.tbl),A + ;POP AF + ;OUT (SLOT3),A +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; + +; 3. вызываем рескан +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; + LD A,Dss.DRV.RescanDRV + LD C,Dss.DRV.RescanDRV + RST ToDSS.DRV + LD (LDRIVE),A +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; + +; 4. сравниваем записи старых таблиц с новыми: +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; + ;SET_PAGE_X DRVPAGE + ;PUSH AF + + + LD HL,OLD_TABLES.DEVICE + #C000 + LD B,DSS_MAX_DRIVES_AMOUNT +.tbl_scanNew_mainLoop: + PUSH BC + PUSH HL + ; получаем номер процедуры для этой буквы диска + LD A,(HL) + ; + CP #FF + JR Z,.nextN + ; + LD B,A + INC HL + LD A,(HL) + INC HL + LD H,(HL) + LD L,A + ; ищем что за драйв + EX DE,HL + ; FDD? + LD HL,FDDRIVE + AND A + SBC HL,DE + JR Z,.nextN ; пропуск FDD драйвов + ; HDD? + LD HL,HDDRIVE + AND A + SBC HL,DE + ; HDD. Сверка по таблице LOGDRV + JP Z,SCAN_TABLES.HARD_DRV + ; RD? + LD HL,RMDRIVE + AND A + SBC HL,DE + ; RAM Drive. Сверка по таблице RAMDTBL + JP Z,SCAN_TABLES.RAM_DRV + ; CD/DVD? + ;LD HL,CDDRIVE + ;AND A + ;SUB HL,DE + ; CD/DVD. + ; JR Z,SCAN_TABLES.CD_ROM + ; + ; следующий виток +.nextN: POP HL +.nextN2: + INC HL + INC HL + INC HL + POP BC + DJNZ .tbl_scanNew_mainLoop +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; + +; 5. сравниваем запись новых таблиц со старыми +; а. если драйв только в новой: +; а1) втыкаем его в первую свободную запись в DEVICE (или ставим после последнего драйва) +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; +; ВХОД: IX - OLD_TABLES.DEVICE +; HL - OLD_TABLES.DEVICE.End +; HL' - разница между адресами старых и новых таблиц +; + INC HL + LD (OLD_TABLES_CURRENT),HL + EXX + LD HL,OLD_TABLES.LOGDRV - LOGDRV + LD B,DSS_MAX_DRIVES_AMOUNT + EXX + ; находим в старой DEVICE первую свободную ячейку (проверяем с конца в начало) + LD IX,OLD_TABLES.DEVICE + OLD_TABLES.DEVICE.Size - OLD_TABLES.DEVICE.TBL_Entry + #C000 + LD IY,LOGDRV + #C000 + LD DE,-OLD_TABLES.DEVICE.TBL_Entry ; двигаемся по таблице назад + LD B,DSS_MAX_DRIVES_AMOUNT + ; +.loop1: LD A,#FF + CP (IX+0) + JR NZ,.loop2_start + ADD IX,DE + DJNZ .loop1 +.loop1_exit: + LD A,C ; закончили считать переменную LDRIVE + LD (DRV_PAGE.LDRIVE + #C000),A + LD (LDRIVE),A +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; + +; 6. проверяем, не грохнулся ли бут-диск. +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; +.old_letter+1: + LD A,0 + _CALC_DEVICE_ENTRY OLD_TABLES.DEVICE + #C000 + LD A,(HL) + INC A + JP Z,ERROR_BOOTDRV_DIES + +; .old_DRIVE_ID+1: +; LD A,0 +; CALL SETBOOT +; JR C,.ERROR_BOOTDRV_DIES +; LD (.new_letter),A +; ; +; LD A,(.old_letter) +; LD (BOOTDRV),A +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; + +; 7. заменяем новые таблицы на модифицированные старые +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; + LD HL,OLD_TABLES.DEVICE + #C000 + LD DE,DEVICE + #C000 + LD BC,OLD_TABLES.DEVICE - DEVICE + LDIR + + POP AF + OUT (SLOT3),A +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; + +;8. выход +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; + POP AF + RET PO + EI + RET +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; + + ; +.loop2_start: + LD C,B ; начинаем считать переменную LDRIVE + ;LD (LDRIVE),A + ;LD C,A + ; + LD A,DSS_MAX_DRIVES_AMOUNT + SUB B ; сколько шагов вперёд по таблице осталось + LD B,A + ; +.loop2: LD DE,DEVICE.TBL_Entry ; теперь двигаемся по таблице вперёд + ADD IX,DE + ; тут указатель показывает на первую свободную ячейку после блока с данными драйвов + PUSH IX + PUSH BC + CALL Fill_if_Exists + POP BC + POP IX + ; NC: + ; DE = адрес процедуры обработчика таблицы + ; A = логический номер устройства в таблице обработчика + ; + ; CF - нет больше новых записей + JR C,.loop1_exit + + LD (IX+0),A + LD (IX+1),E + LD (IX+2),D + ; + ; LD A,(LDRIVE) + ; INC A + ; LD (LDRIVE),A + INC C ; добавили драйв + ; + DJNZ .loop2 + JR .loop1_exit + ; + +;;; +Fill_if_Exists: +.tbl+1: LD B,2 ; количество таблиц. пока 2 - LOGDRV и RAMDTBL ;!!!!! восстанавливать + DJNZ 1F + ; B=1, RAMDTBL + LD A,RAMDTBL.TBL_Entry + LD IY,RAMDTBL + #C000 + CALL .RUN + LD DE,RMDRIVE + RET NC + LD A,(.tbl) + DEC A ;!!!!! может быть переполнение + LD (.tbl),A + RET + ; +1: DJNZ 1F + ; B=2, LOGDRV + LD A,LOGDRV.TBL_Entry + LD IY,LOGDRV + #C000 + CALL .RUN + LD DE,HDDRIVE + RET NC + ; переходим на другую таблицу - RAMDTBL + LD A,(.tbl) + DEC A ;!!!!! может быть переполнение + LD (.tbl),A + LD HL,OLD_TABLES.RAMDTBL + #C000 + LD (OLD_TABLES_CURRENT),HL + EXX + LD B,MAX_RAMDRIVES + EXX + JR Fill_if_Exists + ; + ; +1: SCF ; unknown table number + RET +; +.RUN: EXX + ; + LD D,0 + LD E,A + PUSH DE + ; + LD A,#FE ; Так поиск закончится либо на номере драйва, либо по концу таблицы + PUSH BC + CALL Find_Record.loop1 ; ищет в новой таблице новую запись + POP BC + JR NC,1F + ; + POP DE + EXX + RET + ; +1: PUSH IY ; сохраняем текущий адрес новой таблицы + ; + ;EX DE,HL + ;ADD IY,DE + ;EX DE,HL + LD IY,(OLD_TABLES_CURRENT) + ; + LD A,#FF ; Так поиск закончится либо на пустой записи, либо по концу таблицы + LD C,D ; номер записи в таблице. D=0 + PUSH BC + CALL Find_Record.loop2 + LD A,C + POP BC + JR NC,1F + ; + POP DE + POP DE + EXX + RET + ; +1: EX (SP),IY ; переключение со старой на новую таблицу + PUSH IY + EXX + ; перекидываем запись из новой в старую + POP HL + POP DE + POP BC + LDIR + + LD (IY),#FF ; грохаем только что перекинутую запись из новой таблицы + AND A + RET +OLD_TABLES_CURRENT: WORD 0 + +; ВХОД: A - Маска для сравнения +; DE - Длина одной записи +; IY - Адрес данных в таблице +; ВЫХОД: NC: +; IY - начало подходящей записи +; C - номер новой записи в старой таблице +; CF - Не найдено, таблица закончилась +Find_Record: +.loop1: CP (IY) + RET NC + ADD IY,DE + INC C + DJNZ .loop1 + ; таблицу прошерстили + SCF + RET +.loop2: CP (IY) + RET Z + ADD IY,DE + INC C + DJNZ .loop2 + ; таблицу прошерстили + SCF + RET +;;; + +ERROR_BOOTDRV_DIES: + LD BC,256*COLORS.CGA.PAPER.BLUE + BIOS.LP_OPEN_S + LD E,0 + RST ToBIOS + + LD BC,256*COLORS.CGA.PAPER.BLUE + BIOS.LP_CLS_WIN + LD DE,0 + LD HL,#2050 + RST ToBIOS + + LD A,1 + OUT (RGMOD),A ; set scr-2 + + LD HL,.ERROR_MSG + LD DE,#A000 + LD BC,.ERROR_MSG.size + LD A,C + LDIR + + LD DE,#10*256 + (80-.ERROR_MSG.size)/2 ;X=0, Y=16 + LD C,BIOS.LP_SET_PLACE + RST ToBIOS + + LD HL,#A000 + LD DE,0*256 + COLORS.CGA.FLASH + COLORS.CGA.PAPER.BLUE + COLORS.CGA.INC.WHITE + LD B,A + LD C,BIOS.LP_PRINT_LINE3 + RST ToBIOS + +.loop: DI +; .loop: LD A,R +; AND 7 +; OUT (BorderColor),A + HALT + JR .loop + +.ERROR_MSG: DZ "Kernel panic! Boot disk lost. Press Ctrl+Alt+Del or RESET." +.ERROR_MSG.size EQU $-.ERROR_MSG + +; +; НЕ ГРОХАТЬ HL! +; а. если драйв есть в новой и старой, то затираем в новой +; таблице совпавший драйв +; б. если драйв есть только в старой, то: +; б1) грохаем файловые манипуляторы с его номером + MODULE SCAN_TABLES +; вход: B - лог.номер драйва, DE +RAM_DRV: + ; Получаем номер рамдиска в OLD_TABLES.RAMDTBL + LD A,B + LD BC,OLD_TABLES.RAMDTBL + #C000 + CALL GET_RAMDRV_NUM.skip_tbl + #C000 + LD (.cur_drv),BC + AND #0F + LD C,A ; номер рамдиска + ; Ищем в новой такой же номер рамдиска + LD B,MAX_RAMDRIVES + LD DE,RAMDTBL + #C000 +.loop: LD A,(DE) + SUB C + JR Z,.found + INC DE + INC DE + DJNZ .loop + ; ЗАПИСЬ НЕ НАЙДЕНА + ; Достаём положение в OLD_TABLES.DEVICE + POP HL + ; Достаём шаг общего цикла для получения лог.номера драйва в KILL_FM + POP BC + PUSH BC + ; Грохаем ФМ и запись в OLD_TABLES.DEVICE + CALL KILL_FM + ; грохаем в старой RAMDTBL этот драйв + EX DE,HL +.cur_drv+1: + LD HL,0 + LD (HL),#FF + DEC HL + LD (HL),#FF + EX DE,HL + JP SCANDRV.nextN2 + ; +.found: DEC A + ; затираем в новой таблице совпавший драйв (чтоб легче было парсить оставшееся) + LD (DE),A + DEC DE + LD (DE),A + JP SCANDRV.nextN + +HARD_DRV: + LD L,B + LOGDRV_ENTRY_FIND OLD_TABLES.LOGDRV + #C000 + LD IX,LOGDRV + #C000 + LD DE,LOGDRV.TBL_Entry + LD B,DSS_MAX_DRIVES_AMOUNT + ; +.loop: LD A,(IY+0) + ;CP #FF + ;JR Z,.skip + CP (IX+0) + JR NZ,.skip + ; + LD A,(IY+1) + CP (IX+1) + JR NZ,.skip + LD A,(IY+2) + CP (IX+2) + JR Z,.found + ; +.skip: ADD IX,DE + DJNZ .loop + ; ЗАПИСЬ НЕ НАЙДЕНА + ; Грохаем старую запись в OLD_TABLES.LOGDRV + LD A,#FF + LD (IY+0),A + ; Достаём положение в OLD_TABLES.DEVICE + POP HL + ; Достаём шаг общего цикла для получения лог.номера драйва в KILL_FM + POP BC + PUSH BC + ; Грохаем ФМ и запись в OLD_TABLES.DEVICE + CALL KILL_FM + ; + JP SCANDRV.nextN2 + ; +.found: ; затираем в новой таблице совпавший драйв (чтоб легче было парсить оставшееся) + LD (IX+0),#FF + JP SCANDRV.nextN + ; +; CD_ROM: +; JP SCANDRV.nextN + +; ВХОД: HL - текущая запись в таблице DEVICE +; B - шаг общего цикла +KILL_FM: + ; + LD A,DSS_MAX_DRIVES_AMOUNT + SUB B + LD C,A + ; втыкаем страницу ядра с таблицей файловых манипуляторов + PUSH BC + SET_PAGE_X COREPAGE + POP BC + PUSH AF + ; Шерстим манипуляторы на наличие в них грохнутого драйва + LD IY,FM_BUF-FM_BUF.Size + #C000 + LD B,FMCOUNT + LD DE,FM_BUF.Size +.loop_fm: + ADD IY,DE + LD A,(IY+_sFM.DRIVE) + CP C + JR NZ,.skip + XOR A + LD (IY+_sFM.NAME),A ; грохаем манипулятор +.skip: DJNZ .loop_fm + ; + POP AF + OUT (SLOT3),A + ; + ; грохаем в OLD_TABLES.DEVICE убитый драйв + LD (HL),#FF + ; + RET + ENDMODULE + + ENDIF /* +[DRIVE TABLES] .Size == DEVICE.Size + LOGDRV.Size + RAMDTBL.Size == 78 + 416 + 32 == 526 + +; логический номер устройства + адрес обработчика. +; Порядковый номер * 3 = буква диска + "A" +DEVICE EQU $ +.TBL_Entry EQU 3 +.End EQU 1 + $ + DSS_MAX_DRIVES_AMOUNT * .TBL_Entry ; для стоп-байта #FF +.Size EQU .End - $ + ;+00 BYTE MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/... ;+01 LONG SECTOR OFFSET ;+05 LONG SIZE IN SECTORS ;+09 LONG Volume Serial Number in HEX ; [ ] ;!TODO ;+13 WORD FREE ;+15 BYTE FREE +; Логический номер раздела. +;Номер группы = логический номер раздела HDD из DEVICE +LOGDRV EQU DEVICE + DEVICE.Size +.TBL_Entry EQU 16 +.Size EQU DSS_MAX_DRIVES_AMOUNT * .TBL_Entry -LOGDRV: BLOCK .TBL_Entry*LD_DSK,0 ; ld_dsk = 16 -.TBL_Entry EQU 16 -.Size EQU $-LOGDRV +; ТАБЛИЦА СООТВЕТСТВИЯ МЕЖДУ ФИЗИЧЕСКИМ НОМЕРОМ РАМДИСКА И ЕГО RAM-DISK ID +; Log Number: DB RAM_DRIVE_NUMBER, RAM_DRIVE_ID +RAMDTBL EQU $ + DEVICE.Size + LOGDRV.Size +.TBL_Entry EQU 2 +.Size EQU .TBL_Entry * MAX_RAMDRIVES -DEVICE: BLOCK DSS_MAX_DRIVES_AMOUNT * .TBL_Entry,#FF -.Size: DB #FF -.TBL_Entry EQU 3 + + + +; +; NEW RESCAN +;=====================================================================[] + +; логический номер устройства + адрес обработчика. +; Порядковый номер * 3 = буква диска + "A" +DEVICE: BLOCK DSS_MAX_DRIVES_AMOUNT*3,#FF +.Size: EQU $-DEVICE + + Логический номер раздела. +Номер группы = логический номер раздела HDD из DEVICE +LOGDRV EQU DEVICE + DEVICE.Size +.TBL_Entry EQU 16 +.Size EQU DSS_MAX_DRIVES_AMOUNT * .TBL_Entry ++00 BYTE MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/... ++01 LONG SECTOR OFFSET ++05 LONG SIZE IN SECTORS (SECTORS ON LOGICAL DISK) ++09 FREE ++15 + +; ТАБЛИЦА СООТВЕТСТВИЯ МЕЖДУ ФИЗИЧЕСКИМ НОМЕРОМ РАМДИСКА И ЕГО RAM-DISK ID +; Log Number: DB RAM_Drive_Log_Number, RAM_Drive_ID ;(BIOS 0-15), (Block ID for BIOS) +RAMDTBL: DUP MAX_RAMDRIVES * 2 + DB #FF + EDUP +.Size EQU $-RAMDTBL + + + + +INTDISK: + ;R01 + CP #FF + JR NZ,.noNeedRescan + CP C + JR Z,INITDVC_RET_DRIVE +.noNeedRescan: + ; + PUSH HL + PUSH BC + ADD A,A + ADD A,A + LD C,A + LD B,0 + LD HL,DEVICE + ADD HL,BC + LD A,(HL) + CP #FF + JR Z,NODEV + INC HL + INC HL + LD C,(HL) + INC HL + LD H,(HL) + LD L,C + POP BC + EX (SP),HL + RET +NODEV: POP BC + POP HL + LD A,DSS_Error.drv.INVALID_DRIVE + SCF + RET + + + +INITDVC: XOR A + LD (DRV_PAGE.LDRIVE),A ; сбр. ячейку + LD HL,DEVICE + LD (PDEVICE),HL ; восст. ячейку + ; FDD девайсы + CALL FDDRIVE.INIT ; узнать число FDD-девайсов + LD DE,FDDRIVE ; адрес обработчика тек. девайса + CALL MAKEDVC ; иниц. таблицу переходов + ; HDD девайсы + ; если на старте версия BIOS не подходит, то грузиться можно только с дискеты, для этого тут замена кода на XOR A : RET +.if_old: CALL INIT_H + ;CALL .CHECK_HDD + LD DE,HDDRIVE + CALL MAKEDVC + ; RAM-диски + CALL INIT_RD + LD DE,RMDRIVE + CALL MAKEDVC + XOR A + RET +.CHECK_HDD: + + RET + + + ;R01 +INITDVC_RET_DRIVE: + LD DE,DRV_TEMP_BUFFER + LD HL,DEVICE + LD BC,DEVICE.Size + LDIR + LD HL,LOGDRV + LD BC,LOGDRV.Size + LDIR + LD HL,RAMDTBL + LD BC,RAMDTBL.Size + LDIR + + CALL INITDVC + + ; Сравниваем старый DEVICE буфер с новым, если в новом нет устройства, то затираем в старых буферах его + LD HL,DEVICE + LD DE,DRV_TEMP_BUFFER + LD B,DEVICE.Size +.loop_DEVICE: + LD A,(DE) + CP (HL) + CALL NZ,.FIND_DEV + INC HL + INC DE + DJNZ .loop_DEVICE + + LD A,(DRV_PAGE.LDRIVE) + AND A + RET + ; + + +DEVICE: BLOCK DSS_MAX_DRIVES_AMOUNT*4,#FF +;=====================================================================[] +; +; +*/ + + ; LD A,(Fill_if_Exists.tbl) + ; DEC A + ; LD (Fill_if_Exists.tbl),A + + + + + +/* + ; находим в старой DEVICE первую свободную ячейку + LD HL,OLD_TABLES.DEVICE + DEVICE.Size + LD DE,-DEVICE.TBL_Entry + LD B,DSS_MAX_DRIVES_AMOUNT + LD A,#FF + ; +.loop1: ADD HL,DE + CP (HL) + JR NZ,.end_found + DJNZ .loop1 +.end_found: + ; HL = first free record in OLD_TABLES.DEVICE + LD (PDEVICE),HL + ; B = last drive + LD A,B + LD (DRV_PAGE.LDRIVE),A + ; Находим в старой LOGDRV первую свободную ячейку + ; !TODO тут оптимизнуть можно + EXX ; для .ldir_to_empty + LD HL,LOGDRV + LD B,DSS_MAX_DRIVES_AMOUNT + EXX + ; + LD HL,OLD_TABLES.LOGDRV + LD DE,LOGDRV.TBL_Entry + LD B,DSS_MAX_DRIVES_AMOUNT + LD A,#FF + ; +.loop3: CP (HL) + JR NZ,.loop3_skip + CALL .ldir_to_empty + JR Z.loop3_exit +.loop3_skip: + ADD HL,DE + DJNZ .loop3 +.loop3_exit: ; no free space in old table or no new records in new table + + + + ; Находим в новой LOGDRV первую новую запись + LD HL,LOGDRV + LD DE,LOGDRV.TBL_Entry + LD B,DSS_MAX_DRIVES_AMOUNT + ; +.loop2: LD A,(HL) + INC A + CALL NZ,. + JR NZ, ; error - no space for new record + ADD HL,DE + DJNZ .loop2 + ; + + + + + + + + EXX + LD BC,INIT_H + EXX + LD HL,LOGDRV + LD DE,LOGDRV.TBL_Entry + LD B,DSS_MAX_DRIVES_AMOUNT +.loop_logdrv: + LD A,#FF + CP (HL) + EXX + LD A,1 + CALL NZ,MAKEDVC + EXX + ADD HL,DE + DJNZ .loop_logdrv + ; + EXX + LD BC,INIT_RD + EXX + LD HL,RAMDTBL + LD DE,RAMDTBL.TBL_Entry + LD B,MAX_RAMDRIVES +.loop_logdrv: + LD A,#FF + CP (HL) + EXX + LD A,1 + CALL NZ,MAKEDVC + EXX + ADD HL,DE + DJNZ .loop_logdrv + + + + LD B,DSS_MAX_DRIVES_AMOUNT +.tbl_scanOld_mainLoop: + PUSH BC + + + + POP BC + DJNZ .tbl_scanOld_mainLoop + + + + + + +.ldir_to_empty: + ; Находим в новой LOGDRV первую новую запись + ; !TODO тут оптимизнуть можно + PUSH HL + EXX + ; + ; LD HL,LOGDRV + LD DE,LOGDRV.TBL_Entry + ; LD B,DSS_MAX_DRIVES_AMOUNT + LD A,#FF + ; +.loop3: CP (HL) + JR NZ,.run_ldir +.loop3skip: + ADD HL,DE + DJNZ .loop3 + ; no new records in table + ; ZF = 0 + ;LD A,B + ;DEC A ; Set ZF = 0 + EXX + POP HL ; сравняли стек + RET + ; +.run_ldir: + POP DE + PUSH BC + LD BC,LOGDRV.TBL_Entry + LDIR + POP BC + DJNZ .ldir_exit + ; обработали последнюю запись в таблице + LD A,B + DEC A ; Set ZF = 0 + ; +.ldir_exit: + EXX + RET */ \ No newline at end of file diff --git a/DSS/ScanDRV.ASM b/DSS/ScanDRV.ASM index d471989..177200d 100644 --- a/DSS/ScanDRV.ASM +++ b/DSS/ScanDRV.ASM @@ -75,7 +75,7 @@ SCANDRV: LD BC,DEVICE.TBL_Entry EX DE,HL LDDR - ; проверяем, не увеличилось ли значение LDRIVE + ; проверяем, не меньше ли новое значение LDRIVE старого номера бут-диска ;!TEST LD HL,.old_letter LD A,(LDRIVE) diff --git a/DSS/Structures.inc b/DSS/Structures.inc index 9e6ab74..ef955db 100644 --- a/DSS/Structures.inc +++ b/DSS/Structures.inc @@ -58,8 +58,8 @@ RESERVED2 BLOCK 490,0 ; STRUCT _sBuffers -FileManipulator _sFM ; 44 bytes * FMCOUNT -FM_RESERVE BLOCK _sFM * (FMCOUNT-1),0 +FileManipulator _sFM ; 44 bytes + 44 bytes * (FMCOUNT-1) +FM_RESERVE BLOCK _sFM * (FMCOUNT-1),0 ; BootSector _sBOOT_SEC ; 62 bytes ;!TODO перенести в область буферов EXE_Header _sEXE_HEADER ; 512 bytes Stack _sStack ; 256 bytes diff --git a/DSS/VIDEO.ASM b/DSS/VIDEO.ASM index 6bce28c..e034185 100644 --- a/DSS/VIDEO.ASM +++ b/DSS/VIDEO.ASM @@ -670,11 +670,12 @@ LPT_A EQU #1B LPT_B EQU #1C PRINT: AND A - LD B,A + LD B,A ; сохраняем символ + ; LD A,R - LD A,B DI PUSH AF + ; XOR A OUT (LPT_A),A LD A,#10 @@ -682,12 +683,12 @@ PRINT: AND A XOR A OUT (LPT_A),A IN A,(LPT_A) ; IN (1Bh): bit 5 - busy, Bit 3 - Ack - ;ld c,a ; САЙМАН + LD C,A BIT 5,A ; IN (19h): bit 5 - Paper Enable, Bit 3 - Select JR NZ,LPTBUSY - ;and %11011000 ; САЙМАН - ;jr z,LPTBUSY ; САЙМАН - LD A,B + AND %11011000 + JR Z,LPTBUSY + LD A,B ; восстанавливаем символ OUT (LPT_B),A POP AF RET PO @@ -695,7 +696,7 @@ PRINT: AND A RET LPTBUSY: POP AF - ;ld a,c ; САЙМАН + LD A,C SCF RET PO EI diff --git a/DSS/build.txt b/DSS/build.txt index 3c7d064..1c3e15e 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -312 \ No newline at end of file +371 \ No newline at end of file diff --git a/DSS/defines.inc b/DSS/defines.inc index acc2c34..a062c73 100644 --- a/DSS/defines.inc +++ b/DSS/defines.inc @@ -19,17 +19,19 @@ DSS_MAX_DRIVES_AMOUNT EQU 26 DEFINE MINIMUM_BIOS_VERSION 2*256 + 55 ; version 2.55 ; ;-------------------[MEMORY]-------------------------; - DEFINE USING_MEMPAGES 4 + DEFINE PORTAL.RSTx18_SWITCH_ADDRESS #82 DEFINE OLD_SET_BANK 0 - DEFINE PORTAL.RSTx18_SWITCH_ADDRESS #82 +;---------------------[ лог.номера страниц памяти ]--------------------- ; кэш списка каталога DIRPAGE EQU 0 FATPAGE EQU 1 TXTPAGE EQU 2 ENVPAGE EQU TXTPAGE DRVPAGE EQU 3 -; + DEFINE USING_MEMPAGES 4 ; размер блока дополнительных страниц +COREPAGE EQU 4 ; она отдельно и не с блоком выше. +;----------------------------------------------------------------------- DIRSPEC.DEPTH EQU 256 ; '\' + 1..255 ENVIRONMENT_STRING_LENGTH EQU 255 diff --git a/SHELL/BATCH.ASM b/SHELL/BATCH.ASM index 3495241..3496c7a 100644 --- a/SHELL/BATCH.ASM +++ b/SHELL/BATCH.ASM @@ -187,7 +187,11 @@ READBAT: ld c,Dss.Read ; чтение файла RST ToDSS ld a,e - ld (MOVWORD.count),a ; (число прочит. байт из файла)/128 + ; [x] 28/09/23 + JR NC,1F + XOR A + ; +1: ld (MOVWORD.count),a ; (число прочит. байт из файла)/128 ret diff --git a/SHELL/build.txt b/SHELL/build.txt index 780fea9..efee1f8 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -77 \ No newline at end of file +78 \ No newline at end of file diff --git a/Shared_Includes b/Shared_Includes index 6eacd64..639cc1e 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 6eacd6475231a504fae4ed03a12f5cd1cb166ac0 +Subproject commit 639cc1e69de900dd85e1bc4d3525dfeb91ea15ab