kleine Probleme mit Retrace und VGA unter Pascal

Diskussion zum Thema Programmierung unter DOS (Intel x86)
Benutzeravatar
zatzen
DOS-Guru
Beiträge: 518
Registriert: Di 17. Apr 2012, 05:10
Wohnort: bei Köln
Kontaktdaten:

Re: kleine Probleme mit Retrace und VGA unter Pascal

Beitrag von zatzen »

Mit Retrace habe ich mich bisher nicht so beschäftigt, aber sollte ich vielleicht mal.

Ich habe in meiner neuesten "Engine" (Anno 1998) die Sache über den
Soundbuffer geregelt. Habe den bei ner Samplerate von 22050 Hz
auf 882 Samples gesetzt (somit 25 Hz), und die Grafik und davon abhängig
gemacht. Alle Berechnungen finden statt während der Puffer gespielt
wird. Das ist eine sehr einfache Möglichkeit alles synchronisieren
zu können, allerdings sind 25 Hz für ein Action-Spiel nicht unbedingt
ausreichend.
mov ax, 13h
int 10h

while vorne_frei do vor;
Benutzeravatar
Thomas
DOS-Kenner
Beiträge: 426
Registriert: Mi 22. Jun 2016, 12:29
Wohnort: Nähe von Limburg / Lahn

Re: kleine Probleme mit Retrace und VGA unter Pascal

Beitrag von Thomas »

wobo hat geschrieben:Ich starte hier mal 'nen Zwischenaufruf an etwaig mitlesende Dos-Programmierer: Wer von Euch benutzt noch mehr als 4-6 MB Speicher unter DOS und - um alles in der Welt - was tut Ihr da hinein???

wobo
Hallo.
Also ich progge sehr gern unter DOS und habe 32MB im PC verbaut.
Was packe ich da hinein? Selber wenig bis nix da PM für mich ein böhmisches Dorf ist und ich die 640kB Grenze so nicht überwinden kann. Desweiteren progge ich auch nur in BASIC. (noch)
Das Bisschen was ich in den EMS packe, und das auch nicht selber sondern DirectQB, sind PCM Samples, Screenpages und Patterndaten der FM Modplayer routine.
Hilft mir bei meinem derzeitigen Projekt leider auch nicht weiter da Basic die Variablen und den Code dennoch im Heap ablegt und ich bin jetzt an ejnem Punkt wo mein Prog das Spinnen anfängt wenn ich nur ein paar Zeilen mehr implementiere.
Hat da jemand einen Tipp für mich?
Ein bisschen DOS kann oft mehr als ein Haufen Fenster.

Gigabyte GA-586HX, P54C 100@75MHz, 24MB RAM, AVGA3-22-1M ISA, RTL8029AS PCI, Goldstar Prime 2 ISA, MA5ASOUND, Dreambl. X2 DB, HD 4x2GB, 48x CD, 3,5" Floppy, 2xRS232, 1xPar., PS/2 Maus
Benutzeravatar
zatzen
DOS-Guru
Beiträge: 518
Registriert: Di 17. Apr 2012, 05:10
Wohnort: bei Köln
Kontaktdaten:

Re: kleine Probleme mit Retrace und VGA unter Pascal

Beitrag von zatzen »

Thomas hat geschrieben:Hilft mir bei meinem derzeitigen Projekt leider auch nicht weiter da Basic die Variablen und den Code dennoch im Heap ablegt und ich bin jetzt an ejnem Punkt wo mein Prog das Spinnen anfängt wenn ich nur ein paar Zeilen mehr implementiere.
Hat da jemand einen Tipp für mich?
Nutzt Basic überhaupt den Heap in seiner Gesamtheit?
Ich hatte in meiner Quickbasic-Zeit den Eindruck, ich hätte nur 128 kB: ein festes Codesegment und Variablensegment.
mov ax, 13h
int 10h

while vorne_frei do vor;
Benutzeravatar
Thomas
DOS-Kenner
Beiträge: 426
Registriert: Mi 22. Jun 2016, 12:29
Wohnort: Nähe von Limburg / Lahn

