
Сообщение от
krt17
недавно столкнулся с необходимостью лока, это когда процедура запрещает повторный вызов самой себя или работу с областью памяти.
Для однократного вызова процедуры можно глушить ретурном.
Код:
proc_ push af
ld a,#C9 ; 'ret'
ld (proc_),a
pop af ; 7 байтов с push , 5 без них
...
Код:
proc_ ld hl,proc_ ; или если например hl не жалко
ld (hl),#C9
...
или можно встроить семафор в тело программы
Код:
proc_ ld a,1
or a
ret z ; jr z, exit
xor a
ld (proc_+1),a
...
- - - Добавлено - - -
Ещё пришло на ум . Если однократных вызовов надо много, то можно сделать процедуру залочивания.
Код:
; процедура лока
locker_ ex (sp),hl ; после первого применения поставит заглушку 'ret'
push hl ; по вызывавшему адресу
dec hl
dec hl
dec hl
ld (hl),#C9
pop hl
ex (sp),hl
ret
; применение
proc_ call locker_ ; 3 байта на вызов
...