mirror of
https://github.com/Tolik-Trek/Estex-DSS.git
synced 2026-06-15 09:21:47 +03:00
708 lines
14 KiB
NASM
708 lines
14 KiB
NASM
|
||
;[BEGIN]
|
||
;//MODULE: DOS_X
|
||
;//CREATE: 19-05-1998 AUTHOR: Denis Parinov
|
||
;//UPDATE: 24-10-1999 DNS Restore module
|
||
;---------------------------------------------------------------
|
||
;Rev Date Name Description
|
||
;---------------------------------------------------------------
|
||
;R13 06-04-2023 BAO ”ãªæ¨î SETBOOT ¬®¦® ¢ë§¢ âì ⮫쪮 à § (¥á«¨ § ¢¥àè¨âáï ª®à४â®)
|
||
;R12 03-04-2023 BAO „®¡ ¢«¥ äãªæ¨ï à¥áª ¤à ©¢®¢ LD C,8 : RST #10
|
||
;R11 15-04-2003 DNS ROUTINE FOR STORE CURDISK AND CURDIR ;!FIXIT à ¡®â ¥â ªà¨¢®
|
||
;R10 03-04-2003 DNS IMPROVED FN. VERSION
|
||
;R09 27-03-2003 DNS PASTED SET/GET BOOT FN.
|
||
;R08 14-11-2002 DNS IMPROVE BPB-FUNCTION
|
||
;R07 17-12-1999 DNS BUG FIX SIGNATURE #55AA AT 510 OFFSET
|
||
;R06 21-11-1999 DNS FN. DISKINF SUPPORT ALL DISKS
|
||
;R05 21-11-1999 DNS BUG FIX SIGNATURE #55AA IN BOOT SECTOR
|
||
;R04 08-11-1999 DNS KILL OLD FUNCTIONS
|
||
;R03 23-11-1998 DNS BUG FIX (IX+28) -> (IY+28)
|
||
;R02 21-11-1998 DNS CHANGE FUNCTION "MAKE FAT"
|
||
;R01 20-11-1998 DNS REPAIR FUNCTION "SAVE"
|
||
;---------------------------------------------------------------
|
||
|
||
; RGADR EQU #89 ;VIDEO CONTROL REGISTER
|
||
; SLOT0 EQU #82 ;WIN #0000-#3FFF
|
||
; SLOT1 EQU #A2 ;WIN #4000-#7FFF
|
||
; SLOT2 EQU #C2 ;WIN #8000-#BFFF
|
||
; SLOT3 EQU #E2 ;WIN #C000-#FFFF
|
||
|
||
; SYSPAGE EQU #FE
|
||
|
||
;Commands for restart #10
|
||
//NOPS: LD A,DSS_Error.sys.INVALID_FUNCTION
|
||
// SCF
|
||
// RET
|
||
|
||
VERSION:
|
||
LD DE,VERS*256+MODF
|
||
XOR A
|
||
LD H,A ;!TODO ¯¨å âì áî¤ OSINFO
|
||
LD L,A
|
||
LD BC,BUILD
|
||
RET
|
||
|
||
//;R10
|
||
//OSINFO:
|
||
//OSINFO_SIG: DB "OSINFOSTRUCTURE",0
|
||
|
||
//BOOTDRV: DB 0
|
||
|
||
;/////////////////////////////////////////////////////////////////////
|
||
; ”ãªæ¨ï #09. <20>®¬¥à á¨á⥬®£® ¤¨áª .
|
||
; ‚®§¢à é ¥â ®¬¥à ¤¨áª , c ª®â®à®£® § £à㦥 á¨á⥬ .
|
||
;
|
||
; ¢å®¤: B = 0 (01h - ¨á¯. boot-§ £àã§ç¨ª á¨á⥬ë)
|
||
; ¢ë室: A - ®¬¥à á¨á⥬®£® ¤¨áª (0=A,1=B,..)
|
||
;/////////////////////////////////////////////////////////////////////
|
||
BOOTDSK:
|
||
INC B
|
||
DEC B
|
||
JR Z,GETBOOT
|
||
DEC B
|
||
.chg: JR Z,SETBOOT ;R13 ¬¥ï¥âáï JR ‘,SETBOOT ¯®á«¥ ¯¥à¢®£® 㤠箣® ¨á¯®«¥¨ï SETBOOT
|
||
LD A,DSS_Error.sys.INVALID_FUNCTION
|
||
SCF
|
||
RET
|
||
|
||
;GET BOOT DISK
|
||
GETBOOT:
|
||
BOOTDRV+1: LD A,0 ;R09
|
||
AND A
|
||
RET
|
||
|
||
;SET BOOT DISK
|
||
; ‘®®¡é¨âì DSS á ª ª®£® ¤¨áª § £à㦠¥âáï á¨á⥬ .
|
||
; ˆá¯. § £àã§ç¨ª á¨áâ¥¬ë ¤«ï ¨¨æ. ï祩ª¨ "boot_disk".
|
||
SETBOOT:
|
||
LD B,A
|
||
LD C,0
|
||
.loop: PUSH BC
|
||
LD A,C
|
||
LD DE,#55AA
|
||
LD BC,256*0 + Dss.DRV.GenIOCTL
|
||
RST ToDSS.DRV
|
||
POP BC
|
||
JR C,.NoSupport
|
||
EX AF,AF' ;PHISICAL DRIVE NUMBER
|
||
CP B
|
||
JR NZ,.NoSupport
|
||
;R13
|
||
LD A,#38 ; opcode for JR C,addr
|
||
LD (BOOTDSK.chg),A
|
||
;R13
|
||
LD A,C
|
||
LD (BOOTDRV),A
|
||
AND A
|
||
RET
|
||
.NoSupport:
|
||
INC C
|
||
LD A,(LDRIVE)
|
||
CP C
|
||
JR NZ,.loop
|
||
SCF
|
||
RET
|
||
;R09
|
||
|
||
;!!!!! „ã¡«ì - CHNDISK = OPENDSK
|
||
/*
|
||
CHNDISK:
|
||
PUSH AF
|
||
LD C,Dss.DRV.Open
|
||
RST ToDSS.DRV
|
||
POP BC
|
||
JP C,NDISK11
|
||
LD A,B
|
||
LD (FatBuffer.DRIVE),A
|
||
CALL RD_BPB
|
||
RET C
|
||
LD A,(LDRIVE)
|
||
AND A
|
||
RET
|
||
NDISK11:
|
||
CP DSS_Error.sys.INVALID_DRIVE
|
||
SCF
|
||
RET Z
|
||
LD A,DSS_Error.sys.NOT_READY
|
||
RET
|
||
*/
|
||
|
||
|
||
CURRDSK: LD A,(FatBuffer.DRIVE)
|
||
AND A
|
||
RET
|
||
|
||
DISKINF: INC A
|
||
JR Z,CURRDS ;R06
|
||
DEC A ;R06
|
||
CALL CHNDISK ;R06
|
||
RET C ;R06
|
||
CURRDS: LD HL,2
|
||
LD BC,0
|
||
FRESP: PUSH BC
|
||
CALL R_F_FAT
|
||
POP BC
|
||
CP DSS_Error.sys.DISK_FULL
|
||
JR Z,FRESP2
|
||
|
||
LD A,E
|
||
OR D
|
||
JR NZ,SKIC
|
||
INC BC
|
||
SKIC: INC HL
|
||
JP FRESP
|
||
|
||
FRESP2: LD D,B
|
||
LD E,C
|
||
LD HL,(MAX_CLU)
|
||
DEC HL
|
||
LD BC,(BootSector.B_P_S)
|
||
LD A,(BootSector.S_P_C)
|
||
AND A
|
||
RET
|
||
|
||
LDRIVE: DB DSS_MAX_DRIVES_AMOUNT
|
||
TDRIVE: DB #00
|
||
TCLUST: DW #0000
|
||
TCOUNT: DW #0000
|
||
|
||
;R04SIZE2CL LD DE,(B_P_C)
|
||
;R04 XOR A
|
||
;R04 SCF
|
||
;R04S2C01 RR D
|
||
;R04 RR E
|
||
;R04 JR C,S2C02
|
||
;R04 RR H
|
||
;R04 RR L
|
||
;R04 RR B
|
||
;R04 RR C
|
||
;R04 JP NC,S2C01
|
||
;R04 LD A,1
|
||
;R04 JP S2C01
|
||
;R04S2C02 OR A
|
||
;R04 RET Z
|
||
;R04 INC BC
|
||
;R04 RET
|
||
|
||
;R04L_SEC_X DW 0
|
||
;R04H_SEC_X DW 0
|
||
|
||
; !FIXIT çñâ ¥ ¨á¯®«ì§ã¥âáï
|
||
TESTDSK:
|
||
; LD A,(FatBuffer.DRIVE)
|
||
; LD C,Dss.DRV.MediaCheck
|
||
; RST ToDSS.DRV
|
||
; OR A
|
||
; RET Z
|
||
RD_BPB: LD C,SLOT3
|
||
IN B,(C)
|
||
PUSH BC
|
||
|
||
IN A,(SLOT0)
|
||
OUT (SLOT3),A
|
||
;R08
|
||
;LD DE,BOOT+#C000
|
||
LD DE,SECBUF+#C000
|
||
;R08
|
||
LD A,(FatBuffer.DRIVE) ;¢ë§®¢ RD_BPB ¬®¦¥â ¢ ¤ «ì¥©è¥¬ ¯® ¤®¡¨âìáï, ¯ã᪠© ® á ¬ ¤®áâ ñâ ¯¥à¥¬¥ãî DRIVE
|
||
|
||
LD C,Dss.DRV.GetBPB
|
||
RST ToDSS.DRV
|
||
POP BC
|
||
OUT (C),B
|
||
JP C,DOS_X_Error.Not_ready
|
||
PUSH IY
|
||
LD DE,#AA55 ;R05
|
||
LD HL,(SECBUF+510) ;R08 ;R07
|
||
;R05
|
||
AND A
|
||
SBC HL,DE
|
||
JP NZ,DOS_X_Error.UnknownBPB
|
||
;R08
|
||
LD HL,SECBUF
|
||
LD DE,BootSector
|
||
LD BC,_sBOOT_SEC ; size
|
||
LDIR
|
||
;
|
||
|
||
LD IY,BootSector
|
||
LD A,(IY+_sBOOT_SEC.ID_FORM)
|
||
CP #F0
|
||
JP C,DOS_X_Error.UnknownBPB
|
||
|
||
;!TEST
|
||
;LD HL,0 ; calc. first sector FAT
|
||
;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 E,(IY+#1C) ;Hidden sec
|
||
; LD D,(IY+#1D)
|
||
; ADD HL,DE
|
||
; LD (FatBuffer.FAT_FRM),HL ; first sector FAT
|
||
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 A,(BootSector.FAT_NUM) ; amount FATs
|
||
CP 1
|
||
JR Z,.loop1
|
||
DEC A
|
||
ADD HL,DE
|
||
LD (FatBuffer.FAT2_XX),HL
|
||
;C_DATA1
|
||
.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)
|
||
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 (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)
|
||
EX DE,HL
|
||
DEC HL
|
||
XOR A
|
||
;NEXTAD2
|
||
.loop2: INC A
|
||
JP Z,DOS_X_Error.UnknownBPB
|
||
SBC HL,BC
|
||
JR NC,.loop2
|
||
|
||
EX DE,HL
|
||
LD C,A ; A - sectors in DIR
|
||
LD B,0
|
||
LD (FatBuffer.DIR_S_S),A
|
||
ADD HL,BC ; Start DATA area
|
||
LD (FatBuffer.DAT_FRM),HL
|
||
;LD HL,0
|
||
LD H,B ; âãâ ¢ B ®«ì ¤®«¦¥ ¡ëâì
|
||
LD L,B
|
||
LD C,(IY+_sBOOT_SEC.B_P_S) ; Size sector
|
||
LD B,(IY+_sBOOT_SEC.B_P_S+1)
|
||
LD A,(BootSector.S_P_C)
|
||
|
||
////////////////////////////////////////////////////////////////////////
|
||
IF COMPILE_UNUSED_CODE
|
||
;!TODO ¥ ¨á¯®«ì§ãîâáï § ç¥¨ï ¢ëç¨á«ï¥¬ë¥ ¨ á®åà ï¥¬ë¥ ¢ FatBuffer
|
||
;NEXTAD3
|
||
.loop3: ADD HL,BC ; calc. cluster size
|
||
DEC A
|
||
JR NZ,.loop3
|
||
|
||
|
||
LD (FatBuffer.CLU_LEN),HL
|
||
EX DE,HL
|
||
LD HL,#3FFF ;!TODO FATcacheSize
|
||
XOR A
|
||
;NEXTAD4
|
||
.loop4: INC A
|
||
JP Z,DOS_X_Error.UnknownBPB
|
||
SBC HL,DE
|
||
JR NC,.loop4
|
||
LD (FatBuffer.C_P_B),A ; A - Clusters per bank (16k)
|
||
ENDIF
|
||
////////////////////////////////////////////////////////////////////////
|
||
|
||
LD HL,BootSector.ID_FAT
|
||
LD DE,FatBuffer.MSG
|
||
LD B,3
|
||
;R_BPBL1
|
||
.loop5: LD A,(DE)
|
||
CP (HL)
|
||
JP NZ,.IBM_DOS
|
||
INC HL
|
||
INC DE
|
||
DJNZ .loop5
|
||
;FID
|
||
.loop6: LD A,(HL)
|
||
INC HL
|
||
CP ' '
|
||
JR Z,.loop6
|
||
|
||
CP '1'
|
||
JP NZ,DOS_X_Error.UnknownBPB
|
||
LD A,(HL)
|
||
CP '6' ; FAT16
|
||
LD HL,#FFFF
|
||
JR Z,.BPB_FAT
|
||
CP '2' ; FAT12
|
||
JP NZ,DOS_X_Error.UnknownBPB
|
||
LD HL,#0FFF
|
||
.BPB_FAT:
|
||
LD (FatBuffer.FAT_TYP),A
|
||
LD (FatBuffer.ENDCLUS),HL
|
||
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)
|
||
.BPB_L1: ; calc. sector per cylinder
|
||
ADD HL,BC
|
||
DEC A
|
||
JR NZ,.BPB_L1
|
||
LD (FatBuffer.S_X_H),HL
|
||
|
||
LD DE,(FatBuffer.DAT_FRM)
|
||
; LD E,(IY+#1C) ;Hidden sec
|
||
; LD D,(IY+#1D)
|
||
; 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 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)
|
||
AND A
|
||
SBC HL,DE
|
||
JP NC,.HDDBIG
|
||
DEC BC
|
||
JP .HDDBIG
|
||
.HDDSMAL:
|
||
;AND A ;âãâ CF ¯®«î¡ á á¡à®è¥ ¤®«¦¥ ¡ëâì
|
||
SBC HL,DE
|
||
LD BC,0
|
||
.HDDBIG: LD A,(BootSector.S_P_C)
|
||
SCF
|
||
.S4C01: RRA
|
||
JR C,.S4C02
|
||
RR B
|
||
RR C
|
||
RR H
|
||
RR L
|
||
JP .S4C01
|
||
.S4C02: INC HL
|
||
LD (MAX_CLU),HL
|
||
POP IY
|
||
; LD DE,FAT
|
||
; LD HL,0
|
||
; LD IX,(FAT_FRM)
|
||
; LD B,3
|
||
; LD A,(DRIVE)
|
||
; LD C,Dss.DRV.Read
|
||
; RST ToDSS.DRV
|
||
; JP C,RDERR1
|
||
LD HL,0
|
||
LD (FATCASH),HL
|
||
|
||
SET_PAGE_X FATPAGE
|
||
|
||
PUSH AF
|
||
XOR A
|
||
CALL RE_FAT
|
||
POP AF
|
||
OUT (SLOT3),A
|
||
CALL R_CLUST
|
||
XOR A
|
||
RET
|
||
|
||
.IBM_DOS:
|
||
LD A,(IY+_sBOOT_SEC.ID_FORM)
|
||
CP #F0
|
||
JR C,DOS_X_Error.UnknownBPB
|
||
;????? ¤® «¨ ¨§¬¥¨âì?
|
||
// OR 2
|
||
// CP #FA ; ID ram-¤¨áª
|
||
CP #F8 ; ¥á«¨ ¥ F8?
|
||
;?????
|
||
LD A,'6'
|
||
LD HL,#FFFF
|
||
JP Z,.BPB_FAT
|
||
|
||
LD A,'2'
|
||
LD HL,#0FFF
|
||
JP .BPB_FAT
|
||
|
||
DOS_X_Error:
|
||
.UnknownBPB:
|
||
POP IY
|
||
LD A,DSS_Error.sys.UNKNOWN_FORMAT
|
||
SCF
|
||
RET
|
||
.Not_ready:
|
||
LD A,DSS_Error.sys.NOT_READY
|
||
;SCF
|
||
RET
|
||
|
||
;!TODO ª ¡ãä¥à ¬!
|
||
FatBuffer:
|
||
.MSG: DB 'FAT'
|
||
.READ_PG: DB #00
|
||
.BLOCK: DB #00
|
||
.DIR_CLU: DW #0000
|
||
.DRIVE: DB #FF
|
||
.FAT_FRM:
|
||
.FAT1_XX: DW #0000 ; MSD_FAT_SEC first sector FAT
|
||
.FAT2_XX: DW #0000
|
||
.DIR_FRH: DW #0000 ; MSD_CAT_SEC first sector DIR
|
||
.DIR_FRL:
|
||
.DIR_FRM: DW #0000 ; MSD_CAT_SEC first sector DIR
|
||
.F_P_S: DB #00 ; ç¨á«® ä ©«®¢ëå § ¯¨á¥© ¢ ᥪâ®à¥
|
||
.DIR_S_S: DB #00 ; DIR_SEC_SIZE
|
||
.DAT_FRM: DW #0000 ; MSD_DAT_SEC
|
||
.CLU_LEN:
|
||
.B_P_C: DW #0000 ; CLUSTER_LEN
|
||
.C_P_B: DB #00 ; A - Clusters per bank (16k) (ç¨á«® ª« áâ¥à®¢ ¡«®ª އ“) ; ????? íâ® ¨á¯®«ì§ã¥âáï?
|
||
.FAT_TYP: DB #00 ; TYPE FAT (#32 - 12bit, #36 - 16bit)
|
||
.S_X_H: DW #0000 ; ª®«¨ç¥á⢮ ᥪâ®à®¢ 樫¨¤à¥ ; ????? íâ® ¨á¯®«ì§ã¥âáï?
|
||
.ENDCLUS: DW #FFFF
|
||
;
|
||
|
||
;!TODO ª ¡ãä¥à ¬!
|
||
DIRSPEC: DB '\'
|
||
;BLOCK DIRSPEC.DEPTH,0 ;????? <20>ë«® 255, ã ‘ ©¬ 256
|
||
BLOCK DIRSPEC.DEPTH-1,0 ;????? <20>ë«® 255, ã ‘ ©¬ 256
|
||
;
|
||
|
||
;R11
|
||
; !TODO ¯®ç¨¨âì
|
||
IF SAVE_PATH_MACRO
|
||
SAVE_CUR_PATH
|
||
PUSH IX
|
||
PUSH IY
|
||
PUSH HL
|
||
PUSH DE
|
||
PUSH BC
|
||
PUSH AF
|
||
|
||
SET_PAGE_X ENVPAGE
|
||
PUSH AF
|
||
|
||
CALL CURRDSK
|
||
ADD A,"A"
|
||
LD HL,TMP_CURDIR
|
||
LD (HL),A
|
||
INC HL
|
||
LD A,":"
|
||
LD (HL),A
|
||
INC HL
|
||
CALL CURRDIR
|
||
|
||
; ¯®ç¥¬ã ¥ POP AF : OUT (SLOT3),A
|
||
//POP BC
|
||
//LD A,B
|
||
//OUT (SLOT3),A
|
||
POP AF
|
||
OUT (SLOT3),A
|
||
;
|
||
;
|
||
POP AF
|
||
POP BC
|
||
POP DE
|
||
POP HL
|
||
POP IY
|
||
POP IX
|
||
RET
|
||
|
||
; !TODO ¯®ç¨¨âì
|
||
BACK_CUR_PATH:
|
||
PUSH IY
|
||
PUSH IX
|
||
PUSH HL
|
||
PUSH DE
|
||
PUSH BC
|
||
PUSH AF
|
||
|
||
SET_PAGE_X ENVPAGE
|
||
PUSH AF
|
||
|
||
LD HL,TMP_CURDIR
|
||
CALL CHDIR
|
||
|
||
; ¯®ç¥¬ã ¥ POP AF : OUT (SLOT3),A
|
||
//POP BC
|
||
//LD A,B
|
||
//OUT (SLOT3),A
|
||
POP AF
|
||
OUT (SLOT3),A
|
||
;
|
||
POP AF
|
||
POP BC
|
||
POP DE
|
||
POP HL
|
||
POP IX
|
||
POP IY
|
||
RET
|
||
ENDIF
|
||
;R11
|
||
|
||
;R12
|
||
;///////////////////////////////////////////////////////////////////////
|
||
; ”ãªæ¨ï #08 (DSS_RESCAN). <20>¥à¥áª ¨à®¢ âì ¤¥¢ ©áë á¨á⥬ë.
|
||
;
|
||
; ¢å®¤: ¥â
|
||
; ¢ë室: A - ®¬¥à ¯®á«¥¤¥£® «®£. ¤¨áª ¢ á¨á⥬¥
|
||
;///////////////////////////////////////////////////////////////////////
|
||
SCANDRV:
|
||
;1 [-----------] [-----------] [-----------] [-----------] [-----------]
|
||
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
|
||
;
|
||
|
||
;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
|
||
LD HL,.old_letter
|
||
LD A,(LDRIVE)
|
||
CP (HL)
|
||
JR NC,.no_change_LDRIVE
|
||
LD A,(HL)
|
||
LD (LDRIVE),A
|
||
.no_change_LDRIVE:
|
||
;
|
||
;;;;;
|
||
.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
|
||
;///////////////////////////////////////////////////////////////////////
|
||
;R12
|
||
|
||
|
||
;GOD EQU 1999-1980*512
|
||
|
||
;FHAND DB " "
|
||
; DB " "
|
||
; DB #20
|
||
; DW 0,0,0,0,0
|
||
; DW #0000
|
||
; DW 5*32+19+GOD
|
||
;SAVEC DW #0000
|
||
;SIZEC DW #0000,#0000
|
||
;=============================================
|
||
;//MODULE: DOS_X
|
||
;[END]
|
||
|