Allgemeine Hilfestellung zum Programmieren unter DOS gesucht

Diskussion zum Thema Programmierung unter DOS (Intel x86)
Benutzeravatar
Thomas
DOS-Kenner
Beiträge: 426
Registriert: Mi 22. Jun 2016, 12:29
Wohnort: Nähe von Limburg / Lahn

Re: Allgemeine Hilfestellung zum Programmieren unter DOS gesucht

Beitrag von Thomas »

OK, super.
Ja, für so eine Hobbyprojekt nebenbei (so habe ich sein Readme Interpretiert) finde ich den auch nicht schlecht. Er erfüllt halt grundlegende AdLib Features, nicht mehr, nicht weniger.

Klar, wenn ich eine Routine auf den Timer Interrupt lege, spielt die so lange bis sie beendet wird. So habe ich meine nicht funktionierende Pascal BTPlay Routine gestestet. Einfach das StopMod weggelassen und ich hatte ein Dosprompt mit fast richtigem Gedudel. Ein halbes TSR sozusagen.
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: Allgemeine Hilfestellung zum Programmieren unter DOS gesucht

Beitrag von zatzen »

Hallo!
Es läuft schonmal. Erfreulich gut erstmal, klingt wie im Tracker, nur irgendwie sind die Einzelpatterns noch verschoben, in dem Sinne dass es zwar rhythmisch passt, aber eben die Spalten teilweise nicht melodisch zusammenpassen. Entweder ist der Fehler in der Patternmap, Ordr, oder beides. Das ist aber kein großes Problem mehr das zu lösen. Was dann noch bleibt ist das Testen auf Pattern Breaks und Sprünge und dergleichen. Da ich die komprimierten Daten nur sequentiell auslesen kann muss ich bei gewissen Sprüngen z.B. in einer Schleife die einzelnen Zeilen überspringen.
mov ax, 13h
int 10h

while vorne_frei do vor;
Benutzeravatar
zatzen
DOS-Guru
Beiträge: 518
Registriert: Di 17. Apr 2012, 05:10
Wohnort: bei Köln
Kontaktdaten:

Re: Allgemeine Hilfestellung zum Programmieren unter DOS gesucht

Beitrag von zatzen »

Jetzt ist das Problem gelöst. Es gab noch ein Problem mit Portamentos, die funktionieren jetzt auch. Jetzt wäre es eigentlich an der Zeit, dass ich Dir das mal zum testen gebe. Der Code ist jetzt noch weitgehend unkommentiert und hat einige Prozeduren oder Variablen die dem Debugging dienen und später rauskommen. Ich kann ja nochmal drübersehen und es dann hier verlinken. Achja, der Player läuft noch nicht über den Timer Interrupt, aber das kann ich auch noch machen.
Hier noch als Beispiel: THEONES.PIS ist 17489 Bytes groß. Auf dem Heap belegt es jetzt 4609 Bytes, neben den Variablen die der Player fest im Datensegment beansprucht. Oder noch effektiver: IMPLOSIV.PIS, Größe: 4146 Bytes, Heap: 770 Bytes.
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: Allgemeine Hilfestellung zum Programmieren unter DOS gesucht

Beitrag von Thomas »

Hey, super! Ja, das mit den verschobenen Pattern hatte ich in meinem Versuch auch. Glaube es lag an einem falschen Variablentyp (Byte verwendet statt Integer).
Auf den Timer legen könnte ich auch. Dann verlinke mir doch bitte die Version ohne, falls Du es selber noch einbaust.
Den Fehler im Tracker bezüglich DosBox habe ich auch gefunden , aber keine Idee wie ich es beheben soll. Der Fehler tritt in der Function GetDrv im Modul Benireq2.bas auf wo per INT 21h, AH=19h das aktuelle Laufwerk abgefragt wird. In Dosbox wird aber irgendwie immer ein Laufwerk weiter zurück geliefert. Ich habe C und D gemountet. Z ist ja immer da. Der Tracker ist in C:\PROG\BT. Wenn ich nun öffne, gibt GetDrv aber D zurück. Mit einer Kopie parallel auf D:\PROG\BT geht es wenn ich von C aus starte. Starte ich von D: wird Laufwerk Z zurückgegeben. Ich tippe da auf einen Bug im Dosbox Code.
Ist erledigt! Der Beni Tracker öffnet nun auch mit dem File Requester 2 ordnungsgemäß. Die Rückgabe in AL musste nur um eins verringert werden. Manchmal ist es eben doch so einfach.
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: Allgemeine Hilfestellung zum Programmieren unter DOS gesucht

