2015年8月24日月曜日

V3.10のバグ

V3.10(まで)の不具合です。すべてV3.40で解決されました。もうないだろうと思っていてもまだまだ出てくるもので(T_T)/

・forに対応するnextが存在しないままプログラムが終わっていると、落ちる
例えば、
for i=0 to 2
//  next
はnextがないので、本来はエラーが発生するはずですが、落ちます。エラー処理で発生行を特定しようとするのですが、この場合、エラー発生行が存在しないのでこうなります。for側にてエラーを発生させれば良さそうですが、現在の処理では無理なので。
V3.10まででの回避策は、対応するnextをちゃんと記述することです。

・whileに対応するendwhileが存在しないままプログラムが終わっていると、落ちる
・repeatに対応するuntilが存在しないままプログラムが終わっていると、落ちる
・switchに対応するendswitchが存在しないままプログラムが終わっていると、落ちる
・funcに対応する endfuncが存在しないままプログラムが終わっていると、落ちる
・enum/fenum対応する endenumが存在しないままプログラムが終わっていると、落ちる
   forと同様の理由で発生します。

・10次元配列を宣言するとシステムエラーが発生する
 9次元までしか使えませんでした。また、エラーメッセージが正しくありませんでした。

・新規作成からファイルを保存しようとすると、ファイル名入力欄に「.!」と表示されている
  それを消してからファイル名を入力してください。

・デバッグ処理が残っている
 内部的にデバッグ用処理が有効のまま残ってました。
 実行には関係ありません。

・cardInit()でカードパターンファイル名がSHIFT-JISに対応してない
  V3.10まででは、UTF-8で指定していれば問題ありません。

・行番号付きプログラムが正しく読めない
 正確には、読み込めますが行番号が削除されません。
 V3.10で改行コードがCRのみのファイルに対応した時のエンバグです。
 サンプルではrandomWalk.basが実行できません。
 なお、行番号のあるなしは1行目で判断します。1行目に行番号がない場合、2行目以降に行番号があっても削除されません。それは仕様です。

・設定の旧表示互換がONにならない
 V3.10でのエンバグですが、潜在的にプログラムに問題がありました。
 英語版ではもう1つ、X68互換関数のON/OFFが変更できませんでした。

・プログラムソースの1文字目がサロゲートペア文字の場合、フォント選択画面で文字が表示されない
 正しく動くプログラムでは事実上ありえないけど。

・symbolt()でサロゲートペア文字を含めた時、正しく表示されない

・一部外部関数で、実行時エラーが発生しているはずなのに無視されてしまう
 X68互換関数は、内部的にはX-BASICで書いた処理を手動でObjective-Cにコンパイルしたような記述になっていますが、その中で呼び出している外部関数内でエラーが発生した時、無視されます。外部関数はエラーチェックを言語コア側に任せているため、コアを通さず呼び出した場合にはエラーがチェックされなかったわけです。

・テキスト文字が小さくなりすぎることがある
ディセンダーや文字表示のゴミ対策のため、文字が小さくなることが多くなりました。
計算式を見直し、できるだけV3.00以前と同じくらいになるようにしました。
ただし、行数が減る場合があります。

・beep2()のfloadonlyが無効
 毎回ファイルを読みに行ってた

・removeTouchArea()してもタッチエリアが開放されたように見えない(もしくはタイミングがずれて開放されるようにみえる)

・bitmapImgLoad()/bitmapTileImgLoad()に引数指定時の動作がおかしい
 引数とり込み処理がおかしかった。
 全部省略した時のみ正常動作したはず。

・print 整数数字時の前のスペースの入り方が/68と異なる
/68 iOS
"A";100;"B" A 100 B
"A";-100;"B" A-100 B A -100 B
実はぺけ-BASICと同じ。
floatはあってた(ぺけ-BASICは異なる)

