-bug in NSECTOR сам затупил, сам починил.

Рефакторинг
This commit is contained in:
Anatoliy Belyanskiy 2023-12-01 02:05:37 +10:00
parent 5cf26d589f
commit 0e38bd4a91
36 changed files with 3821 additions and 3784 deletions

View File

@ -523,27 +523,61 @@ SMALL_CLUSTER:
; HL - CLUSTER
; HL:IX - SECTOR
NSECTOR DEC HL
; NSECTOR:
; DEC HL
; DEC HL
; EX DE,HL
; LD A,(BOOT.S_P_C)
; LD B,A
; LD HL,0
; LD IX,0
; ADD_DE1 ADD IX,DE
; JP NC,ADD_DE2
; INC HL
; ADD_DE2 DJNZ ADD_DE1
; LD DE,(DAT_FRM)
; ADD IX,DE
; LD DE,#0000
; ADC HL,DE
; LD DE,(DISKL)
; ADD IX,DE
; LD DE,(DISKH)
; ADC HL,DE
; RET
NSECTOR:
LD DE,0
DEC HL
DEC HL
EX DE,HL
LD A,(BOOT.S_P_C)
LD B,A
LD HL,0
LD IX,0
ADD_DE1 ADD IX,DE
JP NC,ADD_DE2
INC HL
ADD_DE2 DJNZ ADD_DE1
LD DE,(DAT_FRM)
XOR 1
JR Z,.skip
;
RRA
.loop: ADD HL,HL
RL E
RL D
;
RRA
JP NC,.loop
;
.skip: EX DE,HL
LD XL,E
LD XH,D
LD DE,(DAT_FRM) ;first data sector
XOR A
ADD IX,DE
LD DE,#0000
LD D,A
LD E,A
ADC HL,DE
;
LD DE,(DISKL)
ADD IX,DE
LD DE,(DISKH)
ADC HL,DE
RET
;-----------------
;!TODO ᤥ« âì íâ® ¬ ªà®á ¬¨ ¨«¨ ¨­ª«î¤ ¬¨ ã­¨¢¥àá «ì­ë¬¨. ¯®¢â®àïîâáï ¢ ¤®á¥ ¨ ¥éñ £¤¥-â®
; HL - CLUSTER
@ -611,15 +645,15 @@ R_F_00 INC A ; HL - FAT OFFSET
R_F_F01 LD A,E
AND #F0
RR D ; ¢¯à ¢® ­  4 ¡¨âa
RRA
RR D
RRA
RR D
RRA
RR D
RRA
LD E,A
RR D
RR E
RR D
RR E
RR D
RR E
RR D
RR E
R_F_F02 LD HL,#0FEF
XOR A
SBC HL,DE

180
DSS/API.asm Normal file
View File

@ -0,0 +1,180 @@
;[BEGIN]
;//MODULE: DOS_X
;//CREATE: 19-05-1998 AUTHOR: Denis Parinov
;//UPDATE: 24-10-1999 DNS Restore module
;---------------------------------------------------------------
;Rev Date Name Description
;---------------------------------------------------------------
;R011 17-04-2023 BAO ‚६¥­­ë© ª®áâë«ì ¤«ï ­¥¤®¯ã᪠­¨ï ¯¥à¥¯®«­¥­¨ï ¡ãä¥à  ¯ã⨠ª â «®£ 
;R010 15-04-2023 BAO FIXED BUG WITH CHANGE DISK WITHOUT CHANGE PATH
;R009 13-04-2023 BAO FIX BUG WITH PARSING DIRECTORY BUFFER
;R13 06-04-2023 BAO ”ã­ªæ¨î SETBOOT ¬®¦­® ¢ë§¢ âì ⮫쪮 à § (¥á«¨ § ¢¥àè¨âáï ª®à४⭮)
;R12 03-04-2023 BAO „®¡ ¢«¥­  äã­ªæ¨ï à¥áª ­  ¤à ©¢®¢ LD C,8 : RST #10
;R008 - 15-04-2003 DNS SAVE AND RESTORE CUR-PATH MACROS
;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.
;R007 06-02-2003 DNS FIX BUG IN MASK ROUTINE, IT ALLOW NAMES WHICH BEGAN FROM "." ".NAM"
;R006 29-01-2003 DNS FIX BUG WITH SET FILE DATE AND TIME
;R005 26-11-2002 DNS FIX ERROR IN CHDIR, DON'T ALLOWED "." FOR ROOT
;R004 19-11-2002 DNS DON'T ALLOW DIR & LABEL ATTR FOR FILES
;R003 19-11-2002 DNS ADD RESET OF VOLUME LABEL ATTRIBUT
;R002 19-11-2002 DNS FIX GET/SET ATTRIBUTES
;R08 14-11-2002 DNS IMPROVE BPB-FUNCTION
;R07 17-12-1999 DNS BUG FIX SIGNATURE #55AA AT 510 OFFSET
;R001 16-12-1999 DNS Y2K fix
;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"
;
;---------------------------------------------------------------
include 'API/Version.asm'
include 'API/bootDsk.asm'
include 'API/curDisk.asm'
include 'API/diskINF.asm'
include 'API/ScanDRV.asm'
include 'API/Attribute.asm'
include 'API/Create.asm'
include 'API/Delete.asm'
include 'API/Rename.asm'
include 'API/Open.asm'
include 'API/Close.asm'
include 'API/Find.asm'
include 'API/ChnDisk.asm'
include 'API/CurrDir.asm'
include 'API/Time.asm'
include 'API/GetDateTime.asm'
include 'API/SetDateTime.asm'
include 'API/ChDir.asm'
include 'API/MkDir.asm'
include 'API/RmDir.asm'
include 'API/DosName.asm'
;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
;
;R04
;SIZE2CL: LD DE,(B_P_C)
; XOR A
; SCF
;S2C01: RR D
; RR E
; JR C,S2C02
; RR H
; RR L
; RR B
; RR C
; JP NC,S2C01
; LD A,1
; JP S2C01
;S2C02: OR A
; RET Z
; INC BC
; RET
;L_SEC_X: DW 0
;H_SEC_X: DW 0
;
;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
;

81
DSS/API/Attribute.asm Normal file
View File

@ -0,0 +1,81 @@
////////////////////////////////////////////////////////////////////////
; INPUT: HL - "C:\DIR1\DIR2\filename.ext",#00
; A - ATTRIB
; B - MODE
; B = 0 GET ATTRIB
; B = 1 SET ATTRIB
; OUTPUT: A - ATTRIB
////////////////////////////////////////////////////////////////////////
ATTRIB: ;!TEST Current Dir ;[x] 15/10/23
LD C,A
PUSH HL
PUSH BC
CALL DIR_PATH_CHECK
POP BC
POP HL
RET C
LD A,C
;
;
INC B
DEC B
JP Z,.READ
DEC B
JP Z,.WRITE
LD A,DSS_Error.sys.INVALID_FUNCTION
SCF
RET
.READ: ;!TEST ;[x] 16/11/23 optimize get attribute
;XOR A
;
CALL .OPENATR ;R002
RET C
;!TEST ;[x] 16/11/23 optimize get attribute
LD A,(HANDBUF+_sFM.ATTRIBUT)
;LD B,(IY+_sFM.ATTRIBUT)
;PUSH BC
;CALL CLOSE
;POP BC
;RET C
;LD A,B
;
RET
;
.WRITE: PUSH AF
XOR A
;!TEST ;[x] 16/11/23 optimize get attribute
LD (OPEN_FN.TMP),A
;
CALL .OPENATR ;R002
;!TEST ;[x] 16/11/23 optimize get attribute
CALL NC,OPEN_FN.FM
;
POP BC
RET C
SET 7,(IY+_sFM.ACCESS_MODE)
RES 3,B ;CLEAR LABEL ATTR ;R003 ;!HARDCODE attribute bit
LD (IY+_sFM.ATTRIBUT),B
PUSH BC
CALL CLOSE_FN
.error: POP BC
RET C
LD A,B
RET
;R002
.OPENATR:
;!TEST ;[x] 16/11/23 optimize get attribute
;LD (OPEN.TMP),A ; à ¡. ï祩ª  (§¤¥áì  âਡãâ § ¯¨á¨)
;
CALL GETWORD ; â¥áâ ­  ¤®¯ãáâ. ¨¬ï ¨ ­ áâà. ­  ¤¨áª
RET C
CALL MASK
RET C
LD A,FAT_ATTR.NoVolID
;!TEST ;[x] 16/11/23 optimize get attribute
JP SEARCH.Custom
;CALL SEARCH.Custom
;RET C ; § ¯¨áì ­¥ ­ ©¤¥­ 
;JP OPEN.FM ; ­  ¯®¨áª ᢮¡. ¤¥áªà¨¯â®à 
;
;
;R002

35
DSS/API/ChDir.asm Normal file
View File

@ -0,0 +1,35 @@
////////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #1D. ‘¬¥­  ⥪ã饣® ª â «®£ .
; Œ¥­ï¥â ⥪ã騩 ª â «®£ ¨ ⥪ã騩 ¤¨áª, ¥á«¨ ®­ 㪠§ ­ ¢ ä ©«®¢®©
; ᯥæ¨ä¨ª æ¨¨. …᫨ ¯ãâì ­ ç¨­ ¥âáï á "\" - íâ® ®§­ ç ¥â ¯ãâì ®â
; ª®à­¥¢®£® ª â «®£ , ¨­ ç¥ ®â ⥪ã饣®.
;
; ¢å®¤: HL - 㪠§ â¥«ì ­  ¨¬ï ª â «®£ 
; ¢ë室: ­¥â
;
; INPUT: HL - "C:\DIR\DIR\DIR_NAME[\]",0
////////////////////////////////////////////////////////////////////////
CHDIR_FN:
;!TEST Current Dir ;[x] 15/10/23
PUSH HL
CALL DIR_PATH_CHECK
POP HL
RET C
CALL CHDIR
; ¥á«¨ 㤠筮, â® ª®¯¨à㥬 WorkDirectory ¢ CurrentDirectory
JP NC,DIR_PATH_CHANGE.FullCurrent
; ¥á«¨ ­¥ã¤ ç­®, â® ¢®§¢à é ¥¬áï â㤠 ®âªã¤  ¯à¨è«¨
PUSH AF
LD HL,CurrentDirectory
CALL CHDIR
POP AF
RET
;
CHDIR: CALL GETWORD ; â¥áâ ­  ¤®¯ãáâ. ¨¬ï ¨ ­ áâà. ­  ¤¨áª
RET C
LD HL,TMPNAME
LD A,(HL)
OR A
CALL NZ,OPENDIR
RET
;

25
DSS/API/ChnDisk.asm Normal file
View File

@ -0,0 +1,25 @@
////////////////////////////////////////////////////////////////////////
;
;
////////////////////////////////////////////////////////////////////////
CHNDISK_FN:
CALL CHNDISK
RET C
PUSH AF
CALL DIR_PATH_CHANGE.FullCurrent
POP AF
RET
CHNDISK:;[x] ¡®«¥¥ ª®à४⭠ï ᬥ­  ¤¨áª 
CALL OPENDSK
;
;R010
RET C
LD HL,WorkDirectory
LD (HL),0
PUSH AF
CALL OPENDIR
POP BC
RET C
LD A,B
RET
;

74
DSS/API/Close.asm Normal file
View File

@ -0,0 +1,74 @@
////////////////////////////////////////////////////////////////////////
;‚室­ë¥ §­ ç¥­¨ï:
; C - #12
; A - ä ©«®¢ë© ¬ ­¨¯ã«ïâ®à
;‚ë室­ë¥ §­ ç¥­¨ï:
; A - ª®¤ ®è¨¡ª¨, ¥á«¨ CF=1
////////////////////////////////////////////////////////////////////////
CLOSE_FN:
;R008 ;
;CLOSE: ;
LD (.TMP),A
CALL SET_FM
RET C
LD A,(TASK)
CP (IY+_sFM.TASK_NUM)
LD A,DSS_Error.sys.ACCESS_DENIED
SCF
RET NZ
BIT 7,(IY+_sFM.ACCESS_MODE)
JR Z,.NOTMODF
LD E,(IY+_sFM.DIR_CLUSTER)
LD D,(IY+_sFM.DIR_CLUSTER+1)
PUSH DE
; [x] 15/11/2023 -bug with bad clusters ;!TEST
LD A,(IY+_sFM.DRIVE)
CALL OPENDSK
;
XOR A
CALL SET_FM
POP DE
LD (IY+_sFM.DIR_CLUSTER),E
LD (IY+_sFM.DIR_CLUSTER+1),D
; [x] 15/11/2023 -bug with bad clusters ;!TEST
LD (IY+_sFM.ST_CLUSTER),E
LD (IY+_sFM.ST_CLUSTER+1),D
;
CALL LOADDIR
.TMP+1: LD A,0
CALL SET_FM
;
SET_PAGE_X DIRPAGE
;
;TEST 9/11/23
; LD HL,DIR
; LD DE,#0020
; LD C,(IY+_sFM.HANDLE)
; LD B,(IY+_sFM.HANDLE+1)
; JR .CLOSE2
; .CLOSE1:
; ADD HL,DE
; DEC BC
; .CLOSE2:
; LD A,B
; OR C
; JR NZ,.CLOSE1
LD L,(IY+_sFM.HANDLE)
LD H,(IY+_sFM.HANDLE+1)
;
LD D,YH
LD E,YL
EX DE,HL
;PUSH HL
;SET_PAGE_X DIRPAGE
;POP HL
LD BC,#0020 ;!HARDCODE
LDIR
OUT (SLOT3),A
CALL SAVEDIR
.NOTMODF:
LD A,(.TMP)
;CALL RES_FM
JP RES_FM
;RET
;

