// адресация в режиме 6

#include "sysp.h"


void Pixel_Offs_6(unsigned x, unsigned y,
				  unsigned *offset, unsigned char *shift) {

	unsigned char   bit_shift;
	unsigned        byte_offset;

	_asm {

		; записываем в bx x-координату пиксела

		mov bx,x

		; запоминаем в регистре cl младший байт переменной x

		mov cl,bl

		; записываем в ax y-координату пиксела

		mov ax,y

		; вычисляем смещение байта, определяющего пиксел с координатами (x,y)
		; ax = 100h * y

		xchg ah,al

		; в бит D7, регистра al, записываем младший бит переменной y
		; этот бит равен единице, если значение переменной y нечетное, и
		; равен нулю, если оно четное
		; al = 80h * (y&1)
		; ax = ax/2 = 80h * y

		shr ax,1

		; bx = x/2

		shr bx,1

		; bx = x/2 + 8000h*(y&1)

		add bh,al

		; ax = 100h*(y/2)

		xor al,al

		; bx = x/2 + 8000h*(y&1) + 100h*(y/2)

		add bx,ax

		; ax = 40h*(y/2)

		shr ax,1
		shr ax,1

		; bx = x/2 + 8000h*(y&1) + 140h*(y/2)

		add bx,ax

		; bx = x/8 + 2000h*(y&1) + 50h*(y/2)

		shr bx,1
		shr bx,1

		; bx = byte offset in video buffer

		mov byte_offset,bx

		; cl = x & 7

		and cl,7

		; cl = number of bits to shift left

		xor cl,7

		mov bit_shift,cl
	}

	*shift = bit_shift;
	*offset = byte_offset;
}



main() {

	unsigned offset,i;
	unsigned char mask,shift;

	unsigned char   far *ptr;

	_asm {
		xor ax,ax
		mov al,6
		int 10h
	}

	for(i=0;i<199;i++){
		Pixel_Offs_6(i,i,&offset,&shift);
		ptr = (unsigned char far*) (FP_MAKE(0xB800, offset));
		*ptr = (unsigned char) 1 << shift;
	}

	getch();
}

