Eigenes Videoformat

DOSferatu
DOS-Übermensch
Beiträge: 1160
Registriert: Di 25. Sep 2007, 12:05
Kontaktdaten:

Re: Eigenes Videoformat

Beitragvon DOSferatu » Di 13. Aug 2019, 08:02

zatzen hat geschrieben:Ich antworte später ausführlicher.

Na gut...

zatzen hat geschrieben:Nur schon einmal so viel:
Ich habe etwas experimentiert und ZVID2 für lohnenswert und funktional befunden.
Die Freepascal Routine funktioniert mit clipping an allen Bildschirmseiten und spiegeln, ich muss jetzt nur noch das Format strukturieren,

Ich habe schon mehrmals versucht, Freepascal (auch neuere Versionen) zu benutzen, aber mein Zeug compiliert da nicht. Vielleicht programmiere ich zu seltsam. Ich glaube, die supporten immer noch nicht die mem[] und port[] Dinge - weiß gerade nicht genau, ich glaube, es gab auch noch andere Probleme. Mir vergeht irgendwie die Lust, die Units, die ich in den letzen 25 Jahren geschrieben habe, jetzt auch noch für FreePascal (das angeblich 100% kompatibel zu Borland/Turbo Pascal ist) anzupassen. Aber egal.

zatzen hat geschrieben: und dafür muss ich folgendes klären:
Wenn ich mit getmem Speicher reserviere, in welchem Rahmen wird sich dann das zugeordnete
Offset befinden? Bleibt es unterhalb von 16, unterhalb von 8 oder sogar verlässlich bei 0 ?
Oder kann es sogar passieren, dass es Werte >= 16 annimmt, etwa wenn man nur kleine
Mengen reserviert?

Kann ich nicht genau sagen - aber ein entsprechendes Testprogramm, das viele "krumme" Speichergrößen reserviert und dann den Offset des zugewiesenen Pointers testet/ausgibt, könnte das leicht klären. Es sollte kein Hexenwerk sein, so etwas zu schreiben.

zatzen hat geschrieben:Ich würde das ganze gern im Zweifelsfall so zurechtstutzen beim Laden eine ZV2 Datei, dass ich in der ASM Routine von absoluten Verhältnissen ausgehen kann.
Also bspw. mit getmem den benötigten Speicher + 16 reservieren, und Die Daten
dann an (segment+1:0000) laden.

Klar, mach ich auch immer so - und meine eigene Speicherverwaltung liefert sowieso ausschließlich Pointer mit Offset=0.

Ich habe mal "irgendwo gelesen", daß GetMem immer in minimal 8er-Schritten reserviert - aber ich weiß nicht mehr, wo das war und ob das stimmt - ich verlasse mich da auf nichts.

Aber: Wie Du ja weißt, sind die Segmentanfänge alle 16 Bytes im Speicher, so daß also der Pointer 1234:16 genau auf die gleiche Speicherstelle zeigt, wie der Pointer 1235:0 und der Pointer 1233:32... usw.

Ich mache da immer so etwas, das ich selbst als "Normalisieren des Pointers" bezeichne:

Code: Alles auswählen

procedure PNormalize(var P:Pointer);
var PX:record O,S:word;end absolute P;
begin
with PX do begin inc(P,O shr 4);O:=O and 15;end;
end;

Der Pointer zeigt damit auf die gleiche Adresse, aber sein Offset ist immer nur 0 bis 15.

Jetzt weiß ich nicht, ob FreeMem, bei dem man ja den Pointer angeben muß, GENAU den von GetMem zugewiesenen Pointer braucht, oder auch mit diesem "normalisierten" zurechtkäme. Da kann man sich natürlich auch einen zweiten Pointer machen (vorher in einen anderen kopieren und den normalisieren) ODER man macht das Ganze als Funktion:

Code: Alles auswählen

function GetPNormalize(P:Pointer):Pointer;
var PX:record O,S:word;end absolute P;
begin
with PX do begin inc(P,O shr 4);O:=O and 15;end;
GetPNormalize:=P;
end;


Ja, in Assembler kann man das natürlich mit weniger Geraffel und etwas eleganter machen (wie man - meiner Meinung nach - VIELES in Assembler kürzer und eleganter machen kann als in vielen Hochsprachen - obwohl es ja offiziell angeblich umgekehrt ist), aber es soll hier verdeutlichen, was ich meine/wie es funktioniert.

Falls man sowieso nur ein "Null-Offset-Segment" haben will, braucht man zwar trotzdem auch den Pointer (damit man ihn mit FreeMem wieder freigeben kann), aber da könnte man z.B. das machen:

Code: Alles auswählen

