mirror of
https://github.com/UzixLS/TSConf_MiST.git
synced 2025-07-18 14:51:25 +03:00
1 line
20 KiB
NASM
1 line
20 KiB
NASM
;***************************************
|
||
;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
|