82
DSS/API/Create.asm Normal file
View File

@ -0,0 +1,82 @@
////////////////////////////////////////////////////////////////////////
; INPUT: HL - "C:\DIR1\DIR2\filename.ext",#00
; OUTPUT: A - FM
////////////////////////////////////////////////////////////////////////
CREATE: ;!TEST Current Dir ;[x] 15/10/23
PUSH HL
CALL DIR_PATH_CHECK
POP HL
RET C
;
CALL .Prepare
RET C
CALL SEARCH.File
CALL NC,DEL_FN.DELETE ;FILE EXIST RECREAT
JR .DO
;
.NEW: ;!TEST Current Dir ;[x] 15/10/23
PUSH HL
CALL DIR_PATH_CHECK
POP HL
RET C
;
CALL .Prepare
RET C
CALL SEARCH.File
LD A,DSS_Error.sys.FILE_EXISTS
CCF
RET C
;
.DO: LD HL,MASKARE
LD DE,HANDBUF
LD BC,11
LDIR
EX DE,HL
.TMP+1: LD A,0
LD (HL),A
INC HL
LD BC,#0A00 ;!HARDCODE
;
.loop1: LD (HL),C
INC HL
DJNZ .loop1
;
PUSH HL
CALL SYSTIME
CALL MK_TIME
POP HL
LD (HL),E
INC HL
LD (HL),D
INC HL
LD (HL),C
INC HL
LD (HL),B
INC HL
LD BC,#0600
;
.loop2: LD (HL),C
INC HL
DJNZ .loop2
;
CALL WRT_HND
RET C
;CALL SAVEDIR
.PATH0+1:
LD HL,0
XOR A
LD (OPEN_FN.TMP),A
JP OPEN_FN.FILE ;R008
.Prepare:
AND #E7 ;R004 %76A00SHR = !FAT_ATTR ;!HARDCODE
LD (.TMP),A
LD (.PATH0),HL
CALL GETWORD
RET C
; LD HL,TMPNAME
; LD DE,MASKARE
JP MASK
; INPUT: HL - "C:\DIR1\DIR2\filename.ext",#00
; OUTPUT: A - FM
CREAT_N EQU CREATE.NEW
;

24
DSS/API/CurrDir.asm Normal file
View File

@ -0,0 +1,24 @@
////////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #1E. ˆ­ä®à¬ æ¨ï ® ⥪ã饬 ª â «®£¥.
;
; ¢å®¤: HL - ¡ãä¥à ¢ ¯ ¬ï⨠256 ¡ ©â
; ¢ë室: A - ª®¤ ®è¨¡ª¨, ¥á«¨ CF=1
////////////////////////////////////////////////////////////////////////
CURRDIR: LD DE,WorkDirectory
JR CURRDIR_FN.skip
CURRDIR_FN:
LD DE,CurrentDirectory
.skip: EX DE,HL
LD BC,DIRECTORY_PATH_LENGTH ;[x] 15/11/2023 ¬®£«® ¢ë©â¨ §  ¯à¥¤¥«ë ¡ãä¥à 
XOR A
.loop: CP (HL)
LDI
JP PO,.error ;[x] 15/11/2023 ¬®£«® ¢ë©â¨ §  ¯à¥¤¥«ë ¡ãä¥à 
JR NZ,.loop
RET
;[x] 15/11/2023 ¬®£«® ¢ë©â¨ §  ¯à¥¤¥«ë ¡ãä¥à 
.error: LD A,DSS_Error.sys.TOO_DEEP_DIR_DEPTH
SCF
RET
;
;

51
DSS/API/Delete.asm Normal file
View File

@ -0,0 +1,51 @@
////////////////////////////////////////////////////////////////////////
; INPUT: HL - "c:\dir\filename.ext",#00 without simbols * ?
////////////////////////////////////////////////////////////////////////
DEL_FN: ;!TEST
;!TEST Current Dir ;[x] 15/10/23
PUSH HL
CALL DIR_PATH_CHECK
POP HL
RET C
;
CALL GETWORD ; â¥áâ ­  ¤®¯ãáâ. ¨¬ï ¨ ­ áâà. ­  ¤¨áª
RET C
CALL MASK
RET C
;
;!TEST optimization
;LD HL,MASKARE
;LD BC,11
;LD A,"?"
;CPIR
;LD A,DSS_Error.sys.INVALID_NAME
;SCF
CALL CHECK_NAME
;
RET Z
CALL LOADDIR
CALL SEARCH.File
RET C
;JP .DELETE
; ¯®¬¥â¨âì § ¯¨áì ª ª "㤠«¥­­ ï"
.DELETE: SET_PAGE_X DIRPAGE
LD (IX+_sFM.NAME),#E5 ; ¯à¨§­ ª 㤠«¥­¨ï ä ©« 
LD E,(IX+_sFM.ST_CLUSTER) ; ü ¯¥à¢®£® ª« áâ¥à 
LD D,(IX+_sFM.ST_CLUSTER+1)
;
OUT (SLOT3),A
LD A,E
OR D
JP Z,SAVEDIR ; á¡à®á¨âì ª¥è ª â «®£  ­  ¤¨áª
.loop: EX DE,HL ; hl=­®¬¥à ª« áâ¥à 
CALL R_F_FAT ; ¯à®ç¨â âì ¨§ ª¥è  FAT-  ­®¬¥à á«¥¤. ª« áâ¥à 
PUSH DE ; ­®¬¥à á«¥¤. ª« áâ¥à 
PUSH AF
LD DE,#0000 ; ­®¬¥à ª« áâ¥à 
CALL W_T_FAT ; § ¯¨á âì ¢ ª¥è FAT-  ­®¬¥à ª« áâ¥à 
POP AF
POP DE
JP NC,.loop
CALL WR_FAT
JP SAVEDIR ; á¡à®á¨âì ª¥è ª â «®£  ­  ¤¨áª
;

22
DSS/API/DosName.asm Normal file
View File

@ -0,0 +1,22 @@
////////////////////////////////////////////////////////////////////////
;‚室­ë¥ §­ ç¥­¨ï:
; C - #44
; B = 0, ¯à¥®¡à §®¢ âì ¨§ 11 ᨬ¢®«ì­®£® ä®à¬ â  ¢ ä®à¬ â „Ž‘
; HL - 11 ᨬ¢®«®¢ ¨¬¥­¨ ä ©« 
; DE - ¡ãä¥à ¤«ï ¨¬¥­¨ ¢ ä®à¬ â¥ „Ž‘
; B = 1, ¯à¥®¡à §®¢ âì ¨§ ä®à¬ â  „Ž‘ ¢ 11 ᨬ¢®«ì­ë© ä®à¬ â
; HL - ¨¬ï ä ©«  ¢ ä®à¬ â¥ „Ž‘
; DE - 11 ᨬ¢®«®¢ ¨¬¥­¨ ä ©« 
;‚ë室­ë¥ §­ ç¥­¨ï:
; A - ª®¤ ®è¨¡ª¨, ¥á«¨ CF=1
////////////////////////////////////////////////////////////////////////
DOSNAME:
INC B
DEC B
JP Z,GetName
DEC B
JP Z,MASK.custom
LD A,DSS_Error.sys.INVALID_FUNCTION
SCF
RET
;

126
DSS/API/Find.asm Normal file
View File

@ -0,0 +1,126 @@
////////////////////////////////////////////////////////////////////////
;‚室­ë¥ §­ ç¥­¨ï:
; C - #19
; HL - 㪠§ â¥«ì ­  ä ©«®¢ãî ᯥæ¨ä¨ª æ¨î
; DE - à ¡®ç¨© ¡ãä¥à 44 ¡ ©â , ¥á«¨ B=0, ¨­ ç¥ 256 ¡ ©â
; ;!!!!! ­  á ¬®¬ ¤¥«¥ ᥩç á ¥á«¨ B=1, à ¡®ç¨© ¡ãä¥à 46 ¡ ©â
; A -  âਡãâë, ¨á¯®«ì§ã¥¬ë¥ ¯à¨ ¯®¨áª¥
; B = 0 - ¨¬ï ­ ©¤¥­­®£® ä ©«  ¢ ä®à¬ â¥ 11 ¡ ©â "FilenameExt"
; B = 1 - ¨¬ï ­ ©¤¥­­®£® ä ©«  ¢ ä®à¬ â¥ DOS "filename.ext",0
;‚ë室­ë¥ §­ ç¥­¨ï:
; A - ª®¤ ®è¨¡ª¨, ¥á«¨ CF=1
////////////////////////////////////////////////////////////////////////
F_FIRST:
; Current Dir [x] 15/10/23
; LD C,A
; PUSH HL
; PUSH DE
; PUSH BC
; CALL DIR_PATH_CHECK
; POP BC
; POP DE
; POP HL
; RET C
; LD A,C
; ;
LD (.TMP),A
LD (.DTABUF),DE
LD A,B
LD (.FNDMODE),A
PUSH HL
;!TEST Current Dir ;[x] 15/10/23
CALL DIR_PATH_CHECK
RET C
;
CALL LOADDIR
POP HL
CALL GETWORD
RET C
CALL MASK
RET C
LD A,(.TMP)
CALL SEARCH.Custom
RET C
LD HL,MASKARE
.DTABUF+1:
LD DE,0
LD BC,11 ;!HARDCODE
LDIR
.TMP+1: LD A,0
LD (DE),A
.FIND_S:
INC DE
LD BC,#0020
ADD IX,BC
LD (F_NEXT.CURHND),IX
LD HL,HANDBUF+12 ;!HARDCODE
LD BC,HANDBUF.SIZE-12 ;????? ¬¥âªã ¢¬¥áâ® ç¨á« ?
LDIR
LD A,(HANDBUF+11)
LD (DE),A
INC DE
LD HL,HANDBUF
.FNDMODE+1:
LD A,0
OR A
JR NZ,.FIND_M2
LD BC,11 ;!HARDCODE
LDIR
LD A,F_NEXT.NO_NEXT.NO
LD (F_NEXT.NO_NEXT),A
XOR A
RET
.FIND_M2:
CALL GetName
LD A,F_NEXT.NO_NEXT.NO
LD (F_NEXT.NO_NEXT),A
XOR A
RET
////////////////////////////////////////////////////////////////////////
;
;
////////////////////////////////////////////////////////////////////////
F_NEXT:
.NO_NEXT.YES EQU 0
.NO_NEXT.NO EQU #FF
.NO_NEXT+1:
LD A,0
OR A
LD A,DSS_Error.sys.INVALID_ACCESS
SCF
RET Z
LD (F_FIRST.DTABUF),DE
EX DE,HL
LD DE,MASKARE
LD BC,11 ;!HARDCODE
LDIR
XOR A ; F_NEXT.NO_NEXT.YES
LD (F_NEXT.NO_NEXT),A
LD A,(HL)
PUSH HL
CALL .NSEARCH
POP DE
RET C
JP F_FIRST.FIND_S
.NSEARCH:
EX AF,AF'
SET_PAGE_X DIRPAGE
;PUSH AF
EX AF,AF'
CPL
LD C,A
;TEST 9/11/23
; EXX
; LD DE,0
; EXX
;
.CURHND+2:
LD IX,0
LD A,XH
OR XL
JP Z,SEARCH.error_too_many_files
JP SEARCH.loop
;

24
DSS/API/GetDateTime.asm Normal file
View File

@ -0,0 +1,24 @@
////////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #17. ˆ­ä®à¬ æ¨ï ® ¤ â¥ ¨ ¢à¥¬¥­¨ ä ©« .
;
; ¢å®¤: A - ¤¥áªà¨¯â®à ä ©« 
; ¢ë室: D - ¤¥­ì
; E - ¬¥áïæ
; IX - £®¤
; H - ç á
; L - ¬¨­ãâë
; B - ᥪ㭤ë
; A - ª®¤ ®è¨¡ª¨, ¥á«¨ CF=1
////////////////////////////////////////////////////////////////////////
GET_D_T:
CALL SET_FM
RET C
; ¢à¥¬ï/¤ âã ¨§ áâàãªâãàë ¤¥áªà.
LD E,(IY+_sFM.TIME) ; ¢à¥¬ï
LD D,(IY+_sFM.TIME+1) ;
LD C,(IY+_sFM.DATE) ; ¤ â 
LD B,(IY+_sFM.DATE+1) ;
CALL RMKTIME ; à áª®¤¨à®¢ âì ¢à¥¬ï/¤ âã
AND A
RET
;

167
DSS/API/MkDir.asm Normal file
View File

