atari-home.de - Foren
Software => Coding => Thema gestartet von: guest3744 am Mo 21.09.2015, 11:56:20
-
Hallo, guten Tag.
Ich hab ein Problem mit Schleifen , wenn ich das Programm zu INL übertragen möchte für GFA-Basic.
Der Button dafür ist grau, kann man also nicht betätigen, nur wenn ich die SChleife rausnehme.
movea.l D0,A0
move.l #0,D1
move.l #0,D0
move.b #99,D0
loop:
add.b #1,D1
cmp.b D0,D1
beq.s ende
adda.l #1,A0
move.b #129,(A0)
bra loop >>>>>>>>>>>>>>>>>> geändert von jmp nach bra
ende:
rts
END
Wie kann ich solche Verweise im ASM in INL umwandeln, damit es funktioniert:
cmp #1,d0
bne ungleich
beq gleich
bhi groesser
blt kleiner
Danke.
Gruss
-
Das Programm muß PC-relativ geschrieben sein.
Die Bcc - Sprünge sind nicht das Problem (die sind PC-relativ).
Es dürfte an der JMP Instruktion liegen. Mach' da ein BRA oder ein JMP loop(PC) draus.
-
Änder den
jmp loop
nach
bra loop
dann klappt es
-
Ah...danke.
Jetzt funktioniert es mit bra.
Gruss
-
Ich möchte bitte eine INL anlegen, wo ich mehrere kleine Unterprogramme habe die ich mit JSR aus der Hauptroutine anspringen möchte und mit RTS zurückkehren zur Hauptroutine.
Wie kann man das bewerkstelligen ?
Danke.
Gruss
-
Ich möchte bitte eine INL anlegen, wo ich mehrere kleine Unterprogramme habe die ich mit JSR aus der Hauptroutine anspringen möchte und mit RTS zurückkehren zur Hauptroutine.
Wie kann man das bewerkstelligen ?
Danke.
Gruss
so:
start: bsr eins
jsr zwei(pc)
jsr drei * das geht allerdings nicht
rts
eins: * mach was
rts
zwei: * mach was anderes
rts
drei: * mach was ganz verrücktes
rts
Nicht daß es keinen Spaß machen würde, aber glaubst Du nicht, daß es möglicherweise effektiver für dich wäre, ein anständiges Assembler-Buch durchzuackern anstatt uns jeden Befehl einzeln aus der Nase zu ziehen? ;)
-
Ein Buch habe ich schon von Markt und Technik.
Da steht aber so etwas für den GFA-INL nicht drin.
Dieses bsr ist also ein Ersatz für das jsr damit die GFA-INL angelegt werden kann von Turboasm?
Ich sehe immer nur einen Zusammenhang mit den Befehlen zu Turboasm mit dem Häkchen für GFA-INL.
Danke.
Gruss
-
zB
INLINE inl%,12345
'
wert1=@eins(par1,par2)
wert2=@zwei(par1,par2)
'
END
FUNCTION eins(p1,p2)
$F%
RETURN C:inl%(L:1,L:p1,L:p2)
ENDFUNC
FUNCTION zwei(p1,p2)
$F%
RETURN C:inl%(L:2,L:p1,L:p2)
ENDFUNC
move.l 4(sp),d1 ; Funktionsnummer
cmpi.l #1,d1
beq eins
cmpi.l #2,d1
beq zwei
rts
eins:
move.l 8(sp), ; Parameter 1
move.l 12(sp), ; Parameter 2
move.l bla,d0 ; Rueckgabewert
rts
zwei:
move.l 8(sp), ; Parameter 1
move.l 12(sp), ; Parameter 2
move.l bla,d0 ; Rueckgabewert
rts
edit: fehler korrigiert
-
Da steht aber so etwas für den GFA-INL nicht drin.
Da steht aber bestimmt was über PC-relative Adressierung drin (darum geht's nämlich bei der inline-Sache).
Sonst schmeiß' es besser weg...
-
Hallo, danke.
Das ist ja ein anderer Aufruf mit Call, wunderbar.
Was bedeutet bitte das $F% im GFA?
Wird in d0 beim ASM-Programm immer der Rückgabewert reingepackt?
In Zeile 4 beim ASM muss bestimmt eine #2 rein?
Danke.
Gruss
-
Über Inline steht etwas drin, aber nicht im Bezug mit GFA-Basic.
Ist von 1992, Gibt nur noch wenige davon in deutsch, hat sonst viele Beispiele drin mit den
ganzen BIOS,GEM,XBIOS und VDI in ASM.
Für mich geht es darum , die ganzen ASM-Sachen mit GFA-Basic zu nutzen.
Gruss
-
Beim Aufruf dieser beiden sagt GFA-Basic : "Feld nicht dimensioniert" :
wert1=eins(par1,par2)
wert2=zwei(par1,par2)
Warum muss ein Funktionsaufruf als Feld dimensioniert werden ?
Danke.
Gruss
-
Hallo, danke.
Das ist ja ein anderer Aufruf mit Call, wunderbar.
Was bedeutet bitte das $F% im GFA?
Wird in d0 beim ASM-Programm immer der Rückgabewert reingepackt?
In Zeile 4 beim ASM muss bestimmt eine #2 rein?
Danke.
Gruss
$F% besagt, das der Rückgabewert vom Compiler in eine integer gewandelt wird. Standard wird eine Float zurückgegeben (langsamer). Ich schreib das meist automatisch in Funktionen.
Beim Aufruf mittels C: werden die Parameter nach C-konvention über den Stack gereicht und die aufgerufene Funktion (hier das inline) gibt den Rückgabewert stets in d0 zurück.
Ja, in Zeile 4 muss ein #2 hin.
-
Beim Aufruf dieser beiden sagt GFA-Basic : "Feld nicht dimensioniert" :
wert1=eins(par1,par2)
wert2=zwei(par1,par2)
Warum muss ein Funktionsaufruf als Feld dimensioniert werden ?
Danke.
Gruss
Sorry, mein Fehler. Es muss
wert1=@eins(par1,par2)
wert2=@zwei(par1,par2)
heissen.
-
Ja danke für die Info.
Bei den Übergabewerten , braucht da kein % dran?
Danke.
Gruss
-
Das musst Du wissen
-
Hallo, danke laufkopf.
Dein Programm läuft wunderbar.
Jetzt habe ich für GFA-Basic genug Varianten mit ASM , die auch überzeugend funktionieren.
Danke.
Gruss
-
Kein Thema.
Für zwei, drei Unterfunktionen ist das ja ok. Sollten es jedoch mehr werden, bietet sich eine Sprungtabelle an.
move.l 4(SP),D0
asl.w #1,D0
lea tabelle(PC),A0
movea.w 0(A0,D0.w),A1
suba.w (A1),A0
jmp (A0)
rts
eins:
rts
zwei:
rts
drei:
rts
vier:
rts
fuenf:
rts
tabelle: DC.W 0
DC.W tabelle-eins
DC.W tabelle-zwei
DC.W tabelle-drei
DC.W tabelle-vier
DC.W tabelle-fuenf
END
-
Habe es in GFA umgesetzt als INL:
CLS
INLINE inl%,100
BLOAD "d:\inl\ctabelle.inl",inl%
par1%=1
wert1%=@eins(par1%)
PRINT wert1%
'
PAUSE 50
END
'
FUNCTION eins(p1%)
$F%
RETURN C:inl%(L:p1%)
ENDFUNC
'
Stürzt ab mit Bömbchen....
move.l 4(SP),D0
asl.w #1,D0
lea tabelle(PC),A0
movea.w 0(A0,D0.w),A1
suba.w (A1),A0
jmp (A0)
rts
eins:
move.l #100,D0
rts
zwei:
move.l #200,D0
rts
drei:
move.l #300,D0
rts
vier:
move.l #400,D0
rts
fuenf:
move.l #500,D0
rts
tabelle: DC.W 0
DC.W tabelle-eins
DC.W tabelle-zwei
DC.W tabelle-drei
DC.W tabelle-vier
DC.W tabelle-fuenf
END
Ich habe immer den Wert erwartet von D0 je nach aufruf der Tabelle.
Oder mache ich da einen Fehler?
Danke.
Gruss
-
Der Assemblerteil gehört alles zusammen übersetzt.
Ich probier das gleich aber selbst mal aus.
-
Wo liegt der Fehler, ich finde ihn nicht?
Meine Frage auch, wie wird der Text erkannt von der Sprungvariable? Ich sehe das nicht raus.
Gruss
-
So funktioniert es
move.l 4(SP),D0
asl.w #2,D0
lea tabelle(PC),A0
move.l a0,a1
add d0,a1
sub.l (A1),A0
jmp (A0)
rts
eins:
move.l #100,d0
rts
zwei:
rts
drei:
rts
vier:
rts
fuenf:
rts
tabelle: DC.L 1
DC.L tabelle-eins
DC.L tabelle-zwei
DC.L tabelle-drei
DC.L tabelle-vier
DC.L tabelle-fuenf
-
Ich habe immer alles übersetzt.
Einmal nur die Zahlen unten rein und dann einmal den Text unten rein.
Meine Frage auch, wie wird der Text erkannt von der Sprungvariable? Ich sehe das nicht raus.
Gruss
move.l 4(SP),D0
gewünschte Funktion nach D0 holen
asl.w #2,D0
mit 4 multiplizieren
lea tabelle(PC),A0
Adresse der Tabelle nach A0
move.l a0,a1
und kopie nach A1
add D0,A1
Addiere D0 zu A1 und schreibe das Ergebnis nach A1. I(n A1 steht die Adresse der Tabelle. in D0 die gewünschte Funktion x 4 um den Offset in der Tabelle, welche Longs beinhaltet auszugleichen)
sub.l (A1),A0
Subtrahiere den Wert auf den die Adresse in A1 zeigt mit A0 und schreibe das Ergebnis nach A0
jmp (A0)
Springe zu der Funktion dessen Adresse in A0 steht
tabelle: DC.L 1
DC.L tabelle-eins
DC.L tabelle-zwei
DC.L tabelle-drei
DC.L tabelle-vier
DC.L tabelle-fuenf
Die Tabelle beinhaltet nach dem Assemblieren die Differenzen zwischen Anfangsadresse der Tabelle und den Funktionen.
-
Es funktioniert jetzt mit deinem neuen Programm...., es war mein fehler.
Deine Antwort #21 am: Heute um 20:43:37
Gruss
-
Im Anhang meine Version, welche funktioniert zum Vergleich
-
Alle 5 Werte werden nacheinander ausgegeben.
Der komplette Data-Kopf ab Malloc wurde vom Turboasm erzeugt, wusste gar nicht das der es kann.
Ist gut zum weitergeben gedacht.
Danke.
Gruss
CLS
inl%=MALLOC(84)
FOR i%=0 TO 83
READ b%
POKE inl%+i%,b%
NEXT i%
DATA &20,&2F,&00,&04,&E5,&40,&41,&FA,&00,&34,&22,&48,&D2,&C0,&91,&D1
DATA &4E,&D0,&4E,&75,&20,&3C,&00,&00,&00,&64,&4E,&75,&20,&3C,&00,&00
DATA &00,&C8,&4E,&75,&20,&3C,&00,&00,&01,&2C,&4E,&75,&20,&3C,&00,&00
DATA &01,&90,&4E,&75,&20,&3C,&00,&00,&01,&F4,&4E,&75,&00,&00,&00,&01
DATA &00,&00,&00,&28,&00,&00,&00,&20,&00,&00,&00,&18,&00,&00,&00,&10
DATA &00,&00,&00,&08
'
FOR z%=1 TO 5
par1%=z%
wert1%=@eins(par1%)
PRINT wert1%
PAUSE 50
NEXT z%
END
'
FUNCTION eins(p1%)
$F%
RETURN C:inl%(L:p1%)
ENDFUNC
'
-
Hallo, welcher Texteil ist bitte unten mit für den Aufruf entscheidend?
Ist es das Wort : tabelle?
Danke.
Gruss
-
Hallo, welcher Texteil ist bitte unten mit für den Aufruf entscheidend?
Ist es das Wort : tabelle?
Danke.
Gruss
siehe #20 (http://forum.atari-home.de/index.php?topic=12304.msg99001#msg99001)
-
Danke.
Jetzt hat es gefunkt.
Gruss
-
So funktioniert es
move.l 4(SP),D0
asl.w #2,D0
lea tabelle(PC),A0
move.l a0,a1
add d0,a1
sub.l (A1),A0
jmp (A0)
rts
eins:
move.l #100,d0
rts
zwei:
rts
drei:
rts
vier:
rts
fuenf:
rts
tabelle: DC.L 1
DC.L tabelle-eins
DC.L tabelle-zwei
DC.L tabelle-drei
DC.L tabelle-vier
DC.L tabelle-fuenf
Geht auch etwas einfacher..
move.l 4(SP),D0
add.l d0,d0
add.l d0,d0
jsr tabelle(pc,d0)
rts
tabelle: bra.w dummy
bra.w eins
bra.w zwei
bra.w drei
bra.w vier
bra.w fuenf
dummy: rts
eins: move.l #100,d0
rts
zwei: move.l #200,d0
rts
drei: move.l #300,d0
rts
vier: move.l #400,d0
rts
fuenf: move.l #500,d0
rts
-
Immer wieder etwas neues.
Danke.
Gruss