Beitrag von zatzen »

Ich hatte beim einlesen der Patterns in der Abspielroutine es so formuliert: patnmap[ordr[.., ...]], das war aber nicht richtig, da ordr schon die Patternmap berücksichtigt.
Ja, Du kannst an dem Ding erstmal weiterstricken so dass es für Deine Spiele schonmal taugt. Ich würde aber je nach Lust und Laune auch dran weiterarbeiten und es auf meine Weise optimieren, Du kannst dann sehen ob Du meine oder Deine Versionen benutzt. Der Code ist kompiliert mit ca. 11 KB relativ groß, das liegt aber nicht an meinen Assembler-Routinen sondern ich schätze dass die ganzen IF-Kaskaden und redundaten Anweisungen in der Player Routine den Code so aufblasen. Wir haben ja gesehen, dass eine Zeile Pascal gerne mal 40 Bytes Kompilat verursachen kann.
Das ist ja toll, wenn der Tracker nun auch in DosBox mit Filerequester funktioniert. Aber wenn AL eins verringert wird, funktioniert es dann auch noch mit nativem Dos?

Ich könnte mir wirklich vorstellen, falls ich mal ein Spiel mit AdLib machen sollte, dass ich dann diesen Tracker verwende.
Das motiviert mich natürlich, eine richtig saubere, sparsame und effiziente Unit zu machen.

Es ist lange her dass ich mal wieder über Timer-Interrupts nachdenke. Ich glaube diese Aktion hier bringt mich auf eine Idee, wie ich mein Problem mit dem Timing bei meiner Sample-Tracker Engine lösen kann.

Hier ist der Code: http://www.zatzen.net/btplay6a.zip

Du müsstest das jetzt noch testen. Speed funktioniert, Portamento, Arpeggio. Aber mit Sprungbefehlen und ähnlichem bin ich mir nicht sicher. Teste es vielleicht lieber in Dosbox, für den Fall das es zu Abstürzen kommt.
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: Allgemeine Hilfestellung zum Programmieren unter DOS gesucht

Beitrag von Thomas »

Das ist ja toll, wenn der Tracker nun auch in DosBox mit Filerequester funktioniert. Aber wenn AL eins verringert wird, funktioniert es dann auch noch mit nativem Dos?
Nein, das natürlich nicht, leider. Das heisst, es existieren nun eine native (MS-)DOS Version und eine DOSBox kompatible Version. Vielleicht finde ich eine Möglichkeit die zuverlässig erkennt um was es sich handelt.
Du müsstest das jetzt noch testen. Speed funktioniert, Portamento, Arpeggio. Aber mit Sprungbefehlen und ähnlichem bin ich mir nicht sicher. Teste es vielleicht lieber in Dosbox, für den Fall das es zu Abstürzen kommt.
So, der Code ist getestet. Ich habe ihn nebenbei noch zur Unit gemacht und mit dem Timer Interrupt verknüpft. Ich hoffe das stört Dich nicht. Soweit läuft er schonmal ganz gut jedoch sind mir zwei Fehler aufgefallen:
1.: Bei meinem Tune für Stage 1 meines Shooters werden an ein, zwei stellen Instrumente angespielt die dort nicht vorkommen. Der erste Patternbreak (Das Stück besteht ja aus drei verschiedenen Abschnitten: Level, Boss und Siegesfanfare) funktioniert tadellos.
2.: Bei meinem Credits Tune funktionierte der Patternbreak nicht richtig. Es wurde schon ein Pattern zu früh gesprungen und dann auch ganz an den Anfang anstelle von Position 6 aber das funktioniert jetzt, obwohl ich nichts geändert habe. :shock:
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: Allgemeine Hilfestellung zum Programmieren unter DOS gesucht

Beitrag von zatzen »