・print "〜"; // とすると表示後改行が入ってしまう
 print "〜"; /* や
 print "〜";://なら改行は入らない

・最終桁で全角文字を表示するとき、先に改行されない
 今までは表示してから改行してた(故に、右端1文字は欠けることがあった)

・スプライト関数が無効の時、互換関数内のスプライト関係関数を呼び出すと異常になる
呼び出し先のスプライト関数が無効になっているのだから、それを使う関数も無効にしなければいけませんでした。

・enumの値を式を使って記述するとき、一部演算子を2つ以上連続で使っているとエラーになる
 たとえば、
enum
 C= 1+2+4// OK
 D= 1 or 2 and 4// エラーが発生する
 E= (1 or 2) and 4 // OK
endenum
となります。or/andだけではなく、比較演算子やshlなど複数あります。
 修正を試みましたが、中間コードコンパイルの核に関わる部分で、単純な修正では無理だとわかり ました。そのため、これは仕様とします。
 ()をつけると大丈夫ですので、そういう記述をおねがいします。

・ファンクションキーの表示座標が実は間違っていた
 今回clearance引数の追加に伴い処理を見なおした時に発覚しました。
 ファンクションキーを多段表示した時に間が空きすぎるのはそのためでした。

・bitmapOpen(fdirect=ON)で落ちることがある
 クリアサイズを求める変数が不定になっててエリアをオーバーしてクリアしてしまうことがありました。グラフィックを実行すると落ちることがあるのはほとんどこれが原因ではないかと。

・全くの初回起動時、V3.0以降で追加された設定が初期化されてない
 だから使えなくなっていました。

・サンプルのloadFromURL_zipExpand.basがエラーを発生する
これはサンプルのバグではなく、それが読み込もうとしているサーバー側のファイルの問題でした。すでに修正されています。

・zipExpand()で、Windows環境下で作られたZip内の日本語ファイル名ファイルが展開できない
Zip内のファイル名の文字コードは作られた環境に依存するようです。Windows上で作ったものはSHIFT-JISでした。ZipライブラリがUTF8にしか対応してなかったので自動判別して展開できるようにしました。

・jpegHeader()が正しい情報を返せないことがある
 想定外の格納され方をされていたためです。
 X68時代に作ったヘッダー解析処理では、現在の画像に対応しきれてませんでした。

・pngHeader()が正しい情報を返せないことがある
 PNGファイルはiOS内部に入れられるときヘッダーが改変される(多分リソース内のみ)ようで、情報の位置がずれてました。それに対応しました。

・motionGetRotation()/compassGetData()/symbol(,ht)/fontSize(,wy)/getWidth(,fontWx,fontWy)でfloat変数に値を返すときに落ちることがある

・モーション関数を使った後にメモリが確保されたままになっている
モーション関数を使ったプログラムを何度も実行するとメモリエラーが発生する可能性があります。

・motionEnd()を呼び出さないでendするとモーション機能が動いたままになってしまう

・emailSend()でzip圧縮した時のファイル作成日時がおかしい
これは使っていたライブラリ(ZipArchive)のバグでした。

・str$(正の数字)で前にスペースが入る
例えばstr$(1)=" 1"(len=2)になります。X-BASIC/68では前のスペースは外れるので"1"(len=1)です。これは浮動小数点数値でも同じです。なお、負数の場合は前に"-"が入ります。

2015年8月7日金曜日

V3.10が公開されました。

別ネタに書いたとおり、V3.00で落ちてしまうバグが発見されました。
これを解決し、機能を少し追加したV3.10は現在審査待ち中です。
今しばらくお待ち下さい。

->なんと即日公開されました。やればできるじゃん>Apple。

2015年8月3日月曜日

サンプル;PushBon

ゲームPushBonです。

progloaderで「PushBon」をダウンロードすると、
 PushBon.bas
と必要データファイルが追加されます。



オリジナルは Oh!X 1989-11掲載のS-OS TTI(TinyTinyInterpreter)用です。
以下のリストはオリジナルのもの。動作確認はしてないので打ち込み間違いがあるかも。
これとX-BASIC版を見比べると、構造化の効果がわかるかも。

;
; PUSH BON  FOR TTI
;
;
  'C' WIDCH 40

;MAIN ROUTINE
   .R=0
9
   GOSUB 975 .G=5  GOSUB 980
      GOSUB 965  GOSUB 970
10
   LOCATE  25,15 "PUSH ANY KEY!!"
     LOCATE  25,15 "               "
    IF (G=0,10
11
     .T=0 .X=0 .Y=0 .D=0 .S=0
      GOSUB 980  BELL 1
12
     .B=0 GOSUB 900 GOSUB 953 GOSUB 993
     .B=6 GOSUB 953
13
     .K=(G IF K=0,13
       IF K='4,455
       IF K='6,456
       IF K='8,458
       IF K='2,457
       IF K='G,20
       IF K#' ,13
       GOSUB 300 INC S
       .A=0 ADC A IF A#0,20
       GOSUB 899
       GOSUB 250 IF O#0,23
       GOSUB 255 IF O#0,23
14
      GOSUB 1000
    GOTO 13

;GIVE UP!!!
20
   LOCATE 6,11 "             "
   LOCATE 6,12 "  GIVE UP!!  "
   LOCATE 6,13 "             "
     DEC  G GOSUB 980 BELL 2
25
     GOSUB 990 IF G=0,21
    GOSUB 965 GOSUB 970
   GOTO 11

;GAME OVER
21
   LOCATE 6,11 "* * * * * * *"
   LOCATE 6,12 " *GAME OVER* "
   LOCATE 6,13 "* * * * * * *"
   BELL 3
22
    IF (G#' ,22
   .R=0 GOTO 9

;ROUND CLEAR
23
   LOCATE 6,11 "* * * * * * *"
   LOCATE 6,12 " ROUND CLEAR "
   LOCATE 6,13 "* * * * * * *"
   BELL 3
24
    IF (G#' ,24
    INC R IF R<10,25
    .R=0 GOTO 25

;* BLOCK YOKO CHECK
250
   .H=$9F .I=00  .O=00
   .A=7 REPEAT
     .C=5 REPEAT
       WIND2 H,I .J=]
       @IF J=4 PUSH I PUSH H GOSUB 251 POP H POP I
      DEC C .I=I+1 ADC H
      UNTIL C=0
     .I=I+2 ADC H DEC A
     UNTIL A=0
    RETURN

251
   .L=2
252
    .I=I+1 ADC H WIND2 H,I
      .J=] IF J#4,254
       DEC  L IF L#0,252
      .O=10
254
      RETURN

;* BLOCK TATE CHECK
255
   .H=$9F .I=00  .O=00
   .A=7 REPEAT  PUSH H PUSH I
     .C=5 REPEAT
       WIND2 H,I .J=]
       @IF J=4 PUSH I PUSH H GOSUB 256 POP H POP I
      DEC C .I=I+7 ADC H
      UNTIL C=0
      POP I POP H
     .I=I+1 ADC H DEC A
      UNTIL A=0
    RETURN

256
   .L=2
257
    .I=I+7 ADC H WIND2 H,I
      .J=] IF J#4,258
      DEC  L IF L#0,257
     .O=10
258
     RETURN

;BLOCK PUSH
300
   .T=0
    PUSH X PUSH Y PUSH D
      @GOSUB D*5+150
    POP  D POP  Y POP  X
    BELL 1
   RETURN

;BLOCK UP PUSH
150
  @IF Y<2 RETURN
    DEC Y GOSUB 952 .J=B
    @IF J=5 RETURN
    @IF J=0 DEC S RETURN
151
    .Q=Y DEC Y  IF Q<1,352
      GOSUB 952 IF B#0,162
      GOSUB 390
    GOTO 151
352
    .Y=Q .B=J GOSUB 953
   RETURN

;BLOCK RIGHT PUSH
155
  @IF X>4 GOSUB 952 .J=B
   INC X GOSUB 952 .J=B
   @IF J=5 RETURN
   @IF J=0 DEC S RETURN
156
    .P=X INC X IF X>6,357
      GOSUB 952 IF B#0,167
      GOSUB 391
      GOTO 156
357
    .X=P .B=J GOSUB 953
   RETURN

;BLOCK DOWN PUSH
160
  @IF Y>4 RETURN
    INC Y GOSUB 952 .J=B
    @IF J=5 RETURN
    @IF J=0 DEC S RETURN
161
    .Q=Y INC Y IF Y>6,352
      GOSUB 952 IF B#0,162
      GOSUB 390
    GOTO 161
162
    .W=Y .V=X .U=B .Y=Q .B=J
   GOSUB 953 GOTO 370

;BLOCK LEFT PUSH
165
  @IF X<2 RETURN
    DEC X GOSUB 952 .J=B
    @IF J=5 RETURN
    @IF J=0 DEC S RETURN
166
    .P=X DEC X IF P<1,357
    GOSUB 952 IF B#0,167
    GOSUB 391
    GOTO 166
167
    .W=Y .V=X .U=B .X=P .B=J
   GOSUB 953 GOTO 370

;BLOCK WO HAJIKU
370
   @IF T>10 .T=0 RETURN
    INC T
    @IF U>4 RETURN
     IF J=2,371
     IF J=3,376
   IF U=2,374
   IF U=3,377
   RETURN

;LEFT BLOCK
371
   GOSUB 385
372
     .J=U .X=V .Y=W
    @GOTO D*5+151
374
   GOSUB  385 @GOTO D*5+151

;RIGHT BLOCK
376
    GOSUB 386 GOTO 372
377
    GOSUB 386 @GOTO D*5+151

;DIR LEFT TURN
385
   DEC D @IF D>121 .D=3
   RETURN

;DIR RIGHT TURN
386
   INC D @IF D=4 .D=0
   RETURN

;BLOCK ERASE MOVE
390
    PUSH Y .B=0 .Y=Q GOSUB 900 .B=0 GOSUB 953
      POP  Y .B=J GOSUB 900
    RETURN
391
    PUSH X .B=0 .X=P GOSUB 900 .B=0 GOSUB 953
      POP  X .B=J GOSUB 900
    RETURN

;CURSOR LEFT
455
   .D=3  IF X=0,12
     PUSH X .X=X-1 GOSUB 952
      @IF B#0 POP X GOTO 12
454
      .Q=X POP X  .B=0
         GOSUB 900 .B=0 GOSUB 953
       .X=Q GOSUB 993 .B=6 GOSUB 953
      GOTO 14

;CURSOR RIGHT
456
   .D=1  IF X=6,12
     PUSH X .X=X+1 GOSUB 952
      IF B=0,454
     POP X
   GOTO 12

;CURSOR DOWN
457
   .D=2  IF Y=6,12
     PUSH Y .Y=Y+1 GOSUB 952
      @IF B#0 POP Y GOTO 12
453
      .Q=Y POP Y  .B=0
       GOSUB 900 .B=0 GOSUB 953
     .Y=Q GOSUB 993 .B=6 GOSUB 953
    GOTO 14

;CURSOR UP
458
  .D=0  IF Y=0,12
     PUSH Y .Y=Y-1 GOSUB 952
      IF B=0,453
     POP  Y
   GOTO 12

;BLOCK PRINT
900
   .A=X*3+2 .C=Y*3+2 LOCATE A,C
    @IF B>5 .B=0
    IF B#5,902
       "."     CHR $7B "."     'DLLL'
       CHR $7B CHR $7B CHR $7B 'DLLL'
       "."     CHR $7B "."
    RETURN
902
    IF B#0,901
       "   " 'DLLL' "   " 'DLLL' "   "
       RETURN
901
    "+-+" 'DLLL' "I I" 'DLLL' "+-+"
        LOCATE A+1,C+1
        @GOTO  B+59
   RETURN
60
   " " RETURN
61
   "L" RETURN
62
   "R" RETURN
63
   "*" RETURN

;KVRAM ADDRESS
950
    .A=$9F .C=00 .F=Y
      .C=C+X ADC A
        IF F=0,951
        REPEAT
           .C=C+7 ADC A
           DEC F
        UNTIL F=0
951
    WIND2 A,C
   RETURN

;KVRAM READ
952
    GOSUB 950 .B=] RETURN

;KVRAM WRITE
953
    GOSUB 950 .]=B RETURN

;MEN ADDRESS
960
    .H=$A0 .I=00  IF R=0,961
     .D=R
      REPEAT
         .I=I+49 ADC H
         DEC D
      UNTIL D=0
961
   RETURN

;MEN TENSOU  READ
965
   GOSUB  960  .A=$9F .C=00
     .F=50 REPEAT
       WIND2 H,I .B=]
       WIND2 A,C .]=B
       .I=I+1 ADC H .C=C+1 ADC A
       DEC F
     UNTIL F=0
   RETURN

;MEN PRINT
970
     .Y=0  REPEAT
      .X=0  REPEAT
        GOSUB  950 .B=]
        GOSUB  900
        INC X   UNTIL X=7
      INC Y   UNTIL Y=7
   RETURN

;WAKU PRINT
975
   LOCATE 1,1  .A=23
     REPEAT  "*" DEC A
      UNTIL A=0
       .Y=2 REPEAT
        LOCATE  1,Y "*" DEC A
        .A=21 REPEAT " " DEC A
        UNTIL A=0  "*"
        INC Y UNTIL Y=23
       LOCATE 1,23  .A=23
      REPEAT "*" DEC  A
     UNTIL A=0
   RETURN

;SCREEN PRINT
980
   GOSUB 990
   GOSUB 899
   GOSUB 992
   GOSUB 991
RETURN

;TITLE PRINT
990
   LOCATE 25,2 " @@  @@@  @@ "
   LOCATE 25,3 "@           @"
   LOCATE 25,4 "@ PUSH BON! @"
   LOCATE 25,5 "@           @"
   LOCATE 25,6 " @@  @@@  @@ "
   LOCATE 25,21 "FOR TTI"
   LOCATE 27,23 "BY J.YAMADA"
   RETURN

;STEP PRINT
899
   LOCATE 26,8  "STEP  " PRT1 S
   RETURN

;ROUNT PRINT
991
   LOCATE 26,12 "ROUND " PRT1 R
   RETURN

;LIFE PRINT
992
   LOCATE 26,10 "LIFE  " PRT1 G
   RETURN

;DIRECTION PRINT
993
   LOCATE X*3+2,Y*3+2
    @GOSUB 50+D
   RETURN
50
   'R' "^" 'DL' "I" 'DL' "V"
   RETURN
51
   'D' "-->" RETURN
52
   'R' "I" 'DL' "I" 'DL' "V"
   RETURN
53
   'D' "<--" RETURN

;WAIT
1000
   .W=100 REPEAT .W=W-1 UNTIL W=0
   RETURN
END