function GetMemSeg(var P:Pointer;SZ:word):word;
var PX:record O,S:word;end absolute P;
begin GetMem(P,SZ+15);
with PX do GetMemSeg:=S+(O shr 4)+ord((O and 15)<>0);
end;


Erklärung (falls nötig) : Man reserviert 15 Bytes mehr als man braucht - für den Fall, daß der Offset an einem "krummen" Wert landet. 15 ist ausreichend, es braucht nicht 16.
Dann weist man dem Segment den "normalisierten" Wert zu. Das ganz letzte (ab "ord") bedeutet: Der Begriff innerhalb ord(), also (O and 15)<>0 ergibt einen Wahrheitswert FALSE oder TRUE und ord() macht daraus 0 oder 1, d.h. falls der Offset trotz Normalisierung "krumm" wäre, daß man dann zum Segment 1 addiert.

Ich hoffe, ich konnte es einigermaßen verständlich ausdrücken. Man kann das Ganze natürlich auch anders darstellen oder machen - aber für jeden, der erst einmal verstanden hat, wie das segmentierte x86-Speichermodell funktioniert, sollte es kein Problem sein, "glatte" Segmente zu reservieren/benutzen.

Man muß natürlich bei o.g. Function dann darauf achten, bei FreeMem die Größe+15 freizugeben. Und außerdem habe ich in o.g. Function auch keine Prüfung drin für den Fall, daß der Speicher nicht reicht oder die gewünschte Größe > 65521 wird - das kriegt man sicher selbst raus, falls man's braucht.
Benutzeravatar
zatzen
BIOS-Flasher
Beiträge: 371
Registriert: Di 17. Apr 2012, 05:10
Wohnort: bei Köln
Kontaktdaten:

Re: Eigenes Videoformat

Beitragvon zatzen » Di 13. Aug 2019, 16:30

Vielen Dank für die schnelle Antwort!

Sehr elegant das "inc(P,O shr 4)" da bin ich gar nicht drauf gekommen.

Ich muss aber überlegen ob ich nicht doch in der ASM Routine ein paar Takte und Zeilen mehr einbringe (außerhalb innerer
Schleifen), es wäre nämlich auch reizvoll hinsichtlich der Einfachheit, die ZV2's ganz standardmäßig reinzuladen und nicht
mit spezialisierten Routinen.

Was Freepascal angeht, wenn man das in Windows benutzt, dann ist das ja auf Protected Mode und 32 Bit ausgelegt, von
Befehlen wie mem[] oder port wird eindeutig abgeraten. Im Gegensatz zu Turbo Pascal für Dos kann man bei Freepascal
einfach ein Array von z.B. 1 GB anlegen, und so gehe ich dann auch vor wenn ich in Freepascal programmiere. Einfach
Arrays in beliebiger Größe, meistens dynamisch die Größe über setlength festgelegt. Getmem ist wohl möglich, aber
mehr oder weniger unnötig weil man ja 4 GB Speicher hat und somit die Unterscheidung von Codesegment, Datensegment
und Heap gewissermaßen hinfällig wird. Ich programmiere in FPC meist datenverarbeitende Tools, und da kommt es
mir nicht so sehr auf die Performance an, es soll nur möglichst unkompliziert zu programmieren sein und funktionieren.
Freepascal wird nur zu Turbo Pascal kompatibel sein, wenn man ziemlich hardwarefern programmiert, bzw. muss
man einfach das lineare(?) Speichermodell von Freepascal berücksichtigen.
DOSferatu
DOS-Übermensch
Beiträge: 1160
Registriert: Di 25. Sep 2007, 12:05
Kontaktdaten:

Re: Eigenes Videoformat

Beitragvon DOSferatu » Di 13. Aug 2019, 18:56

zatzen hat geschrieben:Sehr elegant das "inc(P,O shr 4)" da bin ich gar nicht drauf gekommen.

Wäre noch eleganter, wenn ich mich nicht verschrieben hätte.
Es muß selbstverständlich heißen:

Code: Alles auswählen

inc(S,O shr 4);
drzeissler
DOS-Gott
Beiträge: 3214
Registriert: Mo 8. Feb 2010, 16:59

Re: Eigenes Videoformat

Beitragvon drzeissler » Di 20. Aug 2019, 11:20

Bei YT gibt es einen, der ein FullscreenVideo mit Ton (Beavis&Butthead) auf einem 286/8 oder 10Mhz in VGA laufen lässt. Sowas wäre mal echt interessant. Das wäre ein cooles Feature für ein A2286/8.
CPU: 486 DX2/66 MOBO: SNI-D882 RAM: 3x16MB - FDD: 3,5" 1,44MB HDD: 6,4GB Seagate ISA(1): Audican32Plus PCI(1): 3com TX 905 OS: MsDos622 - Win95a - WinNT 3.51

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast