мета-данные страницы
  •  
Загрузка не удалась. Возможно, проблемы с правами доступа?

Это старая версия документа!


#include "crt.h"
#include "m6845.h"
#include "cursor.h"
 
unsigned char __maxX (void)
{
	if (! mode)
	 return 40;
	else return 80;
}
 
int write (unsigned char * string)
{
	int buf;
	unsigned char ch;
	int i=0;
	attribut = 7;
	while (*(string + i) != 0)
	{
		update_cursor (cursor);
		if (cursor >= (__maxX () * __maxY))
		{
		 scroll ();
		 cursor = (__maxY-1) * __maxX ();
		}
		if (*(string+i)>=32)
		{
			ch = *(string+i);
			put_symbol (ch,attribut);
			cursor++;
		}
		else
		{
			switch (*(string+i))
			{
			case '\a':
			case '\n': buf = cursor % __maxX ();
					cursor = cursor - buf + __maxX ();
					if (cursor >= (__maxX ()* __maxY))
					{
					 scroll ();
					 cursor = (__maxY-1) * __maxX ();
					}
					break;
			case 0: break;
			default: cursor ++;
			}
		}
		i++;
	}
	return 0;
}

sdf

.MODEL small
 
_WIDTH equ 25
 
L_1  equ	80
L_0	equ	40
 
public _put_symbol, _scroll
 
extrn _cursor, _type_crt, _mode
 
.CODE
 
_put_symbol proc near
 
	CLI
	push	bp
	mov	bp,sp
	mov	cx,_type_crt
	cmp	cx,0
	je	_monocrome
	mov	dx,0b800h
	jmp	_continue
_monocrome:
	mov	dx,0b000h
 
_continue:
	mov	es,dx
	mov	bx,_cursor
	shl	bx,1
	mov	al,[bp+4]
	mov	ah,[bp+6]
	mov	es:[bx],ax
 
	pop	bp
	mov	ax,0
	STI
	ret
 
_put_symbol endp
 
 
_scroll proc near
 
	CLI
	push	bp
	push	ds
	push	si
	push	di
 
	cmp	_mode,0
	je	mode0
 
	mov	dh,L_1
	jmp	contin
 
mode0:
	mov	dh,L_0
 
contin:
 
	mov	al,_WIDTH
	mul	dh
 
	sub	al,dh
	mov	cx,ax
	shl	ax,1
	mov	bp,ax
	cld
 
	mov	bx,0b800h		;надо этот участок переписать, но нет времени
 
	mov	ds,bx		;DS:SI = 0b800h:0000H
	mov	es,bx		;ES:DI = 0b800h:0019H
	xor	bx,bx
	mov	di,bx
	mov	bl,dh
	shl	bx,1
	mov	si,bx
	rep	movsw
 
	mov	cl,dh			; здесь тоже проблема: не получается стереть
	mov	ax,0720H			; нижнюю строчку, остаётся мусор
 
l2:
	mov	ds:[bp],ax
	inc	bp
	inc	bp
	dec	cl
	cmp	cl,0
	jne	l2
 
	xor	ax,ax
 
	pop	di
	pop	si
	pop	ds
	pop	bp
	STI
	ret
 
_scroll endp
 
end
/* Хидерный файл контроллера Motorola 6845 */
 
char type_crt = 1; /* Тип монитора. 0 - MDA, 1 - CGA, EGA e t. c.*/
 
unsigned char mode = 03;	/* Режим, очевидно */
 
#define __maxY		25
 
unsigned char __maxX (void);
 
extern unsigned int cursor = 0;	/* Позиция курсора в линейном режиме */
 
extern unsigned char attribut = 7; /* Его атрибут */
 
extern int put_symbol (unsigned char symbol, unsigned char attribut);
 
extern int scroll (void); /* Прокручиваем экран на одну строчку */