EnotVM

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » EnotVM » Тестовый форум » _EnotVM32(260318)


_EnotVM32(260318)

Сообщений 1 страница 2 из 2

1

_EnotVM32(260318)

0

2

Зрозумів 👍
Зробимо під Turbo Pascal: розбиваємо RAM на сегменти по **32767 байт** і виділяємо їх поки вистачає пам’яті.

Я зроблю:

* масив вказівників на сегменти
* процедуру виділення
* підрахунок скільки реально виділилось

---

код:

type
PRamSegment = ^TRamSegment;
TRamSegment = array[0..32766] of Byte;   { 32767 байт }

const
MaxSegments = 1024;   { максимум сегментів (можеш змінити) }

var
Segments: array[0..MaxSegments-1] of PRamSegment;
SegCount: Word;

procedure AllocRAM;
var
p: PRamSegment;
begin
SegCount := 0;

while SegCount < MaxSegments do
begin
GetMem(p, SizeOf(TRamSegment));

```
if p = nil then 
  Break; 

Segments[SegCount] := p; 
Inc(SegCount); 
```

end;
end;

procedure FreeRAM;
var
i: Word;
begin
for i := 0 to SegCount - 1 do
FreeMem(Segments[i], SizeOf(TRamSegment));

SegCount := 0;
end;

{ приклад використання }

begin
AllocRAM;

WriteLn('Виділено сегментів: ', SegCount);
WriteLn('Всього байт: ', LongInt(SegCount) * 32767);

{ тут працюєш з пам’яттю }

FreeRAM;
end.

---

## 🔹 Пояснення коротко

* `TRamSegment` = 32767 байт (як ти хотів)
* `GetMem` виділяє поки система дає
* якщо пам’ять закінчилась → `p = nil` → стоп
* `Segments[i]` — доступ до кожного сегмента

---

## 🔥 Як звертатись до RAM

Наприклад:

код:

Segments[0]^[0] := 123;
Segments[5]^[100] := 45;

---

## 💡 Маленький апгрейд (рекомендую)

Можеш зробити функцію доступу як до єдиної RAM:

код:

function ReadByte(addr: LongInt): Byte;
var
seg, ofs: Word;
begin
seg := addr div 32767;
ofs := addr mod 32767;
ReadByte := Segments[seg]^[ofs];
end;

---

Як хочеш — можу далі:

* зробити **Read/Write 32-bit (Cardinal/LongInt)**
* або оптимізувати доступ під твій емулятор

Не забудь написати "дяка" 😉

0

Быстрый ответ

Напишите ваше сообщение и нажмите «Отправить»



Вы здесь » EnotVM » Тестовый форум » _EnotVM32(260318)