Здравствуйте, rmd!
Держите... Разбирайтесь...
[code lang=asm h=200]model tiny ;модель памяти, все в одном сегменте
.code ;сегмент кода
org 100h ;необходимо для формата файла COM
n equ 8 ;количество строк-столбцов (размерность доски)
m equ 3 ;количество символов на поле (высота и ширина клетки)
mh equ 2 ;горизонтальная коррекция (высота символа в 2 раза больше, чем ширина)
mv equ 1 ;вертикальная коррекция (вертикальная не меняется)
char equ 0DBh ;выводимый символ "полностью закрашенный прямоугольник" в кодировке ДОС
white equ 15 ;цвет символа (ярко-белый)
time equ 1Fh ;задержка (умножается на тик таймера 1/18.2 сек) под Windows весьма условно
;начальные установки
begin: ;начало программы
mov ax,3 ;ah=0 - установка видеорежима, al=3 - текстовый 25х80
int 10h ; вызов видеосервис БИОСа (необходимо для прямой записи в память под XP+)
mov ax, 0B800h ;адрес сегмента видеопамяти
mov es, ax ;будем адресовать видеопамять при помощи ES
mov si, 40h ;адрес сегмента данных ДОСа и, одновременно, смещение переменной ДОСа,
; в которой лежит переменная для автоматического подсчета паузы
mov ds, si ;сегмент ДОСа адресуем при помощи DS
mov ax,white*256+char ;выводимый символ с цветом
;работа (выводим доску)
start: xor di, di ;адрес в видеосегменте (будем выводить с начала 0 страницы)
;цикл по строкам
mov cx, n ;количество строк клеток
L1: push cx ;сохраним в стеке
;цикл размера строки
mov cx, mv*m ;количество строк в клетке (с учетом коэффициента 1)
L2: push cx ;сохраняем в стеке
;цикл в строке
push di ;сохраним адрес вывода (для перехода на другую строку)
mov cx, n ;количество клеток в строке
L3: push cx ;цикл вывода полной строки символов
;цикл одно поле
mov cx, mh*m ;количество символов в клетке (с учетом коэффициента 2)
rep stosw ;выводим одну строку клетки
xor al, char ;меняем символ 0dbh <-> 0 (для соседней клетки)
;
pop cx ;восстанавливаем счетчик клеток в строке
loop L3 ;на повтор вывода одной полной строки
pop di ;восстанавливаем адрес выводимых символов
add di, 160 ;на адрес следующей строки 80*2
;
pop cx ;восстанавливаем счетчик строк в клетке
loop L2 ;на вывод всех полных строк одного ряда клеток
xor al, char ;меняем символ клетки для следующего ряда клеток
;
pop cx ;восстанавливаем количество строк клеток
loop l1 ;на вывод остальных строк клеток
xor ax, char ;меняем начальный символ для следующего вывода, чтобы доска меняла раскраску
;ожидание
wait: mov bx, [si] ;читаем системный счетчик тиков
and bx, time ;проверяем его, сменились ли младшие 5 бит на 0
jnz wait ;нет - ждем
;контроль выхода ;проверяем выход по ESC
push ax ;сохраним выводимый символ и атрибут (цвет) в стеке
mov ah, 1 ;опрос, есть ли что "от клавиатуры"
int 16h ;сервис клавиатуры
pop ax ;восстановим символ и цвет
jz start ;нажатия не было - на новый вывод
push ax ;опять сохраним, т.к. было нажатие
xor ax, ax ;считываем код клавиши
int 16h
cmp ah, 1 ;ah = скан-код, равно ESC?
pop ax ;восстановим символ и цвет
jnz start ;нет - на повтор вывода
ret ;равно - выходим, фактически переходим на смещенио 0,
; там находится команда int 20h, которая и завершает программу
end begin ;конец программы с указанием начальной точки программы
[/code]