Thomas hat geschrieben:Nein, das natürlich nicht, leider. Das heisst, es existieren nun eine native (MS-)DOS Version und eine DOSBox kompatible Version. Vielleicht finde ich eine Möglichkeit die zuverlässig erkennt um was es sich handelt.
Oder man macht vorab einen Startparameter wie "/FORDOSBOX" optional für die Nutzung in Dosbox.
Thomas hat geschrieben:So, der Code ist getestet. Ich habe ihn nebenbei noch zur Unit gemacht und mit dem Timer Interrupt verknüpft. Ich hoffe das stört Dich nicht. Soweit läuft er schonmal ganz gut jedoch sind mir zwei Fehler aufgefallen:
Hast Du die gleichen Fehler auch in der Version wie ich sie Dir gegeben habe, also keine Unit und keine Interrupt-Routine? Nur um ganz sicher irgendwas anderes als Grund ausschliessen zu können.
Nein, natürlich kannst Du den Code nach belieben modifizieren, nur werde ich am Ende auch eine Unit draus machen und mit Interrupt. Und ich wollte mal nachvollziehen wie der Player beim Abspielen genau vorgeht, dann ist es wahrscheinlich möglich eine effizientere Abspielroutine teilweise oder komplett in Assembler zu schreiben. Das macht Sinn, weil es so wie es jetzt ist wahrscheinlich auf 386ern zum Hakeln neigt, während man normalerweise erwarten kann, dass Adlib Musik auch auf 286ern flüssig läuft. Je weniger Rechenzeit die Musikroutinen brauchen, desto mehr hast Du für Dein Spiel übrig.
Auf die nötigen Schnittstellen der Unit können wir uns einigen, und dann kann ich einfach von Zeit zu Zeit eine neue Version machen die man dann einfach nur einbinden muss.
Thomas hat geschrieben:1.: Bei meinem Tune für Stage 1 meines Shooters werden an ein, zwei stellen Instrumente angespielt die dort nicht vorkommen.
Möchtest Du mir das Musikstück zukommen lassen, damit ich das Problem hier untersuchen kann? Vielleicht noch mit Angabe der ordr Position und der Pattern-Zeile.
Thomas hat geschrieben:2.: Bei meinem Credits Tune funktionierte der Patternbreak nicht richtig. Es wurde schon ein Pattern zu früh gesprungen und dann auch ganz an den Anfang anstelle von Position 6 aber das funktioniert jetzt, obwohl ich nichts geändert habe. :shock:
Das könnte daran liegen wenn Speicherbereiche "versehentlich" überschrieben werden oder wenn Variablen nicht sauber initialisiert werden. Da muss ich nochmal genauer in den Code gucken. Der Credits Tune wäre auch hilfreich, wenn es okay für Dich ist mir die Musik vorab schon zu zeigen. Damit es sonst niemand bekommen kann könntest Du mir eine PN schreiben.


Ich habe schon lange nichts mehr mit dem Timer-Interrupt gemacht. Daher ein Gedanke - muss man nicht für die Laufzeit der Interrupt-Routine die Interrupts sperren? Was passiert sonst, wenn die Routine noch nicht durch ist und sie erneut durch den Interrupt aufgerufen wird? Das dürfte dann doch mindestens zu korrumpierten Daten führen, bis hin zu Abstürzen. Möglicherweise auch ein Grund für den nur manchmal oder einmalig aufgetretenen Fehler mit dem Pattern-Jump.
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: Allgemeine Hilfestellung zum Programmieren unter DOS gesucht

Beitrag von Thomas »

