First commit
This commit is contained in:
commit
7d6d50e432
50 changed files with 5737 additions and 0 deletions
191
MEMMANAG.ASM
Normal file
191
MEMMANAG.ASM
Normal file
|
@ -0,0 +1,191 @@
|
|||
;Memory management module
|
||||
|
||||
StartSector equ 2000h
|
||||
|
||||
;------------------------------------------------------------------------------
|
||||
|
||||
MemInit:
|
||||
push ax
|
||||
push cx
|
||||
push si
|
||||
xor ax,ax
|
||||
mov cx,MaxKBytes
|
||||
xor si,si
|
||||
MemInit_1:
|
||||
mov byte ptr cs:[MemoryTable+si],al
|
||||
inc si
|
||||
loop MemInit_1
|
||||
pop si
|
||||
pop cx
|
||||
pop ax
|
||||
|
||||
ret
|
||||
|
||||
;------------------------------------------------------------------------------
|
||||
|
||||
MemAlloc:
|
||||
;input DX=# di kbytes che servono
|
||||
;output ES=segmento a partire dal quale la memoria Š disponibile.
|
||||
|
||||
test dx,dx ;Non si possono allocare 0 Kbyes!
|
||||
jz MemAlloc_End
|
||||
|
||||
push si
|
||||
push cx
|
||||
push ax
|
||||
|
||||
call GetFreeMem ;Guarda se i Kbytes richiesti sono disponibili
|
||||
cmp cx,dx
|
||||
jb MemAlloc_NotFound2
|
||||
|
||||
xor si,si
|
||||
push dx
|
||||
|
||||
MemAlloc_1:
|
||||
;Cerca un Kbytes libero nella "MemoryTable"
|
||||
mov al,cs:[MemoryTable+si]
|
||||
test al,al
|
||||
jnz MemAlloc_GoOn
|
||||
dec dx
|
||||
jz MemAlloc_Found
|
||||
inc si
|
||||
cmp si,MaxKbytes
|
||||
jne MemAlloc_1
|
||||
jmp MemAlloc_NotFound
|
||||
|
||||
MemAlloc_GoOn:
|
||||
pop dx
|
||||
push dx
|
||||
inc si
|
||||
cmp si,MaxKbytes
|
||||
jb MemAlloc_1
|
||||
|
||||
MemAlloc_NotFound:
|
||||
pop dx
|
||||
MemAlloc_NotFound2:
|
||||
mov ax,0a000h
|
||||
mov es,ax
|
||||
|
||||
pop ax
|
||||
pop cx
|
||||
pop si
|
||||
|
||||
ret
|
||||
|
||||
MemAlloc_Found:
|
||||
pop dx
|
||||
sub si,dx ;Si riporta al primo valore libero
|
||||
inc si
|
||||
|
||||
push si
|
||||
|
||||
mov al,1
|
||||
MemAlloc_2:
|
||||
mov byte ptr cs:[MemoryTable+si],al
|
||||
inc si
|
||||
dec dx
|
||||
jnz MemAlloc_2
|
||||
|
||||
pop si
|
||||
|
||||
mov cl,6 ;Converte il valore ottenuto in un segmento
|
||||
shl si,cl
|
||||
add si,StartSector
|
||||
mov es,si
|
||||
|
||||
pop ax
|
||||
pop cx
|
||||
pop si
|
||||
|
||||
MemAlloc_End:
|
||||
|
||||
ret
|
||||
|
||||
;------------------------------------------------------------------------------
|
||||
|
||||
|
||||
MemFree:
|
||||
;input DX=# di kbytes da liberare
|
||||
; ES=segmento a partire dal quale la memoria deve essere liberata
|
||||
; (deve essere multiplo di 40h)
|
||||
|
||||
|
||||
;Ora la procedura funziona correttamente...
|
||||
|
||||
test dx,dx
|
||||
jz MemFree_End2
|
||||
|
||||
push ax
|
||||
push cx
|
||||
push dx
|
||||
push si
|
||||
|
||||
mov si,es
|
||||
sub si,StartSector
|
||||
mov cl,6
|
||||
shr si,cl
|
||||
|
||||
|
||||
mov al,0
|
||||
MemFree_1:
|
||||
mov byte ptr cs:[MemoryTable+si],al
|
||||
inc si
|
||||
dec dx
|
||||
jnz MemFree_1
|
||||
|
||||
MemFree_End:
|
||||
pop si
|
||||
pop dx
|
||||
pop cx
|
||||
pop ax
|
||||
|
||||
MemFree_End2:
|
||||
ret
|
||||
|
||||
;------------------------------------------------------------------------------
|
||||
|
||||
GetFreeMem:
|
||||
;input: no input
|
||||
;output: CX=numero massimo di Kbytes contigui liberi che ha trovato
|
||||
|
||||
push ax
|
||||
push dx
|
||||
push si
|
||||
|
||||
xor si,si
|
||||
xor cx,cx
|
||||
xor dx,dx
|
||||
|
||||
GetFreeMem_Again1:
|
||||
mov al,byte ptr cs:[MemoryTable+si]
|
||||
test al,al
|
||||
jnz GetFreeMem_NotFree
|
||||
inc cx
|
||||
|
||||
GetFreeMem_Again2:
|
||||
inc si
|
||||
cmp si,MaxKBytes
|
||||
jb GetFreeMem_Again1
|
||||
|
||||
cmp cx,dx
|
||||
ja GetFreeMem_Fine2
|
||||
|
||||
GetFreeMem_Fine:
|
||||
mov cx,dx
|
||||
GetFreeMem_Fine2:
|
||||
pop si
|
||||
pop dx
|
||||
pop ax
|
||||
|
||||
ret
|
||||
|
||||
GetFreeMem_NotFree:
|
||||
cmp cx,dx
|
||||
jbe GetFreeMem_NotFree2
|
||||
mov dx,cx
|
||||
|
||||
GetFreeMem_NotFree2:
|
||||
xor cx,cx
|
||||
jmp GetFreeMem_Again2
|
||||
|
||||
;------------------------------------------------------------------------------
|
Loading…
Add table
Add a link
Reference in a new issue