; ***************************************************************************** ; ; DISKINFO.ASM [ TR-DOS DRV INIT Sample & DISK INFO Utility ] ; Copyright (c) 2004 Erdogan TAN [ Version 2.0 - 29/01/2005 ] ; ; ***************************************************************************** ; Masterboot / Partition Table at Beginning+1BEh ptBootable equ 0 ptBeginHead equ 1 ptBeginSector equ 2 ptBeginCylinder equ 3 ptFileSystemName equ 4 ptEndHead equ 5 ptEndSector equ 6 ptEndCylinder equ 7 ptStartSector equ 8 ptSectors equ 12 ; Boot Sector Parameters at 7C00h DataArea1 equ -4 DataArea2 equ -2 BootStart equ 0h OemName equ 03h BytesPerSec equ 0Bh SecPerClust equ 0Dh ResSectors equ 0Eh FATs equ 10h RootDirEnts equ 11h Sectors equ 13h Media equ 15h FATsecs equ 16h SecPerTrack equ 18h Heads equ 1Ah Hidden1 equ 1Ch Hidden2 equ 1Eh HugeSec1 equ 20h HugeSec2 equ 22h DriveNumber equ 24h Reserved1 equ 25h bootsignature equ 26h VolumeID equ 27h VolumeLabel equ 2Bh FileSysType equ 36h Reserved2 equ 3Eh ; Starting cluster of P2000 ; FAT32 BPB Structure FAT32_FAT_Size equ 36 FAT32_RootFClust equ 44 FAT32_FSInfoSec equ 48 FAT32_DrvNum equ 64 FAT32_Reserved1 equ 65 FAT32_BootSig equ 66 FAT32_VolID equ 67 FAT32_VolLab equ 71 FAT32_FilSysType equ 82 ; BIOS Disk Parameters DPDiskNumber equ 0h DPDType equ 1h DPReturn equ 2h DPHeads equ 3h DPCylinders equ 4h DPSecPerTrack equ 6h DPDisks equ 7h DPTableOff equ 8h DPTableSeg equ 0Ah DPNumOfSecs equ 0Ch ; BIOS INT 13h Extensions (LBA extensions) ; Just After DP Data (DPDiskNumber+) DAP_PacketSize equ 10h ; If extensions present, this byte will be >=10h DAP_Reserved1 equ 11h ; Reserved Byte DAP_NumOfBlocks equ 12h ; Value of this byte must be 0 to 127 DAP_Reserved2 equ 13h ; Reserved Byte DAP_Destination equ 14h ; Address of Transfer Buffer as SEGMENT:OFFSET DAP_LBA_Address equ 18h ; LBA=(C1*H0+H1)*S0+S1-1 ; C1= Selected Cylinder Number ; H0= Number Of Heads (Maximum Head Number + 1) ; H1= Selected Head Number ; S0= Maximum Sector Number ; S1= Selected Sector Number ; QUAD WORD ; DAP_Flat_Destination equ 20h ; 64 bit address, if value in 4h is FFFF:FFFFh ; QUAD WORD (Also, value in 0h must be 18h) ; TR-DOS will not use 64 bit Flat Address ; INT 13h Function 48h "Get Enhanced Disk Drive Parameters" ; Just After DP Data (DPDiskNumber+) GetDParams_48h equ 20h ; Word. Data Lenght, must be 26 (1Ah) for short data. GDP_48h_InfoFlag equ 22h ; Word ; Bit 1 = 1 -> The geometry returned in bytes 4-15 is valid. GDP_48h_NumOfPCyls equ 24h ; Double Word. Number physical cylinders. GDP_48h_NumOfPHeads equ 28h ; Double Word. Number of physical heads. GDP_48h_NumOfPSpT equ 2Ch ; Double word. Num of physical sectors per track. GDP_48h_LBA_Sectors equ 30h ; 8 bytes. Number of physical/LBA sectors. GDP_48h_BytesPerSec equ 38h ; Word. Number of bytes in a sector. ; TR-DOS Standalone Program Extensions to the DiskParams Block ; Just After DP Data (DPDiskNumber+) TRDP_CurrentSector equ 3Ah ; DX:AX (LBA) TRDP_SectorCount equ 3Eh ; CX (or Counter) ; DOS Logical Disks LD_Name equ 0 LD_DiskType equ 1 LD_PhyDrvNo equ 2 LD_FATType equ 3 LD_FSType equ 4 LD_LBAYes equ 5 LD_BPB equ 6 LD_FATBegin equ 96 LD_ROOTBegin equ 100 LD_DATABegin equ 104 LD_StartSector equ 108 LD_TotalSectors equ 112 LD_FreeSectors equ 116 LD_Clusters equ 120 LD_PartitionEntry equ 124 LD_DParamEntry equ 125 LD_MediaChanged equ 126 LD_CDirLevel equ 127 LD_CurrentDirectory equ 128 ; Valid FAT Types FS_FAT12 equ 1 FS_FAT16_CHS equ 2 FS_FAT32_CHS equ 3 FS_FAT16_LBA equ 4 FS_FAT32_LBA equ 5 ; Cursor Location CCCpointer equ 0450h ; BIOS data, current cursor column ; FAT Clusters EOC sign FAT12EOC equ 0FFFh FAT16EOC equ 0FFFFh ;FAT32EOC equ 0FFFFFFFh ; It is not direct usable for 8086 code ; BAD Cluster FAT12BADC equ 0FF7h FAT16BADC equ 0FFF7h ;FAT32BADC equ 0FFFFFF7h ; It is not direct usable for 8086 code ; MS-DOS FAT16 FS (Maximum Possible) Last Cluster Number= 0FFF6h Present segment Para 'code' assume CS:Present, DS:Present, ES:Present, SS:Present ;±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±± ;± ;± PROCEDURE proc_start ;± ;±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±± proc_start proc far org 100h start: call proc_drv_init ; DRV_INIT.ASM xor dl, dl call floppy_drv_init mov al, byte ptr [Current_TRDOS_Drv] adc al, 0 push ax mov dl, 1 call floppy_drv_init pop ax adc al, 0 mov byte ptr [Current_TRDOS_Drv], al loc_print_partition_table: mov si, offset P_Table_Header call proc_printmsg mov si, offset PTable_hd0 mov word ptr [PTable_Drv],"dh" mov byte ptr [PTable_Drv]+2,"0" mov byte ptr [P_Number],"1" mov cx, 4 check_entry_next_0: push cx mov cx, 4 check_p_entry_next_1: cmp byte ptr [SI][ptFileSystemName],0 jna short pass_call_print_p_entry call proc_print_p_entry pass_call_print_p_entry: add si, 10h inc byte ptr [P_Number] loop check_p_entry_next_1 pop cx inc byte ptr [PTable_Drv]+2 mov byte ptr [P_Number], "1" loop check_entry_next_0 mov word ptr [PTable_Drv],"pe" mov byte ptr [PTable_Drv]+2,"0" mov byte ptr [P_Number],"1" mov cx, 4 check_p_entry_next_ep_0: push cx mov cx, 4 check_p_entry_next_ep_1: cmp byte ptr [SI][ptFileSystemName],0 jna short pass_call_print_p_entry_ep call proc_print_p_entry pass_call_print_p_entry_ep: add si, 10h inc byte ptr [P_Number] loop check_p_entry_next_ep_1 pop cx inc byte ptr [PTable_Drv]+2 mov byte ptr [P_Number], "1" loop check_p_entry_next_ep_0 end_of_print_partition_table: mov si, offset DiskParams mov byte ptr [DPT_No], "0" repeat_for_next_dparam: cmp si, offset end_of_dparams_buff ja short loc_print_trdos_drive_infos cmp byte ptr [si][DPDType],0 je short pass_current_dparam push si mov si, offset Press_Any_Key call proc_printmsg pop si xor ah, ah ; "Press any key to continue" int 16h cmp al, 1Bh je short end_of_prog_drvinfo call proc_clear_screen cmp byte ptr [si][DPReturn], 0 ja short pass_current_dparam call proc_fill_diskinfo_fields push si mov si, offset [Disk_Info] call proc_printmsg pop si pass_current_dparam: add si, 40h jmp short repeat_for_next_dparam loc_print_trdos_drive_infos: mov si, offset Logical_DOSDisks loc_check_trdos_drv_exists: cmp byte ptr [SI][LD_Name], 0 jna short pass_current_trdos_drv push si call proc_print_drv_info mov si, offset Press_Any_Key call proc_printmsg pop si xor ah, ah ; "Press any key to continue" int 16h cmp al, 1Bh je short end_of_prog_drvinfo call proc_clear_screen inc byte ptr [Current_TRDOS_Drv] pass_current_trdos_drv: mov al, byte ptr [Last_Dos_DiskNo] cmp al, byte ptr [Current_TRDOS_Drv] jb short end_of_prog_drvinfo add si, 100h jmp short loc_check_trdos_drv_exists end_of_prog_drvinfo: mov si, offset Program_Name call proc_printmsg mov ax, word ptr [File_Size] mov si, offset FileSize_StrPlus5 mov cx, 10 loc_wfsize_rdivide: dec si xor dx, dx div cx add dl, '0' mov byte Ptr [si], dl cmp ax,0 ja short loc_wfsize_rdivide call proc_printmsg int 20h proc_start endp proc_printmsg proc near mov BX, 07 loc_print: lodsb ; Load byte at DS:SI to AL and AL,AL je short loc_return ; If AL = 00h then return mov AH,0Eh int 10h ; BIOS Service func ( ah ) = 0Eh ; Write char as TTY ;AL-char BH-page BL-color jmp short loc_print loc_return: retn proc_printmsg endp proc_clear_screen proc near mov ah, 0Fh int 10h mov ah, 0 int 10h retn proc_clear_screen endp ;''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''; ; Rx_DOS 32 bit Divide ; ; (Special version by Erdogan Tan) ; ;- - - - - - - - - - - - - - - - - - - - - - - - - -- - - - -; ; ; ; input -> DX_AX = 32 bit dividend ; ; input -> CX = 16 bit divisor ; ; output -> DX_AX = 32 bit quotient ; ; output -> BX = 16 bit remainder ; ; ; ; This procedure divides the requested 32 bit number ; ; and gives the result in DX, AX and BX (remainder) ; ; ; ; Original Procedure by Michael Podanoffsky / Real Time DOS ; ; (c) Erdogan TAN 1999 [ RXDOSBIO.ASM ] ; ;............................................................; Rx_Dos_Div32 proc near mov bx, dx xchg ax, bx xor dx, dx div cx ; at first, divide DX xchg ax, bx ; remainder is in DX ; now, BX has quotient ; save remainder div cx ; so, DX_AX divided and ; AX has quotient ; DX has remainder xchg dx, bx ; finally, BX has remainder retn Rx_Dos_Div32 endp ;''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''; ; From binary (byte) to hexadecimal (character) converter ; ; ; ; input -> AL = byte (binary number) to be converted ; ; output -> AH = First character of hexadecimal number ; ; output -> AL = Second character of hexadecimal number ; ; ; ; (c) Erdogan TAN 1998 - 1999 ; ;............................................................; ; 1998 proc_hex proc near db 0D4h,10h ; Undocumented inst. AAM ; AH = AL / 10h ; AL = AL MOD 10h or AX,'00' ; Make it ZERO (ASCII) based xchg AH,AL ; 1999 cmp AL,'9' jna pass_cc_al add AL,7 pass_cc_al: cmp AH,'9' jna pass_cc_ah add AH,7 pass_cc_ah: ; 1998 retn proc_hex endp ;''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''; ; 32 bit Multiply ; ;- - - - - - - - - - - - - - - - - - - - - - - - - -- - - - -; ; ; ; input -> DX_AX = 32 bit multiplier ; ; input -> BX = 16 bit number to be multiplied by DX_AX ; ; output -> BX_DX_AX = 48 bit (16+32 bit) result number ; ; ; ; (c) Erdogan TAN 1999 ; ;............................................................; proc_mul32 proc near push cx mov cx, bx mov bx, dx mul cx xchg ax, bx push dx mul cx pop cx add ax, cx adc dx, 0 xchg bx, ax xchg dx, bx pop cx retn proc_mul32 endp ; include DRV_INIT.ASM ; Beginning of DRV_INIT.ASM (TR-DOS Drive Initialization Procedures) proc_drv_init proc near xor dl,dl mov si, offset DiskParams dparam_read: call proc_dparam mov dl, byte ptr [SI][DPDisks] add si, 40h cmp dl, 2 jne short pass_floppy1 dec dl call proc_dparam pass_floppy1: mov dl, 80h add si, 40h call proc_dparam jnc short pass_hd_15h_error mov word ptr [si][DPNumOfSecs], 0 mov word ptr [si][DPNumOfSecs]+2,0 pass_hd_15h_error: mov ah, byte ptr [SI][DPDisks] mov byte ptr [HDCounter], ah next_hard_disk: dec byte ptr [HDCounter] cmp byte ptr [HDCounter], 0 jna short load_hd_partition_tables inc dl add si, 40h call proc_dparam jnc short next_hard_disk mov word ptr [si][DPNumOfSecs], 0 mov word ptr [si][DPNumOfSecs]+2,0 jmp short next_hard_disk load_hd_partition_tables: mov si, offset Disk_hd0 mov di, offset PTable_hd0 push ds pop es mov dl, 80h mov cx, 4 load_next_hd_partition_table: push cx push dx push si push di cmp byte ptr [SI]+1, 03h jne short pass_pt_this_hard_disk call proc_load_masterboot jc short pass_pt_this_hard_disk pop di push di mov si, offset PartitionTable mov cx, 32 rep movsw pass_pt_this_hard_disk: pop di pop si pop dx pop cx inc dl add si, 40h add di, 40h loop load_next_hd_partition_table load_extended_dos_partitions: mov si, Offset PTable_hd0 mov di, Offset PTable_ep0 mov byte ptr [HDCounter], 80h next_hd_extd_partition: push si mov cx, 4 hd_check_fs_id_05h: mov al, byte ptr [SI][ptFileSystemName] cmp al, 05h ; Is it an extended dos partition ? je short pass_hd_check_05h cmp al, 0Fh ; Is it an extended win4 (LBA mode) partition ? je short pass_hd_check_0Fh continue_to_check_ep: add si, 10h loop hd_check_fs_id_05h continue_check_ep_next_disk: pop si add si, 40h add di, 40h inc byte ptr [HDCounter] cmp byte ptr [HDCounter], 83h jna short next_hd_extd_partition jmp logical_drv_init pass_hd_check_05h: push cx mov ax, word ptr [SI][ptStartSector] mov dx, word ptr [SI][ptStartSector]+2 xor bh,bh mov bl, byte ptr [HDCounter] push bx sub bl, 80h shl bl, 1 shl bl, 1 mov word ptr [Val_StartSector][BX],ax mov word ptr [Val_StartSector][BX]+2,dx pop dx mov dh, byte ptr [SI][ptBeginHead] mov cx, word ptr [SI][ptBeginSector] mov ax, 0201h ; Read 1 sector mov bx, offset MasterBootBuff push ds pop es int 13h pop cx jc short continue_to_check_ep push si push di push cx mov si, offset PartitionTable mov cx, 32 rep movsw pop cx pop di pop si jmp short continue_check_ep_next_disk pop_di_check_next_ep: pop di jmp continue_to_check_ep pass_hd_check_0Fh: mov ax, word ptr [SI][ptStartSector] mov dx, word ptr [SI][ptStartSector]+2 xor bh,bh mov bl, byte ptr [HDCounter] sub bl, 80h push bx shl bl, 1 shl bl, 1 mov word ptr [Val_StartSector][BX],ax mov word ptr [Val_StartSector][BX]+2,dx pop ax push di mov ah, 40h mul ah mov di, offset Disk_hd0 add di, ax ep_mov_dap_parameters: push ds pop es cmp byte ptr [DI][DAP_PacketSize], 10h jne short pop_di_check_next_ep mov word ptr [DI][DAP_Destination], offset MasterBootBuff push ds pop word ptr [DI][DAP_Destination]+2 mov byte ptr [DI][DAP_NumOfBlocks],1 push si push di add si, ptStartSector add di, DAP_LBA_Address movsw movsw pop si add si, DAP_PacketSize ; DS:SI= DAP Location mov ah, 42h ; Extended Disk Read - LBA Read mov dl, byte ptr [HDCounter] int 13h pop si pop di jc continue_to_check_ep push di push si push cx mov si, offset PartitionTable mov cx, 32 rep movsw pop cx pop si pop di jmp continue_check_ep_next_disk logical_drv_init: mov byte ptr [Hard_Disk], 80h mov cx, 4 xor al, al mov si, offset PTable_Buffer mov di, offset Logical_DOSDisks + 200h mov byte ptr [Last_DOS_DiskNo], 1 ldrv_init_next_hdp: push si push cx push ax push di cmp byte ptr [SI][ptFileSystemName], 06h jne short pass_this_is_FAT16_CHS_disk mov byte ptr [DI][LD_DiskType], 2 mov dl, byte ptr [Hard_Disk] mov byte ptr [DI][LD_PhyDrvNo], dl mov byte ptr [DI][LD_FATType], 2 mov byte ptr [DI][LD_FSType], 06 mov bl, dl sub bl, 80h xor bh, bh mov ah, byte ptr [HD_LBAYes][BX] mov byte ptr [DI][LD_LBAYes], ah mov byte ptr [DI][LD_PartitionEntry],al mov ah, dl sub ah, 7Eh mov byte ptr [DI][LD_DParamEntry], ah mov dh, byte ptr [SI][ptBeginHead] mov cx, word ptr [SI][ptBeginSector] mov ax, 0201h ; Read 1 sector mov bx, offset DOSBootSectorBuff int 13h jc pass_this_is_FAT32_LBA_disk jmp hdp_boot_validation pass_this_is_FAT16_CHS_disk: cmp byte ptr [SI][ptFileSystemName], 0Eh jne pass_this_is_FAT16_LBA_disk mov byte ptr [DI][LD_DiskType], 2 mov dl, byte ptr [Hard_Disk] mov byte ptr [DI][LD_PhyDrvNo], dl mov byte ptr [DI][LD_FATType], 2 mov byte ptr [DI][LD_FSType], 0Eh mov byte ptr [DI][LD_LBAYes], 1 mov byte ptr [DI][LD_PartitionEntry],al mov ah, dl sub ah, 7Eh mov byte ptr [DI][LD_DParamEntry], ah mov al, 40h mul ah add ax, offset Disk_fd0 mov di, ax cmp byte ptr [DI][DAP_PacketSize], 10h jne pass_this_is_FAT32_LBA_disk mov word ptr [DI][DAP_Destination], offset DOSBootSectorBuff push ds pop word ptr [DI][DAP_Destination]+2 mov byte ptr [DI][DAP_NumOfBlocks],1 push di add si, ptStartSector add di, DAP_LBA_Address movsw movsw pop si add si, DAP_PacketSize ; DS:SI= DAP Location mov ah, 42h ; Extended Disk Read - LBA Read mov dl, byte ptr [Hard_Disk] int 13h jc pass_this_is_FAT32_LBA_disk hdp_boot_validation: cmp word ptr [BS_Validation], 0AA55h jne pass_this_is_FAT32_LBA_disk cmp byte ptr [BPB_Media], 0F8h jne pass_this_is_FAT32_LBA_disk cmp word ptr [BPB_FATSz16], 0 ja short pass_FAT32_BPB cmp byte ptr [BS_FAT32_BootSig], 29h jne pass_this_is_FAT32_LBA_disk mov cx, 45 jmp short loc_move_hd_BPB pass_FAT32_BPB: cmp byte ptr [BS_BootSig], 29h jne pass_this_is_FAT32_LBA_disk mov cx, 32 loc_move_hd_BPB: mov si, offset DOSBootSectorBuff pop di push di push di add di, LD_BPB rep movsw pop si pop di add di, 100h push di inc byte ptr [Last_DOS_DiskNo] mov al, 'A' add al, byte ptr [Last_DOS_DiskNo] mov byte ptr [SI][LD_Name], al cmp byte ptr [Now_EP_Drives], 0 jna short ld_StartSector_set1 cmp byte ptr [SI][LD_FsType], 0Bh jne short ld_StartSector_set1 mov ax, word ptr [SI][LD_StartSector] mov dx, word ptr [SI][LD_StartSector]+2 jmp short ld_StartSector_set2 ld_StartSector_set1: mov AX,Word Ptr [SI][LD_BPB][Hidden1] mov DX,Word Ptr [SI][LD_BPB][Hidden2] mov word ptr [SI][LD_StartSector],AX mov word ptr [SI][LD_StartSector]+2,DX ld_StartSector_set2: add AX,Word Ptr [SI][LD_BPB][ResSectors] adc DX,0 mov Word Ptr [SI][LD_FATBegin], AX mov Word Ptr [SI][LD_FATBegin]+2, DX cmp byte ptr [SI][LD_FATType], 3 jne short pass_FAT32_RootDirLoc mov ax, Word Ptr [SI][LD_BPB][FAT32_FAT_Size] mov dx, Word Ptr [SI][LD_BPB][FAT32_FAT_Size]+2 xor bh,bh mov bl,Byte Ptr [SI][LD_BPB][FATs] call proc_mul32 add ax, Word Ptr [SI][LD_FATBegin] adc dx, Word Ptr [SI][LD_FATBegin]+2 mov Word Ptr [SI][LD_DATABegin], AX mov Word Ptr [SI][LD_DATABegin]+2, DX mov Word Ptr [SI][LD_ROOTBegin], AX mov Word Ptr [SI][LD_ROOTBegin]+2, DX jmp short pass_FAT_FS_Locations pass_FAT32_RootDirLoc: mov AL,Byte Ptr [SI][LD_BPB][FATs] cbw mul Word Ptr [SI][LD_BPB][FATSecs] add AX,Word Ptr [SI][LD_FATBegin] adc DX,Word Ptr [SI][LD_FATBegin]+2 mov Word Ptr [SI][LD_ROOTBegin], AX mov Word Ptr [SI][LD_ROOTBegin]+2, DX mov Word Ptr [SI][LD_DATABegin], AX mov Word Ptr [SI][LD_DATABegin]+2, DX mov AX,20h ; Size of a directory entry mul Word Ptr [SI][LD_BPB][RootDirEnts] add AX,511 ; adc dx, 0 mov cx, 512 div cx add Word Ptr [SI][LD_DATABegin],AX adc Word Ptr [SI][LD_DATABegin]+2,0 pass_FAT_FS_Locations: mov ax,Word Ptr [SI][LD_BPB][HugeSec1] mov Word Ptr [SI][LD_TotalSectors], AX mov dx,Word Ptr [SI][LD_BPB][HugeSec2] mov Word Ptr [SI][LD_TotalSectors]+2, dx add ax,Word Ptr [SI][LD_StartSector] adc dx,Word Ptr [SI][LD_StartSector]+2 sub ax,Word Ptr [SI][LD_DATABegin] sbb dx,Word Ptr [SI][LD_DATABegin]+2 xor ch,ch mov cl,Byte Ptr [SI][LD_BPB][SecPerClust] call Rx_Dos_Div32 mov word ptr [SI][LD_Clusters], AX mov word ptr [SI][LD_Clusters]+2, DX ; Maximum Valid Cluster Number= DX:AX +1 ; with 2 reserved clusters= DX:AX +2 ;mov word ptr [SI][LD_FreeSectors],0 ;mov word ptr [SI][LD_FreeSectors]+2,0 ;BPB has been loaded, yet ;LD_MediaChanged= 1 is "New Boot, FAT is not read" mov byte ptr [SI][LD_MediaChanged],1 jmp pass_this_is_FAT32_LBA_disk pass_this_is_FAT16_LBA_disk: cmp byte ptr [SI][ptFileSystemName], 0Bh jne short pass_this_is_FAT32_CHS_disk mov byte ptr [DI][LD_DiskType], 2 mov bl, byte ptr [Hard_Disk] mov byte ptr [DI][LD_PhyDrvNo], bl mov byte ptr [DI][LD_FATType], 3 mov byte ptr [DI][LD_FSType], 0Bh sub bl, 80h xor bh, bh mov ah, byte ptr [HD_LBAYes][BX] mov byte ptr [DI][LD_LBAYes],ah mov byte ptr [DI][LD_PartitionEntry],al mov ah, bl add ah, 2 mov byte ptr [DI][LD_DParamEntry], ah mov ax, word ptr [SI][ptStartSector] mov dx, word ptr [SI][ptStartSector]+2 cmp byte ptr [Now_EP_Drives],0 jna short pass_0Bh_ext_part_start_fixup shl bl, 1 shl bl, 1 add ax, word ptr [Val_StartSector][BX] adc dx, word ptr [Val_StartSector][BX]+2 mov word ptr [DI][LD_StartSector], ax mov word ptr [DI][LD_StartSector]+2, dx pass_0Bh_ext_part_start_fixup: push ax mov ah, byte ptr [Hard_Disk] sub ah, 7Eh mov al, 40h mul ah add ax, offset Disk_fd0 mov di, ax pop ax cmp byte ptr [DI][DAP_PacketSize], 10h jne pass_this_is_FAT32_LBA_disk mov word ptr [DI][DAP_LBA_Address], ax mov word ptr [DI][DAP_LBA_Address]+2, dx jmp short loc_fixup_8GB_CHS_to_LBA pass_val_startsec_check: mov dh, byte ptr [SI][ptBeginHead] mov cx, word ptr [SI][ptBeginSector] mov ax, 0201h ; Read 1 sector mov bx, offset DOSBootSectorBuff int 13h jc pass_this_is_FAT32_LBA_disk jmp hdp_boot_validation pass_this_is_FAT32_CHS_disk: cmp byte ptr [SI][ptFileSystemName], 0Ch jne pass_this_is_FAT32_LBA_disk mov byte ptr [DI][LD_DiskType], 2 mov ah, byte ptr [Hard_Disk] mov byte ptr [DI][LD_PhyDrvNo], ah mov byte ptr [DI][LD_FATType], 3 mov byte ptr [DI][LD_FSType], 0Ch mov byte ptr [DI][LD_LBAYes], 1 mov byte ptr [DI][LD_PartitionEntry],al sub ah, 7Eh mov byte ptr [DI][LD_DParamEntry], ah mov al, 40h mul ah add ax, offset Disk_fd0 mov di, ax cmp byte ptr [DI][DAP_PacketSize], 10h jne pass_this_is_FAT32_LBA_disk push word ptr [SI][ptStartSector] pop word ptr [DI][DAP_LBA_Address] push word ptr [SI][ptStartSector]+2 pop word ptr [DI][DAP_LBA_Address]+2 loc_fixup_8GB_CHS_to_LBA: mov word ptr [DI][DAP_Destination], offset DOSBootSectorBuff push ds pop word ptr [DI][DAP_Destination]+2 mov byte ptr [DI][DAP_NumOfBlocks],1 push di pop si add si, DAP_PacketSize ; DS:SI= DAP Location mov ah, 42h ; Extended Disk Read - LBA Read mov dl, byte ptr [Hard_Disk] int 13h jnc hdp_boot_validation pass_this_is_FAT32_LBA_disk: pop di pop ax pop cx pop si add si, 10h inc al dec cx cmp cx, 0 ja ldrv_init_next_hdp cmp byte ptr [Hard_Disk], 83h jnb short pass_init_primary_dos_partitions mov cx, 4 inc byte ptr [Hard_Disk] jmp ldrv_init_next_hdp pass_init_primary_dos_partitions: cmp byte ptr [Now_EP_Drives], 0 ja short loc_drv_init_retn mov byte ptr [Now_EP_Drives], 1 mov si, offset PTable_ep0 mov byte ptr [Hard_Disk], 80h mov ah, byte ptr [Last_DOS_DiskNo] inc ah xor al,al mov di, offset Logical_DOSDisks add di, ax mov al, 16 mov cx, 4 jmp ldrv_init_next_hdp Now_EP_Drives: db 0 Val_StartSector: dd 0 dd 0 dd 0 dd 0 loc_drv_init_retn: retn proc_drv_init endp proc_dparam proc near ; input ; dl = Disk Drive Number ; ds:si = Parameters Table Buffer ; output ; ah = error number (0 = No Error if C flag is ZERO) mov byte ptr [si][DPDiskNumber], dl mov byte ptr [si][DPDType], 0 push dx mov ah, 08h int 13h mov byte ptr [si][DPReturn], ah jnc short dparam_no_error pop dx retn dparam_no_error: mov byte ptr [si][DPDType], bl mov byte ptr [si][DPDisks], dl inc dh mov byte ptr [si][DPHeads], dh push cx and cl, 3Fh mov byte ptr [si][DPSecPerTrack], cl pop cx shr cl,1 shr cl,1 shr cl,1 shr cl,1 shr cl,1 shr cl,1 xchg ch,cl inc cx mov word ptr [si][DPCylinders], cx mov word ptr [si][DPTableOff], di push es pop word ptr [si][DPTableSeg] cmp byte ptr [si][DPDiskNumber], 80h jb short dparam_15h_return mov dl, byte ptr [si][DPDiskNumber] mov byte ptr [Hard_Disk], dl mov byte ptr [si][DPDType], 0 mov ah, 15h int 13h jc short dparam_15h_return mov byte ptr [si][DPDType], ah mov word ptr [si][DPNumOfSecs], cx mov word ptr [si][DPNumOfSecs]+2, dx dparam_15h_return: pop dx ; dl = Drive Number mov byte ptr [SI][DAP_PacketSize], 0 ; Reset (No DAP) mov ah, 41h ; Check Extensions Present mov bx, 55AAh int 13h jc short dparam_48h_return cmp bx, 0AA55h jne short dparam_48h_return test cx, 01h ; Fixed Disk Access Subset - is LBA ready ? jz short dparam_48h_return xor bh,bh mov bl, byte ptr [Hard_Disk] sub bl, 80h mov byte ptr [HD_LBAYes][BX],1 mov byte ptr [SI][DAP_PacketSize], 10h dparam_41h_return: push si add si, GetDParams_48h mov word ptr [SI], 0026 ; GDP Data Lenght - Set ; DS:SI= Address of Result Buffer ; DL (Drive Number) must be not changed before here... mov ah, 48h ; Get Enhanced Disk Drive Parameters int 13h pop si jc short dparam_48h_return mov word ptr [SI][GetDParams_48h], 0 ; GDP Data Lenght - Reset dparam_48h_return: xor ah,ah retn proc_dparam endp proc_load_masterboot proc near ; input -> dl = drive number xor ah,ah int 13h jnc short pass_reset_error harddisk_error: retn pass_reset_error: mov bx, offset MasterBootBuff mov ax,0201h mov cx,1 xor dh,dh push ds pop es int 13h jc short harddisk_error cmp word ptr [MBIDCode],0AA55h jnz short loc_not_masterboot retn loc_not_masterboot: stc retn proc_load_masterboot endp floppy_drv_init proc near ; INPUT -> dl = Drive Number (0,1) ; OUTPUT -> al = drive name, ; ah = drive number mov si, offset Disk_fd0 mov di, offset Logical_DOSDisks xor dh, dh cmp dl, 0 jna short pass_drv_init_fd1 add si, 40h add di, 100h pass_drv_init_fd1: mov byte ptr [DI][LD_MediaChanged],0 ; cmp byte ptr [SI][DPDType], 0 ; jna short pass_fd_read_boot_sector0 read_fd_boot_sector: push ds pop es push dx mov cx, 4 ; Retry Count read_fd_boot_sector_again: push cx mov cx, 1 mov ax, 0201h ; Read 1 sector mov bx, offset DOSBootSectorBuff int 13h pop cx jnc short use_fd_boot_sector_params loop read_fd_boot_sector_again pass_fd_read_boot_sector0: stc pass_fd_read_boot_sector1: pop dx retn use_fd_boot_sector_params: cmp word ptr [BS_Validation], 0AA55h jne short pass_fd_read_boot_sector0 ; cmp byte ptr [BS_BootSig], 29h ; jne short pass_fd_read_boot_sector0 cmp byte ptr [BPB_Media], 0F0h jb short pass_fd_read_boot_sector1 mov si, offset DOSBootSectorBuff push di add di, LD_BPB mov cx, 32 rep movsw pop si xor ax, ax mov Word Ptr [SI][LD_StartSector], AX mov Word Ptr [SI][LD_StartSector]+2,0 add AX,Word Ptr [SI][LD_BPB][ResSectors] mov Word Ptr [SI][LD_FATBegin], AX mov Word Ptr [SI][LD_FATBegin]+2, 0 mov AL,Byte Ptr [SI][LD_BPB][FATs] cbw mul Word Ptr [SI][LD_BPB][FATSecs] add AX,Word Ptr [SI][LD_FATBegin] mov Word Ptr [SI][LD_ROOTBegin], AX mov Word Ptr [SI][LD_ROOTBegin]+2, 0 mov Word Ptr [SI][LD_DATABegin], AX mov Word Ptr [SI][LD_DATABegin]+2, 0 mov AX,20h ; Size of a directory entry mul Word Ptr [SI][LD_BPB][RootDirEnts] add AX,511 mov cx,512 div cx add Word Ptr [SI][LD_DATABegin], AX adc Word Ptr [SI][LD_DATABegin]+2, 0 mov AX,Word Ptr [SI][LD_BPB][Sectors] mov Word Ptr [SI][LD_TotalSectors], AX mov Word Ptr [SI][LD_TotalSectors]+2,0 sub ax,Word Ptr [SI][LD_DATABegin] xor dx,dx xor ch,ch mov cl,Byte Ptr [SI][LD_BPB][SecPerClust] div cx mov word ptr [SI][LD_Clusters], AX mov byte ptr [SI][LD_FATType], 1 mov byte ptr [SI][LD_FSType], 0 mov word ptr [SI][LD_Clusters]+2, 0 ; Maximum Valid Cluster Number= AX +1 ; with 2 reserved clusters= AX +2 pop ax mov byte ptr [SI][LD_DParamEntry], al mov byte ptr [SI][LD_PhyDrvNo], al mov ah, al add al, 'A' mov byte ptr [SI][LD_Name], al mov byte ptr [SI][LD_DiskType], 1 mov byte ptr [SI][LD_LBAYes], 0 mov byte ptr [SI][LD_PartitionEntry], 0 mov byte ptr [SI][LD_MediaChanged], 1 retn floppy_drv_init endp HDCounter: db 1 MasterBootBuff: MasterBootCode: db 1BEh dup (?) PartitionTable: db 64 dup (?) MBIDCode: dw ? PTable_Buffer: PTable_hd0: db 64 dup (0) PTable_hd1: db 64 dup (0) PTable_hd2: db 64 dup (0) PTable_hd3: db 64 dup (0) PTable_ep0: db 64 dup (0) PTable_ep1: db 64 dup (0) PTable_ep2: db 64 dup (0) PTable_ep3: db 64 dup (0) DiskParams: Disk_fd0: db 16 dup (0) DAP_fd0: db 16 dup(0) GDP_fd0: db 26 dup(0) TRDP_fd0: db 6 dup(0) Disk_fd1: db 16 dup (0) DAP_fd1: db 16 dup(0) GDP_fd1: db 26 dup(0) TRDP_fd1: db 6 dup(0) Disk_hd0: db 16 dup (0) DAP_hd0: db 16 dup(0) GDP_hd0: db 26 dup(0) TRDP_hd0: db 6 dup(0) Disk_hd1: db 16 dup (0) DAP_hd1: db 16 dup(0) GDP_hd1: db 26 dup(0) TRDP_hd1: db 6 dup(0) Disk_hd2: db 16 dup (0) DAP_hd2: db 16 dup(0) GDP_hd2: db 26 dup(0) TRDP_hd2: db 6 dup(0) Disk_hd3: db 16 dup (0) DAP_hd3: db 16 dup(0) GDP_hd3: db 26 dup(0) TRDP_hd3: db 6 dup(0) end_of_dparams_buff: DOSBootSectorBuff: BS_JmpBoot: db 3 dup (0) BS_OEMName: db 8 dup (0) BPB_BytsPerSec: dw 0 BPB_SecPerClust: db 0 BPB_RsvdSecCnt: dw 0 BPB_NumFATs: db 0 BPB_RootEntCnt: dw 0 BPB_TotalSec16: dw 0 BPB_Media: db 0 BPB_FATSz16: dw 0 BPB_SecPerTrk: dw 0 BPB_NumHeads: dw 0 BPB_HiddSec: dd 0 BPB_TotalSec32: dd 0 BPB_FATSz32: ; FAT32, 4 bytes BS_DrvNum: db 0 BS_Reserved1: db 0 BS_BootSig: db 0 BS_VolID: db 0 BPB_ExtFlags: ; FAT32, 2 bytes dw 0 BPB_FSVer: ; FAT32, 2 bytes db 0 BS_VolLab: db 0 BPB_RootClus: ; FAT32, 4 bytes dd 0 BPB_FSInfo: ; FAT 32, 2 bytes dw 0 BPB_BkBootSec: ; FAT32, 2 bytes dw 0 BPB_Reserved: ; FAT32, 12 bytes dw 0 BS_FilSysType: db 8 dup (0) BS_BootCode: dw 0 BS_FAT32_DrvNum: ; FAT32, 1 byte db 0 BS_FAT32_Reserved1: ; FAT32, 1 byte db 0 BS_FAT32_BootSig: ; FAT32, 1 byte db 0 BS_FAT32_VolID: ; FAT32, 4 bytes dd 0 BS_FAT32_VolLab: ; FAT32, 11 bytes db 11 dup (0) BS_FAT32_FilSysType: ; FAT32, 8 bytes db 8 dup (0) BS_FAT32_BootCode: db 420 dup (0) BS_Validation: dw 0 Hard_Disk: db 80h Last_DOS_DiskNo: db 0 HD_LBAYes: dd 0 ; end of DRV_INIT.ASM proc_print_p_entry proc near ; Input -> DS:SI = Partition Entry Buffer push si push cx mov al, byte ptr [SI][ptBootable] call proc_hex mov word ptr [P_Status], ax mov al, byte ptr [SI][ptBeginHead] call proc_hex mov word ptr [Begin_Head], ax mov al, byte ptr [SI][ptBeginSector] call proc_hex mov word ptr [Begin_Sec], ax mov al, byte ptr [SI][ptBeginCylinder] call proc_hex mov word ptr [Begin_Cyl], ax mov al, byte ptr [SI][ptFileSystemName] call proc_hex mov word ptr [FS_ID], ax mov al, byte ptr [SI][ptEndHead] call proc_hex mov word ptr [End_Head], ax mov al, byte ptr [SI][ptEndSector] call proc_hex mov word ptr [End_Sec], ax mov al, byte ptr [SI][ptEndCylinder] call proc_hex mov word ptr [End_Cyl], ax mov ax, word ptr [SI][ptStartSector] mov dx, word ptr [SI][ptStartSector]+2 mov bp, 8 mov cx, 10 loc_rediv_startsec: call Rx_Dos_Div32 add bl,'0' mov byte ptr [P_Start_Sec][bp],bl dec bp and ax, ax jnz short loc_rediv_startsec and dx, dx jnz short loc_rediv_startsec loc_fspc_startsec: mov byte ptr [P_Start_Sec][bp],20h cmp bp,0 jna short loc_conv_psectors dec bp jmp short loc_fspc_startsec loc_conv_psectors: mov ax, word ptr [SI][ptSectors] mov dx, word ptr [SI][ptSectors]+2 mov bp, 8 ; mov cx, 10 loc_rediv_psectors: call Rx_Dos_Div32 add bl,'0' mov byte ptr [P_Sectors][bp],bl dec bp and ax, ax jnz short loc_rediv_psectors and dx, dx jnz short loc_rediv_psectors loc_fspc_psectors: mov byte ptr [P_Sectors][bp],20h cmp bp,0 jna short loc_filesys_str dec bp jmp short loc_fspc_psectors loc_filesys_str: mov bl, byte ptr [SI][ptFileSystemName] cmp bl, 7 ja short loc_non_dos_fs mov al, 0Bh mul bl mov si, offset FileSys_Names add si, ax loc_move_fsname: mov di, offset P_FileSystem push cx mov cx,11 rep movsb pop cx print_p_entry_row: mov si, offset PTable_Drv call proc_printmsg pop cx pop si retn loc_non_dos_fs: mov si, offset FS_WIN_32 cmp bl, 0Bh jz short loc_move_fsname cmp bl, 0Ch jz short loc_move_fsname mov si, offset FS_WIN_P cmp bl, 0Eh jz short loc_move_fsname mov si, offset FS_WIN_EXT cmp bl, 0Fh jz short loc_move_fsname mov si, offset FS_SCO cmp bl, 63h jz short loc_move_fsname mov si, offset FS_Linux cmp bl, 83h jz short loc_move_fsname mov si, offset FS_LinuxSwap cmp bl, 82h jz short loc_move_fsname mov si, offset FS_LinuxExt cmp bl, 85h jz short loc_move_fsname mov si, offset FS_TR_MULTIX cmp bl, 0A1h jz short loc_move_fsname mov si, offset FS_ATAPITR cmp bl, 0A2h jz short loc_move_fsname mov si, offset RS_TRDD cmp bl, 0A0h jz short loc_move_fsname mov si, offset FS_Others jmp short loc_move_fsname proc_print_p_entry endp proc_fill_diskinfo_fields proc near inc byte ptr [DPT_No] mov al, byte ptr [si] ; Disk Drive Number call proc_hex mov word ptr [DI_DDN], ax mov al, byte ptr [si][DPDType] call proc_hex mov word ptr [DI_T], ax mov al, byte ptr [si][DPDisks] call proc_hex mov word ptr [DI_TD], ax mov al, byte ptr [si][DPSecPerTrack] call proc_hex mov word ptr [DI_SPT], ax mov al, byte ptr [si][DPHeads] call proc_hex mov word ptr [DI_H], ax mov al, byte ptr [si][DPCylinders]+1 call proc_hex mov word ptr [DI_C], ax mov al, byte ptr [si][DPCylinders] call proc_hex mov word ptr [DI_C]+2, ax mov al, byte ptr [si][DPTableOff]+1 call proc_hex mov word ptr [DI_DPTO], ax mov al, byte ptr [si][DPTableOff] call proc_hex mov word ptr [DI_DPTO]+2, ax mov al, byte ptr [si][DPTableSeg]+1 call proc_hex mov word ptr [DI_DPTS], ax mov al, byte ptr [si][DPTableSeg] call proc_hex mov word ptr [DI_DPTS]+2, ax mov al, byte ptr [si][DPNumOfSecs]+3 call proc_hex mov word ptr [DI_TS_2], ax mov al, byte ptr [si][DPNumOfSecs]+2 call proc_hex mov word ptr [DI_TS_2]+2, ax mov al, byte ptr [si][DPNumOfSecs]+1 call proc_hex mov word ptr [DI_TS_1], ax mov al, byte ptr [si][DPNumOfSecs] call proc_hex mov word ptr [DI_TS_1]+2, ax cmp byte ptr [SI][DAP_PacketSize], 10h je short loc_LBA_Ready_YES mov word ptr [DI_LBA_Ready], "ON" mov word ptr [DI_LBA_Ready]+2, 2020h loc_return_without_LBA_totals: mov byte ptr [Msg_LBA_Totals], 0 ; Don't print retn loc_LBA_Ready_YES: mov word ptr [DI_LBA_Ready], "EY" mov word ptr [DI_LBA_Ready]+2, " S" cmp word ptr [si][GetDParams_48h], 0 ja short loc_return_without_LBA_totals mov byte ptr [Msg_LBA_Totals], 0Dh ; Print mov al, byte ptr [si][GDP_48h_LBA_Sectors]+3 call proc_hex mov word ptr [DI_LBA_TS_1], ax mov al, byte ptr [si][GDP_48h_LBA_Sectors]+2 call proc_hex mov word ptr [DI_LBA_TS_1]+2, ax mov al, byte ptr [si][GDP_48h_LBA_Sectors]+1 call proc_hex mov word ptr [DI_LBA_TS_2], ax mov al, byte ptr [si][GDP_48h_LBA_Sectors] call proc_hex mov word ptr [DI_LBA_TS_2]+2, ax mov al, byte ptr [si][GDP_48h_BytesPerSec]+1 call proc_hex mov word ptr [DI_BytesPersec], ax mov al, byte ptr [si][GDP_48h_BytesPerSec] call proc_hex mov word ptr [DI_BytesPerSec]+2, ax retn proc_fill_diskinfo_fields endp proc_print_drv_info proc near ; input -> DS:SI = Logical Disk Parameters table cmp word ptr [SI][LD_BPB][FATSecs], 0 ja short pass_FAT32_drv_info mov word ptr [val_fatsecs], '00' mov word ptr [val_fatsecs]+2, '00' mov al, byte ptr [SI][LD_BPB][FAT32_DrvNum] call proc_hex mov word ptr [val_drivenumber], ax mov al, byte ptr [SI][LD_BPB][FAT32_Reserved1] call proc_hex mov word ptr [val_reserved1], ax mov al, byte ptr [SI][LD_BPB][FAT32_BootSig] call proc_hex mov word ptr [val_bootsignature], ax mov al, byte ptr [SI][LD_BPB][FAT32_VolID] call proc_hex mov word ptr [val_volumeid]+6, ax mov al, byte ptr [SI][LD_BPB][FAT32_VolID]+1 call proc_hex mov word ptr [val_volumeid]+4, ax mov al, byte ptr [SI][LD_BPB][FAT32_VolID]+2 call proc_hex mov word ptr [val_volumeid]+2, ax mov al, byte ptr [SI][LD_BPB][FAT32_VolID]+3 call proc_hex mov word ptr [val_volumeid], ax push si add si, LD_BPB + FAT32_VolLab mov di, offset str_volumelabel mov cx, 11 rep movsb mov cx, 4 mov di, offset str_filesystype rep movsw mov cx, 19 mov di, offset str_volumelabel loop_scan_str_FAT32vlabel: cmp byte ptr [DI], 0 jne short pass_i_str_FAT32vlabel mov byte ptr [DI], 20h pass_i_str_FAT32vlabel: inc di loop loop_scan_str_FAT32vlabel pop si jmp short pass_FAT16_drv_info pass_FAT32_drv_info: mov al, byte ptr [SI][LD_BPB][FATsecs] call proc_hex mov word ptr [val_fatsecs]+2, ax mov al, byte ptr [SI][LD_BPB][FATsecs]+1 call proc_hex mov word ptr [val_fatsecs], ax mov al, byte ptr [SI][LD_BPB][DriveNumber] call proc_hex mov word ptr [val_drivenumber], ax mov al, byte ptr [SI][LD_BPB][Reserved1] call proc_hex mov word ptr [val_reserved1], ax mov al, byte ptr [SI][LD_BPB][bootsignature] call proc_hex mov word ptr [val_bootsignature], ax mov al, byte ptr [SI][LD_BPB][VolumeID] call proc_hex mov word ptr [val_volumeid]+6, ax mov al, byte ptr [SI][LD_BPB][VolumeID]+1 call proc_hex mov word ptr [val_volumeid]+4, ax mov al, byte ptr [SI][LD_BPB][VolumeID]+2 call proc_hex mov word ptr [val_volumeid]+2, ax mov al, byte ptr [SI][LD_BPB][VolumeID]+3 call proc_hex mov word ptr [val_volumeid], ax push si add si, LD_BPB + VolumeLabel mov di, offset str_volumelabel mov cx, 11 rep movsb mov cx, 4 mov di, offset str_filesystype rep movsw mov cx, 19 mov di, offset str_volumelabel loop_scan_str_volumelabel: cmp byte ptr [DI], 0 jne short pass_i_str_volumelabel mov byte ptr [DI], 20h pass_i_str_volumelabel: inc di loop loop_scan_str_volumelabel pop si pass_FAT16_drv_info: mov al, byte ptr [SI][LD_Name] mov byte ptr [str_info_drv_name], al push si add si, LD_BPB + OemName mov di, offset str_oemname mov cx, 4 rep movsw mov cx, 8 mov di, offset str_oemname loop_scan_str_oemname: cmp byte ptr [DI], 0 jne short pass_i_str_oemname mov byte ptr [DI], 20h pass_i_str_oemname: inc di loop loop_scan_str_oemname pop si mov al, byte ptr [SI][LD_BPB][BytesPerSec] call proc_hex mov word ptr [val_bytespersec]+2, ax mov al, byte ptr [SI][LD_BPB][BytesPerSec]+1 call proc_hex mov word ptr [val_bytespersec], ax mov al, byte ptr [SI][LD_BPB][SecPerClust] call proc_hex mov word ptr [val_secperclust], ax mov al, byte ptr [SI][LD_BPB][ResSectors] call proc_hex mov word ptr [val_ressectors]+2, ax mov al, byte ptr [SI][LD_BPB][ResSectors]+1 call proc_hex mov word ptr [val_ressectors], ax mov al, byte ptr [SI][LD_BPB][FATs] call proc_hex mov word ptr [val_fats], ax mov al, byte ptr [SI][LD_BPB][RootDirEnts] call proc_hex mov word ptr [val_rootdirents]+2, ax mov al, byte ptr [SI][LD_BPB][RootDirEnts]+1 call proc_hex mov word ptr [val_rootdirents], ax mov al, byte ptr [SI][LD_BPB][Sectors] call proc_hex mov word ptr [val_sectors]+2, ax mov al, byte ptr [SI][LD_BPB][Sectors]+1 call proc_hex mov word ptr [val_sectors], ax mov al, byte ptr [SI][LD_BPB][Media] call proc_hex mov word ptr [val_media], ax mov al, byte ptr [SI][LD_BPB][SecPerTrack] call proc_hex mov word ptr [val_secpertrack]+2, ax mov al, byte ptr [SI][LD_BPB][SecPerTrack]+1 call proc_hex mov word ptr [val_secpertrack], ax mov al, byte ptr [SI][LD_BPB][Heads] call proc_hex mov word ptr [val_heads]+2, ax mov al, byte ptr [SI][LD_BPB][Heads]+1 call proc_hex mov word ptr [val_heads], ax mov al, byte ptr [SI][LD_BPB][Hidden1] call proc_hex mov word ptr [val_hidden1]+2, ax mov al, byte ptr [SI][LD_BPB][Hidden1]+1 call proc_hex mov word ptr [val_hidden1], ax mov al, byte ptr [SI][LD_BPB][Hidden2] call proc_hex mov word ptr [val_hidden2]+2, ax mov al, byte ptr [SI][LD_BPB][Hidden2]+1 call proc_hex mov word ptr [val_hidden2], ax mov al, byte ptr [SI][LD_BPB][HugeSec1] call proc_hex mov word ptr [val_hugesec1]+2, ax mov al, byte ptr [SI][LD_BPB][HugeSec1]+1 call proc_hex mov word ptr [val_hugesec1], ax mov al, byte ptr [SI][LD_BPB][HugeSec2] call proc_hex mov word ptr [val_hugesec2]+2, ax mov al, byte ptr [SI][LD_BPB][HugeSec2]+1 call proc_hex mov word ptr [val_hugesec2], ax mov si, offset msg_drive_info call proc_printmsg retn proc_print_drv_info endp P_Table_Header: db 7 db 0Dh, 0Ah db "[TRDOS] PRESENT FIXED DISK PARTITIONS ¸ Erdogan TAN 2005" db 0Dh, 0Ah, 0Dh, 0Ah db "DRV PN S BH BS BC FS EH ES EC START SEC SECTORS FILE SYSTEM" db 0Dh, 0Ah db "--- -- --- --- --- --- --- --- --- --- --------- --------- -----------" db 0Dh, 0Ah, 0h PTable_Drv: db "hd" db 0,20h db "p" P_Number: db 0,20h P_Status: dw 0 db "h " Begin_Head: dw 0 db "h " Begin_Sec: dw 0 db "h " Begin_Cyl: dw 0 db "h " FS_ID: dw 0 db "h " End_Head: dw 0 db "h " End_Sec: dw 0 db "h " End_Cyl: dw 0 db "h " P_Start_Sec: dd 0 dd 0 db " " P_Sectors: dd 0 dd 0 db " " P_FileSystem: db 11 dup(20h) db 0Dh, 0Ah, 0h FileSys_Names: ; 2003 (Valid FileSystems for TR-DOS Project in 2005) db " " db "TrDos FS1 " ; 01h (16 bit, 512 bytes per sec) ; Reserved for future TRDOS versions db "TrDos FS2 " ; 02h (32 bit, 512 bytes per sec) ; Reserved for future TRDOS versions db "TrDos FS3 " ; 03h (32 bit, 2048 bytes per sec) ; Reserved for future TRDOS versions db "DOS FAT16 " ; 04h = FAT16 < 32MB ; TRDOS doesn't use this FS for hard disks db "DOS EXT " ; 05h = Extended DOS Partition ; TRDOS uses DOS extended partitions db "DOS FAT16 " ; 06h = FAT16 > 32MB, CHS Mode ; TRDOS uses FAT16 Big CHS mode FS FS_NTFS: db "WINDOWS NT " ; 07h , WINDOWS 2000/XP NTFS Partition ; TRDOS doesn't use NTFS FS_WIN_32: db "WIN4 FAT32 " ; OBh = FAT32 CHS, 0Ch = FAT32 LBA ; TRDOS uses FAT32 CHS and LBA modes FS_WIN_P: db "WIN4 FAT16 " ; 0Eh = FAT16, LBA Mode ; TRDOS uses FAT16 LBA mode FS FS_WIN_EXT: db "WIN4 EXT " ; 0Fh = Extented Partition, LBA Mode ; TRDOS uses WINDOWS extended partitions FS_SCO: db "SCO Unix " ; 63h , SCO UNIX, UNIXWARE, OPENSERVER ; TRDOS doesn't use any UNIX file systems FS_Linux: db "Linux " ; 83h , LINUX NATIVE (ext2) Partition FS_LinuxSwap: db "Linux Swap " ; 82h , LINUX SWAP Partition FS_LinuxExt: db "Linux Ext " ; 85h , LINUX EXTENDED Partition ; TRDOS doesn't use any LINUX file systems FS_TR_MULTIX: db "Singlix FS1" ; A1h , (32 bit, 512 bytes per sector) ; TR-MULTIX LBA disk FS (ATA device LBA FS) FS_ATAPITR: db "Singlix FS2" ; A2h , (32 bit, 2048 bytes per sector) ; TR-MULTIX ATAPI device LBA FS RS_TRDD: db "RDD " ; A0h , (Random Data Disk) LBA ; Reserved (New Record System) FS_Others: db "Non-DOS " ; Non DOS, Another or Unknown File Systems Disk_Info: db 7 db "TR-DOS DISK PARAMETERS TABLE [ Disk " DPT_No: db "0" db " ]" db 0Dh, 0Ah, 0Dh, 0Ah db "Disk Drive Number: " DI_DDN: dw 3030h db 'h' db 0Dh, 0Ah db "Drive Type: " DI_T: dw 3030h db 'h' db 0Dh, 0Ah db "Total Drives: " DI_TD: dw 3030h db 'h' db 0Dh, 0Ah db "Sectors per Track: " DI_SPT: dw 3030h db 'h' db 0Dh, 0Ah db "Heads: " DI_H: dw 3030h db 'h' db 0Dh, 0Ah db "Cylinders: " DI_C: dd 30303030h db 'h' db 0Dh, 0Ah db "BIOS DPT Segment: " DI_DPTS: dd 30303030h db 'h' db 0Dh, 0Ah db "BIOS DPT Offset: " DI_DPTO: dd 30303030h db 'h' db 0Dh, 0Ah db "Total Sectors: " DI_TS_1: dd 30303030h db 'h:' DI_TS_2: dd 30303030h db 'h' db 0Dh, 0Ah db 0Dh, 0Ah db "LBA Ready: " DI_LBA_Ready: db "NO " db 0Dh, 0Ah Msg_LBA_Totals: db 0Dh, 0Ah db "LBA Total Sectors: " DI_LBA_TS_1: dd 30303030h db 'h:' DI_LBA_TS_2: dd 30303030h db 'h' db 0Dh, 0Ah db "Bytes in a Sector: " DI_BytesPersec: dd 30303030h db "h" db 0Dh, 0Ah, 0 Msg_drive_info: db 7 db "[ TR-DOS DRIVE ] " str_info_drv_name: db "0:" db 0Dh, 0Ah db 0Dh, 0Ah db "OEM Name : " str_oemname: db 8 dup(20h) db 0Dh, 0Ah db "Bytes Per Sector : " val_bytespersec: dd 0 db "h" db 0Dh, 0Ah db "Sectors Per Cluster : " val_secperclust: dw 0 db "h" db 0Dh, 0Ah db "Reserved Sectors : " val_ressectors: dd 0 db "h" db 0Dh, 0Ah db "Number Of FATs : " val_fats: dw 0 db "h" db 0Dh, 0Ah db "Root Directory Entries : " val_rootdirents: dd 0 db "h" db 0Dh, 0Ah db "Total Sectors : " val_sectors: dd 0 db "h" db 0Dh, 0Ah db "Media : " val_media: dw 0 db "h" db 0Dh, 0Ah db "FAT Sectors : " val_fatsecs: dd 0 db "h" db 0Dh, 0Ah db "Sectors Per Track : " val_secpertrack: dd 0 db "h" db 0Dh, 0Ah db "Heads : " val_heads: dd 0 db "h" db 0Dh, 0Ah db "Hidden Sectors : " val_hidden2: dd 0 val_hidden1: dd 0 db "h" db 0Dh, 0Ah db "Total Sectors (Huge) : " val_hugesec2: dd 0 val_hugesec1: dd 0 db "h" db 0Dh, 0Ah db "Drive Number : " val_drivenumber: dw 0 db "h" db 0Dh, 0Ah db "Reserved Byte : " val_reserved1: dw 0 db "h" db 0Dh, 0Ah db "Boot Signature : " val_bootsignature: dw 0 db "h" db 0Dh, 0Ah db "Volume ID : " val_volumeid: dd 0 dd 0 db 0Dh, 0Ah db "Volume Label : " str_volumelabel: db 11 dup(20h) db 0Dh, 0Ah db "File System : " str_filesystype: db 8 dup (20h) db 0Dh, 0Ah db 0Dh, 0Ah db 0 Magic_Bytes: db 4 db 1 Press_Any_Key: db 0Dh, 0Ah db "Press any key to continue ..." db 0Dh, 0Ah, 0 Program_Name: db 7 db "[TRDOS] DISK INFO " Version_Str: db "v2.0 ¸ Erdogan Tan 2004-2005" db 0Dh, 0Ah db "File Size = " db 6 dup(0) FileSize_StrPlus5: db " bytes" db 0Dh, 0Ah db 0 Current_TRDOS_Drv: db 0 Logical_DOSDisks: dw 3328 dup(0) File_Size: dw $-254 Present ends end start