> Че-то мне кажеться что сделали от балды, ибо 4000h < > 640Kb => память для программ нужно было-бы выделить
Мне тоже кажется, что это просто буффер...
Хотел вот добавить ...
Мне кажется, хотя я могу быть неправ, что это просто буфер для построения изображения и вывода на экран. Я как-то рисовал подобные штуки - ниже пример рисования как раз в режиме 13h. Я в качестве буффера использовал память своего com-а.
Почему 4000h ? Просто этот сегмент обычно не занят ничем, и располагается где-то между загруженным com-файлом (программой) и 640K.
К тому же для такого рода вещей обычно нужны случайные числа (чем-то заполненный буфер). Я вот заполняю его нулями вначале, а потом населяю довольно произвольными значениями. В твоем примере начальное заполнение буффера, видимо, обеспечивается “мусором” в этом самом сегменте (4000h), оставшимся от прежних программ.
> вот фрагмент: ;…
Fx1:
> Matrix: > inc si ; используем произвольные значения в буффере.
mov al,byte ptr [si-322]
;…
sub bx,ax
; Изменяем буффер для следующего кадра.
> mov ds:[di],bl > inc di > loop Fx1 > > и тд..
; Программа имитации пламени. Написал Chingachguk ;)
.286
text segment byte public
assume cs:text,ds:text
org 100h
begin: MOV AL,13H
INT 10H
@AGAIN: CLD
MOV CX,320*200
PUSH CX
MOV DI,OFFSET BUFFER
XOR AL,AL
REP STOSB
POP CX
PUSH 0A000H
POP ES
XOR DI,DI
@PAINT: MOV AX,DI
XOR DX,DX
MOV SI,320
DIV SI
MOV BX,AX ; BX=X
MOV SI,DX ; SI=Y
SUB BX,160
SUB SI,100
PUSH CX
MOV CX,123 ; CX=123, BX=MOD(X-160), BP=MOD(Y-100)
@FIND: LEA BP,[BX+SI]
CMP BP,320*200
JAE @N_BOUND
OR BUFFER[BX+SI],CL
JZ @DONE
@N_BOUND: MOV AX,BX
SHR AX,2
ADD BX,AX
MOV AX,SI
SHR AX,2
ADD SI,AX
LOOP @FIND
@DONE: MOV AL,CL
ADD AL,150
POP CX
MOV BUFFER[DI],AL
INC DI
;STOSB
PUSH CX
PUSH DI
XOR DX,DX
MOV AX,DI
MOV SI,320
DIV SI
MUL SI
MOV DI,AX
CMP DI,320*40
JB @N
LEA SI,BUFFER[DI-320*40]
MOV CX,320*40/2
MOV DI,320*160
REP MOVSW
@N: POP DI
POP CX
MOV AH,1
INT 16H
JNZ @ASK
LOOP @PAINT
@ASK: XOR AH,AH
INT 16H
@EXIT: MOV AX,0003H
INT 10H
ret
BUFFER DB 320*200 DUP(?)
text ends
end begin
|