write: mov al,es:[di] ; al = byte from buffer. inc di ; bump buffer pointer. jnz mwrit2 ; hop if no overflow. mov bx,es ; increment segment by 64k. add bx,1000h mov es,bx mwrit2: out data,al ; put byte into controller. loop mwrite ; dec cx, loop until zero. ; stop controller and wait for next request. mwexit: out intrupt,al ; interrupt controller. call twait ; wait for request and reset. ret ; status phase. ; exit with al = 0 if no errors. statphas: in al,status ; al =code,al or al,al ; clear zero flag. stc ; set carry flag. ret io_thx: ret ; return from hard disk r/w routine. ; Common Teletek hard disk read/write routine. findalt: cld ; set auto = increment. mov ax,hrdtrk ; ax = track number. mov cylind,ax ; cylind = track number. mov ax,hrdsec ; ax = sector requested. mov bl,hrdspt ; bl = sectors per track. div bl ; al = head number. mov mwhead,al ; put head number in cmd buffer. mov mwsectr,ah ; put sector number inrint "HD/CTC does not respond". call prtmsg jmp mwierr ; abort. ; if got busy and ready together. move6: in al,status ; if controller error. test al,error jz move7 ; then mov bx,offset msg1 ; print "Load aborted". call prtmsg mov bx,offset msg4 ; print "HD/CTC failed self-test". call prtmsg jmp mwierr ; abort. ; no controller error. move7: in al,data ; read firmware version letter. mov si,offset initdat ; point to initialization data. mov cx,ninbyts ; number bytesbusy ; is it busy? jnz cmnd1 ; poll for not busy. test al,ready ; is it ready? jz cmnd1 ; poll for ready. mov cx,ncdbyts ; cx = number of command bytes. mov si,offset cmdbuf ; si = command buffer address. cmndlp: lodsb ; al = command byte