;г=========================================================================ї
; і Объектный файл для UltraLogik 16
; і Сохраняемые переменные
; і (вариант 1)
; L=========================================================================
; Объединить несколько сегментов в группу,
; адресуемую с помощью одного сегментного регистра: Group
DGROUP group VARLIST,DATA,STORED
; ===========================================================================
; Указание на сегмент: Externs
extrn RESTORE_STATUS:far ; переменная - статус работы программы RESTORE
extrn SAVE_STATUS:far ; переменная - статус работы программы SAVE
extrn STORED_VAR:far ; переменная - контроль перекомпиляции проекта
extrn STOREDMEM:far ; Начало сегмента сохраняемых переменных
extrn STOREDEND:far ; Окончание сегмента сохраняемых переменных
; ===========================================================================
; Сегмент :code
SYSTEM segment byte public 'CODE' use16
assume ds:DGROUP, cs:SYSTEM
Seg_DGROUP dw seg DGROUP
; Функция восстановления сохряняемых переменных
public RESTOREMEM
RESTOREMEM proc near
push ax ; сохранить предыдущий ax в стек
push es ; сохранить предыдущий es в стек
push si ; сохранить предыдущий si в стек
push ds ; сохранить предыдущий ds в стек
push dx ; сохранить предыдущий dx в стек
push bx ; сохранить предыдущий bx в стек
mov ax, 3000h ; в ах адресс начала области с питанием от батарейки
mov es, ax ; в es адресс из ах "начало области с питанием от батарейки"
mov ds, word ptr cs:Seg_DGROUP ; устанавливаем ds:DGROUP
mov ax, word ptr ds:STORED_VAR ; получаем значение переменной STORED типа integer (глобальная) в которой
; "значение по умолчанию" сравнивается с данными по адресу 30000-30001
xor si, si ; обнуление регистра si
cmp ax, word ptr es:[si] ; сравниваем ax с (STORED из памяти под батарейкой)
je Metka_0 ; если равны, то переход на Metka_0
; иначе
jmp Exit ; безусловный переход: выход из подпрограммы
Metka_0:
mov ax, offset STOREDEND ; адресс конца блока (сегмента) сохраняемых перен. в регистр ax
sub ax, offset STOREDMEM ; вычитаем из ах адресс начала блока (сегмента)
; сохраняемых перен. и получаем в ах количество
; байт (размер) области сохраняемых перен.
mov dx, ax ; записываем в dx полученный в ах результат вычислений
cmp dx, 3E8h ; сравниваем dx с (1000)
jle Metka_1 ; если dx меньше или равнен (1000), то переход на Metka_1
mov dx, 3E8h ; если dx больше (1000), то dx ограничиваем до (1000)
Metka_1:
jmp Metka_3 ; безусловный переход:
Metka_2:
mov al, byte ptr es:[si+2] ; один байт в al, из области с питанием от батарейки
mov bx, offset STOREDMEM ; в bx - адресс начала блока (сегмента) сохраняемых перенных
add bx, si ; сложение bx и si, в bx следующий адресс блока (сегмента)
; сохраняемых перенных, для записи бита из области STORED
mov byte ptr ds:[bx], al ; запись бита в ячейку блока (сегмента) сохраняемых перенных
inc si ; инкремент: увеличивает приемник (регистр) на 1
; (перевод на следующий бит)
Metka_3:
cmp si, dx ; сравниваем si с dx
jl Metka_2 ; если si меньше dx, то переход на метку Metka_2
Exit:
mov byte ptr ds:SAVE_STATUS, 0 ; останавливаем программу SAVE
mov byte ptr ds:RESTORE_STATUS, 0 ; останавливаем программу RESTORE
pop bx ; восстановить bx основной программы
pop dx ; восстановить dx основной программы
pop ds ; восстановить ds основной программы
pop si ; восстановить si основной программы
pop es ; восстановить es основной программы
pop ax ; восстановить ax основной программы
call SAVEMEM ; вызов программы сохранения в область под батарейкой
retn ; вернуться в основную программу
RESTOREMEM endp
; ---------------------------------------------------------------------------
public SAVEMEM
SAVEMEM proc near
push ax ; сохранить предыдущий ax в стек
push ds ; сохранить предыдущий ds в стек
push di ; сохранить предыдущий di в стек
push es ; сохранить предыдущий es в стек
push cx ; сохранить предыдущий cx в стек
push bx ; сохранить предыдущий bx в стек
mov ax, 3000h ; в ах адресс начала области с питанием от батарейки
mov es, ax ; в es адресс из ах "начало области с питанием от батарейки"
mov ds, word ptr cs:Seg_DGROUP ; устанавливаем ds:DGROUP
mov ax, word ptr ds:STORED_VAR ; получаем значение переменной STORED типа integer (глобальная)
xor di, di ; обнуление регистра di
mov word ptr es:[di], ax ; записываем в область под батарейкой значение STORED_VAR
mov ax, offset STOREDEND ; адресс конца блока (сегмента) сохраняемых перен. в регистр ax
sub ax, offset STOREDMEM ; вычитаем из ах адресс начала блока (сегмента)
; сохраняемых перен. и получаем в ах количество
; байт (размер) области сохраняемых перен.
mov cx, ax ; записываем в cx полученный в ах результат вычислений
cmp cx, 3E8h ; сравниваем cx с (1000)
jle Metka_4 ; если cx меньше или равнен (1000), то переход на Metka_4
mov cx, 3E8h ; если cx больше (1000), то cx ограничиваем до (1000)
Metka_4:
jmp Metka_6 ; безусловный переход: short (короткий переход) если
Metka_5:
mov bx, offset STOREDMEM ; в bx - адресс начала блока (сегмента) сохраняемых перенных
add bx, di ; получаем адресс бита в сегменте сохр. переменных
mov dl, byte ptr ds:[bx] ; значение бита из сегмента сохр. перем. в dl
mov byte ptr es:[di+2], dl ; в es+смещение (адрес в области с питанием от
; батарейки) записываем бит из сегмента сохр. перем.
inc di ; инкремент: увеличивает приемник (регистр) на 1
; (перевод на следующий бит)
Metka_6:
cmp di, cx ; сравниваем di с cx для условного перехода jl
jl Metka_5 ; если di меньше cx, то переход на Metka_5
pop bx ; восстановить bx основной программы
pop cx ; восстановить cx основной программы
pop es ; восстановить es основной программы
pop di ; восстановить di основной программы
pop ds ; восстановить ds основной программы
pop ax ; восстановить ax основной программы
retn ; вернуться в основную программу
SAVEMEM endp
SYSTEM ends
; ===========================================================================
VARLIST segment byte public 'DATA' use16
assume ds:DGROUP
VARLIST ends
; ===========================================================================
DATA segment byte public 'DATA' use16
assume ds:DGROUP
DATA ends
; ===========================================================================
STORED segment byte public 'DATA' use16
assume ds:DGROUP
STORED ends
end