Oder man macht vorab einen Startparameter wie "/FORDOSBOX" optional für die Nutzung in Dosbox.
Sehr gute Idee, so mache ich es!
Hast Du die gleichen Fehler auch in der Version wie ich sie Dir gegeben habe, also keine Unit und keine Interrupt-Routine? Nur um ganz sicher irgendwas anderes als Grund ausschliessen zu können.
Ja, auch in der unverfälschten Version. Ich habe auch das Stück selbst nochmal geprüft, da der BT manchmal Fehler rein haut die man nicht sofort entdeckt, bevorzugt irgendwelche Zeichen in den Effektpart aber dort ist alles gut. Die Strings die dort falsch abgespielt werden (sind auch als Instrument angelegt, werden aber erst in den letzten Pattern ganz am Ende benutzt) setzen einmal an Pos 5, ca. zwischen Zeile 50 u. 52 ein und einmal an Pos 9, selbe Zeile, ein.
Ich habe schon lange nichts mehr mit dem Timer-Interrupt gemacht. Daher ein Gedanke - muss man nicht für die Laufzeit der Interrupt-Routine die Interrupts sperren? Was passiert sonst, wenn die Routine noch nicht durch ist und sie erneut durch den Interrupt aufgerufen wird? Das dürfte dann doch mindestens zu korrumpierten Daten führen, bis hin zu Abstürzen. Möglicherweise auch ein Grund für den nur manchmal oder einmalig aufgetretenen Fehler mit dem Pattern-Jump.
Der Gedanke ist gut. Kann man ja probieren aber wenn man bedenkt dass die Routine 50 mal pro Sekunde durchlaufen wird, glaube ich das nicht, zumal es ja bei der Programmversion ohne INT auch passiert. Wenn man nun die INT sperrt für die Dauer der Routine, was wär wenn ein Spiel genau in diesem Moment Tastatur abfrägt oder ein Sample spielen will? Geht ja dann nicht aber ich denke da ist die Verzögerung zu gering um was zu bemerken.
Frage zum INT sperren: Wenn ich

Code: Alles auswählen

asm;cli;end;
schreibe, sind die INT dann nur zwischen dem asm und dem end gesperrt oder so lange bis ich sie wieder mit

Code: Alles auswählen

asm;sti;end;
freigebe?

Habe es getestet mit meiner Unit: INT sperren verändert nichts an den Fehlern.
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: Allgemeine Hilfestellung zum Programmieren unter DOS gesucht

Beitrag von zatzen »

Hallo!
asm cli end; sperrt solange bis es mit asm sti end; wieder aufgehoben wird.
asm ... end Anweisungen werden direkt in den Code eingefügt und sind nicht als Prozedur zu verstehen, man kann auch einfach mit asm db 'blabla' end irgendwelche Bytes mitten in den Code schreiben, was dann zwar meistens zum Absturz führt wenn man keinen sinnvollen Code in den Bytes formuliert, aber hilfreich um sich Marker zu setzen um im Kompilat seine Routinen ausfindig zu machen.

Ja das stimmt, wenn man in der Routine die Interrupts sperren würde wäre das nicht so optimal. Aber man kann zur Sicherheit eine globale Variable z.B. Int_Running (boolean) definieren, diese ganz am Anfang der Int-Routine auf True setzen und ganz am Ende auf False. Und dann noch oben vor dem auf True-Setzen einfügen: If Int_Running then Exit.

Ich habe beim Abtippen vom Originalcode (wollte es lieber konzentriert Zeile für Zeile durchgehen und es direkt in Pascal-Weise schreiben anstatt den Basic Code reinzuhauen und dran herumzufriemeln) aus versehen einen Effekt ausgelassen, den $EA (Volume Slide Up). Habe ich jetzt eingebaut und ich lasse Dir die neue Version sehr bald zukommen.
Möglich, dass ich noch ein paar Fehler mehr gemacht habe, das werde ich alles finden während ich versuche, die Vorgänge zu verstehen um eine eigene Abspielroutine von Grund auf zu schreiben.
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: Allgemeine Hilfestellung zum Programmieren unter DOS gesucht

Beitrag von Thomas »

Guten Morgen!
OK, dann passt das mit dem cli/sti ja so. Aber wie gesagt, macht beim abspielen keinen Unterschied.

Bei den Effekten habe ich eh überlegt ob wir/du da nicht noch ein paar mehr rein basteln könnten. Das sind doch sicher nicht alle die da drin sind...
Weiß nicht ob du das kennst aber beim Whacker Tracker gab es noch so einen Effekt der das Sample nur kurz abspielt und dann abbricht, so als wenn man zB eine Gitarre gedämpft anspielt.
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
DOSferatu
DOS-Übermensch
Beiträge: 1220
Registriert: Di 25. Sep 2007, 12:05
Kontaktdaten:

Re: Allgemeine Hilfestellung zum Programmieren unter DOS gesucht

