▄▄                   ▄
▀▀▀ STEALTH GROUP WW █ Mail:   BOX 15, 125080 MOSCOW   ████████ █████████ █▀▀█
▀██ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ █ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ▀ ▀▀▀▀▐▀▀▀   ┌─┐┬ ┬┌─┤┬ ┬ ╥ ┬┐┌ █▄▄█
 ▐█ █▀▄ █▀▀ ▄▀▀ ▄▀▀ ▄█▄ ▄▀▀ █▀█   ▌ █ ▄▀█ █ ▄▀▀ █▄▄    ├┬┘│ │└─┐├─┤   │└┤ ▄  █
  █ █ █ █▀  █▀  █    █  █▀  █ █   █ █ █ █ █ █   █      ┴└─└─┘└─┘┴ ┴   ┴ ┴ ▀▀▀▀
  █ ▐ ▐ ▐   ▐▄▄ ▐▄▄  ▐  ▐▄▄ ▐▄▀    ▀█ ▀▄█ ▐ ▐▄▄ ▐▄▄▄   ████  WINTER ' 96  ████
  ▐ ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄   ███████████████████████

    █████████████ ЗАПИСЬ НА ВИНЧЕСТЕР С ПОМОЩЬЮ ПОРТОВ ! ██████████████ 

;
;       Запись на жесткий диск с использованием портов!     by qark
;       +----------------------------------------------+
;
;  Единственная разница между чтением и записью с помощью портов - 
;  в коммандный регистр посылается 30h и вместо INSW используется OUTSW.
;
;  Сектор 2 выбран для записи специально, чтобы какой-нибудь идиот не 
;  расхуячил свой MBR запуском этой программы.
;

	.model tiny
	.code
	.286
	org 100h
	start:


	mov     dx,1f6h         ;Порт выбора диска и головки
	mov     al,0a0h         ;Диск 0, головка 0
	out     dx,al

	mov     dx,1f2h         ;Порт счетчика секторов
	mov     al,1            ;Записать один сектор
	out     dx,al

	mov     dx,1f3h         ;Порт номера сектора
	mov     al,2            ;Записать в сектор номер два
	out     dx,al

	mov     dx,1f4h         ;Порт младших байт значения номера циллиндра
	mov     al,0            ;Циллиндр 0
	out     dx,al

	mov     dx,1f5h         ;Порт старших байт значения номера циллиндра
	mov     al,0            ;Оставшиеся старшие байты номера циллиндра
	out     dx,al

	mov     dx,1f7h         ;Коммандный порт
	mov     al,30h          ;Записать с повтором
	out     dx,al
oogle:
	in      al,dx
	test    al,8            ;Wait for sector buffer ready.
	jz      oogle
	
	mov     cx,512/2        ;Размер сектора /2
	mov     si,offset buffer
	mov     dx,1f0h         ;Порт данных - данные приходят/уходят отсюда.
	rep     outsw           ;Послать в порт. Выполнить операцию.

;    ------------

	mov     ax,201h                 ;Прочитаем сектор 2 с помощью int13h
	mov     bx,offset buffer2       ;и сравним.
	mov     cx,2
	mov     dx,80h
	int     13h

	mov     cx,512
	mov     si,offset buffer
	mov     di,offset buffer2
	repe    cmpsb                   ;Сравнить буфферы
	jne     failure

	mov     ah,9
	mov     dx,offset write_msg
	int     21h
	jmp     w_exit
failure:
	mov     ah,9
	mov     dx,offset fail
	int     21h
	
w_exit:
	mov     ax,4c00h        ;Выход из программы
	int     21h
	
	write_msg       db      'Сектор #2 записан через порты на диск.$'
	fail            db      'Ошибка портов при записи.$'

buffer  db      512 dup ('A')
buffer2 db      512 dup ('D')

	end start

; ─────────────────────────────────────────────────────────────────────────
; ──────────────── Remember Where You Saw This Phile First ────────────────
; ───────[=] ARRESTED DEVELOPMENT +31.77.3547477 The Netherlands [=]───────
; ─────────────────────────────────────────────────────────────────────────
