Files
TSConf_MiST/src/loader_fat32/tsfat/TSFAT.ASM
2018-08-16 05:21:32 +08:00

1 line
20 KiB
NASM
Raw Blame History

;***************************************
;ORG #2000,$
;-------
DEFREQ EQU %00000010
SYC EQU #20AF
PW1 EQU #11AF
PW2 EQU #12AF
PW3 EQU #13AF
;-------REG-----------------------
PG0 EQU #F7
;-------VAR
BUFZZ EQU #8000
PWA EQU BUFZZ+#4000 ;0xC000 - STACK
;-------#8000-#2000---------------------
GENBU EQU BUFZZ+#0000
GENBE EQU BUFZZ+#1000
SECBU EQU GENBE
SECBE EQU SECBU+512
LOBU EQU SECBE
LOBE EQU LOBU+512
LoCALL EQU LOBE+512
INTC EQU BUFZZ+#1F00-1
VALS EQU BUFZZ+#2000
;-------- > #A000 ----------------------
STST EQU VALS; Stream Status (0-notR)
NSDC EQU STST+1;\ Sec num in Cluster
EOC EQU NSDC+1;/ Flag (EndOfChain)
ABT EQU EOC+1
BZN EQU ABT+1;Blocks
NR0 EQU BZN+1
CAHL EQU NR0+2
CADE EQU CAHL+2
LSTSE EQU CADE+2
REZDE EQU LSTSE+4
PR EQU REZDE+2
CLHL EQU PR+4
CLDE EQU CLHL+2
LLHL EQU CLDE+2
LTHL EQU LLHL+4;LAST
LTDE EQU LTHL+2
;------------Entry Pattern:-------------
ENTRY EQU LTDE+2;DS 11
EFLG EQU ENTRY+11
CLSDE EQU ENTRY+20
CLSHL EQU ENTRY+26
SIZIK EQU ENTRY+28
;---------------------------------------
;------------FAT PARAMETERS:------------
BREZS EQU ENTRY+33; [+14(2)]
FSINF EQU BREZS+2; [+48(2)]+[ADDTOP]
BFATS EQU FSINF+4
BFTSZ EQU BFATS+1
BSECPC EQU BFTSZ+4
BROOTC EQU BSECPC+2
FSTFRC EQU BROOTC+4
ADDTOP EQU FSTFRC+4
SFAT EQU ADDTOP+4
SDFAT EQU SFAT+2
CUHL EQU SDFAT+4
CUDE EQU CUHL+2
NXDE EQU CUDE+2
NXHL EQU NXDE+2
LDHL EQU NXHL+2;ADDRESS COPY
COUNT EQU LDHL+2
DUHL EQU COUNT+1
DUDE EQU DUHL+2
DUBA EQU DUDE+2
UUHL EQU DUBA+1
BUHL EQU UUHL+2
CLCNT EQU BUHL+2; COUNTER USED in MKSG
FCTS EQU CLCNT+4; FirstClusTS
BUTS EQU FCTS+4; BUferTS
LSTCAT EQU BUTS+4; Active DIR
RECCAT EQU LSTCAT+4;RECYCLED BIN DIR
;-------
BLKNUM EQU RECCAT+4
DRVRE EQU BLKNUM+4
STRMED EQU DRVRE+1
;---------------------------------------
INCLUDE "tsfat/STREAM.ASM"
;----------------------------------------------------------------------------
;============================================================================
GENTRYX ;i:HL - Text String
; o:ENTRY(11) 8NAME + '.' + 3EXT
LD DE,ENTRY ;ENTRY = LTDE+2;DS 11 <20><> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
LD B,8:CALL DOTZ, RYX
CALL Z, NOPIDE
LD A,(HL):CP ".":JR NZ,$+3:INC HL
LD B,3:CALL RYX,Z,NOPIDE
RET
;=================== (HL), (DE) ======================
; <20><><EFBFBD>
RYX LD A,(HL):OR A:RET Z ; <20><><EFBFBD><EFBFBD> '0' - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CP ".":INC HL:RET Z ; <20><><EFBFBD><EFBFBD> '.' <20><> HL+ <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
LD (DE),A:INC DE:DJNZ RYX ; (DE) <20><><EFBFBD><EFBFBD> <20><> '0' <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
LD A,1:OR A ; A <-1
RET
;======================================================
DOTZ LD A,(HL):CP ".":RET NZ ; <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD> <20><> ".",<2C><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
LD (DE),A:INC HL,DE:DEC B ;
LD A,(HL):CP ".":RET NZ
LD (DE),A:INC HL,DE:DEC B
RET
;---------------------------------------
;GIVE Active DIR:
GLSTCAT ;i:HL(4) - CLUS num
LD DE,LSTCAT,BC,4:LDIR
RET
;---------------------------------------
;LOAD DATA to FAT32 (STREAM):
;i DE - ADDR in WIN
; BC - PAGE
LOAD512
LD (PGO),BC : EX DE,HL ; PG0-BC SAVE PAGE; HL<-DE
LD A,H:AND #3F:LD H,A ; HL - ADDR in Win
CALL LOAD ; (LDMD)<-1,
LD BC,(PGO):EX DE,HL ; DE -ADDRESS
RET ; A -EOC
;-------
;Load512 LD A,1,(LDMD),A:JP LOAD ; (LDMD)<-1 :READ
;-----------------------------------------------------
;READ DATA from FAT32 (STREAM):
LOAD ;i:HL - Address + (PGO)
; B - lenght (512b blocks/sectors)
; CUHL(4) - CLUSnum (if EOC+NSDC=0)
; o:HL - New value + (PGO)
; A - EndOfChain
XOR A:LD (ABT),A ; (ABT) <- 0x0
CALL LPREX:JR NZ,RH ; if Z - READ Sector
LD A,B:CALL NEWCLA ; DEHL - new Claster POS ?
RH LD HL,(LDHL) ; -ADDRESS
LD A,(EOC) ; -EOC
RET
;Positioning to Cluster, if needed: ========================================
;i: HL - MEM Address
LPREX LD (LDHL),HL
LD A,(EOC):OR A:RET NZ ;if EOC=1, end of file RETURN no READ
LD A,(NSDC):OR A:JR NZ,RX ;if NSDC > 0 - <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
PUSH BC:LD HL,CUHL:CALL GIPAG ;NSDC =0; CALL XSPOZ ; CALL XPOZI READ
POP BC
RET ;-->
RX XOR A
RET ;-->
;=======NEW CLASTER ========================================================
;i: A-Lenght
NEWCLA LD (BZN),A ; (BZN) <- A ; PROZ: SET Sector position
NXTC ;i: DEHL - new sector position
LD HL,(LTHL),DE,(LTDE):CALL PROZ ;LD (BLKNUM),HL,(BLKNUM+2),DE
LD HL,BZN ;
LD A,(BSECPC),BC,(NSDC); (BSECPC)-fix (NSDC)
SUB C : LD B,A ;B = SectorinClaster - CurrSectNuminCluster
LD A,(HL):OR A:RET Z ;Lenght=0? => RETURN
;==========================================EXIT =================>>>
SUB B:JR NC,KN ;Lenght - (SecinClast - CurrSectNuminCluster)
;<3B><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>) Lenght, <20><> Lenght=0,
ADD A,B:LD B,A:XOR A
;<3B><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><>
KN ;B-Number of sectors for READ
LD (HL),A ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> (BZN), <20><> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
LD A,B,(NR0),A ; A<-B Number of sectors for READ (NR0)
LD HL,(LDHL);HL-Dest MEMORY, A-Nof Sector
CALL RDDXX ;READ Sector(s) =========== !!!!!!!!!!!
;----------- After READING SECTORs
LD (LDHL),HL;updating MEM Address (LDHL)<-HL+512*NofSector
LD HL,LTHL,DE,LLHL,BC,4 ;(LLHL)<-(LTHL)
LDIR ; (DE)<-(HL); HL++, DE++, 4 times
;--(LTDE)(LTHL) + (NR0) -- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>?
LD HL,(LTHL),DE,(LTDE)
LD BC,(NR0)
ADD HL,BC ; (LTHL)+(NR0)Nof Readed Sector
JR NC,$+3 ;
INC DE ; if C, then DE++
LD (LTHL),HL,(LTDE),DE ;(LTDE)(LTHL) - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
;----------------------------------------------------
;--(NSDC) + (NR0)Nof Readed Sector
LD HL,NSDC,A,C:ADD A,(HL)
LD (HL),A ; <20> (NSDC) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
;-----------------------------------------------------
; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
LD BC,(BSECPC); Sector per Claster
CP C:JP C,NXTC; End OF Cluster? NO ;== LOOP==> NXTC
; YES!
LD HL,(CUHL),DE,(CUDE)
CALL CURIT ; READ SECTOR FROM FAT
CALL GIPAG ; SET NEW POSITION
JP Z,NXTC ;== LOOP==> NXTC
RET
;==================================================================
;RDDXX EQU RDDSE ;
;==================================================================
;------Read Sector from FAT:------------
CURIT ;i:[DE,HL]-Cluster number
; o:SECBU(512)
; HL-poz in SECBU where Cluster
CALL DEL128
SLA C:RL B
SLA C:RL B
PUSH BC
LD (LSTSE+2),DE,(LSTSE),HL
LD BC,(BFTSZ+2)
LD A,D:CP B:JR C,JK
LD A,E:CP C:JR C,JK
LD BC,(BFTSZ)
LD A,H:CP B:JR C,JK
LD A,L:CP C:JR NC,FATEND
JK LD BC,(SFAT)
CALL ADD4B
CALL XSPOZ
CALL XPOZI
LD HL,SECBU,A,1:CALL RDDSE
POP BC
LD HL,SECBU:ADD HL,BC
XOR A
RET
;-------
FATEND POP BC
SCF
RET
;=======Pos. to First Sector of Cluster:==========================================================
GIPAG ;i:HL(4) - Cluster number
CALL TOS ;(NSDC) <-0; (EOC)<-0
LD E,(HL):INC HL ;E<-(HL+0)
LD D,(HL):INC HL ;D<-(HL+1)
LD A,(HL):INC HL ;L<-(HL+2)
LD H,(HL),L,A ;H<-(HL+3)
OR H,E,D:JR Z,RDIR
LD A,H:AND #0F:CP #0F:JR Z,MDC
EX DE,HL
POM LD (CUHL),HL,(CUDE),DE
LD BC,2:OR A:SBC HL,BC:JR NC,$+3:DEC DE
LD A,(BSECPC):CALL UMNOX2 ; [DE,HL] x (BSECPC -Secotr per Cluster ) = NUmber of Sector
LD BC,(SDFAT):CALL ADD4B ; [2FAT+<2B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>] + Sector Number -ABSOLUTE ADDR
EX DE,HL ;
LD BC,(SDFAT+2):ADD HL,BC ;
EX DE,HL
CALL XSPOZ ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CALL XPOZI
XOR A
RET
;--------------------------------------
RDIR LD HL,(BROOTC),DE,(BROOTC+2)
JR POM
MDC LD (EOC),A
OR A
RET
;---Getting Absolute Position of SEC:---
XSPOZ LD BC,(ADDTOP),(CLHL),BC
LD BC,(ADDTOP+2),(CLDE),BC
JP ADD4BF
;========================================================================ENTRY========
;-----Searching ENTRY in Active DIR:----
;BY NAME:
SRHDRN ;i:LSTCAT(4) - Active DIR
; HL - Buffer with Name
; [flag(1)+name(1-12)+#00]
; o: Z: NOT FOUNT
; NZ: ENTRY(32)
; [DE,HL] - Cluster Number
; BC - Address in LOBU
;--------<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ENTRY--------------------------------
LD A,(HL):INC HL ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <-A <20><><EFBFBD> <20><><EFBFBD><EFBFBD>
LD (ENTRY+11),A:CALL GENTRYX ; TSFAT.ASM ENTRY=LTDE+2;DS 11 // <-A
;------------------------------------------------------
LD HL,LSTCAT ;LSTCAT Active DIR
LD DE,CUHL,BC,4:LDIR ;(CUHL)4Byte <- (LSTCAT)4Byte
CALL TOS ;Clear (NSDC) <-0; (EOC)<-0
HDR LD A,(EOC):CP #0F:RET Z
LD HL,LOBU,B,1
;-Load512--------------------
CALL LOAD ; (LDMD)<-1 :READ
;------------------------------------------
LD (HL),0
LD HL,LOBU-32:CALL VEGA:RET NZ
JR HDR
;-------
VEGA LD BC,32:ADD HL,BC ; LOBU -<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> FAT32
LD A,(HL):OR A:RET Z ; HL = LOBU ,<2C><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0x0 -<2D><> <20><><EFBFBD><EFBFBD><EFBFBD> =>
CALL CHEB:JR NZ,VEGA
LD A,1:OR A
RET
;-------<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 11 <20><><EFBFBD><EFBFBD> ENTRY c (HL)----
CHEB PUSH HL
LD DE,ENTRY,B,11:CALL CHEE,Z,CHF
POP HL:RET NZ
PUSH HL:LD DE,ENTRY,BC,32:LDIR
POP BC
LD HL,(CLSHL)
LD DE,(CLSDE)
XOR A
RET
;-------
CHF LD A,(DE),C,A
LD A,(HL):AND #10:CP C
RET
;-------<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> n <20><><EFBFBD><EFBFBD> (DE) c (HL)----
CHEE LD A,(DE):CP (HL):RET NZ
INC HL,DE
DJNZ CHEE ; IF OK 11 times ----
RET
;---------------------------------------
;CHAIN->SECTORS:
CHTOSE ;i:HL(4) - First Cluster number
; DE - BUFFER Address
; BC - End Of BUFFER
LD (DABC),BC
LD (DADE),DE ;- Buffer Address
CKAGO LD (DAHL),HL
CALL GIPP:RET Z
CALL CLUSSEC
LD DE,(DABC)
OR A:SBC HL,DE:RET NC
LD HL,(DAHL)
LD E,(HL):INC HL
LD D,(HL):INC HL
LD A,(HL):INC HL
LD H,(HL),L,A:EX DE,HL
CALL CURIT
JR CKAGO
;-------
CLUSSEC ;i: (DADE) - Buffer Address
; (BSECPC) - Sectors per CLUS
; [DE,HL] - Sector number
;
; o: (DADE) - New Value
LD BC,HL
LD A,(BSECPC) ;-Sector per Claster
LD HL,(DADE)
USS LD (HL),C:INC HL ;(DADE+0)<-L
LD (HL),B:INC HL ;(DADE+1)<-H
LD (HL),E:INC HL ;(DADE+2)<-E
LD (HL),D:INC HL ;(DADE+3)<-D
LD (DADE),HL:DEC A:RET Z
INC BC
EXA:LD A,B:OR C:JR NZ,$+3:INC DE
EXA
JR USS
;-------
GIPP ;i: HL(4) - Cluster number
; o:[DE,HL] - Sector number
; Z - EndOfChain
LD E,(HL):INC HL
LD D,(HL):INC HL
LD A,(HL):INC HL
LD H,(HL),L,A:OR H,E,D:RET Z
LD A,H:CP #0F:RET Z
EX DE,HL
LD BC,2:OR A:SBC HL,BC:JR NC,$+3:DEC DE
LD A,(BSECPC):CALL UMNOX2
LD BC,(SDFAT):CALL ADD4B
EX DE,HL
LD BC,(SDFAT+2):ADD HL,BC
EX DE,HL
CALL XSPOZ
LD A,1:OR A
RET
;==================================================================HDD
;SEARCH PARTITION:
HDD ;i:none
; o:NZ - FAT32 not found
; Z - all FAT32 vars are
; initialized
;========UART===================
;LD A, 0x11
;CALL COM_TX
;===============================
LD HL,0,DE,HL
LD (CUHL),HL,(CUDE),HL
LD (DAHL),HL,(DADE),HL
LD (DUHL),HL,(DUDE),HL
CALL XPOZI
LD HL,LOBU,A,1:CALL RDDSE ;LOBU - Start Dest Adress
LD A,3,(COUNT),A,(ZES),A
;LOBU+446 - Patition Table =================================
LD HL,LOBU+446+4,DE,16,B,4 ;446+4 - <20><><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
;========UART===================
;LD A, H : CALL COM_TX ;0x93
;LD A, L : CALL COM_TX ;0xC2
;===============================================
KKO LD A,(HL) ; A <- (446+4) 0x93C2
;CALL COM_TX ; DEBUG
CP #05:JR Z,OKK ; 0x05 - Extended MS-DOS Partition
CP #0B:JR Z,OKK ; 0x0B - 32-bit FAT (Partition Up to2048GB) //2GB SD
CP #0C:JR Z,OKK ; 0x0C - Same as 0BH, but uses LBA1 13h Extensions
CP #0F:JR Z,OKK ; 0x0F - Same as 05H, but uses LBA1 13h Extensions
ADD HL,DE
DJNZ KKO
;======== IF NOT FOUND -> FAILED ========================================================
FHDD LD A,(ZES):OR A:JP Z,Nhdd ;A<-3(ZES) //ZES EQU LOBE+512+10; // LOBE EQU LOBU+512
LD DE,(DADE),HL,(DAHL)
CALL XPOZI
LD HL,LOBU:LD A,1:CALL RDDSE
LD HL,COUNT:DEC (HL):JP Z,NHDD
LD HL,LOBU+446+16,B,16
XOR A:OR (HL):INC HL:DJNZ $-2
JP NZ,NHDD
LD HL,(LOBU+446+16+8)
LD DE,(LOBU+446+16+8+2)
LD (CLHL),HL,(CLDE),DE
LD HL,(DAHL),DE,(DADE)
CALL ADD4BF
LD (DADE),DE,(DAHL),HL
CALL XPOZI
LD HL,LOBU,A,1:CALL RDDSE
LD HL,(LOBU+446+8)
LD DE,(LOBU+446+8+2)
CALL ADD4BF
JR LDBPB
;======= <20><><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 05/0B/0C/0F, <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> FAT ======
OKK INC HL,HL,HL,HL ;HL+4 // HL(<28><><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)+4 = <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (4byte)
LD E,(HL):INC HL ; ED;
LD D,(HL):INC HL ;
LD A,(HL):INC HL ;
LD H,(HL),L,A ; LH;
EX DE,HL ; LH;ED - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (4byte)
;====== <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> BIOS Parameter Block // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> FAT =================
;LOAD BIOS Parameter Block
LDBPB LD (ADDTOP),HL,(ADDTOP+2),DE ;
CALL XPOZI ; XPOZI: LD (LTHL),HL,(LTDE),DE // LD (BLKNUM),HL,(BLKNUM+2),DE
LD HL,LOBU;LOAD BPB SECTOR
LD A,1:CALL RDDSE; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> BIOS Parameter Block
;RDDSE ============READ SECTOR =============
;i
; HL - destination ADDR
; A - Nof Sector for Read
; (BLKNUM), (BLKNUM+2) - Sector Adress
;===========================================================================
;LD HL,LOBU+3,B,6,A,#1D
;FIVE CP (HL):INC HL:JP NC,FHDD
;DJNZ FIVE
LD HL,(LOBU+11) ;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 512)
LD A,H:DEC A,A:OR L:JP NZ,FHDD ;<3B><><EFBFBD><EFBFBD> <20><> 512 <20><> -> go FHDD == FAILED
LD A,(LOBU+13):OR A:JP Z,FHDD ;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
LD A,(LOBU+14):OR A:JP Z,FHDD ;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> FAT
LD A,(LOBU+16):OR A:JP Z,FHDD ;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> FAT (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 2)
LD HL,(LOBU+17),A,H:OR L ;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
;LD HL,(LOBU+19):OR H,L
LD HL,(LOBU+22):OR H,L ;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> FAT
JP NZ,FHDD
LD HL,(LOBU+36):OR H,L
LD HL,(LOBU+36+2):OR H,L
JP Z,FHDD
;LD HL,ADDTOP,DE,DUHL,BC,4:LDIR
;LD HL,DNU,A,(HL):DEC (HL)
;OR A:JP NZ,FHDD
;LD (HL),0
;=======<3D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ====================================================================================
LD A,(LOBU+13),(BSECPC),A ;(BSECPC)1byte <-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
LD B,8:SRL A:JR C,NER:DJNZ $-4:LD A,1
NER OR A:JP NZ,FHDD
LD HL,(LOBU+14),(BREZS),HL ;(BREZS) 2byte <-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> FAT
LD HL,(LOBU+48),DE,0 ;
CALL XSPOZ
LD (FSINF),HL,(FSINF+2),DE
LD A,(LOBU+16),(BFATS),A ;(BFATS) 1Byte <-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> FAT (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 2)
LD HL,(LOBU+36),(BFTSZ),HL ;(BFTSZ) 4Byte <-Number of Sectors Per FAT
LD HL,(LOBU+36+2),(BFTSZ+2),HL ;
LD HL,(LOBU+44),(BROOTC),HL ;(BROOTC)4Byte <-Cluster Number of the Startof the Root Directory
LD HL,(LOBU+44+2),(BROOTC+2),HL ;
LD HL,(BFTSZ),DE,(BFTSZ+2) ;Number of Sectors Per FAT * 2 = 2 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
LD BC,(BFATS),B,0
CALL UMN4B ;[DE,HL]*BC - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 4Byte <20><> 2Byte
PUSH HL,DE ;<3B> <20><><EFBFBD><EFBFBD>
LD HL,(BREZS) ;(SFAT) <-
LD (SFAT),HL ;(SFAT) <- (BREZS) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
POP DE,BC ; DE,HL + (BREZS) = 2 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> + <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CALL ADD4B ;
LD (SDFAT),HL,(SDFAT+2),DE ; (SDFAT) <- 2 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> + <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
LD HL,0
LD (CUHL),HL
LD (CUDE),HL
LD (LSTCAT),HL
LD (LSTCAT+2),HL
;LD HL,(FSINF),DE,(FSINF+2)
;CALL XPOZI
;LD HL,LOBU
;LD A,1:CALL RDDSE
;LD HL,LOBU+492,DE,FSTFRC
;LD BC,4:LDIR
LD HL,FSTFRC,B,4
;NOPING -----------------------
XOR A:LD (HL),A:INC HL:DJNZ $-2
;------------------------------
CALL TOS
XOR A
RET
;============NHDD========================
NHDD LD HL,(DUHL),DE,(DUDE)
XOR A:LD (ZES),A
JP LDBPB
Nhdd LD A,1:OR A
RET
;---------------------------------------
;ARITHMETICS BLOCK:
DEL128 ;i:[DE,HL]/128
; o:[DE,HL]
; BC - Remainder
LD A,L:EXA
LD A,L,L,H,H,E,E,D,D,0
RLA
RL L,H,E,D
EXA
AND 127
LD B,0,C,A
RET
;-------
DEL512 ;i:[DE,HL]/512
LD A,L,L,H,H,E,E,D,D,0
LD BC,1:OR A:CALL NZ,ADD4B
LD A,2
;-------
DELITX2 ;i:[DE,HL]/A
; A - Power of Two
; o:[DE,HL]
CP 2:RET C
LD C,0
SRL A
L33T SRL D:RR E,H,L,C
SRL A:JR NC,L33T
LD A,C:OR A:RET Z
LD BC,1:CALL ADD4B
RET
;-------
UMNOX2 ;i:[DE,HL]*A
; A - Power of Two
; o:[DE,HL]
CP 2:RET C
SRL A
L33t SLA L:RL H,E,D
SRL A:JR NC,L33t
RET
;-------
;UMNOG ;HL*BC=HL DEdest
;LD DE,HL
;LD A,B,B,C,C,A:INC C
;XOR A:DEC B:JR Z,ODN
;BSR ADD HL,DE
;DJNZ BSR
;ODN LD B,A
;DEC C
;JR NZ,BSR
;RET
INC4b LD B,4
EkE INC (HL):RET NZ:INC HL:DJNZ EkE
RET
ADD4B ADD HL,BC:RET NC:INC DE
RET
ADD4BF ;i:[DE,HL]+[CLDE,CLHL]
; o:[DE,HL]
EX DE,HL
LD BC,(CLDE)
ADD HL,BC
EX DE,HL
LD BC,(CLHL)
ADD HL,BC:JR NC,KNH
INC DE
KNH LD (CLHL),HL
LD (CLDE),DE
RET
;==============UMN4B=================
UMN4B ;i:
; [DE,HL]*BC
; o:
; [DE,HL]
LD A,B,B,C,C,A:INC C
OR A:JR NZ,TEKNO
DEC B:JR Z,UMN1
INC B
TEKNO XOR A
CP B:JR NZ,TYS
DEC C
TYS DEC B
PUSH HL,BC
LD HL,DE
CP B:JR Z,NEGRY
EFRO ADD HL,DE
DJNZ EFRO
LD B,A
NEGRY DEC C:JR NZ,EFRO
LD (REZDE),HL
POP BC,HL
LD DE,HL
CP B:JR Z,NEGRA
OFER ADD HL,DE
JR C,INCDE
ENJO DJNZ OFER
LD B,A
NEGRA DEC C:JR NZ,OFER
LD DE,(REZDE)
UMN1 RET
INCDE EXX
LD HL,(REZDE)
INC HL
LD (REZDE),HL
EXX
JR ENJO
;=================TOS===================
; (NSDC) <-0; (EOC)<-0
TOS XOR A:LD (NSDC),A,(EOC),A:RET
;=================XPOZI=================
;i
;DE HL - Cluster Number
XPOZI LD (LTHL),HL,(LTDE),DE
PROZ LD (BLKNUM),HL,(BLKNUM+2),DE
RET
;=======================================
;NOPING XOR A:LD (HL),A:INC HL:DJNZ $-2
; RET
NOPIDE LD A,32,(DE),A:INC DE:DJNZ $-2
RET
;------------------------------------------------------------
INCLUDE "tsfat/DSDTS.ASM"
;INCLUDE "DSDTS_DMA.ASM"
;-----------LoCALL EQU LOBE+512 ----------------------------
LDMD EQU LoCALL;2
GARY EQU LDMD+2;2;see MKSG
DABC EQU GARY+2;2;see CHTOSE
DAHL EQU DABC+2;2;see HDD proc.
DADE EQU DAHL+2;2; /
ZES EQU DADE+2;1;/
PGO EQU ZES+1;2;Temp Page
PGR EQU PGO+2;2;Restore Page
CRRR EQU PGR+2;4
SPBU EQU CRRR+4;2
;---------------------------------------
END