;[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 ;--------------------------------------------- ; 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 ;!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 .noNeedRescan: ; PUSH HL PUSH BC _CALC_DEVICE_ENTRY DEVICE ; LD C,A ; ADD A,A ; ADD A,C ; LD C,A ; LD B,0 ; LD HL,DEVICE ; ADD HL,BC LD A,(HL) INC A JR Z,NODEV DEC A 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 ; ;----------------------------------------------------------- ; Просканировать систему на FDD/HDD девайсы и RAM-диски ;----------------------------------------------------------- INITDVC: XOR A LD (DRV_PAGE.LDRIVE),A ; сбр. ячейку LD HL,DEVICE LD (PDEVICE),HL ; восст. ячейку ; 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 LD A,C LD C,0 ; сбр. OR A RET Z ; нет девайсов 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 ;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