Estex-DSS/DSS/DOS_X.ASM
Anatoliy Belyanskiy 55e6b9b07d ...
2023-11-23 05:40:42 +10:00

796 lines
17 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.

;[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
;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
;/////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #00. ‚¥àá¨ï „Ž‘.
; ‚®§¢à é ¥â ­®¬¥à ¢¥àᨨ ¤¨áª®¢®© á¨á⥬ë.
; ¢å®¤: ­¥â
; ¢ë室: DE = ­®¬¥à ¢¥àᨨ/¬®¤¨ä¨ª æ¨¨
; BC = ­®¬¥à ¡¨«¤  (0..999)
;/////////////////////////////////////////////////////////////////////
VERSION:
;XOR A
;LD H,A ;!TODO ¯¨å âì á OSINFO
;LD L,A
LD HL,0
LD DE,VERS*256+MODF
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
*/
;/////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #02. <20>®¬¥à ⥪ã饣® ¤¨áª .
;
; ¢å®¤: ­¥â
; ¢ë室: A - ­®¬¥à ¤¨áª  (0=A,1=B,..)
;/////////////////////////////////////////////////////////////////////
CURRDSK_FN:
LD A,(CurrentPath)
SUB 'A'
RET NC
LD A,DSS_Error.sys.INVALID_DRIVE
RET
CURRDSK: LD A,(FatBuffer.DRIVE)
AND A
RET
;/////////////////////////////////////////////////////////////////////
; [ ] ­®¢ ï ¯®¤äã­ªæ¨ï á ¡¨â®¬ 7 ¢ ॣ. €
; ‚®§¢à é ¥â ¨­ä®à¬ æ¨î ®¡ ®¡é¥¬ ¨ ᢮¡®¤­®¬ ¯à®áâà ­á⢥ ¤¨áª®¢®£®
; ãáâனá⢠.
;
; ¢å®¤: A - ­®¬¥à ¤¨áª  (0=A,1=B .. 25=Z. #FF-⥪ã騩)
; <09>ਠA bit7 = 1:
; HL - ¡ãä¥à (256 ¡ ©â®¢) ¤«ï à áè¨à¥­­ëå ¤ ­­ëå:
; B != 0 - áç¨â âì ᢮¡®¤­®¥ ¬¥áâ®
; ;
; à §¬¥à ¯®«ï - 1 ¡ ©â
; ” ©«®¢ ï á¨á⥬ 
; ;
; à §¬¥à ¯®«ï - 1 ¡ ©â
; ‘¥à¨©­ë© ­®¬¥à ¤¨áª 
; ;
; à §¬¥à ¯®«ï - 1 ¡ ©â
; Œ¥âª  ¤¨áª 
; ;
; à §¬¥à ¯®«ï - 1 ¡ ©â
; ‡ à¥§¥à¢¨à®¢ ­®...
; ;
; A xor #80 - ­®¬¥à ¤¨áª 
;
; ¢ë室: A - à §¬¥à ª« áâ¥à  ¢ ᥪâ®à å, ¥á«¨ CF=0
; HL - ®¡é¥¥ ª®«-¢® ª« áâ¥à®¢
; DE - ᢮¡®¤­ëå ª« áâ¥à®¢
; BC - à §¬¥à ᥪâ®à  ¢ ¡ ©â å
; A - ª®¤ ®è¨¡ª¨, ¥á«¨ CF=1
;/////////////////////////////////////////////////////////////////////
; [ ] 22/11/23 ¯®¤äã­ªæ¨ï á ¤®¯.¨­ä®©
MACRO _mCOPY_LOOP
LD C,A
LD B,0
LD (DE),A
INC DE
LDIR
; .loop:
; LD (HL),A
; INC DE
; INC HL
; LD A,(DE)
; DJNZ .loop
ENDM
;
DISKINF:; [ ] 22/11/23 ¯®¤äã­ªæ¨ï á ¤®¯.¨­ä®©
CP #80
JR C,.CustomDisk
CP #FF
JR Z,.CurrentDisk
; more info
PUSH HL
AND %0111'1111
CALL .CustomDisk
JR C,.error
;
EX (SP),HL
PUSH AF
PUSH DE
PUSH BC
;;;;
;
EX DE,HL
LD HL,CORE_BUFFERS.BootSector.ID_FAT
LD A,8 ;!HARDCODE _sBOOT_SEC.ID_FAT.length
_mCOPY_LOOP
;
LD HL,CORE_BUFFERS.BootSector.BPB_SERIAL_NUMBER
LD A,4 ;!HARDCODE _sBOOT_SEC.BPB_SERIAL_NUMBER
_mCOPY_LOOP
;
LD HL,CORE_BUFFERS.BootSector.BPB_LABEL
LD A,11 ;!HARDCODE _sBOOT_SEC.BPB_LABEL
_mCOPY_LOOP
;
XOR A
LD (DE),A
;;;;
POP BC
POP DE
POP AF
.error: POP HL
RET
;
;CP #FF ; !FIXIT WorkDirectory
;!TEST Current Dir
;JR Z,CURRDS ;R06
.CurrentDisk:
LD A,(CurrentPath)
SUB 'A'
LD HL,FatBuffer.DRIVE
CP (HL)
JR Z,.CheckFreeSpace
;
.CustomDisk:
PUSH BC
CALL CHNDISK ;R06
POP BC
RET C ;R06
.CheckFreeSpace:
;
XOR A
OR B
CALL NZ,.CURRDS
;
;
.FRESP2:
LD D,B
LD E,C
LD HL,(MAX_CLU)
DEC HL
LD BC,(CORE_BUFFERS.BootSector.B_P_S)
LD A,(CORE_BUFFERS.BootSector.S_P_C)
AND A
RET
;
.CURRDS:
LD HL,2
LD BC,0
.FRESP: PUSH BC
CALL R_F_FAT
POP BC
CP DSS_Error.sys.DISK_FULL
RET Z
LD A,E
OR D
JR NZ,.SKIC
INC BC
.SKIC: INC HL
JP .FRESP
;
; <20>®¬¥à ¯®á«¥¤­¥£® ¤¨áª  ¢ á¨á⥬¥
LDRIVE: DB DSS_MAX_DRIVES_AMOUNT
IF COMPILE_UNUSED_CODE
TDRIVE: DB #00
TCLUST: DW #0000
TCOUNT: DW #0000
ENDIF
;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 çñâ ­¥ ¨á¯®«ì§ã¥âáï
IF COMPILE_UNUSED_CODE
TESTDSK:
LD A,(FatBuffer.DRIVE)
LD C,Dss.DRV.MediaCheck
RST ToDSS.DRV
OR A
RET Z
ENDIF
RD_BPB: LD C,SLOT3
IN B,(C)
PUSH BC
IN A,(SLOT0)
OUT (SLOT3),A
;R08
;LD DE,BOOT+#C000
LD DE,CORE_BUFFERS.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,(CORE_BUFFERS.SECBUF+510) ;R08 ;R07
;R05
AND A
SBC HL,DE
JP NZ,DOS_X_Error.UnknownBPB
;R08
LD HL,CORE_BUFFERS.SECBUF
LD DE,CORE_BUFFERS.BootSector
LD BC,_sBOOT_SEC ; size
LDIR
;
//LD IY,BootSector ; ¯®ª  ¡¥§ ¨­¤¥ªá­®£®, ­® ¬®¦¥â ¯à¨£®¤¨âìáï
//LD A,(IY+_sBOOT_SEC.ID_FORM)
LD A,(CORE_BUFFERS.BootSector.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 HL,(CORE_BUFFERS.BootSector.RESERVE)
;
; LD E,(IY+_sBOOT_SEC.HIDDEN) ;Hidden sec
; LD D,(IY+_sBOOT_SEC.HIDDEN+1)
; 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 DE,(CORE_BUFFERS.BootSector.S_P_F)
LD A,(CORE_BUFFERS.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
; CF = ? ¬ «® «¨
AND A
; CF = 0
//LD C,(IY+_sBOOT_SEC.B_P_S) ; Size sectors
//LD B,(IY+_sBOOT_SEC.B_P_S+1)
LD BC,(CORE_BUFFERS.BootSector.B_P_S)
; 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 A,B
RL C
RLA
RL C
RLA
RL C
RLA
LD C,A
LD B,0 ; BC - File handels in sectors
;;;;
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)
LD DE,(CORE_BUFFERS.BootSector.F_P_DIR)
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
;!TODO ­¥ ¨á¯®«ì§ãîâáï §­ ç¥­¨ï ¢ëç¨á«ï¥¬ë¥ ¨ á®åà ­ï¥¬ë¥ ¢ FatBuffer
////////////////////////////////////////////////////////////////////////
IF COMPILE_UNUSED_CODE
;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 L,(IY+_sBOOT_SEC.B_P_S) ; Size sector
//LD H,(IY+_sBOOT_SEC.B_P_S+1)
LD HL,(CORE_BUFFERS.BootSector.B_P_S) ; Size sector
LD A,(CORE_BUFFERS.BootSector.S_P_C) ;!TODO FATcacheSize
;NEXTAD3
; .loop3: ADD HL,BC ; calc. cluster size
; DEC A
; JR NZ,.loop3
;!TODO ¯à®¢¥à¨âì ¯à ¢¨«ì­® «¨ áç¨â ¥â
XOR 1 ; calc. cluster size
JR Z,.loop3.end
RRA
.loop3: ADD HL,HL
RRA
JP NC,.loop3
.loop3.end:
;
LD (FatBuffer.CLU_LEN),HL
EX DE,HL
LD HL,#3FFF ;!TODO FATcacheSize
XOR A
;NEXTAD4 ;!FIXIT ®¯â¨¬¨§¨à®¢ âì ª®£¤  ¯®­ ¤®¡¨âáï
.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,CORE_BUFFERS.BootSector.ID_FAT ;!!!!!   ¥á«¨ IY ¨á¯®«ì§ã¥âáï ¤«ï ¯¥à¥¬¥­­®£® BootSector, â® ¡ã¤¥â ¡ £ 
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
;!TODO ­¥ ¨á¯®«ì§ãîâáï §­ ç¥­¨ï ¢ëç¨á«ï¥¬ë¥ ¨ á®åà ­ï¥¬ë¥ ¢ FatBuffer
////////////////////////////////////////////////////////////////////////
IF COMPILE_UNUSED_CODE
LD HL,0
//LD C,(IY+_sBOOT_SEC.S_P_T) ; Sector per track
//LD B,(IY+_sBOOT_SEC.S_P_T+1)
LD BC,(CORE_BUFFERS.BootSector.S_P_T) ; Sector per track
LD A,(CORE_BUFFERS.BootSector.HEADS) ;!!!!!   ¥á«¨ IY ¨á¯®«ì§ã¥âáï ¤«ï ¯¥à¥¬¥­­®£® BootSector, â® ¡ã¤¥â ¡ £ 
.BPB_L1: ; calc. sector per cylinder
ADD HL,BC
DEC A
JR NZ,.BPB_L1
LD (FatBuffer.S_X_H),HL
ENDIF
////////////////////////////////////////////////////////////////////////
LD DE,(FatBuffer.DAT_FRM)
; LD E,(IY+_sBOOT_SEC.HIDDEN) ;Hidden sec
; LD D,(IY+_sBOOT_SEC.HIDDEN+1)
; 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 HL,(CORE_BUFFERS.BootSector.S_P_D)
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 HL,(CORE_BUFFERS.BootSector.BPB_BIG_TOTAL_SECTORS)
//LD C,(IY+_sBOOT_SEC.BPB_BIG_TOTAL_SECTORS+2)
//LD B,(IY+_sBOOT_SEC.BPB_BIG_TOTAL_SECTORS+3)
LD BC,(CORE_BUFFERS.BootSector.BPB_BIG_TOTAL_SECTORS+2)
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,(CORE_BUFFERS.BootSector.S_P_C) ;!!!!!   ¥á«¨ IY ¨á¯®«ì§ã¥âáï ¤«ï ¯¥à¥¬¥­­®£® BootSector, â® ¡ã¤¥â ¡ £ 
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,(CORE_BUFFERS.BootSector.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
; CF = 1
RET
;!TODO ª ¡ãä¥à ¬!
FatBuffer:
.MSG: DB 'FAT'
.READ_PG: DB #00 ;!TODO ­¥ ¨á¯®«ì§ãîâáï ­¥ª®â®àë¥ §­ ç¥­¨ï, ­® § ¤ã¬ª  ­¥¯«®å ï)))
.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 ª ¡ãä¥à ¬!
CurrentPath: DB 'X'
DB ':'
CurrentDirectory: DB '\'
.DEPTH: EQU DIRECTORY_PATH_LENGTH
BLOCK CurrentDirectory.DEPTH,0 ; ­¥ .DEPTH-1 ç⮡ ¡ë« 0 ¢ ª®­æ¥
IF SAVE_PATH_CODE
WorkDirectory: DB '\'
.DEPTH: EQU DIRECTORY_PATH_LENGTH
BLOCK WorkDirectory.DEPTH,0 ; ­¥ .DEPTH-1 ç⮡ ¡ë« 0 ¢ ª®­æ¥
ELSE
WorkDirectory EQU CurrentDirectory
.DEPTH EQU CurrentDirectory.DEPTH
ENDIF
;R12
;///////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #08 (DSS_RESCAN). <20>¥à¥áª ­¨à®¢ âì ¤¥¢ ©áë á¨á⥬ë.
;
; ¢å®¤: ­¥â
; ¢ë室: A - ­®¬¥à ¯®á«¥¤­¥£® «®£. ¤¨áª  ¢ á¨á⥬¥
;///////////////////////////////////////////////////////////////////////
; INCLUDE 'ScanDRV.asm'
;!TODO ª®¤ ¤¨ª® ª®áâë«ì­ë© ¨ ¡ã¤¥â ¯¥à¥¤¥« ­ ¢¬¥áâ¥ á ¯à®æ¥¤ãன INITDVC
SCANDRV:
; 1. § ¯®¬¨­ ¥¬ á®áâ®ï­¨¥ ¯à¥à뢠­¨©
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
LD A,R
DI
PUSH AF
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
; 2. ã§­ ñ¬ ¡ãª¢ã ¡ãâ-¤¨áª 
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
CALL GETBOOT
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
; 3. ¢ë§ë¢ ¥¬ à¥áª ­
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
; A = Boot disk
LD B,A
LD A,Dss.DRV.RescanDRV
LD C,Dss.DRV.RescanDRV
RST ToDSS.DRV
LD (LDRIVE),A
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
; 4. ¢ë室
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
POP AF
RET PO
EI
RET
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
;///////////////////////////////////////////////////////////////////////
;
;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]
;R11
; 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_AUTO
; LD (HL),A
; INC HL
; LD A,":"
; LD (HL),A
; INC HL
; CALL CURRDIR_FN
;
; POP AF
; OUT (SLOT3),A
;
; POP AF
; POP BC
; POP DE
; POP HL
; POP IY
; POP IX
; RET
;
; BACK_CUR_PATH:
; RET NC
; .force: PUSH IY
; PUSH IX
; PUSH HL
; PUSH DE
; PUSH BC
; PUSH AF
;
; SET_PAGE_X ENVPAGE
; PUSH AF
;
; LD HL,TMP_CURDIR_AUTO
; CALL CHDIR
;
; POP AF
; OUT (SLOT3),A
;
; POP AF
; POP BC
; POP DE
; POP HL
; POP IX
; POP IY
; RET
; ENDIF
;