Metropoli BBS
VIEWER: at_io.asm MODE: TEXT (ASCII)
; this file has some fast asmbly routines in it
; the routines use the C calling method for a small model
;
;

.286c					    ; 80286 AT code
DOSSEG					    ; use dos segments
.MODEL LARGE
.CODE

; _WR_BLOCK	 WILL WRITE ONE 512 BLOCK OF DATA EVERY TIME A DRQ IS THERE
;    INPUT :	 [BP+4]   POINTER TO START OF BUFFER
;    OUTPUT:	  NONE



	    PUBLIC   _WR_BLOCK
_WR_BLOCK   PROC     FAR
	    ENTER    2,0
	    PUSHA
	    PUSH     DS

	    MOV      BX,[BP+6]		    ; POINTER TO BUFFER offset
	    MOV      AX,[BP+8]		    ;POINTER SEGMENT
	    MOV      DS,AX
	    MOV      DX,1F7H		    ;COMMAND REG
	    MOV      AL,30H
	    OUT      DX,AL		    ;SEND WRITE COMMAND

wrb_10:     NOP 			    ;DELAY
	    JMP      SHORT $+2
	    NOP 			    ;DELAY
	    JMP      SHORT $+2
	    NOP 			    ;DELAY
	    JMP      SHORT $+2
	    NOP 			    ;DELAY
	    JMP      SHORT $+2
	    NOP 			    ;DELAY
	    JMP      SHORT $+2
	    NOP 			    ;DELAY
	    JMP      SHORT $+2
	    NOP 			    ;DELAY

BUSY_LP:
	    IN	     AL,DX		    ;GET STATUS
	    JMP      SHORT $+2
	    NOP
	    AND      AL,80H		    ;MASK ALL BUT BUSY
	    JNZ      BUSY_LP

	    IN	     AL,DX		    ;CHECK FOR DRQ
	    AND      AL,8
	    JZ	     ALL_DONE		    ;SKIP, IF NO DRQ

	    MOV      DX,01F0H		    ;DATA BUFFER PORT
	    MOV      CX,256		    ;1 SECTOR
	    CLD

	    MOV      SI,BX		    ;SERVICE CONTROLLER BUFFER
	    REP      OUTSW		    ;ELSE, WRITE COMMAND
	    MOV      DX,1F7H		    ;POINT TO STATUS REG
	    JMP      wrb_10


ALL_DONE:
	    IN	     AL,DX		    ;CHECK FOR ERROR
	    AND      AL,05H		    ; CHECK FOR ERROR OR ECC
	    JNZ      DISK_ERR		    ;JMP, IF ERROR

	    CLC
	    POP      DS
	    POPA
	    LEAVE
	    RET

DISK_ERR:
	    STC
	    POP      DS
	    POPA
	    LEAVE
	    RET
_WR_BLOCK   ENDP



	    END


[ RETURN TO DIRECTORY ]