Allgemeine Hilfestellung zum Programmieren unter DOS gesucht

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: Allgemeine Hilfestellung zum Programmieren unter DOS gesucht

Beitrag von zatzen »

DosBox emuliert ja auch die Adlib, d.h. man hat auch Adlib Sound wenn man gar keine solche Karte eingebaut hat. Das kann man auch hören, es klingt je nachdem ein klein wenig anders als das Original. Es kann und wird so sein, dass DosBox gegenüber zu kurzen Wartezeiten toleranter ist als die Hardware.
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 »

Daumen hoch, jetzt geht es! Aber ich verstehe das nicht. Werden im OPL2 Modus auf dem echten OPL3 etwa auch die waitcycles emuliert? Wenn ich die beim Spiel weglasse, befindet er sich ja im OPL3 Modus...
Naja, ist ja auch egal, jetzt kannst Du Dich weiter ans optimieren machen :-)
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 »

Super, das freut mich.
Zu dem Thema OPL3 vs OPL2 und dem Problem mit den Wartezeiten kann ich nur sagen, dass, wenn ich mich recht erinnere, ich die gleichen Probleme auch mit einer Soundblaster AWE 64 Gold hatte, die OPL3 kann, aber im OPL2 Modus dieselben Probleme wie eine AdLib hatte.
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 »

Ah, ok. Wäre möglich dass Yamaha da gar keine OPL2 Emulation fährt, sondern der OPL3 eigentlich zwei kerne hat... So genau kenne ich das Ding nun auch nicht. Aber in der btp_tst2 hast Du ja die elenden IF Kaskaden wieder drin...
Naja, so langsam wird es. Ich versuche mich sobald ich mehr Zeit habe mal an der Pseudo-OPL3 Sache. Echten 4-OP Sound lassen wir aber außen vor oder? Dann müsste auch der BASIC Code vom Tracker erweitert werden und da wird's mir dann doch zu kompliziert. Finde ich persönlich auch gar nicht nötig denn meiner Meinung nach macht der OPL3 mit acht Wellenformen und einem kleinen Trick schon beachtliche Sounds. Man kann ja zwei Kanäle kombinieren indem man unterschiedliche Instrumente zeitgleich abspielt. Ich mache dass so bei meinen Drums. Das entspricht auch in etwa einem der 4-OP Algorithmen mit dem Unterschied, dass man bei der Kombinationsmethode dem zweiten Modulator auch noch Feedback hinzufügen kann.
So, jetzt geh ich aber schlafen. Gute Nacht.
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 »

Mit Absicht hab ich die IF Kaskaden erstmal wieder reingemacht, um eventuelle Fehler im Assemblercode auszuschliessen. Der ist aber jetzt schon zu gut 2/3 fertig.
Ja, ich meine der OPL3 ist irgendwie ein Aufbau auf dem OPL2.
4-OP würden den Rahmen des Trackers sprengen, der kann ja auch 14 Kanäle... Könnte man natürlich auch noch erweitern, aber wenn Du Abwärtskompatibilität zu Adlib willst und einfach nur eine Stereooption, dann macht das schon Sinn so wie gehabt.
mov ax, 13h
int 10h

while vorne_frei do vor;
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 »

