INITDVC: проверка на выход за границы в DEVICE, LOGDRV, RAMDTBL. Оптимизации.

This commit is contained in:
Anatoliy Belyanskiy 2023-09-23 07:16:52 +10:00
parent 91b1e90517
commit ca947dec92
9 changed files with 361 additions and 181 deletions

View File

@ -441,17 +441,50 @@ INITDVC_RET_DRIVE:
INCLUDE 'dss/media_drivers/fdd-drv.asm' INCLUDE 'dss/media_drivers/fdd-drv.asm'
INCLUDE 'dss/media_drivers/ram_disk-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: DRV_TEMP_BUFFER:
;
;
;---------[256 bytes stack for return pages of RST #18 callers]--------; ;---------[256 bytes stack for return pages of RST #18 callers]--------;
; #3F00 - #3FFF ; #3F00 - #3FFF
DRV_PAGE.RSTx18_RET_PAGES EQU #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 ; ENDMODULE
; OUTEND ; OUTEND
;[END] ;[END]

View File

@ -207,22 +207,32 @@ RESR_H LD A,DSS_Error.drv.INVALID_COMMAND
// Commands for restart #18 // // Commands for restart #18 //
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////
;!FIXIT ---------------------------------------------------------------------------[v] ;--------------------------------------------------------------------[v]
; c=0 Initialization ; c=0 Initialization
INIT_H: PUSH IY 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 HL,LOGDRV
LD (OFFSECT),HL 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 IX,SYS_PAGE.TMP_BUFFER
LD C,BIOS.DRV_LIST LD C,BIOS.DRV_LIST
RST ToBIOS RST ToBIOS
; DRV_LIST:
; +0 LEN
; +1 FDD COUNT
; +2 HDD COUNT
; +3 CDROM COUNT
; +4 RESERVED (28)
;
IN A,(SLOT3) IN A,(SLOT3)
LD C,A LD C,A
LD A,SYS_PAGE LD A,SYS_PAGE
@ -246,86 +256,41 @@ NX_DVCI: PUSH BC
INC C INC C
JR C,NX_DVCI JR C,NX_DVCI
DJNZ 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: NO_HARDS:
POP IY POP IY
LD HL,(OFFSECT) ;!TEST
LD DE,LOGDRV ; LD HL,(OFFSECT)
XOR A ; LD DE,LOGDRV
SBC HL,DE ; XOR A
RET Z ; SBC HL,DE
LD DE,LD_DSK ; RET Z
DRVCLC: INC A ; LD DE,LOGDRV.TBL_Entry
SBC HL,DE DRVCLC: ; INC A
JR NZ,DRVCLC ; SBC HL,DE
; JR NZ,DRVCLC
;
.count+1: LD A,0
;
AND A AND A
RET RET
;---------------------------------------------------------------------[^]
;DEVICE_CFG EQU #4000 ;!TEST ; ;+00 BYTE MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/...
;DEVICE_CFG EQU DRV_TEMP_BUFFER ;!TEST ; ;+01 LONG SECTOR OFFSET
; DB 0 ;LEN ; ;+05 LONG SIZE IN SECTORS
; DB 0 ;FDD COUNT ; ;+09 FREE
; DB 0 ;HDD COUNT ; ;+15
; DB 0 ;CDROM COUNT ; LOGDRV: BLOCK .TBL_Entry * LD_DSK,0 ;!FIXIT ¯¥à¥­¥á⨠ª ¡ãä¥à ¬ ¢ ª®­¥æ áâà ­¨æë
; DS 28 ;RESERVED ; .TBL_Entry EQU 16
; .Size EQU $-LOGDRV
;+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
SELHDD: PUSH DE SELHDD: PUSH DE
PUSH BC PUSH BC
PUSH HL PUSH HL
;!TEST ;!TEST
; SLA A ; SLA A
;RLCA ; RLA
; SLA A ; SLA A
; LD L,A ; LD L,A
; LD H,0 ; LD H,0
@ -428,7 +393,7 @@ HGETPRM:
LD A,DSS_Error.drv.GENERAL_FAILURE LD A,DSS_Error.drv.GENERAL_FAILURE
SCF SCF
RET NZ RET NZ
;
PUSH IX PUSH IX
PUSH IY PUSH IY
LD H,0 LD H,0
@ -440,17 +405,15 @@ HGETPRM:
LD C,L LD C,L
LD IY,LOGDRV LD IY,LOGDRV
ADD IY,BC ADD IY,BC
; ;
LD A,(IY+0) ;MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/... LD A,(IY+0) ;MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/...
;!TEST --------------------------------------------------------------------------------+
PUSH IY PUSH IY
LD C,BIOS.DRV_GET_PAR LD C,BIOS.DRV_GET_PAR
RST ToBIOS RST ToBIOS
POP IY POP IY
LD A,DSS_Error.drv.INVALID_DRIVE LD A,DSS_Error.drv.INVALID_DRIVE
JR C,.error JR C,.error
; ¯¥à¥â á®¢ª  ॣ¨áâ஢ á १ã«ìâ â®¬ ®â BIOS
EX DE,HL EX DE,HL
LD C,E LD C,E
LD E,D LD E,D
@ -458,7 +421,6 @@ HGETPRM:
LD A,B LD A,B
LD B,D LD B,D
EXX EXX
; SECTORS ON LOGICAL DISK ; SECTORS ON LOGICAL DISK
LD E,(IY+5) LD E,(IY+5)
LD D,(IY+6) LD D,(IY+6)
@ -468,37 +430,7 @@ HGETPRM:
EX AF,AF' EX AF,AF'
LD A,(IY+0) ;MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/... LD A,(IY+0) ;MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/...
EX AF,AF' 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 AND A
.error: POP IY .error: POP IY
POP IX POP IX
@ -632,12 +564,6 @@ HIGHDOS:
LD (IX+2),D LD (IX+2),D
LD (IX+3),L LD (IX+3),L
LD (IX+4),H 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 E,(IY+12)
LD D,(IY+13) LD D,(IY+13)
LD L,(IY+14) LD L,(IY+14)
@ -646,18 +572,48 @@ HIGHDOS:
LD (IX+6),D LD (IX+6),D
LD (IX+7),L LD (IX+7),L
LD (IX+8),H 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 A,(DRV_NUM)
LD (IX+0),A LD (IX+0),A
LD DE,LD_DSK ; DSKITEM LD DE,LOGDRV.TBL_Entry ;DSKITEM
ADD IX,DE ADD IX,DE
LD (OFFSECT),IX LD (OFFSECT),IX
NXTPART LD DE,#10 NXTPART:
LD DE,#10 ;!HARDCODE SZ_PTE - Size of a partition table entry
ADD IY,DE ADD IY,DE
POP BC POP BC
DJNZ DOSAGA DJNZ DOSAGA
AND A AND A
RET 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) PARTIT: IN A,(SLOT3)
PUSH AF PUSH AF
LD A,SHARED_PAGE LD A,SHARED_PAGE
@ -667,28 +623,31 @@ PARTIT: IN A,(SLOT3)
OUT (SLOT3),A OUT (SLOT3),A
RET RET
PARTIT1 LD IX,0 PARTIT1:
LD IX,0
LD DE,0 LD DE,0
LD (EXTDOSL),DE ;R01 LD (EXTDOSL),DE ;R01
LD (EXTDOSH),IX ;R01 LD (EXTDOSH),IX ;R01
PARTIT2 LD (CURSECL),DE PARTIT2:
LD (CURSECL),DE
LD (CURSECH),IX LD (CURSECH),IX
CALL LOADSEC CALL LOADSEC
;!TEST ;!TEST
;RET C ; for absent drive ;RET C ; for absent drive
; ;
LD HL,(PART+510) ;!HARDCODE LD HL,(PART+510) ;!HARDCODE Signature word
LD DE,#AA55 LD DE,#AA55
AND A AND A
SBC HL,DE SBC HL,DE
JR NZ,NODEFIN JR NZ,NODEFIN
LD IY,PART+#01BE ;!HARDCODE ;
LD B,4 LD IY,PART+#01BE ;!HARDCODE MBR: Offset of partition table in the MBR
DOSAGA PUSH BC LD B,4 ;!HARDCODE MBR: Number of entries in the partition table
DOSAGA: PUSH BC
LD A,(IY+4) LD A,(IY+4)
CP 5 CP 5
JR NZ,NOEXTDS JR NZ,NOEXTDS
SUBLEV PUSH IY SUBLEV: PUSH IY
LD DE,(CURSECL) LD DE,(CURSECL)
LD IX,(CURSECH) LD IX,(CURSECH)
PUSH DE PUSH DE
@ -701,22 +660,7 @@ SUBLEV PUSH IY
CALL LOADSEC CALL LOADSEC
POP IY POP IY
JP NXTPART 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) EXTDOS: LD HL,(EXTDOSL)
LD DE,(EXTDOSH) LD DE,(EXTDOSH)
LD A,L LD A,L
@ -732,8 +676,9 @@ EXTDOS: LD HL,(EXTDOSL)
LD (EXTDOSH),HL LD (EXTDOSH),HL
LD IX,(EXTDOSH) LD IX,(EXTDOSH)
JP PARTIT2 JP PARTIT2
;
EXTDOS2 LD IX,(EXTDOSL) EXTDOS2:
LD IX,(EXTDOSL)
ADD IX,DE ADD IX,DE
PUSH IX PUSH IX
LD DE,(EXTDOSH) LD DE,(EXTDOSH)
@ -743,7 +688,8 @@ EXTDOS2 LD IX,(EXTDOSL)
POP DE POP DE
JP PARTIT2 JP PARTIT2
LOADSEC PUSH IY LOADSEC:
PUSH IY
LD IX,(CURSECL) LD IX,(CURSECL)
LD HL,(CURSECH) LD HL,(CURSECH)
LD DE,PART LD DE,PART

