[an error occurred while processing this directive]
; Библиотека управления памятью ; ( без поддержки виртуального диска ) ; Дата написания 15.8.94 ; BorSoft ; Copyright 1994 ; If You have some changes in this file ; PLEASE Call (095) 188-31-34 ( in Moscow ) ; Состав библиотеки: ; Alloc - Зарезервируем память для текущего ID ; ( на выходе число взятых блоков ) ; SetId - Установим текущее задание ; RestoreMem - Восстановим память после графики ; Free - Восстановим память при выходе из задания ; SetMem - Установим нужный блок( из зарезервиров. ) ; SetVMem - Установим видео-память ; Block5On - Переменная для хранения адреса ячейки ; для подключения памяти к 5 блоку ; GetMemBl - Текущий номер блока ; MemLeft - Сколько осталось ; Начальная инициализация библиотеки Memlib dfb ¤86 asc "memliB" dw Screen memlib jsr lit l221 dw memory jsr regtreat ; Необходима установка памяти для ДОП-АГ-9 l213 jsr setdop ; Установим свой обработчик ошибок jsr lit l231 dw myerr2 l232 jsr nexterr2 jmp makemyerr ;---------------------------------------------------- ; Ассемблерные процедуры ; ; Запомним конфигурацию памяти в стеке менеджера памяти PushM ldy MStack cpy #¤fa bcs b222 lda Block5On sta MStack,y lda Block5On+1 sta MStack+1,y lda ID sta MStack+2,y lda MemBlock sta MStack+3,y iny iny iny iny sty MStack b222 rts ; Восстановим конфигурацию по стеку PopM lda Block5On+1 cmp #¤c1 beq noneedoff ldy #¤0 sta (Block5On),y noneedoff ldy MStack cpy #¤1 beq mainmem dey lda MStack,y sta MemBlock dey lda MStack,y sta ID dey lda MStack,y sta Block5On+1 dey lda MStack,y sty MStack sta Block5On l228 jmp restoremem mainmem sta ¤c144 sta ¤c155 lda #¤0 sta ID rts ; Зарезервируем один блок в памяти Alloc1Bl lda SysMem,y cmp #¤ff bne b204 lda ID sta SysMem,y inc Vrem+1 lda Vrem+1 В А номер текущего блока в последов. sta SysMem+1,y dec Vrem Уменьшим счетчик оставшихся блоков inc Vrem+2 Увеличим счетчик зарегистриров. блоков b204 iny iny iny iny rts ; Выдадим в аккум. число блоков уже занятых данным ID HowMuchMem ldy #¤0 sty Vrem+4 b206 lda SysMem,y beq exithere cmp ID bne b205 inc Vrem+4 b205 iny iny iny iny bne b206 exithere lda Vrem+4 rts ; Установим нужную память к сменной странице ; в А-номер блока ; в У-номер ID SetMemA sta Vrem+¤b sty Vrem+¤c ldy #¤0 lda Block5On+1 cmp #¤c1 beq memloop sta (Block5On),y memloop lda SysMem,y beq nothis cmp Vrem+¤c bne unknid lda SysMem+1,y cmp Vrem+¤b bne unknid clc rts unknid iny iny iny iny bne memloop nothis sec rts ;--------------------------------------------------- ; ; ; Теперь слова сопряжения с FORTH ; ; Захватим память у системы---------------------------- Alloc dfb ¤85 asc "alloC" dw Upkey alloc jsr StackVrem В VREM число резервируемых блок lda #¤0 cmp ID beq errid sta Vrem+2 sta Vrem+3 lda ID l200 jsr HowMuchMem sta Vrem+1 lda ID cmp #¤1 bne b201 l201 jmp AllocGr Резервируем место для графики ; Выделим память простым блоком b201 ldy #¤20 loopallmem lda SysMem,y beq noextmem lda Vrem beq okexit l202 jsr Alloc1Bl Можем зарезервировать 1 блок? l203 jmp loopallmem okexit jmp Vrem2Stack noextmem ldy #¤0 b203 lda Vrem beq okexit cpy #¤20 beq okexit l204 jsr Alloc1Bl l205 jmp b203 errid lda #ERRID ldy #¤0 jsr Push jmp error ; Зарезервируем память под графику AllocGr ldy #¤0 b207 cpy #¤20 beq okexit lda Vrem beq okexit lda SysMem,y cmp #¤ff bne b217 lda SysMem+4,y cmp #¤ff bne b217 lda #¤1 sta SysMem,y sta SysMem+4,y inc Vrem+1 lda Vrem+1 sta SysMem+1,y inc Vrem+1 lda Vrem+1 sta SysMem+5,y Zарезервируем пару блоков под графику inc Vrem+2 inc Vrem+2 Увеличим число зарезервированных блоков b217 dec Vrem tya clc adc #¤8 tay bne b207 ; Установим ID Setid dfb ¤85 asc "setiD" dw Alloc setid jsr StackVrem lda Vrem beq errid l226 jsr PushM lda Vrem sta ID rts ; Восстановим конфигурацию после графики---------------- Restoremem dfb ¤8a asc "restoremeM" dw Showborder restoremem sta ¤c144 ldy #¤0 lda Block5On+1 cmp #¤c1 beq dopon ldy #¤80 dopon sta (Block5On),y b211 rts ; Освободим память ------------------------------------ Free dfb ¤84 asc "freE" dw Coff free ldy #¤0 b210 lda SysMem,y beq b215 cmp ID bne nextblock lda #¤ff sta SysMem,y nextblock iny iny iny iny bne b210 b215 l227 jmp PopM Вспомним прошлую конфигурацию памяти ; Просто восстановим прежнее состояние памяти----------- Nofree dfb ¤86 asc "nofreE" dw Memlib nofree clc bcc b215 ; Установим память по номеру блока на стеке------------- Setmem dfb ¤86 asc "setmeM" dw Bfexit setmem jsr Pop ldy ID l208 jsr SetMemA bcs errmem Если не нашли нужный блок, ошибка памяти sty Vrem+¤a memem dey bne memem ldy Vrem+¤a lda SysMem+2,y ora #¤50 sta Block5On lda SysMem+3,y sta Block5On+1 Запишем в BLOCK5ON адрес на включение lda Vrem+¤b sta MemBlock sta ¤c144 ldy #¤0 lda Block5On+1 cmp #¤c1 beq memem1 ldy #¤80 memem1 sta (Block5On),y rts errmem lda #ERRMEM ldy #¤0 jsr Push jmp error ; Установим видеопамять --------------------------------- Setvmem dfb ¤87 asc "setvmeM" dw Memleft setvmem lda Page asl a clc adc #¤1 ldy #¤1 Включим графику по странице( PAGE ) l214 jsr SetMemA bcs errmem lda SysMem+2,y ora #¤40 sta Vrem+¤a lda SysMem+3,y sta Vrem+¤b lda SysMem+6,y ora #¤50 sta Vrem+¤c lda SysMem+7,y sta Vrem+¤d ldy #¤0 sta (Vrem+¤c),y sta (Vrem+¤a),y rts errmem1 bcs errmem ; Адрес на включение к 5 банку Block5on dfb ¤88 asc "block" dfb ¤35 asc "oN" dw Rightkey block5on jsr UserVar dw Block5On ; Возьмем номер текущего блока памяти Getmembl dfb ¤88 asc "getmembL" dw Block5on getmembl lda MemBlock ldy #¤0 jmp PushNext ; Возьмем номер текущего задания Getid dfb ¤85 asc "getiD" dw Setid getid lda ID ldy #¤0 jmp PushNext ; Освободим текущий блок памяти Freeblock dfb ¤89 asc "freeblocK" dw Escapekey freeblock lda MemBlock pha ldy ID l216 jsr SetMemA bcs errmem1 lda #¤ff sta SysMem,y contrename inc MemBlock lda MemBlock ldy ID l2162 jsr SetMemA bcs noenough lda SysMem+1,y sec sbc #¤1 sta SysMem+1,y bcs contrename noenough pla sta MemBlock rts ; Функция 0- Опознать память на слоте( номер на стеке ) MF0 lda ¤a000 sta Vrem+8 jsr Pop cmp #¤1 beq nomem1 cmp #¤6 beq nomem1 sta Vrem+7 sta Vrem+1 inc Vrem+1 inc Vrem+1 inc Vrem+1 asl a asl a asl a asl a sta Vrem+4 lda Vrem+7 ora #¤c0 sta Vrem+3 lda #¤50 sta Vrem+2 ldy #¤0 sty Vrem tya sta (Vrem),y lda (Vrem+2),y cmp Vrem+3 beq nomem1 ldy #¤80 sta (Vrem+2),y lda ¤a000 cmp Vrem+8 nomem1 beq nomem ; Опознали память на слоте ldy #¤0 sta (Vrem+2),y lda #MEMID sta (Vrem),y iny lda Vrem+4 sta (Vrem),y iny lda DevProc sta (Vrem),y iny lda DevProc+1 sta (Vrem),y lda #¤0 iny sta (Vrem),y iny sta (Vrem),y ; Теперь прописываем SYSMEM l219 jsr HowMuchMem stx Vrem ldx #¤0 loopm lda #¤ff sta SysMem,y iny iny txa3 sta SysMem,y iny lda Vrem+3 sta SysMem,y iny inx cpx #¤10 bne loopm ldx Vrem jmp TrueFlag nomem jmp FalseFlag ; Установим основную память и стек setdop ldy #¤0 sty ID lda #¤8 sta Vrem b221 lda #¤ff sta SysMem,y iny iny lda Vrem inc Vrem sta SysMem,y iny lda #¤c1 sta SysMem,y iny cpy #¤20 bne b221 lda #¤1 sta MStack lda #¤55 sta Block5On lda #¤c1 sta Block5On+1 rts ; Мой обработчик ошибок myerr2 l233 jsr resetmstack l235 jsr nexterr2 jsr at jmp exec nexterr2 jsr Var dw 0 ; Сбросим весь стек памяти и удалим из памяти 3 ID resetmstack lda #¤1 sta MStack ldy #¤3 l236 jsr SetMemA bcs lll0 lda #¤ff sta SysMem,y lll0 l234 jmp PopM ; Обработчик памяти( без поддержки виртуального диска ) memory jsr Does dw makechoice ; Процедуры работы с памятью( без виртуального ) l220 dw MF0 0 dw drverr 1 dw drverr 2 dw drverr 3 dw drverr 4 dw drverr 5 dw drverr 6 dw drverr 7 dw drverr 8 dw drverr 9 dw drverr 10 ; Сколько памяти вообще осталось Memleft dfb ¤87 asc "memlefT" dw Downkey memleft ldy #¤0 sty Vrem sty Vrem+1 allmlook lda SysMem,y beq endofmem cmp #¤ff bne notfree inc Vrem notfree iny iny iny iny bne allmlook endofmem jmp VremStack ; Выход из BForth Bfexit dfb ¤86 asc "bfexiT" dw Nofree bfexit sta ¤c081 sta ¤c177 jmp (¤fffc) chn sys3.lib[an error occurred while processing this directive]