mirror of
https://github.com/Tolik-Trek/Estex-DSS.git
synced 2026-06-15 09:21:47 +03:00
564 lines
13 KiB
NASM
564 lines
13 KiB
NASM
FAT_BPB: LD A,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.DRIVE_TYPE)
|
||
CP #F0
|
||
JP C,RD_BPB.UnknownBPB
|
||
; PREPARE
|
||
XOR A
|
||
LD (.UsesVarsFAT32),A
|
||
;
|
||
;EXX
|
||
LD H,A
|
||
LD L,A
|
||
LD D,A
|
||
LD E,A
|
||
EXX
|
||
;[ ] fat32
|
||
LD B,A
|
||
LD C,A
|
||
LD (CORE_BUFFERS.FS_Buffer.SectorsPerFAT_H),A ; [ ] fat32
|
||
;
|
||
LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.BytesPerSector)
|
||
LD (CORE_BUFFERS.FS_Buffer.BytesPerSector),HL
|
||
LD A,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.SectorsPerCluster)
|
||
LD (CORE_BUFFERS.FS_Buffer.SectorsPerCluster),A
|
||
; calc. first sector FAT
|
||
LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.RESERVED_SECTORS)
|
||
LD (CORE_BUFFERS.FS_Buffer.FAT1_SEC_L),HL ; low word first sector FAT #1
|
||
LD (CORE_BUFFERS.FS_Buffer.FAT2_SEC_L),HL ; low word first sector FAT #2
|
||
;[ ] fat32
|
||
LD (CORE_BUFFERS.FS_Buffer.FAT1_SEC_H),BC ; high word first sector FAT #1 ; [ ] fat32
|
||
LD (CORE_BUFFERS.FS_Buffer.FAT2_SEC_H),BC ; high word first sector FAT #1 ; [ ] fat32
|
||
LD (CORE_BUFFERS.FS_Buffer.RootDirFirstSector_H),BC
|
||
;LD (CORE_BUFFERS.FS_Buffer.END_CHAIN_CLUSTER_H),BC ; [ ] fat32 reset variables
|
||
;
|
||
;
|
||
LD DE,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.SectorsPerFAT16)
|
||
LD A,E
|
||
OR D
|
||
JR NZ,.skip_high
|
||
;
|
||
LD (.UsesVarsFAT32),A
|
||
|
||
/*
|
||
0001 0000 0000 0000 max ª®«-¢® ª« áâ¥à®¢
|
||
0000 0000 0000 0111 Clusters
|
||
0100 0000 SectorsPerCluster
|
||
0000 0010 0000 0000 BytesPerSector
|
||
D' E' D E
|
||
0000 0000 0000 0011 1000 0000 0000 0000
|
||
|
||
|
||
#FFFF<<5 = #1FFFE0 = 0000 0000 0001 1111 1111 1111 1110 0000
|
||
|
||
#FFFF ®¬¥à § ¯¨á¨
|
||
#1FFFE0 ᬥ饨¥ § ¯¨áì ¢ ä ©«¥ ¤¨à¥ªâ®à¨¨
|
||
#1FFFE0 & #1FC000 ᬥ饨¥ ã¦ë© ¡«®ª ¯® #4000 ¡ ©â®¢
|
||
#1FFFE0 & #3FFF €¤à¥á 㦮© ¯®§¨æ¨¨ ¢ ªíè
|
||
(#1FFFE0 & #1FC000)<<2 ¤¢¨£ ¥¬ ¡ ©â 2 ¨ 3 ç⮡ ¯®«ãç¨âì ®¬¥à ¡«®ª
|
||
|
||
H L
|
||
0000 1011 1101 0001 3025
|
||
0001 0111 1010 0010 0000 3025*32
|
||
0001 0100 0000 0000 0000 and #1FC000
|
||
0011 1010 0010 0000 addr in page
|
||
|
||
H L
|
||
1111 1111 1111 1111 65535
|
||
0001 1111 1111 1111 1110 0000 65535*32
|
||
L Xh Xl
|
||
0001 1111 1100 0000 0000 0000 and #1FC000
|
||
0011 1010 0010 0000 addr in page
|
||
|
||
1 0111 1010 001
|
||
0000 0001 0111 1010 0010 0000
|
||
|
||
|
||
|
||
*/
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
; <20>à®ç¨â âì ᯨ᮪ ª â «®£
|
||
; [x] fat32 ;!TEST
|
||
LOADDIR: ;!TODO optimize
|
||
CALL LOAD_SAVE_DIR_PREPARE
|
||
.next: PUSH AF
|
||
EX AF,AF'
|
||
JR NZ,.read_dir ; root dir or not
|
||
; root dir
|
||
LD A,(CORE_BUFFERS.FS_Buffer.FAT_TYPE)
|
||
CP FAT_TYPE.x32
|
||
JR NZ,.LoadRootDir
|
||
; fat32
|
||
LD HL,(CORE_BUFFERS.FS_Buffer.RootDirStartCluster_L)
|
||
LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L),HL
|
||
LD HL,(CORE_BUFFERS.FS_Buffer.RootDirStartCluster_H)
|
||
LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H),HL
|
||
;LD HL,(CORE_BUFFERS.FS_Buffer.BytesPerCluster) ; !FIXIT ¢ëç¨âë¢ âì ¯®«®áâìî ª â «®£
|
||
LD HL,DIRPAGE.size
|
||
LD (CORE_BUFFERS.FM_BUF.FS_REC.F_SIZE),HL
|
||
;
|
||
.read_dir: LD HL,DIRPAGE.buffer ; ªã¤
|
||
LD DE,DIRPAGE.size ; ᪮«ìª®
|
||
XOR A ; ¤¥áªà¨¯â®à
|
||
CALL READ ; ç⥨¥ ¨§ ä ©«
|
||
EX AF,AF'
|
||
LD (SAVEDIR.DIRSIZE),DE ; ç¨á«® ¯à®ç¨â. ¡ ©â®¢
|
||
POP AF
|
||
OUT (SLOT3),A
|
||
EX AF,AF'
|
||
RET
|
||
;
|
||
.LoadRootDir: LD HL,(CORE_BUFFERS.FS_Buffer.RootDirFirstSector_H) ;!TODO ¢®§¬®¦®, å¢ â¨â LD HL,0
|
||
LD IX,(CORE_BUFFERS.FS_Buffer.RootDirFirstSector_L) ; ®¬¥à «®£. ᥪâ®à
|
||
LD A,(CORE_BUFFERS.FS_Buffer.DirSizeInSectors)
|
||
LD B,32 ; !HARDCODE sector size 512. 16384/(sector 512). à §¬¥à root-ª â «®£
|
||
CP B
|
||
JR NC,.RTD1
|
||
;
|
||
LD B,A ; ç¨á«® ᥪâ®à®¢
|
||
.RTD1: LD A,(CORE_BUFFERS.FS_Buffer.DRIVE) ; ®¬¥à ¤¨áª
|
||
LD DE,DIRPAGE.buffer ; ¡ãä¥à
|
||
LD C,Dss.DRV.Read ; ç⥨¥ ᥪâ®à®¢
|
||
RST ToDSS.DRV
|
||
; !FIXIT ¥â ¯à®¢¥àª¨ ®è¨¡ªã
|
||
; 21/04/2025 fix ¬ãá®à ¢ áâà ¨æ¥ ª â «®£ , ¥á«¨ ª â «®£ ¬¥ìè¥ áâà ¨æë
|
||
BIT 7,D
|
||
JR Z,.exit
|
||
XOR A
|
||
LD (DE),A
|
||
;
|
||
.exit: POP AF
|
||
OUT (SLOT3),A
|
||
RET
|
||
|
||
|
||
; <20>à®ç¨â âì ᯨ᮪ ª â «®£
|
||
; ‚室:
|
||
; (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L), (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H)
|
||
; [ ] ID § ¯¨á¨, ª®â®àë© ¤®«¦¥ ¯®¯ áâì ¢ Š<>˜
|
||
LOAD_SAVE_DIR_PREPARE:
|
||
;!TODO optimize
|
||
XOR A ; FILE MANIPULATOR = 0
|
||
LD H,A
|
||
LD L,A
|
||
LD IX,0
|
||
LD B,A ; ®â ç « ä ©«
|
||
CALL MOVE_FP
|
||
;
|
||
SET_PAGE_X DIRPAGE
|
||
AND A
|
||
PUSH AF
|
||
;
|
||
LD A,(CORE_BUFFERS.FS_Buffer.DRIVE)
|
||
LD (CORE_BUFFERS.FM_BUF.DRIVE),A
|
||
;;;;;;;;
|
||
;LD A,(IY+_sFM.FS_REC.FIRST_CLUSTER_L)
|
||
;OR (IY+_sFM.FS_REC.FIRST_CLUSTER_L+1)
|
||
;OR (IY+_sFM.FS_REC.FIRST_CLUSTER_H)
|
||
;OR (IY+_sFM.FS_REC.FIRST_CLUSTER_H+1)
|
||
;
|
||
XOR A
|
||
LD D,#40
|
||
LD E,A
|
||
LD HL,(CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L)
|
||
EXX
|
||
LD D,A
|
||
LD E,A
|
||
LD HL,(CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H)
|
||
OR H
|
||
OR L
|
||
EXX
|
||
OR H
|
||
OR L
|
||
;;;;;;;;
|
||
PUSH AF
|
||
CALL NZ,.CalcDirSize
|
||
;
|
||
LD (CORE_BUFFERS.FM_BUF.FS_REC.F_SIZE),DE
|
||
EXX
|
||
LD (CORE_BUFFERS.FM_BUF.FS_REC.F_SIZE + 2),DE
|
||
POP AF
|
||
EX AF,AF'
|
||
POP AF
|
||
RET
|
||
;
|
||
.CalcDirSize: ; calc dir size in clusters
|
||
LD DE,0
|
||
;LD HL,(CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L)
|
||
;EXX
|
||
; LD HL,(CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H)
|
||
.loop: ; ;
|
||
;EXX
|
||
INC DE ; <20> ¤¥¥¬áï âãâ â®, ç⮠ᯥæ¨ä¨ª æ¨ï ¢ë¯®«ï¥âáï ¨ ¯¥à¥¯®«¥¨ï ¥ ¡ã¤¥â
|
||
PUSH DE
|
||
CALL READ_FROM_FAT
|
||
EX DE,HL
|
||
POP DE
|
||
EXX
|
||
EX DE,HL
|
||
EXX
|
||
JR NC,.loop
|
||
;
|
||
; DE - à §¬¥à ¤¨à¥ªâ®à¨¨ ¢ ª« áâ¥à å
|
||
;!FIXIT ¬®¦® ®¯â¨¬¨§ãâì ª®«-¢® ᤢ¨£®¢
|
||
;0001 0000 0000 0000 max ª®«-¢® ª« áâ¥à®¢
|
||
; ¯à¨¬¥à
|
||
;0000 0000 0000 0111 Clusters
|
||
; 0100 0000 SectorsPerCluster
|
||
;0000 0010 0000 0000 BytesPerSector
|
||
; D' E' D E
|
||
;0000 0000 0000 0011 1000 0000 0000 0000
|
||
;
|
||
LD A,(CORE_BUFFERS.FS_Buffer.SectorsPerCluster)
|
||
LD BC,(CORE_BUFFERS.FS_Buffer.BytesPerSector)
|
||
; DE':DE - ª®«-¢® ª« áâ¥à®¢
|
||
; A - à §¬¥à ª« áâ¥à ¢ ᥪâ®à å
|
||
; BC - à §¬¥à ᥪâ®à ¢ ¡ ©â å
|
||
; --> DE*BC*A = DE':DE ¤«ï ®â¢¥â å¢ â¨â, ¯®å®¤ã, 4å ॣ¨áâ஢
|
||
EXX
|
||
LD DE,0
|
||
EXX
|
||
SRL B
|
||
RR C
|
||
RRCA
|
||
JR C,.loop2
|
||
;
|
||
.loop1: ;
|
||
SLA E
|
||
RL D
|
||
EXX
|
||
RL E
|
||
RL D
|
||
;RL C
|
||
EXX
|
||
;
|
||
RRCA
|
||
JR NC,.loop1
|
||
;
|
||
.loop2: ;
|
||
SLA E
|
||
RL D
|
||
EXX
|
||
RL E
|
||
RL D
|
||
;RL C
|
||
EXX
|
||
;
|
||
SRL B
|
||
RR C
|
||
JR NC,.loop2
|
||
; <-- DE*BC*A = DE':DE
|
||
RET
|
||
|
||
/* 4 3 2 1
|
||
#FFFF<<5 = #1FFFE0 = 0000 0000 0001 1111 1111 1111 1110 0000
|
||
|
||
#FFFF ®¬¥à § ¯¨á¨
|
||
#1FFFE0 ᬥ饨¥ § ¯¨áì ¢ ä ©«¥ ¤¨à¥ªâ®à¨¨
|
||
#1FFFE0 & #1FC000 ᬥ饨¥ ã¦ë© ¡«®ª ¯® #4000 ¡ ©â®¢
|
||
#1FFFE0 & #3FFF €¤à¥á 㦮© ¯®§¨æ¨¨ ¢ ªíè
|
||
(#1FFFE0 & #1FC000)<<2 ¤¢¨£ ¥¬ ¡ ©â 2 ¨ 3 ç⮡ ¯®«ãç¨âì ®¬¥à ¡«®ª
|
||
|
||
3025
|
||
#0BD1 ®¬¥à § ¯¨á¨
|
||
#017A20 ᬥ饨¥ § ¯¨áì ¢ ä ©«¥ ¤¨à¥ªâ®à¨¨
|
||
#017A20 & #1FC000 = #014000 ᬥ饨¥ ã¦ë© ¡«®ª ¯® #4000 ¡ ©â®¢
|
||
#017A20 & #3FFF = #3A20 €¤à¥á 㦮© ¯®§¨æ¨¨ ¢ ªíè
|
||
(#017A20 & #1FC000)<<2 = #50000 ¤¢¨£ ¥¬ ¡ ©â 2 ¨ 3 ç⮡ ¯®«ãç¨âì ®¬¥à ¡«®ª
|
||
|
||
1011 1101 0001
|
||
|
||
0001 1101 0001
|
||
0000 1110 1000 1000
|
||
0000 0111 0100 0100
|
||
0000 0011 1010 0010
|
||
A E
|
||
00000001 11010001 +
|
||
10000000 11101000
|
||
01000000 01110100
|
||
00100000 00111010
|
||
|
||
0010 0000 0011 1010
|
||
E A
|
||
0011 1010 0010 0000
|
||
|
||
0001 0111 1010 0010 0000
|
||
0000 0011 1010 0010 0000
|
||
0001 0100 0000 0000 0000
|
||
|
||
XOR A
|
||
PUSH IX
|
||
POP DE
|
||
RR D
|
||
;
|
||
RR E
|
||
RRA
|
||
RR E
|
||
RRA
|
||
RR E
|
||
RRA
|
||
*/
|
||
|
||
;----------------------------------------------------------------------;
|
||
|
||
; [ ] big dir
|
||
; ᪮¯¨à®¢ âì § ¯¨áì ¢ ᯨ᮪ ¤¨áª (ª â «®£ ) de ix iy
|
||
; ¨ á¡à®á¨âì ª¥è ª â «®£ ¤¨áª
|
||
; ¢å®¤: (HANDBUF) - § ¯¨áì ª â «®£
|
||
; ¢ë室: DE - record index
|
||
WRITE_DIR_HANDLE:
|
||
SET_PAGE_X DIRPAGE
|
||
EX AF,AF'
|
||
LD HL,DIRPAGE.buffer
|
||
;!TEST 9/11/23 record index
|
||
EXX
|
||
LD DE,0
|
||
EXX
|
||
;
|
||
LD BC,FAT_DIRECTORY_RECORD
|
||
.loop: ;LD A,(IX+00)
|
||
LD A,(HL)
|
||
OR A
|
||
JR Z,.WRT_HN2
|
||
CP #E5
|
||
JR Z,.WRT_HN2
|
||
;ADD IX,BC
|
||
ADD HL,BC
|
||
JR NC,.loop ;!FIXIT ª®«¨ç¥á⢮ § ¯¨á¥© ª â «®£ = áâà ¨æ
|
||
;
|
||
EX AF,AF'
|
||
OUT (SLOT3),A
|
||
LD A,DSS_Error.sys.ROOT_OVERFLOW
|
||
SCF
|
||
RET
|
||
;
|
||
.WRT_HN2: ;LD D,XH
|
||
;LD E,XL
|
||
EX DE,HL
|
||
LD HL,CORE_BUFFERS.HANDBUF
|
||
LD BC,CORE_BUFFERS.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,(CORE_BUFFERS.FS_Buffer.BytesPerCluster)
|
||
ADD HL,BC
|
||
LD (SAVEDIR.DIRSIZE),HL
|
||
AND A
|
||
.SAVEDIR: EXX
|
||
PUSH DE
|
||
EXX
|
||
; [ ] big dir ¯¥à¥¤ ¢ âì ®âªã¤ ¨ ᪮«ìª® ¡ ©â®¢ ¨§¬¥¨«®áì ¢ ªíè, ç⮡ ¥ ¯¨á âì ¤¨áª «¨è¥£®
|
||
CALL SAVEDIR
|
||
POP DE
|
||
RET
|
||
;----------------------------------------------------------------------;
|
||
; ‘¡à®á¨âì ª¥è ª â «®£ ¤¨áª.
|
||
; ¢å®¤: iy=áâàãªâãà ¤¥áªà¨¯â®à
|
||
; [ ] big dir ¯®«ãç âì ®âªã¤ ¨ ᪮«ìª® ¡ ©â®¢ ¨§¬¥¨«®áì ¢ ªíè, ç⮡ ¥ ¯¨á âì ¤¨áª «¨è¥£®
|
||
SAVEDIR: ;!TODO optimize
|
||
CALL LOAD_SAVE_DIR_PREPARE
|
||
PUSH AF
|
||
EX AF,AF'
|
||
JR NZ,.save_dir
|
||
;
|
||
LD A,(CORE_BUFFERS.FS_Buffer.FAT_TYPE)
|
||
CP FAT_TYPE.x32
|
||
JR NZ,.SaveRootDir
|
||
; fat32
|
||
LD HL,(CORE_BUFFERS.FS_Buffer.RootDirStartCluster_L)
|
||
LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L),HL
|
||
LD HL,(CORE_BUFFERS.FS_Buffer.RootDirStartCluster_H)
|
||
LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H),HL
|
||
;
|
||
.save_dir: LD HL,DIRPAGE.buffer
|
||
; à §¬¥à ᯨ᪠ª â «®£ size_cash_directory
|
||
;!FIXIT ¥á«¨ ® 㦠, â® ¯à®¢¥à¨âì ¡ £¨ ( ¯à¨¬¥à, à §¬¥à ¤¨à४â®à¨¨ ¬¥ìè¥ ¯à¨ ®âªàë⨨ ¨ ¡®«ìè¥ ¯®á«¥ ¯à ¢®ª)
|
||
; ª®£¤ ¡ã¤¥â ç⥨¥ ªã᪠¬¨ ª â «®£ ¢ ªíè, âãâ ¥éñ áçñâ稪 ¯à¨ªàãâ¨âì
|
||
.DIRSIZE+1: LD DE,0
|
||
XOR A
|
||
CALL WRITE
|
||
POP AF
|
||
OUT (SLOT3),A
|
||
RET
|
||
;
|
||
.SaveRootDir: LD HL,(CORE_BUFFERS.FS_Buffer.RootDirFirstSector_H) ;!TODO ¢®§¬®¦®, å¢ â¨â LD HL,0
|
||
LD IX,(CORE_BUFFERS.FS_Buffer.RootDirFirstSector_L)
|
||
LD A,(CORE_BUFFERS.FS_Buffer.DirSizeInSectors)
|
||
LD B,32 ;!HARDCODE sector size 512, Root Dir max size in sectors
|
||
SUB B
|
||
JR NC,.RTD1S
|
||
ADD A,B
|
||
LD B,A
|
||
.RTD1S: LD A,(CORE_BUFFERS.FS_Buffer.DRIVE)
|
||
LD DE,DIRPAGE.buffer
|
||
LD C,Dss.DRV.Write
|
||
RST ToDSS.DRV
|
||
POP AF
|
||
OUT (SLOT3),A
|
||
RET
|
||
|
||
|
||
|
||
|
||
|
||
; [ ] ¤®¤¥« âì ¯¥à¥¤ çã ID § ¯¨á¨ ¤¨à¥ªâ®à¨¨ ¨ § £à㧪¨ ¯® ¥© 㦮£® ªã᪠¢ ªíè
|
||
;!TODO FAT procedures
|
||
;----------------------------------------------------------------------;
|
||
; ‚室:
|
||
; HL - ID § ¯¨á¨, ª®â®àë© ¤®«¦¥ ¯®¯ áâì ¢ Š<>˜
|
||
; ‚ë室: A - ‘âà ¨æ , ª®â®à ï ¡ë« ¢ SLOT3 ¤® ¢ë§®¢
|
||
; ZF' - RootDir
|
||
LOAD_SAVE_DIR_PREPARE:
|
||
; [ ] ‚室: HL - ID § ¯¨á¨, ª®â®àë© ¤®«¦¥ ¯®¯ áâì ¢ Š<>˜
|
||
; [ ] ‚ë室: HLIX - ᬥ饨¥ ¢ ä ©«¥ ª â «®£ ã¦ë© ¡«®ª ¯® #4000 ¡ ©â®¢
|
||
; HLIX = (HL*32) & #1FC000 ᬥ饨¥ ã¦ë© ¡«®ª ¯® #4000 ¡ ©â®¢
|
||
XOR A
|
||
LD XL,A
|
||
LD E,A
|
||
LD A,H
|
||
LD H,E
|
||
AND #FE
|
||
RRA
|
||
RR E
|
||
LD (CORE_BUFFERS.FS_Buffer.DirBlock),A
|
||
RRA
|
||
RR E
|
||
RRA
|
||
RR E
|
||
LD XH,E
|
||
LD L,A
|
||
; ;
|
||
;
|
||
XOR A ; FILE MANIPULATOR = 0
|
||
;LD H,A
|
||
;LD L,A
|
||
;LD IX,0
|
||
LD B,A ; ®â ç « ä ©«
|
||
CALL MOVE_FP
|
||
|
||
SET_PAGE_X DIRPAGE
|
||
AND A
|
||
PUSH AF
|
||
;
|
||
LD A,(CORE_BUFFERS.FS_Buffer.DRIVE)
|
||
LD (CORE_BUFFERS.FM_BUF.DRIVE),A
|
||
;;;;;;;;
|
||
XOR A
|
||
LD D,#40
|
||
LD E,A
|
||
LD HL,(CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L)
|
||
EXX
|
||
LD D,A
|
||
LD E,A
|
||
LD HL,(CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H)
|
||
OR H
|
||
OR L
|
||
EXX
|
||
OR H
|
||
OR L
|
||
;;;;;;;;
|
||
PUSH AF
|
||
CALL NZ,.CalcDirSize
|
||
;
|
||
LD (CORE_BUFFERS.FM_BUF.FS_REC.F_SIZE),DE
|
||
EXX
|
||
LD (CORE_BUFFERS.FM_BUF.FS_REC.F_SIZE + 2),DE
|
||
POP AF
|
||
EX AF,AF'
|
||
POP AF
|
||
RET
|
||
;
|
||
.CalcDirSize: ; calc dir size in clusters
|
||
LD DE,0
|
||
;LD HL,(CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L)
|
||
;EXX
|
||
; LD HL,(CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H)
|
||
.loop: ; ;
|
||
;EXX
|
||
INC DE ; <20> ¤¥¥¬áï âãâ â®, ç⮠ᯥæ¨ä¨ª æ¨ï ¢ë¯®«ï¥âáï ¨ ¯¥à¥¯®«¥¨ï ¥ ¡ã¤¥â
|
||
PUSH DE
|
||
CALL READ_FROM_FAT
|
||
EX DE,HL
|
||
POP DE
|
||
EXX
|
||
EX DE,HL
|
||
EXX
|
||
JR NC,.loop
|
||
;
|
||
; DE - à §¬¥à ¤¨à¥ªâ®à¨¨ ¢ ª« áâ¥à å
|
||
;!FIXIT ¬®¦® ®¯â¨¬¨§ãâì ª®«-¢® ᤢ¨£®¢
|
||
;0001 0000 0000 0000 max ª®«-¢® ª« áâ¥à®¢
|
||
; ¯à¨¬¥à
|
||
;0000 0000 0000 0111 Clusters
|
||
; 0100 0000 SectorsPerCluster
|
||
;0000 0010 0000 0000 BytesPerSector
|
||
; D' E' D E
|
||
;0000 0000 0000 0011 1000 0000 0000 0000
|
||
;
|
||
LD A,(CORE_BUFFERS.FS_Buffer.SectorsPerCluster)
|
||
LD BC,(CORE_BUFFERS.FS_Buffer.BytesPerSector)
|
||
; DE':DE - ª®«-¢® ª« áâ¥à®¢
|
||
; A - à §¬¥à ª« áâ¥à ¢ ᥪâ®à å
|
||
; BC - à §¬¥à ᥪâ®à ¢ ¡ ©â å
|
||
; --> DE*BC*A = DE':DE ¤«ï ®â¢¥â å¢ â¨â, ¯®å®¤ã, 4å ॣ¨áâ஢
|
||
EXX
|
||
LD DE,0
|
||
EXX
|
||
SRL B
|
||
RR C
|
||
RRCA
|
||
JR C,.loop2
|
||
;
|
||
.loop1: ;
|
||
SLA E
|
||
RL D
|
||
EXX
|
||
RL E
|
||
RL D
|
||
;RL C
|
||
EXX
|
||
;
|
||
RRCA
|
||
JR NC,.loop1
|
||
;
|
||
.loop2: ;
|
||
SLA E
|
||
RL D
|
||
EXX
|
||
RL E
|
||
RL D
|
||
;RL C
|
||
EXX
|
||
;
|
||
SRL B
|
||
RR C
|
||
JR NC,.loop2
|
||
; <-- DE*BC*A = DE':DE
|
||
RET
|
||
|
||
/* 4 3 2 1
|
||
#FFFF<<5 = #1FFFE0 = 0000 0000 0001 1111 1111 1111 1110 0000
|
||
|
||
#FFFF ®¬¥à § ¯¨á¨
|
||
#1FFFE0 ᬥ饨¥ § ¯¨áì ¢ ä ©«¥ ¤¨à¥ªâ®à¨¨
|
||
#1FFFE0 & #1FC000 ᬥ饨¥ ã¦ë© ¡«®ª ¯® #4000 ¡ ©â®¢
|
||
#1FFFE0 & #3FFF €¤à¥á 㦮© ¯®§¨æ¨¨ ¢ ªíè
|
||
(#1FFFE0 & #1FC000)<<2 ¤¢¨£ ¥¬ ¡ ©â 2 ¨ 3 ç⮡ ¯®«ãç¨âì ®¬¥à ¡«®ª
|
||
*/
|
||
;----------------------------------------------------------------------; |