Thomas hat geschrieben:Guten Abend, Dosferatu.
Guten Abend, Thomas.
Thomas hat geschrieben:Ich wollte Deine Vorgehensweise in keinster Weise kritisieren, im Gegenteil,
Ich habe es auch nicht als Kritik aufgefaßt. Jeder hat eine andere Herangehensweise an seine Aufgaben - und das ist gut so.
Thomas hat geschrieben:ich kann sehr gut nachvollziehen dass man ein Stückweit stolz ist auf das was man entwickelt hat, vorallem wenn es alles aus der eigenen Feder stammt
Naja, "stolz"... - Ich bin eher froh, wenn etwas endlich so funktioniert wie es gedacht ist. Und im Gegensatz zu meinen Anfängen (vor über 30 Jahren), wo ich quasi jedes Programm von Null auf gemacht habe, bin ich inzwischen froh, mir über die Jahre/Jahrzehnte eine gute Sammlung von Units geschaffen zu haben, die ich jetzt nur noch einbauen brauche. Wenn etwas einmal gut funktioniert hat, braucht man's ja nicht immer wieder neu machen - da bleibt einem mehr Zeit für die wirklich neu zu machenden Sachen. Was natürlich nicht heißen soll, daß man nicht auch ab und zu die eine oder andere Unit (abwärtskompatibel) verändert/verbessert.
Thomas hat geschrieben:und nicht wie bei mir, überwiegend mit Hilfe einer fertigen Bibliothek. Es sollte jeder nach seinem Gusto machen und ich finde Dein Vorgehen mit dem Key-Array durchaus praktikabel.
Ja, wie schon gesagt - was ich so mache, ist ja nicht "der Weisheit letzter Schluß" - es ist nur EINE mögliche Vorgehensweise, die bei mir funktioniert hat. Und, es ist nicht schlimm, wenn jemand mit fertigen Bibliotheken arbeitet - am Ende zählt, was herauskommt.
Ich bin nur eben selbst so ein "Engine-Bastler" - mir macht es Spaß, solche Dinge selbst zu entwickeln und quasi "zu 100% zu verstehen, wie es funktioniert".
Thomas hat geschrieben:Was den Zähler betrifft, für MICH sind so zwei OpCodes schon kompliziert, da ich kein Assembler spreche. (J)ump (if) (C)arry verstehe ich zwar (ADD natürlich auch) aber wenn ich das jetzt alles umsetzen sollte, so muss ich passen.
Naja, aber mehr als ein JC und ein ADD wäre es im dem Fall ja auch nicht. Aber, wie gesagt: Nur weil ICH etwas so mache, bedeutet das nicht, daß es der einzig gangbare Weg wäre. Und ja, die CMOS-Uhr habe ich auch schon ausgelesen und beschrieben. Hier muß man nur aufpassen, daß man das "Warte-Bit" auch wirklich abwartet, falls es gesetzt ist (sowohl beim Lesen als auch beim Schreiben).
Thomas hat geschrieben:Wenn mich nicht alles täuscht, so gibt Ralph Brown's Interruptlist nicht mehr her als den Timer Tick, INT 08 betreffend. Es SOLLTE also sonst nichts wichtiges ausgeführt werden.
Ja, ich habe mich damit noch nicht näher beschäftigt. An sich bräuchte man ja nur den Code ab dem Vektor von INT 80 deassemblieren.
Thomas hat geschrieben:Ich wollte das mit dem Zähler auch nicht abtun, ich werde mich sogar damit beschäftigen weil mich das auch interessiert.
Ja, wie gesagt - das nachträgliche Setzen der korrekten Uhrzeit aus CMOS ist auch eine Möglichkeit. (Und etwas anderes macht der PC ja schließlich beim Starten auch nicht.) Nur, wenn man die sowieso während der Laufzeit des Programms nicht beachten will (und sie damit vielleicht schneller läuft), könnte man sich auch stattdessen "anhalten", indem man gar nicht den Ursprungs-INT8-Vektor anspringt, sondern gleich die eigene ISR mit "mov AL,$20; out $20,AL; IRET;" beenden.
Thomas hat geschrieben:Ja, es gibt eine spielbare Demo von Alien Avenger. Ich wollte die eigentlich hier an Heiligabend veröffentlichen, habe dann aber doch einen Rückzieher gemacht. Ich wollte noch ein einzelnes großes Datafile machen statt einzelner Grafik-, Sound- etc. Files aber dann hat BASIC rumgezickt.
Ja, auch dafür habe ich eine Unit, die so ein "großes Datafile" macht (ähnlich der .WAD Files bei DOOM&Co.). Seit ein paar Jahren kann man das sogar an das Programm (die .EXE) anhängen und es funktioniert trotzdem. So ist es z.B. bei prISM / AtavISM zu sehen.
Thomas hat geschrieben:Einen eigenen Installer wollte ich auch noch machen.
Installer? Braucht man so etwas für DOS-Software? Normalerweise reicht es doch, alles mit ZIP oder RAR zu packen, so daß man das einfach in ein Verzeichnis entpackt und fertig. Diese Installateure sind doch eher aus der Windows-Ecke - wo sich eine Software dann an allen Ecken im System festsetzt und mancnmal beim De-Installieren trotzdem noch Restmüll hinterläßt...
Thomas hat geschrieben:Ein echter Abspann fehlt auch noch und, und, und...
Aber es wird bald kommen, versprochen. :-)
Naja, wenn es eine Preview/Demo ist, wird ja keiner meckern, wenn etwas unvollständig ist.
Thomas hat geschrieben:Hat aber keine frei wählbare Steuerung... :-(
Naja, solange es keine nervende Steuerung ist mit irgendeiner abartigen Tastenbelegung...

Na gut, wollte das nur noch loswerden. Wollte nicht weiter stören.
Benutzeravatar
b20a9
BIOS-Flasher
Beiträge: 382
Registriert: Mi 16. Apr 2014, 23:54
Kontaktdaten:

Re: Allgemeine Hilfestellung zum Programmieren unter DOS gesucht

Beitrag von b20a9 »

Hallo Thomas & Zatzen, ich will nur kurz los werden, dass ich sehr beeindruckt bin von eurem Enthusiasmus und der Tatsache an sich, dass ihr für DOS programmiert. Liest sich alles sehr interessant, leider verstehe ich nichts von Programmierung und kann daher nur abstrakt folgen. Aber als großer OPL2/3 Fan freuie ich mich wirklich sehr, dass es noch Menschen wie euch gibt, die das irgendwie am Leben erhalten. Weiter so :-)
Acer AcerMate 386SX 33, Cyrix FasMath FPU, 6MB RAM, 3Com Etherlink Mit XT-IDE, Miro PCM1 Pro, 1GB Transcent Industrial CF
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, Dosferatu.
Du störst niemals. Dein Kommentar wird gern genommen.
Installer? Braucht man so etwas für DOS-Software? Normalerweise reicht es doch, alles mit ZIP oder RAR zu packen, so daß man das einfach in ein Verzeichnis entpackt und fertig. Diese Installateure sind doch eher aus der Windows-Ecke - wo sich eine Software dann an allen Ecken im System festsetzt und mancnmal beim De-Installieren trotzdem noch Restmüll hinterläßt...
Nein, braucht man unter DOS nicht, aber für mich gehört es zum Thema DOS-Retro einfach dazu.
Ein Setup für Sound und CPU Speed hat das Spiel ja schließlich auch :-D
Gut, Abspann ist sicherlich etwas hochgegriffen, ich meinte da eher so einen Dankesscreen mit Vorschau der neugierig auf die Vollversion machen soll und nicht einfach nur einen Text. Aber wie gesagt, kann das Gerippe ja zeitnah mal zur Verfügung stellen.
Steuerung ist eben Standard:
Pfeiltasten U,D,L,R
STRG Feuer
M Musik an/aus
P Pause
ESC Intro skip / Spiel verlassen während Titel und Level
Zuletzt geändert von Thomas am Mi 5. Feb 2020, 11:14, 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
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 »

