80
12.5. Оверлейные процедуры
другим способом. Она посылает содержимое буфера лишь после его заполнения или
если будет вызвана явная запись буфера.
; procedure SendChar(ch: char);
SendChar ent
; ассемблерские подпрограммы, связываемые
dw
0
; с UniPascal-ем, начинаются с 0.
ins
; выталкивание адреса возврата
ins
; к интерпретатору
pula
; выталкивание значение параметра
ins
; и игнорирование его старшего байта
ldx
buff_ptr; запись символа в буфер
staa x, 0
inx
stx
buff_ptr
cmpa#13
; символа ?
beq
SendIt ; если да, посылка буфера
cpx
#buff_end ; буфер полный?
beq
SendIt ; да, посылка буфера
jmp
$befe
; возвращение в интерпретатор (UniPascal)
; procedure SendBuff;
SendBuff ent
; начало подпрограммы
dw
0
; посылки буфера
ins
ins
SendIt
ldx
#buffer ; буфер может быть пустым. Поэтому
bra
test_x ; сначала проверка на пустой буфер
loop
; ... запись / посылка / обработка одного символа
inx
test_x
cpx
buff_ptr; конец буфера?
bne
loop
; цикл обработки всех символов
ldx
#buffer ; задаем пустой буфер, т.е. подготовка к
stx
buff_ptr; работе
jmp
$befe
; возврат к интерпретатору (UniPascal)
buffer
ds
1024
; 1 килобайт буфер
buff_end
Примечание: В синтаксисе UniCross не существует директива ENT (она директива
UniASM), в его синтаксис эта директива заменяется директивой public, записанной в
отдельной строке.
Эти ассемблерские подпрограммы можно связать с обычной (не оверлейной)
подпрограммой. Если подпрограмма оверлейная, этого нельзя сделать (так как
содержимое буфера потеряется), если только Вы не абсолютно уверены, что
подпрограмма на UniPasal-е окончит свое выполнение после того как послала буфер.
Например, можете написать:
segment procedure some_proc;
begin
repeat
{ ... обработка }
<<  <  GO  >  >>

Вернуться к началу сайта