Re: kleine Probleme mit Retrace und VGA unter Pascal

Beitrag von Thomas »

Hi, super dass Du antwortest.
Deine Frage kann ich nicht beantworten. Ich sage mal jein. Theorethisch stehen Basic, und ich beziehe mich hier jetzt nur mal auf QB 4.5, die kompletten 640kB zur Verfügung, abzüglich natürlich DOS Sys Dateien, soweit nicht in der HMA, Treiber, TSR etc.
wären da nicht die BASIC typischen Begrenzungen wie 64kB pro Modul, pro Array etc und die EXE darf auch nicht größer als ~166kB sein wobei meine bereits bei 169kB liegt.
Die kleinste Veränderunge im Code bewirkt aber nun so Sachen wie "Stringspeicher nicht ausreichend" wenn ich abspeichern möchte oder "Prozedur nicht definiert" (sinngemäß) wenn ich kompilieren will.
Naja, die IDE benötigt ja auch Speicher.
Ich beschäftige mich derzeit damit wie man mit BC und LINK auf der CMD agiert aber sehr viel größer wird man die EXE damit wohl auch nicht bekommen.
Desweiteren probiere ich auch die DirectQB nach BASIC PDS 7.1 zu portieren und dann wenigstens meine SUBs die nur einmalig laufen wie Intro, Titel, Stage und Credits als Overlay im EMS abzulegen.
Einen Overlay Manager in QB 4.5 zu coden bekomme ich nie hin.
Ein bisschen DOS kann oft mehr als ein Haufen Fenster.

Gigabyte GA-586HX, P54C 100@75MHz, 24MB RAM, AVGA3-22-1M ISA, RTL8029AS PCI, Goldstar Prime 2 ISA, MA5ASOUND, Dreambl. X2 DB, HD 4x2GB, 48x CD, 3,5" Floppy, 2xRS232, 1xPar., PS/2 Maus
Benutzeravatar
zatzen
DOS-Guru
Beiträge: 518
Registriert: Di 17. Apr 2012, 05:10
Wohnort: bei Köln
Kontaktdaten:

Re: kleine Probleme mit Retrace und VGA unter Pascal

Beitrag von zatzen »

Seit ich in der Schule kurz Informatik hatte und wir da Pascal verwendeten bin ich darauf umgestiegen, und ich finde, es harmoniert wesentlich besser mit der Rechnerarchitektur, auch der integrierte Assembler ist ein Segen.
Ich habe meine Frage eher in den Raum gestellt, ernsthaft würde ich in Basic keine Projekte mehr anfangen.
Bei Quickbasic war nur schön, dass die IDE die Subroutinen gesondert angezeigt hat.
Je nachdem wie man es mag, es kann auch von Vorteil sein wenn man alles am Stück sieht, vor allem wenn man einige nur kleine Procedures hat.
Man kann natürlich bei Quickbasic tricksen ohne Ende, das letzte was ich da gemacht habe war CALL ABSOLUTE auf ein Array in das ich einen vorher geschriebenen Maschinencode geladen hatte. Und der "darf" ja alles, somit ist auch alles möglich, bloß muss man dann letztlich auch etwas von Assembler und je nachdem Low Level Programmierung verstehen.
Ich habe bei meinem größten QuickBasic Projekt das alles irgendwie zurechtgeschummelt, indem ich einfach bei einem Spiel mit einer anderen EXE fortgesetzt habe, deren Erweiterung ich anders als EXE nannte und der man ein Passwort mit auf den Weg geben musste, oder es musste in einer Datei geschrieben werden vom "Auftragsprogramm". Weiss nicht mehr so genau, es war alles sehr dürftig und amateurhaft.
mov ax, 13h
int 10h

while vorne_frei do vor;
Benutzeravatar
Thomas
DOS-Kenner
Beiträge: 426
Registriert: Mi 22. Jun 2016, 12:29
Wohnort: Nähe von Limburg / Lahn

