AMIGA-Bascoder ‑ es gibt ihn doch

 




Karsten Schenk stellte uns in K67.78 seine Aktualisierung des Bascoders für DOS-PC vor. Dort erwähnte er auch. daß es auf dem AMIGA keine Version des Computer-Esperantos gibt.

Das hat er nun selbst geändert: für das Basic, das auf der "Extras 1.3"-Diskette ausgeliefert wurde, hat er einen Bascoder geschrieben, der die Festlegungen der Version 3C erfüllt, mit zwei Ein­schrän­kun­gen:

Wie wir es auch vom JOYCE-Bascoder kennen, verzichtet er völlig auf die Kassettenarbeit, der AMIGA hat von Haus aus kein Kassetteninterface und inzwischen stehen genügend andere Übertragungsmöglichkeiten für die ASCII-Listings ab Zeile 1000 zur Verfügung.

Da der AMIGA fensterorientiert arbeitet, kann einem Buchstaben auf dem Bildschirm nicht so unmittelbar wie auf vielen 8-bit-Heimcomputern eine (feste) Position im Speicher zugeordnet werden, daher ist es (vorläufig?) nicht möglich, die Funktion zum Zurücklesen eines Zeichens aus dem Bildschirm (GOSUB 220) zu nutzen.

Außerdem bemerkt Karsten, daß das Basic (und mit ihm dann natürlich BasiCode) mit steigender Betriebssystemnummer instabiler wird, auf meinem 500+ mit Umschaltmöglichkeit zwischen Kickstart 1.3 und 2.0, den ich vorigen Herbst auf dem Flohmarkt gekauft habe, liefen jedoch die getesteten Programme ohne Probleme, sowohl hinsichtlich der Grafik und der Farben als auch des Sounds.

 

Thomas Rademacher  //  November 2007

 

Hier geht's zum Download: BasCoder für AMIGA

     

 

REM Basicode fuer Amiga®, 30457, Karsten Schenk
REM graphics.bmap wird benötigt
REM Benutzung auf eigene Verantwortung.
 LIBRARY "graphics.library"
 RANDOMIZE TIMER
 CLEAR ,&O70000
 SCREEN 1,328,220,4,1
    WINDOW 2,"            BasiCode-3C auf AMIGA®",,0,1
    PALETTE 0,0,0,0
    PALETTE 2,0/15,0/15,0/15
    PALETTE 3,0/15,0/15,11/15     : REM blau
    PALETTE 4,11/15,0/15,0/15     : REM rot
    PALETTE 5,.3,0,.4             : REM violett
    PALETTE 6,0/15,6/15,0/15      : REM gruen
    PALETTE 7,5/15,9/15,12/15     : REM hellblau
    PALETTE 8,14/15,11/15,0/15    : REM gelb
    PALETTE 9,15/15,15/15,15/15   : REM weiß
GOTO 1000
20 CLEAR
   ON ERROR GOTO fehler
   CC(0)=7:CC(1)=0
   HG=264 :VG=198
   HO=41-1:VE=25-1
   GOSUB 100
   GOTO 1010
100 COLOR CC(0)+2,CC(1)+2
    CLS
    RETURN
110 COLOR CC(0)+2, CC(1)+2
    LOCATE VE+1, HO+1
    RETURN
120 HO=POS(0)-1
    VE=CSRLIN-1
    RETURN
150 COLOR CC(1)+2,CC(0)+2
    PRINT "     "+SR$+"     ";
    COLOR CC(0)+2,CC(1)+2
    RETURN
200 IN$=""
    IN$=INKEY$
201 IN=0
    IF IN$<>"" THEN
     IN=ASC(UCASE$(IN$))
         IF IN<28 THEN
            IN=IN*(-1)
                IF IN=-9 OR IN=-13 THEN
                 IN=ABS(IN)
                END IF
         END IF
         IF IN>=129 AND IN<=138 THEN
            IN=(IN-128)*(-1)
         END IF
     WHILE INKEY$<>"":WEND
         IF IN=28 THEN
            IN=31
         ELSEIF IN=29 THEN
            IN=30
         ELSEIF IN=30 THEN
            IN=29
         ELSEIF IN=31 THEN
            IN=28
         END IF
    END IF
    RETURN
210 IN$=INPUT$(1)
    GOSUB 201
    RETURN
220 REM Weil der Amiga® keinen Textmodus hat, ist die folgende
    REM Routine nur eine Attrappe
    IN=ASC("A")
    IN$="a"
    CN=ASC("a")-ASC("A")
    RETURN
250 BEEP
    RETURN
260 RV=RND
    RETURN
