;[BEGIN] ;//MODULE: Shared AUTHOR: Denis Parinov ;//CREATE: A LONG TIME AGO :) ;--------------------------------------------------------------- ;Rev Date Name Description ;R01 17-04-2023 BAO Добавлена процедура INITDVC_RET_DRIVE и изменена INTDISK для поддержки рескана драйвов ;--------------------------------------------------------------- ; DISK DRIVER SPECIFICATION ; !FIXIT некорректная! ;--------------------------------------------- ; COMMAND 00h (INITIALIZATION) ; ; INPUT: A - DRIVE LETTER ; IX - ENVIRONMENT ; RETURN: A - AMOUNT DRIVE SUPPORT ; HL - LENGTH DRIVER ;--------------------------------------------- ; COMMAND 01h (OPEN) ; ; INPUT: A - DRIVE ; ;--------------------------------------------- ; COMMAND 02h (CLOSE) ; ; INPUT: A - DRIVE ; RETURN: A - ;--------------------------------------------- ; COMMAND 03h (MEDIA CHECK) ; ; INPUT: A - DRIVE ; RETURN: A - 00h - OLD DISK, 0FFh - NEW DISK ;--------------------------------------------- ; COMMAND 04h (GET BPB) ; ; INPUT: HL - ADDRESS ; A - DRIVE ;--------------------------------------------- ; COMMAND 05h (INPUT) ; ; INPUT: IX:DE - ABSOLUTE SECTOR ; HL - MEMORY ADDRESS ; B - SECTORS COUNT ; A - DRIVE ;--------------------------------------------- ; COMMAND 06h (OUTPUT) ; ; INPUT: IX:DE - ABSOLUTE SECTOR ; HL - MEMORY ADDRESS ; B - SECTORS COUNT ; A - DRIVE ;--------------------------------------------- ; COMMAND 07h (REMOVABLE) ; ; INPUT: A - DRIVE ; RETURN: A = 0 - REMOVABLE ; A = 1 - NONREMOVABLE ;--------------------------------------------- ; COMMAND 08h (GENERIC IOCTL) ; ; INPUT: A - DRIVE ; B - SUBCOMMAND ; DE - MAGIC NUMBER (55AAh) ; SUBCOMMAND ;---------------------- ; 00 - GET DEVICE PARAMETERS ; 01 - READ TRACK ; 02 - TEST TRACK ; 80 - SET DEVICE PARAMETERS ; 81 - WRITE TRACK ; 82 - FORMAT TRACK ;--------------------------------------------- ; ; ERRORS: ; 0 - NO ERRORS ; 1 - BAD COMMAND ; 2 - BAD DRIVE NUMBER ; 3 - UNKNOW FORMAT ; 4 - NOT READY ; 5 - SEEK ERROR ; 6 - SECTOR NOT FOUND ; 7 - CRC ERROR ; 8 - WRITE PROTECT ; 9 - READ ERROR ; 10 - WRITE ERROR ; 11 - FAILURE ; 12 - BUSY (DEVICE OPENED) ; 13 - RESERVED ;INTDISK PUSH HL ; PUSH BC ; LD HL,DEVICE ; INC A ;INTD001 DEC A ; JP Z,YEP ; LD C,(HL) ; INC C ; INC HL ; INC HL ; INC HL ; JP NZ,INTD001 ; POP BC ; POP HL ; LD A,2 ; SCF ; RET ;YEP LD A,(HL) ; INC HL ; LD C,(HL) ; INC HL ; LD H,(HL) ; LD L,C ; POP BC ; EX (SP),HL ; RET ;----------------------------------------------------------- ; Просканировать систему на FDD/HDD девайсы и RAM-диски ;----------------------------------------------------------- INITDVC: XOR A LD (DRV_PAGE.LDRIVE),A ; сбр. ячейку LD HL,DEVICE LD (PDEVICE),HL ; восст. ячейку ; Зачистка таблиц. Необязательно, но мало ли чё будет дальше... ;[ ] 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 ; адрес обработчика тек. девайса CALL MAKEDVC ; иниц. таблицу переходов ; HDD девайсы .if_old: CALL INIT_H ; если на старте версия BIOS не подходит, то грузиться можно только с дискеты, для этого тут замена кода на XOR A : RET LD DE,HDDRIVE CALL MAKEDVC ; RAM-диски CALL INIT_RD LD DE,RMDRIVE CALL MAKEDVC XOR A RET ; Инициировать таблицу переходов девайса. ; вход: de=адрес обработчика девайса ; a=число девайсов (0=нет) MAKEDVC: LD C,A LD HL,DRV_PAGE.LDRIVE ; ячейка номера посл. диска ADD A,(HL) LD (HL),A ;!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 LD (HL),E ; de=адрес обработчика INC HL LD (HL),D INC HL INC C ; ++номер драйва DEC A JR NZ,.loop LD (PDEVICE),HL DEC A LD (HL),A RET ;!FIXIT попеределывать тут вызовы через точки входа типа RST или вызовы типа LD C,0 : CALL HDDRIVE на прямые ;------------------------------------------------- ; RST 18h. Вектор дисковых устройств ; вход: a=номер устройства (0-25) ;------------------------------------------------- INTDISK: ;R01 CP #FF JR NZ,.noNeedRescan CP C ;JR Z,INITDVC_RET_DRIVE JR Z,ReScanDRV .noNeedRescan: ; PUSH HL PUSH BC _CALC_DEVICE_ENTRY DEVICE LD A,(HL) CP #FF JR Z,NODEV INC HL LD C,(HL) INC HL LD H,(HL) LD L,C POP BC EX (SP),HL RET NODEV: POP BC POP HL LD A,DSS_Error.drv.INVALID_DRIVE SCF RET PDEVICE DW DEVICE ; DEVICE: BLOCK DSS_MAX_DRIVES_AMOUNT * .TBL_Entry,#FF ; .Size: DB #FF ; .TBL_Entry EQU 3 FLOPPY EQU #0001 FIXED EQU #0002 CDROM EQU #0004 NETWORK EQU #0008 ;DISKS: DB 27 ;LENGTH DISK INFO ; DW FLOPPY ;DISK TYPE ; DB 2,"A:" ;DISK NAME ; DB 11,"NO NAME " ; DB 8,"FAT12 " ; DB #00 ;PHISICAL DRIVE NUMBER ; ; DB 27 ;LENGTH DISK INFO ; DW FLOPPY ;DISK TYPE ; DB 2,"B:" ;DISK NAME ; DB 11,"NO NAME " ; DB 8,"FAT12 " ; DB #01 ;PHISICAL DRIVE NUMBER ; ; DB 27 ;LENGTH DISK INFO ; DW FIXED ;DISK TYPE ; DB 2,"C:" ;DISK NAME ; DB 11,"NO NAME " ; DB 8,"FAT16 " ; DB #80 ;PHISICAL DRIVE NUMBER ; ; DB #00 ;END OF TABLE ;----------------------------------------------------------------------- ;R01 ; INITDVC_RET_DRIVE: ; CALL INITDVC ; LD A,(DRV_PAGE.LDRIVE) ; AND A ; RET ; //////////////////////////////////////////////////////////////////////// // NEW RESCAN // //////////////////////////////////////////////////////////////////////// INCLUDE 'ReScanDRV.ASM' //////////////////////////////////////////////////////////////////////// ;DEVICE DB #00 ; DW FDDRIVE ; FDD A ; DB #01 ; DW FDDRIVE ; FDD B ; DB #00 ; DW HDDRIVE ; HDD C ; DB #01 ; DW HDDRIVE ; HDD D ; DB #02 ; DW HDDRIVE ; HDD E ; DB #03 ; DW HDDRIVE ; HDD F ; DB #04 ; DW HDDRIVE ; HDD G ; DB #05 ; DW HDDRIVE ; HDD H ; DB #06 ; DW HDDRIVE ; HDD I ; DB #07 ; DW HDDRIVE ; HDD J ; DB #FF