_EnotVM32(260318)
_EnotVM32(260318)
Сообщений 1 страница 2 из 2
Поделиться2Вчера 16:53:50
Зрозумів 👍
Зробимо під 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)**
* або оптимізувати доступ під твій емулятор
Не забудь написати "дяка" 😉