Re: kleine Probleme mit Retrace und VGA unter Pascal

Beitrag von Thomas »

zatzen hat geschrieben:Ich habe bei meinem größten QuickBasic Projekt das alles irgendwie zurechtgeschummelt, indem ich einfach bei einem Spiel mit einer anderen EXE fortgesetzt habe, deren Erweiterung ich anders als EXE nannte und der man ein Passwort mit auf den Weg geben musste, oder es musste in einer Datei geschrieben werden vom "Auftragsprogramm". Weiss nicht mehr so genau, es war alles sehr dürftig und amateurhaft.
Ja, so komme ich mir mit meinem Spiel auch vor, Amateurhaft und dürftig. Die Idee mit mehreren EXEs kam mir auch schon. Das ist auch einfach umzusetzen. Über CHAIN habe ich auch schon siniert aber wie du sagst, dass ist nicht das Wahre.
Blöd an QB ist auch dass man einzelne Variablen nicht gezielt aus dem Speicher nehmen kann wenn sie einmal deklariert sind sonst würde ich mir die in den EMS poken und bei Bedarf zurück holen. Umgehen könnte ich das wenn ich mit ein paar Buffer Variablen arbeite von sämtlichen Typen. Ist aber endlos umständlich und löst das Problem mit der Code Größe nicht. Das Overlaying von 7.1 wäre schön ein Ansatz. Intro, Titel, Level und Outro als Overlays ins EMS und bei Bedarf laden, Schwupps.
Naja, an Pascal bin ich parallel dran aber da finde ich keine gute Gaming Unit.
Den FM MOD Player den ich da nutze bekomme ich sicher portiert, der ist reines Basic aber mit Grafikroutinen wird's dann schon schwer
Zuletzt geändert von Thomas am Fr 30. Jul 2021, 08:42, insgesamt 1-mal geändert.
Ein bisschen DOS kann oft mehr als ein Haufen Fenster.

Gigabyte GA-586HX, P54C 100@75MHz, 24MB RAM, AVGA3-22-1M ISA, RTL8029AS PCI, Goldstar Prime 2 ISA, MA5ASOUND, Dreambl. X2 DB, HD 4x2GB, 48x CD, 3,5" Floppy, 2xRS232, 1xPar., PS/2 Maus
Benutzeravatar
zatzen
DOS-Guru
Beiträge: 518
Registriert: Di 17. Apr 2012, 05:10
Wohnort: bei Köln
Kontaktdaten:

Re: kleine Probleme mit Retrace und VGA unter Pascal

Beitrag von zatzen »

Ich weiss nicht, welche Art von Grafikroutinen Du benötigst.
Aber ich habe gedacht, vielleicht könntest Du welche einbinden, die in Assembler geschrieben sind. Ich baue mir da gerade was (bin nur ein wenig am prokrastinieren, dauert etwas), eine Routine für Sprites, die Daten sind gepackt, ähnlich gut wie GIF, werden in Echtzeit entpackt und haben als Features Clipping, Spiegeln und Transparenz. Ein Datensatz kann dabei mehrere Sprites enthalten, man muss nur die Nummer des darzustellenden Sprites übergeben.
Ich habe bisher bei Pascal Speicher immer nur mit Getmem reserviert. Es müsste aber auch mit Assembler gehen, vielleicht verträgt sich das ja dann sogar mit QB, so dass man den ganzen Heap nutzen kann.
Wie gesagt - Assembler-Routinen per Call Absolute einbinden wäre prinzipiell kein Problem. Vielleicht brauchst Du ja auch nur ganz einfache Grafikroutinen die unkomprimierte Daten mit Transparenz darstellen.

Auch bei Pascal bleibt alles bestehen was einmal deklariert ist. Man kann höchstens Arrays definieren und diese für unterschiedliche Zwecke nutzen.

Was QB45 und EMS angeht kann ich aber nicht mitreden.