b20a9 hat geschrieben:Hallo Thomas & Zatzen, ich will nur kurz los werden, dass ich sehr beeindruckt bin von eurem Enthusiasmus und der Tatsache an sich, dass ihr für DOS programmiert. Liest sich alles sehr interessant, leider verstehe ich nichts von Programmierung und kann daher nur abstrakt folgen. Aber als großer OPL2/3 Fan freuie ich mich wirklich sehr, dass es noch Menschen wie euch gibt, die das irgendwie am Leben erhalten. Weiter so :-)
Vielen Dank für die Blumen mein Lieber aber momentan macht Zatzen noch die ganze Arbeit. Ich bin da nur beratend tätig was den original Basic Code anging aber den kennt er mittlerweile auch schon besser als ich. Und das Testen auf echter Hardware übernehme ich.
Aber alle großen Projekte haben mal klein angefangen... :-)

Was mich betrifft, bzgl. dieser alten Materie, ich habe mich zu DOS zeiten sehr wohl gefühlt und so sehr wie ich mir damals die Nächte um die Ohren geschlagen habe, war es bis heute nur noch ein einziges mal mit WoW, bei dem ich allerdings froh bin, drüber weg zu sein. Dieses Gefühl von damals vermisse ich einfach und daher habe ich beschlossen, neben einem Retro System das nur zum Konsumieren dient, auch mal aktiv was dafür zu tun. Allerdings lernt es sich mit vierzig nicht mehr so leicht wie mit 14.
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 habe jetzt im Grunde das wesentliche fertig, und möchte das Ding nun zu einer Unit bauen, brauche aber noch Hilfe bei der Timer-Interrupt Routine, wo ich gerne die Sache mit der Zeitaktualisierung machen würde. Ich meine soetwas vor Jahren schonmal gemacht zu haben, oh, ich erinnere mich auch gerade wo, aber falls DOSferatu gerade mitliest könnte er ja nochmal beschreiben wie man die ursprüngliche ISR aufruft - "INT 8" geht ja nicht, das sitzt ja jetzt auf der eigenen.
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 »

