atari-home.de - Foren

Software => Coding => Thema gestartet von: guest3744 am Mo 21.09.2015, 11:56:20

Titel: Was hindert den Turboasm, eine INL für ds GFA-basic zu erstellen.
Beitrag 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.

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
Titel: Re: Was hindert den Turboasm, eine INL für ds GFA-basic zu erstellen.
Beitrag von: mfro 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.
Titel: Re: Was hindert den Turboasm, eine INL für ds GFA-basic zu erstellen.
Beitrag von: laufkopf am Mo 21.09.2015, 12:13:38
Änder den
jmp loopnach
bra loopdann klappt es
Titel: Re: Was hindert den Turboasm, eine INL für ds GFA-basic zu erstellen.
Beitrag von: guest3744 am Mo 21.09.2015, 13:07:34
Ah...danke.
Jetzt funktioniert es mit bra.

Gruss
Titel: Re: Was hindert den Turboasm, eine INL für ds GFA-basic zu erstellen.
Beitrag von: guest3744 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
Titel: Re: Was hindert den Turboasm, eine INL für ds GFA-basic zu erstellen.
Beitrag von: mfro 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? ;)
Titel: Re: Was hindert den Turboasm, eine INL für ds GFA-basic zu erstellen.
Beitrag von: guest3744 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
Titel: Re: Was hindert den Turboasm, eine INL für ds GFA-basic zu erstellen.
Beitrag von: laufkopf 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
Titel: Re: Was hindert den Turboasm, eine INL für ds GFA-basic zu erstellen.
Beitrag von: mfro 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...
Titel: Re: Was hindert den Turboasm, eine INL für ds GFA-basic zu erstellen.
Beitrag von: guest3744 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
Titel: Re: Was hindert den Turboasm, eine INL für ds GFA-basic zu erstellen.
Beitrag von: guest3744 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
Titel: Re: Was hindert den Turboasm, eine INL für ds GFA-basic zu erstellen.
Beitrag von: guest3744 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
Titel: Re: Was hindert den Turboasm, eine INL für ds GFA-basic zu erstellen.
Beitrag von: laufkopf 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.
Titel: Re: Was hindert den Turboasm, eine INL für ds GFA-basic zu erstellen.
Beitrag von: laufkopf 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.

Titel: Re: Was hindert den Turboasm, eine INL für ds GFA-basic zu erstellen.
Beitrag von: guest3744 am Mo 21.09.2015, 17:08:36
Ja danke für die Info.

Bei den Übergabewerten , braucht da kein % dran?

Danke.
Gruss
Titel: Re: Was hindert den Turboasm, eine INL für ds GFA-basic zu erstellen.
Beitrag von: laufkopf am Mo 21.09.2015, 17:14:58
Das musst Du wissen
Titel: Re: Was hindert den Turboasm, eine INL für ds GFA-basic zu erstellen.
Beitrag von: guest3744 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
Titel: Re: Was hindert den Turboasm, eine INL für ds GFA-basic zu erstellen.
Beitrag von: laufkopf 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
Titel: Re: Was hindert den Turboasm, eine INL für ds GFA-basic zu erstellen.
Beitrag von: guest3744 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             
Titel: Re: Was hindert den Turboasm, eine INL für ds GFA-basic zu erstellen.
Beitrag von: laufkopf am Mo 21.09.2015, 19:52:12
Der Assemblerteil gehört alles zusammen übersetzt.
Ich probier das gleich aber selbst mal aus.
Titel: Re: Was hindert den Turboasm, eine INL für ds GFA-basic zu erstellen.
Beitrag von: guest3744 am Mo 21.09.2015, 19:56:05
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
Titel: Re: Was hindert den Turboasm, eine INL für ds GFA-basic zu erstellen.
Beitrag von: laufkopf am Mo 21.09.2015, 20:43:37
So funktioniert es
Zitat
         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
         
Titel: Re: Was hindert den Turboasm, eine INL für ds GFA-basic zu erstellen.
Beitrag von: laufkopf am Mo 21.09.2015, 21:04:16
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),D0gewünschte Funktion nach D0 holen
asl.w #2,D0mit 4 multiplizieren
lea tabelle(PC),A0Adresse der Tabelle nach A0
move.l a0,a1und kopie nach A1
add D0,A1Addiere 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),A0Subtrahiere 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.
Titel: Re: Was hindert den Turboasm, eine INL für ds GFA-basic zu erstellen.
Beitrag von: guest3744 am Mo 21.09.2015, 22:08:02
Es funktioniert jetzt mit deinem neuen Programm...., es war mein fehler.
Deine Antwort #21 am: Heute um 20:43:37


Gruss
Titel: Re: Was hindert den Turboasm, eine INL für ds GFA-basic zu erstellen.
Beitrag von: laufkopf am Mo 21.09.2015, 22:30:35
Im Anhang meine Version, welche funktioniert zum Vergleich
Titel: Re: Was hindert den Turboasm, eine INL für ds GFA-basic zu erstellen.
Beitrag von: guest3744 am Mo 21.09.2015, 22:54:58
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
'
Titel: Re: Was hindert den Turboasm, eine INL für ds GFA-basic zu erstellen.
Beitrag von: guest3744 am Mo 21.09.2015, 23:27:21
Hallo, welcher Texteil  ist bitte unten mit für den Aufruf entscheidend?
Ist es das Wort : tabelle?

Danke.
Gruss
Titel: Re: Was hindert den Turboasm, eine INL für ds GFA-basic zu erstellen.
Beitrag von: laufkopf am Di 22.09.2015, 06:17:42
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)
Titel: Re: Was hindert den Turboasm, eine INL für ds GFA-basic zu erstellen.
Beitrag von: guest3744 am Di 22.09.2015, 10:16:50
Danke.
Jetzt hat es gefunkt.

Gruss
Titel: Re: Was hindert den Turboasm, eine INL für ds GFA-basic zu erstellen.
Beitrag von: laufkopf am Sa 03.10.2015, 21:16:31
So funktioniert es
Zitat
         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
Titel: Re: Was hindert den Turboasm, eine INL für ds GFA-basic zu erstellen.
Beitrag von: guest3744 am Sa 03.10.2015, 23:21:34
Immer wieder etwas neues.

Danke.

Gruss