; !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