First Steps

Um etwas in Action! hinein zu schnuppern, habe ich mein letztes BASIC-Programm genommen und nach Action! portiert. Das ging wider Erwarten recht einfach. Hier das Basic-Listing:

Listing in TurboBasic

10 DIM M1(6)
15 DIM ANTW$(15)
20 AD=DPEEK(88)
30 TIPP=1
40 POKE 752,1
50 DIM SP$(30)
55 SP$="                            "
100 EXEC RAHMEN
110 EXEC FUELLEN
200 EXEC NEUEZAHLEN
210 EXEC BUBBLESORT
215 VZ=1
220 EXEC MARK
240 POSITION 2,21:? SP$
245 POKE 752,0
250 POSITION 2,21:INPUT "NOCH EIN TIPP?",ANTW$
255 POKE 752,1
260 IF ANTW$(1,1)="N" THEN GOTO 998
270 IF ANTW$(1,1)<>"J" THEN GOTO 240
280 POSITION 2,19:? SP$
290 POSITION 2,21:? SP$
300 TIPP=TIPP+1
305 VZ=-1
310 EXEC MARK
320 GOTO 200
998 POKE 752,0
999 END 
1000 PROC RAHMEN
1005   CLS 
1010   POSITION 2,1:? "LOTTO-TIPP"
1020   POSITION 2,3
1030   ? ""
1040   FOR X=1 TO 6
1050     ? "|  |  |  |  |  |  |  |"
1060     ? ""
1070   NEXT X
1080   ? "|  |  |  |  |  |  |  |"
1090   ? ""
1100 ENDPROC 
2000 PROC FUELLEN
2010   FOR X=0 TO 6
2020     FOR Y=1 TO 7
2030       POSITION Y*3,X*2+4
2040       Z=X*7+Y
2050       IF Z<10 THEN ? " ";
2060       ? Z
2070     NEXT Y
2080   NEXT X
2100 ENDPROC 
3000 PROC MARK
3010   FOR X=1 TO 6
3020     Z=M1(X) MOD 7
3030     Y=TRUNC(M1(X)/7)
3040     IF Z=0 THEN Z=7:Y=Y-1
3050     XY=Z*3+Y*80+160
3060     DPOKE AD+XY,DPEEK(AD+XY)+$8080*VZ
3070     POSITION X*3,19
3080     ? M1(X)
3090   NEXT X
3100 ENDPROC 
4000 PROC BUBBLESORT
4010   REPEAT 
4015     TAUSCH=0
4020     FOR X=1 TO 5
4030       IF M1(X)>M1(X+1)
4040         STA=M1(X):M1(X)=M1(X+1):M1(X+1)=STA
4050         TAUSCH=1
4060       ENDIF 
4070     NEXT X
4080   UNTIL TAUSCH=0
4090 ENDPROC 
5000 PROC NEUEZAHLEN
5005   POSITION 13,1:? TIPP
5010   FOR X=1 TO 6
5020     M1(X)=RAND(49)+1
5030     FOR Y=0 TO X-1
5040       IF M1(Y)=M1(X) THEN X=X-1
5050     NEXT Y
5080   NEXT X
5090 ENDPROC

und hier das ganze in Action! Nach dem Portieren habe ich es noch ein bisschen getrimmt. Die Details kann man den Kommentaren entnehmen:

Listing in Action!

;Lotto - V1.1
;V1.1 - 2010 - 05 - 19
;POINTER STATT PEEKC UND POKEC
;V1.0 - 2010 - 05 - 14
;CURSOR AN UND AUS
;V0.2 - 2010 - 05 - 12
;XOR FUER MARKIEREN
;V0.1 - 2010 - 05 - 11
;Adaptiert aus TB XL
 
BYTE x=[0], TIPP=[1], CRSIN=752
BYTE ARRAY LZAHLEN(6)
CARD AD=88
INT VZ  
 
PROC rahmen()
  Put(125)
  Position(2,1)
  PrintE("LOTTO-TIPP")
  Position(2,3)
  PrintE("......................")
  FOR X=1 TO 6
  DO
    PrintE("|  |  |  |  |  |  |  |")
    PrintE("......................")
  OD
  PrintE("|  |  |  |  |  |  |  |")
  PrintE("......................")
RETURN
 
Proc fuellen()
BYTE y,z
  FOR X=0 TO 6
  do
    FOR Y=1 TO 7
    do
      Position(Y*3,X*2+4)
      Z=X*7+Y
      IF Z<10 THEN
        Put(32)
      FI
      PrintB(Z)
    OD
  OD
RETURN
 
Proc neuezahlen()
BYTE y
  Position(13,1)
  PrintB(TIPP)
  FOR X=1 TO 6
  DO
    LZAHLEN(X)=RAND(49)+1
    FOR Y=1 TO X-1
    DO
      IF LZAHLEN(Y)=LZAHLEN(X) THEN
        X=X-1
      FI
    OD
  OD
RETURN
 
Proc bubblesort()
BYTE TAUSCH=[0], STA
  DO
  TAUSCH=0
    FOR X=1 TO 5
    DO
      IF LZAHLEN(X)>LZAHLEN(X+1) then
        STA=LZAHLEN(X)
        LZAHLEN(X)=LZAHLEN(X+1)
        LZAHLEN(X+1)=STA
        TAUSCH=1
      FI
    od
  UNTIL TAUSCH=0
  od
RETURN
 
Proc markieren()
BYTE y,z
CARD POINTER PBS
  CRSIN=1
  FOR X=1 TO 6
  DO
    Z=LZAHLEN(X) MOD 7
    Y=LZAHLEN(X)/7
    IF Z=0 THEN
      Z=7
      Y=Y-1
    fi
    PBS=AD+Z*3+Y*80+160
    PBS^== XOR $8080
    POSITION(X*3,19)
    PrintB(lzahlen(X))
  OD
  CRSIN=0
RETURN
 
PROC main()
byte nochmal
    CRSIN=1
    rahmen()
    fuellen()
  DO
    neuezahlen()
    bubblesort()
    markieren()
    POSITION(1,22)
    Print("Weiterer Tipp (1=JA) ? ")
    nochmal=InputB()
    Tipp=tipp+1
    MARKIEREN()
    POSITION(1,19)
    PRINT("                     ")
    POSITION(1,22)
    PRINT("                        ")
  until nochmal<>1
  od
  CRSIN=0
RETURN

Schreib was...