Was den Heap angeht handhabe ich es in Pascal so, dass ich meine Programme (z.B. meinen Sample-basierten Musik-Player) mit wenig Daten teste, und wenn die EXE kompiliert ist können die Daten dann den ganzen Heap füllen, da keine IDE mehr im Hintergrund ist. Für ein Spiel müsste man also eine "Engine" schreiben, die man mit wenig Spieldaten in der IDE testet und optimiert, und das letztliche Spiel mit viel Daten kann nur über die kompilierte EXE laufen.
mov ax, 13h
int 10h

while vorne_frei do vor;
Benutzeravatar
Thomas
DOS-Kenner
Beiträge: 426
Registriert: Mi 22. Jun 2016, 12:29
Wohnort: Nähe von Limburg / Lahn

Re: kleine Probleme mit Retrace und VGA unter Pascal

Beitrag von Thomas »

Naja, so alles halt was auch DirectQB unterstützt, wäre schon ein Luxus. Sprich, verschiedene Layer im EMS (Grafik Backbuffer, meine Stage benutzt quasi Octa-Buffering), diverse Spriteroutinen, wie Du sie angesprochen hast, Transparenz, Vergrößerung, Rotation, direktkopieren aus einem Layer aus dem EMS heraus, sodass man nicht erst geten und puten muss...
Desweiteren ist eine 32 stimmige SB Soundroutine darin und ganz wichtig, ich muss eigene Daten via VarSeg und VarPtr in den EMS poken und wieder zurück peeken können. Eine alternative EMS Routine täte es natürlich auch. Mal sehen, vielleicht die Ursprüngliche vom FM Player über Interupts.
Und könntest Du mir sagen wie ich ein Modul in Pascal realisiere? Bei dem FM Player ist das so in Basic, er MUSS als Modul geladen werden, hat aber Code im Modulhauptteil der durch die PlayMOD Sub via ON TIMER … GOSUB BTPlay (So heist der Player und die Sprungmarke im Modulhauptteil) angesprungen wird.
Hat Pascal überhaupt Routinen für Eventhandling und Timer Events? Bei mir ist das lange her, 9. Klasse in 1996 / 1997 und über die üblichen Verdächtigen wie writeln, readln, putpixel etc kam ich nie hinaus.

Liebe Grüße.
Ein bisschen DOS kann oft mehr als ein Haufen Fenster.

Gigabyte GA-586HX, P54C 100@75MHz, 24MB RAM, AVGA3-22-1M ISA, RTL8029AS PCI, Goldstar Prime 2 ISA, MA5ASOUND, Dreambl. X2 DB, HD 4x2GB, 48x CD, 3,5" Floppy, 2xRS232, 1xPar., PS/2 Maus
Benutzeravatar
zatzen
DOS-Guru
Beiträge: 518
Registriert: Di 17. Apr 2012, 05:10
Wohnort: bei Köln
Kontaktdaten:

Re: kleine Probleme mit Retrace und VGA unter Pascal

Beitrag von zatzen »

Ich kann zum Thema EMS wenig sagen, vor allem nicht aus QBASIC-Sicht. Ich habe nur in Pascal einmal XMS benutzt, aber nur indem ich etwas dorthin bzw. von dort kopiert habe. Also auch nichts direktes.
Letztlich habe ich es auch so verstanden, dass die CPU (im Real Mode) nur mit dem Heap arbeiten kann, und nicht direkt mit dem Erweiterungsspeicher. Demnach käme man nicht um diese verlangsamende Kopiererei herum.

Meinst Du mit Modul in Pascal eine Unit? Diese kann man über "uses" in sein Programm einbinden. Eine Unit enthält im Prinzip auch einfach Prozeduren - man könnte diese auch einfach in sein Programm einkopieren so dass man die Unit an sich nicht braucht, aber es dient der Übersicht und der Struktur, zudem wird ggf. in einer Unit das Codesegment gewechselt, so dass man durch Nutzung von Units mehr Programmspeicher zur Verfügung hat.

Eventhandling/Timer Events: Man kann in Pascal Interrupt-Routinen schreiben und Interrupt-Vektoren da drauf setzen.
Beispiel:

