|
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Matrix
Anmeldungsdatum: 28.06.2011 Beiträge: 10
|
Verfasst am: 04.11.2012, 13:27 Titel: QB Code mit "Def Seg" unter FB Compilieren |
|
|
Hallo,
ich versuche einen QB Code unter FB zu Kompilieren um ein Dos Programm unter Win7 X64 zum laufen zu bringen, ohne auf den DOSBOX Emulator zuzugreifen. Leider Hab ich eine "Def Seg" Anweisung die vom Compiler nicht unterstützt wird; Kommentier ich die aus, startet das Programm zwar, stürtzt nur wieder ab (was ja vorrauszusehen war).
Meine Frage ist jetzt, wie kann ich die Def Seg Anweisung umgehen bzw. FB Kompatibel schreiben, sind meine ersten Versuche in FreeBasic. (-lang qb und so weiter hab ich durch, ist bei qb nur die def anweisung...)
Im Endeffekt soll das nur ein Nachgeschriebener Starfield Simulator Screensaver wie bei Win 3.xx sein. Momentan gehe ich halt den Umweg mit QB und dem Ausführen in der Dosbox, geht zur Not auch, wäre aber schöner das Komplett in FB zu Realisieren...
Jetzt wollt ihr wahrscheinlich meinen Quellcode haben... Aber den behalte ich noch nen moment für mich (zu faul für Strg+v...) _________________ "Die Gefahr, dass der Computer so wird wie der Mensch ist nicht so groß, wie die Gefahr, dass der Mensch so wird wie der Computer." - Konrad Zuse |
|
Nach oben |
|
|
Jojo alter Rang
Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 04.11.2012, 14:10 Titel: |
|
|
Das kommt ganz drauf an, was für eine DEF SEG-Anweisung das war. Dazu sollte man optimalerweise verstehen, was der Code tun sollte. Typische Anwendungsbeispiel waren bei QB z.B. das direkte Schreiben in den VGA-Grafikspeicher (DEF SEG = &HA000), wodurch dann mit PEEK und POKE direkt Pixelwerte gelesen und geschrieben werden konnten. Diese ganzen Anweisungen kann man mit FB-Bordmitteln (POINT und PSET) ersetzen. DEF SEG ist eine 16-Bit-Altlast, die so unter modernen 32-Bit-Systemen nicht existiert, deswegen kann man sie in FB nicht einfach nachbauen. _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
|
|
Nach oben |
|
|
Matrix
Anmeldungsdatum: 28.06.2011 Beiträge: 10
|
Verfasst am: 04.11.2012, 14:27 Titel: |
|
|
Hallo,
dann war mein Codeverständnis doch ganz gut, sah für mich nämlich nach direkten schreiben in den VGA-Speicher aus.
Hier mal der Code:
Code: | DECLARE SUB Init ()
DECLARE SUB MoveStars ()
DECLARE SUB NewStar (N!)
COMMON SHARED Amount
Amount = 256
DIM SHARED StarsX(Amount, 1), StarsY(Amount, 1) AS SINGLE
DIM SHARED SXA(Amount, 1), SYA(Amount, 1)
DEF SEG = &HA000
Init
DO WHILE INKEY$ = ""
MoveStars
LOOP
END
SUB Init
SCREEN 13
FOR X = 1 TO Amount: NewStar X: NEXT X
FOR X = 1 TO 60: OUT &H3C8, X: OUT &H3C9, X + 10: OUT &H3C9, X + 10: OUT &H3C9, X + 10: NEXT X
END SUB
SUB MoveStars
FOR X = 1 TO Amount
POKE StarsX(X, 1) + (INT(StarsY(X, 1)) * 320), 0
StarsX(X, 1) = StarsX(X, 1) - SXA(X, 1)
StarsY(X, 1) = StarsY(X, 1) - SYA(X, 1)
IF StarsX(X, 1) < 4 OR StarsX(X, 1) > 316 THEN NewStar X
IF StarsY(X, 1) < 4 OR StarsY(X, 1) > 196 THEN NewStar X
SXA(X, 1) = SXA(X, 1) + (SXA(X, 1) / 32)
SYA(X, 1) = SYA(X, 1) + (SYA(X, 1) / 32)
'For star shading, use this one:
'POKE StarsX(X, 1) + (INT(StarsY(X, 1)) * 320), (SXA(X, 1) * SXA(X, 1)) + (SYA(X, 1) * SYA(X, 1)) * 3
POKE StarsX(X, 1) + (INT(StarsY(X, 1)) * 320), (X AND 15) + 15
NEXT X
EXIT SUB
END SUB
SUB NewStar (N)
SXA(N, 1) = (RND(1) * 2) - 1
SYA(N, 1) = (RND(1) * 2) - 1
StarsX(N, 1) = 160 - (SXA(N, 1) * 32)
StarsY(N, 1) = 100 - (SYA(N, 1) * 32)
END SUB
|
Also sollte ich mir jetzt in der Referenz Point und PSET durchlesen, wie ich den Code dann anpassen muß ist mir aber bis jetzt noch nicht so ganz klar... _________________ "Die Gefahr, dass der Computer so wird wie der Mensch ist nicht so groß, wie die Gefahr, dass der Mensch so wird wie der Computer." - Konrad Zuse |
|
Nach oben |
|
|
Jojo alter Rang
Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 04.11.2012, 16:09 Titel: |
|
|
Code: | FOR X = 1 TO 60: OUT &H3C8, X: OUT &H3C9, X + 10: OUT &H3C9, X + 10: OUT &H3C9, X + 10: NEXT X
|
Wird zu
Code: |
For X = 1 TO 60
Dim As Integer c = (X + 10) * 255 / 63
Palette X, c, c, c
Next
|
Bin mir nicht ganz sicher, ob es beim Originalcode einen Überlauf gegeben hätte, da hier RGB-Anteile >= 64 rauskamen - die werden entweder auf 63 zurechtgefixt oder abgeschnitten. Wird aber keinen großen Unterschied machen...
Code: | POKE StarsX(X, 1) + (INT(StarsY(X, 1)) * 320), 0 |
Wird zu
Code: |
Pset(StarsX(X, 1), StarsY(X, 1)), 0
|
Code: | POKE StarsX(X, 1) + (INT(StarsY(X, 1)) * 320), (X AND 15) + 15 |
Wird zu
Code: |
Pset(StarsX(X, 1), StarsY(X, 1)), (X AND 15) + 15 |
Alles ungetestet, müsste so aber stimmen. _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
|
|
Nach oben |
|
|
Matrix
Anmeldungsdatum: 28.06.2011 Beiträge: 10
|
Verfasst am: 04.11.2012, 16:59 Titel: |
|
|
Danke! Hab den Code abgeändert, nur nimmt der Compiler unter Lang QB "Dim as Integer" nicht, und unter Deprecated nimmt er den halben QB code nicht...
Die genaue Fehlermeldung:
Zitat: | FbTemp.bas(2 error 134: Only valid in -lang fb or deprecated or fblite, found '='
Dim As Integer c = (X + 10) * 255 / 63 |
Bin Leider in Basic noch nicht fit, sonst wäre das mit Sicherheit einfach zu beheben, aber ich bin FB noch ganz frisch am Lernen, da meine bevorzugte Programmiersprache wohl noch Jahre für ein Update braucht (Stand Win XP...).
Hier der Geupdatete Code:
Code: | DECLARE SUB Init ()
DECLARE SUB MoveStars ()
DECLARE SUB NewStar (N!)
COMMON SHARED Amount
Amount = 256
DIM SHARED StarsX(Amount, 1), StarsY(Amount, 1) AS SINGLE
DIM SHARED SXA(Amount, 1), SYA(Amount, 1)
'DEF SEG = &HA000
Init
DO WHILE INKEY$ = ""
MoveStars
LOOP
END
SUB Init
SCREEN 13
FOR X = 1 TO Amount: NewStar X: NEXT X
For X = 1 TO 60
Dim As Integer c = (X + 10) * 255 / 63
Palette X, c, c, c
Next
END SUB
SUB MoveStars
FOR X = 1 TO Amount
Pset(StarsX(X, 1), StarsY(X, 1)), 0
StarsX(X, 1) = StarsX(X, 1) - SXA(X, 1)
StarsY(X, 1) = StarsY(X, 1) - SYA(X, 1)
IF StarsX(X, 1) < 4 OR StarsX(X, 1) > 316 THEN NewStar X
IF StarsY(X, 1) < 4 OR StarsY(X, 1) > 196 THEN NewStar X
SXA(X, 1) = SXA(X, 1) + (SXA(X, 1) / 32)
SYA(X, 1) = SYA(X, 1) + (SYA(X, 1) / 32)
'For star shading, use this one:
'POKE StarsX(X, 1) + (INT(StarsY(X, 1)) * 320), (SXA(X, 1) * SXA(X, 1)) + (SYA(X, 1) * SYA(X, 1)) * 3
Pset(StarsX(X, 1), StarsY(X, 1)), (X AND 15) + 15
NEXT X
EXIT SUB
END SUB
SUB NewStar (N)
SXA(N, 1) = (RND(1) * 2) - 1
SYA(N, 1) = (RND(1) * 2) - 1
StarsX(N, 1) = 160 - (SXA(N, 1) * 32)
StarsY(N, 1) = 100 - (SYA(N, 1) * 32)
END SUB
|
Schonmal danke für die Hilfe bis jetzt! _________________ "Die Gefahr, dass der Computer so wird wie der Mensch ist nicht so groß, wie die Gefahr, dass der Mensch so wird wie der Computer." - Konrad Zuse |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4599 Wohnort: ~/
|
Verfasst am: 04.11.2012, 17:02 Titel: |
|
|
Zitat: | nur nimmt der Compiler unter Lang QB "Dim as Integer" nicht |
Lässt sich leicht umgehen:
Code: | DIM c AS INTEGER
c = (X + 10) * 255 / 63 |
Das andere ist ein Shortcut dazu, der unter QB noch nicht existiert hat.
edit: kleine Übungsaufgabe (): Passe den Code (ist ja nicht lang) so an, dass er ohne -lang qb läuft. Das wichtigste ist dazu erst einmal, alle vorkommenden Variablen explizit zu deklarieren, bevor sie verwendet werden. Was ich so beim überfliegen gesehen habe, müsste das fast schon reichen. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
Matrix
Anmeldungsdatum: 28.06.2011 Beiträge: 10
|
Verfasst am: 04.11.2012, 17:25 Titel: |
|
|
Super, jetzt läufts. Sieht zwar jetzt lustig aus, im vergleich zur Dosbox, aber das wird schon. Werde jetzt erstmal meine Übungsaufgabe machen und dann mich mit meinen nächsten Problem(n) melden...
PS: Ich hab noch ein anderes Projekt, was ich als Übung von Rapidbatch in Freebasic übersetze, die Gui steht schon zu 99%, ist aber mit firefly keine Kunst... _________________ "Die Gefahr, dass der Computer so wird wie der Mensch ist nicht so groß, wie die Gefahr, dass der Mensch so wird wie der Computer." - Konrad Zuse |
|
Nach oben |
|
|
Cherry
Anmeldungsdatum: 20.06.2007 Beiträge: 249
|
Verfasst am: 14.12.2012, 02:48 Titel: |
|
|
Mach unter den Aufruf von MoveStars mal das hier:
__Sleep ruft hier die FB-Version von Sleep auf, die im Gegensatz zur QB-Version Millisekunden statt ganzer Sekunden entgegennimmt.
Das Problem dass es "lustig aussieht" ist wohl, dass der Code viel schneller abläuft. |
|
Nach oben |
|
|
dreael Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 2508 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 14.12.2012, 12:10 Titel: |
|
|
Da ich auf den meisten Rechnern noch eine MS-DOS 6.22-Partition habe: Müsste direkt einmal die DOS-Version von FreeBasic testen und dabei speziell darauf achten, wie weit all diese 16-bit-DOS-spezifischen Sachen dort noch vorhanden sind, denn von der Plattform her würde dort "-lang qb" noch am meisten Sinn machen.
Ist natürlich klar, dass die Portabilität verloren geht. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
|
Jojo alter Rang
Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 14.12.2012, 12:29 Titel: |
|
|
FB für DOS ist zu FB für alle anderen Systeme in dieser Hinsicht äquivalent (kann aber im Vergleich weniger, z.B. keine Threads). DEF SEG gibt es dort auch nicht, da FB Protected-Mode-Anwendungen erzeugt, die auf linear adressierten Speicher zugreifen. _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
|
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|