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 Einschränkungen:

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 Version 1.0
REM ON ERROR GOTO 960
    LIBRARY "graphics.library"
    RANDOMIZE TIMER
    HG=528 :VG=198
    HO=41-1:VE=25-1
    OERRLIN=HO+1
    CC(0)=7:CC(1)=0
    SCREEN 1,640,256,4,2
    WINDOW 2,"Basicode",,0,1
    PALETTE 0,0,0,0
REM PALETTE 1,0,0,0
    PALETTE 2,0/15,0/15,0/15
    PALETTE 3,0/15,0/15,11/15
    PALETTE 4,11/15,0/15,0/15
    PALETTE 5,15/15,0/15,15/15
    PALETTE 6,0/15,6/15,0/15
    PALETTE 7,5/15,9/15,12/15
    PALETTE 8,14/15,11/15,0/15
    PALETTE 9,15/15,15/15,15/15
 20 CC(0)=7:CC(1)=0: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
    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=8 THEN IN=127
REM  IF IN<28 AND IN<>13 THEN IN=-1*IN
     IF IN>=129 AND IN<=138 THEN IN=(IN-128)*(-1) 
     WHILE INKEY$<>"":WEND    
    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("x")
    CN=IN-ASC(UCASE$(CHR$(IN)))
    IN=ASC(UCASE$(CHR$(IN)))
    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 (LEN(SR$)+1+CN)>CT 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     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 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
    RETURN
540 LINE INPUT #NF+1,IN$
    IN=EOF(NF+1)
    RETURN
560 PRINT #NF+1,SR$
    RETURN
580 CLOSE NF+1
    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%)
    PRINT SR$;
    RETURN
950 WINDOW CLOSE 2
    SCREEN CLOSE 1
    LIBRARY CLOSE 
    END
960 WINDOW 2 
    IF ERR=10 THEN 
     RESTORE
     RESUME NEXT
    ELSEIF ERR=52 THEN
     OMSG$="Datei nicht gefunden!":GOSUB 965 
    ELSEIF ERR=53 OR ERR=64 THEN
     OMSG$="Falscher Dateiname!":GOSUB 965
    ELSEIF ERR=61 THEN
     OMSG$="Datenträger voll!":GOSUB 965
    ELSEIF ERR=68 AND ERR=71 THEN
     OMSG$="Laufwerk nicht bereit!":GOSUB 965
    ELSEIF ERR=72 OR ERR=75 THEN
     OMSG$="Fehler beim Zugriff auf das Laufwerk!":GOSUB 965
    ELSEIF ERR=52 OR ERR=53 THEN
     OMSG$="Unzulässiger Dateiname!":GOSUB 965
    ELSEIF ERR=76 THEN     
     OMSG$="Pfad nicht gefunden!":GOSUB 965
    ELSE
     WINDOW 1
     CLS
     PRINT  "Fehler "+STR$(ERR)+" in Zeile:"+STR$(ERL)+"!"
     GOTO 950
    END IF
965 LOCATE 21,1
    COLOR 4,0
    PRINT OMSG$+" (Drücke ESC für Ende oder Return zum fortfahren)"
    od$=INPUT$(1)
    IF od$=CHR$(27) THEN GOTO 950
    IN=0
    LOCATE 21,1
    PRINT SPACE$(80);
    GOSUB 110
    RETURN