Seite 1 von 1

MID$ Anweisung im Atari BASIC

Verfasst: 23.03.2022 17:48
von Andars
Hallo,

ich möchte ein Basic Programm ins Atari Basic portieren.
Das enthält aber MID$-Anweisungen. Wie kann ich so eine Anweisung ins
Atari Basic übersetzen?

Beispiel:

Code: Alles auswählen

 ASC(MID$(A$,J+1,1)
Das ist mir zu undurchsichtig...

Re: MID$ Anweisung im Atari BASIC

Verfasst: 23.03.2022 17:56
von pps
Ich denke da benötigen wir etwas mehr Quellcode drumherum und die Info welcher Basic Dialekt der Ursprung ist.

Das j+1 deutet auf eine Schleife hin und das ,1 auf eine gesuchte Länge von einem Zeichen. Aber das kann auch komplett was anderes sein.

PS: Wenn es das ist, könnte man A$(LEN(A$)/2) ansprechen...

Re: MID$ Anweisung im Atari BASIC

Verfasst: 23.03.2022 18:00
von Andars
Der Code stammt aus dem BASICODE, einer minimal BASIC-Variante.

Hier etwas mehr Code:

Code: Alles auswählen

1000 A=50:GOTO20:REM GRAFIKIMPORT AUS ASCII-DATEI
1010 REM STARTBILDSCHIRM
1020 GOSUB100:HO=8:VE=1:GOSUB110:SR$="IMPORT VON GRAFIKEN":GOSUB150
1030 HO=8:VE=2:GOSUB110:SR$=" AUS ASCII-DATEIEN ":GOSUB150
1040 HO=2:VE=6:GOSUB110:PRINT"AUS WELCHER DATEI LADEN";:INPUTB$
2000 REM EINLESEN DER DATEN
2010 NF=4:NF$=B$:GOSUB 500
2020 GOSUB540:PRINTIN$
2030 IF IN$<>"SCREEN"THEN2900
2040 GOSUB540:PRINTIN$
2050 GOSUB540:PRINTIN$:IFIN$<>"H320"THEN2900
2060 GOSUB540:PRINTIN$:IFIN$<>"V200"THEN2900
2070 GOSUB540:PRINTIN$
2080 GOSUB540:PRINTIN$
2890 GOTO20000
2900 PRINT"KEINE PASSENDE DATEI"
3000 GOSUB 580
3010 STOP
20000 REM ERZEUGEN DER GRAFIK
20010 GOSUB 540:C$=IN$
20100 PRINT C$
20110 D$=MID$(C$,1,1)
20120 E=ASC(D$)-64:PRINTE
20130 D$=MID$(C$,2,1)
20140 F=ASC(D$)-64:PRINTF
20150 G=16*E+F:PRINTG:GOSUB210
20160 GOSUB600:POKE41296,255-G:GOSUB210
22000 GOTO3000

Re: MID$ Anweisung im Atari BASIC

Verfasst: 23.03.2022 18:03
von Andars

Re: MID$ Anweisung im Atari BASIC

Verfasst: 23.03.2022 18:05
von pps
Ich hatte oben auch noch was ergänzt...

A$/2 könnte bei ungeraden Zahlen Probleme bringen, also noch dort den Integer nehmen.

BASICCODE m8 das imho, wie ich ged8 habe.

Re: MID$ Anweisung im Atari BASIC

Verfasst: 24.03.2022 10:08
von Andars
Hier nochmal der Code, in dem das MID$ umgewandelt werden müsste:

Code: Alles auswählen

1000 A=50:GOTO20:REM GRAFIKIMPORT AUS ASCII-DATEI
1010 REM STARTBILDSCHIRM
1020 GOSUB100:HO=8:VE=1:GOSUB110:SR$="IMPORT VON GRAFIKEN":GOSUB150
1030 HO=8:VE=2:GOSUB110:SR$=" AUS ASCII-DATEIEN ":GOSUB150
1040 HO=2:VE=6:GOSUB110:PRINT"AUS WELCHER DATEI LADEN";:INPUTB$
2000 REM EINLESEN DER DATEN
2010 NF=4:NF$=B$:GOSUB 500
2020 GOSUB540:PRINTIN$
2030 IF IN$<>"SCREEN"THEN2900
2040 GOSUB540:PRINTIN$:Z$=IN$
2050 GOSUB540:PRINTIN$:IFIN$<>"H320"THEN2900
2060 GOSUB540:PRINTIN$:IFIN$<>"V200"THEN2900
2070 GOSUB540:PRINTIN$
2080 GOSUB540:PRINTIN$
2890 GOTO20000
2900 PRINT"KEINE PASSENDE DATEI"
3000 GOSUB 580
3010 REM STOP
20000 REM ERZEUGEN DER GRAFIK
20005 GOSUB600:SR$=Z$:HO=0  :VE=.9:GOSUB650
20010 H=41296:FORL=0TO199
20020 FORK=0TO  1:GOSUB540:A$=IN$
20030 FORJ=0TO38STEP2
20040 M=16*(ASC(MID$(A$,J+1,1))-64)+ASC(MID$(A$,J+2,1))-64:POKE H,M
20050 H=H+1:NEXTJ
20060 NEXTK:NEXTL:GOSUB210
22000 GOTO3000
Das ist für mich leider zu undurchsichtig...

Re: MID$ Anweisung im Atari BASIC

Verfasst: 24.03.2022 10:36
von rvetter
Hallo,

wie wäre es mit

Code: Alles auswählen

20040 M=16*(ASC(A$(J+1,J+1))-64)+ASC(A$(J+2,J+2))-64:POKE H,M
Ich hab selber nie mit BASIC programmiert aber ein Beispiel aus dem ATARI BASIC Reference Manual deutet darauf hin, daß

Code: Alles auswählen

STRING(ANFANG,ENDE)
in etwa

Code: Alles auswählen

MID$(STRING,ANFANG,ANZAHL)
bei ENDE=ANFANG+ANZAHL-1 entspricht.

Gruß, Rene

Re: MID$ Anweisung im Atari BASIC

Verfasst: 24.03.2022 12:01
von Andars
Der Code:

Code: Alles auswählen

20040 M=16*(ASC(A$(J+1,J+1))-64)+ASC(A$(J+2,J+2))-64:POKE H,M
funktioniert leider nicht...

Re: MID$ Anweisung im Atari BASIC

Verfasst: 24.03.2022 12:35
von rvetter
Vielleicht hilft es, 'M' an der Stelle mal mit einem Print ausgeben zu lassen. Das läßt dann Rückschlüsse zu, ob es dem erwarteten Wert entspricht. Bzw. A$, A$(J+1,J+2) und M ausgeben und dann so modifizieren, daß es am Ende funktioniert.

Re: MID$ Anweisung im Atari BASIC

Verfasst: 24.03.2022 18:19
von DjayBee
Hast du daran gedacht, dass im Atari BASIC alle Strings auf ihre maximal benötigte Länge DIMensioniert werden müssen?

Der Hinweis von rvetter ist für das eigentliche Problem genau richtig.
MicrosoftBASIC.png
MicrosoftBASIC.png (5.45 KiB) 3052 mal betrachtet
AtariBASIC.png
AtariBASIC.png (3.75 KiB) 3052 mal betrachtet

Re: MID$ Anweisung im Atari BASIC

Verfasst: 25.03.2022 14:36
von Andars
Ja, an die DIM-Anweisung habe ich gedacht.

Ich suche noch immer einen Ersatz für folgenden Ausdruck:

Code: Alles auswählen

M=16*(ASC(MID$(A$,J+1,1))
,

also ohne MID$-Anweisung.

Re: MID$ Anweisung im Atari BASIC

Verfasst: 25.03.2022 14:51
von pps
Hatte Atari Basic nicht die Angewohnheit, dass String(0) das erste Element war? Dann muss das +1 einfach weg.

Re: MID$ Anweisung im Atari BASIC

Verfasst: 25.03.2022 15:14
von MichaG

Code: Alles auswählen

10 DIM A$(20)
20 A$="ABCDEFGHIJ"
30 J=5
40 ? A$(J+1,J+1)
50 M=16*ASC(A$(J+1,J+1))
60 ? M

READY
RUN
F
1120
Siehe Zeile 50

Re: MID$ Anweisung im Atari BASIC

Verfasst: 25.03.2022 23:02
von atarixle
Andars hat geschrieben:
23.03.2022 17:48
Hallo,

ich möchte ein Basic Programm ins Atari Basic portieren.
Das enthält aber MID$-Anweisungen. Wie kann ich so eine Anweisung ins
Atari Basic übersetzen?

Beispiel:

Code: Alles auswählen

 ASC(MID$(A$,J+1,1)
Das ist mir zu undurchsichtig...
Die Zeile sieht 1:1 in Atari-BASIC übersetzt so aus:

Code: Alles auswählen

ASC(A$(J+1, J+1))
und kann auf

Code: Alles auswählen

ASC(A$(J+1))
gekürzt werden, da es für die umklammernde ASC-Funktion keine Länge des String benötigt.
Zur Erklärung: MID$ ist eine in Atari ungebräuchliche Anweisung. J+1 ist die Stelle im String und 1 ist die Länge. In Atari BASIC wäre das von Stelle J+1 bis Stelle (J+1)-1+1. Da man für ASC keine Länge benötigt, weil der ASC-Wert nur einer Stelle, nämlich die ersten, als Wert zurückgegeben wird, kann man J+1 weglassen.
Andars hat geschrieben:
25.03.2022 14:36
Ja, an die DIM-Anweisung habe ich gedacht.

Ich suche noch immer einen Ersatz für folgenden Ausdruck:

Code: Alles auswählen

M=16*(ASC(MID$(A$,J+1,1))
,

also ohne MID$-Anweisung.

Code: Alles auswählen

M=16*ASC(A$(J+1))
pps hat geschrieben:
25.03.2022 14:51
Hatte Atari Basic nicht die Angewohnheit, dass String(0) das erste Element war? Dann muss das +1 einfach weg.
Nein.

Weitere Äquivalente:

Code: Alles auswählen

LEFT$(A$, 10) => A$(1, 10)
RIGHT(A$, 10) => A$(10)

Re: MID$ Anweisung im Atari BASIC

Verfasst: 31.03.2022 21:42
von atarixle
Es könnte auch

Code: Alles auswählen

RIGHT$(A$, 10) => A$(LEN(A$)-10+1)
heißen, je nach BASIC-Dialekt.