@ -0,0 +1,167 @@
////////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #1B. ‘®§¤ ­¨¥ ª â «®£ .
;
; ¢å®¤: HL - 㪠§ â¥«ì ­  ¨¬ï ª â «®£ 
; ¢ë室: A - ª®¤ ®è¨¡ª¨, ¥á«¨ CF=1
;
; INPUT: HL - "C:\DIR\DIR\DIR_NAME",0
////////////////////////////////////////////////////////////////////////
MKDIR: ;!TEST Current Dir ;[x] 15/10/23
PUSH HL
CALL DIR_PATH_CHECK
POP HL
RET C
CALL .START
PUSH AF
LD HL,CurrentDirectory
CALL CHDIR
POP AF
RET
;
.START: CALL GETWORD ; â¥áâ ­  ¤®¯ãáâ. ¨¬ï ¨ ­ áâà. ­  ¤¨áª
RET C
;LD HL,TMPNAME ; 8.3 ¨¬ï
;LD DE,MASKARE ; ¡ãä¥à ¨¬¥­¨ 11 ᨬ¢. ä®à¬ â 
CALL MASK ; ¯à¥®¡à. ¨¬ï 8.3 -> 11 ä®à¬ â
RET C
;!TEST optimization à ­¥¥ GETWORD 㦥 § £à㧨« ¤¨à¥ªâ®à¨î
;CALL LOADDIR ; ¯à®ç¨â âì ᯨ᮪ ª â «®£ 
;
CALL SEARCH.Dir ; ¯®¨áª § ¯¨á¨ ª â «®£  ¢ ᯨ᪥ ¤¨áª 
LD A,DSS_Error.sys.DIR_EXISTS
CCF
RET C ; ª â «®£ ­ ©¤¥­
;
CALL G_CLUST
RET C
PUSH HL
LD DE,(FatBuffer.ENDCLUS) ; ­®¬¥à ª« áâ¥à 
CALL W_T_FAT ; § ¯¨á âì ¢ ª¥è FAT-  ­®¬¥à ª« áâ¥à 
CALL WR_FAT ; ¯®¤ª«. ¡ ­ªã ª¥è  FAT ¨ § ¯¨á âì ¥£® ­  ¤¨áª
LD HL,MASKARE
LD DE,HANDBUF
LD BC,11
LDIR
EX DE,HL
LD A,#10 ;  âਡãâ § ¯¨á¨ ª â «®£ 
LD (HL),A
INC HL
LD BC,#0A00 ; b=áç¥â稪
;
.loop1: LD (HL),C
INC HL
DJNZ .loop1
;
PUSH HL
CALL SYSTIME ; ã§­ âì ⥪. ¤ âã ¨ ¢à¥¬ï
CALL MK_TIME ; § ª®¤¨à®¢ âì ¢à¥¬ï/¤ âã
POP HL
LD (HL),E ; de=¢à¥¬ï
INC HL
LD (HL),D
INC HL
LD (HL),C ; ¤¥­ì
INC HL
LD (HL),B ; ¬¥áïæ
INC HL
POP DE
PUSH DE
LD (HL),E
INC HL
LD (HL),D
INC HL
LD BC,#0400 ; b=áç¥â稪
;
.loop2: LD (HL),C
INC HL
DJNZ .loop2
;
CALL WRT_HND ; ᪮¯¨à. ­®¢ãî § ¯¨áì ¢ ᯨ᮪ ¤¨áª  (ª â «®£ )
;CALL SAVEDIR ; ¨ á¡à®á¨âì ª¥è ª â «®£  ­  ¤¨áª
LD HL,CORE_BUFFERS.SECBUF ; ¡ãä¥à
LD (HL),"." ; § ¯¨áì ⥪. ª â «®£ 
LD BC,10*256 + ' ' ; b=áç¥â稪, c=¯à®¡¥«
;
.loop3: INC HL
LD (HL),C
DJNZ .loop3
;
INC HL
LD DE,HANDBUF+11 ; ï祩ª   âਡã⮢ ä ©« 
EX DE,HL
LD BC,21
LDIR
EX DE,HL
LD (HL),"." ; § ¯¨áì த¨â. ª â «®£ 
INC HL
LD (HL),"."
LD BC,9*256 + ' ' ; b=áç¥â稪, c=¯à®¡¥«
.MKD03: INC HL
LD (HL),C
DJNZ .MKD03
;
INC HL
SET_PAGE_X DIRPAGE
PUSH AF
;
LD A,(DIRPAGE.buffer)
CP "."
LD DE,DIRPAGE.buffer+11 ;  âਡãâë § ¯¨á¨ ;!HARDCODE
JP Z,.MKD04
LD IX,HANDBUF
XOR A
LD (IX+_sFM.ST_CLUSTER),A
LD (IX+_sFM.ST_CLUSTER+1),A
LD DE,HANDBUF+11 ; ï祩ª   âਡã⮢ ä ©« 
.MKD04: EX DE,HL
LD BC,HANDBUF.SIZE-11
LDIR
POP AF
OUT (SLOT3),A
;
EX DE,HL
LD D,H
LD E,L
INC DE
LD (HL),0
LD BC,512-65 ;!HARDCODE
LDIR
;
POP HL
CALL NSECTOR
LD A,(CORE_BUFFERS.BootSector.S_P_C) ; ᥪâ®à®¢ ­  ª« áâ¥à
.MKD12: PUSH AF
PUSH HL ; áâ. à §àï¤
PUSH IX ; ­®¬¥à «®£. ᥪâ®à 
IN A,(SLOT3)
PUSH AF
IN A,(SLOT0)
OUT (SLOT3),A
;
LD A,(FatBuffer.DRIVE)
LD DE,CORE_BUFFERS.SECBUF+#C000
LD BC,1*256 + Dss.DRV.Write
RST ToDSS.DRV
;
POP AF
OUT (SLOT3),A
;
LD HL,CORE_BUFFERS.SECBUF
LD DE,CORE_BUFFERS.SECBUF+1
LD BC,511
LD (HL),0
LDIR
;
POP IX
POP HL
INC IX
LD A,XH
OR XL
JR NZ,.MKD11
INC HL
.MKD11 POP AF
DEC A
JR NZ,.MKD12
AND A
RET
;

69
DSS/API/Open.asm Normal file
View File

@ -0,0 +1,69 @@
////////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #11. Žâªàë⨥ ä ©« .
;
; ¢å®¤: HL - 㪠§ â¥«ì ­  ¨¬ï ä ©« 
; A - ०¨¬ ¤®áâ㯠:
; A=0 ç⥭¨¥/§ ¯¨áì
; A=1 ç⥭¨¥
; A=2 § ¯¨áì
; ¢ë室: CF=0, A - ¤¥áªà¨¯â®à ä ©« .
; CF=1, A - ª®¤ ®è¨¡ª¨.
////////////////////////////////////////////////////////////////////////
OPEN_FN:;!TEST Current Dir ;[x] 15/10/23
LD (.TMP),A
PUSH HL
CALL DIR_PATH_CHECK.forceCheck
POP HL
RET C
JR .start
;!FIXIT ᤥ« âì ª ª ¢ mkdir ¨«¨ rmdir?
;R008 ;
;OPEN: ;
LD (.TMP),A ; enter point from CREATE
.start: CALL GETWORD
RET C
CALL MASK ; enter point from OPEN_FN
RET C
.FILE: CALL SEARCH.File ; enter point from EXEC
RET C
;R002 ;
.FM: CALL GET_FM ; enter point from ATTRIB
RET C
LD A,C
EX AF,AF'
EXX
LD (IY+_sFM.HANDLE),E
LD (IY+_sFM.HANDLE+1),D
EXX
LD D,YH
LD E,YL
LD HL,HANDBUF
LD BC,HANDBUF.SIZE
LDIR
.TMP+1: LD A,0
LD (IY+_sFM.ACCESS_MODE),A
LD A,(TASK)
LD (IY+_sFM.TASK_NUM),A
XOR A
;
LD (IY+_sFM.KnownCluster_L),A
LD (IY+_sFM.KnownCluster_H),A
LD (IY+_sFM.KnownOffset_L),A
LD (IY+_sFM.KnownOffset_H),A
;
LD (IY+_sFM.F_POSITION),A
LD (IY+_sFM.F_POSITION+1),A
LD (IY+_sFM.F_POSITION+2),A
LD (IY+_sFM.F_POSITION+3),A
LD A,(FatBuffer.DRIVE)
LD (IY+_sFM.DRIVE),A
LD HL,CORE_BUFFERS.FM_BUF+_sFM.ST_CLUSTER
LD E,(HL)
INC HL
LD D,(HL)
LD (IY+_sFM.DIR_CLUSTER),E
LD (IY+_sFM.DIR_CLUSTER+1),D
EX AF,AF'
AND A
RET
;

72
DSS/API/Rename.asm Normal file
View File

@ -0,0 +1,72 @@
////////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #10. <20>¥à¥¨¬¥­®¢ ­¨¥ ä ©« .
; ƒ«®¡ «ì­ë¥ ᨬ¢®«ë * ¨ ? ¢ ¨¬¥­ å ä ©«®¢ ­¥ ¤®¯ã᪠îâáï.
;
; ¢å®¤: HL - 㪠§ â¥«ì ­  áâ à®¥ ¨¬ï ä ©« 
; DE - 㪠§ â¥«ì ­  ­®¢®¥ ¨¬ï ä ©« 
; ¢ë室: A - ª®¤ ®è¨¡ª¨, ¥á«¨ CF=1
;
; INPUT: HL - "old_name.ext",#00 without simbols * ?
; DE - "new_name.ext",#00 without simbols * ?
////////////////////////////////////////////////////////////////////////
RENAME: ;!TEST Current Dir ;[x] 15/10/23
PUSH HL
PUSH DE
CALL DIR_PATH_CHECK.forceCheck
POP DE
POP HL
RET C
;
PUSH DE
;LD DE,MASKARE
CALL MASK.name
POP DE
RET C
;!TEST optimization
;LD HL,MASKARE
;LD BC,11
;LD A,"?"
;CPIR
;LD A,DSS_Error.sys.INVALID_NAME
;SCF
CALL CHECK_NAME
;
RET Z
PUSH DE
CALL LOADDIR ; ¯à®ç¨â âì ᯨ᮪ ª â «®£ 
;LD A,#33
LD A,FAT_ATTR.NoSYSnoVolID
CALL SEARCH.Custom ; ¯®¨áª § ¯¨á¨ ¢ ᯨ᪥ ¤¨áª 
POP HL
RET C
;LD DE,MASKARE
CALL MASK.name
RET C
;!TEST optimization
;LD HL,MASKARE
;LD BC,11
;LD A,"?"
;CPIR
;LD A,DSS_Error.sys.INVALID_NAME
;SCF
CALL CHECK_NAME
;
RET Z
PUSH IX
LD A,FAT_ATTR.NoSYSnoVolID
CALL SEARCH.Custom ; ¯®¨áª § ¯¨á¨ ¢ ᯨ᪥ ¤¨áª 
POP IX
LD A,DSS_Error.sys.FILE_EXISTS
CCF
RET C
SET_PAGE_X DIRPAGE
LD HL,MASKARE
LD D,XH
LD E,XL
LD BC,11
LDIR
OUT (SLOT3),A
JP SAVEDIR
;

110
DSS/API/RmDir.asm Normal file
View File

@ -0,0 +1,110 @@
////////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #1C. “¤ «¥­¨¥ ª â «®£ .
; Œ®¦­® 㤠«¨âì ⮫쪮 ¯ãá⮩ ª â «®£.
;
; ¢å®¤: HL - 㪠§ â¥«ì ­  ¨¬ï ª â «®£ 
; ¢ë室: A - ª®¤ ®è¨¡ª¨, ¥á«¨ CF=1
;
; INPUT: HL - "C:\DIR\DIR\DIR_NAME",0
////////////////////////////////////////////////////////////////////////
RMDIR: ;!TEST Current Dir ;[x] 15/10/23
PUSH HL
CALL DIR_PATH_CHECK
POP HL
RET C
CALL .START
PUSH AF
LD HL,CurrentDirectory
CALL CHDIR
CALL DIR_PATH_CHANGE.Current
POP AF
RET
;
.START: CALL GETWORD
RET C
CALL MASK
RET C
;!TEST optimization
;LD HL,MASKARE
;LD BC,11
;LD A,"?"
;CPIR
;LD A,DSS_Error.sys.INVALID_NAME
;SCF
CALL CHECK_NAME
;
RET Z
CALL LOADDIR
CALL SEARCH.Dir
RET C
LD HL,(HANDBUF+_sFM.ST_CLUSTER)
PUSH IX
.RMD17: PUSH HL
CALL NSECTOR
LD A,(CORE_BUFFERS.BootSector.S_P_C)
.RMD12: PUSH AF
PUSH HL
PUSH IX
IN A,(SLOT3)
PUSH AF
IN A,(SLOT0)
OUT (SLOT3),A
LD DE,CORE_BUFFERS.SECBUF+#C000
LD BC,1*256 + Dss.DRV.Read
LD A,(FatBuffer.DRIVE)
RST ToDSS.DRV
POP AF
OUT (SLOT3),A
LD B,16 ;!HARDCODE 16 * 32 = 512; 32 - à §¬¥à § ¯¨á¨, 512 - à §¬¥à áç¨â ­­®£® ᥪâ®à 
LD HL,CORE_BUFFERS.SECBUF
.RMD10: LD A,(HL)
OR A
JP Z,.RMD15 ;DIR EMPTY
CP "."
JR Z,.RMD14
CP #E5 ;!HARDCODE ¡ ©â 㤠«¥­¨ï ä ©« 
JR Z,.RMD14
LD DE,11 ;!HARDCODE ᬥé. ¤® ¡ ©â   âਡã⮢
ADD HL,DE
LD A,(HL)
SBC HL,DE
;BIT 3,A
AND %0000'1000
JP Z,.error ;DIR NOT EMPTY
.RMD14: LD DE,#0020
ADD HL,DE
DJNZ .RMD10
POP IX
POP HL
INC IX
LD A,XH
OR XL
JR NZ,.RMD11
INC HL
.RMD11: POP AF
DEC A
JR NZ,.RMD12
POP HL ; ­®¬¥à ª« áâ¥à 
CALL R_F_FAT ; ¯à®ç¨â âì ¨§ ª¥è  FAT-  ­®¬¥à á«¥¤. ª« áâ¥à 
EX DE,HL ; hl=­®¬¥à á«¥¤. ª« áâ¥à 
JR NC,.RMD17 ; ­¥ ª®­¥æ 楯®çª¨
.RMD18: POP IX
JP DEL_FN.DELETE ; ¯®¬¥â¨âì § ¯¨áì ª ª "㤠«¥­­ ï"
.RMD15: POP IX
POP HL
POP AF
POP HL
JR .RMD18
.error: POP IX
POP HL
POP AF
POP HL
POP IX
LD A,DSS_Error.sys.DIR_NOT_EMPTY
SCF
RET
;