Code: Alles auswählen

procedure time_event; interrupt;
  writeln('Zeitereignis');
end;
SetIntVec setzt einen Interrupt-Vektor (hier Timer) auf eine Routine:

Code: Alles auswählen

setintvec(8, addr(time_event));
Die Codezeilen dienen natürlich nur als Beispiel, das Programm selbst wäre ziemlich blödsinnig,
18.2 mal pro Sekunde "Zeitereignis" auf den Bildschirm zu schreiben.

Verglichen mit QB finde ich Pascal trotz oder wegen der vermeintlich besseren Strukturierung hardware-naher.
So müssen alle Variablen definiert werden und man überlegt sich direkt, welche Typen Sinn machen. Und man ist auch flexibler was Variablentypen angeht. Wenn ich mich recht erinnere sind in QB nur 16 Bit Integer (mit Vorzeichen) definierbar (klar gibt es noch den long und die floats), während es in Pascal noch Words gibt (0-65535) und zudem Bytes, sogar shortints(-128 bis 127). Man kann in QB ein echtes Byte-Array nur mit Strings realisieren (so wie ich mich erinnere), während man das in Pascal sauber in Bytes definieren kann und ohne Umwege auf die Zahlenwerte zugreifen kann.
Ich hatte in QB eher das Gefühl dass ich mich auf einer Meta-Ebene befinde, während ich in Pascal direkten Zugriff habe.
Gerade wenn man sich mit Assembler beschäftigt merkt man bald dass nur mit Wasser gekocht wird und es im Grunde immer nur um Speicher lesen, etwas rechnen, und Speicher schreiben geht. Letztlich ist es weniger eine Frage, mit welcher Sprache man programmiert, sondern vielmehr, wie gut man die Rechnerarchitektur versteht. Zumindest, wenn man hardware-nah programmiert und nicht etwa in Java. Pascal ist da für mich einfach sehr gut geeignet, C wäre vielleicht noch eine Möglichkeit, aber da habe ich nicht so den Einstieg gefunden, auch empfinde ich das so knapp gehaltene Code-Bild als etwas kryptisch.
Pascal an sich bringt von Haus aus was Pixelgrafik angeht meines Wissens nicht viel mit, QB45 hat ja immerhin PUT und GET - auch wenn diese Funktionen wegen nicht-Transparenz und Fehlermeldung beim Überschreiten der Bildschirmgrenze stark eingeschränkt sind. Pascal (jedenfalls die Borland 7.0 Version) kann man sich aber mittels des integrierten Assemblers ziemlich bequem erweitern. Das einzige wo man bei Assembler generell acht geben muss: Es kann schnell zu Abstürzen kommen wenn man nicht aufmerksam genug programmiert. Daher finde ich es ganz praktisch dass ich in DosBox code.
mov ax, 13h
int 10h

while vorne_frei do vor;
Benutzeravatar
Thomas
DOS-Kenner
Beiträge: 426
Registriert: Mi 22. Jun 2016, 12:29
Wohnort: Nähe von Limburg / Lahn

Re: kleine Probleme mit Retrace und VGA unter Pascal

Beitrag von Thomas »

Ja, C ist mir auch zu kryptisch. Hat Ritchie ja auch selbst Mal gesagt. Pascal ist schon echt gut und den Inline ASM benutze ich ja auch schon so gut ich kann. Selbst wenn ich nur Versuche Pascal Anweisungen in ASM umzusetzen.
Das mit den Abstürzen habe ich auch schon zur genüge kennen gelernt. Gern Mal pushen ohne popen und so...
Ein bisschen DOS kann oft mehr als ein Haufen Fenster.

Gigabyte GA-586HX, P54C 100@75MHz, 24MB RAM, AVGA3-22-1M ISA, RTL8029AS PCI, Goldstar Prime 2 ISA, MA5ASOUND, Dreambl. X2 DB, HD 4x2GB, 48x CD, 3,5" Floppy, 2xRS232, 1xPar., PS/2 Maus
Antworten