Kann ich das mit der Unit und dem Timer übernehmen? Habe das ja bereits mit der btplay6a gemacht. Das mit der alten ISR aufrufen ist so einfach wie simpel. Einfach ein Call oldintvec am Ende der Play Routine, fertig. Überhaupt ist es total simpel mit Pascal. Ein GetIntVec(oldISR, $08) und ein SetIntVec(NewISRProcedure, $08) und fertig. Die btplay Routine ohne öffentliche Deklaration als Interrupt definieren. Und wie gesagt, am Ende der eigenen ISR asm;Call oldintvec;end;
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 gestalte in der Unit entsprechende Schnittstellen und Procedures, so z.B. eine Start-Procedure die den Timer auf die gesamte Player-Routine setzt, aber auch eine auf eine Routine, die nur ein Flag setzt wann der nächste 50 Hz Tick durch ist, so dass man sich selber zusammenbasteln kann wie und wann die Sounddaten berechnet werden.
Ja mit Call oldintvect am Ende der Routine klappt es auch, aber wenn wir nach DOSferatu vorgehen wollen wir diese ISR ja nicht regelmäßig im 50 Hz Takt aufrufen sondern eben nur 18.2 mal die Sekunde, da bin ich noch am Fummeln.
Ich gucke mir gerade einen alten Assembler Code an den ich vor 20 Jahren geschrieben habe, und sehe dass Vorgänge wie SetIntVec und GetIntVec in Assembler nur ein paar Zeilen sind. Ich würde auch bevorzugen, das so in meinen Code zu integrieren, damit die Unit nicht die Dos.TPU braucht.
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 »

Ich habe die Routine auf dem Timer jetzt so:

Code: Alles auswählen

procedure introut_playtick; interrupt; assembler;
asm
  call btplay_playtick
  mov ax, tickervalue
  add tickerwrap, ax
  jc @call_oldint
    mov al, 020h
    out 020h, al
    jmp @end
  @call_oldint:
    call old_intvec
  @end:
end;
"jmp @end" ist nicht sehr elegant, aber hier funktioniert weder iret noch ret.
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 »

So, nun habe ich eine Unit fertig! http://www.zatzen.net/btplayv1.zip
Hoffe es stimmt alles. Mit dabei ist der Converter PIS->PCS. Du kannst überlegen ob Du das Format nutzt.
Vorteile:
- Dateien sind oft nur halb, ein drittel oder sogar ein viertel so groß, je nachdem sogar noch kleiner
- Die Laderoutine vereinfacht sich, das Kompilat ist, wenn man den PCS Loader statt dem PIS Loader nutzt, um gut 1 KB kleiner, und es wird einfach nur alles mit einem mal reingeladen statt kompliziert eingefädelt, was viel schneller ist.
- Man spart sich die Pattern- und Instrument Maps, was ein bisschen mehr Heap freilässt.
Nachteil:
Es ist ein Endformat und kann nicht in den Tracker geladen werden.

Du müsstest noch überlegen wie Du das Timing des Spiels machst. Bisher macht der Timer ja nur die Musik.
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 »

Super! Also zusätzlich zu den "selber zusammen basteln" Routinen gibt es noch immer eine die man nur einmalig VOR der Hauptschleife aufruft und die dann alles im Hintergrund macht? So wie es in der Basic Version war? Weil genau DAS war ja das schöne daran. Einmal los, nicht mehr drum kümmern. Mir erschließt sich da nämlich nicht ganz der Grund warum ich während der Hauptschleife noch mit der Musik rumfrickeln soll.

Du hattest nur gefragt wie man nun noch die alte ISR von 08 aufruft und genau das habe ich geschrieben. Von 18.2 Ticks war da nie die Rede.
...wie man die ursprüngliche ISR aufruft - "INT 8" geht ja nicht, das sitzt ja jetzt auf der eigenen.
Ok, dass Du das vorhast schon aber das habe ich nicht auf das aufrufen ansich bezogen.
Auch ist mir immer noch nicht so ganz klar warum wir unbedingt einen Tick-Devider brauchen damit die blöde Uhr richtig läuft. Was ist so schlimm daran sie mit der RTC zu synchen?

Kann mir vorstellen das Get/SetIntvec nicht viel ASM Code benötigt. Ist doch ncihts weiter als zwei Words in den Speicher zu schreiben, bzw. von dort zu lesen, oder?

Das Format liest sich super! Klar kann es nicht in den Tracker geladen werden. Aber ein unfertiges Stück muss auch nicht in das Spiel geladen werden.
Du müsstest noch überlegen wie Du das Timing des Spiels machst. Bisher macht der Timer ja nur die Musik.
Jetzt aber mal langsam. Ich müsste erstmal überlegen wie ich das Spiel ansich in Pascal mache! Bisher habe ich nur eine gute FM-Musik Unit. Es sei denn ich bekäme die Allegrolib zum laufen. Oder so eine Grafikengine von Dosferatu "lizensieren".
Aber ich sehe das entspannt. Das Spiel wird an die 50Hz angepasst.

Es gab/gibt da so einen Super Mario Bros Port in Pascal. Ich denke ich werde mich ersteinmal daran versuchen den zu vertonen. Der hat nur PC Speaker Sound.
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