
;
;       Writing to the hard disk using the ports!     by qark
;       +---------------------------------------+
;
;  The only differences between reading and writing using the ports is
;  that 30h is sent to the command register, and instead of INSW you
;  OUTSW.  
;
;  I chose to write to sector 2 because some idiot would trash their MBR
;  by running this.
;

	mov     dx,1f6h         ;Drive and head port
	mov     al,0a0h         ;Drive 0, head 0
	out     dx,al

	mov     dx,1f2h         ;Sector count port
	mov     al,1            ;Write one sector
	out     dx,al

	mov     dx,1f3h         ;Sector number port
	mov     al,2            ;Wrote to sector two
	out     dx,al

	mov     dx,1f4h         ;Cylinder low port
	mov     al,0            ;Cylinder 0
	out     dx,al

	mov     dx,1f5h         ;Cylinder high port
	mov     al,0            ;The rest of the cylinder 0
	out     dx,al

	mov     dx,1f7h         ;Command port
	mov     al,30h          ;Write with retry.
	out     dx,al
oogle:
	in      al,dx
	test    al,8            ;Wait for sector buffer ready.
	jz      oogle
	
	mov     cx,512/2        ;One sector /2
	mov     si,offset buffer
	mov     dx,1f0h         ;Data port - data comes in and out of here.
	rep     outsw           ;Send it.

;    ------------

	mov     ax,201h                 ;We'll read in sector 2 using
	mov     bx,offset buffer2       ;int13h and see if we are successful.
	mov     cx,2
	mov     dx,80h
	int     13h

	mov     cx,512
	mov     si,offset buffer
	mov     di,offset buffer2
	repe    cmpsb                   ;Compare the buffers.
	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        ;Exit the program
	int     21h
	
	write_msg       db      'Sector two written to using the ports.$'
	fail            db      'Writing using ports failed.$'

buffer  db      512 dup ('A')
buffer2 db      512 dup ('D')


