atari-home.de - Foren
Software => Coding => Thema gestartet von: guest3744 am Sa 19.09.2015, 12:51:16
-
Hallo, guten Tag.
Ich habe aus eine rcall.src eine rcall.inl erstellt mit einem Assembler für GfaBasic.
Mit welchen Befehl kann ich die dort jetzt einlesen?
Danke.
Gruss
-
Ich hab mal was angehängt (hallo_c.zip.pdf in hallo_c.zip umbenennen und dann auspacken)
GFA-Basic
'
hallo%=GEMDOS(72,100) ! Malloc, Fuer "Hallo Welt"
CHAR{hallo%}=""+CHR$(0)
'
fn$="hw.o"+CHR$(0)
fname%=V:fn$
fhandle&=GEMDOS(61,L:fname%,0) ! Fopen, Datei oeffnen
IF fhandle&>0
'
len%=GEMDOS(66,L:0,fhandle&,2) ! Fseek, laenge
~GEMDOS(66,L:0,fhandle&,0) ! ermitteln
' ~FORM_ALERT(1,"[0][ len: "+STR$(len%)+" ][ OK ]")
'
objekt%=GEMDOS(72,L:len%) ! Malloc, speicher fuer das file
~GEMDOS(63,fhandle&,L:len%,L:objekt%) ! Fread, und laden
~GEMDOS(62,fhandle&) ! Fclose, Datei schliessen
'
' asm$=MKI$(&H4E75)
' asm%=V:asm$
' ~C:asm%()
'
r%=C:objekt%(L:hallo%) ! aufrufen
~GEMDOS(73,objekt%)
hallo$=CHAR{hallo%}
'
~FORM_ALERT(1,"[0][ "+hallo$+" ][ ja Hallo ]")
ELSE
' ~FORM_ALERT(1,"[0][fhandle: "+STR$(fhandle&)+"|fn: "+fn$+"][ oh ]")
ENDIF
~FORM_ALERT(1,"[0][ Programmende ][ OK ]")
~GEMDOS(73,hallo%)
'
END
Assembler
move.l 4(sp),a1 ; Bufferadresse
lea.l hi(pc),a2 ; Stringadresse nach a2
loop:
move.b (a2)+,(a1)+ ; Byteweise kopieren
tst.b (a2) ; bis 0
bne.s loop
move.l #0,d0 ; Rueckgabewert
rts ; und ende
*********
hi: dc.b "Hallo Welt!",0
-
Leider funktioniert das bei mir nur mit Aranym. Unter Hatari und NoSTalgia konnte ich es nicht starten. Warum auch immer.
-
Was macht dieses Programm genau?
Woher ist die Datei mit der Endung "o".
Das Turboasm macht bei mir eine inl-datei
Danke.
Gruss
-
Ich habe es mir erstmal leichter gemacht.
Diese Demo : asm.src habe ich mit Turboasm 1.77 in eine "inl" compiliert (Grafikbalken wandern vertical)
sub d0,d1 ; Number of lines to invert
mulu #20,d1 ; Number of bytes to invert
subq #1,d1 ; Number of bytes to invert
mulu #80,d0 ; Number bytes not to be inverted
add.l d0,a0 ; Address of first byte to be inverted
loop: ; Loop start
not.l (a0)+ ; Long (4-byte) inversion, also a0=a0+4
dbra d1,loop ; Decrement byte count and loop round
rts ; Return to GFA BASIC
Dann habe ich mit meinen Purebasicprogramm diese Binäre "inl" in DATA-Zeilen umgewandelt in eine Textdatei:
DATA 37440,49916,20,21313,49404
DATA 80,53696,18072,20937,65532
DATA 20085,-1
und im Programm RCALL.LST reinkopiert.
Eine Demo für GFA-Basic mit RCall :
CLS
DO
READ a%
EXIT IF a%=-1
a$=a$+MKI$(a%)
LOOP
DATA 37440,49916,20,21313,49404
DATA 80,53696,18072,20937,65532
DATA 20085,-1
'
DIM r%(16)
xb2%=XBIOS(2)
HIDEM
FOR j%=1 TO 10
FOR i%=0 TO 190 STEP 10
r%(0)=i%
r%(1)=399-i%
r%(8)=xb2%
RCALL V:a$,r%()
NEXT i%
NEXT j%
Ich finde diesen Befehl RCALL-Befehl sehr stark, weil man auch den Registern Werte übergeben kann.
Jetzt habe ich endlich ein starkes Team.... :) , GFA-Basic mit Turboasm , ohne eure Hilfe wäre ich nicht so schnell am Ziel.
Nächstes Ziel:
Wie kann man die Binäre inl-Datei in GFA-Basic einlesen und die Daten so übergeben an a% , das es funktionsfähig ist ohne diese Datazeilen? Wer kann das bitte einmal in der obigen Datei reinbringen ?
Die RCALL.inl ist im Anhang (die Endung "pdf" bitte entfernen).
Die Werte enstehen in den Datas so:
1. Bytewert einlesen , den x 256 , dann den 2. Bytewert addieren : 1, Data
3. Bytewert einlesen , den x 256 , dann den 4. bytewert addieren : 2. Data usw...:
Danke.
Gruss
-
Ich lade die Objektdatei direkt ein und rufe diese mit C: auf und übergebe dabei die Adresse eines buffers, in den die Objektdatei dann den Satz "Hallo Welt!" kopiert. Anschließend wird der Satz in einer Alertbox ausgegeben.
-
Das. INL gehört auch in ein Inline. mit GFABASIC 3.x brauchst du keinen Datazeilenmurks.
In deinem Basicprogramm eine Zeile INLINE routine%,<laenge des files>
Auf der Zeile HELP drücken und die *.INl datei darein laden und direkt aufrufen.
Alternativ mit BLOAD oder dgl in den Speicher in einen String oder dgl reinladen.
-
Hallo, danke.
INLINE ADDR%,22
BLOAD "RCALL.INL",ADDR%
DIM R%(16)
XB2%=XBIOS(2)
HIDEM
FOR J%=1 TO 10
FOR I%=0 TO 190 STEP 10
R%(0)=I%
R%(1)=399-I%
R%(8)=XB2%
RCALL ADDR%,R%()
NEXT I%
NEXT J%
Danke.
Gruss
-
ok, jetzt funktioniert auch mein beispiel unter singletos