Estex-DSS/DSS/ScanDRV.ASM

157 lines
3.1 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.

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