270 FR=FRE(0)
    RETURN
280 IF FR=0 THEN BREAK ON
    IF FR=1 THEN BREAK OFF
    RETURN
300 IF SR<0 THEN
     SR$=STR$(SR)
    ELSE
     SR$=MID$(STR$(SR),2)
    END IF
    RETURN
310 OSR=CDBL(SR)
    OP=FIX(OSR)
    OB=ABS(OSR)-ABS(FIX(OSR))
    OB=CLNG(OB*10^CN)
    IF OP<0 THEN
     SR$=STR$(OP)
    ELSE
     SR$=MID$(STR$(OP),2)
    END IF
    IF CN>CT-2 THEN
     SR$=STRING$(CT,"*")
    ELSE
     IF CN<>0 THEN
       IF OB=0 THEN
          SR$=SR$+"."+STRING$(CN,"0")
       ELSE
          SR$=SR$+"."+MID$(STR$(OB),2)
       END IF
     END IF
    END IF
    RETURN
330 SR$=UCASE$(SR$)
    RETURN
350 LPRINT SR$;
    RETURN
360 LPRINT
    RETURN
400 OSD=1.82*SD:
    IF OSD<.023 THEN OSD=.023
    IF SP<26 THEN
     OSP=26
    ELSEIF SP>127 THEN
     OSP=127
    ELSE
     OSP=SP
    END IF
    IF SV<>0 THEN
       SOUND EXP(OSP*.057762+2.10125), OSD,SV*15.9375
    END IF
    OTIME = TIMER
    OMO =.1*SD
    WHILE TIMER<OMO+OTIME
    WEND
    RETURN
450 OTIME=TIMER
    OMO=.1*SD
    SD=0:IN=0
452 IN$=INKEY$
    IF TIMER>OMO+OTIME THEN GOTO 456
    IF IN$<>"" THEN SD=(OTIME+OMO)-TIMER: GOTO 456
    GOTO 452
456 IF SD<>0 THEN GOTO 201
    IF SD=0 THEN IN$=""
    RETURN
500 LET IN=0
    IF NF/2=INT(NF/2) THEN OPEN NF$ FOR INPUT AS NF+1
    IF NF/2<>INT(NF/2) THEN OPEN NF$ FOR OUTPUT AS NF+1
    IF IN <>-1 THEN LET IN=0
    RETURN
540 LET IN=0
    LINE INPUT #NF+1,IN$
    IF IN <>-1 THEN LET IN=ABS(EOF(NF+1))
    RETURN
560 LET IN=0
    PRINT #NF+1,SR$
    IF IN <>-1 THEN IN=0
    RETURN
580 LET IN=0
    CLOSE NF+1
    IF IN <>-1 THEN IN=0
    RETURN
600 GOSUB 100
    RETURN
620 OX=INT(HO*HG): OY=INT(VE*VG)+6
    PSET (OX,OY),CC(CN)+2
    RETURN
630 OX=INT(HO*HG): OY=INT(VE*VG)+6
    LINE -(OX,OY),CC(CN)+2
    RETURN
650 COLOR CC(0)+2,CC(1)+2
    OX%=INT(HO*HG): OY%=INT(VE*VG)+12
    CALL Move&(WINDOW(8),OX%,OY%)
    IF CN=0 THEN
     PRINT SR$;
    ELSE
     PRINT STRING$(LEN(SR$),32);
    END IF
    RETURN
950 WINDOW CLOSE 2
    SCREEN CLOSE 1
    LIBRARY CLOSE
    END
fehler:
IF ERR=52 THEN
 OMSG$="Datei nicht gefunden!"
ELSEIF ERR=53 OR ERR=64 THEN
 OMSG$="Falscher Dateiname!"
ELSEIF ERR=61 THEN
 OMSG$="Datenträger voll!"
ELSEIF ERR=68 OR ERR=49 THEN
 OMSG$="Laufwerk nicht bereit!"
ELSEIF ERR=52 OR ERR=53 THEN
 OMSG$="Unzulässiger Dateiname!"
ELSEIF ERR=70 THEN
 OMSG$="Datenträger ist schreibgeschützt!"
ELSE
 PRINT "Fehler: ";ERR
 ERROR ERR
 STOP
END IF
    WINDOW 3,"Fehler",,0,1
    PRINT "Fehler: "; ERR
    PRINT OMSG$
    PRINT
    PRINT "Bitte eine Taste drücken"
    WHILE INKEY$<>""
    WEND
    WHILE INKEY$=""
    WEND
    WINDOW 2
    LET IN=-1
    RESUME NEXT