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