View File

@ -311,9 +311,15 @@ INIT_RD:
; JR NC,.loop ; JR NC,.loop
; LD (S_P_P),A ; 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 BC,#0*256 + BIOS.GET_RAMD_ST ; <20>®«ã祭¨¥ ¨¤¥­â¨ä¨ª â®à  ¡«®ª , ­ §­ ç¥­­®£® ­  RAM-Disk
LD DE,RAMDTBL LD DE,RAMDTBL
.initLoop: .initLoop:
PUSH BC PUSH BC
LD A,B LD A,B
@ -346,15 +352,15 @@ INIT_RD:
AND A AND A
RET RET
;!TODO ¢®âª­ãâì í⨠¢á直¥ â ¡«¨æë ¢ ª®­¥æ ä ©«  ¨  ªâ¨¢¨à®¢ âì ª ª áâàãªâãàë, ç⮡ ¡¨­ à­¨ª ¬¥­ìè¥ ¢¥á¨« ; ;
; <EFBFBD>ˆ€ ‘ŽŽ’‚…’‘’‚ˆŸ Œ…†„“ ”ˆ‡ˆ—…‘ŠˆŒ <20>ŽŒ…<C592>ŽŒ <20>€Œ„ˆŠ€ ˆ …ƒŽ RAM-DISK ID ; ; <EFBFBD>ˆ€ ‘ŽŽ’‚…’‘’‚ˆŸ Œ…†„“ ”ˆ‡ˆ—…‘ŠˆŒ <20>ŽŒ…<C592>ŽŒ <20>€Œ„ˆŠ€ ˆ …ƒŽ RAM-DISK ID
; Log Number: DB RAM_DRIVE_ID, RAM_DRIVE_NUMBER ; ; Log Number: DB RAM_DRIVE_ID, RAM_DRIVE_NUMBER
RAMDTBL.TBL_Entry EQU 2 ; RAMDTBL.TBL_Entry EQU 2
RAMDTBL: DUP MAX_RAMDRIVES * RAMDTBL.TBL_Entry ; RAMDTBL: DUP MAX_RAMDRIVES * RAMDTBL.TBL_Entry
DB #FF ; DB #FF
EDUP ; EDUP
.Size EQU $-RAMDTBL ; .Size EQU $-RAMDTBL
; ; ;
; 00 - GET DEVICE PARAMETERS ; 00 - GET DEVICE PARAMETERS
@ -461,8 +467,8 @@ IOCTL_RD:
; RET ; RET
GET_RAMDRV_NUM: GET_RAMDRV_NUM:
ADD A,A
LD BC,RAMDTBL LD BC,RAMDTBL
SLA A
ADD A,C ADD A,C
LD C,A LD C,A
LD A,0 LD A,0