38
DSS/API/ScanDRV.asm Normal file
View File

@ -0,0 +1,38 @@
;R12
;///////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #08 (DSS_RESCAN). <20>¥à¥áª ­¨à®¢ âì ¤¥¢ ©áë á¨á⥬ë.
;
; ¢å®¤: ­¥â
; ¢ë室: A - ­®¬¥à ¯®á«¥¤­¥£® «®£. ¤¨áª  ¢ á¨á⥬¥
;///////////////////////////////////////////////////////////////////////
; INCLUDE 'ScanDRV.asm'
;!TODO ª®¤ ¤¨ª® ª®áâë«ì­ë© ¨ ¡ã¤¥â ¯¥à¥¤¥« ­ ¢¬¥áâ¥ á ¯à®æ¥¤ãன INITDVC
SCANDRV:
; 1. § ¯®¬¨­ ¥¬ á®áâ®ï­¨¥ ¯à¥à뢠­¨©
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
LD A,R
DI
PUSH AF
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
; 2. ã§­ ñ¬ ¡ãª¢ã ¡ãâ-¤¨áª 
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
CALL BOOTDSK.GET
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
; 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
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
;///////////////////////////////////////////////////////////////////////
;

30
DSS/API/SetDateTime.asm Normal file
View File

@ -0,0 +1,30 @@
////////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #18. ˆ§¬¥­¥­¨¥ ¤ âë ¨ ¢à¥¬¥­¨ ä ©« .
;
; ¢å®¤: A - ¤¥áªà¨¯â®à ä ©« 
; D - ¤¥­ì
; E - ¬¥áïæ
; IX - £®¤
; H - ç á
; L - ¬¨­ãâë
; B - ᥪ㭤ë
; ¢ë室: A - ª®¤ ®è¨¡ª¨, ¥á«¨ CF=1
////////////////////////////////////////////////////////////////////////
PUT_D_T:
PUSH AF
CALL MK_TIME ; § ª®¤¨à®¢ âì ¢à¥¬ï/¤ âã
POP AF ; ¤¥áªà¨¯â®à
PUSH DE
PUSH BC
CALL SET_FM
POP BC
POP DE
RET C
LD (IY+_sFM.TIME),E
LD (IY+_sFM.TIME+1),D
LD (IY+_sFM.DATE),C
LD (IY+_sFM.DATE+1),B
SET 7,(IY+_sFM.ACCESS_MODE) ;R006 ; ãáâ. ¯à¨§­ ª ¨§¬¥­¥­¨ï ä ©« 
AND A
RET
;

180
DSS/API/Time.asm Normal file
View File

@ -0,0 +1,180 @@
////////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #21. ’¥ªãé ï ¤ â  ¨ ¢à¥¬ï.
;
; ¢å®¤: ­¥â
; ¢ë室: D - ¤¥­ì
; E - ¬¥áïæ
; IX - £®¤
; H - ç á
; L - ¬¨­ãâë
; B - ᥪ㭤ë
; C - ¤¥­ì ­¥¤¥«¨
////////////////////////////////////////////////////////////////////////
SYSTIME:
LD C,BIOS.CMOS_TEST
RST ToBIOS
JP C,.NOCMOS
LD D,7 ;DAY
CALL RCMOS
PUSH AF
LD D,8 ;MONTH
CALL RCMOS
POP DE
LD E,A
PUSH DE
LD D,4 ;HOUR
CALL RCMOS
PUSH AF
LD D,2 ;MINUTE
CALL RCMOS
POP DE
LD E,A
PUSH DE
LD D,0 ;SECOND
CALL RCMOS
PUSH AF
LD D,6 ;WEEK DAY
LD C,BIOS.CMOS_RD
RST ToBIOS
POP DE
LD E,A
PUSH DE
LD D,9 ;YEAR
CALL RCMOS ;READ AND CONVERT TO DECIMAL
PUSH AF
LD D,#32 ;CENTURY
LD C,BIOS.CMOS_RD
RST ToBIOS
LD XH,A
POP AF
CP 80 ;R001, TEST DECIMAL FIX
PUSH AF
JR C,.XXIAGE
LD A,#19
CP XH
JR Z,.GOODAGE
JR .BADAGE
.XXIAGE:
LD A,#20
CP XH
JR Z,.GOODAGE
.BADAGE:
PUSH AF
LD D,#32 ;CENTURY
LD C,BIOS.CMOS_WR
RST ToBIOS
POP AF
LD XH,A
.GOODAGE:
POP AF
LD XL,A
LD A,XH
CALL BCD2HEX
LD L,A
LD H,0
LD C,L
LD B,H
LD XH,B
ADD HL,HL
ADD HL,HL
ADD HL,BC
ADD HL,HL ;*10
LD B,H
LD C,L
ADD HL,HL
ADD HL,HL
ADD HL,BC
ADD HL,HL ;*10(100)
EX DE,HL
ADD IX,DE
POP BC
POP HL
POP DE
AND A
RET
.NOCMOS:
.NC_DAY+1:
LD DE,DAY*256+MONTH ;DAY/MONTH
.NC_HOUR+1:
LD HL,0 ;HOUR/MINUTE
.NC_SEC+1:
LD BC,1 ;SECOND/WEEKDAY
.NC_YEAR+2:
LD IX,YEAR ;YEAR
AND A
RET
;
////////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #22. “áâ ­®¢¨âì ⥪ãéãî ¤ âã ¨ ¢à¥¬ï.
;
; ¢å®¤: D - ¤¥­ì
; E - ¬¥áïæ
; IX - £®¤
; H - ç á
; L - ¬¨­ãâë
; B - ᥪ㭤ë
; ¢ë室: A - ª®¤ ®è¨¡ª¨, ¥á«¨ CF=1
////////////////////////////////////////////////////////////////////////
SETTIME:
PUSH IX
PUSH BC
PUSH HL
PUSH DE
LD C,BIOS.CMOS_TEST
RST ToBIOS
JP C,.NOCMOS2
POP AF
PUSH AF
LD D,7 ;DAY
CALL WCMOS
POP BC
LD A,C
LD D,8 ;MONTH
CALL WCMOS
POP AF
PUSH AF
LD D,4 ;HOUR
CALL WCMOS
POP BC
LD A,C
LD D,2 ;MINUTE
CALL WCMOS
POP AF
PUSH AF
LD D,0 ;SECOND
CALL WCMOS
POP BC
LD A,C
LD D,6 ;WEEK DAY
LD C,BIOS.CMOS_WR
RST ToBIOS
;
POP HL
XOR A
LD DE,100
.YR: INC A
SBC HL,DE
JR NC,.YR
ADD HL,DE
DEC A
PUSH HL
LD D,#32 ;CENTURY
CALL WCMOS
POP BC
LD A,C
LD D,9 ;YEAR
CALL WCMOS
AND A
RET
; !FIXIT ­®¢ë© ¡¨®á ¢ëáâ ¢«ï¥â ¢à¥¬ï, ¥á«¨ á ­¨¬ çâ®-â® ­¥ â ª.
.NOCMOS2:
LD C,0
LD (SYSTIME.NC_DAY),DE ;DAY/MONTH
LD (SYSTIME.NC_HOUR),HL ;HOUR/MINUTE
LD (SYSTIME.NC_SEC),BC ;SECOND/WEEKDAY
LD (SYSTIME.NC_YEAR),IX ;YEAR
AND A
RET
;

19
DSS/API/Version.asm Normal file
View File

@ -0,0 +1,19 @@
;/////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #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

57
DSS/API/bootDsk.asm Normal file
View File

@ -0,0 +1,57 @@
;/////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #09. <20>®¬¥à á¨á⥬­®£® ¤¨áª .
; ‚®§¢à é ¥â ­®¬¥à ¤¨áª , c ª®â®à®£® § £à㦥­  á¨á⥬ .
;
; ¢å®¤: B = 0 (01h - ¨á¯. boot-§ £àã§ç¨ª á¨á⥬ë)
; ¢ë室: A - ­®¬¥à á¨á⥬­®£® ¤¨áª  (0=A,1=B,..)
;/////////////////////////////////////////////////////////////////////
BOOTDSK:
INC B
DEC B
JR Z,.GET
DEC B
.chg: JR Z,.SET ;R13 ¬¥­ï¥âáï ­  JR ,SETBOOT ¯®á«¥ ¯¥à¢®£® 㤠筮£® ¨á¯®«­¥­¨ï SETBOOT
LD A,DSS_Error.sys.INVALID_FUNCTION
SCF
RET
.GET: ;GET BOOT DISK
.NUM+1: LD A,0 ;R09
AND A
RET
; ‘®®¡é¨âì DSS á ª ª®£® ¤¨áª  § £à㦠¥âáï á¨á⥬ .
; ˆá¯. § £àã§ç¨ª á¨áâ¥¬ë ¤«ï ¨­¨æ. ï祩ª¨ "boot_disk".
.SET: LD B,A ;SET BOOT DISK
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 (BOOTDSK.NUM),A
AND A
RET
.NoSupport:
INC C
LD A,(LDRIVE)
CP C
JR NZ,.loop
SCF
RET
; <20>®¬¥à ¯®á«¥¤­¥£® ¤¨áª  ¢ á¨á⥬¥
LDRIVE: DB DSS_MAX_DRIVES_AMOUNT
IF COMPILE_UNUSED_CODE
TDRIVE: DB #00
TCLUST: DW #0000
TCOUNT: DW #0000
ENDIF
;

16
DSS/API/curDisk.asm Normal file
View File

@ -0,0 +1,16 @@
;/////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #02. <20>®¬¥à ⥪ã饣® ¤¨áª .
;
; ¢å®¤: ­¥â
; ¢ë室: A - ­®¬¥à ¤¨áª  (0=A,1=B,..)
;/////////////////////////////////////////////////////////////////////
CURDISK_FN:
LD A,(CurrentPath)
SUB 'A'
RET NC
LD A,DSS_Error.sys.INVALID_DRIVE
RET
CURDISK: LD A,(FatBuffer.DRIVE)
AND A
RET
;

139
DSS/API/diskINF.asm Normal file
View File

@ -0,0 +1,139 @@
;/////////////////////////////////////////////////////////////////////
; [ ] ­®¢ ï ¯®¤äã­ªæ¨ï á ¡¨â®¬ 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 ¯®¤äã­ªæ¨ï á ¤®¯.¨­ä®©
LD C,B
LD B,1
;
CP #80
JR C,.CustomDisk
CP #FF
JR Z,.CurrentDisk
; more info
LD B,C
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,(FAT_Max_Cluster)
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
;

File diff suppressed because it is too large Load Diff

View File

@ -961,9 +961,10 @@ WRITE: LD (.R_POINT),HL
////////////// NEW //////////////////
; in: HL - CLUSTER
; out: HL:IX - SECTOR
NSECTOR: DEC HL
DEC HL
NSECTOR:
LD DE,0
DEC HL
DEC HL
LD A,(CORE_BUFFERS.BootSector.S_P_C)
XOR 1
JR Z,.skip
@ -971,7 +972,8 @@ NSECTOR: DEC HL
RRA
.loop: ADD HL,HL
RL E
; RL D
RL D
;
RRA
JP NC,.loop
;
@ -984,6 +986,7 @@ NSECTOR: DEC HL
LD D,A
LD E,A
ADC HL,DE
;!TODO   ­ ¤® «¨ ¯à®¢¥àïâì ¯¥à¥¯®«­¥­¨¥ HL:IX?
RET
/////////////////////////////////////

