Для повноти повернемося ще на крок назад. "Дистрибутив" 86-DOS 1.0 від 28 квітня 1981 року теж доступний в Інтернет. Він містить джерельні тексти власне операційної системи, SYS.COM присутній лише в двійковому коді. Тому довелося знову взятися за дизасемблер. :-)
; This file is generated by The Interactive Disassembler (IDA) ; Copyright (c) 2010 by Hex-Rays SA, <support@hex-rays.com> ; Licensed to: Freeware version ; ; Modified to compile by fasm and commented by Indrekis, indrekis2.blogspot.com ; ; Input MD5 : F8A837C7C35E82625599959A7585CD7A ; File Name : D:\WorkWWW\Blog\Computers.S\DOS_History_2\86DOS\SYS.COM ; Format : MS-DOS COM-file ; Base Address: 0h Range: 100h-19Ah Loaded length: 9Ah Buffer = 19Ah ;.8086 use16 org 100h start: jmp near EntryPoint1 ; =========================================================================== SysSectors dw 34h ; 52d sectors, 128 bytes (!) each ; =========================================================================== EntryPoint1: mov al, [ds:5Ch] ; In PSP, 5Ch-6Bh (16 bytes) -- Unopened Standard FCB 1 ; or al, al jz short BadDriveLetter dec al jz short BadDriveLetter mov [ds:5Ch], al mov cx, word [SysSectors] mov dx, 0 mov bx, Buffer ; Buffer --- constant mov al, 0 int 25h ; DOS - ABSOLUTE DISK READ ; AL = drive number (0=A, 1=B, etc), DS:BX = Disk Transfer Address (buffer) ; CX = number of sectors to read, DX = first relative sector to read ; Return: CF set on error ; ; ATTENTION! This is 86DOS, sector -- 128 bytes! jb short DiskReadErr popf mov cx, word [SysSectors] mov dx, 0 mov bx, Buffer ; Buffer --- constant mov al, byte [ds:5Ch] mov ah, 1 int 26h ; DOS - ABSOLUTE DISK WRITE (except DOS 4.0/COMPAQ DOS 3.31 >32M partn) ; AL = drive number (0=A, 1=B, etc), DS:BX = Disk Transfer Address (buffer) ; CX = number of sectors to write, DX = first relative sector to write ; Return: CF set on error ; ; ATTENTION! This is 86DOS, sector -- 128 bytes! jb short DiskWriteErr mov dx, aSystemTransfer ; "System transfered$" jmp short PrnMsgNExit ; =========================================================================== DiskReadErr: mov dx, aDiskReadError ; "Disk read error$" PrnMsgNExit: mov ah, 9 int 21h ; DOS - PRINT STRING ; DS:DX -> string terminated by "$" int 20h ; DOS - PROGRAM TERMINATION ; returns to DOS--identical to INT 21/AH=00h ; =========================================================================== DiskWriteErr: mov dx, aDiskWriteError ; "Disk write error$" jmp short PrnMsgNExit ; =========================================================================== BadDriveLetter: mov dx, aBadDriveSpecif ; "Bad drive specification$" jmp short PrnMsgNExit ; =========================================================================== aSystemTransfer db 'System transfered$' aDiskReadError db 'Disk read error$' aDiskWriteError db 'Disk write error$' aBadDriveSpecif db 'Bad drive specification$'
Програма дивиться, чи диск є поточним або першим у системі, якщо є -- каже "Bad drive specification" і завершується. Інакше читає з нього перших 34h=52h секторів (ймовірно, 128-байтових!), якщо була помилка читання --- повідомляє і завершується, інакше пробує їх записати на цільовий диск, починаючи з нульового.У випадку помилки запису, повідомляє про неї, інакше каже "System transfered" і завершується.
Автор QDOS/86-DOS, з якого вся ця історія і почалася, Tim Paterson, виклав багато документації на своєму сайті, зокрема там є "86-DOS User's Manual - Version 0.3, ca Dec 1980". Цитуючи його:
Автор QDOS/86-DOS, з якого вся ця історія і почалася, Tim Paterson, виклав багато документації на своєму сайті, зокрема там є "86-DOS User's Manual - Version 0.3, ca Dec 1980". Цитуючи його:
Тобто, справді, просто побайтово копіюються перших 52 секторів 128-байтових секторів. (128 -- розмір сектору дуже старих дискет). Особливо зворушливо звучить інформація про те, що кількість записів зберігається в 4-му байті програми і може бути легко зміненою. :-)
P.S. Скачати код, разом із лістингом, згенерованим IDA, скомпільованим файлом та, для порівняння, оригінальним SYS.COM, можна тут. Скомпільований код, з точністю до єдиного байта, який відповідає опкоду-синоніму, тотожній оригінальному. Зверніть увагу --- програма 80-го року, скомпільована сучасним асемблером.
Немає коментарів:
Дописати коментар