Date: Friday, 14 August 1987 04:43-MDT From: Ya'akov_Miles%UBC.MAILNET at MIT-Multics.ARPA To: Info-IBMPC at C.ISI.EDU Re: Re INFO-IBMPC Digest 30 Efficient Block Transfers Title Loop ;Demonstrate Block Transfer technique, sometimes called Transfer Vectoring COUNT =12345 ; Number of bytes to read BLOCK_SIZE =9 ; Bytes per data transfer block PORT =241h ; Clock. BCD seconds/100. (341h ?) ; BLOCK_SIZE =BLOCK_SIZE and 0FFFEh ; Force even # of bytes/xfer block ; Code Segment ; Declare Segment before "Assume" Assume ds:Code,ss:Code,cs:Code,es:Code ; Segment order avoids "problems"... ORG 0100h ; Start address for .COM binary file begin: mov di,offset DATA ; ES:[DI] --> data area mov cx,COUNT ; Get total bytes to transfer mov bx,BLOCK_SIZE ; Get data transfer block size, BYTES mov ax,cx ; Get lo order transfer byte count xor dx,dx ; ...zero hi order byte count div bx ; AX = blocks, DX = remainder push ax ; ...save block count mov cx,dx ; Get bytes in partial block mov dx,PORT ; ...load clock port jcxz exact ; Exact number of blocks in transfer ; fract: in al,dx ; Read BCD seconds/hundred. stosb ; ...ES:[DI] --> (next) saved result loop fract ; ...until done ; exact: pop cx ; Load number of blocks to transfer jcxz done ; ...less than one block in xfer ; block: Rept BLOCK_SIZE/2 ; Unroll DO loop this amount, bytes in al,dx ; Read BCD seconds/hundred xchg ah,al ; ...save temporary in register in al,dx ; Read BCD seconds/hundred xchg ah,al ; ...swap bytes to IBM order. Yuk stosw ; ...ES:[DI] --> (next) saved result Endm ; ...end of unrolled DO loop loop block ; ...love FORTRAN ; done: ret ; Back to BASIC programming data: ; ...data area after program Code ends ; End Begin .