512
DSS/DOS_Proc.asm Normal file
View File

@ -0,0 +1,512 @@
;[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"
;---------------------------------------------------------------
;[BEGIN]
;//MODULE: FAT_X
;//CREATE: 19-05-1998 AUTHOR: Denis Parinov
;//UPDATE: 24-10-1999 DNS Restore module
;---------------------------------------------------------------
;Rev Date Name Description
;---------------------------------------------------------------
;RX01 10-02-1999 DNS UPGRADE FAT CASH
;---------------------------------------------------------------
;----------------------------------------------------------------------;
; HL - 11 bytes filename "FILENAMEEXT"
; DE - DOS filename "FILENAME.EXT",0
; GetName:
; LD BC,#08FF
; .GETN1: LD A,(HL)
; CP " "
; JR NZ,.GETN3
; .GETN2: INC HL
; DJNZ .GETN2
; JR .GETN4
; .GETN3: LDI
; DJNZ .GETN1
; ;
; .GETN4: LD A,(HL)
; CP " "
; LD A,"."
; JR NZ,.GETN5
; LD A,#00
; .GETN5: LD (DE),A
; INC DE
; RET Z
; LD B,#03
; .GETN6: LD A,(HL)
; CP " "
; RET Z
; LDI
; XOR A
; LD (DE),A
; DJNZ .GETN6
; RET
;---------------;---------------;---------------
GetName:
LD BC,#08FF ;!HARDCODE ¤«¨­  ¨¬¥­¨ + áçñâ稪
LD A,' '
.loop: CP (HL)
JR Z,.skip
LDI
DJNZ .loop
;;;;
JP .extension
;;;;
.skip: LD C,B
LD B,0
; CF=0
ADC HL,BC
;;;;
.extension:
CP (HL)
LD A,"."
JR NZ,.copy_extension
XOR A
.copy_extension:
LD (DE),A
INC DE
RET Z ;no copy extension
; copy extension
LD BC,#03FF ;!HARDCODE ¤«¨­  à áè¨à¥­¨ï + áçñâ稪
LD A,' '
.loop2: CP (HL)
JR Z,.exit
LDI
DJNZ .loop2
.exit: XOR A
LD (DE),A
RET
;----------------------------------------------------------------------;
;----------------------------------------------------------------------;
; ’¥áâ ­  ¤®¯ãá⨬®¥ ¨¬ï ¨ ­ áâநâìáï ­  ¤¨áª.
; ¢å®¤: hl=áâப  ¨¬¥­¨
; ¢ë室: (TMPNAME)
GETWORD:
; !TEST
INC HL
LD A,(HL)
DEC HL
CP ':'
JR NZ,.dir_loop
LD A,(HL)
CP 'a'
JR C,.next
CP '{'
JR NC,.next
SUB #20
.next: SUB 'A'
INC HL
INC HL
PUSH HL
CALL CHNDISK
;CALL OPENDSK
POP HL
RET C
LD A,(HL)
OR A
RET Z
CP ' ' ;
RET Z
CP '\' ;
SCF
LD A,DSS_Error.sys.PATH_NOT_FOUND
RET NZ
INC HL
;
.dir_loop:
LD DE,TMPNAME
LD BC,#0DFF
;
.loop: LD A,(HL)
INC HL
CP '\' ;
JR Z,.DIR_NAME
; AND A
; JR Z,.DIR_NAME
;CP ':'
;JR Z,.DRV_NAME
LD (DE),A
INC DE
CP ' '+1
CCF
RET NC
DJNZ .loop
LD A,DSS_Error.sys.INVALID_NAME
SCF
RET
;
.DIR_NAME:
XOR A
LD (DE),A
PUSH HL
LD HL,TMPNAME
CALL OPENDIR
POP HL
RET C
JR .dir_loop
; .DRV_NAME:
; LD A,(TMPNAME)
; CP 'a'
; JR C,.next
; CP '{'
; JR NC,.next
; SUB #20
; .next: SUB 'A'
; PUSH HL
; ;!TEST CHNDISK OPENDSK
; ;CALL OPENDSK
; CALL CHNDISK
; ;
; POP HL
; RET C
; JR .loop
;
; <20>ãä¥à ¨¬¥­¨ 8.3 ä®à¬ â 
TMPNAME: DZ ' ' ; 12 ¯à®¡¥«®¢ ¨ 0 ;!FIXIT ª ¡ãä¥à ¬
;----------------------------------------------------------------------;
;----------------------------------------------------------------------;
; IN: A - drive number
;
OPENDSK:
;!TEST DRV.Open ®¡å®¤ R10
LD C,A
LD A,(FatBuffer.DRIVE)
CP C
IF CHECK_DRIVE_CHANGE
JR NZ,.open
PUSH BC
LD C,Dss.DRV.MediaCheck
RST ToDSS.DRV
POP BC
ENDIF
JR Z,.exit
.open: LD A,C
;
.force: PUSH AF
LD C,Dss.DRV.Open
RST ToDSS.DRV
POP BC
JP C,.error
LD A,B
LD (FatBuffer.DRIVE),A
CALL RD_BPB
RET C
.exit: LD A,(LDRIVE)
AND A
RET
.error: CP DSS_Error.sys.INVALID_DRIVE
SCF
RET Z
LD A,DSS_Error.sys.NOT_READY
RET
;----------------------------------------------------------------------;
;----------------------------------------------------------------------;
OPENDIR:;!TEST ;[x] some optimize
;XOR A
;CALL SET_FM
LD IY,CORE_BUFFERS.FM_BUF
;
LD A,(HL)
OR A
JR NZ,.SUBDIR
.REROOT1:
LD DE,0
;!TEST ;[x] some optimize
;LD (IY+_sFM.ST_CLUSTER),E
;LD (IY+_sFM.ST_CLUSTER+1),D
EX DE,HL
LD (CORE_BUFFERS.FM_BUF + _sFM.ST_CLUSTER),HL
EX DE,HL
;
CALL LOADDIR
LD HL,WorkDirectory
LD (HL),'\'
INC HL
LD (HL),#00
; CF=0
;AND A
RET
.SUBDIR:
CP "."
JR NZ,.SUBDIR2
;!TEST ;[x] some optimize
;LD A,(IY+_sFM.ST_CLUSTER) ;R005
LD A,(CORE_BUFFERS.FM_BUF + _sFM.ST_CLUSTER) ;R005
;
OR (IY+_sFM.ST_CLUSTER+1) ;R005
JR NZ,.SUDI1 ;R005
INC HL ;R005
LD A,(HL) ;R005
OR A ;R005
DEC HL ;R005
JR Z,.REROOT1 ;R005
.SUDI1: EXX
LD HL,MASKARE
LD DE,MASKARE+1
LD BC,10 ;!HARDCODE
LD (HL),' '
LDIR
EXX
LD DE,MASKARE
.loop: LDI
LD A,(HL)
OR A
JR NZ,.loop
JR .SUBDIR3
.SUBDIR2:
CALL MASK.name
RET C
.SUBDIR3:
CALL FINDDIR
RET C
;!TEST ;[x] some optimize
;LD (IY+_sFM.ST_CLUSTER),E
;LD (IY+_sFM.ST_CLUSTER+1),D
;LD DE,#4000 ;!HARDCODE
;LD (IY+_sFM.F_SIZE),E
;LD (IY+_sFM.F_SIZE+1),D
EX DE,HL
LD (CORE_BUFFERS.FM_BUF + _sFM.ST_CLUSTER),HL
LD HL,#4000 ;!HARDCODE
LD (CORE_BUFFERS.FM_BUF + _sFM.F_SIZE),HL
EX DE,HL
;
CALL LOADDIR
; CF=0
;AND A
RET
;----------------------------------------------------------------------;
;----------------------------------------------------------------------;
; .custom:
; <20>८¡à §®¢ âì ¨¬ï 8.3 -> 11 ä®à¬ â
; ¢å®¤: hl = 8.3 ¨¬ï
; de = ¡ãä¥à ¨¬¥­¨ 11 ᨬ¢. ä®à¬ â 
; ¯à¨ ®è¨¡ª¥ CF - ­¥¤®¯. ¨¬ï
;
; HL - MASK "file*.t??"
; DE - 11 bytes filename
; RET: C=2 FILE WITHOUT EXTENTION
; C=1 FILE WITH EXTENTION
MASK: LD HL,TMPNAME
.name: LD DE,MASKARE
.custom: PUSH HL
PUSH DE
LD H,D
LD L,E
INC DE
LD (HL),' '
LD BC,10 ;!HARDCODE = size (FileName + Extension - 1)
LDIR
POP DE
POP HL
LD A,(HL)
CP '.' ;R007
SCF ;R007
JR Z,.MASKB ;R007
CP ' '+1
.MASKB: LD A,DSS_Error.sys.INVALID_NAME
RET C
LD BC,#0902 ; B - áç¥â稪
.MASK1: LD A,(HL)
CP ' '+1
CCF
RET NC
CP '"'
JR Z,.MASK_ERR
CP '*'
JR Z,.MASK3
CP '+'
JR Z,.MASK_ERR
CP ','
JR Z,.MASK_ERR
CP '.'
JR Z,.MASK5
CP '/'
JR Z,.MASK_ERR
CP ':'
JR Z,.MASK_ERR
CP ';'
JR Z,.MASK_ERR
CP '<'
JR Z,.MASK_ERR
CP '='
JR Z,.MASK_ERR
CP '>'
JR Z,.MASK_ERR
CP '['
JR Z,.MASK_ERR
CP '\'
JR Z,.MASK_ERR
CP ']'
JR Z,.MASK_ERR
CP '|'
JR Z,.MASK_ERR
; CP 'a' ;?????
; JR C,.MASK2
; CP 'z' + 1
; JR NC,.MASK2
; SUB #20
CALL UPPER ; a..z -> A..Z
.MASK2: LD (DE),A
INC HL
INC DE
DJNZ .MASK1
.MASK_ERR:
LD A,DSS_Error.sys.INVALID_NAME
SCF
RET
.MASK3: LD A,'?'
INC HL
DJNZ .MASK6
LD A,DSS_Error.sys.INVALID_NAME
SCF
RET
.MASK6: LD (DE),A
INC DE
DJNZ .MASK6
LD B,1
JR .MASK1
.MASK5: LD A,' '
INC HL
DJNZ .MASK4
LD B,4
DEC C
JP NZ,.MASK1
LD A,DSS_Error.sys.INVALID_NAME
SCF
RET
.MASK4: LD (DE),A
INC DE
DJNZ .MASK4
LD B,4
DEC C
JP NZ,.MASK1
LD A,DSS_Error.sys.INVALID_NAME
SCF
RET
;----------------------------------------------------------------------;
;----------------------------------------------------------------------;
;!TEST Current Dir ;[x] 15/10/23
DIR_PATH_CHANGE:
.FullCurrent: LD A,(FatBuffer.DRIVE)
ADD 'A'
LD (CurrentPath),A
;
.Current: LD HL,CurrentDirectory
JP CURRDIR
;
.FullWork: LD A,(CurrentPath)
SUB 'A'
LD (FatBuffer.DRIVE),A
;
.Work: LD HL,WorkDirectory
JP CURRDIR_FN
;
DIR_PATH_CHECK: LD A,(HL)
CP '\'
JR NZ,.notRootDir
;
CALL .checkDrive
RET Z
LD A,(CurrentPath)
SUB 'A'
JP OPENDSK
;
.notRootDir: INC HL
LD A,(HL)
CP ':'
RET Z
;
.forceCheck: LD HL,CurrentDirectory+1
LD BC,CurrentDirectory.DEPTH-1
CALL .checkDrive
JR Z,.checkDir
;
LD HL,CurrentPath
LD A,(FatBuffer.DRIVE)
ADD 'A'
CP (HL)
JR NZ,.gotoPath
;
.checkDir: LD HL,CurrentDirectory+1
LD DE,WorkDirectory+1
;
.loop: LD A,(DE)
AND A
JR Z,.end
CP (HL)
INC HL
INC DE
JR Z,.loop
JP .gotoPath
;
.end: CP (HL)
RET Z
JR .gotoPath
;
.checkDrive: LD HL,CurrentPath
LD A,(FatBuffer.DRIVE)
ADD 'A'
CP (HL)
RET
.gotoPath: CALL FINDDIR.CHECK_SLASH
LD A,DSS_Error.sys.PATH_NOT_FOUND
RET C
LD HL,CurrentPath
JP GETWORD
;----------------------------------------------------------------------;
;----------------------------------------------------------------------;
CHECK_NAME:
LD HL,MASKARE
.custom: LD BC,11 ;!HARDCODE
LD A,"?"
CPIR
LD A,DSS_Error.sys.INVALID_NAME
SCF
RET
;----------------------------------------------------------------------;

View File

@ -1,799 +0,0 @@
;[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 ¯®¤äã­ªæ¨ï á ¤®¯.¨­ä®©
LD C,B
LD B,1
;
CP #80
JR C,.CustomDisk
CP #FF
JR Z,.CurrentDisk
; more info
LD B,C
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,(FAT_Max_Cluster)
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 (FAT_Max_Cluster),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 (FatCache),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
;

View File

@ -377,7 +377,7 @@ GO_ZERO EQU #0000
ADRST10: ;DS 512 ;,0
;...............................................[LOW ADDRESS ]:
; 0 1 2 3 4 5 6 7 8 9 DEC HEX
DB low F_START, low CHNDISK_FN, low CURRDSK_FN,low DISKINF, low NOPS, low NOPS, low NOPS, low NOPS, low SCANDRV, low BOOTDSK ; 0 00..09
DB low F_START, low CHNDISK_FN, low CURDISK_FN,low DISKINF, low NOPS, low NOPS, low NOPS, low NOPS, low SCANDRV, low BOOTDSK ; 0 00..09
DB low CREATE, low CREAT_N, low NOPS, low NOPS, low DEL_FN, low NOPS, low RENAME, low OPEN_FN, low CLOSE_FN, low READ ; 1 0A..13
DB low WRITE, low MOVE_FP, low ATTRIB, low GET_D_T, low PUT_D_T, low F_FIRST, low F_NEXT, low MKDIR, low RMDIR, low CHDIR_FN ; 2 14..1D
DB low CURRDIR_FN,low NOPS, low NOPS, low SYSTIME, low SETTIME, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS ; 3 1E..27
@ -404,7 +404,7 @@ ADRST10: ;DS 512 ;,0
;[ ] R09
ENDIF
;...............................................[HIGH ADDRESS]:
DB high F_START, high CHNDISK_FN,high CURRDSK_FN,high DISKINF,high NOPS, high NOPS, high NOPS, high NOPS, high SCANDRV, high BOOTDSK
DB high F_START, high CHNDISK_FN,high CURDISK_FN,high DISKINF,high NOPS, high NOPS, high NOPS, high NOPS, high SCANDRV, high BOOTDSK
DB high CREATE, high CREAT_N, high NOPS, high NOPS, high DEL_FN, high NOPS, high RENAME, high OPEN_FN,high CLOSE_FN,high READ
DB high WRITE, high MOVE_FP, high ATTRIB, high GET_D_T,high PUT_D_T,high F_FIRST,high F_NEXT, high MKDIR, high RMDIR, high CHDIR_FN
DB high CURRDIR_FN,high NOPS, high NOPS, high SYSTIME,high SETTIME,high NOPS, high NOPS, high NOPS, high NOPS, high NOPS
@ -437,18 +437,47 @@ ADRST10: ;DS 512 ;,0
;!TODO § ¬¥­¨âì ¯®-¬ ªá¨¬®¬ã ¢áñ ¢ KEYINTER.ASM ­  ¢ë§®¢ë ¡¨®á 
INCLUDE "KEYINTER.ASM" ;!FIXIT ¨§-§  ¡ãä¥à  á ¢ëà ¢­¨¢ ­¨¥¬ align 256 ¢ ­ ç «¥ ¯à¨å®¤¨âáï ADRST10 ¤®¡¨¢ âì ­ã«ï¬¨ ¢ ª®­æ¥
INCLUDE "VIDEO.ASM"
INCLUDE "FAT_X.ASM"
INCLUDE "DOS_X.ASM"
INCLUDE "API.ASM"
INCLUDE "DOS_Proc.asm"
INCLUDE "FS/FAT/FAT.ASM"
INCLUDE "DOS_FM.ASM"
INCLUDE "DOS5.ASM"
INCLUDE "EXECUTE.ASM"
INCLUDE "ENVIRON.ASM"
INCLUDE "INTMOUSE.ASM"
INCLUDE "Procedures.asm"
;!FIXIT ª ¡ãä¥à ¬
; Œ áᨢ «®£. ­®¬¥à®¢ ¡ ­®ª à áè¨à¥­¨ï DSS
BANKTBL: BLOCK USING_MEMPAGES+1,#FF ; +1 ¤«ï COREPAGE
HANDBUF: BLOCK HANDBUF.SIZE,0
;
MASKARE: BLOCK 8,0 ; ¨¬ï ä ©« 
BLOCK 3,0 ; à áè.
BLOCK 21,0 ; 11+21=32
;
DISPLAY "DOS-MAIN end address: ",/H,$-1
;
;!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
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
;
;> > > > > > > > > > > > > > > > BUFFERS < < < < < < < < < < < < < < < <

View File

@ -50,7 +50,7 @@ INITENV:
PUSH AF
;
;R02
LD A,(BOOTDRV)
LD A,(BOOTDSK.NUM)
ADD A,'A'
LD (DEFAULT_ENV.boot_disk),A
;

View File

@ -180,7 +180,7 @@ EX_PATH: EXX
DEC B
JP Z,GSWITCH ;7 ; ¢ë¤¥«¨âì ¯ à ¬¥âà ª®¬-áâப¨
DEC B
JP Z,GETNAME ;8 ; ŻŕĽŽĄŕ. ¨Źď 11 -> 8.3 äŽŕŹ â
JP Z,GetName ;8 ; ¯à¥®¡à. ¨¬ï 11 -> 8.3 ä®à¬ â
DEC B
JP Z,MASK.custom ;9 ; ¯à¥®¡à. ¨¬ï 8.3 -> 11 ä®à¬ â
EX_RESR: LD A,DSS_Error.sys.INVALID_FUNCTION
@ -839,7 +839,7 @@ EXEC: LD (CMDLINE),HL
EXEC_1: ;LD (CMDLINE),HL
LD HL,(CMDLINE)
LD A,FAT_ATTR.READ_ONLY
LD (OPEN.TMP),A
LD (OPEN_FN.TMP),A
CALL GETWORD
RET C
; LD HL,TMPNAME
@ -850,7 +850,7 @@ EXEC_1: ;LD (CMDLINE),HL
LD A,DSS_Error.sys.FILE_NOT_FOUND
RET C
_mINCTASK ;R08
CALL OPEN.FILE
CALL OPEN_FN.FILE
JR C,.Error
POP HL ; 㡨ࠥ¬ «¨è­¨©  ¤à¥á_¢®§¢à â _¢_¢ë§¢ ¢èãî_¯à®æ¥¤ãàã
JP EXEC02 ;R07 CONTINUE EXECUTING PROGRAM
@ -999,7 +999,7 @@ TST_EXT: LD HL,EXE_EXT ; "EXE"
ERREXE0: LD A,DSS_Error.sys.NOT_ENOUGH_MEMORY
ERREXE: PUSH AF
LD A,(EXE_FM)
CALL CLOSE
CALL CLOSE_FN
_mDECTASK
POP AF
RET
@ -1166,7 +1166,7 @@ LEAVE: LD A,B
;[x] 25/10/23 close EXE FM
POP AF
;CALL RES_FM
CALL CLOSE
CALL CLOSE_FN
_mDECTASK
;
POP AF
@ -1235,7 +1235,7 @@ M_PSP: LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR)
LD (HL),B
INC HL
;!FIXIT âãâ ¢®ááâ ­ ¢«¨¢ âì ¯à ¢¨«ì­ë© ª â «®£
CALL CURRDSK
CALL CURDISK
ADD A,'A'
LD (HL),A
INC HL

829
DSS/FS/FAT/FAT.asm Normal file
View File

@ -0,0 +1,829 @@
;[BEGIN]
;//MODULE: FAT
;//CREATE: 19-05-1998 AUTHOR: Denis Parinov
;//UPDATE: 24-10-1999 DNS Restore module
;---------------------------------------------------------------
;Rev Date Name Description
;---------------------------------------------------------------
;RX01 10-02-1999 DNS UPGRADE FAT CASH
;---------------------------------------------------------------
;----------------------------------------------------------------------;
; <20>®¨áª § ¯¨á¨ ª â «®£  ¢ ᯨ᪥ ª â «®£ 
;
; ¢å®¤: a= âਡãâ § ¯¨á¨
; ¢ë室: de'=¨­¤¥ªá § ¯¨á¨ ¢ ᯨ᪥ ª â «®£ 
; (HANDBUF) = file's direcory record
; CF - ª â «®£ ­¥ ­ ©¤¥­
SEARCH:
.Dir: LD A,FAT_ATTR.DIRECTORY
CALL SEARCH.Custom
RET NC
CP DSS_Error.sys.PATH_NOT_FOUND + 1
RET C
;
SCF
LD A,DSS_Error.sys.TOO_MANY_FILES_IN_DIR
RET
;
.File: LD A,FAT_ATTR.NoDIRnoVolID
.Custom: EX AF,AF' ; A = 76ADLSHR
SET_PAGE_X DIRPAGE
;PUSH AF
EX AF,AF'
;
CPL
LD C,A
LD IX,DIRPAGE.buffer
;!TEST 9/11/23
; EXX
; LD DE,0
; EXX
;
.loop: LD A,(IX+00)
OR A
JR Z,.error_file_not_found
CP #E5 ;!HARDCODE #E5 - § ¯¨áì ¢ ¤¨à¥ªâ®à¨¨ ᢮¡®¤­ , â ª ª ª ä ©«/¤¨à¥ªâ®à¨ï ¡ë«¨ 㤠«¥­ë
JR Z,.next_record
LD A,(IX+11)
AND C
JR NZ,.next_record
LD HL,MASKARE
LD D,XH
LD E,XL
LD B,11
EX DE,HL
.loop_compare:
LD A,(DE)
CP '?'
JR Z,.next_char
CP (HL)
JR NZ,.next_record
.next_char:
INC HL
INC DE
DJNZ .loop_compare
;!TEST 9/11/23 ;[x] some optimize
; LD D,XH
; LD E,XL
LD D,XH
LD E,XL
EXX
LD D,XH
LD E,XL
EXX
;
LD HL,HANDBUF
EX DE,HL
LD BC,HANDBUF.SIZE
LDIR
;POP AF
EX AF,AF'
OUT (SLOT3),A
EX AF,AF'
AND A
RET
.next_record:
;!TEST 9/11/23 ;[x] some optimize
; EXX
; INC DE
; EXX
;
LD DE,#0020 ;!HARDCODE
ADD IX,DE
JR NC,.loop
.error_too_many_files:
;POP AF
EX AF,AF'
OUT (SLOT3),A
LD A,DSS_Error.sys.TOO_MANY_FILES_IN_DIR
SCF
RET
;
.error_file_not_found:
;POP AF
EX AF,AF'
OUT (SLOT3),A
LD A,DSS_Error.sys.FILE_NOT_FOUND
SCF
RET
;----------------------------------------------------------------------;
;
;!TODO ?
;GHANDLE:
; PUSH DE
; PUSH HL
; PUSH IX
; CALL TESTDSK
; JP C,G_HAND1
; CALL LOADDIR
; POP DE
; LD HL,DIR
; LD BC,#0020
;G_HAND2:
; LD A,D
; OR E
; JP Z,G_HAND3
; ADD HL,BC
; DEC DE
; JP G_HAND2
;G_HAND3:
; EXX
; POP DE
; EXX
;G_HAND4:
; EX DE,HL
; LD A,DIRPAGE
; CALL BANK
; EX DE,HL
; LD DE,HANDTA
;
; DUP 32
; LDI
; EDUP
;
; EXX
; OUT (SLOT3),A
; LD HL,HANDTA
;
; DUP 32
; LDI
; EDUP
;
; EXX
; POP BC
; DEC BC
; LD A,B
; OR C
; RET Z
; PUSH BC
; JP G_HAND4
;G_HAND1 POP IX
; POP HL
; POP DE
; RET
;HANDTA BLOCK 32,0
;
;----------------------------------------------------------------------;
; FIND "MASKAREA" IN DIRECTORY
FINDDIR:
SET_PAGE_X DIRPAGE
;
PUSH AF
LD IX,DIRPAGE.buffer
.big_loop:
LD A,(IX+00)
OR A
JR Z,.error
CP #E5
JR Z,.next_step
LD A,(IX+11) ;!HARDCODE
AND #10 ;!HARDCODE
JR Z,.next_step
LD HL,MASKARE
LD D,XH
LD E,XL
EX DE,HL
LD B,11 ;!HARDCODE
.loop: LD A,(DE)
CP "?"
JR Z,.compared
CP (HL)
JR NZ,.next_step
.compared:
INC HL
INC DE
DJNZ .loop
;
LD A,(IX+0)
CP "."
JP NZ,.ADDSPEC
LD A,(IX+1) ;!HARDCODE
CP "."
JP NZ,.IT_DIR
LD HL,WorkDirectory
LD D,H
LD E,L
INC HL
LD BC,WorkDirectory.DEPTH
XOR A
CPIR
JP PO,.error ;[x] 20/11/23 ¯à®¢¥àª  ­  ¢ë室 §  £à ­¨æë
DEC HL ;R009
DEC HL
LD BC,WorkDirectory.DEPTH
LD A,'\'
CPDR
INC HL
EX DE,HL
; CF = 0
SBC HL,DE
EX DE,HL
JR NZ,.MM3
INC HL
.MM3: LD (HL),0
JP .IT_DIR
;
.next_step:
LD BC,#0020 ;!HARDCODE
ADD IX,BC
JR NC,.big_loop
;
.error: POP AF
OUT (SLOT3),A
LD A,DSS_Error.sys.PATH_NOT_FOUND
SCF
RET
.ADDSPEC:
LD HL,WorkDirectory+1
LD BC,WorkDirectory.DEPTH-1
CALL .CHECK_SLASH
JR C,.error
;R011
LD A,B
AND A
JR NZ,.nxt
LD A,C
CP 8+1+3 ;!HARDCODE ¨¬ï ª â «®£  + â®çª  + à áè¨à¥­¨¥
JR C,.error
.nxt: ;
LD E,XL
LD D,XH
; [x] ®¯â¨¬¨§ æ¨ï ¯® à §¬¥àã
EX DE,HL
CALL GetName
EX DE,HL
;
; LD BC,256*8 + ' ' ;!HARDCODE
; .MM1: LD A,(DE)
; INC DE
; CP C
; JR Z,.MM2
; LD (HL),A
; INC HL
; .MM2 DJNZ .MM1 ;x42-40 50-55
; LD A,(DE)
; INC DE
; CP C
; JR Z,.MM3
; LD (HL),"."
; INC HL
; LD (HL),A
; INC HL
; LD A,(DE)
; INC DE
; CP C
; JR Z,.MM3
; LD (HL),A
; INC HL
; LD A,(DE)
; CP C
; JR Z,.MM3
; LD (HL),A
; .MM2_5: INC HL
; .MM3: LD (HL),0
; ; JP IT_DIR
;
.IT_DIR:
LD E,(IX+_sFM.ST_CLUSTER)
LD D,(IX+_sFM.ST_CLUSTER+1)
POP AF
OUT (SLOT3),A
AND A
RET
.CHECK_SLASH:
XOR A
CPIR
;[x] 20/11/23 ¯à®¢¥àª  ­  ¢ë室 §  £à ­¨æë
SCF
RET PO
;
DEC HL
DEC HL
LD A,'\' ; #5C
CP (HL)
INC HL
RET Z
LD (HL),A
INC HL
RET
;----------------------------------------------------------------------;
;----------------------------------------------------------------------;
; <20>à®ç¨â âì ᯨ᮪ ª â «®£ 
LOADDIR:
XOR A
LD H,A
LD L,A
LD IX,0
LD B,A ; ®â ­ ç «  ä ©« 
CALL MOVE_FP
SET_PAGE_X DIRPAGE
PUSH AF
;!TEST no ldir
; ®ç¨áâ¨âì ª¥è ª â «®£ 
; LD HL,#C000
; LD DE,#C001
; LD BC,#3FFF
; LD (HL),L
; LDIR
;
;
LD A,(FatBuffer.DRIVE) ; ­®¬¥à ¤¨áª 
LD (IY+_sFM.DRIVE),A ; á®åà. ¢ ¤¥áªà¨¯â®à
LD D,(IY+_sFM.ST_CLUSTER) ; de=­®¬¥à ¯¥à¢®£® ª« áâ¥à 
LD E,(IY+_sFM.ST_CLUSTER+1)
LD A,D
OR E
JP Z,.LROTDIR ; root ??
LD HL,DIRPAGE.buffer ; ªã¤ 
LD DE,#4000 ; ᪮«ìª®
XOR A ; ¤¥áªà¨¯â®à
CALL READ ; ç⥭¨¥ ¨§ ä ©« 
;!FIXIT ¯à®¢¥àª  ­  ®è¨¡ªã
LD (SAVEDIR.DIRSIZE),DE ; ç¨á«® ¯à®ç¨â. ¡ ©â®¢
POP AF
OUT (SLOT3),A
AND A
RET
.LROTDIR:
LD HL,(FatBuffer.DIR_FRH) ; áâ. à §àï¤
LD IX,(FatBuffer.DIR_FRL) ; ­®¬¥à «®£. ᥪâ®à 
LD A,(FatBuffer.DIR_S_S)
;!TEST
LD B,32 ; !HARDCODE 16384/(sector 512). à §¬¥à root-ª â «®£ 
CP B
JR NC,.RTD1
LD B,A ; ç¨á«® ᥪâ®à®¢
;LD B,32 ; !HARDCODE 16384/(sector 512). à §¬¥à root-ª â «®£ 
;SUB B
;JR NC,.RTD1
;ADD A,B
;LD B,A ; ç¨á«® ᥪâ®à®¢
;
.RTD1: LD A,(FatBuffer.DRIVE) ; ­®¬¥à ¤¨áª 
LD DE,DIRPAGE.buffer ; ¡ãä¥à
LD C,Dss.DRV.Read ; ç⥭¨¥ ᥪâ®à®¢
RST ToDSS.DRV
POP AF
OUT (SLOT3),A
AND A
RET
;----------------------------------------------------------------------;
;----------------------------------------------------------------------;
; ᪮¯¨à®¢ âì § ¯¨áì ¢ ᯨ᮪ ¤¨áª  (ª â «®£ )
; ¨ á¡à®á¨âì ª¥è ª â «®£  ­  ¤¨áª
WRT_HND: SET_PAGE_X DIRPAGE
EX AF,AF'
;
LD IX,DIRPAGE.buffer
;TEST 9/11/23
; EXX
; LD DE,0
; EXX
;
.loop: LD A,(IX+00)
OR A
JR Z,.WRT_HN2
CP #E5
JR Z,.WRT_HN2
LD BC,#0020
ADD IX,BC
JR NC,.loop
;
EX AF,AF'
OUT (SLOT3),A
LD A,DSS_Error.sys.ROOT_OVERFLOW
SCF
RET
.WRT_HN2:
LD D,XH
LD E,XL
LD HL,HANDBUF
LD BC,HANDBUF.SIZE
LDIR
EX AF,AF'
OUT (SLOT3),A
LD HL,DIRPAGE.buffer
LD BC,(SAVEDIR.DIRSIZE)
DEC BC
ADD HL,BC
AND A
SBC HL,DE
JR NC,SAVEDIR
LD HL,(SAVEDIR.DIRSIZE)
LD BC,(FatBuffer.B_P_C)
ADD HL,BC
LD (SAVEDIR.DIRSIZE),HL
AND A
JP SAVEDIR
;----------------------------------------------------------------------;
;!TODO FAT procedures
;----------------------------------------------------------------------;
; ‘¡à®á¨âì ª¥è ª â «®£  ­  ¤¨áª.
; ¢å®¤: iy=áâàãªâãà  ¤¥áªà¨¯â®à 
SAVEDIR:
XOR A
LD HL,0
LD IX,0
LD B,0
CALL MOVE_FP
;
SET_PAGE_X DIRPAGE
PUSH AF
;
LD A,(FatBuffer.DRIVE)
LD (IY+_sFM.DRIVE),A
LD D,(IY+_sFM.ST_CLUSTER)
LD E,(IY+_sFM.ST_CLUSTER+1)
LD A,D
OR E
JP Z,.SROTDIR
LD HL,DIRPAGE.buffer
; à §¬¥à ᯨ᪠ ª â «®£  size_cash_directory
.DIRSIZE+1:
LD DE,0
XOR A
CALL WRITE
POP AF
OUT (SLOT3),A
AND A
RET
.SROTDIR:
LD HL,(FatBuffer.DIR_FRH)
LD IX,(FatBuffer.DIR_FRL)
LD A,(FatBuffer.DIR_S_S)
LD B,32 ;!HARDCODE
SUB B
JR NC,.RTD1S
ADD A,B
LD B,A
.RTD1S: LD A,(FatBuffer.DRIVE)
LD DE,DIRPAGE.buffer
LD C,Dss.DRV.Write
RST ToDSS.DRV
POP AF
OUT (SLOT3),A
AND A
RET
;----------------------------------------------------------------------;
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
; !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 (FAT_Max_Cluster),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 (FatCache),HL
SET_PAGE_X FATPAGE
PUSH AF
XOR A
CALL READ_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
;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
;
INCLUDE "FAT12_16.ASM"
;

View File

@ -1,3 +1,6 @@
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
; FAT 12-16
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
;[BEGIN]
;//MODULE: FAT_X
@ -6,7 +9,7 @@
;---------------------------------------------------------------
;Rev Date Name Description
;---------------------------------------------------------------
;R01 10-02-1999 DNS UPGRADE FAT CASH
;RX01 10-02-1999 DNS UPGRADE FAT CASH
;---------------------------------------------------------------
; “áâ ­®¢¨âì ­ ç «ì­ë© ª« áâ¥à ¤«ï ç⥭¨ï
@ -50,7 +53,7 @@ INC_FAT PUSH HL
AND A
RET
;R01
;RX01
;-----------------------------------------------------------
; <20>à®ç¨â âì ¨§ ª¥è  FAT-  ­®¬¥à á«¥¤. ª« áâ¥à 
@ -82,20 +85,20 @@ R_F_F16:
LD A,H
LD B,H
;AND #0F
AND FAT_CACHE.Mask
AND FAT_CACHE.Size_Mask_16
LD H,A
LD A,B
; A=A/16 ; A - BLOCK FAT (1 BLOCK = 8192 BYTES)
DUP FAT_CACHE.Degree
DUP FAT_CACHE.Degree_16
RRCA
EDUP
;AND #0F
AND FAT_CACHE.Mask2
AND FAT_CACHE.Part_Mask_16
;
ADD HL,HL ; HL - FAT OFFSET (FROM CASH)
LD BC,(FatCache) ; C - BLOCK FAT IN CASH
CP C
CALL NZ,RE_FAT ; A != C - READ NEW BLOCK FAT
CALL NZ,READ_FAT ; A != C - READ NEW BLOCK FAT
LD DE,FATPAGE.cache ; ­ ç «® ª¥è  FAT- 
ADD HL,DE ; ­  ï祩ªã FAT
LD E,(HL) ; ¯à®ç¨â âì ­®¬¥à ª« áâ¥à 
@ -108,7 +111,7 @@ R_F_F16:
SBC HL,DE ; ¯à®¢¥àª  ­  á«ã¦. ª« áâ¥àë
POP HL
RET
;
R_F_F12:
LD D,H
LD E,L
@ -130,7 +133,7 @@ R_F_F12:
AND #07
LD BC,(FatCache) ; C - BLOCK FAT IN CASH
CP C
CALL NZ,RE_FAT ; ŻŕŽç¨â âě ˘ ŞĽč 16 ἪâŽŕŽ˘ FAT- 
CALL NZ,READ_FAT ; ŻŕŽç¨â âě ˘ ŞĽč 16 ἪâŽŕŽ˘ FAT- 
;ENDIF
;
LD DE,FATPAGE.cache ; ­ ç «® ª¥è  FAT- 
@ -144,7 +147,7 @@ R_F_F12:
AND #0F
LD D,A
JP R_F_F02
;
R_F_F01:
LD A,E
AND #F0
@ -175,7 +178,8 @@ R_F_F02:
; in: HL - CLUSTER
; out: DE - (CLUSTER)
;-----------------------------------------------------------
W_T_FAT PUSH DE
W_T_FAT:
PUSH DE
EX DE,HL
LD HL,(FAT_Max_Cluster)
AND A
@ -199,20 +203,20 @@ W_T_F16:
LD A,H
LD B,H
;AND #0F
AND FAT_CACHE.Mask
AND FAT_CACHE.Size_Mask_16
LD H,A
LD A,B
; A=A/16 ; A - BLOCK FAT (1 BLOCK = 8192 BYTES)
DUP FAT_CACHE.Degree
DUP FAT_CACHE.Degree_16
RRCA
EDUP
;AND #0F
AND FAT_CACHE.Mask2
AND FAT_CACHE.Part_Mask_16
;
ADD HL,HL ; HL - FAT OFFSET (FROM CASH) ;!HARDCODE fat16 - à §¬¥à § ¯¨á¨ FAT
LD BC,(FatCache) ; C - BLOCK FAT IN CASH
CP C
CALL NZ,RE_FAT ; A != C - READ NEW BLOCK FAT
CALL NZ,READ_FAT ; A != C - READ NEW BLOCK FAT
LD DE,FATPAGE.cache
ADD HL,DE ; ­  ï祩ªã FAT
POP DE
@ -226,7 +230,7 @@ W_T_F16:
RET
;
; fat12
W_T_F12:
W_T_F12: ;!FIXIT ŻĽŕĽ¤ĽŤ âě ­  ŻĽŕĽŹĽ­­ëĽ FAT_CACHE
PUSH DE
LD D,H
LD E,L
@ -253,7 +257,7 @@ W_T_F12:
AND #07
LD BC,(FatCache) ; C - BLOCK FAT IN CASH
CP C
CALL NZ,RE_FAT ; ŻŕŽç¨â âě ˘ ŞĽč 16 ἪâŽŕŽ˘ FAT- 
CALL NZ,READ_FAT ; ŻŕŽç¨â âě ˘ ŞĽč 16 ἪâŽŕŽ˘ FAT- 
;ENDIF
;
LD DE,FATPAGE.cache
@ -272,8 +276,7 @@ W_T_F12:
OUT (SLOT3),A
AND A
RET
;
W_T_F01:; ¢«¥¢® ­  4 ¡¨âa
SLA E
LD A,E
@ -298,10 +301,12 @@ W_T_F01:;
AND A
RET
;R01
;RX01
;RE_FAT:
; <20>à®ç¨â âì ¢ ª¥è 16 ᥪâ®à®¢ FAT- 
; A - NEW FAT BLOCK
RE_FAT: PUSH HL
READ_FAT:
PUSH HL
PUSH AF
LD A,(FatCache.Update)
OR A
@ -310,23 +315,23 @@ RE_FAT: PUSH HL
LD L,A
LD H,0
LD (FatCache),HL
;FAT BLOCK * 16 = SECTOR OF FAT
DUP FAT_CACHE.Degree
;FAT BLOCK ^ FAT_CACHE.Degree = SECTOR OF FAT
DUP FAT_CACHE.Degree_16
ADD HL,HL ;x2
EDUP
LD DE,(FatBuffer.FAT_FRM)
ADD HL,DE
EX DE,HL
;
PUSH DE
POP IX
LD XH,D
LD XL,E
;LD IX,0
;ADD IX,DE ; ­®¬¥à «®£. ᥪâ®à 
;
LD HL,0 ; áâ. à §àï¤ ; HL:IX - SECTOR FAT FOR READING
LD DE,FATPAGE.cache ; ªã¤  ; DE - FAT ADDRESS
LD A,(FatBuffer.DRIVE) ; ­®¬¥à ¤¨áª 
LD BC,FAT_CACHE.Sectors*256 + Dss.DRV.Read ;༣ B: 16 * 512 = 8192 (CASH SIZE)
LD BC,FAT_CACHE.Sectors*256 + Dss.DRV.Read ;༣ B * FAT_CACHE.Sector_Size = CASH SIZE
RST ToDSS.DRV
POP HL
RET
@ -342,9 +347,10 @@ WR_FAT: SET_PAGE_X FATPAGE
.Start: LD HL,(FatCache)
LD H,0
;FAT BLOCK * 16 = SECTOR OF FAT
DUP FAT_CACHE.Degree
DUP FAT_CACHE.Degree_16
ADD HL,HL ;x2
EDUP
; HL - ­ŽŹĽŕ ŤŽŁ. ἪâŽŕ 
PUSH HL
LD B,H
LD C,L ;BC - BLOCK OF FAT
@ -361,15 +367,15 @@ WR_FAT: SET_PAGE_X FATPAGE
SBC HL,DE
JP C,.ERR
LD A,L
.WALLFAT:
.WALLFAT:; !TODO çńĄ áŕ §ă ˘ IX ­Ľ Łŕ㧨âě FAT_FRM?
LD H,B
LD L,C
LD DE,(FatBuffer.FAT_FRM)
ADD HL,DE
EX DE,HL
;
PUSH DE
POP IX
LD XH,D
LD XL,E
;LD IX,0
;ADD IX,DE ; ­®¬¥à «®£. ᥪâ®à 
;
@ -387,8 +393,8 @@ WR_FAT: SET_PAGE_X FATPAGE
ADD HL,DE
EX DE,HL
;
PUSH DE
POP IX
LD XH,D
LD XL,E
;LD IX,0
;ADD IX,DE ; ­®¬¥à «®£. ᥪâ®à 
;
@ -407,16 +413,17 @@ WR_FAT: SET_PAGE_X FATPAGE
RET
FatCache: WORD #0000
.Block EQU FatCache
.Update EQU FatCache+1
FatCache: WORD #0000
.Block EQU FatCache
.Update EQU FatCache+1
FAT_Max_Cluster: WORD #0FF0 ; ¬ ªá. ç¨á«® ª« áâ¥à®¢ FAT12 (¡¥§ á«ã¦.)
;//MODULE: FAT_X
;[END]
;R01
;RX01
;; HL - CLUSTER
;; DE - (CLUSTER)
;
@ -441,7 +448,7 @@ FAT_Max_Cluster: WORD #0FF0 ;
; DEC A
; LD BC,(FatCache) ; A - ELEMENT OF CASH
; CP C
; CALL NZ,RE_FAT
; CALL NZ,READ_FAT
; LD DE,FAT
; ADD HL,DE
; LD E,(HL)
@ -528,4 +535,4 @@ FAT_Max_Cluster: WORD #0FF0 ;
; LD C,6
; RST #18
; RET
;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

View File

@ -270,15 +270,15 @@ DRVCLC: ; INC A
;---------------------------------------------------------------------[^]
; ;+00 BYTE MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/...
; ;+01 LONG SECTOR OFFSET
; ;+05 LONG SIZE IN SECTORS
; ;+01 DWORD SECTOR OFFSET
; ;+05 DWORD SIZE IN SECTORS
; ;+09 FREE
; ;+15
; LOGDRV: BLOCK .TBL_Entry * LD_DSK,0 ;!FIXIT ¯¥à¥­¥á⨠ª ¡ãä¥à ¬ ¢ ª®­¥æ áâà ­¨æë
; .TBL_Entry EQU 16
; .Size EQU $-LOGDRV
;!TODO § ¬¥­¨âì PUSH ­  EXX?
SELHDD: PUSH DE
PUSH BC
PUSH HL
@ -420,9 +420,8 @@ RESE_H: XOR A
STAT_H: XOR A
RET
CHEK_H:
LD A,#FF
;XOR A
CHEK_H: ;LD A,#FF
XOR A
;AND A
RET

191
DSS/Procedures.asm Normal file
View File

@ -0,0 +1,191 @@
;!TODO Procedures
;----------------------------------------------------------------------;
; ‡ ª®¤¨à®¢ âì ¢à¥¬ï/¤ âã
; ¢å®¤: de - ¤¥­ì/¬¥áïæ
; hl - ç áë/¬¨­ãâë
; b - ᥪ㭤ë
; ix - £®¤
; ¢ë室: de - ¢à¥¬ï
; bc - ¬¥áïæ/¤¥­ì
; ix - £®¤
;
;INPUT: D - DAY; E - MONTH
; H - HOUR; L - MINUTE
; B - SECOND (0...59)
; IX- YEAR (0...65535)
;OUTPUT: DE - hhhhhmmmmmmsssss h - hour, m - min, s - sec/2
; BC - yyyyyyymmmmddddd y - year, m - month, d - day
; (1980-2108)
MK_TIME:
LD A,L
RLCA
RLCA
SLA A
RL H
SLA A
RL H
SLA A
RL H
SRL B
OR B
LD L,A
LD BC,#F844 ;(-1980)
ADD IX,BC
LD A,E
RLCA
RLCA
RLCA
RLCA
AND #F0
LD B,XL
SLA A
RL B
OR D
LD C,A
EX DE,HL
AND A
RET
;----------------------------------------------------------------------;
;!TODO Procedures
;----------------------------------------------------------------------;
; <20> áª®¤¨à®¢ âì ¢à¥¬ï/¤ âã
; ¢å®¤: de - ¢à¥¬ï
; bc - ¬¥áïæ/¤¥­ì
; ix - £®¤
; ¢ë室: de - ¤¥­ì/¬¥áïæ
; hl - ç áë/¬¨­ãâë
; b - ᥪ㭤ë
; ix - £®¤
;
;INPUT: DE - hhhhhmmmmmmsssss h - hour, m - min, s - sec/2
; BC - yyyyyyymmmmddddd y - year, m - month, d - day
; (1980-2108)
;OUTPUT: D - DAY; E - MONTH
; H - HOUR; L - MINUTE
; B - SECOND (0...59)
; IX- YEAR (0...65535)
RMKTIME:
EX DE,HL
LD A,C
AND #1F
LD D,A
SRL B
RR C
LD A,C
RRCA
RRCA
RRCA
RRCA
AND #0F
LD E,A
LD C,B
LD B,0
LD IX,1980
ADD IX,BC
LD A,L
AND #1F
ADD A,A
LD B,A
SRL H
RR L
SRL H
RR L
SRL H
RR L
SRL L
SRL L
AND A
RET
;----------------------------------------------------------------------;
;----------------------------------------------------------------------;
; a..z -> A..Z
UPPER: CP 'a'
RET C
CP 'z' + 1
JR NC,.MDUPPER
SUB #20
.NOUPPER:
RET
.MDUPPER:
CP ' ' ; àãááª ï ¡ãª¢   , ª®¤ #A0
JR C,.NOUPPER
CP '¯' ; àãááª ï ¡ãª¢  ¯, ª®¤ #B0
JR NC,.BGUPPER
SUB #20
RET
.BGUPPER:
CP 'à' ; àãááª ï ¡ãª¢  à, ª®¤ #E0
JR C,.NOUPPER
CP 'ð' ; àãááª ï ¡ãª¢  ð, ª®¤ #F0
JR NC,.HGUPPER
SUB #50
RET
.HGUPPER: CP 'ñ' ; àãááª ï ¡ãª¢  ñ, ª®¤ #F1
RET NZ
DEC A
RET
;----------------------------------------------------------------------;
;!TODO hardware
;----------------------------------------------------------------------;
; —⥭¨¥ ॣ¨áâ஢ CMOS
; ¢å®¤: d=­®¬¥à ॣ¨áâà 
RCMOS: LD C,BIOS.CMOS_RD
RST ToBIOS
;JP BCD2HEX
; INPUT : A - BCD
; OUTPUT: A - HEX
BCD2HEX:
LD E,A
RRCA
RRCA
RRCA
RRCA
AND #0F
LD D,A
ADD A,A
ADD A,A
ADD A,D
ADD A,A
LD D,A
LD A,E
AND #0F
ADD A,D
RET
;----------------------------------------------------------------------;
;!TODO hardware
;----------------------------------------------------------------------;
;!FIXIT ¯¥à¥¤¥« âì ¯® ¤®ª¥ ­  „ «« á ¨ § ¨áì ¢ ï祩ª¨ ç á®¢
; ‡ ¯¨áì ॣ¨áâ஢ CMOS
; ¢å®¤: d=­®¬¥à ॣ¨áâà 
WCMOS: CALL HEX2BCD
LD C,BIOS.CMOS_WR
JP ToBIOS
; INPUT : A - HEX
; OUTPUT: A - BCD
HEX2BCD:
LD BC,#0AFF
.loop: INC C
SUB B
JR NC,.loop
ADD A,B
LD B,A
LD A,C
RLCA
RLCA
RLCA
RLCA
AND #F0
OR B
RET
;----------------------------------------------------------------------;
;

View File

@ -1 +1 @@
734
759

View File

@ -15,23 +15,30 @@
define _shift _bit&1)) + _bit&2)) + _bit&4)) + _bit&8)) + _bit&16)) + _bit&32)) + _bit&64)) + _bit&128))
;
FAT_CACHE:
.Size EQU #2000 ; bytes
.Sector_Size EQU 512
.Size EQU #2000
.Sector_Size EQU #200
.Sectors EQU .Size / .Sector_Size
.bytes_record EQU 2
.Degree EQU _shift ;.Sectors >>> (.Sectors/8)
.Mask EQU high (.Size/.bytes_record - 1) ;#07 ;.Sectors - 1
.Mask2 EQU ((1<<(.bytes_record*8)) / (.Size/2))-1
; for FAT16
.bytes_record_16 EQU 2
.Degree_16 EQU _shift
.Size_Mask_16 EQU high (.Size/.bytes_record_16 - 1)
.Part_Mask_16 EQU ((1<<(.bytes_record_16*8)) / (.Size/2))-1
; for FAT12
.bytes_record_12 EQU 2
.Degree_12 EQU _shift
.Size_Mask_12 EQU high (.Size/.bytes_record_12 - 1)
.Part_Mask_12 EQU ((1<<(.bytes_record_12*8)) / (.Size/2))-1
DISPLAY "bytes_record_16 = ",/H,.bytes_record_16
DISPLAY "Degree_16 = ",/H,.Degree_16
DISPLAY "Size_Mask_16 = ",/H,.Size_Mask_16
DISPLAY "Part_Mask_16 = ",/H,.Part_Mask_16
DISPLAY "bytes_record_12 = ",/H,.bytes_record_12
DISPLAY "Degree_12 = ",/H,.Degree_12
DISPLAY "Size_Mask_12 = ",/H,.Size_Mask_12
DISPLAY "Part_Mask_12 = ",/H,.Part_Mask_12
;
undefine _bit
undefine _shift
DISPLAY ".Size = ",/A,.Size
DISPLAY ".Sectors = ",/A,.Sectors
DISPLAY ".Degree = ",/A,.Degree
DISPLAY ".Mask = ",/A,.Mask
DISPLAY ".Mask2 = ",/A,.Mask2
; DISPLAY " test = ",/A, (1<?((.t)&128)) + (1<?((.t)&4)) + (1<?((.t)&4))
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
;
DSS_MAX_DRIVES_AMOUNT EQU 26
@ -42,6 +49,7 @@ DSS_MAX_DRIVES_AMOUNT EQU 26
DEFINE CLASSIC_CURSOR 0
DEFINE SAVE_PATH_CODE 1
DEFINE MINIMUM_BIOS_VERSION 2*256 + 55 ; version 2.55
DEFINE CHECK_DRIVE_CHANGE 1 ; 1 - â®à¬®§­¥¥, ­® ¡¥§®¯ á­¥¥
;
;-------------------[MEMORY]-------------------------;
DEFINE PORTAL.RSTx18_SWITCH_ADDRESS #82