From f1ea98ff47157e06d9b1950b38c974e5ad20d518 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sun, 1 Oct 2023 02:54:22 +1000 Subject: [PATCH] some small bugs fixed. rescan moved to drv page --- DOS/DOS.ASM | 14 +- DOS/SYSTEM.DOS | Bin 16265 -> 0 bytes DSS/DOS5.ASM | 43 +- DSS/DOS_FM.ASM | 16 +- DSS/DOS_X.ASM | 181 ++++-- DSS/DRV-MAIN.ASM | 209 +------ DSS/DSS_MACROSES.Z80 | 10 +- DSS/EXECUTE.ASM | 9 +- DSS/FAT_X.ASM | 325 ++++++---- DSS/Media_drivers/NScanDRV2.ASM | 475 ++++++++++++++ DSS/Media_drivers/ram_disk-drv.asm | 1 - DSS/Media_drivers/shared-drv.asm | 162 ++--- DSS/NScanDRV.ASM | 956 +---------------------------- DSS/ScanDRV.ASM | 157 ----- DSS/VIDEO.ASM | 482 ++++++++------- DSS/build.txt | 2 +- DSS/defines.inc | 6 +- SHELL/SHELL_EXEC.ASM | 28 +- SHELL/build.txt | 2 +- Shared_Includes | 2 +- 20 files changed, 1205 insertions(+), 1875 deletions(-) delete mode 100755 DOS/SYSTEM.DOS create mode 100644 DSS/Media_drivers/NScanDRV2.ASM delete mode 100644 DSS/ScanDRV.ASM diff --git a/DOS/DOS.ASM b/DOS/DOS.ASM index fd9bb15..f9cfc19 100755 --- a/DOS/DOS.ASM +++ b/DOS/DOS.ASM @@ -619,8 +619,6 @@ Func_57:xor a and a ret - - ;///////////////////////////////////////////////////////////////////// ; Функция #58. Вывести символ на экран. ; Управляющие символы выводятся как обычные символы. @@ -711,16 +709,14 @@ Func_5A:ld a,r ; ; A = 0 - очищать строку ; выход: нет ;///////////////////////////////////////////////////////////////////// -Func_55:djnz A0EBA +Func_55: djnz A0EBA ld b,a ld c,h push bc push de push hl - db 0DDh - ld h,d - db 0DDh - ld l,e + LD XH,D + LD XL,E inc d dec h xor a @@ -981,8 +977,8 @@ mode_screen: ;------------------------------------------------- ; Открыть окно -; вход: hl=описатель окна -; e=флаги окна +; вход: hl=описатель окна +; e=флаги окна ;------------------------------------------------- open_window: push de diff --git a/DOS/SYSTEM.DOS b/DOS/SYSTEM.DOS deleted file mode 100755 index dd27b477446dedee894b42e74b2d9d84da00204c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16265 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 V#H4QRB0rJ{fV7_%mR3#h{})N31T_Ev diff --git a/DSS/DOS5.ASM b/DSS/DOS5.ASM index 9104c75..9609242 100644 --- a/DSS/DOS5.ASM +++ b/DSS/DOS5.ASM @@ -674,8 +674,8 @@ GETWORD: .next: SUB 'A' PUSH HL ;!TEST CHNDISK OPENDSK - ;CALL OPENDSK - CALL CHNDISK + CALL OPENDSK + ;CALL CHNDISK ; POP HL JP NC,GETWORD @@ -702,14 +702,10 @@ CHNDISK: LD A,B RET - /* - RET C - - PUSH AF - CALL LOADDIR - POP AF - */ - + ; RET C + ; PUSH AF + ; CALL LOADDIR + ; POP AF RET ; ;????? R10 @@ -937,13 +933,16 @@ IT_DIR: LD E,(IX+_sFM.ST_CLUSTER) ; ; вход: HL - буфер в памяти 256 байт ; выход: A - код ошибки, если CF=1 +; !FIXIT может выйти за пределы буфера? ////////////////////////////////////////////////////////////////////// CURRDIR: EX DE,HL LD HL,DIRSPEC -CURDIR1 LD A,(HL) - OR A + XOR A +.loop: ;LD A,(HL) + ;OR A + CP (HL) LDI - JR NZ,CURDIR1 + JR NZ,.loop RET @@ -1760,15 +1759,15 @@ MKD03 INC HL INC HL - IF OLD_SET_BANK - PUSH HL - ENDIF + ; IF OLD_SET_BANK + ; PUSH HL + ; ENDIF SET_PAGE_X DIRPAGE - IF OLD_SET_BANK - POP HL - ENDIF + ; IF OLD_SET_BANK + ; POP HL + ; ENDIF PUSH AF LD A,(DIR) @@ -1785,6 +1784,7 @@ MKD04 EX DE,HL LDIR POP AF OUT (SLOT3),A + EX DE,HL LD D,H LD E,L @@ -1792,6 +1792,7 @@ MKD04 EX DE,HL LD (HL),0 LD BC,512-65 LDIR ;!FIXIT нужно ли так много грохать? + POP HL CALL NSECTOR LD A,(BootSector.S_P_C) ; секторов на кластер @@ -1816,6 +1817,7 @@ MKD12 PUSH AF LD BC,511 LD (HL),0 LDIR ;!FIXIT нужно ли так много грохать? + POP IX POP HL INC IX @@ -1877,7 +1879,7 @@ RMD12 PUSH AF POP AF OUT (SLOT3),A - LD B,16 + LD B,16 ;!HARDCODE 16 * 32 = 512; 32 - размер записи, 512 - размер считанного сектора LD HL,SECBUF RMD10 LD A,(HL) OR A @@ -1896,6 +1898,7 @@ RMD10 LD A,(HL) RMD14 LD DE,#0020 ADD HL,DE DJNZ RMD10 + POP IX POP HL INC IX diff --git a/DSS/DOS_FM.ASM b/DSS/DOS_FM.ASM index 3d1d678..f0de378 100644 --- a/DSS/DOS_FM.ASM +++ b/DSS/DOS_FM.ASM @@ -43,21 +43,21 @@ FM_BUF: _sFM ; на выходе без ошибок IY указывает на файловый манипулятор MACRO _mFM_FIND - CP FMCOUNT - JR NC,ABS_FM + CP FMCOUNT + JR NC,ABS_FM PUSH DE LD IY,FM_BUF - LD DE,FM_BUF.Size - AND A - JR Z,.endLoop + LD DE,FM_BUF.Size + AND A + JR Z,.endLoop .loop: ADD IY,DE - DEC A + DEC A JR NZ,.loop .endLoop: POP DE - ; A=0 - OR (IY) ;+00 NAME + ; A=0 + OR (IY) ;+00 NAME ENDM SET_FM: diff --git a/DSS/DOS_X.ASM b/DSS/DOS_X.ASM index aa59cf1..e345f96 100644 --- a/DSS/DOS_X.ASM +++ b/DSS/DOS_X.ASM @@ -34,11 +34,19 @@ // SCF // RET +;///////////////////////////////////////////////////////////////////// +; Функция #00. Версия ДОС. +; Возвращает номер версии дисковой системы. +; вход: нет +; выход: DE = номер версии/модификации +; BC = номер билда (0..999) +;///////////////////////////////////////////////////////////////////// VERSION: + ;XOR A + ;LD H,A ;!TODO пихать сюда OSINFO + ;LD L,A + LD HL,0 LD DE,VERS*256+MODF - XOR A - LD H,A ;!TODO пихать сюда OSINFO - LD L,A LD BC,BUILD RET @@ -127,14 +135,32 @@ NDISK11: RET */ - +;///////////////////////////////////////////////////////////////////// +; Функция #02. Номер текущего диска. +; +; вход: нет +; выход: A - номер диска (0=A,1=B,..) +;///////////////////////////////////////////////////////////////////// CURRDSK: LD A,(FatBuffer.DRIVE) AND A RET -DISKINF: INC A + +;///////////////////////////////////////////////////////////////////// +; Функция #03. Информация о диске. +; Возвращает информацию об общем и свободном пространстве дискового +; устройства. +; +; вход: A - номер диска (0=A,1=B,..#FF-текущий) +; выход: A - размер кластера в секторах, если CF=0 +; HL - общее кол-во кластеров +; DE - свободных кластеров +; BC - размер сектора в байтах +; A - код ошибки, если CF=1 +;///////////////////////////////////////////////////////////////////// +DISKINF: + CP #FF JR Z,CURRDS ;R06 - DEC A ;R06 CALL CHNDISK ;R06 RET C ;R06 CURRDS: LD HL,2 @@ -161,11 +187,13 @@ FRESP2: LD D,B AND A RET +; Номер последнего диска в системе LDRIVE: DB DSS_MAX_DRIVES_AMOUNT + IF COMPILE_UNUSED_CODE TDRIVE: DB #00 TCLUST: DW #0000 TCOUNT: DW #0000 - + ENDIF ;R04SIZE2CL LD DE,(B_P_C) ;R04 XOR A ;R04 SCF @@ -187,13 +215,15 @@ TCOUNT: DW #0000 ;R04L_SEC_X DW 0 ;R04H_SEC_X DW 0 -; !FIXIT чёт не используется + ; !FIXIT чёт не используется + IF COMPILE_UNUSED_CODE TESTDSK: - ; LD A,(FatBuffer.DRIVE) - ; LD C,Dss.DRV.MediaCheck - ; RST ToDSS.DRV - ; OR A - ; RET Z + LD A,(FatBuffer.DRIVE) + LD C,Dss.DRV.MediaCheck + RST ToDSS.DRV + OR A + RET Z + ENDIF RD_BPB: LD C,SLOT3 IN B,(C) PUSH BC @@ -211,8 +241,10 @@ RD_BPB: LD C,SLOT3 POP BC OUT (C),B JP C,DOS_X_Error.Not_ready - PUSH IY - LD DE,#AA55 ;R05 + + //PUSH IY ; пока без индексного, но может пригодиться + + LD DE,#AA55 ; сигнатура ;R05 LD HL,(SECBUF+510) ;R08 ;R07 ;R05 AND A @@ -225,8 +257,10 @@ RD_BPB: LD C,SLOT3 LDIR ; - LD IY,BootSector - LD A,(IY+_sBOOT_SEC.ID_FORM) + //LD IY,BootSector ; пока без индексного, но может пригодиться + //LD A,(IY+_sBOOT_SEC.ID_FORM) + LD A,(BootSector.ID_FORM) + CP #F0 JP C,DOS_X_Error.UnknownBPB @@ -235,8 +269,10 @@ RD_BPB: LD C,SLOT3 ;LD E,(IY+_sBOOT_SEC.RESERVE) ;Reserve sec ;LD D,(IY+_sBOOT_SEC.RESERVE+1) ;ADD HL,DE - LD L,(IY+_sBOOT_SEC.RESERVE) ;Reserve sec - LD H,(IY+_sBOOT_SEC.RESERVE+1) + + //LD L,(IY+_sBOOT_SEC.RESERVE) ;Reserve sec + //LD H,(IY+_sBOOT_SEC.RESERVE+1) + LD HL,(BootSector.RESERVE) ; ; LD E,(IY+_sBOOT_SEC.HIDDEN) ;Hidden sec @@ -247,8 +283,11 @@ RD_BPB: LD C,SLOT3 LD (FatBuffer.FAT1_XX),HL ; first sector FAT #1 LD (FatBuffer.FAT2_XX),HL - LD E,(IY+_sBOOT_SEC.S_P_F) ; sectors in FAT - LD D,(IY+_sBOOT_SEC.S_P_F+1) + //LD E,(IY+_sBOOT_SEC.S_P_F) ; sectors in FAT + //LD D,(IY+_sBOOT_SEC.S_P_F+1) + LD DE,(BootSector.S_P_F) + + LD A,(BootSector.FAT_NUM) ; amount FATs CP 1 JR Z,.loop1 @@ -259,22 +298,40 @@ RD_BPB: LD C,SLOT3 .loop1: ADD HL,DE DEC A JR NZ,.loop1 - LD (FatBuffer.DIR_FRM),HL ; first sector DIR - LD C,(IY+_sBOOT_SEC.B_P_S) ; Size sectors - LD B,(IY+_sBOOT_SEC.B_P_S+1) + ; CF = ? мало ли + AND A + ; CF = 0 + + //LD C,(IY+_sBOOT_SEC.B_P_S) ; Size sectors + //LD B,(IY+_sBOOT_SEC.B_P_S+1) + LD BC,(BootSector.B_P_S) + ; RL C + ; RL B + ; RL C + ; RL B + ; RL C + ; RL B + ; LD C,B + ; LD B,0 ; BC - File handels in sectors + ; LD A,C + ;;;; + LD A,B RL C - RL B + RLA RL C - RL B + RLA RL C - RL B - LD C,B + RLA + LD C,A LD B,0 ; BC - File handels in sectors - LD A,C + ;;;; LD (FatBuffer.F_P_S),A - LD E,(IY+_sBOOT_SEC.F_P_DIR) ; Number file handel - LD D,(IY+_sBOOT_SEC.F_P_DIR+1) + + //LD E,(IY+_sBOOT_SEC.F_P_DIR) ; Number file handel + //LD D,(IY+_sBOOT_SEC.F_P_DIR+1) + LD DE,(BootSector.F_P_DIR) + EX DE,HL DEC HL XOR A @@ -299,10 +356,12 @@ RD_BPB: LD C,SLOT3 ;LD L,B ;LD C,(IY+_sBOOT_SEC.B_P_S) ; Size sector ;LD B,(IY+_sBOOT_SEC.B_P_S+1) - LD L,(IY+_sBOOT_SEC.B_P_S) ; Size sector - LD H,(IY+_sBOOT_SEC.B_P_S+1) - LD A,(BootSector.S_P_C) - + + //LD L,(IY+_sBOOT_SEC.B_P_S) ; Size sector + //LD H,(IY+_sBOOT_SEC.B_P_S+1) + LD HL,(BootSector.B_P_S) ; Size sector + + LD A,(BootSector.S_P_C) ;!TODO FATcacheSize ;NEXTAD3 ; .loop3: ADD HL,BC ; calc. cluster size ; DEC A @@ -312,7 +371,7 @@ RD_BPB: LD C,SLOT3 JR Z,.loop3.end RRA .loop3: ADD HL,HL - RRCA + RRA JP NC,.loop3 .loop3.end: ; @@ -330,7 +389,7 @@ RD_BPB: LD C,SLOT3 ENDIF //////////////////////////////////////////////////////////////////////// - LD HL,BootSector.ID_FAT + LD HL,BootSector.ID_FAT ;!!!!! а если IY используется для переменного BootSector, то будет бага LD DE,FatBuffer.MSG LD B,3 ;R_BPBL1 @@ -364,9 +423,12 @@ RD_BPB: LD C,SLOT3 IF COMPILE_UNUSED_CODE LD HL,0 - LD C,(IY+_sBOOT_SEC.S_P_T) ; Sector per track - LD B,(IY+_sBOOT_SEC.S_P_T+1) - LD A,(BootSector.HEADS) + + //LD C,(IY+_sBOOT_SEC.S_P_T) ; Sector per track + //LD B,(IY+_sBOOT_SEC.S_P_T+1) + LD BC,(BootSector.S_P_T) ; Sector per track + + LD A,(BootSector.HEADS) ;!!!!! а если IY используется для переменного BootSector, то будет бага .BPB_L1: ; calc. sector per cylinder ADD HL,BC DEC A @@ -381,15 +443,23 @@ RD_BPB: LD C,SLOT3 ; AND A ; SBC HL,DE ; EX DE,HL - LD L,(IY+_sBOOT_SEC.S_P_D) - LD H,(IY+_sBOOT_SEC.S_P_D+1) + + //LD L,(IY+_sBOOT_SEC.S_P_D) + //LD H,(IY+_sBOOT_SEC.S_P_D+1) + LD HL,(BootSector.S_P_D) + LD A,H OR L JP NZ,.HDDSMAL - LD L,(IY+_sBOOT_SEC.BPB_BIG_TOTAL_SECTORS) - LD H,(IY+_sBOOT_SEC.BPB_BIG_TOTAL_SECTORS+1) - LD C,(IY+_sBOOT_SEC.BPB_BIG_TOTAL_SECTORS+2) - LD B,(IY+_sBOOT_SEC.BPB_BIG_TOTAL_SECTORS+3) + ; + //LD L,(IY+_sBOOT_SEC.BPB_BIG_TOTAL_SECTORS) + //LD H,(IY+_sBOOT_SEC.BPB_BIG_TOTAL_SECTORS+1) + LD HL,(BootSector.BPB_BIG_TOTAL_SECTORS) + + //LD C,(IY+_sBOOT_SEC.BPB_BIG_TOTAL_SECTORS+2) + //LD B,(IY+_sBOOT_SEC.BPB_BIG_TOTAL_SECTORS+3) + LD BC,(BootSector.BPB_BIG_TOTAL_SECTORS+2) + AND A SBC HL,DE JP NC,.HDDBIG @@ -399,7 +469,7 @@ RD_BPB: LD C,SLOT3 ;AND A ;тут CF полюбас сброшен должен быть SBC HL,DE LD BC,0 -.HDDBIG: LD A,(BootSector.S_P_C) +.HDDBIG: LD A,(BootSector.S_P_C) ;!!!!! а если IY используется для переменного BootSector, то будет бага SCF .S4C01: RRA JR C,.S4C02 @@ -410,7 +480,9 @@ RD_BPB: LD C,SLOT3 JP .S4C01 .S4C02: INC HL LD (MAX_CLU),HL - POP IY + + //POP IY + ; LD DE,FAT ; LD HL,0 ; LD IX,(FAT_FRM) @@ -434,7 +506,7 @@ RD_BPB: LD C,SLOT3 RET .IBM_DOS: - LD A,(IY+_sBOOT_SEC.ID_FORM) + LD A,(BootSector.ID_FORM) CP #F0 JR C,DOS_X_Error.UnknownBPB ;????? надо ли изменить? @@ -452,15 +524,19 @@ RD_BPB: LD C,SLOT3 DOS_X_Error: .UnknownBPB: - POP IY + + //POP IY + LD A,DSS_Error.sys.UNKNOWN_FORMAT SCF RET .Not_ready: LD A,DSS_Error.sys.NOT_READY - ;SCF + ; CF = 1 RET + + ;!TODO к буферам! FatBuffer: .MSG: DB 'FAT' @@ -487,8 +563,7 @@ FatBuffer: ;!TODO к буферам! DIRSPEC: DB '\' - ;BLOCK DIRSPEC.DEPTH,0 ;????? Было 255, у Саймана 256 - BLOCK DIRSPEC.DEPTH-1,0 ;????? Было 255, у Саймана 256 + BLOCK DIRSPEC.DEPTH ; ;R11 diff --git a/DSS/DRV-MAIN.ASM b/DSS/DRV-MAIN.ASM index db4701e..5a6c42d 100644 --- a/DSS/DRV-MAIN.ASM +++ b/DSS/DRV-MAIN.ASM @@ -193,7 +193,7 @@ A0066: JP DRV_PAGE.NMI ; ; <[DRIVE PAGE SWITCH]> ; _mInfoBLOCK PORTAL.RSTx18_SWITCH_ADDRESS-$-(PORTAL.out_DRV.switch - PORTAL.out_DRV),#C7 PORTAL.out_DRV: PUSH BC ; -.RETBANK+2: LD BC,SLOT0 + 0*256; +.RETBANK+2: LD BC,SLOT0 + 0*256; ;!!!!! ReScnDRV использует это значение .switch: OUT (C),B ; ASSERT $!=84,'-> Portal error!'; ;Entry point from DSS main page @@ -219,213 +219,6 @@ ADCALL+1: CALL DISPATCH ; ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; -; - -/* -; !!! ВЫЗЫВАТЬ ТОЛЬКО ЧЕРЕЗ RST #10 в DSS-MAIN !!! -RESCAN_DRV: - AND A - LD A,R - PUSH AF - DI - ;; - IN A,(SLOT3) - LD (.restore_page),A - LD A,(PORTAL.out_DRV.RETBANK) - OUT (SLOT3),A - LD A,(BOOTDRV+#C000) ; узнали лог.номер boot диска - LD (.BOOT),A ; сохранили -.restore_page+1: - LD A,0 - OUT (SLOT3),A - - LD A,(.BOOT) - CP 2 - JR C,.Change ; bootdisk - дискета? - - LD C,A - ADD A - ADD C - LD HL,DEVICE - LD C,A - XOR A - LD B,A - ADC HL,BC - LD DE,.DEVICE - LD BC,3 ;!HARDCODE длина записи в DEVICE - LDIR ; сохранили запись boot-dsk - ;!TODO тут пока работает вариант замены буквы для boot-RAM-DRV и HDD - LD DE,.DEVICE+1 - LD HL,HDDRIVE - AND A - SBC HL,DE - JR Z,.HDD_SYS - ; - LD HL,RMDRIVE - AND A - SBC HL,DE - JR NZ,.Change - ; -.RMD_SYS: - LD A,#60 - LD (.BOOT_TYPE),A - LD A,(.DEVICE) - LD HL,RAMDTBL - SLA A - ADD A,L - LD L,A - LD A,0 - ADC A,H - LD H,A - ;Тут в HL адрес первого байта записи о boot RAM-DRV - LD DE,.RAMDTBL - LD BC,RAMDTBL.TBL_Entry - LDIR ; сохранили запись о RAM-DRV - JP .Change - ; -.HDD_SYS: - LD A,#80 - LD (.BOOT_TYPE),A - ; - LD A,(.DEVICE) - ADD A,A - ADD A,A - ADD A,A - ADD A,A - LD HL,LOGDRV - ADD A,L - LD L,A - LD A,0 - ADC A,H - LD H,A - ; Тут в HL адрес первого байта записи о boot разделе - LD DE,.LOGDRV - LD BC,LOGDRV.TBL_Entry - LDIR ; сохранили запись о HDD разделе - - ;JP .Change -.Change: CALL INITDVC_RET_DRIVE - LD A,(.BOOT) - CP 2 - JR C,.exit ; bootdisk - дискета? - - ; 3. Проверить, сменилась ли буква boot-drv и выйти, если нет. - ; 4. Если boot HDD и его букву занял HDD, то меняем местами их - ; записи в таблицах DEVICE и LOGDRV. - ; Если boot HDD и его букву занял RAM Drive, то иди нахер, не может быть)). - ; Если boot FDD то нихера не случится. - ; Если boot CD-ROM, то подумаем, когда до этого доживём. - ; Если boot RAM Drive и его букву занял HDD, то нужно сменить - ; их местами в таблице DEVICE. - ; !!!!! что будет, если буква бут-диска Е, а после рескана - ; загрузочный раздел оказался единственным в системе? - ; А если сразу будут изменения с RAM дисками и HDD разделами? - - LD A,(.BOOT_TYPE) - CP #60 ;!HARDCODE ram drive - JR NZ,.restore_HDD -.restore_RMD: - LD A,(.RAMDTBL+1) - LD HL,RAMDTBL+1 - LD B,RAMDTBL.Size / RAMDTBL.TBL_Entry - -.loop_RMD: - CP (HL) - JR Z,.found_RMD ; ZF - нашли в новой RAMDTBL bootdisk по его физическому номеру - INC HL - INC HL - DJNZ .loop_RMD - JP .BIG_ERROR ; bootdisk died... - -.found_RMD: - LD A,RAMDTBL.Size / RAMDTBL.TBL_Entry - SUB B - LD (.DEVICE),A ; new bootdisk log.number in RAMDTBL - DEC HL - LD A,(HL) ; логический номер для поиска в DEVICE - LD (.DEVICE_NEW),A ; сохраняем - - ; поиск номера записи по её логическому диску + процедуре обработчика - LD HL,DEVICE-DEVICE.TBL_Entry - LD DE,DEVICE.TBL_Entry - LD BC,DEVICE.Size / DEVICE.TBL_Entry -.found_RMD.nxt: - AND A - ADC HL,DE - PUSH HL - EXX - POP HL - LD DE,.DEVICE - LD B,DEVICE.TBL_Entry - CALL COMPARE_BYTES - EXX - JR Z, found entry - DJNZ NZ,.found_RMD.nxt -.BIG_ERROR: - ;;;; - - - LD BC,DEVICE.Size / DEVICE.TBL_Entry - AND A - - ; длина записи. сравниваем на полное совпадение .DEVICE с - ; одной из записей DEVICE - LD B,DEVICE.TBL_Entry -.rmd_loop_search: - LD A,(DE) - CP (HL) - JR NZ,.nxt_loop_ - INC DE - INC HL - DJNZ .rmd_loop_search - - POP BC - - - ;JP P,.BIG_ERROR ; если прошерстили за пределы таблицы - - ; - JP .exit - ; -.restore_HDD: - - ;JP .exit - ;; -.exit: LD HL,.Start_buffer - LD (HL),#FF - LD DE,.Start_buffer+1 - LD BC,.Size_buffer-1 - LDIR ; помыть за собою)) - - POP AF - LD A,(DRV_PAGE.LDRIVE) - RET PO - EI - RET -.Start_buffer: -.BOOT: DB #FF ; логический номер -.BOOT_TYPE: DB #FF ; 00, #60, #80, #C0 -.DEVICE: BLOCK 3,#FF -.DEVICE_NEW: BLOCK 3,#FF -.LOGDRV: BLOCK 16,#FF -.RAMDTBL: BLOCK 2,#FF ; лог RMD, физ RMD -.Size_buffer EQU $-.Start_buffer - -;ВХОД: HL,DE - адреса сравниваемых блоков, B - длина блока -;ВЫХОД: ZF - блоки одинаковы, в HL и DE адреса следующего байта после совпавшего блока -; NZ - блоки неодинаковы. -COMPARE_BYTES: - LD A,(DE) - CP (HL) - RET NZ - INC HL - INC DE - DJNZ COMPARE_BYTES - XOR A - RET - -*/ - DRV_PAGE.LDRIVE: DB #00 diff --git a/DSS/DSS_MACROSES.Z80 b/DSS/DSS_MACROSES.Z80 index 7a5b496..0d476d4 100644 --- a/DSS/DSS_MACROSES.Z80 +++ b/DSS/DSS_MACROSES.Z80 @@ -134,17 +134,17 @@ XLAT_T: DB #00,#43,#00,#3F,#3D,#3B,#3C,#46,#00,#44,#42,#40,#3E,#0F,#00,#00 ;00 ; MACRO SET_PAGE_X new_page - IF OLD_SET_BANK - LD A,new_page - CALL BANK + ; IF OLD_SET_BANK + ; LD A,new_page + ; CALL BANK - ELSE + ; ELSE LD A,(BANKTBL+new_page) LD B,A LD C,SLOT3 IN A,(SLOT3) OUT (C),B - ENDIF + ; ENDIF ENDM ; diff --git a/DSS/EXECUTE.ASM b/DSS/EXECUTE.ASM index 9147251..5dd5b66 100644 --- a/DSS/EXECUTE.ASM +++ b/DSS/EXECUTE.ASM @@ -829,7 +829,7 @@ EXEC1: CALL EXEC_1 ; при выходе с ошибкой, в регистре А - код ошибки EXEC_1: LD (CMDLINE),HL - LD A,#01 ; %7600000R = !FAT_ATTR + LD A,#01 ; %7600000R = !FAT_ATTR ;!HARDCODE LD (ACCESS),A CALL GETWORD RET C @@ -838,7 +838,7 @@ EXEC_1: LD (CMDLINE),HL CALL MASK RET C CALL TST_EXT - LD A,3 + LD A,DSS_Error.sys.FILE_NOT_FOUND RET C CALL INCTASK ;R08 CALL OPENEXE @@ -872,6 +872,9 @@ COPYEXN: LD A,(HL) JR NZ,COPYEXN CALL FINDPATH + ;[x] 1/10/2023 + RET C + ; LD HL,(CMDLINE) JR EXEC1 @@ -959,7 +962,7 @@ NOINK: LD A,H LD (EXSTACK),SP LD SP,HL EXX -;...... ;!FIXIT.НЕ.СОХРАНЯЕТ.DE.перед.вызовом.BIOS..............................; + ; НЕ СОХРАНЯЕТСЯ DE перед вызовом BIOS, а биос пока его и не портит LD A,(EXE_MEM) LD DE,RAMMAP LD BC,0*256 + BIOS.GetMemPage diff --git a/DSS/FAT_X.ASM b/DSS/FAT_X.ASM index b3191e0..31ed55d 100644 --- a/DSS/FAT_X.ASM +++ b/DSS/FAT_X.ASM @@ -9,17 +9,18 @@ ;R01 10-02-1999 DNS UPGRADE FAT CASH ;--------------------------------------------------------------- +; Установить начальный кластер для чтения R_CLUST LD HL,#0001 LD (G_CLUST.num),HL RET G_CLUST: .num+1: LD HL,#0001 -G_CLUS1: INC HL - CALL R_F_FAT +G_CLUS1: INC HL ; номер кластера + CALL R_F_FAT ; прочитать из кеша FAT-а номер след. кластера CP DSS_Error.sys.DISK_FULL SCF - RET Z + RET Z ; ошибка ? LD A,D OR E JR NZ,G_CLUS1 @@ -34,25 +35,30 @@ INC_FAT PUSH HL RET C PUSH HL PUSH HL + EX DE,HL ; hl=номер кластера +INC_FA2 CALL R_F_FAT ; прочитать из кеша FAT-а номер след. кластера EX DE,HL -INC_FA2 CALL R_F_FAT + JR NC,INC_FA2 ; не конец цепочки EX DE,HL - JR NC,INC_FA2 - EX DE,HL - POP DE - CALL W_T_FAT + POP DE ; номер кластера + CALL W_T_FAT ; записать в кеш FAT-а номер кластера POP HL - LD DE,(FatBuffer.ENDCLUS) - CALL W_T_FAT - CALL WR_FAT + LD DE,(FatBuffer.ENDCLUS) ; номер кластера + CALL W_T_FAT ; записать в кеш FAT-а номер кластера + CALL WR_FAT ; подкл. банку кеша FAT и записать его на диск AND A RET ;R01 -; IN: HL - CLUSTER -; OUT: DE - (CLUSTER) +;----------------------------------------------------------- +; Прочитать из кеша FAT-а номер след. кластера +; вход: hl = номер кластера +; выход: hl = номер кластера +; de = номер след. кластера +; CF - конец цепочки ;!FIXIT далее заточка на то, что в DE всегда 0 - раздел не больше 2Gb +;----------------------------------------------------------- R_F_FAT: EX DE,HL LD HL,(MAX_CLU) @@ -62,49 +68,42 @@ R_F_FAT: LD A,DSS_Error.sys.DISK_FULL RET C - EXX ;!TODO optimize - SET_PAGE_X FATPAGE - EXX ;!TODO optimize - + SET_PAGE_X FATPAGE + PUSH HL PUSH AF LD A,(FatBuffer.FAT_TYP) - CP "2" + CP "2" ; fat12 JR Z,R_F_F12 + ; fat16, просто читать след. номер R_F_F16: LD A,H - LD B,A + LD B,H AND #0F LD H,A LD A,B - ; swap bit7..4 and bit3..0. + ; bit7..4 --> bit3..0. RRCA RRCA RRCA RRCA + AND #0F ; A=A/16 ; A - BLOCK FAT (1 BLOCK = 8192 BYTES) ; - AND #0F ; A=A/16 ; A - BLOCK FAT (1 BLOCK = 8192 BYTES) ADD HL,HL ; HL - FAT OFFSET (FROM CASH) - ;!TEST - LD BC,(FATCASH) ; C - BLOCK FAT IN CASH - CP C - //LD C,A - //LD A,(FATCASH.Block) - //CP C - ; + LD BC,(FATCASH) ; C - BLOCK FAT IN CASH + CP C CALL NZ,RE_FAT ; A != C - READ NEW BLOCK FAT - LD DE,FAT - ADD HL,DE - LD E,(HL) + LD DE,FAT_CACHE ; начало кеша FAT-а + ADD HL,DE ; на ячейку FAT + LD E,(HL) ; прочитать номер кластера INC HL LD D,(HL) POP AF OUT (SLOT3),A - LD HL,#FFEF ;!HARDCODE - XOR A ;DssErr.sys.NO_ERROR - SBC HL,DE + LD HL,#FFEF ;!HARDCODE + XOR A ; DssErr.sys.NO_ERROR + SBC HL,DE ; проверка на служ. кластеры POP HL - ;LD A,DssErr.sys.NO_ERROR RET ;R01; HL - CLUSTER @@ -165,28 +164,39 @@ R_F_F16: ;R01 ADD HL,DE ;R01 DEC A +; R_F_F12 LD D,H +; LD E,L +; ADD HL,HL +; ADD HL,DE +; RR H ; сдвиг вправо через CF +; RR L ; CLUSTER * 1.5 +; PUSH AF ; сохр. флаг R_F_F12 LD D,H LD E,L - ADD HL,HL - ADD HL,DE RR H - RR L ;CLUSTER * 1.5 - PUSH AF - LD A,H - LD B,A - AND #1F - LD H,A - LD A,B - RLCA - RLCA - RLCA - AND #07 - LD BC,(FATCASH) ; C - BLOCK FAT IN CASH - CP C - CALL NZ,RE_FAT - LD DE,FAT - ADD HL,DE - POP AF + RR L ; сдвиг вправо через CF + PUSH AF ; сохр. флаг + ADD HL,DE ; CLUSTER * 1.5 + ; + ;!FIXIT херня какая-то + IF COMPILE_UNUSED_CODE + LD A,H + LD B,H + AND #1F + LD H,A + LD A,B + RLCA + RLCA + RLCA + AND #07 + LD BC,(FATCASH) ; C - BLOCK FAT IN CASH + CP C + CALL NZ,RE_FAT ; прочитать в кеш 16 секторов FAT-а + ENDIF + ; + LD DE,FAT_CACHE ; начало кеша FAT-а + ADD HL,DE ; на ячейку FAT + POP AF ; восст. флаг LD E,(HL) INC HL LD D,(HL) @@ -196,27 +206,45 @@ R_F_F12 LD D,H LD D,A JP R_F_F02 +; R_F_F01 LD A,E +; AND #F0 +; LD E,A +; RR D ; вправо на 4 битa +; RR E +; RR D +; RR E +; RR D +; RR E +; RR D +; RR E R_F_F01 LD A,E AND #F0 + RR D ; вправо на 4 битa + RRA + RR D + RRA + RR D + RRA + RR D + RRA LD E,A - RR D - RR E - RR D - RR E - RR D - RR E - RR D - RR E R_F_F02 POP AF OUT (SLOT3),A LD HL,#0FEF - XOR A ; обнуляем CF и устанавливаем код ошибки = нулю - SBC HL,DE + XOR A ; обнуляем CF и устанавливаем код ошибки = нулю + SBC HL,DE ; проверка на служ. кластеры POP HL RET -; HL - CLUSTER -; DE - (CLUSTER) +;----------------------------------------------------------- +; Записать в кеш FAT-а номер кластера +; вход: de = номер кластера +; hl = ? номер первого кластера +; выход: hl = ? номер след. кластера +; de = номер кластера +; in: HL - CLUSTER +; out: DE - (CLUSTER) +;----------------------------------------------------------- W_T_FAT PUSH DE EX DE,HL LD HL,(MAX_CLU) @@ -224,11 +252,11 @@ W_T_FAT PUSH DE SBC HL,DE EX DE,HL POP DE - LD A,10 ;!HARDCODE error number + LD A,DSS_Error.sys.DISK_FULL RET C EXX - SET_PAGE_X FATPAGE + SET_PAGE_X FATPAGE EXX PUSH HL @@ -236,12 +264,12 @@ W_T_FAT PUSH DE LD A,1 LD (FATCASH.Update),A LD A,(FatBuffer.FAT_TYP) - CP "2" + CP "2" ; fat12 JR Z,W_T_F12 W_T_F16: PUSH DE LD A,H - LD B,A + LD B,H AND #0F LD H,A LD A,B @@ -254,43 +282,53 @@ W_T_F16: LD BC,(FATCASH) ; C - BLOCK FAT IN CASH CP C CALL NZ,RE_FAT ; A != C - READ NEW BLOCK FAT - LD DE,FAT - ADD HL,DE - POP DE - LD (HL),E - INC HL + LD DE,FAT_CACHE + ADD HL,DE ; на ячейку FAT + POP DE + LD (HL),E ; сохр. в кеше FAT-а + INC HL ; номер кластера LD (HL),D - POP AF + POP AF ; восст. порт POP HL OUT (SLOT3),A XOR A RET - + ; + ; fat12 W_T_F12 PUSH DE LD D,H LD E,L - ADD HL,HL - ADD HL,DE + ; ADD HL,HL + ; ADD HL,DE + ; RR H + ; RR L ;CLUSTER * 1.5 + ; PUSH AF RR H - RR L ;CLUSTER * 1.5 - PUSH AF - LD A,H - LD B,A - AND #1F - LD H,A - LD A,B - RLCA - RLCA - RLCA - AND #07 - LD BC,(FATCASH) ; C - BLOCK FAT IN CASH - CP C - CALL NZ,RE_FAT - LD DE,FAT + RR L ; сдвиг вправо через CF + PUSH AF ; сохр. флаг + ADD HL,DE ; CLUSTER * 1.5 + ; + ;!FIXIT херня какая-то + IF COMPILE_UNUSED_CODE + LD A,H + LD B,H + AND #1F + LD H,A + LD A,B + RLCA + RLCA + RLCA + AND #07 + LD BC,(FATCASH) ; C - BLOCK FAT IN CASH + CP C + CALL NZ,RE_FAT ; прочитать в кеш 16 секторов FAT-а + ENDIF + ; + LD DE,FAT_CACHE ADD HL,DE POP AF POP DE - JP C,W_T_F01 + JP C,W_T_F01 ; номер нечётный LD (HL),E INC HL LD A,(HL) @@ -303,19 +341,32 @@ W_T_F12 PUSH DE AND A RET -W_T_F01 SLA E - RL D - RL E - RL D - RL E - RL D - RL E - RL D +; W_T_F01 SLA E +; RL D +; RL E +; RL D +; RL E +; RL D +; RL E +; RL D + ; +W_T_F01:; влево на 4 битa + SLA E + LD A,E + RL D + RLA + RL D + RLA + RL D + RLA + RL D + LD E,A + ; LD A,(HL) AND #0F OR E - LD (HL),A - INC HL + LD (HL),A ; сохр. в кеше FAT-а + INC HL ; номер кластера LD (HL),D POP AF POP HL @@ -324,6 +375,7 @@ W_T_F01 SLA E RET ;R01 +; Прочитать в кеш 16 секторов FAT-а ; A - NEW FAT BLOCK RE_FAT: PUSH HL PUSH AF @@ -334,55 +386,55 @@ RE_FAT: PUSH HL LD L,A LD H,0 LD (FATCASH),HL - ADD HL,HL - ADD HL,HL - ADD HL,HL - ADD HL,HL ;FAT BLOCK * 16 = SECTOR OF FAT + ;FAT BLOCK * 16 = SECTOR OF FAT + ADD HL,HL + ADD HL,HL + ADD HL,HL + ADD HL,HL ;!TODO FATcacheSize + ; LD DE,(FatBuffer.FAT_FRM) ADD HL,DE EX DE,HL LD IX,0 - ADD IX,DE - LD HL,0 ;HL:IX - SECTOR FAT FOR READING - LD DE,FAT ; DE - FAT ADDRESS - LD A,(FatBuffer.DRIVE) + ADD IX,DE ; номер лог. сектора + LD HL,0 ; ст. разряд ; HL:IX - SECTOR FAT FOR READING + LD DE,FAT_CACHE ; куда ; DE - FAT ADDRESS + LD A,(FatBuffer.DRIVE) ; номер диска LD BC,16*256 + Dss.DRV.Read ;рег B: 16 * 512 = 8192 (CASH SIZE) ;!TODO FATcacheSize RST ToDSS.DRV POP HL RET -WR_FAT: EXX - SET_PAGE_X FATPAGE - - EXX +; Подключить банку кеша FAT и записать его на диск +WR_FAT: SET_PAGE_X FATPAGE PUSH AF CALL .Start POP AF OUT (SLOT3),A RET - ; + ; Запись кеша (всего?) FAT-а на диск .Start: LD HL,(FATCASH) LD H,0 LD (FATCASH),HL ADD HL,HL ADD HL,HL ADD HL,HL - ADD HL,HL ;FAT BLOCK * 16 = SECTOR OF FAT + ADD HL,HL ;FAT BLOCK * 16 = SECTOR OF FAT ;!TODO FATcacheSize PUSH HL LD B,H - LD C,L ;BC - BLOCK OF FAT - LD DE,16 - ADD HL,DE ;+ SIZE CASH (16 SECTORS) + LD C,L ;BC - BLOCK OF FAT + LD DE,16 ;!HARDCODE ;!TODO FATcacheSize + ADD HL,DE ;+ SIZE CASH (16 SECTORS) - LD DE,(BootSector.S_P_F) - LD A,16 + LD DE,(BootSector.S_P_F) ; секторов на FAT + LD A,16 ;!HARDCODE ; MAX число секторов для чтения в кэш ;!TODO FATcacheSize AND A SBC HL,DE JR C,.WALLFAT EX DE,HL - LD HL,16 -; AND A ;тут точно CF не взведён + LD HL,16 ;!HARDCODE ; число секторов ;!TODO FATcacheSize + ; CF = 0 SBC HL,DE JP C,FATERR LD A,L @@ -393,22 +445,23 @@ WR_FAT: EXX ADD HL,DE EX DE,HL LD IX,0 - ADD IX,DE - LD HL,0 ;HL:IX - SECTOR OF FAT FOR SAVE - LD DE,FAT - LD B,A - LD C,Dss.DRV.Write - LD A,(FatBuffer.DRIVE) + ;HL:IX - SECTOR OF FAT FOR SAVE + ADD IX,DE ; номер лог. сектора + LD HL,0 ; ст. разряд + LD DE,FAT_CACHE ; откуда + LD B,A ; число секторов + LD C,Dss.DRV.Write ; запись секторов + LD A,(FatBuffer.DRIVE) ; номер диска PUSH BC RST ToDSS.DRV - POP BC + POP BC ; b=число секторов POP HL LD DE,(FatBuffer.FAT2_XX) ADD HL,DE EX DE,HL LD IX,0 ADD IX,DE - LD DE,FAT + LD DE,FAT_CACHE LD HL,0 LD A,(FatBuffer.DRIVE) LD C,Dss.DRV.Write @@ -469,13 +522,13 @@ WR_FAT: EXX ;R01 RET FATERR: POP HL -; SCF + ; CF = 1 RET FATCASH: WORD #0000 .Block EQU FATCASH .Update EQU FATCASH+1 -MAX_CLU: WORD #0FF0 +MAX_CLU: WORD #0FF0 ; макс. число кластеров FAT12 (без служ.) ;//MODULE: FAT_X ;[END] diff --git a/DSS/Media_drivers/NScanDRV2.ASM b/DSS/Media_drivers/NScanDRV2.ASM new file mode 100644 index 0000000..2498532 --- /dev/null +++ b/DSS/Media_drivers/NScanDRV2.ASM @@ -0,0 +1,475 @@ +;!TODO код дико костыльный и будет переделан вместе с процедурой INITDVC +ReScanDRV: +.NUMBER_OF_SUBTABLES EQU 2 ;количество таблиц второго уровня (LOGDRV, RMDRIVE) +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; +; 0. запоминаем бут-диск +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; + LD A,B + LD (.old_letter),A +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; +; 1. копируем в буфер таблицы DEVICE, LOGDRV, RAMDTBL +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; + LD HL,DEVICE + LD DE,OLD_TABLES.DEVICE + LD BC,OLD_TABLES.DEVICE - DEVICE + LDIR + ; + LD A,.NUMBER_OF_SUBTABLES + LD (Fill_if_Exists.tbl),A +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; +; 2. вызываем инициализацию драйвов +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; + CALL INITDVC_RET_DRIVE + LD (DRV_PAGE.LDRIVE),A +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; +; 3. сравниваем записи старых таблиц с новыми: +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; + LD HL,OLD_TABLES.DEVICE + 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 +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; +; 4. сравниваем запись новых таблиц со старыми +; а. если драйв только в новой: +; а1) втыкаем его в первую свободную запись в DEVICE (или ставим после последнего драйва) +; +; ВХОД: IX - OLD_TABLES.DEVICE +; HL - OLD_TABLES.DEVICE.End +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; + 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 + LD IY,LOGDRV + 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),A +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; + +; 5. проверяем, не грохнулся ли бут-диск. +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; +.old_letter+1: + LD A,0 + _CALC_DEVICE_ENTRY OLD_TABLES.DEVICE + LD A,(HL) + INC A + JP Z,ERROR_BOOTDRV_DIES +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; + +; 6. заменяем новые таблицы на модифицированные старые +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; + LD HL,OLD_TABLES.DEVICE + LD DE,DEVICE + LD BC,OLD_TABLES.DEVICE - DEVICE + LDIR + ; +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; + +;7. выход +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; + LD A,(DRV_PAGE.LDRIVE) + RET +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; + +;-----------------------[] +.loop2_start: + LD C,B ; начинаем считать переменную LDRIVE + 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 + ; + INC C ; добавили драйв + ; + DJNZ .loop2 + JR .loop1_exit +;-----------------------[] + +;-----------------------[] +Fill_if_Exists: +.tbl+1: LD B,ReScanDRV.NUMBER_OF_SUBTABLES + DJNZ 1F + ; B=1, RAMDTBL + LD A,RAMDTBL.TBL_Entry + LD IY,RAMDTBL + 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 + CALL .RUN + LD DE,HDDRIVE + RET NC + ; переходим на другую таблицу - RAMDTBL + LD A,(.tbl) + DEC A ;!!!!! может быть переполнение + LD (.tbl),A + LD HL,OLD_TABLES.RAMDTBL + 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 ; сохраняем текущий адрес новой таблицы + ; + 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 + 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 + CALL GET_RAMDRV_NUM.skip_tbl + LD (.cur_drv),BC + AND #0F + LD C,A ; номер рамдиска + ; Ищем в новой такой же номер рамдиска + LD B,MAX_RAMDRIVES + LD DE,RAMDTBL +.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 ReScanDRV.nextN2 + ; +.found: DEC A + ; затираем в новой таблице совпавший драйв (чтоб легче было парсить оставшееся) + LD (DE),A + DEC DE + LD (DE),A + JP ReScanDRV.nextN +;-----[] +HARD_DRV: + LD L,B + LOGDRV_ENTRY_FIND OLD_TABLES.LOGDRV + LD IX,LOGDRV + 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 ReScanDRV.nextN2 + ; +.found: ; затираем в новой таблице совпавший драйв (чтоб легче было парсить оставшееся) + LD (IX+0),#FF + JP ReScanDRV.nextN + ; +; CD_ROM: +; JP ReScanDRV.nextN +;-----[] +; ВХОД: HL - текущая запись в таблице DEVICE +; B - шаг общего цикла +KILL_FM: + ; + LD A,DSS_MAX_DRIVES_AMOUNT + SUB B + LD C,A + ; втыкаем страницу ядра с таблицей файловых манипуляторов + PUSH BC + LD A,(PORTAL.out_DRV.RETBANK) + LD B,A + LD C,SLOT3 + IN A,(SLOT3) + OUT (C),B + 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 +;-----------------------[] + +/* +[DRIVE TABLES] .Size == DEVICE.Size + LOGDRV.Size + RAMDTBL.Size == 78+1 + 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 + +; ТАБЛИЦА СООТВЕТСТВИЯ МЕЖДУ ФИЗИЧЕСКИМ НОМЕРОМ РАМДИСКА И ЕГО 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 +*/ \ No newline at end of file diff --git a/DSS/Media_drivers/ram_disk-drv.asm b/DSS/Media_drivers/ram_disk-drv.asm index 1d6948e..4596085 100644 --- a/DSS/Media_drivers/ram_disk-drv.asm +++ b/DSS/Media_drivers/ram_disk-drv.asm @@ -524,7 +524,6 @@ IOCTL_RD: ; AND A ; RET -;!!!!! вызывается в SCANDRV, когда эта процедура в SLOT3, а не в SLOT0 GET_RAMDRV_NUM: LD BC,RAMDTBL .skip_tbl: diff --git a/DSS/Media_drivers/shared-drv.asm b/DSS/Media_drivers/shared-drv.asm index 3fdd291..0c2abf9 100644 --- a/DSS/Media_drivers/shared-drv.asm +++ b/DSS/Media_drivers/shared-drv.asm @@ -116,82 +116,6 @@ ; EX (SP),HL ; RET -;!FIXIT попеределывать тут вызовы через точки входа типа RST или вызовы типа LD C,0 : CALL HDDRIVE на прямые - - -;------------------------------------------------- -; RST 18h. Вектор дисковых устройств -; вход: a=номер устройства (0-25) -;------------------------------------------------- -INTDISK: - ;R01 - CP #FF - JR NZ,.noNeedRescan - CP C - JR Z,INITDVC_RET_DRIVE -.noNeedRescan: - ; - PUSH HL - PUSH BC - _CALC_DEVICE_ENTRY DEVICE - LD A,(HL) - CP #FF - JR Z,NODEV - 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 - -PDEVICE DW DEVICE -; DEVICE: BLOCK DSS_MAX_DRIVES_AMOUNT * .TBL_Entry,#FF -; .Size: DB #FF -; .TBL_Entry EQU 3 - -FLOPPY EQU #0001 -FIXED EQU #0002 -CDROM EQU #0004 -NETWORK EQU #0008 - -;DISKS: DB 27 ;LENGTH DISK INFO -; DW FLOPPY ;DISK TYPE -; DB 2,"A:" ;DISK NAME -; DB 11,"NO NAME " -; DB 8,"FAT12 " -; DB #00 ;PHISICAL DRIVE NUMBER -; -; DB 27 ;LENGTH DISK INFO -; DW FLOPPY ;DISK TYPE -; DB 2,"B:" ;DISK NAME -; DB 11,"NO NAME " -; DB 8,"FAT12 " -; DB #01 ;PHISICAL DRIVE NUMBER -; -; DB 27 ;LENGTH DISK INFO -; DW FIXED ;DISK TYPE -; DB 2,"C:" ;DISK NAME -; DB 11,"NO NAME " -; DB 8,"FAT16 " -; DB #80 ;PHISICAL DRIVE NUMBER -; -; DB #00 ;END OF TABLE -;----------------------------------------------------------------------- - - ;R01 -; INITDVC_RET_DRIVE: -; CALL INITDVC -; LD A,(DRV_PAGE.LDRIVE) -; AND A -; RET - ; ;----------------------------------------------------------- ; Просканировать систему на FDD/HDD девайсы и RAM-диски @@ -256,6 +180,92 @@ MAKEDVC: LD C,A LD (HL),A RET + +;!FIXIT попеределывать тут вызовы через точки входа типа RST или вызовы типа LD C,0 : CALL HDDRIVE на прямые +;------------------------------------------------- +; RST 18h. Вектор дисковых устройств +; вход: a=номер устройства (0-25) +;------------------------------------------------- +INTDISK: + ;R01 + CP #FF + JR NZ,.noNeedRescan + CP C + ;JR Z,INITDVC_RET_DRIVE + JR Z,ReScanDRV +.noNeedRescan: + ; + PUSH HL + PUSH BC + _CALC_DEVICE_ENTRY DEVICE + LD A,(HL) + CP #FF + JR Z,NODEV + 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 + +PDEVICE DW DEVICE +; DEVICE: BLOCK DSS_MAX_DRIVES_AMOUNT * .TBL_Entry,#FF +; .Size: DB #FF +; .TBL_Entry EQU 3 + +FLOPPY EQU #0001 +FIXED EQU #0002 +CDROM EQU #0004 +NETWORK EQU #0008 + +;DISKS: DB 27 ;LENGTH DISK INFO +; DW FLOPPY ;DISK TYPE +; DB 2,"A:" ;DISK NAME +; DB 11,"NO NAME " +; DB 8,"FAT12 " +; DB #00 ;PHISICAL DRIVE NUMBER +; +; DB 27 ;LENGTH DISK INFO +; DW FLOPPY ;DISK TYPE +; DB 2,"B:" ;DISK NAME +; DB 11,"NO NAME " +; DB 8,"FAT12 " +; DB #01 ;PHISICAL DRIVE NUMBER +; +; DB 27 ;LENGTH DISK INFO +; DW FIXED ;DISK TYPE +; DB 2,"C:" ;DISK NAME +; DB 11,"NO NAME " +; DB 8,"FAT16 " +; DB #80 ;PHISICAL DRIVE NUMBER +; +; DB #00 ;END OF TABLE +;----------------------------------------------------------------------- + + ;R01 +; INITDVC_RET_DRIVE: +; CALL INITDVC +; LD A,(DRV_PAGE.LDRIVE) +; AND A +; RET + ; + + + + + +//////////////////////////////////////////////////////////////////////// +// NEW RESCAN // +//////////////////////////////////////////////////////////////////////// + INCLUDE 'NScanDRV2.ASM' +//////////////////////////////////////////////////////////////////////// ;DEVICE DB #00 ; DW FDDRIVE ; FDD A ; DB #01 diff --git a/DSS/NScanDRV.ASM b/DSS/NScanDRV.ASM index 68c2d84..2364310 100644 --- a/DSS/NScanDRV.ASM +++ b/DSS/NScanDRV.ASM @@ -1,970 +1,28 @@ -/* -; !TODO запоминать прерывания, отключать на старте, восстанавливать на выходе +;!TODO код дико костыльный и будет переделан вместе с процедурой INITDVC SCANDRV: -;1 [-----------] [-----------] [-----------] [-----------] [-----------] - ; LD A,(LDRIVE) - ; LD (.old_ldrive),A - ; LD A,(FATCASH.Update) - ; OR A - ; CALL NZ,WR_FAT - - CALL GETBOOT - LD (.old_letter),A ; bootdisk Log.number -; [-----------] - -;2 [-----------] [-----------] [-----------] [-----------] [-----------] - ; A = bootdisk Log.number - LD DE,Dss.DRV.GenIOCTL.Enter - LD BC,Dss.DRV.GenIOCTL.GetParams - RST ToDSS.DRV - EX AF,AF' - LD (.old_DRIVE_ID),A -; [-----------] - - -;3 [-----------] [-----------] [-----------] [-----------] [-----------] - LD A,Dss.DRV.RescanDRV - LD C,Dss.DRV.RescanDRV - RST ToDSS.DRV - LD (LDRIVE),A -; [-----------] - -;4 [-----------] [-----------] [-----------] [-----------] [-----------] -.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 -; - -;5 [-----------] [-----------] [-----------] [-----------] [-----------] - AND A - LD A,R - PUSH AF - DI - ;;;;;;;; - IN A,(SLOT3) - LD (.restore_page),A - LD A,(DRV_PG_NUMBER) - OUT (SLOT3),A - ;;;;; - - ; вычисляем смещение bootdisk в новой таблице DEVICE -.new_letter+1: - LD A,0 - CALL .get_entry_addr - PUSH HL - ; сохраняем значения нового boot - LD DE,.TMP_BUFFER - LD BC,DEVICE.TBL_Entry - LDIR - ; вычисляем смещение для буквы старого bootdisk в новой таблице DEVICE -.old_letter+1: - LD A,0 - CALL .get_entry_addr - ; меняем букву диска для девайса занявшего старую букву bootdisk - POP DE - LD BC,DEVICE.TBL_Entry - LDIR - ; восстанавливаем bootdisk на старое место - DEC HL - LD DE,.TMP_BUFFER + DEVICE.TBL_Entry-1 - LD BC,DEVICE.TBL_Entry - EX DE,HL - LDDR - ; проверяем, не увеличилось ли значение LDRIVE - ;!TEST - LD HL,.old_letter - LD A,(LDRIVE) - CP (HL) - JR NC,.no_change_LDRIVE - LD A,(HL) - LD (LDRIVE),A - ; -; .old_ldrive+1: - ;LD L,0 - ;LD A,(LDRIVE) - ;CP L - ;JR NC,.no_change_LDRIVE - ;LD A,L - ;LD (LDRIVE),A - ; -.no_change_LDRIVE: - ; - ; DEC A - ; CALL DISKINF - ; LD A,(BOOTDRV) - ; CALL CHNDISK - ;;;;; -.restore_page+1: - LD A,0 - OUT (SLOT3),A - ;;;;;;;; - POP AF - LD A,(LDRIVE) - RET PO - EI - 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 -.get_entry_addr: - _CALC_DEVICE_ENTRY DEVICE + #C000 - RET -; -.TMP_BUFFER: BLOCK 3,#FF - -; .old_letter: DB #FF -; .old_DRIVE_ID: DB #FF -; .new_letter: DB #FF -*/ - - - IF 1 -SCANDRV: -; 0. запоминаем состояние прерываний +; 1. запоминаем состояние прерываний ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; LD A,R DI PUSH AF ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; - -; 1. запоминаем бут-диск +; 2. узнаём букву бут-диска ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; 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. вызываем рескан ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; + ; A = Boot disk + LD B,A 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. выход +; 4. выход ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; 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 - -; ТАБЛИЦА СООТВЕТСТВИЯ МЕЖДУ ФИЗИЧЕСКИМ НОМЕРОМ РАМДИСКА И ЕГО 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 - - - - - -; -; 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 +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; \ No newline at end of file diff --git a/DSS/ScanDRV.ASM b/DSS/ScanDRV.ASM deleted file mode 100644 index 177200d..0000000 --- a/DSS/ScanDRV.ASM +++ /dev/null @@ -1,157 +0,0 @@ -; !TODO запоминать прерывания, отключать на старте, восстанавливать на выходе -SCANDRV: -;1 [-----------] [-----------] [-----------] [-----------] [-----------] - ; LD A,(LDRIVE) - ; LD (.old_ldrive),A - ; - CALL GETBOOT - LD (.old_letter),A ; bootdisk Log.number -; [-----------] - -;2 [-----------] [-----------] [-----------] [-----------] [-----------] - ; A = bootdisk Log.number - LD DE,Dss.DRV.GenIOCTL.Enter - LD BC,Dss.DRV.GenIOCTL.GetParams - RST ToDSS.DRV - EX AF,AF' - LD (.old_DRIVE_ID),A -; [-----------] - - -;3 [-----------] [-----------] [-----------] [-----------] [-----------] - ;!TEST в DRV-MAIN могут быть проблемы с прерываниями - ;DI - LD A,Dss.DRV.RescanDRV - LD C,Dss.DRV.RescanDRV - RST ToDSS.DRV - LD (LDRIVE),A - ;EI - ; -; [-----------] - -;4 [-----------] [-----------] [-----------] [-----------] [-----------] -.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 -; - -;5 [-----------] [-----------] [-----------] [-----------] [-----------] - AND A - LD A,R - PUSH AF - DI - ;;;;;;;; - IN A,(SLOT3) - LD (.restore_page),A - LD A,(DRV_PG_NUMBER) - OUT (SLOT3),A - ;;;;; - - ; вычисляем смещение bootdisk в новой таблице DEVICE -.new_letter+1: - LD A,0 - CALL .get_entry_addr - PUSH HL - ; сохраняем значения нового boot - LD DE,.TMP_BUFFER - LD BC,DEVICE.TBL_Entry - LDIR - ; вычисляем смещение для буквы старого bootdisk в новой таблице DEVICE -.old_letter+1: - LD A,0 - CALL .get_entry_addr - ; меняем букву диска для девайса занявшего старую букву bootdisk - POP DE - LD BC,DEVICE.TBL_Entry - LDIR - ; восстанавливаем bootdisk на старое место - DEC HL - LD DE,.TMP_BUFFER + DEVICE.TBL_Entry-1 - LD BC,DEVICE.TBL_Entry - EX DE,HL - LDDR - ; проверяем, не меньше ли новое значение LDRIVE старого номера бут-диска - ;!TEST - LD HL,.old_letter - LD A,(LDRIVE) - CP (HL) - JR NC,.no_change_LDRIVE - LD A,(HL) - LD (LDRIVE),A - ; -; .old_ldrive+1: - ;LD L,0 - ;LD A,(LDRIVE) - ;CP L - ;JR NC,.no_change_LDRIVE - ;LD A,L - ;LD (LDRIVE),A - ; -.no_change_LDRIVE: - ; - ; DEC A - ; CALL DISKINF - ; LD A,(BOOTDRV) - ; CALL CHNDISK - ;;;;; -.restore_page+1: - LD A,0 - OUT (SLOT3),A - ;;;;;;;; - POP AF - LD A,(LDRIVE) - RET PO - EI - 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 -.get_entry_addr: - _CALC_DEVICE_ENTRY DEVICE + #C000 - RET -; -.TMP_BUFFER: BLOCK 3,#FF - -; .old_letter: DB #FF -; .old_DRIVE_ID: DB #FF -; .new_letter: DB #FF \ No newline at end of file diff --git a/DSS/VIDEO.ASM b/DSS/VIDEO.ASM index e034185..350c84b 100644 --- a/DSS/VIDEO.ASM +++ b/DSS/VIDEO.ASM @@ -6,63 +6,47 @@ ;--------------------------------------------------------------- ;Rev Date Name Description ;--------------------------------------------------------------- -;R03 04-04-2023 BAO FIXED BUGS IN FN SCROLL, SETVMOD, SELPAGE ;R02 07-11-2002 DNS CORRECT FN. WINCOPY & WINREST, ADD "DI+EI" ;R01 07-11-2002 DNS FIX BUG WITH SCROLLUP FN. (A=0) ;--------------------------------------------------------------- -; CLEAR TEXT WINDOW +;///////////////////////////////////////////////////////////////////// +; Функция #56. Очистить окно. +; +; вход: D - строка левого верхнего угла окна +; E - столбец левого верхнего угла окна +; H - высота окна +; L - ширина окна +; A - символ заполнитель +; B - атрибут заполнитель +; выход: нет +;///////////////////////////////////////////////////////////////////// CLEAR: LD C,BIOS.LP_CLS_WIN2 RST ToBIOS AND A RET ; - +;///////////////////////////////////////////////////////////////////// +; Функция #5C. Вывод строки на экран. +; +; вход: HL - указатель на строку символов +; выход: нет ; PRINT NULL-TERMINATED CHARS STRING -; HL - STRING POINTER -PCHARS: -.loop: LD A,(HL) +;///////////////////////////////////////////////////////////////////// +PCHARS: LD A,(HL) INC HL OR A RET Z - - ;!TEST FOR LP_PR_LINE_DIR - ;PUSH HL - ;CALL CURSOR - ;LD (.CHAR),A - ;LD A,(SLOT1) - ;PUSH AF - ;LD A,(SLOT0) - ;LD (SLOT1),A - ;LD HL,.CHAR + #4000 - ;LD BC,0*256 + BIOS.LP_PR_LINE_DIR - ;RST ToBIOS - ;POP AF - ;LD (SLOT1),A - ;POP HL - ;JP .loop - ; - CALL PUTCHAR - ;!TEST CR+LF+SCROLL - ;CALL CURSOR - ;LD A,D ; проверка на переход курсора - ;OR E ; в самое начало (X:Y == 0:0) - ;CALL Z,PUTCHAR.LFF - ; - JP .loop -;.CHAR: DZ " ",0 + JP PCHARS - -; PRINT CHAR -; A - CHAR +;///////////////////////////////////////////////////////////////////// +; Функция #5B. Вывод символа на экран в тек. позиции. +; +; вход: A - символ +; выход: нет +;///////////////////////////////////////////////////////////////////// PUTCHAR: - ;LD B,A - ;CALL CURSOR - ;LD A,B - - ;CP ' ' - ;JR NC,.CHAR CP #0D JR Z,.CR_ CP #0A @@ -73,40 +57,25 @@ PUTCHAR: JR Z,.BK_ CP #07 JR Z,.BELL - ;SCF - ;RET + ; .CHAR: LD BC,1*256 + BIOS.LP_PRINT_SYM - ;!TEST CR+LF+SCROLL - ;JP ToBIOS + ;[x] CR+LF+SCROLL RST ToBIOS ; проверка на переход курсора в самое начало (X:Y == 0:0) CALL CURSOR LD A,D OR E RET NZ - ;LD A,D ; в DE координаты текущего знакоместа - ;XOR E ; Проверяем на координаты #1F:#4F - ;XOR #50 - ;RET NZ ; если другие - то выход - ;LD E,A - ;CALL LOCATE ; .LFF: PUSH HL ;!FIXIT сохранять текущие прерывания - ;PUSH DE LD BC,1*256 + BIOS.LP_SCROLL_UD LD DE,#0020 - ;EI - ;HALT - ;DI RST ToBIOS LD DE,#1F00 - ;PUSH DE CALL LOCATE LD A,' ' LD BC,#50*256 + BIOS.LP_PRINT_SYM RST ToBIOS - ;EI - ;POP DE LD DE,#1F00 CALL LOCATE POP HL @@ -134,9 +103,7 @@ PUTCHAR: RST ToBIOS XOR A CP E - ;!TEST - ;JP Z,LOCATE - RET Z + RET Z DEC E JP LOCATE .LF_: LD C,BIOS.LP_GET_PLACE ;GET CURSOR @@ -159,8 +126,6 @@ PUTCHAR: LD HL,4 JP BEEP .NO_SCROLL: - ;CP ' ' - ;JR NC,.CHAR CP #0D JR Z,.CR_ CP #0A @@ -171,41 +136,40 @@ PUTCHAR: JR Z,.BK_ CP #07 JR Z,.BELL - ;SCF - ;RET ._CHAR: LD BC,1*256 + BIOS.LP_PRINT_SYM - ;!TEST CR+LF+SCROLL - JP ToBIOS - ;RST ToBIOS + JP ToBIOS ;-----[] ; ; -; SET CURRENT CURSOR POSITION -;=============================== -; D = Y -; E = X +;///////////////////////////////////////////////////////////////////// +; Функция #52. Установить положение курсора. +; +; вход: D - строка курсора +; E - колонка курсора +; выход: нет +;///////////////////////////////////////////////////////////////////// LOCATE: LD C,BIOS.LP_SET_PLACE - ; LD A,C - ; LD (NO_NEED_SCROLL),A JP ToBIOS - ;RET -; GET CURRENT CURSOR POSITION -; out: -; D - Y -; E - X +;///////////////////////////////////////////////////////////////////// +; Функция #53. Узнать положение курсора. +; +; вход: нет +; выход: D - строка курсора +; E - колонка курсора +;///////////////////////////////////////////////////////////////////// CURSOR: LD C,BIOS.LP_GET_PLACE JP ToBIOS - ;RET -; READ CHAR & ATTR FROM THE SCREEN -; in: -; D - Y -; E - X -; out: -; A - CHAR -; B - ATTR +;///////////////////////////////////////////////////////////////////// +; Функция #57. Прочитать символ с экрана. +; +; вход: D - строка +; E - колонка +; выход: A - символ +; B - атрибут +;///////////////////////////////////////////////////////////////////// RDCHAR: XOR A LD C,BIOS.WIN_GET_SYM RST ToBIOS @@ -214,12 +178,17 @@ RDCHAR: XOR A AND A RET -; WRITE CHAR & ATTR TO THE SCREEN -; D - Y -; E - X -; A - CHAR -; B - ATTR +;///////////////////////////////////////////////////////////////////// +; Функция #58. Вывести символ на экран. +; Управляющие символы выводятся как обычные символы. +; +; вход: D - строка +; E - колонка +; A - символ +; B - атрибут +; выход: нет ;!FIXIT slow как без WIN_GET_SYM тут обойтись? +;///////////////////////////////////////////////////////////////////// WRCHAR: LD C,A PUSH BC PUSH DE @@ -234,20 +203,21 @@ WRCHAR: LD C,A AND A RET -; COPY WINDOW FROM THE SCREEN -; D - Y -; E - X -; H - HEIGHT -; L - WIDTH -; IX - ADDRESS -; B - PAGE, IF IX > #C000 +;///////////////////////////////////////////////////////////////////// +; Функция #59. Сохранить окно экрана. +; +; вход: D - строка +; E - колонка левого верхнего угла окна +; H - высота окна +; L - ширина окна +; B - страница буфера, если IX >= #C000 +; IX - адрес буфера +; выход: нет +;///////////////////////////////////////////////////////////////////// WINCOPY: AND A LD A,R ;R02 PUSH AF ;R02 XOR A - ;EX AF,AF' ;R03 - ;LD A,B ;R03 - ;EX AF,AF' ;R03 LD C,BIOS.WIN_COPY DI ;R02 RST ToBIOS @@ -256,20 +226,21 @@ WINCOPY: AND A EI ;R02 RET -; RESTORE WINDOW TO THE SCREEN -; D - Y -; E - X -; H - HEIGHT -; L - WIDTH -; IX - ADDRESS -; B - PAGE, IF IX > #C000 +;///////////////////////////////////////////////////////////////////// +; Функция #5A. Восстановить окно экрана. +; +; вход: D - строка +; E - колонка левого верхнего угла окна +; H - высота окна +; L - ширина окна +; B - страница буфера, если IX >= #C000 +; IX - адрес буфера +; выход: нет +;///////////////////////////////////////////////////////////////////// WINREST: AND A LD A,R ;R02 PUSH AF ;R02 XOR A - ;EX AF,AF' ;R03 - ;LD A,B ;R03 - ;EX AF,AF' ;R03 DI ;R02 LD C,BIOS.WIN_RESTORE RST ToBIOS @@ -277,18 +248,20 @@ WINREST: AND A RET PO ;R02 EI ;R02 RET - -; SCROLL WINDOW -; D - Y -; E - X -; H - HEIGHT -; L - WIDTH -; B - SCROLL DIRECTION -; B = 1 - SCROLL UP -; B = 2 - SCROLL DOWN -; A = 0 - CLEAR LINE +;///////////////////////////////////////////////////////////////////// +; Функция #55. Скроллинг экрана. +; +; вход: D - строка левого верхнего угла окна +; E - колонка левого верхнего угла окна +; H - высота окна +; L - ширина окна +; B = 1 - прокрутка вверх +; B = 2 - прокрутка вниз +; A = 0 - очищать строку +; выход: нет +;///////////////////////////////////////////////////////////////////// SCROLL: DJNZ SCR_DW ;!TODO заменить на BIOS.LP_SCROLL_UD и посмотреть, что шустрее - ;!TEST + ; [x] 04/04/23 ;LD B,A ;LD C,H ;PUSH BC @@ -301,11 +274,21 @@ SCROLL: DJNZ SCR_DW ;!TODO INC D DEC H LD C,BIOS.WIN_MOVE + ; [x] 29/9/23 + LD A,R + PUSH AF + ; XOR A + DI ; [x] 29/9/23 RST ToBIOS + ; [x] 29/9/23 + POP AF + JP PO,1F + EI +1: ; POP HL POP DE - ;!TEST + ; [x] 04/04/23 ;POP BC POP AF ;XOR A @@ -329,11 +312,11 @@ SCROLL: DJNZ SCR_DW ;!TODO RET SCR_DW: DJNZ SCR_ERR - ;!TEST + ; [x] 04/04/23 ;LD B,A ;LD C,H ;PUSH BC - PUSH AF ;R03 + PUSH AF ; PUSH DE PUSH HL @@ -342,74 +325,92 @@ SCR_DW: DJNZ SCR_ERR INC XH DEC H LD C,BIOS.WIN_MOVE + ; [x] 29/9/23 + LD A,R + PUSH AF + ; XOR A + DI ; [x] 29/9/23 RST ToBIOS + ; [x] 29/9/23 + POP AF + JP PO,1F + EI +1: ; POP HL POP DE - ;!TEST + ; [x] 29/9/23 ;POP BC - POP AF ;R03 + POP AF ;XOR A ;CP B AND A ; RET NZ JP SCROLL.print - ; PUSH DE ;R01 - ; CALL LOCATE - ; LD A,#20 - ; LD B,L - ; LD C,BIOS.LP_PRINT_SYM - ; RST ToBIOS - ; POP DE ;R01 - ; CALL LOCATE ;R01 - ; AND A - RET + SCR_ERR: LD A,DSS_Error.sys.INVALID_FUNCTION SCF RET -; SELECT SCREEN PAGE -; B - SCREEN PAGE -SELPAGE:;PUSH BC +;///////////////////////////////////////////////////////////////////// +; Функция #54. Выбрать активную страницу экрана. +; +; вход: B - страница экрана 0/1 +; выход: A - код ошибки, если CF=1 +;///////////////////////////////////////////////////////////////////// +SELPAGE: LD A,(VMODE) - BIT 7,A - JR NZ,.SEL2 + ;BIT 7,A + CP %1000'0000 + JR NC,.SEL2 PUSH BC LD C,A CALL SETVMOD.TEXT_M POP BC -.SEL2: ;POP BC - LD A,B +.SEL2: LD A,B AND #01 OUT (SCREEN_SWITCH),A RET -; GET CURRENT VIDEO MODE -; out: -; A - MODE -; B - PAGE +;///////////////////////////////////////////////////////////////////// +; Функция #51. Получить текущий режим экрана. +; +; вход: нет +; выход: A - текущий режим экрана +; B - страница экрана 0/1 +;///////////////////////////////////////////////////////////////////// GETVMOD IN A,(SCREEN_SWITCH) LD B,A LD A,(VMODE) AND A RET -; SET CURRENT VIDEO MODE -; A - MODE -; B - PAGE -SETVMOD: BIT 7,A +;///////////////////////////////////////////////////////////////////// +; Функция #50. Выбор режима экрана. +; +; вход: A - режим экрана +; 02h - текстовый 40x32x16 цветов +; 03h - текстовый 80x32x16 цветов +; 81h - графический 320x256x256 цветов +; 82h - графический 640x256x16 цветов +; B - страница экрана 0/1 +; выход: A - код ошибки, если CF=1 +;///////////////////////////////////////////////////////////////////// +SETVMOD:;BIT 7,A + CP %1000'0000 LD C,A - JR NZ,GRAPH + JR NC,GRAPH .TEXT_M: LD IX,BACKTXT PUSH IX EX AF,AF' LD A,(VMODE) LD (VVMODE),A EX AF,AF' - INC A - DEC A + //INC A + //DEC A + OR A JR Z,.NOMODE DEC A JR Z,.NOMODE @@ -424,6 +425,7 @@ SETVMOD: BIT 7,A SCF RET +; Установка граф. режимов GRAPH: CALL SAVETXT AND #7F JR Z,G320_16 ; !TODO ? - пока отрабатывает как ошибка @@ -531,15 +533,20 @@ G640_16 PUSH BC ; SAFE_PORTY ; XOR A ; RET - VMODE: DB #03 +;----------------------------------------------------------------------- +; Открыть окно +; вход: hl=описатель окна +; e=флаги окна +; ;02h - TEXT 40 x 32 (16 colors) ;03h - TEXT 80 x 32 (16 colors) ;80h - GRAF 320 x 256 (16 colors) ;81h - GRAF 320 x 256 (256 colors) ;82h - GRAF 640 x 256 (16 colors) ;83h - GRAF 640 x 256 (256 colors) UNUSED +;----------------------------------------------------------------------- SETMODE: PUSH DE LD DE,SYS_PAGE.SHARED_BUFFER_32b ; грязный хак. кидает данные в буфер служебной страницы биоса. LD BC,ScreenDescriptorTable.Size ; БИОС при использовании IX предполагает, что он указывает @@ -554,7 +561,7 @@ SETMODE: PUSH DE LD IX,SYS_PAGE.SHARED_BUFFER_32b ; грязный хак. LD C,BIOS.WIN_OPEN RST ToBIOS - SAFE_PORTY ;????? - возможно, что теперь не нужно, везде с банкой 3 работают, проверить + SAFE_PORTY XOR A RET @@ -569,31 +576,42 @@ SETMODE: PUSH DE ; ;....................................................................... +;+0 X размер окна в знакоместах +;+1 Y размер окна в знакоместах +;+2 X полож. окна на экране +;+3 Y полож. окна на экране +;+4 режим знакоместа +;+5 доп. режим знакоместа (bit0=1 спек. адресация экрана) +;+6 X полож. в поле графики (в знакоместах) +;+7 Y полож. в поле графики (в знакоместах) ScreenDescriptorTable EQU $ -;80x32 -TAB_80x32 DB #28,#20,#00,#00,#1B,#00,#00,#00 ;1 -;40x32 -TAB_40x32 DB #28,#20,#00,#00,#3B,#00,#00,#00 ;2 -;640x256 PAGE 0 -TAB_640x256_0 DB #28,#20,#00,#00,#00,#00,#00,#00 ;3 -;320x256 PAGE 0 -TAB_320x256_0 DB #28,#20,#00,#00,#20,#00,#00,#00 ;4 -;640x256 PAGE 1 -TAB_640x256_1 DB #28,#20,#00,#00,#40,#00,#28,#00 ;5 -;320x256 PAGE 1 -TAB_320x256_1 DB #28,#20,#00,#00,#60,#00,#28,#00 ;6 +; 80x32. текстовое, знакоместо 16x8, #0B - номер знакоген. +TAB_80x32 DB #28,#20,#00,#00,#1B,#00,#00,#00 ;1 +; 40x32. текстовое, знакоместо 8x8, #0B - номер знакоген. +TAB_40x32 DB #28,#20,#00,#00,#3B,#00,#00,#00 ;2 +; 640x256. графическое, 0-й экран +TAB_640x256_0 DB #28,#20,#00,#00,#00,#00,#00,#00 ;3 +; 320x256. графическое, 0-й экран +TAB_320x256_0 DB #28,#20,#00,#00,#20,#00,#00,#00 ;4 +; 640x256. графическое, 1-й экран +TAB_640x256_1 DB #28,#20,#00,#00,#40,#00,#28,#00 ;5 +; 320x256. графическое, 1-й экран +TAB_320x256_1 DB #28,#20,#00,#00,#60,#00,#28,#00 ;6 ScreenDescriptorTable.Size EQU ($ - ScreenDescriptorTable)/6 ;....................................................................... ; +;---------------------------------------------------------------------- +; Сохранить экран текст. режима. +; Для буфера экрана исп. 2-я банка расширения ДОС. SAVETXT PUSH AF - ;!!!!! перенесена логика супер дичайшего ускорения LD A,(VMODE) - BIT 7,A - JR NZ,NOSAVET + ;BIT 7,A + CP %1000'0000 + JR NC,NOSAVET SUB #02 JR C,NOSAVET -;; + PUSH BC PUSH DE PUSH HL @@ -611,27 +629,35 @@ SAVETXT PUSH AF LD L,#28 SVTEXT1 LD (SVHL1),HL LD DE,#0000 - ;EX AF,AF' ;R03 LD A,(BANKTBL+TXTPAGE) LD B,A - ;EX AF,AF' ;R03 LD C,BIOS.WIN_COPY + ; [x] 29/9/23 + LD A,R + PUSH AF + ; XOR A DI RST ToBIOS - EI + ; [x] 29/9/23 + POP AF + JP PO,1F + EI +1: ; POP IX POP HL POP DE POP BC NOSAVET: POP AF RET +;---------------------------------------------------------------------- BACKTXT PUSH AF VVMODE+1: LD A,#00 - BIT 7,A - JR Z,NOBACKT + ;BIT 7,A + CP %1000'0000 + JR C,NOBACKT PUSH BC PUSH DE @@ -641,19 +667,23 @@ VVMODE+1: SVHL1+1: LD HL,#2050 LD DE,#0000 - ;EX AF,AF' ;R03 LD A,(BANKTBL+TXTPAGE) LD B,A - ;EX AF,AF' ;R03 LD C,BIOS.WIN_RESTORE + ; [x] 29/9/23 + LD A,R + PUSH AF + ; XOR A DI RST ToBIOS - EI + ; [x] 29/9/23 + POP AF + JP PO,1F + EI +1: ; TCURS+1: LD DE,#0000 - ;LD C,BIOS.LP_SET_PLACE - ;RST ToBIOS CALL LOCATE POP IX POP HL @@ -662,9 +692,21 @@ TCURS+1: NOBACKT: POP AF RET -; SEND A SYMBOL TO THE PRINTER -;============================== -; A - SYMBOL +;///////////////////////////////////////////////////////////////////// +; Функция #5F. Вывод символа на принтер без ожидания. +; +; Интерпретация байта состояния принтера: +; 0..2 - не используются, обычно уст. в "1" +; 3 - ошибка принтера - есть/нет (1/0) +; 4 - принтер подключен/не подключен (1/0) +; 5 - бумаги нет/есть (1/0) +; 6 - принтер готов/выводит очередной символ (1/0) +; 7 - принтер свободен/занят (1/0) +; +; вход: A - символ +; выход: B - символ +; CF - ошибка, A=байт состояния (биты 7..3) +;///////////////////////////////////////////////////////////////////// ;!FIXIT заменить на sp2000.inc LPT_A EQU #1B LPT_B EQU #1C @@ -710,63 +752,33 @@ LPT2_D EQU #1E LPT2_C EQU #1F PRINT_INIT: DI - LD A,#CF ; port #1F только чеpез LD BC,1F : Out (BC),reg (в альтере идёт перехват этого порта проца, если он в команде явно указан) + LD A,#CF ; port #1F только чеpез LD BC,1F : Out (BC),reg (в альтере идёт перехват этого порта проца, если он в команде явно указан) LD BC,LPT2_C OUT (C),A - LD A,#63 + ; [x] 29/9/23 + ;LD A,#63 + LD A,63 + ; OUT (C),A - LD A,#C0 ; Bit 7 - Select (1), Bit 6 - Auto_Line_Feed (1) + LD A,#C0 ; Bit 7 - Select (1), Bit 6 - Auto_Line_Feed (1) OUT (LPT2_D),A - LD A,#0F ; Init printer port for Out + LD A,#0F ; Init printer port for Out OUT (LPT1_C),A -; САЙМАН ВЫРЕЗАЛ - XOR A ;LD A,0 + ; клава + XOR A ;LD A,0 OUT (COM_A),A - ;LD A,0 - OUT (COM_A),A ; ????? надо ли второй раз зассылать и вообще имеет ли смысл com инитить? + ; [x] 29/9/23 + INC A + OUT (COM_A),A + DEC A + ; + OUT (COM_A),A + LD A,5 OUT (COM_A),A - LD A,#62 ; bit 7 - Direction for Bufer (0), Bit 1 - Bufer Enable (1) + LD A,#62 ; bit 7 - Direction for Bufer (0), Bit 1 - Bufer Enable (1) OUT (COM_A),A RET -; САЙМАН ВЫРЕЗАЛ - ;//MODULE: VIDEO -;[END] - - -; ; САЙМАН -; PUSH AF -; LD A,E -; CP #4F -; JP NZ,.exit -; LD A,D -; CP #1F -; JP NZ,.exit -; LD E,0 -; LD C,BIOS.LP_SET_PLACE -; RST ToBIOS -; CALL LFF -; .exit: -; pop af -; RET -; ; САЙМАН - - -; LD A,D ; в DE координаты текущего знакоместа -; XOR E ; Проверяем на координаты #1F:#4F -; XOR #50 -; RET NZ ; если другие - то выход -; LD E,A -; LD C,BIOS.LP_SET_PLACE -; RST ToBIOS -;LFF: -; ... - -;;;;;;;; - ; LD A,D ; в DE координаты текущего знакоместа - ; XOR E ; Проверяем на координаты #1F:#4F - ; XOR #50 - ; RET NZ ; если другие - то выход -;;;;;;;; \ No newline at end of file +;[END] \ No newline at end of file diff --git a/DSS/build.txt b/DSS/build.txt index 1c3e15e..43f9cb6 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -371 \ No newline at end of file +396 \ No newline at end of file diff --git a/DSS/defines.inc b/DSS/defines.inc index a062c73..e74f3cd 100644 --- a/DSS/defines.inc +++ b/DSS/defines.inc @@ -4,7 +4,7 @@ ; DEFINE SHORT_RSTx10_TABLE 0 ; укороченная таблица функций rst #10. 96 функций. - DEFINE COMPILE_UNUSED_CODE 1 + DEFINE COMPILE_UNUSED_CODE 0 ; ; @@ -20,7 +20,7 @@ DSS_MAX_DRIVES_AMOUNT EQU 26 ; ;-------------------[MEMORY]-------------------------; DEFINE PORTAL.RSTx18_SWITCH_ADDRESS #82 - DEFINE OLD_SET_BANK 0 +; DEFINE OLD_SET_BANK 0 ;---------------------[ лог.номера страниц памяти ]--------------------- ; кэш списка каталога @@ -39,7 +39,7 @@ ENVIRONMENT_STRING_LENGTH EQU 255 TXTADDR EQU #C000 ENVADDR EQU #E400 DIR EQU #C000 -FAT EQU #C000 +FAT_CACHE EQU #C000 FMCOUNT EQU 10 ; Количество файловых манипуляторов HANDBUF.SIZE EQU 32 diff --git a/SHELL/SHELL_EXEC.ASM b/SHELL/SHELL_EXEC.ASM index 15b5da7..3d919ae 100644 --- a/SHELL/SHELL_EXEC.ASM +++ b/SHELL/SHELL_EXEC.ASM @@ -98,25 +98,35 @@ COMP002: xor a jr c,NOUP cp "z"+1 jr nc,NOUP - and 5Fh ; a..z -> A..Z + and #5F ; a..z -> A..Z ;!!!!! тут восстанавливается директория и могут быть глюки на новом ядре NOUP: sub "A" ; номер диска ld c,Dss.ChDisk ; сменить тек. диск RST ToDSS jp c,print_err_message ; вывод сообщения - ; тест на существование папки на целевом диске - ld hl,system_path ; буфер сист. пути - ld c,Dss.ChDir ; уст. тек. путь - RST ToDSS - jp nc,save_disk_path ; Ok + + ;!TODO доставать system_path отдельно для каждого диска (или в ядре сделать?) + ; тест на существование папки на целевом диске + IFDEF MANY_SYS_PATHES + ld hl,system_path ; буфер сист. пути + ld c,Dss.ChDir ; уст. тек. путь + RST ToDSS + jp nc,save_disk_path ; Ok + ENDIF + ; + ; уст. корень, нет такой папки на новом диске ld hl,system_path+1 ; буфер сист. пути ld (hl),0 dec hl ld (hl),'\' - ld c,Dss.ChDir ; уст. тек. путь - RST ToDSS - jp c,print_err_message ; вывод сообщения + ;!TODO доставать system_path отдельно для каждого диска (или в ядре сделать?) + IFDEF MANY_SYS_PATHES + ld c,Dss.ChDir ; уст. тек. путь + RST ToDSS + jp c,print_err_message ; вывод сообщения + ENDIF + ; jp save_disk_path ; Ok ; задан не диск diff --git a/SHELL/build.txt b/SHELL/build.txt index efee1f8..e3f1e9b 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -78 \ No newline at end of file +80 \ No newline at end of file diff --git a/Shared_Includes b/Shared_Includes index 639cc1e..1b02533 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 639cc1e69de900dd85e1bc4d3525dfeb91ea15ab +Subproject commit 1b025338c449183aa1cfbe595994fd9ddf7feb8e