Meer geheugen voor Turbo Pascal

Pagina: 1
Acties:

  • TheLunatic
  • Registratie: April 2001
  • Laatst online: 09-07 16:41

TheLunatic

Ouwe boxen.

Topicstarter
Ik kan in Turbo Pascal niet eens een array creeeren van 2000 strings met 45 tekens. Ook als ik de instellingen zo hoog mogelijk zet gaat het niet... is er een andere omweg zodat dit wel kan?

Mother, will they like this song?


  • Wierdo_NL
  • Registratie: Mei 2000
  • Laatst online: 07-09 21:40
Misschien met pointers werken ofzo ?
Of met een temp-bestand werken ?

Ik weet het niet meer, is al 3 jaar terug..
C++ is misschien wel wat beter met zulke dingen..

There is a fine line between hobby and mentaldisorder


  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Met pointers zou je dit kunnen verhelpen

"The shell stopped unexpectedly and Explorer.exe was restarted."


  • Primal
  • Registratie: Augustus 2001
  • Laatst online: 11-09 14:32
Op maandag 10 september 2001 16:01 schreef TheLunatic het volgende:
Ik kan in Turbo Pascal niet eens een array creeeren van 2000 strings met 45 tekens. Ook als ik de instellingen zo hoog mogelijk zet gaat het niet... is er een andere omweg zodat dit wel kan?
Als ik het goed begrijp wil je dus in totaal statische geheugenruimte alloceren voor 2000 * (maal dus) 45 characters. Dit komt dan op 90.000 bytes. Dit kan dus niet statisch, aangezien Turbo Pascal werkt met een maximale datasegment voor een programma van 64k (ofwel +/- 64.000 bytes). Eigenlijk zeg ik het verkeerd. Dit is dus een tekortkoming van DOS (ga ervan uit dat je onder DOS werkt). De enige oplossing voor jou is het geheugen dynamisch te alloceren. Dan moet je gaan werken met far- pointers. Je moet dit ook aangeven bij je project-settings, anders kun je nog geen far-pointers gebruiken. Een far-pointer is een pointer die wijst naar geheugenruimte buiten je eigen 64k datasegment. Een near-pointer is een pointer die wijst naar geheugenruimte binnen je eigen 64k datasegment. Een pointer moet je dan ook als 'far pointer' declareren voor zover ik het nog weet.

Ik hoop dat je begrijpt wat pointers zijn, anders krijg je het niet voor elkaar!


P.s.: Voor mij is het inderdaad ook al een jaar of 4 geleden dat ik voor het laatst iets in Pascal had gedaan, dus als ik iets verkeerd zeg dan kan dat. Maar zover ik het nog weet is het zo zoals ik zeg dat het is. 8-)

"The fastest code, is the code that is never called."


  • BdR
  • Registratie: Juni 2001
  • Laatst online: 13-09 23:03

BdR

TV is gooder then books

ik heb ook een probleempje met Turbo Pascal. Ik ben al een tijdje bezig met het schrijven van een arcade schiet spelletje. Het ontwikkelen ging allemaal aardig, ik heb nu een virtueel scherm (screen flipping enzo), sprites, soundblaster geluid, ALLES!

Maar nu loop ik tegen een "heap overflow error" probleem aan. Tijdens het inlezen van de 20kb aan graphics, mijn GRAPHICS.DAT is dus een ongecomprimeerd bestand dat rechtstreeks wordt ingelezen. Er wordt ook 40kb aan geluid (ook ongecomprimeerd) ingelezen. 60kb in totaal dus, en de .EXE is 30kb.. dat is bij elkaar toch niet zo heel veel dacht ik :{

Waarom kan dit dan toch niet ingelezen worden!? Heeft emand een idee want ik baal als een stekker, kheb er best veel tijd in gestoken, en om nu op zoiets stoms vast te lopen..

ik ga nu nog wel even die "far pointers" proberen (ik maak nu gebruik van "gewone" pointers dus zonder "far"), wie weet helpt dat wat, maar ik vrees van niet

mijn web games -> Impossible Snake 2 :: Impossible Snake :: Snake Slider


  • JayTaph
  • Registratie: Oktober 1999
  • Laatst online: 28-11-2025

JayTaph

Portability is for canoes.

Er zijn genoeg XMS/EMS libraries te vinden voor turbo pascal. Maar er is een ander truukje:

je kunt je systeem in een speciale mode zetten: unreal mode. Dit is een soort van real-mode, maar zonder beperkingen van 64k segmenten. Niet helemaal netjes, maar helpt je wel zonder al te veel om te gooien geloof ik.

Yo dawg, I heard you like posts so I posted below your post so you can post again.


  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 14-09 17:42

Gerco

Professional Newbie

Op donderdag 08 november 2001 23:44 schreef JayTaph het volgende:
unreal mode. Dit is een soort van real-mode, maar zonder beperkingen van 64k segmenten.
Unreal mode is de mode waar een persoon in staat als hij Unreal (Tournament) aan het spelen is. Wat jij bedoelt heet protected mode :)

(Maar dat wist je al, de topicstarter misschien niet).

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


  • Knutselsmurf
  • Registratie: December 2000
  • Laatst online: 23:11

Knutselsmurf

LED's make things better

Op donderdag 08 november 2001 22:55 schreef BdR het volgende:
ik heb ook een probleempje met Turbo Pascal. Ik ben al een tijdje bezig met het schrijven van een arcade schiet spelletje. Het ontwikkelen ging allemaal aardig, ik heb nu een virtueel scherm (screen flipping enzo), sprites, soundblaster geluid, ALLES!

Maar nu loop ik tegen een "heap overflow error" probleem aan. Tijdens het inlezen van de 20kb aan graphics, mijn GRAPHICS.DAT is dus een ongecomprimeerd bestand dat rechtstreeks wordt ingelezen. Er wordt ook 40kb aan geluid (ook ongecomprimeerd) ingelezen. 60kb in totaal dus, en de .EXE is 30kb.. dat is bij elkaar toch niet zo heel veel dacht ik :{

Waarom kan dit dan toch niet ingelezen worden!? Heeft emand een idee want ik baal als een stekker, kheb er best veel tijd in gestoken, en om nu op zoiets stoms vast te lopen..

ik ga nu nog wel even die "far pointers" proberen (ik maak nu gebruik van "gewone" pointers dus zonder "far"), wie weet helpt dat wat, maar ik vrees van niet
Volgens mij kun je de compilerinstellingen ook nog veranderen. Daarin kun je bijvoorbeeld de stack- en heapsize veranderen. Het is in Pascal geen probleem om al je geheugen (640 K :P ) te gebruiken. Wat al eerder genoemd is , is dat een enkele datastructuur (array bijvoorbeeld) in een enkel datablock van 64 K moet passen. In 1 programma kun je dus gerust 2 array's van ieder 60 K gebruiken.

- This line is intentionally left blank -


Verwijderd

Even praktisch: schakel over op Borland Pascal 7.0, daarmee kun je dus (unreal) protected modus doen. Helaas staat die versie nog niet in het Borland Museum (registratie verplicht :( doch gratis :P )

Verwijderd

Tevens: een standaard string onder Pascal neemt altijd iets van 256 bytes in (geloof ik)

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Op vrijdag 09 november 2001 01:00 schreef Gerco het volgende:

[..]

Unreal mode is de mode waar een persoon in staat als hij Unreal (Tournament) aan het spelen is. Wat jij bedoelt heet protected mode :)

(Maar dat wist je al, de topicstarter misschien niet).
Nee, hij bedoelt real mode zonder de 16-bit adres restrictie.

  • chaozz
  • Registratie: Juni 2000
  • Laatst online: 23-08 22:57
de grootte van de heap kun je instellen in de eerste regel van je programma. in de {$M regel.. zoek maar op in de help.

ook ik ben een spel aan het maken in good old Turbo Pascal 7.0

http://come.to/worldwidewenners

chaozz.nl | RetroGameCouch


  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Op maandag 10 september 2001 16:40 schreef Primal het volgende:

[..]

Als ik het goed begrijp wil je dus in totaal statische geheugenruimte alloceren voor 2000 * (maal dus) 45 characters. Dit komt dan op 90.000 bytes. Dit kan dus niet statisch, aangezien Turbo Pascal werkt met een maximale datasegment voor een programma van 64k (ofwel +/- 64.000 bytes). Eigenlijk zeg ik het verkeerd. Dit is dus een tekortkoming van DOS (ga ervan uit dat je onder DOS werkt). De enige oplossing voor jou is het geheugen dynamisch te alloceren. Dan moet je gaan werken met far- pointers. Je moet dit ook aangeven bij je project-settings, anders kun je nog geen far-pointers gebruiken. Een far-pointer is een pointer die wijst naar geheugenruimte buiten je eigen 64k datasegment. Een near-pointer is een pointer die wijst naar geheugenruimte binnen je eigen 64k datasegment. Een pointer moet je dan ook als 'far pointer' declareren voor zover ik het nog weet.

Ik hoop dat je begrijpt wat pointers zijn, anders krijg je het niet voor elkaar!


P.s.: Voor mij is het inderdaad ook al een jaar of 4 geleden dat ik voor het laatst iets in Pascal had gedaan, dus als ik iets verkeerd zeg dan kan dat. Maar zover ik het nog weet is het zo zoals ik zeg dat het is. 8-)
Ik dacht dat near en far alleen in C++ zat en dat in Pascal een pointer gewoon met ^ werd aangegeven.

  • JayTaph
  • Registratie: Oktober 1999
  • Laatst online: 28-11-2025

JayTaph

Portability is for canoes.

Op vrijdag 09 november 2001 13:03 schreef OlafvdSpek het volgende:

[..]

Nee, hij bedoelt real mode zonder de 16-bit adres restrictie.
Inderdaad.. de "mode" tussen real en protected in dus. Het heeft geen echte benaming, maar veel mensen houden het op unreal (het spel is van veeeeeel later in ieder geval). Het zet de normale 64k-begrensing op de selectoren uit zodat je 4gig vanuit real-mode kunt adresseren (weliswaar met truukjes).

Yo dawg, I heard you like posts so I posted below your post so you can post again.


  • BdR
  • Registratie: Juni 2001
  • Laatst online: 13-09 23:03

BdR

TV is gooder then books

als eerste maar even antwoord geven voor TheLunatic, over die array van 2000 strings van 45 characters. Je moet dan niet met een array van string werken maar met een array van pointers, en die pointers wijzen dan weer naar die strings. Een string opgeslagen met behulp van een pointer kan je aanspreken/manipuleren door een dakje ^ erachter te plaatsen. Zie voorbeeld hieronder.. overigens als je het ECHT correct wil doen moet je volgens mij ook nog typcasten dus ipv StringArray(i)^ eigenlijk LimitedString(StringArray(i)^) doen maar ja, is niet verplicht

De reden voor dit alles is dus dat de inhoud van een array (ongeacht WAT je er in opslaat) niet groter mag worden dan 64kb, en een string van 45 characters is dus 45bytes groot. Dus gaan er max. 64000/45= ong 1422 strings in. Een pointer is 4 bytes groot (probeer maar -> Writeln(SizeOf(pointer)); ) dus kan je 16000 pointers opslaan.. hier een uitgeschreven Turbo Pascal voorbeeld programma:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
Program Test123;

type
  LimitedString = String[45];  { een string van 45 characters }
  TStringPtr = ^LimitedString; { een pointer naar deze LimitedString }

var
  StringArray : Array [1..2000] of TStringPtr; { array bevat pointers }

Procedure FillArray;
{ Vul de array met 2000 pointers naar strings }
var
  i : Word;
  tmpString : LimitedString;
Begin
  For i := 1 to 2000 do
  Begin
    { reserveer geheugen ter grootte van 1 string van 45 characters }
    GetMem(StringArray[i], SizeOf(LimitedString));
    { om het te testen, vul de tmpString met zet 'Test.. <i>'}
    Str(i, tmpString);
    tmpString := 'Test.. ' + tmpString;
    { plaats de string in de array in het gereserveerde geheugen }
    StringArray[i]^ := tmpString;
  End;
End;

Procedure TestArray;
{ Test de array door de 2000 string te tonen }
var
  i : Word;
  tmpString : LimitedString;
Begin
  For i := 1 to 2000 do
  Begin
    tmpString := StringArray[i]^;
    Writeln(tmpString);
  End;
End;

Begin
  Writeln('Vul de array met strings..');
  FillArray;

  Writeln('Test de array door het op beeld te tonen..');
  TestArray;

  Writeln('.. klaar');
End.

mijn web games -> Impossible Snake 2 :: Impossible Snake :: Snake Slider


  • BdR
  • Registratie: Juni 2001
  • Laatst online: 13-09 23:03

BdR

TV is gooder then books

Op vrijdag 09 november 2001 12:32 schreef Doekman het volgende:
Even praktisch: schakel over op Borland Pascal 7.0, daarmee kun je dus (unreal) protected modus doen.
Borland Pascal 7.0 heb ik net gisteren terug gevonden (ik zet em ook wel even op kazaa enzo), maar ik wist niet af van die "protected mode" optie, een collega wees mij daar vanochtend ook al op, maar bedankt voor de tips. Ik probeer het vanavond nog eens en hoop maar dat het dan werkt! *keeping fingers crossed*
Op vrijdag 09 november 2001 13:03 schreef OlafvdSpek het volgende:
Nee, hij bedoelt real mode zonder de 16-bit adres restrictie.
wat houd dat "unreal mode" precies in, ik bedoel hoe krijg ik dit? en wat zijn de gevolgen voor assembler code en geheugen adressering?
Op vrijdag 09 november 2001 13:03 schreef chaozz het volgende:
ook ik ben een spel aan het maken in good old Turbo Pascal 7.0

http://come.to/worldwidewenners
hee cool! hm.. die link doet het niet, maar bedoel je Lemmings at war? die ziet er ERG goed uit!! 8-)

mijn web games -> Impossible Snake 2 :: Impossible Snake :: Snake Slider


  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Unreal mode houdt in dat je switched naar protected mode, de limits van 64k naar 4g verzet en weer terug switchted naar real mode. In assembler kun je dan via 32-bit addressering het hele geheugen benaderen.

Dit werkt niet als je processor in virtual mode draait (emm386, qemm, windows). Dan moet je het met emm386 (of een andere API) uitvechten.

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:01
Kan je in TPAS ook niet specifieren met welk memory model je wilt compileren? Small, Normal of Huge?

https://fgheysels.github.io/


  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Nee (AFAIK).

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:01
AFAIK :?

https://fgheysels.github.io/


  • [ti]
  • Registratie: Februari 2000
  • Niet online
Ram es 2x ctrl-o achter elkaar in in je IDE, dan krijg je:
code:
1
2
{$A+,B-,D+,E-,F-,G+,I+,L+,N-,O-,P-,Q-,R-,S-,T-,V-,X+,Y+}
{$M 16384,0,655360}

Die $M switch is voor je stack/heap size. als je daar wat mee klungelt kom je er vast wel :P

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Op vrijdag 09 november 2001 17:33 schreef whoami het volgende:
AFAIK :?
As far as I know.

Verwijderd

Ach, weemoed. Schone Turbo Pascal. Ik kreeg even de kriebels toen ik die TP listing zag. Wellicht toch maar weer eens Pascal oppakken (werk=alleen microsoft ;( ).

Over far en near. Volgens mij kun je in TP een functie forceren far te zijn door:
Procedure doeIets(); far;
Maar ik weet het niet meer zeker. Heb je nodig, als je een interrupt procedure wilt maken.

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Op vrijdag 09 november 2001 22:15 schreef Doekman het volgende:
Ach, weemoed. Schone Turbo Pascal. Ik kreeg even de kriebels toen ik die TP listing zag. Wellicht toch maar weer eens Pascal oppakken (werk=alleen microsoft ;( ).

Over far en near. Volgens mij kun je in TP een functie forceren far te zijn door:
[..]

Maar ik weet het niet meer zeker. Heb je nodig, als je een interrupt procedure wilt maken.
Ja, maar we hebben het hier over pointers (naar data).

  • BdR
  • Registratie: Juni 2001
  • Laatst online: 13-09 23:03

BdR

TV is gooder then books

Ik heb mijn spel met Borland Pascal geprobeerd en het werkt allemaal weer :7 er is duidelijk meer geheugen beschikbaar want alles wordt probleemloos ingelezen (ik had even 2 MB aan test graphics gemaakt).

Maarrr, protected mode is wat 'strenger' in vergelijking met real-mode voor wat betreft het geheugen aanspreken. Nu had ik het DMAmix van Steven Don gebruikt maar die geeft nu dus een probleem (loopt gewoon keihard vast..) heeft te maken dat er een page en offset aan de DMA wordt doorgegeven, dit moet dus op een andere manier in protected mode

Dus mijn vraag: heeft iemand een soundblaster DMAmix voorbeeld source die ook werkt in protected mode? Is een erg specifiek probleem dus moeilijk zoeken.. :{

mijn web games -> Impossible Snake 2 :: Impossible Snake :: Snake Slider


  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Ik denk dat je de pages die je voor DMA gaat gebruiken moet locken. Dan krijg je het fysieke adres en dat kun je dan voor DMA gebruiken.

  • BdR
  • Registratie: Juni 2001
  • Laatst online: 13-09 23:03

BdR

TV is gooder then books

pages locken..? uhm.. hoe doe ik dat? :?

mijn web games -> Impossible Snake 2 :: Impossible Snake :: Snake Slider


  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Geen idee, heb nooit BP gebruikt.

  • TheLunatic
  • Registratie: April 2001
  • Laatst online: 09-07 16:41

TheLunatic

Ouwe boxen.

Topicstarter
Met Borland Pascal kun je wel grote kingsize arrays maken mag ik opmaken uit een aantal vorige posts ?

Mother, will they like this song?


  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Nee (IIRC).
De totale hoeveelheid geheugen is groter dan in TP, maar het is nog steeds 16-bits.
Pagina: 1