mirror of
https://github.com/Tolik-Trek/Estex-DSS.git
synced 2026-06-15 01:11:48 +03:00
549 lines
10 KiB
NASM
549 lines
10 KiB
NASM
|
||
;[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 ;!FIXIT à ¡®â ¥â ªà¨¢®
|
||
;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
|
||
|
||
VERSION:
|
||
LD DE,VERS*256+MODF
|
||
XOR A
|
||
LD H,A ;!TODO ¯¨å âì áî¤ OSINFO
|
||
LD L,A
|
||
LD BC,BUILD
|
||
RET
|
||
|
||
//;R10
|
||
//OSINFO:
|
||
//OSINFO_SIG: DB "OSINFOSTRUCTURE",0
|
||
|
||
|
||
;R09
|
||
BOOTDRV: DB #FF
|
||
|
||
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 LD A,(BOOTDRV)
|
||
AND A
|
||
RET
|
||
|
||
;SET 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
|
||
*/
|
||
|
||
|
||
CURRDSK: LD A,(FatBuffer.DRIVE)
|
||
AND A
|
||
RET
|
||
|
||
DISKINF: INC A
|
||
JR Z,CURRDS ;R06
|
||
DEC A ;R06
|
||
CALL CHNDISK ;R06
|
||
RET C ;R06
|
||
CURRDS: LD HL,2
|
||
LD BC,0
|
||
FRESP: PUSH BC
|
||
CALL R_F_FAT
|
||
POP BC
|
||
CP DSS_Error.sys.DISK_FULL
|
||
JR Z,FRESP2
|
||
|
||
LD A,E
|
||
OR D
|
||
JR NZ,SKIC
|
||
INC BC
|
||
SKIC: INC HL
|
||
JP FRESP
|
||
|
||
FRESP2: LD D,B
|
||
LD E,C
|
||
LD HL,(MAX_CLU)
|
||
DEC HL
|
||
LD BC,(BootSector.B_P_S)
|
||
LD A,(BootSector.S_P_C)
|
||
AND A
|
||
RET
|
||
|
||
LDRIVE: DB #02
|
||
TDRIVE: DB #00
|
||
TCLUST: DW #0000
|
||
TCOUNT: DW #0000
|
||
|
||
;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 çñâ ¥ ¨á¯®«ì§ã¥âáï
|
||
TESTDSK LD A,(FatBuffer.DRIVE)
|
||
LD C,Dss.DRV.MediaCheck
|
||
RST ToDSS.DRV
|
||
OR A
|
||
RET Z
|
||
RD_BPB: LD C,SLOT3
|
||
IN B,(C)
|
||
PUSH BC
|
||
|
||
IN A,(SLOT0)
|
||
OUT (SLOT3),A
|
||
;R08
|
||
;LD DE,BOOT+#C000
|
||
LD DE,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,RDERR1
|
||
PUSH IY
|
||
LD DE,#AA55 ;R05
|
||
;R08 LD HL,(BOOT+510) ;R07
|
||
LD HL,(SECBUF+510) ;R08
|
||
AND A ;R05
|
||
SBC HL,DE ;R05
|
||
JP NZ,ERR_BPB ;R05
|
||
;R08
|
||
LD HL,SECBUF ;R08
|
||
LD DE,BootSector ;R08
|
||
LD BC,_sBOOT_SEC ;R08 size
|
||
LDIR
|
||
;R08
|
||
|
||
LD IY,BootSector
|
||
LD A,(IY+_sBOOT_SEC.ID_FORM)
|
||
CP #F0
|
||
JP C,ERR_BPB
|
||
|
||
;!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 E,(IY+#1C) ;Hidden sec
|
||
; LD D,(IY+#1D)
|
||
; 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 A,(BootSector.FAT_NUM) ; amount FATs
|
||
CP 1
|
||
JR Z,C_DATA1
|
||
DEC A
|
||
ADD HL,DE
|
||
LD (FatBuffer.FAT2_XX),HL
|
||
C_DATA1 ADD HL,DE
|
||
DEC A
|
||
JR NZ,C_DATA1
|
||
LD (FatBuffer.DIR_FRM),HL ; first sector DIR
|
||
|
||
LD C,(IY+#0B) ; Size sectors
|
||
LD B,(IY+#0C)
|
||
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 (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)
|
||
EX DE,HL
|
||
DEC HL
|
||
XOR A
|
||
NEXTAD2
|
||
INC A
|
||
JP Z,ERR_BPB
|
||
SBC HL,BC
|
||
JR NC,NEXTAD2
|
||
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
|
||
;LD HL,0
|
||
LD H,B ; âãâ ¢ B ®«ì ¤®«¦¥ ¡ëâì
|
||
LD L,B
|
||
LD C,(IY+#0B) ; Size sector
|
||
LD B,(IY+#0C)
|
||
LD A,(BootSector.S_P_C)
|
||
NEXTAD3
|
||
ADD HL,BC ; calc. cluster size
|
||
DEC A
|
||
JR NZ,NEXTAD3
|
||
LD (FatBuffer.CLU_LEN),HL
|
||
EX DE,HL
|
||
LD HL,#3FFF
|
||
XOR A
|
||
NEXTAD4
|
||
INC A
|
||
JP Z,ERR_BPB
|
||
SBC HL,DE
|
||
JR NC,NEXTAD4
|
||
LD (FatBuffer.C_P_B),A ; A - Clusters per bank (16k)
|
||
|
||
LD HL,BootSector.ID_FAT
|
||
LD DE,FatBuffer.MSG
|
||
LD B,3
|
||
R_BPBL1
|
||
LD A,(DE)
|
||
CP (HL)
|
||
JP NZ,IBMDOS_
|
||
INC HL
|
||
INC DE
|
||
DJNZ R_BPBL1
|
||
FID: LD A,(HL)
|
||
INC HL
|
||
CP ' '
|
||
JR Z,FID
|
||
CP '1'
|
||
JP NZ,ERR_BPB
|
||
LD A,(HL)
|
||
CP '6' ; FAT16
|
||
LD HL,#FFFF
|
||
JR Z,BPB_FAT
|
||
CP '2' ; FAT12
|
||
JP NZ,ERR_BPB
|
||
LD HL,#0FFF
|
||
BPB_FAT:
|
||
LD (FatBuffer.FAT_TYP),A
|
||
LD (FatBuffer.ENDCLUS),HL
|
||
LD HL,0
|
||
LD C,(IY+_sBOOT_SEC.S_P_T) ; Sector per track
|
||
LD B,(IY+_sBOOT_SEC.S_P_T+1)
|
||
LD A,(BootSector.HEADS)
|
||
BPB_L1: ; calc. sector per cylinder
|
||
ADD HL,BC
|
||
DEC A
|
||
JR NZ,BPB_L1
|
||
LD (FatBuffer.S_X_H),HL
|
||
|
||
LD DE,(FatBuffer.DAT_FRM)
|
||
; LD E,(IY+#1C) ;Hidden sec
|
||
; LD D,(IY+#1D)
|
||
; 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 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 C,(IY+_sBOOT_SEC.BPB_BIG_TOTAL_SECTORS+2)
|
||
LD B,(IY+_sBOOT_SEC.BPB_BIG_TOTAL_SECTORS+3)
|
||
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,(BootSector.S_P_C)
|
||
SCF
|
||
S4C01 RRA
|
||
JR C,S4C02
|
||
RR B
|
||
RR C
|
||
RR H
|
||
RR L
|
||
JP S4C01
|
||
S4C02 INC HL
|
||
LD (MAX_CLU),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 (FATCASH),HL
|
||
|
||
SET_PAGE_X FATPAGE
|
||
|
||
PUSH AF
|
||
XOR A
|
||
CALL RE_FAT
|
||
POP AF
|
||
OUT (SLOT3),A
|
||
CALL R_CLUST
|
||
XOR A
|
||
RET
|
||
|
||
IBMDOS_ LD A,(IY+_sBOOT_SEC.ID_FORM)
|
||
CP #F0
|
||
JR C,ERR_BPB
|
||
;????? ¤® «¨ ¨§¬¥¨âì?
|
||
// 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
|
||
|
||
ERR_BPB:
|
||
POP IY
|
||
LD A,DSS_Error.sys.UNKNOWN_FORMAT
|
||
SCF
|
||
RET
|
||
RDERR1: LD A,DSS_Error.sys.NOT_READY
|
||
;SCF
|
||
RET
|
||
|
||
;
|
||
FatBuffer:
|
||
.MSG: DB 'FAT'
|
||
.READ_PG: DB #00
|
||
.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
|
||
;
|
||
|
||
;
|
||
DIRSPEC: DB '\'
|
||
;BLOCK DIRSPEC.DEPTH,0 ;????? <20>ë«® 255, ã ‘ ©¬ 256
|
||
BLOCK DIRSPEC.DEPTH-1,0 ;????? <20>ë«® 255, ã ‘ ©¬ 256
|
||
;
|
||
|
||
;R11
|
||
; !TODO ¯®ç¨¨âì
|
||
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
|
||
LD (HL),A
|
||
INC HL
|
||
LD A,":"
|
||
LD (HL),A
|
||
INC HL
|
||
CALL CURRDIR
|
||
|
||
; ¯®ç¥¬ã ¥ POP AF : OUT (SLOT3),A
|
||
//POP BC
|
||
//LD A,B
|
||
//OUT (SLOT3),A
|
||
POP AF
|
||
OUT (SLOT3),A
|
||
;
|
||
;
|
||
POP AF
|
||
POP BC
|
||
POP DE
|
||
POP HL
|
||
POP IY
|
||
POP IX
|
||
RET
|
||
|
||
; !TODO ¯®ç¨¨âì
|
||
BACK_CUR_PATH:
|
||
PUSH IY
|
||
PUSH IX
|
||
PUSH HL
|
||
PUSH DE
|
||
PUSH BC
|
||
PUSH AF
|
||
|
||
SET_PAGE_X ENVPAGE
|
||
PUSH AF
|
||
|
||
LD HL,TMP_CURDIR
|
||
CALL CHDIR
|
||
|
||
; ¯®ç¥¬ã ¥ POP AF : OUT (SLOT3),A
|
||
//POP BC
|
||
//LD A,B
|
||
//OUT (SLOT3),A
|
||
POP AF
|
||
OUT (SLOT3),A
|
||
;
|
||
POP AF
|
||
POP BC
|
||
POP DE
|
||
POP HL
|
||
POP IX
|
||
POP IY
|
||
RET
|
||
;R11
|
||
|
||
;R12
|
||
SCANDRV:
|
||
;!TEST ¢ DRV-MAIN ¬®£ãâ ¡ëâì ¯à®¡«¥¬ë á ¯à¥àë¢ ¨ï¬¨
|
||
;DI
|
||
LD A,Dss.DRV.RescanDRV
|
||
LD C,Dss.DRV.RescanDRV
|
||
RST ToDSS.DRV
|
||
LD (LDRIVE),A
|
||
;EI
|
||
;
|
||
RET
|
||
;R12
|
||
|
||
|
||
;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]
|
||
|