Estex-DSS/DSS/DOS_X.ASM
Anatoliy Belyanskiy e542bc0bd3 Speeeeeeeed))))
2023-07-08 00:05:39 +10:00

549 lines
10 KiB
NASM
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

;[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 10
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 #01
.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]