mirror of
https://github.com/Tolik-Trek/Estex-DSS.git
synced 2026-06-15 09:21:47 +03:00
970 lines
18 KiB
NASM
970 lines
18 KiB
NASM
/*
|
||
; !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
|
||
*/ |