; ; 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')