diff --git a/BOOT/boot.asm b/BOOT/boot.asm index 43f21e3..77fc142 100644 --- a/BOOT/boot.asm +++ b/BOOT/boot.asm @@ -482,7 +482,7 @@ write_to_BPB: PUSH BC ; write_no_BPB: ld a,(disk) ; номер заданного диска - ld de,#55AA + ld de,Dss.DRV.GenIOCTL.Enter ld bc,Dss.DRV.GenIOCTL.GetParams rst ToDSS.DRV ex af,af' diff --git a/DSS/API/bootDsk.asm b/DSS/API/bootDsk.asm index b53de93..0361015 100644 --- a/DSS/API/bootDsk.asm +++ b/DSS/API/bootDsk.asm @@ -31,8 +31,8 @@ BOOTDSK: ; .loop: PUSH BC LD A,C - LD DE,#55AA - LD BC,256*0 + Dss.DRV.GenIOCTL + LD DE,Dss.DRV.GenIOCTL.Enter + LD BC,Dss.DRV.GenIOCTL.GetParams RST ToDSS.DRV ;[x] 17.12.2023 загрузка с активного раздела, а не с первого LD A,C ; номер партиции в MBR диска diff --git a/DSS/FS/FAT/FAT.asm b/DSS/FS/FAT/FAT.asm index 18ee8d3..57399db 100644 --- a/DSS/FS/FAT/FAT.asm +++ b/DSS/FS/FAT/FAT.asm @@ -519,7 +519,9 @@ LOADDIR: ;!TODO optimize LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L),HL LD HL,(CORE_BUFFERS.FatBuffer.RootDirStartCluster_H) LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H),HL - LD HL,#4000 ;!HARDCODE размер директории + + ;LD HL,(CORE_BUFFERS.FatBuffer.BytesPerCluster) ; !FIXIT вычитывать полностью каталог + LD HL,#4000 ; размер директории LD (CORE_BUFFERS.FM_BUF.FS_REC.F_SIZE),HL ; .read_dir: LD HL,DIRPAGE.buffer ; куда diff --git a/DSS/build.txt b/DSS/build.txt index 1345866..b92b677 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -994 \ No newline at end of file +995 \ No newline at end of file diff --git a/DSS/drivers/media/ReScanDRV.ASM b/DSS/drivers/media/ReScanDRV.ASM index 8a81258..b2eea94 100644 --- a/DSS/drivers/media/ReScanDRV.ASM +++ b/DSS/drivers/media/ReScanDRV.ASM @@ -44,7 +44,7 @@ ReScanDRV: ; [ищем что за драйв] EX DE,HL ; FDD? - LD HL,FDDRIVE + LD HL,FDD_DRV.API_TABLE AND A SBC HL,DE JR Z,.nextN ; пропуск FDD драйвов diff --git a/DSS/drivers/media/fdd-drv.asm b/DSS/drivers/media/fdd-drv.asm index 50104cf..d07437e 100644 --- a/DSS/drivers/media/fdd-drv.asm +++ b/DSS/drivers/media/fdd-drv.asm @@ -122,104 +122,130 @@ ; 12 (0Ch) - BUSY (DEVICE OPENED) ; 13 (0Dh) - RESERVED -R_COM EQU #0F ;Command/Status -R_TRK EQU #3F ;Track -R_SEC EQU #5F ;Sector -R_DAT EQU #7F ;Data -R_DSK EQU #FF ;Drive Control +; R_COM EQU #0F ;Command/Status +; R_TRK EQU #3F ;Track +; R_SEC EQU #5F ;Sector +; R_DAT EQU #7F ;Data +; R_DSK EQU #FF ;Drive Control +; COM_B EQU #1B + + + +//////////////////////////////////////////////////////////////////////// + MODULE FDD_DRV +//////////////////////////////////////////////////////////////////////// -COM_B EQU #1B ;------------------------------------------------- ; Обработчик FDD (rst 18h) ;------------------------------------------------- -FDDRIVE: - INC C - DEC C - JP Z,.INIT ;#00 - DEC C - JP Z,.RESE ;#01 - DEC C - JP Z,.STAT ;#02 - DEC C - JP Z,.CHEK ;#03 - DEC C - JP Z,.GBPB ;#04 - DEC C - JP Z,.READD ;#05 - DEC C - JP Z,.WRITED ;#06 - DEC C - JP Z,.REMOV_F ;#07 - DEC C - JP Z,.IOCTL_F ;#08 - DEC C - JP Z,.RESRV_F ;#09 -.RESRV_F: - LD A,DSS_Error.drv.INVALID_COMMAND - SCF - RET - -;Commands for restart #18 -.INIT: LD A,2 ;количество FDD в компе ;!FIXIT а если отключу в БИОС? - AND A - RET - -.RESE: LD C,BIOS.DRV_RESET - RST ToBIOS - RET - -.STAT: XOR A - RET - -.CHEK: ;!FIXIT проверять ВГ93 когда это станет возможным - IF NON_REMOVABLE_FDD - XOR A - ELSE - LD A,#FF - OR A - ENDIF +API_TABLE: INC C + DEC C + JP Z,Init ;#00 Init + DEC C + JP Z,Open ;#01 Open + DEC C + JP Z,Close ;#02 Close + DEC C + JP Z,MediaCheck ;#03 MediaCheck + DEC C + JP Z,GetBPB ;#04 GetBPB + DEC C + JP Z,Read ;#05 Read + DEC C + JP Z,Write ;#06 Write + DEC C + JP Z,Removable ;#07 Removable + DEC C + JP Z,GenIOCTL ;#08 GenIOCTL + DEC C + JP Z,Reserved ;#09 + ; +Reserved: LD A,DSS_Error.drv.INVALID_COMMAND + SCF RET + +;;;;;;;;;;;;;;;;;;;;;;;;;;; +;Commands for restart #18 ; +;;;;;;;;;;;;;;;;;;;;;;;;;;; + +; +Init: LD A,2 ;количество FDD в компе ;!FIXIT а если отключу в БИОС? + AND A + RET +; ; ; + +; +Open: LD C,BIOS.DRV_RESET + RST ToBIOS + RET +; ; ; + +; +Close: XOR A + RET +; ; ; + + +;!FIXIT проверять ВГ93 когда это станет возможным +MediaCheck: IF NON_REMOVABLE_FDD + XOR A + ELSE + LD A,#FF + OR A + ENDIF + RET +; ; ; + + ;DE - ADDRESS -.GBPB: LD IX,0 - LD HL,0 - PUSH DE - PUSH AF - LD BC,1*256 + BIOS.DRV_READ - RST ToBIOS - POP DE - POP HL - RET C - LD BC,#0018 - ADD HL,BC - LD E,(HL) - PUSH DE - LD A,D - LD C,BIOS.DRV_GET_PAR - RST ToBIOS - LD A,H - POP HL - PUSH HL - LD H,A - POP AF - LD C,BIOS.DRV_SET_PAR - RST ToBIOS - XOR A - RET -;READTR: - XOR A - RET +GetBPB: LD IX,0 + LD HL,0 + PUSH DE + PUSH AF + LD BC,1*256 + BIOS.DRV_READ + RST ToBIOS + POP DE + POP HL + RET C + LD BC,#0018 + ADD HL,BC + LD E,(HL) + PUSH DE + LD A,D + LD C,BIOS.DRV_GET_PAR + RST ToBIOS + LD A,H + POP HL + PUSH HL + LD H,A + POP AF + LD C,BIOS.DRV_SET_PAR + RST ToBIOS + XOR A + RET +; ; ; -.READD: LD C,BIOS.DRV_READ - RST ToBIOS - RET -.WRITED: - LD C,BIOS.DRV_WRITE - RST ToBIOS - RET +; !TODO read track? +;READTR: XOR A +; RET +; ; ; + +; +Read: LD C,BIOS.DRV_READ + RST ToBIOS + RET +; ; ; + +; +Write: LD C,BIOS.DRV_WRITE + RST ToBIOS + RET +; ; ; + ; 00 - GET DEVICE PARAMETERS ; 01 - READ TRACK @@ -227,105 +253,120 @@ FDDRIVE: ; 80 - SET DEVICE PARAMETERS ; 81 - WRITE TRACK ; 82 - FORMAT TRACK -.IOCTL_F: - BIT 7,B - JR NZ,.O_CTL_F - INC B - DEC B - JP Z,.FGETPRM -; DEC B -; JP Z,FRDTRAC -; DEC B -; JP Z,FCHTRAC - LD A,DSS_Error.drv.INVALID_COMMAND - SCF - RET - -.O_CTL_F: - RES 7,B - INC B - DEC B - JP Z,.FSETPRM -; DEC B -; JP Z,FWRTRAC -; DEC B -; JP Z,FFRTRAC - LD A,DSS_Error.drv.INVALID_COMMAND - SCF - RET +GenIOCTL: BIT 7,B + JR NZ,.O_CTL_F + INC B + DEC B + JP Z,.GetParams + ;!TODO + ;DEC B + ;JP Z,.ReadTrack + ;DEC B + ;JP Z,.TestTRK + ; + LD A,DSS_Error.drv.INVALID_COMMAND + SCF + RET + ; +.O_CTL_F: RES 7,B + INC B + DEC B + JP Z,.SetParams + ;!TODO + ;DEC B + ;JP Z,.WriteTRK + ;DEC B + ;JP Z,.FormatTRK + ; + LD A,DSS_Error.drv.INVALID_COMMAND + SCF + RET +; ; ; -; HL:DE - SECTORS ON LOGICAL DISK -; C - PARTITION RECORD NUMBER IN DRIVE MBR must be 0 here ;[x] 17.12.2023 загрузка с активного раздела, а не с первого -; HL' - CYLINDERS ON PHISICAL DISK -; DE' - HEADS ON PHISICAL DISK -; BC' - SECTORS PER TRACK ON PHISICAL DISK -; A' - PHISICAL DRIVE NUMBER -; A - EXTENDED INFORMATION -; D0...D3 - "0" RESERVED (MAY BE OTHER) -; D4 - DEVICE MASTER/SLAVE -; D5 - "1" RESERVED -; D6 - ADDRESSING MODE LBA/CHS -; D7 - "1" RESERVED -.FGETPRM: - EX DE,HL - LD BC,#55AA - AND A - SBC HL,BC - LD L,A - LD A,DSS_Error.drv.GENERAL_FAILURE - SCF - RET NZ - LD A,L - AND #0F - PUSH AF - LD C,BIOS.DRV_GET_PAR - RST ToBIOS - JR C,.NONEF - PUSH HL - PUSH DE - LD A,H - LD H,0 -.MULL1 ADD HL,HL - DEC A - JR NZ,.MULL1 -; HL - SECTOR PER CYLLINDER - LD B,H - LD C,L - LD HL,0 - EX AF,AF' - XOR A -.MULL2 EX AF,AF' - ADD HL,BC - ADC A,0 - DEC DE - EX AF,AF' - LD A,D - OR E - JR NZ,.MULL2 - EX AF,AF' - LD E,A - EX DE,HL - EXX - POP DE - POP HL - POP AF - EX AF,AF' - LD A,B - LD C,L - LD B,0 - LD L,H - LD H,B - EX DE,HL - EXX - LD C,0 ;[x] 17.12.2023 загрузка с активного раздела, а не с первого - AND A - RET - -.NONEF POP AF - LD A,DSS_Error.drv.INVALID_DRIVE - SCF - RET +; Вход: - A - Drive number +; Выход: +; HL:DE - SECTORS ON LOGICAL DISK +; C - PARTITION RECORD NUMBER IN DRIVE MBR. 0 for fdd ;[x] 17.12.2023 загрузка с активного раздела, а не с первого +; HL' - CYLINDERS ON PHISICAL DISK +; DE' - HEADS ON PHISICAL DISK +; BC' - SECTORS PER TRACK ON PHISICAL DISK +; A' - PHISICAL DRIVE NUMBER +; A - EXTENDED INFORMATION +; D0...D3 - "0" RESERVED (MAY BE OTHER) +; D4 - DEVICE MASTER/SLAVE +; D5 - "1" RESERVED +; D6 - ADDRESSING MODE LBA/CHS +; D7 - "1" RESERVED +.GetParams: EX DE,HL + LD BC,#55AA + AND #0F + SBC HL,BC + JR Z,.next + ; + LD A,DSS_Error.drv.GENERAL_FAILURE + SCF + RET + ; +.next: PUSH AF + LD C,BIOS.DRV_GET_PAR + RST ToBIOS + JR C,.NONE_FDD + PUSH HL + PUSH DE + LD A,H + LD H,0 + ; +.mull_loop1: ADD HL,HL + DEC A + JR NZ,.mull_loop1 + ; + ; HL - SECTOR PER CYLLINDER + ; A=0 ZF=0 CF=0 + LD B,H + LD C,L + ;LD HL,0 + ;XOR A + LD H,A + LD L,A + EX AF,AF' + ; +.mull_loop2: EX AF,AF' + ADD HL,BC + ADC A,0 + DEC DE + EX AF,AF' + LD A,D + OR E + JR NZ,.mull_loop2 + ; + ; A=0 ZF=0 CF=0 + EX AF,AF' + LD E,A + EX DE,HL + EXX + POP DE + POP HL + POP AF + EX AF,AF' + ; A=0 ZF=0 CF=0 + LD A,B + LD B,0 + LD C,L + LD L,H + LD H,B + EX DE,HL + EXX + ; A=0 ZF=0 CF=0 + LD C,0 ;[x] 17.12.2023 загрузка с активного раздела, а не с первого + AND A + RET + ; +.NONE_FDD: POP BC + LD A,DSS_Error.drv.INVALID_DRIVE + ; CF=1 + RET +; ; ; ; HL:DE - SECTORS ON LOGICAL DISK @@ -338,35 +379,40 @@ FDDRIVE: ; D5 - "1" RESERVED ; D6 - ADDRESSING MODE LBA/CHS ; D7 - "1" RESERVED -.FSETPRM: - PUSH AF - EXX - EX DE,HL - LD H,L - LD L,C - POP AF - AND #0F - PUSH AF - PUSH HL - PUSH DE - LD C,BIOS.DRV_GET_PAR - RST ToBIOS - POP DE - POP HL - JR C,.NONEF - POP AF - LD C,BIOS.DRV_SET_PAR - RST ToBIOS - RET C - AND A - RET +.SetParams: PUSH AF + EXX + EX DE,HL + LD H,L + LD L,C + POP AF + AND #0F + PUSH AF + PUSH HL + PUSH DE + LD C,BIOS.DRV_GET_PAR + RST ToBIOS + POP DE + POP HL + JR C,.NONE_FDD + POP AF + LD C,BIOS.DRV_SET_PAR + JP ToBIOS + ;RST ToBIOS + ;RET C + ;AND A + ;RET +; ; ; -.REMOV_F: - LD A,1 - AND A - RET + +Removable: ; LD A,1 + ; AND A + XOR A + INC A + RET +; ; ; ;============================================== + ENDMODULE ; FDD_DRV - +//////////////////////////////////////////////////////////////////////// \ No newline at end of file diff --git a/DSS/drivers/media/shared-drv.asm b/DSS/drivers/media/shared-drv.asm index 9ff323a..97f01cc 100644 --- a/DSS/drivers/media/shared-drv.asm +++ b/DSS/drivers/media/shared-drv.asm @@ -132,9 +132,9 @@ INITDVC: XOR A LD BC,DEVICE.Size + LOGDRV.Size + RAMDTBL.Size - 1 LDIR ; FDD девайсы - CALL FDDRIVE.INIT ; узнать число FDD-девайсов - LD DE,FDDRIVE ; адрес обработчика тек. девайса - CALL MAKEDVC ; иниц. таблицу переходов + CALL FDD_DRV.Init ; узнать число FDD-девайсов + LD DE,FDD_DRV.API_TABLE ; адрес обработчика тек. девайса + CALL MAKEDVC ; иниц. таблицу переходов ; HDD девайсы .if_old: CALL INIT_H ; если на старте версия BIOS не подходит, то грузиться можно только с дискеты, для этого тут замена кода на XOR A : RET LD DE,HDDRIVE diff --git a/SHELL/Commands/INFO.ASM b/SHELL/Commands/INFO.ASM index ad333ed..4e4a9d8 100644 --- a/SHELL/Commands/INFO.ASM +++ b/SHELL/Commands/INFO.ASM @@ -76,20 +76,24 @@ cmd_info: CALL Get_Path LD HL,.none_string LD DE,Buffers.bat_params.PRM7 ; Volume label CALL ncopy_string - LD HL,.Unknown_FS - LD DE,Buffers.bat_params.PRM8 ; Volume fikle system + LD HL,.Unknown_str + LD DE,Buffers.bat_params.PRM8 ; Volume file system CALL ncopy_string ; POP BC PUSH BC LD A,C - LD DE,#55AA + LD DE,Dss.DRV.GenIOCTL.Enter LD BC,Dss.DRV.GenIOCTL.GetParams - RST ToDSS.DRV - JR C,.next_drv - ; !FIXIT не возвращает размер сектора, поэтому хардкор по 512 + RST ToDSS.DRV ; !FIXIT не возвращает размер сектора, поэтому хардкор по 512 + JR NC,.calc_size + ; + LD HL,.Unknown_str + LD DE,Buffers.bat_params.PRM5 ; Drive size + CALL ncopy_string + JR .print_info_2 ; HL:DE * 512 = A:HL:H'L' - RL E +.calc_size: RL E RL D RL L RL H @@ -103,7 +107,7 @@ cmd_info: CALL Get_Path JR .convert_hex ; .Collect_Msg: DZ " A: \r" ; патчится буква драйва в цикле -.Unknown_FS: DZ "unknown" +.Unknown_str: DZ "unknown" .none_string: DZ "none" diff --git a/SHELL/build.txt b/SHELL/build.txt index af40ff6..1fde752 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -433 \ No newline at end of file +434 \ No newline at end of file