mirror of
https://github.com/Tolik-Trek/Estex-DSS.git
synced 2026-06-15 09:21:47 +03:00
INITDVC: проверка на выход за границы в DEVICE, LOGDRV, RAMDTBL. Оптимизации.
This commit is contained in:
parent
91b1e90517
commit
ca947dec92
@ -570,7 +570,7 @@ BACK_CUR_PATH:
|
||||
; ¢å®¤: ¥â
|
||||
; ¢ë室: A - ®¬¥à ¯®á«¥¤¥£® «®£. ¤¨áª ¢ á¨á⥬¥
|
||||
;///////////////////////////////////////////////////////////////////////
|
||||
INCLUDE 'ScanDRV.asm'
|
||||
INCLUDE 'ScanDRV.asm'
|
||||
; INCLUDE 'NScanDRV.asm'
|
||||
;///////////////////////////////////////////////////////////////////////
|
||||
;
|
||||
|
||||
@ -441,17 +441,50 @@ INITDVC_RET_DRIVE:
|
||||
INCLUDE 'dss/media_drivers/fdd-drv.asm'
|
||||
INCLUDE 'dss/media_drivers/ram_disk-drv.asm'
|
||||
|
||||
DEVICE_CFG:
|
||||
;
|
||||
;------------------------[shared-drv.asm table]------------------------;
|
||||
DEVICE: ;BLOCK DSS_MAX_DRIVES_AMOUNT * .TBL_Entry,#FF
|
||||
.TBL_Entry EQU 3
|
||||
.Size: EQU DSS_MAX_DRIVES_AMOUNT * .TBL_Entry ;DB #FF
|
||||
;----------------------------------------------------------------------;
|
||||
;
|
||||
|
||||
;
|
||||
;-------------------------[ IDE-DRV.ASM table]-------------------------;
|
||||
;+00 BYTE MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/...
|
||||
;+01 LONG SECTOR OFFSET
|
||||
;+05 LONG SIZE IN SECTORS
|
||||
;+09 FREE
|
||||
;+15
|
||||
LOGDRV EQU $ + DEVICE.Size
|
||||
.TBL_Entry EQU 16
|
||||
.Size EQU .TBL_Entry * DSS_MAX_DRIVES_AMOUNT
|
||||
;----------------------------------------------------------------------;
|
||||
;
|
||||
|
||||
;
|
||||
;-----------------------[ram_disk-drv.asm table]-----------------------;
|
||||
; ’€<E28099>‹ˆ–€ ‘ŽŽ’‚…’‘’‚ˆŸ Œ…†„“ ”ˆ‡ˆ—…‘ŠˆŒ <20>ŽŒ…<C592>ŽŒ <20>€Œ„ˆ‘Š€ ˆ …ƒŽ RAM-DISK ID
|
||||
; Log Number: DB RAM_DRIVE_ID, RAM_DRIVE_NUMBER
|
||||
RAMDTBL EQU $ + DEVICE.Size + LOGDRV.Size
|
||||
.TBL_Entry EQU 2
|
||||
.Size EQU .TBL_Entry * MAX_RAMDRIVES
|
||||
; RAMDTBL: DUP MAX_RAMDRIVES * RAMDTBL.TBL_Entry
|
||||
; DB #FF
|
||||
; EDUP
|
||||
; .Size EQU $-RAMDTBL
|
||||
;----------------------------------------------------------------------;
|
||||
;
|
||||
|
||||
|
||||
;
|
||||
DRV_TEMP_BUFFER:
|
||||
;
|
||||
|
||||
|
||||
;
|
||||
;---------[256 bytes stack for return pages of RST #18 callers]--------;
|
||||
; #3F00 - #3FFF
|
||||
DRV_PAGE.RSTx18_RET_PAGES EQU #3FFF
|
||||
;----------------------------------------------------------------------;
|
||||
ASSERT ((#4000-DRV_TEMP_BUFFER-256) > (DEVICE.Size + LOGDRV.Size + RAMDTBL.Size)), "No space for DRV_TEMP_BUFFER in DRV-MAIN page"
|
||||
; ASSERT ((#4000-DRV_TEMP_BUFFER-256) > (DEVICE.Size + LOGDRV.Size + RAMDTBL.Size)), "No space for DRV_TEMP_BUFFER in DRV-MAIN page"
|
||||
; ENDMODULE
|
||||
; OUTEND
|
||||
;[END]
|
||||
|
||||
@ -207,22 +207,32 @@ RESR_H LD A,DSS_Error.drv.INVALID_COMMAND
|
||||
// Commands for restart #18 //
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
|
||||
;!FIXIT ---------------------------------------------------------------------------[v]
|
||||
;--------------------------------------------------------------------[v]
|
||||
; c=0 Initialization
|
||||
INIT_H: PUSH IY
|
||||
;!TEST ;[ ]
|
||||
XOR A
|
||||
LD (DRVCLC.count),A
|
||||
; ‡ ç¨á⪠⠡«¨æë. <20>¥®¡ï§ ⥫ì®, ® ¬ «® «¨ çñ ¡ã¤¥â ¤ «ìè¥...
|
||||
; LD HL,LOGDRV
|
||||
; LD (HL),#FF
|
||||
; LD DE,LOGDRV+1
|
||||
; LD BC,LOGDRV.Size-1
|
||||
; LDIR
|
||||
;
|
||||
LD HL,LOGDRV
|
||||
LD (OFFSECT),HL
|
||||
|
||||
; IN A,(SLOT2)
|
||||
; PUSH AF
|
||||
; IN A,(SLOT0)
|
||||
; OUT (SLOT2),A
|
||||
|
||||
;LD IX,DEVICE_CFG+#8000 ; ¬®£«® § áà âì ¯ ¬ïâì
|
||||
LD IX,SYS_PAGE.TMP_BUFFER
|
||||
LD C,BIOS.DRV_LIST
|
||||
RST ToBIOS
|
||||
|
||||
; DRV_LIST:
|
||||
; +0 LEN
|
||||
; +1 FDD COUNT
|
||||
; +2 HDD COUNT
|
||||
; +3 CDROM COUNT
|
||||
; +4 RESERVED (28)
|
||||
;
|
||||
IN A,(SLOT3)
|
||||
LD C,A
|
||||
LD A,SYS_PAGE
|
||||
@ -246,91 +256,46 @@ NX_DVCI: PUSH BC
|
||||
INC C
|
||||
JR C,NX_DVCI
|
||||
DJNZ NX_DVCI
|
||||
|
||||
|
||||
; c=0 Initialization
|
||||
; INIT_H: PUSH IY
|
||||
; LD HL,LOGDRV
|
||||
; LD (OFFSECT),HL
|
||||
; LD IX,DEVICE_CFG ;!FIXIT ¥ § áà¥â «¨ ¯ ¬ïâì?
|
||||
; LD C,BIOS.DRV_LIST
|
||||
; RST ToBIOS
|
||||
; XOR A
|
||||
; ;!TEST
|
||||
; ;LD B,(IX+2)
|
||||
; ;CP B
|
||||
; CP (IX+2) ;HDD
|
||||
; JR Z,NO_HARDS
|
||||
; LD BC,4*256 + #80 ;!HARDCODE 4 - ª®«¨ç¥á⢮ ¢¨â®¢, 80 - ID ¢¨â ;!FIXIT
|
||||
; ;LD C,#80 ;!HARDCODE 4 - ª®«¨ç¥á⢮ ¢¨â®¢, 80 - ID ¢¨â ;!FIXIT
|
||||
|
||||
; NX_DVCI: PUSH BC
|
||||
; LD A,C
|
||||
; LD (DRV_NUM),A
|
||||
; LD C,BIOS.DRV_DETECT
|
||||
; RST ToBIOS
|
||||
; ;JR C,.NO_DRIVE
|
||||
; CALL NC,PARTIT
|
||||
; POP BC
|
||||
; INC C
|
||||
; ;JR C,NX_DVCI
|
||||
; DJNZ NX_DVCI
|
||||
;!FIXIT ---------------------------------------------------------------------------[^]
|
||||
;
|
||||
|
||||
;
|
||||
NO_HARDS:
|
||||
POP IY
|
||||
LD HL,(OFFSECT)
|
||||
LD DE,LOGDRV
|
||||
XOR A
|
||||
SBC HL,DE
|
||||
RET Z
|
||||
LD DE,LD_DSK
|
||||
DRVCLC: INC A
|
||||
SBC HL,DE
|
||||
JR NZ,DRVCLC
|
||||
;!TEST
|
||||
; LD HL,(OFFSECT)
|
||||
; LD DE,LOGDRV
|
||||
; XOR A
|
||||
; SBC HL,DE
|
||||
; RET Z
|
||||
; LD DE,LOGDRV.TBL_Entry
|
||||
DRVCLC: ; INC A
|
||||
; SBC HL,DE
|
||||
; JR NZ,DRVCLC
|
||||
;
|
||||
.count+1: LD A,0
|
||||
;
|
||||
AND A
|
||||
RET
|
||||
;---------------------------------------------------------------------[^]
|
||||
|
||||
;DEVICE_CFG EQU #4000 ;!TEST
|
||||
;DEVICE_CFG EQU DRV_TEMP_BUFFER ;!TEST
|
||||
; DB 0 ;LEN
|
||||
; DB 0 ;FDD COUNT
|
||||
; DB 0 ;HDD COUNT
|
||||
; DB 0 ;CDROM COUNT
|
||||
; DS 28 ;RESERVED
|
||||
|
||||
|
||||
;+00 ;SECTORS PER TRACK
|
||||
;+01 ;TRACKS PER CYLLINDER
|
||||
;+02 ;RESERVED
|
||||
;+03 ;HDD/DRIVE/LBA
|
||||
;+04 ;SECTOR PER CYLINDER LOW
|
||||
;+05 ;SECTOR PER CYLINDER HIGH
|
||||
;+06 ;RESERVED
|
||||
;+07 ;RESERVED
|
||||
|
||||
|
||||
;+00 BYTE MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/...
|
||||
;+01 LONG SECTOR OFFSET
|
||||
;+05 LONG SIZE IN SECTORS
|
||||
;+09 FREE
|
||||
;+15
|
||||
LOGDRV: BLOCK .TBL_Entry * LD_DSK,0 ;!FIXIT ¯¥à¥¥á⨠ª ¡ãä¥à ¬ ¢ ª®¥æ áâà ¨æë
|
||||
.TBL_Entry EQU 16
|
||||
.Size EQU $-LOGDRV
|
||||
; ;+00 BYTE MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/...
|
||||
; ;+01 LONG SECTOR OFFSET
|
||||
; ;+05 LONG SIZE IN SECTORS
|
||||
; ;+09 FREE
|
||||
; ;+15
|
||||
; LOGDRV: BLOCK .TBL_Entry * LD_DSK,0 ;!FIXIT ¯¥à¥¥á⨠ª ¡ãä¥à ¬ ¢ ª®¥æ áâà ¨æë
|
||||
; .TBL_Entry EQU 16
|
||||
; .Size EQU $-LOGDRV
|
||||
|
||||
SELHDD: PUSH DE
|
||||
PUSH BC
|
||||
PUSH HL
|
||||
;!TEST
|
||||
;SLA A
|
||||
;RLCA
|
||||
;SLA A
|
||||
;LD L,A
|
||||
;LD H,0
|
||||
;RL H
|
||||
;ADD HL,HL
|
||||
; SLA A
|
||||
; RLA
|
||||
; SLA A
|
||||
; LD L,A
|
||||
; LD H,0
|
||||
; RL H
|
||||
; ADD HL,HL
|
||||
;
|
||||
; original
|
||||
LD L,A
|
||||
@ -428,7 +393,7 @@ HGETPRM:
|
||||
LD A,DSS_Error.drv.GENERAL_FAILURE
|
||||
SCF
|
||||
RET NZ
|
||||
|
||||
;
|
||||
PUSH IX
|
||||
PUSH IY
|
||||
LD H,0
|
||||
@ -440,17 +405,15 @@ HGETPRM:
|
||||
LD C,L
|
||||
LD IY,LOGDRV
|
||||
ADD IY,BC
|
||||
|
||||
;
|
||||
LD A,(IY+0) ;MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/...
|
||||
;!TEST --------------------------------------------------------------------------------+
|
||||
PUSH IY
|
||||
LD C,BIOS.DRV_GET_PAR
|
||||
RST ToBIOS
|
||||
POP IY
|
||||
LD A,DSS_Error.drv.INVALID_DRIVE
|
||||
JR C,.error
|
||||
|
||||
; ¯¥à¥â ᮢª ॣ¨áâ஢ á १ã«ìâ ⮬ ®â BIOS
|
||||
EX DE,HL
|
||||
LD C,E
|
||||
LD E,D
|
||||
@ -458,8 +421,7 @@ HGETPRM:
|
||||
LD A,B
|
||||
LD B,D
|
||||
EXX
|
||||
|
||||
;SECTORS ON LOGICAL DISK
|
||||
; SECTORS ON LOGICAL DISK
|
||||
LD E,(IY+5)
|
||||
LD D,(IY+6)
|
||||
LD L,(IY+7)
|
||||
@ -468,37 +430,7 @@ HGETPRM:
|
||||
EX AF,AF'
|
||||
LD A,(IY+0) ;MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/...
|
||||
EX AF,AF'
|
||||
|
||||
; LD C,A
|
||||
; LD IY,SYS_PAGE.IDE_0
|
||||
; AND #0F
|
||||
; JR Z,GELH1
|
||||
; LD IY,SYS_PAGE.IDE_1
|
||||
; CP 2
|
||||
; JR C,GELH1
|
||||
; LD IY,SYS_PAGE.IDE_2
|
||||
; JR Z,GELH1
|
||||
; LD IY,SYS_PAGE.IDE_3
|
||||
; GELH1: IN A,(SLOT3)
|
||||
; PUSH AF
|
||||
; LD A,SYS_PAGE
|
||||
; OUT (SLOT3),A
|
||||
|
||||
; LD A,(IY+HDD_INIT_TABLE.DRV_Flags) ;HDD/DRV
|
||||
; EXX
|
||||
; LD L,(IY+HDD_INIT_TABLE.CylinderNumberLow) ;CYLINDER LOW +
|
||||
; LD H,(IY+HDD_INIT_TABLE.CylinderNumberHigh) ;CYLINDER HIGH +
|
||||
; LD E,(IY+HDD_INIT_TABLE.HeadsNumber) ;HEADS +
|
||||
; LD D,0
|
||||
; LD C,(IY+HDD_INIT_TABLE.SectorsPerTrack) ;SECTORS +
|
||||
; LD B,0
|
||||
; EXX
|
||||
; EX AF,AF'
|
||||
; POP AF
|
||||
; OUT (SLOT3),A
|
||||
; LD A,C
|
||||
; EX AF,AF'
|
||||
;!TEST --------------------------------------------------------------------------------+
|
||||
;
|
||||
AND A
|
||||
.error: POP IY
|
||||
POP IX
|
||||
@ -632,32 +564,56 @@ HIGHDOS:
|
||||
LD (IX+2),D
|
||||
LD (IX+3),L
|
||||
LD (IX+4),H
|
||||
; LD DE,(CURSECL)
|
||||
; LD HL,(CURSECH)
|
||||
; LD (IX+1),E ;START DISK
|
||||
; LD (IX+2),D
|
||||
; LD (IX+3),L
|
||||
; LD (IX+4),H
|
||||
LD E,(IY+12)
|
||||
LD D,(IY+13)
|
||||
LD L,(IY+14)
|
||||
LD H,(IY+15)
|
||||
LD (IX+5),E ;SIZE DISK
|
||||
LD (IX+5),E ;SIZE DISK
|
||||
LD (IX+6),D
|
||||
LD (IX+7),L
|
||||
LD (IX+8),H
|
||||
;!TEST <09>®¤áâà 客ª ®â ¯¥à¥¯®«¥¨ï â ¡«¨æë LOGDRV
|
||||
LD A,(DRVCLC.count)
|
||||
INC A
|
||||
CP DSS_MAX_DRIVES_AMOUNT+1
|
||||
RET NC
|
||||
LD (DRVCLC.count),A
|
||||
;
|
||||
LD A,(DRV_NUM)
|
||||
LD (IX+0),A
|
||||
LD DE,LD_DSK ; DSKITEM
|
||||
LD DE,LOGDRV.TBL_Entry ;DSKITEM
|
||||
ADD IX,DE
|
||||
LD (OFFSECT),IX
|
||||
NXTPART LD DE,#10
|
||||
NXTPART:
|
||||
LD DE,#10 ;!HARDCODE SZ_PTE - Size of a partition table entry
|
||||
ADD IY,DE
|
||||
POP BC
|
||||
DJNZ DOSAGA
|
||||
AND A
|
||||
RET
|
||||
|
||||
|
||||
;
|
||||
NOEXTDS:
|
||||
CP #0F
|
||||
JR Z,SUBLEV
|
||||
CP #0E
|
||||
JR Z,HIGHDOS
|
||||
CP 6
|
||||
JR Z,HIGHDOS
|
||||
CP 4
|
||||
JR Z,MEDIDOS
|
||||
CP 1
|
||||
JR Z,EASYDOS
|
||||
POP BC
|
||||
OR A
|
||||
RET Z
|
||||
NODEFIN:
|
||||
SCF
|
||||
RET
|
||||
;
|
||||
|
||||
|
||||
PARTIT: IN A,(SLOT3)
|
||||
PUSH AF
|
||||
LD A,SHARED_PAGE
|
||||
@ -667,28 +623,31 @@ PARTIT: IN A,(SLOT3)
|
||||
OUT (SLOT3),A
|
||||
RET
|
||||
|
||||
PARTIT1 LD IX,0
|
||||
PARTIT1:
|
||||
LD IX,0
|
||||
LD DE,0
|
||||
LD (EXTDOSL),DE ;R01
|
||||
LD (EXTDOSH),IX ;R01
|
||||
PARTIT2 LD (CURSECL),DE
|
||||
PARTIT2:
|
||||
LD (CURSECL),DE
|
||||
LD (CURSECH),IX
|
||||
CALL LOADSEC
|
||||
;!TEST
|
||||
;RET C ; for absent drive
|
||||
;
|
||||
LD HL,(PART+510) ;!HARDCODE
|
||||
LD HL,(PART+510) ;!HARDCODE Signature word
|
||||
LD DE,#AA55
|
||||
AND A
|
||||
SBC HL,DE
|
||||
JR NZ,NODEFIN
|
||||
LD IY,PART+#01BE ;!HARDCODE
|
||||
LD B,4
|
||||
DOSAGA PUSH BC
|
||||
;
|
||||
LD IY,PART+#01BE ;!HARDCODE MBR: Offset of partition table in the MBR
|
||||
LD B,4 ;!HARDCODE MBR: Number of entries in the partition table
|
||||
DOSAGA: PUSH BC
|
||||
LD A,(IY+4)
|
||||
CP 5
|
||||
JR NZ,NOEXTDS
|
||||
SUBLEV PUSH IY
|
||||
SUBLEV: PUSH IY
|
||||
LD DE,(CURSECL)
|
||||
LD IX,(CURSECH)
|
||||
PUSH DE
|
||||
@ -701,22 +660,7 @@ SUBLEV PUSH IY
|
||||
CALL LOADSEC
|
||||
POP IY
|
||||
JP NXTPART
|
||||
NOEXTDS CP #0F
|
||||
JP Z,SUBLEV
|
||||
CP #0E
|
||||
JP Z,HIGHDOS
|
||||
CP 6
|
||||
JP Z,HIGHDOS
|
||||
CP 4
|
||||
JP Z,MEDIDOS
|
||||
CP 1
|
||||
JP Z,EASYDOS
|
||||
POP BC
|
||||
OR A
|
||||
RET Z
|
||||
NODEFIN SCF
|
||||
RET
|
||||
|
||||
;
|
||||
EXTDOS: LD HL,(EXTDOSL)
|
||||
LD DE,(EXTDOSH)
|
||||
LD A,L
|
||||
@ -732,8 +676,9 @@ EXTDOS: LD HL,(EXTDOSL)
|
||||
LD (EXTDOSH),HL
|
||||
LD IX,(EXTDOSH)
|
||||
JP PARTIT2
|
||||
|
||||
EXTDOS2 LD IX,(EXTDOSL)
|
||||
;
|
||||
EXTDOS2:
|
||||
LD IX,(EXTDOSL)
|
||||
ADD IX,DE
|
||||
PUSH IX
|
||||
LD DE,(EXTDOSH)
|
||||
@ -743,7 +688,8 @@ EXTDOS2 LD IX,(EXTDOSL)
|
||||
POP DE
|
||||
JP PARTIT2
|
||||
|
||||
LOADSEC PUSH IY
|
||||
LOADSEC:
|
||||
PUSH IY
|
||||
LD IX,(CURSECL)
|
||||
LD HL,(CURSECH)
|
||||
LD DE,PART
|
||||
|
||||
@ -311,9 +311,15 @@ INIT_RD:
|
||||
; JR NC,.loop
|
||||
; LD (S_P_P),A
|
||||
|
||||
; ‡ ç¨á⪠⠡«¨æë. <20>¥®¡ï§ ⥫ì®, ® ¬ «® «¨ çñ ¡ã¤¥â ¤ «ìè¥... ;[ ]
|
||||
; LD HL,RAMDTBL
|
||||
; LD (HL),#FF
|
||||
; LD DE,RAMDTBL+1
|
||||
; LD BC,RAMDTBL.Size-1
|
||||
; LDIR
|
||||
|
||||
LD BC,#0*256 + BIOS.GET_RAMD_ST ; <20>®«ã票¥ ¨¤¥â¨ä¨ª â®à ¡«®ª , § 祮£® RAM-Disk
|
||||
LD DE,RAMDTBL
|
||||
|
||||
.initLoop:
|
||||
PUSH BC
|
||||
LD A,B
|
||||
@ -345,16 +351,16 @@ INIT_RD:
|
||||
; LD HL,ENDDRVR
|
||||
AND A
|
||||
RET
|
||||
|
||||
;!TODO ¢®âªãâì í⨠¢á直¥ â ¡«¨æë ¢ ª®¥æ ä ©« ¨ ªâ¨¢¨à®¢ âì ª ª áâàãªâãàë, ç⮡ ¡¨ ਪ ¬¥ìè¥ ¢¥á¨«
|
||||
; ’€<EFBFBD>‹ˆ–€ ‘ŽŽ’‚…’‘’‚ˆŸ Œ…†„“ ”ˆ‡ˆ—…‘ŠˆŒ <20>ŽŒ…<C592>ŽŒ <20>€Œ„ˆ‘Š€ ˆ …ƒŽ RAM-DISK ID
|
||||
; Log Number: DB RAM_DRIVE_ID, RAM_DRIVE_NUMBER
|
||||
RAMDTBL.TBL_Entry EQU 2
|
||||
RAMDTBL: DUP MAX_RAMDRIVES * RAMDTBL.TBL_Entry
|
||||
DB #FF
|
||||
EDUP
|
||||
.Size EQU $-RAMDTBL
|
||||
;
|
||||
|
||||
; ;
|
||||
; ; ’€<EFBFBD>‹ˆ–€ ‘ŽŽ’‚…’‘’‚ˆŸ Œ…†„“ ”ˆ‡ˆ—…‘ŠˆŒ <20>ŽŒ…<C592>ŽŒ <20>€Œ„ˆ‘Š€ ˆ …ƒŽ RAM-DISK ID
|
||||
; ; Log Number: DB RAM_DRIVE_ID, RAM_DRIVE_NUMBER
|
||||
; RAMDTBL.TBL_Entry EQU 2
|
||||
; RAMDTBL: DUP MAX_RAMDRIVES * RAMDTBL.TBL_Entry
|
||||
; DB #FF
|
||||
; EDUP
|
||||
; .Size EQU $-RAMDTBL
|
||||
; ;
|
||||
|
||||
|
||||
; 00 - GET DEVICE PARAMETERS
|
||||
@ -461,8 +467,8 @@ IOCTL_RD:
|
||||
; RET
|
||||
|
||||
GET_RAMDRV_NUM:
|
||||
ADD A,A
|
||||
LD BC,RAMDTBL
|
||||
SLA A
|
||||
ADD A,C
|
||||
LD C,A
|
||||
LD A,0
|
||||
|
||||
@ -162,9 +162,9 @@ NODEV: POP BC
|
||||
RET
|
||||
|
||||
PDEVICE DW DEVICE
|
||||
DEVICE: BLOCK DSS_MAX_DRIVES_AMOUNT*.TBL_Entry,#FF
|
||||
.Size: DB #FF
|
||||
.TBL_Entry EQU 3
|
||||
; DEVICE: BLOCK DSS_MAX_DRIVES_AMOUNT * .TBL_Entry,#FF
|
||||
; .Size: DB #FF
|
||||
; .TBL_Entry EQU 3
|
||||
|
||||
FLOPPY EQU #0001
|
||||
FIXED EQU #0002
|
||||
@ -210,6 +210,12 @@ INITDVC: XOR A
|
||||
LD (DRV_PAGE.LDRIVE),A ; á¡à. ï祩ªã
|
||||
LD HL,DEVICE
|
||||
LD (PDEVICE),HL ; ¢®ááâ. ï祩ªã
|
||||
; ‡ ç¨á⪠⠡«¨æë. <20>¥®¡ï§ ⥫ì®, ® ¬ «® «¨ çñ ¡ã¤¥â ¤ «ìè¥... ;[ ]
|
||||
LD HL,DEVICE
|
||||
LD (HL),#FF
|
||||
LD DE,DEVICE+1
|
||||
LD BC,DEVICE.Size + LOGDRV.Size + RAMDTBL.Size - 1
|
||||
LDIR
|
||||
; FDD ¤¥¢ ©áë
|
||||
CALL FDDRIVE.INIT ; ã§ âì ç¨á«® FDD-¤¥¢ ©á®¢
|
||||
LD DE,FDDRIVE ; ¤à¥á ®¡à ¡®â稪 ⥪. ¤¥¢ ©á
|
||||
@ -232,10 +238,19 @@ MAKEDVC: LD C,A
|
||||
LD HL,DRV_PAGE.LDRIVE ; ï祩ª ®¬¥à ¯®á«. ¤¨áª
|
||||
ADD A,(HL)
|
||||
LD (HL),A
|
||||
LD A,C
|
||||
LD C,0 ; á¡à.
|
||||
;!TEST ;[ ] ®¯â¨¬¨§¨à®¢ âì ¡ë«® «¥ì
|
||||
CP DSS_MAX_DRIVES_AMOUNT+1
|
||||
JR C,1F
|
||||
LD (HL),DSS_MAX_DRIVES_AMOUNT
|
||||
SUB DSS_MAX_DRIVES_AMOUNT
|
||||
NEG
|
||||
ADD C
|
||||
JP 2F
|
||||
;
|
||||
1: LD A,C
|
||||
OR A
|
||||
RET Z ; ¥â ¤¥¢ ©á®¢
|
||||
2: LD C,0 ; á¡à.
|
||||
LD HL,(PDEVICE) ; ⥪. ¯®«®¦. ¢ â ¡«¨æ¥
|
||||
.loop: LD (HL),C ; ®¬¥à «®£.¤à ©¢ í⮣® ãáâனáâ¢
|
||||
INC HL
|
||||
|
||||
180
DSS/NScanDRV.ASM
Normal file
180
DSS/NScanDRV.ASM
Normal file
@ -0,0 +1,180 @@
|
||||
; !TODO § ¯®¬¨ âì ¯à¥àë¢ ¨ï, ®âª«îç âì áâ àâ¥, ¢®ááâ ¢«¨¢ âì ¢ë室¥
|
||||
SCANDRV:
|
||||
;1 [-----------] [-----------] [-----------] [-----------] [-----------]
|
||||
; LD A,(LDRIVE)
|
||||
; LD (.old_ldrive),A
|
||||
; LD A,(FATCASH.Update)
|
||||
; OR A
|
||||
; CALL NZ,WR_FAT
|
||||
|
||||
CALL GETBOOT
|
||||
LD (.old_letter),A ; bootdisk Log.number
|
||||
; [-----------]
|
||||
|
||||
;2 [-----------] [-----------] [-----------] [-----------] [-----------]
|
||||
; A = bootdisk Log.number
|
||||
LD DE,Dss.DRV.GenIOCTL.Enter
|
||||
LD BC,Dss.DRV.GenIOCTL.GetParams
|
||||
RST ToDSS.DRV
|
||||
EX AF,AF'
|
||||
LD (.old_DRIVE_ID),A
|
||||
; [-----------]
|
||||
|
||||
|
||||
;3 [-----------] [-----------] [-----------] [-----------] [-----------]
|
||||
;!TEST ¢ DRV-MAIN ¬®£ãâ ¡ëâì ¯à®¡«¥¬ë á ¯à¥àë¢ ¨ï¬¨
|
||||
;DI
|
||||
LD A,Dss.DRV.RescanDRV
|
||||
LD C,Dss.DRV.RescanDRV
|
||||
RST ToDSS.DRV
|
||||
LD (LDRIVE),A
|
||||
;EI
|
||||
;
|
||||
; [-----------]
|
||||
|
||||
;4 [-----------] [-----------] [-----------] [-----------] [-----------]
|
||||
.old_DRIVE_ID+1:
|
||||
LD A,0
|
||||
CALL SETBOOT
|
||||
JR C,.ERROR_BOOTDRV_DIES
|
||||
LD (.new_letter),A
|
||||
;
|
||||
LD A,(.old_letter)
|
||||
LD (BOOTDRV),A
|
||||
;
|
||||
|
||||
;5 [-----------] [-----------] [-----------] [-----------] [-----------]
|
||||
AND A
|
||||
LD A,R
|
||||
PUSH AF
|
||||
DI
|
||||
;;;;;;;;
|
||||
IN A,(SLOT3)
|
||||
LD (.restore_page),A
|
||||
LD A,(DRV_PG_NUMBER)
|
||||
OUT (SLOT3),A
|
||||
;;;;;
|
||||
|
||||
; ¢ëç¨á«ï¥¬ ᬥ饨¥ bootdisk ¢ ®¢®© â ¡«¨æ¥ DEVICE
|
||||
.new_letter+1:
|
||||
LD A,0
|
||||
CALL .get_entry_addr
|
||||
PUSH HL
|
||||
; á®åà 塞 § ç¥¨ï ®¢®£® boot
|
||||
LD DE,.TMP_BUFFER
|
||||
LD BC,DEVICE.TBL_Entry
|
||||
LDIR
|
||||
; ¢ëç¨á«ï¥¬ ᬥ饨¥ ¤«ï ¡ãª¢ë áâ ண® bootdisk ¢ ®¢®© â ¡«¨æ¥ DEVICE
|
||||
.old_letter+1:
|
||||
LD A,0
|
||||
CALL .get_entry_addr
|
||||
; ¬¥ï¥¬ ¡ãª¢ã ¤¨áª ¤«ï ¤¥¢ ©á § ï¢è¥£® áâ àãî ¡ãª¢ã bootdisk
|
||||
POP DE
|
||||
LD BC,DEVICE.TBL_Entry
|
||||
LDIR
|
||||
; ¢®ááâ ¢«¨¢ ¥¬ bootdisk áâ ஥ ¬¥áâ®
|
||||
DEC HL
|
||||
LD DE,.TMP_BUFFER + DEVICE.TBL_Entry-1
|
||||
LD BC,DEVICE.TBL_Entry
|
||||
EX DE,HL
|
||||
LDDR
|
||||
; ¯à®¢¥à塞, ¥ 㢥«¨ç¨«®áì «¨ § 票¥ LDRIVE
|
||||
;!TEST
|
||||
LD HL,.old_letter
|
||||
LD A,(LDRIVE)
|
||||
CP (HL)
|
||||
JR NC,.no_change_LDRIVE
|
||||
LD A,(HL)
|
||||
LD (LDRIVE),A
|
||||
;
|
||||
; .old_ldrive+1:
|
||||
;LD L,0
|
||||
;LD A,(LDRIVE)
|
||||
;CP L
|
||||
;JR NC,.no_change_LDRIVE
|
||||
;LD A,L
|
||||
;LD (LDRIVE),A
|
||||
;
|
||||
.no_change_LDRIVE:
|
||||
;
|
||||
; DEC A
|
||||
; CALL DISKINF
|
||||
; LD A,(BOOTDRV)
|
||||
; CALL CHNDISK
|
||||
;;;;;
|
||||
.restore_page+1:
|
||||
LD A,0
|
||||
OUT (SLOT3),A
|
||||
;;;;;;;;
|
||||
POP AF
|
||||
LD A,(LDRIVE)
|
||||
RET PO
|
||||
EI
|
||||
RET
|
||||
.ERROR_BOOTDRV_DIES:
|
||||
LD BC,256*COLORS.CGA.PAPER.BLUE + BIOS.LP_OPEN_S
|
||||
LD E,0
|
||||
RST ToBIOS
|
||||
|
||||
LD BC,256*COLORS.CGA.PAPER.BLUE + BIOS.LP_CLS_WIN
|
||||
LD DE,0
|
||||
LD HL,#2050
|
||||
RST ToBIOS
|
||||
|
||||
LD A,1
|
||||
OUT (RGMOD),A ; set scr-2
|
||||
|
||||
LD HL,.ERROR_MSG
|
||||
LD DE,#A000
|
||||
LD BC,.ERROR_MSG.size
|
||||
LD A,C
|
||||
LDIR
|
||||
|
||||
LD DE,#10*256 + (80-.ERROR_MSG.size)/2 ;X=0, Y=16
|
||||
LD C,BIOS.LP_SET_PLACE
|
||||
RST ToBIOS
|
||||
|
||||
LD HL,#A000
|
||||
LD DE,0*256 + COLORS.CGA.FLASH + COLORS.CGA.PAPER.BLUE + COLORS.CGA.INC.WHITE
|
||||
LD B,A
|
||||
LD C,BIOS.LP_PRINT_LINE3
|
||||
RST ToBIOS
|
||||
|
||||
.loop: DI
|
||||
; .loop: LD A,R
|
||||
; AND 7
|
||||
; OUT (BorderColor),A
|
||||
HALT
|
||||
JR .loop
|
||||
|
||||
.ERROR_MSG: DZ "Kernel panic! Boot disk lost. Press Ctrl+Alt+Del or RESET."
|
||||
.ERROR_MSG.size EQU $-.ERROR_MSG
|
||||
.get_entry_addr:
|
||||
_CALC_DEVICE_ENTRY DEVICE + #C000
|
||||
RET
|
||||
;
|
||||
.TMP_BUFFER: BLOCK 3,#FF
|
||||
|
||||
; .old_letter: DB #FF
|
||||
; .old_DRIVE_ID: DB #FF
|
||||
; .new_letter: DB #FF
|
||||
|
||||
|
||||
|
||||
/*
|
||||
;+00 BYTE MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/...
|
||||
;+01 LONG SECTOR OFFSET
|
||||
;+05 LONG SIZE IN SECTORS
|
||||
;+09 LONG Volume Serial Number in HEX ; [ ] ;!TODO
|
||||
;+13 WORD FREE
|
||||
;+15 BYTE FREE
|
||||
|
||||
LOGDRV: BLOCK .TBL_Entry*LD_DSK,0 ; ld_dsk = 16
|
||||
.TBL_Entry EQU 16
|
||||
.Size EQU $-LOGDRV
|
||||
|
||||
|
||||
DEVICE: BLOCK DSS_MAX_DRIVES_AMOUNT * .TBL_Entry,#FF
|
||||
.Size: DB #FF
|
||||
.TBL_Entry EQU 3
|
||||
*/
|
||||
@ -1 +1 @@
|
||||
302
|
||||
312
|
||||
@ -8,7 +8,7 @@
|
||||
;
|
||||
|
||||
;
|
||||
LD_DSK EQU 16 ; ¬ ͺᨬ «μ<EFBFBD>₯ ͺ<EFBFBD>«¨η₯αβ’<EFBFBD> «<EFBFBD>£¨η₯αͺ¨ε HDD €¨αͺ<EFBFBD>’ ’ α¨αβ₯¬₯
|
||||
;LD_DSK EQU 16 ; ¬ ͺᨬ «μ<EFBFBD>₯ ͺ<EFBFBD>«¨η₯αβ’<EFBFBD> «<EFBFBD>£¨η₯αͺ¨ε HDD €¨αͺ<EFBFBD>’ ’ α¨αβ₯¬₯
|
||||
DSS_MAX_DRIVES_AMOUNT EQU 26
|
||||
DEFINE MAX_RAMDRIVES 16
|
||||
DEFINE NeedSafePort_Y 1
|
||||
|
||||
@ -1 +1 @@
|
||||
Subproject commit a4f102897a7fa7488c1e64cf8329f5659c6b0d6b
|
||||
Subproject commit 6eacd6475231a504fae4ed03a12f5cd1cb166ac0
|
||||
Loading…
Reference in New Issue
Block a user