суботу, 27 липня 2013 р.

Аналіз SYS.COM з попередника, 86-DOS

Для повноти повернемося ще на крок назад. "Дистрибутив" 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". Цитуючи його:

Тобто, справді, просто побайтово копіюються перших 52 секторів 128-байтових секторів. (128 -- розмір сектору дуже старих дискет). Особливо зворушливо звучить інформація про те, що кількість записів зберігається в 4-му байті програми і може бути легко зміненою. :-)

P.S. Скачати код, разом із лістингом, згенерованим IDA, скомпільованим файлом та, для порівняння, оригінальним SYS.COM, можна тут. Скомпільований код, з точністю до єдиного байта, який відповідає опкоду-синоніму, тотожній оригінальному. Зверніть увагу --- програма 80-го року, скомпільована сучасним асемблером.

Немає коментарів:

Дописати коментар