Beitrag von DOSferatu »

Kleine Anmerkung meinerseits: Eine ISR sperrt beim Einsprung automatisch das Interrupt-Flag.
(D.h. erst sichert sie das FLAGS-Register und löscht DANACH - quasi gleichzeitig - das Interrupt-Flag.)
Nach Beenden der ISR wird ja bekanntlich die Adresse zurückgeholt UND die FLAGS - danach ist dann wieder alles so gesetzt wie es vor der ISR war.

Man KANN innerhalb der ISR natürlich das INT-Flag wieder freigeben. (Dann oassieren allerdings INTs im INT - und DAS muß man dann natürlich entsprechend kontrollieren, wenn man kein Chaos will.)

Allerdings, wegen "verpaßter" INTs: Keine Sorge. Auch wenn das INT-Flag gesperrt ist, werden "angelaufene" Interruptrequests (aber natürlich nur einer PRO QUELLE) gesichert und nach Abarbeitung der ISR wird dann der nächste aufgerufen, falls zwischenzeitlich einer aufgetreten ist.
Selbstverständlich sollte man trotzdem eine ISR möglichst kurz halten.

Zu Tastatur-INTs: Diese sollten wohl nicht häufiger auftreten, als die Spiel-Schleife, also der "Spiel-Takt". Die maximale Frequenz, auf die man eine Tastatur setzen kann, sind 30 Hz (30 pro Sekunde) und man braucht die Taste ja erst, wenn man in der Spielschleife an den Punkt kommt, wo man sie abfragt. (Naja, ich selbst setze sowieso ein Scancode-Tastenarray, bei dem ich nur 1 eintrage, wenn Taste gedrückt und 0, wenn Taste losgelassen. Das mache ich im Keyboard-Interrupt. Die Auswertung des Ganzen interessiert den Interrupt ja nicht.)
Benutzeravatar
Thomas
DOS-Kenner
Beiträge: 426
Registriert: Mi 22. Jun 2016, 12:29
Wohnort: Nähe von Limburg / Lahn

Re: Allgemeine Hilfestellung zum Programmieren unter DOS gesucht

Beitrag von Thomas »

Guter Einwand, Dosferatu.
Mir schwebte da was im Hinterkopf dass die INTs während der ISR gesperrt sind, aber ich war mir da nicht ganz sicher, deswegen habe ich es nicht geschrieben.

Jetzt wo du es sagst, fällt mir auch wieder ein dass ich Mal gelesen habe dass der PIC einen Buffer für die INTs hat und die dann der Reihe und Prio nach abgearbeitet werden.

Das mit dem Scancodearray interessiert mich jetzt näher:
Wie machst Du denn die Abfrage der einzelnen Tasten? Kann ich mir das etwa so vorstellen:
Wenn INT 16 dann lese scancode. Wenn bsp ESC, dann KeyArray[27] := 1 ?
Oder ist es doch etwas komplexer?

Danke für deinen Beitrag und liebe Grüße,
Thomas
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: Allgemeine Hilfestellung zum Programmieren unter DOS gesucht

Beitrag von zatzen »

Hier, wie versprochen, die neue Version: http://www.zatzen.net/btplay7a.zip

Danke, DOSferatu, es ist immer gut wenn man genau Bescheid weiss. Also ist das Interrupt Flag so zu verstehen, dass die CPU(!) auftretende Interrupts abarbeitet oder nicht, aber sie reihen sich aneinander wenn sie nicht abgearbeitet werden, aber nicht mehrfach die gleichen. So habe ich das jetzt verstanden.

Thomas, ich bräuchte mal Deine Musikstücke, um die beschriebenen Fehler zu analysieren. Wenn das okay ist dass Du sie mir gibst. Wie gesagt, das könntest Du per private Nachricht machen. Letztlich könnte ich mir aber auch selber Stücke im BT schreiben, die alles auf Herz und Nieren testen, aber bislang komme ich mit der undokumentierten Bedienung des Trackers nicht zurecht. Also, das wäre sehr sinnvoll wenn ich mir selber Teststücke bastle, aber die Bedienung müsste ich mir umständlich aus dem Quelltext herauslesen, vielleicht kannst Du sie mal kurz erklären. Pattern editieren ist kein Problem, aber ich finde keine Tasten um zum Ord oder zu den Instrumenten zu schalten.

