Estex-DSS/DSS/NScanDRV.ASM
2023-09-28 05:08:25 +10:00

970 lines
18 KiB
NASM
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
; !TODO § ¯®¬¨­ âì ¯à¥à뢠­¨ï, ®âª«îç âì ­  áâ àâ¥, ¢®ááâ ­ ¢«¨¢ âì ­  ¢ë室¥
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. § ¯®¬¨­ ¥¬ á®áâ®ï­¨¥ ¯à¥à뢠­¨©
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
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 - <20>¥ ­ ©¤¥­®, â ¡«¨æ  § ª®­ç¨« áì
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
;
; <20>… ƒ<>Ž•€œ HL!
;  . ¥á«¨ ¤à ©¢ ¥áâì ¢ ­®¢®© ¨ áâ à®©, â® § â¨à ¥¬ ¢ ­®¢®©
; â ¡«¨æ¥ ᮢ¯ ¢è¨© ¤à ©¢
; ¡. ¥á«¨ ¤à ©¢ ¥áâì ⮫쪮 ¢ áâ à®©, â®:
; ¡1) £à®å ¥¬ ä ©«®¢ë¥ ¬ ­¨¯ã«ïâ®àë á ¥£® ­®¬¥à®¬
MODULE SCAN_TABLES
; ¢å®¤: B - «®£.­®¬¥à ¤à ©¢ , DE
RAM_DRV:
; <20>®«ãç ¥¬ ­®¬¥à à ¬¤¨áª  ¢ 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
; ‡€<E280A1>ˆœ <20><20>€‰„…<E2809E>
; „®áâ ñ¬ ¯®«®¦¥­¨¥ ¢ 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
; ‡€<E280A1>ˆœ <20><20>€‰„…<E2809E>
; ƒà®å ¥¬ áâ àãî § ¯¨áì ¢ 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
; «®£¨ç¥áª¨© ­®¬¥à ãáâனá⢠ +  ¤à¥á ®¡à ¡®â稪 .
; <20>®à浪®¢ë© ­®¬¥à * 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
; ‹®£¨ç¥áª¨© ­®¬¥à à §¤¥« .
;<3B>®¬¥à £à㯯ë = «®£¨ç¥áª¨© ­®¬¥à à §¤¥«  HDD ¨§ DEVICE
LOGDRV EQU DEVICE + DEVICE.Size
.TBL_Entry EQU 16
.Size EQU DSS_MAX_DRIVES_AMOUNT * .TBL_Entry
; <E28099>ˆ€ ‘ŽŽ’‚…’‘’‚ˆŸ Œ…†„“ ”ˆ‡ˆ—…‘ŠˆŒ <20>ŽŒ…<C592>ŽŒ <20>€Œ„ˆŠ€ ˆ …ƒŽ 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
;=====================================================================[]
; «®£¨ç¥áª¨© ­®¬¥à ãáâனá⢠ +  ¤à¥á ®¡à ¡®â稪 .
; <20>®à浪®¢ë© ­®¬¥à * 3 = ¡ãª¢  ¤¨áª  + "A"
DEVICE: BLOCK DSS_MAX_DRIVES_AMOUNT*3,#FF
.Size: EQU $-DEVICE
®£¨ç¥áª¨© ­®¬¥à à §¤¥« .
<EFBFBD>®¬¥à £à㯯ë = «®£¨ç¥áª¨© ­®¬¥à à §¤¥«  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
; <E28099>ˆ€ ‘ŽŽ’‚…’‘’‚ˆŸ Œ…†„“ ”ˆ‡ˆ—…‘ŠˆŒ <20>ŽŒ…<C592>ŽŒ <20>€Œ„ˆŠ€ ˆ …ƒŽ 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
; <20> å®¤¨¬ ¢ áâ à®© 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
; <20> å®¤¨¬ ¢ ­®¢®© 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:
; <20> å®¤¨¬ ¢ ­®¢®© 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
*/