mirror of
https://github.com/Tolik-Trek/Spectrum.EXE.git
synced 2026-06-15 00:51:36 +03:00
213 lines
4.1 KiB
NASM
213 lines
4.1 KiB
NASM
;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-;
|
||
|
||
; in: HL - CLUSTER
|
||
; out: HL:IX - SECTOR
|
||
; ‚ ç «¥ ¤®«¦ ¡ëâì ¢ë¯®«¥ ¨¨æ¨ «¨§ æ¨ï BPB 4x
|
||
CLUSTER_TO_SECTOR:
|
||
IN A,(SLOT3)
|
||
EX AF,AF'
|
||
LD A,SYS_PAGE
|
||
OUT (SLOT3),A
|
||
LD A,(SYS_PAGE.MS_BPB+CLAST_SIZE)
|
||
EX DE,HL
|
||
LD HL,(SYS_PAGE.MSD_DAT_SEC)
|
||
LD (.MSD_DAT_SEC),HL
|
||
LD HL,(SYS_PAGE.MSD_DAT_SEC2)
|
||
LD (.MSD_DAT_SEC2),HL
|
||
EX DE,HL
|
||
EX AF,AF'
|
||
OUT (SLOT3),A
|
||
EX AF,AF'
|
||
;
|
||
LD DE,0 ;!FIXIT for FAT32
|
||
DEC HL
|
||
DEC HL
|
||
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
|
||
.MSD_DAT_SEC+1: LD DE,0 ;first data sector ;!FIXIT ¥á«¨ ç «ìë© á¥ªâ®à > #FFFF
|
||
XOR A
|
||
ADD IX,DE
|
||
.MSD_DAT_SEC2+1:
|
||
LD DE,0
|
||
ADC HL,DE
|
||
;!TODO ¤® «¨ ¯à®¢¥àïâì ¯¥à¥¯®«¥¨¥ HL:IX?
|
||
RET
|
||
;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-;
|
||
|
||
|
||
;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-;
|
||
SET_IMAGE_DIR_SECTOR:
|
||
LD HL,ONE_FILE
|
||
LD DE,TMP_BUFF
|
||
LD A,FAT_ATTR.DIRECTORY
|
||
LD BC,Dss.F_First.FATname
|
||
RST ToDSS
|
||
RET C
|
||
;
|
||
LD HL,(TMP_BUFF+26) ; ;!HARDCODE first dir cluster
|
||
CALL CLUSTER_TO_SECTOR
|
||
LD (RESET_TO_ZX.DIR_SEC_L),IX
|
||
LD (RESET_TO_ZX.DIR_SEC_H),HL
|
||
RET
|
||
;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-;
|
||
|
||
|
||
;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-;
|
||
SET_CURRENT_HDD:
|
||
.NUMBER+1: LD A,#FF
|
||
CP #FF
|
||
LD C,BIOS.HDD_INIT
|
||
JP Z,ToBIOS_18
|
||
LD C,BIOS.HDD_PART ; IDE-1/IDE-2
|
||
JP ToBIOS_18
|
||
;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-;
|
||
|
||
;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-;
|
||
BPB_SetUp: LD A,SYS_PAGE
|
||
LD HL,SYS_PAGE.MS_BPB
|
||
LD C,BIOS.HDD_READ_BPB
|
||
RST ToBIOS
|
||
.PARAMS: IN A,(SLOT3)
|
||
EX AF,AF'
|
||
LD A,SYS_PAGE
|
||
OUT (SLOT3),A
|
||
;
|
||
LD A,(SYS_PAGE.MS_BPB+FORM_CODE)
|
||
CP #F0
|
||
JP C,.ERROR_BPB
|
||
|
||
LD DE,SYS_PAGE.MS_BPB+FAT_ID
|
||
LD HL,.FAT1_MSG
|
||
LD B,4
|
||
.L1: LD A,(DE)
|
||
CP ' '
|
||
JR NZ,.L11
|
||
INC DE
|
||
JR .L1
|
||
.L11: CP (HL)
|
||
JR NZ,.PC_DOS
|
||
|
||
INC HL
|
||
INC DE
|
||
DJNZ .L1
|
||
LD A,(DE)
|
||
CP '6'
|
||
LD HL,#81FF ; FAT16 ä« £
|
||
JR Z,.FAT
|
||
CP '2'
|
||
JP NZ,.ERROR_BPB
|
||
|
||
.PC_DOS: LD HL,#01FF ; FAT12 ä« £
|
||
.FAT: LD (SYS_PAGE.FAT_FLAG),HL
|
||
|
||
LD A,(SYS_PAGE.MS_BPB+S_P_T) ; Š®«¨ç¥á⢮ ᥪâ®à®¢ â४
|
||
LD (SYS_PAGE.MSD_SECS),A
|
||
|
||
LD IX,(SYS_PAGE.MS_BPB+SPECIAL_SECS)
|
||
LD HL,(SYS_PAGE.MS_BPB+SPECIAL_SECS+2)
|
||
.NO_LD_SPECIAL: LD BC,0
|
||
LD DE,(SYS_PAGE.MS_BPB+RESERV_SECS)
|
||
|
||
ADD IX,DE
|
||
ADC HL,BC
|
||
|
||
LD (SYS_PAGE.MSD_FAT_SEC),IX ; ç «ìë© á¥ªâ®à FAT
|
||
LD (SYS_PAGE.MSD_FAT_SEC2),HL ; ç «ìë© á¥ªâ®à FAT
|
||
|
||
LD DE,(SYS_PAGE.MS_BPB+S_P_F) ; ç¨á«® ᥪâ®à®¢ ¢ FAT
|
||
LD A,(SYS_PAGE.MS_BPB+FATS_NUM) ; ª®«¨ç¥á⢮ FATs
|
||
.NEXT_ADD:
|
||
ADD IX,DE
|
||
ADC HL,BC
|
||
DEC A
|
||
JR NZ,.NEXT_ADD
|
||
LD (SYS_PAGE.MSD_CAT_SEC),IX ; ç «ìë© á¥ªâ®à DIR
|
||
LD (SYS_PAGE.MSD_CAT_SEC2),HL ; ç «ìë© á¥ªâ®à DIR
|
||
LD BC,(SYS_PAGE.MS_BPB+SEC_SIZE) ; <20> §¬¥à ᥪâ®à
|
||
LD A,B
|
||
RL C
|
||
RLA
|
||
RL C
|
||
RLA
|
||
RL C
|
||
RLA
|
||
LD C,A
|
||
LD B,0 ; BC - ç¨á«® ä ©«®¢ëå § ¯¨á¥© ¢ ᥪâ®à¥
|
||
LD (SYS_PAGE.FilesPerSector),A
|
||
LD DE,(SYS_PAGE.MS_BPB+FLS_NUM) ; —¨á«® ä ©«®¢ëå § ¯¨á¥©
|
||
|
||
EX DE,HL
|
||
DEC HL
|
||
XOR A
|
||
.NEXT_ADD2:
|
||
INC A
|
||
JR Z,.ERROR_BPB
|
||
SBC HL,BC
|
||
JR NC,.NEXT_ADD2
|
||
EX DE,HL
|
||
|
||
LD E,A ; A - ç¨á«® ᥪâ®à®¢ ¢ DIR
|
||
LD BC,0
|
||
LD D,B
|
||
LD (SYS_PAGE.SectorsPerCluster),A
|
||
|
||
ADD IX,DE ; <20> ç «® DATA area
|
||
ADC HL,BC
|
||
|
||
LD (SYS_PAGE.MSD_DAT_SEC),IX
|
||
LD (SYS_PAGE.MSD_DAT_SEC2),HL
|
||
|
||
LD BC,(SYS_PAGE.MS_BPB+SEC_SIZE) ; <20> §¬¥à ᥪâ®à
|
||
; D = 0
|
||
LD H,D
|
||
LD L,D
|
||
LD E,D
|
||
LD A,(SYS_PAGE.MS_BPB+CLAST_SIZE)
|
||
LD D,A
|
||
XOR A
|
||
.NEXT_ADD3:
|
||
ADD HL,BC ; ‚ëç¨á«¥¨¥ ¤«¨ë ª« áâ¥à
|
||
ADC A,E
|
||
DEC D
|
||
JR NZ,.NEXT_ADD3
|
||
|
||
LD (SYS_PAGE.CLASTER_LEN),HL
|
||
LD B,E
|
||
LD C,A
|
||
LD (SYS_PAGE.CLASTER_LEN2),BC
|
||
;
|
||
; DE=0
|
||
EX DE,HL ;LD HL,0
|
||
LD BC,(SYS_PAGE.MS_BPB+S_P_T)
|
||
LD A,(SYS_PAGE.MS_BPB+H_P_S)
|
||
.BPB_L1: ; ‚›—ˆ‘‹ˆ’œ ŠŽ‹ˆ—…‘’‚Ž ‘…Š’Ž<E28099>Ž‚ <20>€ –ˆ‹ˆ<E280B9>„<EFBFBD>
|
||
ADD HL,BC
|
||
DEC A
|
||
JR NZ,.BPB_L1
|
||
LD (SYS_PAGE.S_X_H),HL
|
||
;
|
||
EX AF,AF'
|
||
OUT (SLOT3),A
|
||
AND A
|
||
RET
|
||
;
|
||
.ERROR_BPB:
|
||
EX AF,AF'
|
||
OUT (SLOT3),A
|
||
SCF
|
||
RET
|
||
;
|
||
.FAT1_MSG: DB "FAT1"
|
||
;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-; |