[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]