Die ISR im BT-Player ist ja nun alles andere als kurz. Es wäre wohl besser wenn man nur flaggt, dass es einen Tick weitergeht, und die Berechnungen dann ausserhalb der ISR macht. In der ISR dann vielleicht nur die ganzen OPL.OUTs. Oder selbst diese auslagern. Das würde dem ganzen aber den vermeintlichen TSR-Effekt nehmen.
Vielleicht kannst Du schonmal überlegen, ob für Dich eine Lösung in Frage käme, bei der Du eine Hauptschleife für das Spiel hast und in dieser Hauptschleife auch BTPLAY-Routinen ausgeführt werden müssen, anstatt dass dies alles im Hintergrund in einer dicken ISR geschieht. Du hättest so etwas mehr Kontrolle und könntest vom Spiel gesteuerte Pattern-Jumps z.B. so koordinieren, dass sie nicht im 50 Hz Raster eingreifen sondern nur nach jeder vollständig durchlaufenen Zeile. Geht auch mit ISR, aber ich meine, "zu Fuß" etwas klarer nachzuvollziehen.
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: Allgemeine Hilfestellung zum Programmieren unter DOS gesucht

Beitrag von Thomas »

Nur schnell eine Antwort, schreibe später ausführlich:
Ord: F1
Pat: F2
Ins: F3
NUR im Pat(F2) laden: F4
NUR im Pat(F2) speichern: F5
Im Instrumenteneditor: Laden/Speicher F4/F5

Aber die Stücke kannst Du dennoch gern haben. Müsste ich dann an deine Mail schicken, da mein FTP derzeit down ist.

So:
Naja, das mit der dicken ISR sehe ich da nicht so kritisch. Immerhin war es in BASIC nicht anders und da lief es gut. Ok, für den 486er musste ich die Grafik anpassen damit ich auf meine 30FPS komme. Das weglassen der Musik hat da auch keinen Unterschied gemacht. Oh fand ja gerade einen der angenehmen Vorteile, dass ich nur einmal PlayMOD aufrufen mußte VOR der Hauptschleife und zum skippen innerhalb des MODs je einmal StopMOD und dann noch einmal PlayMOD mit der neuen Ordr.
Aber gut, kann man nochmal überdenken.
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: Allgemeine Hilfestellung zum Programmieren unter DOS gesucht

Beitrag von zatzen »

Danke schonmal für die Kurzanleitung!

In jedem Fall werde ich die Abspielroutine optimieren, so dass sie erstmal schneller ist und kompiliert kleiner. Das ist ja dann schon die halbe Miete und man kann dann immer noch sehen ob man alles im Interrupt erledigt oder nicht.

Übrigens besteht noch die Möglichkeit, die PIS Dateien für den Pascal Player in das Format zu konvertieren, wie ich es im Speicher halte. Das würde die Laderoutine enorm abspecken und vereinfachen, es würden ein paar Assembler Routinen wegfallen, und die Musikdateien selbst wären je nachdem bedeutend kleiner. Du kannst ja mal überlegen ob Du beim Spiel lieber das offizielle PIS Format in den Dateien verwendest das man mit BT18 öffnen kann, oder das komprimierte, was man nicht in den Tracker laden kann (könnte ja sein dass man das nicht will, damit es niemand "rippen" kann oder so). Ich könnte so oder so einen Converter schreiben und das Format meinetwegen PCS nennen, und dann noch eine Routine "load_pcs" in die Unit einfügen. Diese Routine würde dann nur ins Kompilat Einzug halten wenn man sie tatsächlich benutzt, wäre also nur im Code ein bisschen extra Ballast. Wenn Du statt der "normalen" Laderoutine die "PCS" Laderoutine verwendest, gehen die normale Routine und entsprechend verwendete ASM Routinen nicht ins Kompilat ein. "PCS" zu laden würde also Programmspeicher sparen.
Zuletzt geändert von zatzen am Mo 27. Jan 2020, 23:39, insgesamt 1-mal geändert.
mov ax, 13h
int 10h

while vorne_frei do vor;
Antworten