Autor Thema: Was hindert den Turboasm, eine INL für ds GFA-basic zu erstellen.  (Gelesen 27226 mal)

0 Mitglieder und 1 Gast betrachten dieses Thema.

guest3744

  • Gast
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.

Zitat
                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

Offline mfro

  • Benutzer
  • Beiträge: 1.640
Re: Was hindert den Turboasm, eine INL für ds GFA-basic zu erstellen.
« Antwort #1 am: Mo 21.09.2015, 12:12:26 »
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.
And remember: Beethoven wrote his first symphony in C

Offline laufkopf

  • Benutzer
  • Beiträge: 347
Re: Was hindert den Turboasm, eine INL für ds GFA-basic zu erstellen.
« Antwort #2 am: Mo 21.09.2015, 12:13:38 »
Änder den
jmp loopnach
bra loopdann klappt es

guest3744

  • Gast
Re: Was hindert den Turboasm, eine INL für ds GFA-basic zu erstellen.
« Antwort #3 am: Mo 21.09.2015, 13:07:34 »
Ah...danke.
Jetzt funktioniert es mit bra.

Gruss

guest3744

  • Gast
Re: Was hindert den Turboasm, eine INL für ds GFA-basic zu erstellen.
« Antwort #4 am: Mo 21.09.2015, 13:51:08 »
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

Offline mfro

  • Benutzer
  • Beiträge: 1.640
Re: Was hindert den Turboasm, eine INL für ds GFA-basic zu erstellen.
« Antwort #5 am: Mo 21.09.2015, 14:28:18 »
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? ;)
And remember: Beethoven wrote his first symphony in C

guest3744

  • Gast
Re: Was hindert den Turboasm, eine INL für ds GFA-basic zu erstellen.
« Antwort #6 am: Mo 21.09.2015, 15:14:51 »
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

Offline laufkopf

  • Benutzer
  • Beiträge: 347
Re: Was hindert den Turboasm, eine INL für ds GFA-basic zu erstellen.
« Antwort #7 am: Mo 21.09.2015, 15:31:26 »
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
« Letzte Änderung: Mo 21.09.2015, 17:05:23 von laufkopf »

Offline mfro

  • Benutzer
  • Beiträge: 1.640
Re: Was hindert den Turboasm, eine INL für ds GFA-basic zu erstellen.
« Antwort #8 am: Mo 21.09.2015, 16:32:25 »
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...
And remember: Beethoven wrote his first symphony in C

guest3744

  • Gast
Re: Was hindert den Turboasm, eine INL für ds GFA-basic zu erstellen.
« Antwort #9 am: Mo 21.09.2015, 16:33:48 »
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

guest3744

  • Gast
Re: Was hindert den Turboasm, eine INL für ds GFA-basic zu erstellen.
« Antwort #10 am: Mo 21.09.2015, 16:38:37 »
Ü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

guest3744

  • Gast
Re: Was hindert den Turboasm, eine INL für ds GFA-basic zu erstellen.
« Antwort #11 am: Mo 21.09.2015, 16:57:08 »
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

Offline laufkopf

  • Benutzer
  • Beiträge: 347
Re: Was hindert den Turboasm, eine INL für ds GFA-basic zu erstellen.
« Antwort #12 am: Mo 21.09.2015, 17:02:53 »
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.
« Letzte Änderung: Mo 21.09.2015, 17:06:56 von laufkopf »

Offline laufkopf

  • Benutzer
  • Beiträge: 347
Re: Was hindert den Turboasm, eine INL für ds GFA-basic zu erstellen.
« Antwort #13 am: Mo 21.09.2015, 17:04:11 »
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.


guest3744

  • Gast
Re: Was hindert den Turboasm, eine INL für ds GFA-basic zu erstellen.
« Antwort #14 am: Mo 21.09.2015, 17:08:36 »
Ja danke für die Info.

Bei den Übergabewerten , braucht da kein % dran?

Danke.
Gruss

Offline laufkopf

  • Benutzer
  • Beiträge: 347
Re: Was hindert den Turboasm, eine INL für ds GFA-basic zu erstellen.
« Antwort #15 am: Mo 21.09.2015, 17:14:58 »
Das musst Du wissen

guest3744

  • Gast
Re: Was hindert den Turboasm, eine INL für ds GFA-basic zu erstellen.
« Antwort #16 am: Mo 21.09.2015, 17:56:49 »
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

Offline laufkopf

  • Benutzer
  • Beiträge: 347
Re: Was hindert den Turboasm, eine INL für ds GFA-basic zu erstellen.
« Antwort #17 am: Mo 21.09.2015, 18:17:06 »
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

guest3744

  • Gast
Re: Was hindert den Turboasm, eine INL für ds GFA-basic zu erstellen.
« Antwort #18 am: Mo 21.09.2015, 19:32:21 »
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             

Offline laufkopf

  • Benutzer
  • Beiträge: 347
Re: Was hindert den Turboasm, eine INL für ds GFA-basic zu erstellen.
« Antwort #19 am: Mo 21.09.2015, 19:52:12 »
Der Assemblerteil gehört alles zusammen übersetzt.
Ich probier das gleich aber selbst mal aus.