View File

@ -162,9 +162,9 @@ NODEV: POP BC
RET RET
PDEVICE DW DEVICE PDEVICE DW DEVICE
DEVICE: BLOCK DSS_MAX_DRIVES_AMOUNT*.TBL_Entry,#FF ; DEVICE: BLOCK DSS_MAX_DRIVES_AMOUNT * .TBL_Entry,#FF
.Size: DB #FF ; .Size: DB #FF
.TBL_Entry EQU 3 ; .TBL_Entry EQU 3
FLOPPY EQU #0001 FLOPPY EQU #0001
FIXED EQU #0002 FIXED EQU #0002
@ -210,6 +210,12 @@ INITDVC: XOR A
LD (DRV_PAGE.LDRIVE),A ; á¡à. ï祩ªã LD (DRV_PAGE.LDRIVE),A ; á¡à. ï祩ªã
LD HL,DEVICE LD HL,DEVICE
LD (PDEVICE),HL ; ¢®ááâ. ï祩ªã 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 ¤¥¢ ©áë ; FDD ¤¥¢ ©áë
CALL FDDRIVE.INIT ; ã§­ âì ç¨á«® FDD-¤¥¢ ©á®¢ CALL FDDRIVE.INIT ; ã§­ âì ç¨á«® FDD-¤¥¢ ©á®¢
LD DE,FDDRIVE ;  ¤à¥á ®¡à ¡®â稪  ⥪. ¤¥¢ ©á  LD DE,FDDRIVE ;  ¤à¥á ®¡à ¡®â稪  ⥪. ¤¥¢ ©á 
@ -232,10 +238,19 @@ MAKEDVC: LD C,A
LD HL,DRV_PAGE.LDRIVE ; ï祩ª  ­®¬¥à  ¯®á«. ¤¨áª  LD HL,DRV_PAGE.LDRIVE ; ï祩ª  ­®¬¥à  ¯®á«. ¤¨áª 
ADD A,(HL) ADD A,(HL)
LD (HL),A LD (HL),A
LD A,C ;!TEST ;[ ] ®¯â¨¬¨§¨à®¢ âì ¡ë«® «¥­ì
LD C,0 ; á¡à. 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 OR A
RET Z ; ­¥â ¤¥¢ ©á®¢ RET Z ; ­¥â ¤¥¢ ©á®¢
2: LD C,0 ; á¡à.
LD HL,(PDEVICE) ; ⥪. ¯®«®¦. ¢ â ¡«¨æ¥ LD HL,(PDEVICE) ; ⥪. ¯®«®¦. ¢ â ¡«¨æ¥
.loop: LD (HL),C ; ­®¬¥à «®£.¤à ©¢  í⮣® ãáâனá⢠ .loop: LD (HL),C ; ­®¬¥à «®£.¤à ©¢  í⮣® ãáâனá⢠
INC HL INC HL

180
DSS/NScanDRV.ASM Normal file
View 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
*/

View File

@ -1 +1 @@
302 312

View File

@ -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 DSS_MAX_DRIVES_AMOUNT EQU 26
DEFINE MAX_RAMDRIVES 16 DEFINE MAX_RAMDRIVES 16
DEFINE NeedSafePort_Y 1 DEFINE NeedSafePort_Y 1

@ -1 +1 @@
Subproject commit a4f102897a7fa7488c1e64cf8329f5659c6b0d6b Subproject commit 6eacd6475231a504fae4ed03a12f5cd1cb166ac0