2015年10月11日日曜日
Q:このプログラムで表示が出ません
Question:
以下を実行すると(21,0)の位置に0だけが表示されます。
int x
for x=0 to 20://63
locate(x,0):print (x mod 10);
next
Answer:
おかしいような気がするかもしれませんが、これは正常です。
X-BASICで正の数値の表示は
スペース+数値+スペース
となります。(x mode 10)は1桁数字になるので、
_0_
_1_
_2_
という具合に表示されていくので、最終的に残るのはlocate(20,0)からに_0_と表示される分だけです。
これをちゃんと各桁に1桁数字を表示したいなら、
print str$(x mod 10);
とします。
この動作はX-BASIC/68でも同じです。
ただし、V3.1までのX-BASIC for iOSではバグのためこれでも表示が出ません。
困ったもんだ。V3.4で修正されます。
2015年9月23日水曜日
X-BASICが削除されているかも、です→大丈夫みたい
Appleから「おまえのアプリをAppStoreから削除した」(意訳)とのメイルがありました。
Xcodeの偽造バージョンから作られているとの指摘。
全く身に覚えのないことで、困惑しています。
ただ、アプリ登録サイトで確認しても削除されたアプリはなく、わけのわからん状況です。
Xcodeを再インストールして作り直すつもりですが、次バージョンも審査に出していますので、今しばらくお待ちください。
同様の指摘をされた経験をお持ちの方がいらっしゃれば、対処法をお教えください。
・・・追記
どうもこれ、私個人宛ではなく、開発者への一斉メイルだったような感じ。そういうアプリは発見次第削除するという警告だった様子。
紛らわしい。
ということで、おそらく私作成分はX-BASICを含め、大丈夫そうです。
・・・・追記
この件らしい。またあの国が原因かい。まったく。
Xcodeの偽造バージョンから作られているとの指摘。
全く身に覚えのないことで、困惑しています。
ただ、アプリ登録サイトで確認しても削除されたアプリはなく、わけのわからん状況です。
Xcodeを再インストールして作り直すつもりですが、次バージョンも審査に出していますので、今しばらくお待ちください。
同様の指摘をされた経験をお持ちの方がいらっしゃれば、対処法をお教えください。
・・・追記
どうもこれ、私個人宛ではなく、開発者への一斉メイルだったような感じ。そういうアプリは発見次第削除するという警告だった様子。
紛らわしい。
ということで、おそらく私作成分はX-BASICを含め、大丈夫そうです。
・・・・追記
この件らしい。またあの国が原因かい。まったく。
2015年9月16日水曜日
名前が変わります
V3.20が審査ではじかれました。理由は「アプリ名にiOSという名称が入っている」ということでした。
「今まで通しておいて何で今更?」 とは思いますが、仕方ないので名称を変更することにしました。
次からは「X-BASIC'」(ダッシュ)とします。
アプリ名は変わりますが、一般名称は「X-BASIC for iOS」でもOKということで。
とにかく変更箇所が多いので、再度審査に出せるようになるまでには時間がかかるかもしれません。テキストはともかく画像が多いので。
「今まで通しておいて何で今更?」 とは思いますが、仕方ないので名称を変更することにしました。
次からは「X-BASIC'」(ダッシュ)とします。
アプリ名は変わりますが、一般名称は「X-BASIC for iOS」でもOKということで。
とにかく変更箇所が多いので、再度審査に出せるようになるまでには時間がかかるかもしれません。テキストはともかく画像が多いので。
2015年9月7日月曜日
サンプルをダウンロードされた方へのお詫び
progloaderでサンプルをダウンロードすると、実行出来ない.basファイルが入ってしまうことがあります。
これは、オリジナルX-BASIC/68版のソースです。
エラーが出るなぁと思われたら、filer.basですっぱり削除してください。
最新のアーカイブからは削除しています。
これは、オリジナルX-BASIC/68版のソースです。
エラーが出るなぁと思われたら、filer.basですっぱり削除してください。
最新のアーカイブからは削除しています。
2015年9月4日金曜日
V2.96からV3.50までの相違点まとめ
変更があった部分の列記だけですので、詳細は最新版の取説で確認して下さい。
なお、現在アップされている取説はV3.50のものです。
前に「+」が付いているものは追加、「−」は削除、他は変更があったものです。 また、バグ修正しただけのものについては省略しています。
v3.00 | V3.10 | V3.40 | V3.50 |
X-BASIC for iOS | X-BASIC for iOS | X-BASIC' | X-BASIC' |
+maxStringLength() | +fenum | +debugMode() | +音楽関数群 |
+gLocate() | fopen() | +debugDump() | -mikachanフォント |
+forcedSJIS() | +fopenError() | +logoAlert() | |
+ellipse() | +errorCodeFopen() | +setTouchKeys() | |
-randomise() | freads() | +resetTouchKeys() | |
+sjisStrWidth() | rand() | +resetAllTouchKeys() | |
+utf8StrWidth() | rnd() | +programName$() | |
+toascii() | +getScreenSize() | ||
width() | setFunctionKeyBackgroundImage() | ||
cursorMove() | displayFunctionKey() | ||
imgLoad() | displayFunctionKeyAll() | ||
tileImgLoad() | width() | ||
gTransform() | tAtrb() | ||
sp_def() | selectMenu2() | ||
+X68互換関数群 | getBitmapSize() | ||
+便利関数群 | +デバッグ機能 | ||
+カード関数群 | devicePlatform() | ||
+checkCompatible() | |||
+isLandscape() | |||
gTransform() | |||
+stick() | |||
+zipArchive() | |||
+progSaver.bas | |||
beep2() | |||
一応iOS9対応 |
2015年9月1日火曜日
V3.4の詳細;いつの間にか発売開始されました
V3.4が発売開始になりました。
(審査に実に2ヶ月、この間連絡なし。さらに告知なしにいつの間にやらの発売開始。いい加減にしてくれ、と言いたい気分でした。)
以下の点が更新されます。
・アプリ名をX-BASIC'に変更
アップルの審査で、「アプリ名にiOSを含んだらだめ」といわれたので。
何で今更?という感じですが、仕方ないので変名します。
・デバッグ支援機能を追加
・プログラム選択を改良
・テキスト画面文字数計算式を変更
申し訳ありませんが、また表示位置と行数が変わる可能性があります。
・関数を追加
debugMode(),debugDump(),debugPrint()
logoAlert()
setTouchKeys(),resetTouchKeys(),resetAllTouchKeys()
programName$()
getScreenSize()
checkCompatible()
isLandscape()
stick()
zipArchive()
・一部関数を強化
setFunctionKeyBackgroundImage()
displayFunctionKey(),displayFunctionKeyAll()
width(),tAtrb()
selectMenu2()
getBitmapSize()
devicePlatform()
gTransform()
beep2()
・テキスト文字表示の高速化
画面表示位置計算方法を新しくしたので、従来必要だった処理が不要になり、高速化されました。
・バグを修正
詳細は別のネタに上げた通り
サンプルの新しいテキスト画面幅に合わせた調整&バグも修正してます。
・サンプルをできるだけ全機種対応にした
実際に操作できるかどうかは別にして、一応画面は表示できるように多くのサンプルを改良しました。また実行できない機種では、その由メッセージを出すようにしました。
メインはデバッグ支援機能でしょうか。少しはデバッグしやすくなるのではと思います。
番号的にはマイナーバージョンアップですが、結構大きな変更です。まあ、これが本来のV3.0のあるべき姿だったと言うことで。
なお、こんな時期の公開ですが、iPad proには対応してません。
(審査に実に2ヶ月、この間連絡なし。さらに告知なしにいつの間にやらの発売開始。いい加減にしてくれ、と言いたい気分でした。)
以下の点が更新されます。
・アプリ名をX-BASIC'に変更
アップルの審査で、「アプリ名にiOSを含んだらだめ」といわれたので。
何で今更?という感じですが、仕方ないので変名します。
・デバッグ支援機能を追加
・プログラム選択を改良
・テキスト画面文字数計算式を変更
申し訳ありませんが、また表示位置と行数が変わる可能性があります。
・関数を追加
debugMode(),debugDump(),debugPrint()
logoAlert()
setTouchKeys(),resetTouchKeys(),resetAllTouchKeys()
programName$()
getScreenSize()
checkCompatible()
isLandscape()
stick()
zipArchive()
・一部関数を強化
setFunctionKeyBackgroundImage()
displayFunctionKey(),displayFunctionKeyAll()
width(),tAtrb()
selectMenu2()
getBitmapSize()
devicePlatform()
gTransform()
beep2()
・テキスト文字表示の高速化
画面表示位置計算方法を新しくしたので、従来必要だった処理が不要になり、高速化されました。
・バグを修正
詳細は別のネタに上げた通り
サンプルの新しいテキスト画面幅に合わせた調整&バグも修正してます。
・サンプルをできるだけ全機種対応にした
実際に操作できるかどうかは別にして、一応画面は表示できるように多くのサンプルを改良しました。また実行できない機種では、その由メッセージを出すようにしました。
メインはデバッグ支援機能でしょうか。少しはデバッグしやすくなるのではと思います。
番号的にはマイナーバージョンアップですが、結構大きな変更です。まあ、これが本来のV3.0のあるべき姿だったと言うことで。
なお、こんな時期の公開ですが、iPad proには対応してません。
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と異なる
実はぺけ-BASICと同じ。
floatはあってた(ぺけ-BASICは異なる)
・print "〜"; // とすると表示後改行が入ってしまう
print "〜"; /* や
print "〜";://なら改行は入らない
・最終桁で全角文字を表示するとき、先に改行されない
今までは表示してから改行してた(故に、右端1文字は欠けることがあった)
・スプライト関数が無効の時、互換関数内のスプライト関係関数を呼び出すと異常になる
呼び出し先のスプライト関数が無効になっているのだから、それを使う関数も無効にしなければいけませんでした。
・enumの値を式を使って記述するとき、一部演算子を2つ以上連続で使っているとエラーになる
たとえば、
となります。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)です。これは浮動小数点数値でも同じです。なお、負数の場合は前に"-"が入ります。
・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 |
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 |
修正を試みましたが、中間コードコンパイルの核に関わる部分で、単純な修正では無理だとわかり ました。そのため、これは仕様とします。
()をつけると大丈夫ですので、そういう記述をおねがいします。
・ファンクションキーの表示座標が実は間違っていた
今回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。
これを解決し、機能を少し追加したV3.10は現在審査待ち中です。
今しばらくお待ち下さい。
->なんと即日公開されました。やればできるじゃん>Apple。
2015年8月3日月曜日
サンプル;PushBon
ゲームPushBonです。
progloaderで「PushBon」をダウンロードすると、
PushBon.bas
と必要データファイルが追加されます。
オリジナルは Oh!X 1989-11掲載のS-OS TTI(TinyTinyInterpreter)用です。
以下のリストはオリジナルのもの。動作確認はしてないので打ち込み間違いがあるかも。
これとX-BASIC版を見比べると、構造化の効果がわかるかも。
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
2015年7月26日日曜日
サンプル;8QUEEN
エイト・クイーンというパズルの解法を表示します・・・らしいです。
プログラムは移植しましたが、私自身これがどういったものなのか理解していないため、 結果が正しいかどうかは不明です。
progloaderで「8QUEEN」をダウンロードすると、
8QUEEN.bas
が追加されます。
このプログラムのオリジナルはここにあったMZ-80/1200用ですが、元ネタはWikipediaにもある通り、別のところにあります。
プログラムは移植しましたが、私自身これがどういったものなのか理解していないため、 結果が正しいかどうかは不明です。
progloaderで「8QUEEN」をダウンロードすると、
8QUEEN.bas
が追加されます。
このプログラムのオリジナルはここにあったMZ-80/1200用ですが、元ネタはWikipediaにもある通り、別のところにあります。
2015年7月24日金曜日
サンプル;ライフゲーム
ライフゲームについてはこちらを参照してください。「ゲーム」とありますが、シミュレーションです。
progloaderで「ライフゲーム」をダウンロードすると、
LigeGame.bas
が追加されます。
RUNするとまずは編集モードになるので、画面内にセルを配置してください。
セルは、任意の座標を直接タッチすることで配置または除去できます。
開始をタップすると実行されます。
基本的には永久に動き続けますが、全てがなくなると自動停止します。
途中で再編集も出来ます。
Wikipediaにあるようなサンプルも実行できますが、フィールドがあまり広くないことと、上下左右がつながってないので結果はちょっと違ってきます。その辺りは適当に改良してください。
このプログラムのオリジナルはOh!X1988年6月号のS-OS上のSLANG用ですが、元ネタはWikipediaにもある通り、別のところにあります。
以下のリストはオリジナルのもの。動作確認はしてないので打ち込み間違いがあるかも。
progloaderで「ライフゲーム」をダウンロードすると、
LigeGame.bas
が追加されます。
RUNするとまずは編集モードになるので、画面内にセルを配置してください。
セルは、任意の座標を直接タッチすることで配置または除去できます。
開始をタップすると実行されます。
途中で再編集も出来ます。
Wikipediaにあるようなサンプルも実行できますが、フィールドがあまり広くないことと、上下左右がつながってないので結果はちょっと違ってきます。その辺りは適当に改良してください。
このプログラムのオリジナルはOh!X1988年6月号のS-OS上のSLANG用ですが、元ネタはWikipediaにもある通り、別のところにあります。
以下のリストはオリジナルのもの。動作確認はしてないので打ち込み間違いがあるかも。
// ライフゲーム // Oh!X 1988-6 // // 宣言 //WORK $9888; (≪ for MZ-88/1268 ≫) CONST XX=40-1, YY=25-1, X =XX-1, Y =YY-1; ARRAY BYTE A[YY][XX], BYTE B[YY][XX]; VAR GEN; // // メイン処理 // MAIN() BEGIN WIDTH(48); intset(); // 初期画面SET PRINT("\C"); // 画面を消す FOR GEN=0 TO 100 [ HYOUJ(); // 画面表示 COPY(); // 配列コピー KOUTAI(); // 世代交代 KEY(); // キー入力 ] END; // // 画面表示 // HYOUJ() VAR I,J; BEGIN LOCATE(0,0); PRINT("GEN:",DECI$(GEN)); FOR I=1 TO Y [ LOCATE(1,I); FOR J=1 TO X [ IF A[I][J]==FALSE [ PRINT(" "); ] ELSE [ PRINT("*"); ] ] ] END; // // 配列コピー // COPY() VAR I,J; BEGIN FOR I=1 TO Y [ FOR J=1 TO X [ B[I][J]=A[I][J]; ] ] END; // // 世代交代 // KOUTAI() VAR I,J; BEGIN FOR I=1 TO Y [ FOR J=1 TO X [ CASE JOUTAI(I,J) [ 0,1 : A[I][J]=FALSE; 2 : [] 3 : A[I][J]=TRUE; OTHERS: A[I][J]=FALSE; ] ] ] END; // // 状態 // JOUTAI(I,J) BEGIN END( B[I-1][J-1]+B[I-1][J]+B[I-1][J+1] +B[I ][J-1] +B[I ][J+1] +B[I+1][J-1]+B[I+1][J]+B[I+1][J+1] ) ; // // 初期画面SET // INTSET() VAR I,J,KEY; CONST MSG= [ "START-[CR] RESET-[SPC] SET-[S]",0 ]; BEGIN PRINT( "\C" ); LOCATE( 8, 8); PRINT( MSX$(MSG) ); LOCATE(16,13); WHILE TRUE [ CASE (KEY=INKEY(1)) [ $1B: STOP() $0D: EXIT; $21 TO $FF: PRINT("*"); OTHERS: PRINT(CHR$(KEY)); ] 1 FOR I=0 TO YY [ FOR J=0 TO XX [ A[I][J]=FALSE; ] ] FOR I=1 TO Y [ FOR J=1 TO X [ IF SCREEN(J,I)=='*' [ A[I][J]=TRUE; ] ] ] END; // // キー入力 // KEY() BEGIN WHILE TRUE [ CASE INKEY(0) [ // $00 : EXIT; $1B : STOP(); : [ BEEP(); WHILE INKEY(1)==' ' [] ] OTHERS: EXIT; ] ] END; // //END
2015年7月17日金曜日
ゲーム;TICBAN
progloaderで「ゲーム;TICBAN」をダウンロードすると、
TICBAN.bas
が追加されます。
ゲームの解説です。画面には通路のパーツとなるブロックが並んでいます。
この上を一定の速度でボールが転がっていきます。通路に沿って迷路内を転がっていく
ボールの進路をうまく組み換えて上下左右にある1~8のゲートをすべて通すというのがゲームの内容です。
ゲートは、同じ番号2箇所を通ることで通過とみなされます。
(入り口の番号で入ったことがチェックされ、出口の番号通過で加点されます。)
一度通ったゲートには穴が開きます。
どのようにするかというと、迷路の中にはひとつだけ空白のブロックがありますので、
その部分を移動させることにより迷路を組み換えていくことができます。ちょうど15パズルのような要領です。
このあたりは説明を読むより、実際にあれこれやってみたほうがわかりやすいでしょう。
当然、通路からボールが落ちてしまったり、行き止まりになったら、ゲームオーバーです。
全部で11面ありますが、そのなかに1面だけクリアできない面かあるかもしれません。
そのほかの面はすべてクリアできることを確認してありますので、こんな面クリアできないよーなどと駄々をこねても
ダメですからね。
X-BASIC for iOS版はプログラムリストだけを見ての移植なので、オリジナルと同じ動作をしているかわかりません。
(S-OSの動作環境を構築できないので。X1エミュレーター自体は入手できたのですが。)
よって、クリアできるかどうかも不明です。
私の頭では1面もクリアできませんでしたので。
クリアしたはずなのに終わらないとか、バグがあるとわかる方はお知らせください。
オリジナルはOh!X1989年7月号のS-OS上のコンパイラTTC用のゲームです。 元があるので転載禁止です。 オリジナルのソースは以下に。
TICBAN.bas
が追加されます。
ゲームの解説です。画面には通路のパーツとなるブロックが並んでいます。
この上を一定の速度でボールが転がっていきます。通路に沿って迷路内を転がっていく
ボールの進路をうまく組み換えて上下左右にある1~8のゲートをすべて通すというのがゲームの内容です。
ゲートは、同じ番号2箇所を通ることで通過とみなされます。
(入り口の番号で入ったことがチェックされ、出口の番号通過で加点されます。)
一度通ったゲートには穴が開きます。
どのようにするかというと、迷路の中にはひとつだけ空白のブロックがありますので、
その部分を移動させることにより迷路を組み換えていくことができます。ちょうど15パズルのような要領です。
このあたりは説明を読むより、実際にあれこれやってみたほうがわかりやすいでしょう。
当然、通路からボールが落ちてしまったり、行き止まりになったら、ゲームオーバーです。
全部で11面ありますが、そのなかに1面だけクリアできない面かあるかもしれません。
そのほかの面はすべてクリアできることを確認してありますので、こんな面クリアできないよーなどと駄々をこねても
ダメですからね。
X-BASIC for iOS版はプログラムリストだけを見ての移植なので、オリジナルと同じ動作をしているかわかりません。
(S-OSの動作環境を構築できないので。X1エミュレーター自体は入手できたのですが。)
よって、クリアできるかどうかも不明です。
私の頭では1面もクリアできませんでしたので。
クリアしたはずなのに終わらないとか、バグがあるとわかる方はお知らせください。
オリジナルはOh!X1989年7月号のS-OS上のコンパイラTTC用のゲームです。 元があるので転載禁止です。 オリジナルのソースは以下に。
; TICBAN ; FOR Tiny Tiny Compiler ; PROGRAMED BY J.YAMADA ; Oh!X 1989-7 .R=0 WIDCH 40 7 'C' LOCATE 28,2 "* TICBAN *" LOCATE 28,20 "FOR TTC" LOCATE 28,22 "BY J.YAMADA" .S=0 .C=0 .M=1 GOSUB 880 10 LOCATE 27,17 "PUSH ANY KEY!" LOCATE 27,17 " " .A=(G IF A=0,10 IF A<'0,1 IF A>'9,1 .A=A-$30 .R=A GOSUB 880 ; MAIN ROUTINE 1 REPEAT .W=5 REPEAT GOSUB 870 .A=(G IF A=$1B,9 GOSUB 994 DEC W UNTIL W=0 GOSUB 500 IF A=0,6 GOSUB 880 6 IF F#8,5 GOSUB 700 ;ROUND CLEAR 5 UNTIL M=0 ; GAME OVER LOCATE 6,13 " * GAME OVER * " LOCATE 28,14 "RETRY(Y/N)?" 8 .A=(F IF A=' ,7 IF A='Y,7 IF A#'N,8 CHR A 9 RETURN ; BALL MAIN ROUTINE ; BALL MOVE 500 LOCATE N,O CHR $7B .H=N .I=O IF P=1,501 IF P=2,502 IF P=3,503 IF P=4,504 499 .N=H .O=I LOCATE N,I CHR 'O .C=C+1 ADC S GOSUB 803 .A=0 RETURN ; UP MOVE 501 GOSUB 505 IF A=0,499 ;UP CHECK GOSUB 506 .P=2 IF A=0,499 ;RIGHT CHECK GOSUB 507 .P=4 IF A=0,499 ;LEFT CHECK GOTO 510 ;MISS !! ; RIGHT MOVE 502 GOSUB 506 IF A=0,499 GOSUB 508 .P=3 IF A=0,499 GOSUB 505 .P=1 IF A=0,499 GOTO 510 ; DOWN MOVE 503 GOSUB 508 IF A=0,499 GOSUB 506 .P=2 IF A=0,499 GOSUB 507 .P=4 IF A=0,499 GOTO 510 ; LEFT MOVE 504 GOSUB 507 IF A=0,499 GOSUB 508 .P=3 IF A=0,499 GOSUB 505 .P=1 IF A=0,499 GOTO 510 ; MISS !! 510 LOCATE N,O CHR '* DEC M LOCATE 8,11 " MISS ! " BELL 1 GOSUB 804 511 IF M=0,512 IF (G#' ,511 .A=$50 RETURN 512 .A=0 RETURN ; UP CHECK 505 .I=I-1 GOTO 509 ; RIGHT CHECK 506 .H=H+1 GOTO 509 ; LEFT CHECK 507 .H=H-1 GOTO 509 ; DOWN CHECK 508 .I=I+1 509 GOSUB 550 GOSUB 560 RETURN ; SCRN CALL $9FF8 550 LOCATE H,I .A=$9F .B=$F8 CALL A,B GETA D RETURN ; CHR CHECK 560 IF D=$7B,561 IF D='-,562 IF D='I,562 IF D=' ,562 IF D='+,562 IF G#D,563 BELL 1 INC F GOSUB 600 .A=G-$30*10 .C=C+A ADC S GOSUB 803 563 .G=D 561 .A=0 RETURN 562 .A=$F0 .H=N .I=O RETURN ; GATE SUB 600 IF G='1,601 IF G='2,602 IF G='3,603 IF G='4,604 IF G='5,605 IF G='6,606 IF G='7,607 IF G='8,608 RETURN 601 .A=6 .B=0 GOTO 609 602 .A=18 .B=0 GOTO 609 603 .A=24 .B=6 GOTO 609 604 .A=24 .B=15 GOTO 609 605 .A=18 .B=21 GOTO 609 606 .A=6 .B=21 GOTO 609 607 .A=0 .B=15 GOTO 609 608 .A=0 .B=6 609 LOCATE A,B .Z=1 GOSUB 1011 RETURN ; ROUND CLEAR 700 LOCATE 6,10 " ROUND CLEAR! " BELL 1 INC R IF R#11,701 .R=0 701 IF (G#' ,701 GOSUB 880 RETURN ; BLOCK MAIN ROUTINE 870 .A=(G IF A=0,878 IF A='J,874 IF A='L,873 IF A='M,876 IF A='I,875 878 RETURN ; RIGHT MOVE 6 873 IF X=3,810 .L=X .X=X-3 GOSUB 888 .T=A LOCATE L,Y .Z=A GOSUB 1011 .U=3 .V=0 GOTO 872 ; LEFT MOVE 4 874 IF X=21,810 .L=X .X=X+3 GOSUB 888 .T=A LOCATE L,Y .Z=A GOSUB 1011 .U=253 .V=0 872 .K=X .X=L GOSUB 889 .X=K GOTO 877 ; UP MOVE 8 875 IF Y=18,810 .L=Y .Y=Y+3 GOSUB 888 .T=A LOCATE X,L .Z=A GOSUB 1011 .U=0 .V=253 GOTO 871 ; DOWN MOVE 2 876 IF Y=3,810 .L=Y .Y=Y-3 GOSUB 888 .T=A LOCATE X,L .Z=A GOSUB 1011 .U=0 .V=3 871 .K=Y .Y=L GOSUB 889 .Y=K 877 IF N-X>2,879 IF O-Y>2,879 .N=N+U .O=O+V LOCATE N,O CHR 'O 879 .T=0 GOSUB 889 .Z=0 GOSUB 1000 810 RETURN ; MEN DATA TO KVRAM DATA TENSOU 802 GOSUB 995 .A=$9F .B=00 WIND2 A,B .K=0 REPEAT .]=[ .E=E+1 ADC D WIND1 D,E .B=B+1 ADC A WIND2 A,B INC K UNTIL K=42 RETURN ; SHOKIKA 880 GOSUB 802 GOSUB 990 GOSUB 997 GOSUB 800 .X=12 .Y=9 .Z=0 GOSUB 1000 GOSUB 1015 .T=0 GOSUB 889 .N=4 .O=4 LOCATE N,O CHR 'O .P=2 GOSUB 803 GOSUB 804 .G=0 .F=0 RETURN ; ROUND PRINT 800 LOCATE 28,12 "ROUND" PRT1 R RETURN ; SCORE PRINT 803 LOCATE 28,7 "SCORE " PRT2 S,C RETURN ; BALL PRINT 804 LOCATE 28,9 "BALL " PRT1 M RETURN ; BLOCK NO. ADDRESS 886 .D=$9F .E=00 .A=X-3/3 .E=E+A ADC D IF Y=3,887 .B=Y-3/3 REPEAT .E=E+7 ADC D DEC B UNTIL B=0 887 WIND1 D,E RETURN ; BLOCK NO. READ 888 GOSUB 886 .A=[ RETURN ; BLOCK NO. WRITE 889 GOSUB 886 .[=T RETRUN ; WAKU PRINT 990 .X=0 .Y=0 GOSUB 991 GOSUB 991 .Z=1 GOSUB 1000 .Y=Y+3 GOSUB 992 GOSUB 992 .X=0 GOSUB 993 GOSUB 993 .Z=1 GOSUB 1000 RETURN 991 .Z=1 GOSUB 1000 .X=X+3 .Z=8 GOSUB 1000 .X=X+3 .Z=3 GOSUB 1000 .X=X+3 .Z=7 GOSUB 1000 .X=X+3 RETURN 992 .X=0 .Z=8 GOSUB 1000 .X=X+24 .Z=7 GOSUB 1000 .Y=Y+3 .X=0 .Z=2 GOSUB 1000 .X=X+24 GOSUB 1000 .Y=Y+3 .X=0 .Z=5 GOSUB 1000 .X=X+24 .Z=6 GOSUB 1000 .Y=Y+3 RETURN 993 .Z=1 GOSUB 1000 .X=X+3 .Z=5 GOSUB 1000 .X=X+3 .Z=3 GOSUB 1000 .X=X+3 .Z=6 GOSUB 1000 .X=X+3 RETURN ; WAIT 994 .A=15 REPEAT .B=0 REPEAT INC B UNTIL B=0 DEC A UNTIL A=0 RETURN ; MEN ADDRESS MEN DATA $A000 995 .D=$A0 .E=00 .A=R IF A#0,996 WIND1 D,E RETURN 996 REPEAT .E=E+42 ADC D DEC A UNTIL A=0 WIND1 D,E RETURN ; MEN PRINT KVRAM AREA $9F00 997 .D=$9F .E=00 WIND1 D,E .G=3 REPEAT .H=3 REPEAT .Z=[ .E=E+1 ADC D WIND1 D,E LOCATE H,G GOSUB 1011 .H=H+3 UNTIL H=24 .G=G+3 UNTIL G=21 RETURN ; BLOCK PRINT ROUTINE 1000 LOCATE X,Y 1011 IF Z=0,1001 IF Z=1,1002 IF Z=2,1003 IF Z=3,1004 IF Z=4,1005 IF Z=5,1006 IF Z=6,1007 IF Z=7,1008 IF Z=8,1009 RETURN 1001 " " 'DLLL' " " 'DLLL' " " RETURN 1002 "+-+" 'DLLL' "I+I" 'DLLL' "+-+" RETURN 1003 "+" CHR $7B "+" 'DLLL' "I" CHR $7B "I" 'DLLL' "+" CHR $7B "+" RETURN 1004 "+-+" 'DLLL' CHR $7B CHR $7B CHR $7B 'DLLL' "+-+" RETURN 1005 "+" CHR $7B "+" 'DLLL' CHR $7B CHR $7B CHR $7B 'DLLL' "+" CHR $7B "+" RETURN 1006 "+" CHR $7B "+" 'DLLL' "I" CHR $7B CHR $7B 'DLLL' "+-+" RETURN 1007 "+" CHR $7B "+" 'DLLL' CHR $7B CHR $7B "I" 'DLLL' "+-+" RETURN 1008 "+-+" 'DLLL' CHR $7B CHR $7B "I" 'DLLL' "+" CHR $7B "+" RETURN 1009 "+-+" 'DLLL' "I" CHR $7B CHR $7B 'DLLL' "+" CHR $7B "+" RETURN ; GATE NO. PRINT 1015 .A=4 .B=2 .K='1 GOSUB 1016 .A=A+6 .K='2 GOSUB 1016 .A=4 .B=21 .K='6 GOSUB 1016 .A=A+6 .K='5 GOSUB 1016 .A=24 .B=4 .K='3 GOSUB 1017 .B=B+3 .K='4 GOSUB 1017 .A=2 .B=4 .K='8 GOSUB 1017 .B=B+3 .K='7 GOSUB 1017 RETURN 1016 LOCATE A,B CHR K .A=A+6 LOCATE A,B CHR K RETURN 1017 LOCATE A,B CHR K .B=B+6 LOCATE A,B CHR K RETURN END
2015年7月16日木曜日
v3.00のバグと仕様について
X-BASIC for iOS v3.00には、以下のように不具合のように見える「仕様」があります。
(1)エラーをタップしてジャンプするとき、その行が画面に出てこない
これはiOS8のバグだと思います。
エラー行をUITextView:scrollRangeToVisible:というメッセージを使い画面内に入るように画面スクロールさせていますが、このスクロールが途中で止まってしまうことがあります。そうなった時はもう1回タップしてください。たいがいは2回もタップすると表示される範囲にスクロールされます。
(2)エディタの「編集」と「リスト」を切り替えた時、両者の表示位置が一致してない。
基本的にはUITextViewに自由に行スクロールする機能がないことが原因ですが、(1)のバグも一因ではあります。
UITextViewではないエディタモジュールがあればいいのですけど。まあ、エディタの問題は、これからはprogloaderがあるので、外部エディタを使っていただければとm(_ _)m。
(3)fopen()のリターン値がX-BASIC/68と異なる
X-BASIC/68のプログラムを移植した時、fopen()でエラーが出る場合の原因は間違いなくこれです。
iOS版は正常が>=1でエラーが0ですが、/68は正常が>=0でエラーが-1です。
開発時に参照した文献が間違っていたことと、その後テストのために移植したプログラムがリターン値でエラーチェックをしていなかったため発見が遅れ、その間にサンプルでこのリターン値で数多く作ってしまった為、現状そのままになってしまっています。
要望が多ければ/68に合わせますし、それはそれで移植したプログラムに不具合が出てきそうなので、fopenX68()を新設するかもしれません。->V3.10で/68に合わせて変更しました。
(4)ファイル名またはディレクトリ名にサロゲートペア文字を入れると正しく処理されない
Objective-Cライブラリの問題であり、表示と違ってめったにありえないことなので対処しないことにしました。おそらく、Mac/iOS上でフォルダの指定を可能にしているほとんどのプログラムが同様の問題を抱えていると思います。
以下は不具合です。すべてV3.10で修正済みです。
(1)改行コードが&h0dのBASICプログラムが読み込めない。
テストしたファイルの中にこれがなかったので確認出来てませんでした。
XcodeというかMac上は&h0aだし、X68/Windowsは&h0d,&h0aなので。 X1で作られたものが&h0dのみでした。
とりあえずの回避方法は、何かしらのプログラムで改行コードを置き換えてください。 たいていのエディタは改行コード指定ができるでしょう。 V3.10で修正済みです。
なお、freads()はちゃんと&h0dに対応しています。
(2)freads()で、最大文字列長を超える文字列を読み込んだ時に落ちる(と思う)
(3)freads()で、EOF(&h1a)を読み込んでも読み取りが終了しない
なので、&h1aの後ろにデータが有った場合、それも読み込んでいた。
(&h1aは単なる1バイトデータとみなされていた。)
(4)freads()で改行なしでファイルが終了する場合のリターン値が/68と異なっていた
「例」TEST&h1aというファイルを読んだ場合
/68 st="TEST",リターン値=-1(エラーが返る)
iOS st="TEST",リターン値=4(読み込めた文字列長が返っていた)
次回のfreads()で-1が返った。
freads()は/68でも細かい仕様が未公開だったので、この際調べたら差異がありました。
(2)UTF16で4バイトになる文字が正常表示できない
これはiOSというかObjective-Cライブラリのバグに近い仕様が原因です。例えば
♣▒🐓🍅
という絵文字群は、UTF16で前2文字が2バイト、後ろ2文字が4バイトです。
(後ろ2文字は環境によっては表示されないかもしれません。)
(Objective-Cの内部文字コードはUTF16です。)
それぞれのlengthを取ると([@"〜" length]),全て1になるべきが、
となります。後ろ2文字の長さが異常です。また、characterAtIndexで1文字取り出しても2バイトごとの取り出しになります。
これらはサロゲートペアという文字です。サロゲートペアは一部の文字を4バイトに拡張することで扱える文字範囲を拡大したものだそうです。先のlengthやcharacterAtIndex、substringWithRange:NSMakeRange(i, 1)はそれに対応できていません。
このため、それらを使って1文字づつ表示しようとしているX-BASICの内部処理では正常に表示できませんでした。
なお、X-BASIC for iOSのutf8Mid$()など文字列切り出し関数群やutf8Len()は正しく動作しています(これらは独自に開発した処理を使っている)。
(3)font()で等幅でないフォントを指定した時=全角を含め1文字1桁のとき、幅が広いフォントを表示した時文字が重なってしまう
サロゲートペアで表示される文字の中には、普通の文字に比べ幅広い文字が存在していました。最も幅の広そうなフォントで計算するようにしました。
(4)同指定時、文字を重ねた時に、前の文字の一部が残ることがある。
1文字分の領域幅を消さなければいけないのに、フォントの幅で処理してました。
ただし、縦幅に関してはV3.00で対応したディセンダーの問題でもあるので、width()でディセンダーを有効にすることで対処できます。
→これに関してはV3.10でも完全に修正しきれてません(横方向は直ったけど縦方向が)。(5)の修正を急ぐためです。
(5)RUN直後に落ちることがある
外部関数設定処理に問題があり、ワークを破壊してました。動いていたほうがむしろ奇跡です。次バージョン開発中にこれが顕著になり、散々調べた結果ようやく原因が特定出来ました。malloc()で確保したワーク内の破壊はProfileでもわからないので時間がかかりました。
(6)keyRepeatTime()でリピートなし及び即時リピートの設定ができない
引数の処理に問題がありました。
(7)font()でpointSizeの指定が無視されている
これも引数の処理に問題がありました。常に省略時と同じになってたはずです。
特に(5)が致命的なので、これを直した+αのV3.10を公開しました。また、fopen()のリターン値もX68に合わせて変更しました。fopen()を使ったプログラムを作成されている方は、ご注意ください(互換モードは用意してあります)。
(1)エラーをタップしてジャンプするとき、その行が画面に出てこない
これはiOS8のバグだと思います。
エラー行をUITextView:scrollRangeToVisible:というメッセージを使い画面内に入るように画面スクロールさせていますが、このスクロールが途中で止まってしまうことがあります。そうなった時はもう1回タップしてください。たいがいは2回もタップすると表示される範囲にスクロールされます。
(2)エディタの「編集」と「リスト」を切り替えた時、両者の表示位置が一致してない。
基本的にはUITextViewに自由に行スクロールする機能がないことが原因ですが、(1)のバグも一因ではあります。
UITextViewではないエディタモジュールがあればいいのですけど。まあ、エディタの問題は、これからはprogloaderがあるので、外部エディタを使っていただければとm(_ _)m。
(3)fopen()のリターン値がX-BASIC/68と異なる
X-BASIC/68のプログラムを移植した時、fopen()でエラーが出る場合の原因は間違いなくこれです。
iOS版は正常が>=1でエラーが0ですが、/68は正常が>=0でエラーが-1です。
開発時に参照した文献が間違っていたことと、その後テストのために移植したプログラムがリターン値でエラーチェックをしていなかったため発見が遅れ、その間にサンプルでこのリターン値で数多く作ってしまった為、現状そのままになってしまっています。
(4)ファイル名またはディレクトリ名にサロゲートペア文字を入れると正しく処理されない
Objective-Cライブラリの問題であり、表示と違ってめったにありえないことなので対処しないことにしました。おそらく、Mac/iOS上でフォルダの指定を可能にしているほとんどのプログラムが同様の問題を抱えていると思います。
以下は不具合です。すべてV3.10で修正済みです。
(1)改行コードが&h0dのBASICプログラムが読み込めない。
テストしたファイルの中にこれがなかったので確認出来てませんでした。
XcodeというかMac上は&h0aだし、X68/Windowsは&h0d,&h0aなので。 X1で作られたものが&h0dのみでした。
とりあえずの回避方法は、何かしらのプログラムで改行コードを置き換えてください。 たいていのエディタは改行コード指定ができるでしょう。 V3.10で修正済みです。
なお、freads()はちゃんと&h0dに対応しています。
(2)freads()で、最大文字列長を超える文字列を読み込んだ時に落ちる(と思う)
(3)freads()で、EOF(&h1a)を読み込んでも読み取りが終了しない
なので、&h1aの後ろにデータが有った場合、それも読み込んでいた。
(&h1aは単なる1バイトデータとみなされていた。)
(4)freads()で改行なしでファイルが終了する場合のリターン値が/68と異なっていた
「例」TEST&h1aというファイルを読んだ場合
/68 st="TEST",リターン値=-1(エラーが返る)
iOS st="TEST",リターン値=4(読み込めた文字列長が返っていた)
次回のfreads()で-1が返った。
freads()は/68でも細かい仕様が未公開だったので、この際調べたら差異がありました。
(2)UTF16で4バイトになる文字が正常表示できない
これはiOSというかObjective-Cライブラリのバグに近い仕様が原因です。例えば
♣▒🐓🍅
という絵文字群は、UTF16で前2文字が2バイト、後ろ2文字が4バイトです。
(後ろ2文字は環境によっては表示されないかもしれません。)
(Objective-Cの内部文字コードはUTF16です。)
それぞれのlengthを取ると([@"〜" length]),全て1になるべきが、
文字 | length | UTF8 | UTF16 |
♣ | 1 | E2 99 A3 | 26 63 |
▒ | 1 | E2 96 92 | 25 92 |
🐓 | 2 | F0 9F 90 93 | D8 3D DC 13 |
🍅 | 2 | F0 9F 8D 85 | D8 3C DF 45 |
これらはサロゲートペアという文字です。サロゲートペアは一部の文字を4バイトに拡張することで扱える文字範囲を拡大したものだそうです。先のlengthやcharacterAtIndex、substringWithRange:NSMakeRange(i, 1)はそれに対応できていません。
このため、それらを使って1文字づつ表示しようとしているX-BASICの内部処理では正常に表示できませんでした。
なお、X-BASIC for iOSのutf8Mid$()など文字列切り出し関数群やutf8Len()は正しく動作しています(これらは独自に開発した処理を使っている)。
(3)font()で等幅でないフォントを指定した時=全角を含め1文字1桁のとき、幅が広いフォントを表示した時文字が重なってしまう
サロゲートペアで表示される文字の中には、普通の文字に比べ幅広い文字が存在していました。最も幅の広そうなフォントで計算するようにしました。
(4)同指定時、文字を重ねた時に、前の文字の一部が残ることがある。
1文字分の領域幅を消さなければいけないのに、フォントの幅で処理してました。
ただし、縦幅に関してはV3.00で対応したディセンダーの問題でもあるので、width()でディセンダーを有効にすることで対処できます。
→これに関してはV3.10でも完全に修正しきれてません(横方向は直ったけど縦方向が)。(5)の修正を急ぐためです。
(5)RUN直後に落ちることがある
外部関数設定処理に問題があり、ワークを破壊してました。動いていたほうがむしろ奇跡です。次バージョン開発中にこれが顕著になり、散々調べた結果ようやく原因が特定出来ました。malloc()で確保したワーク内の破壊はProfileでもわからないので時間がかかりました。
(6)keyRepeatTime()でリピートなし及び即時リピートの設定ができない
引数の処理に問題がありました。
(7)font()でpointSizeの指定が無視されている
これも引数の処理に問題がありました。常に省略時と同じになってたはずです。
特に(5)が致命的なので、これを直した+αのV3.10を公開しました。また、fopen()のリターン値もX68に合わせて変更しました。fopen()を使ったプログラムを作成されている方は、ご注意ください(互換モードは用意してあります)。
2015年7月15日水曜日
サンプル:フラクタルグラフィック
氷山のようなフラクタルグラフィックを描画するサンプルです。
progloaderで「フラクタルグラフィック(一部未内蔵)」をダウンロードすると、
fractalGraphics.bas
TREE.bas
fractal15.bas
fractal16.bas
の4本が追加されます。
前2本が新規分です(後2本は内蔵サンプルと同じです)。
乱数を使ってますので、毎回画像は変わります。
こちらは毎回同じです。
ちなみに、以下は同プログラムのオリジナルのMZ-2500版での実行結果です(MZ-2500エミュレーター上での実行結果)。
オリジナルは雑誌I/Oの掲載されていたものですが、残念ながらそのページのコピーだけを持っていたので、何年何月号かは不明です。1985年頃だとは思うのですが。
X1-turbo/MZ-2500/PC-9801シリーズ「フラクタルグラフィック」江上邦博、下園真一
元があるので転載禁止です。
以下のリストはオリジナルのもの。動作確認はしてないので打ち込み間違いがあるかも。
progloaderで「フラクタルグラフィック(一部未内蔵)」をダウンロードすると、
fractalGraphics.bas
TREE.bas
fractal15.bas
fractal16.bas
の4本が追加されます。
前2本が新規分です(後2本は内蔵サンプルと同じです)。
fractalGraphics.bas |
TREE.bas |
ちなみに、以下は同プログラムのオリジナルのMZ-2500版での実行結果です(MZ-2500エミュレーター上での実行結果)。
オリジナルは雑誌I/Oの掲載されていたものですが、残念ながらそのページのコピーだけを持っていたので、何年何月号かは不明です。1985年頃だとは思うのですが。
X1-turbo/MZ-2500/PC-9801シリーズ「フラクタルグラフィック」江上邦博、下園真一
元があるので転載禁止です。
以下のリストはオリジナルのもの。動作確認はしてないので打ち込み間違いがあるかも。
1000 'program Fractal graphics 1005 ' for MZ-2500 BASIC-M25 ; 4096色パレット版 1010 INIT "CRT2:640,400,16":CLS 3 1020 ' 1030 DEFINT I-K,P,X-Z 1040 DIM X(2200),Y(2200),Z(2200),C$(9) 1050 DEF FNMAXIM(N) = N* ( N+1 )/2 1060 DEF FNMIN(N)=FNMAXIM(N-1)+1 1070 FOR I=1 to 14:COLOR=(I,I+1,I+1,I+1):NEXT 1080 ' 1090 ' 1100 PAL=15 'How many colors ? 1110 LX=.57735027:LY=.57735027:LZ=-.57735027 1120 ' 1130 X(1)=320 :Y(1)=30 :Z(1)=0 1140 X(2)=50 :Y(2)=350 :Z(2)=300 1150 X(3)=590 :Y(3)=350 :Z(3)=300 1160 ' 1170 NDIM=2:GOSUB 1700 '*LDRAW 1180 ' *MAIN 1190 FOR LEVEL=1 TO 6 1200 NDIM=NDIM*2-1:GOSUB 1290 '*CALC 1210 CLS 2 1220 LOCATE 0,2 :PRINT "level";LEVEL 1230 GOSUB 1700 '*LDRAW 1240 NEXT 1250 GOSUB 1800 '*PAINT 1260 END 1270 ' 1280 ' 1290 '*CALC 'calculate 1300 FOR I=NDIM TO 3 STEP -2 1310 FOR K=FNMIN(I) TO FNMAXIM(I) STEP 2 1320 PT1=FNMIN((I+1)/2) :PT2=FNMIN(I) 1330 X(K)=X(PT1+(K-PT2)/2) 1340 Y(K)=Y(PT1+(K-PT2)/2) 1350 Z(K)=Z(PT1+(K-PT2)/2) 1360 NEXT K 1370 FOR K=FNMIN(I)+1 TO FNMAXIM(I)-1 STEP 2 1380 X1=X(K-1) :X2=X(K+1) 1390 Y1=Y(K-1) :Y2=Y(K+1) 1400 Z1=Z(K-1) :Z2=Z(K+1) 1410 GOSUB 1610 '*FRAC_FUNC 1420 X(K)=X:Y(K)=Y:Z(K)=Z 1430 NEXT K 1440 NEXT I 1450 FOR I=NDIM-1 TO 2 STEP -2 1460 FOR K=FNMIN(I) TO FNMAXIM(I)-1 1470 X1=X(K+I) :X2=X(K-I+1) 1480 Y1=Y(K+I) :Y2=Y(K-I+1) 1490 Z1=Z(K+I) :Z2=Z(K-I+1) 1500 GOSUB 1610 '*FRAC_FUNC 1510 X(K)=X :Y(K)=Y :Z(K)=Z 1520 NEXT K 1530 X1=X(K+I+1) :X2=X(K-I) 1540 Y1=Y(K+I+1) :Y2=Y(K-I) 1550 Z1=Z(K+I+1) :Z2=Z(K-I) 1560 GOSUB 1610 '*FHAC_FUNC 1570 PT1=FNMAXIM(I):X(PT1)=X:Y(PT1)=Y:Z(PT1)=Z 1580 NEXT I 1590 RETURN 1600 ' 1610 '*FRAC_FUNC ' X,Y < X1.Y1-X2,Y2 1620 DX=ABS(X1-X2) 1630 DY=ABS(Y1-Y2) 1640 DZ=ABS(Z1-Z2) 1650 X=(X1+X2)/2+DX*.3*(RND-.5) 1660 Y=(Y1+Y2)/2+DY*.7*(RND-.5) 1670 Z=(Z1+Z2)/2+DZ*.4*(RND-.5) 1680 RETURN 1690 ' 1700 ' *LDRAW LINE DRAW 1710 FOR I=1 TO NDIM-1 1720 FOR K=FNMIN(I) TO FNMAXIM(I) 1730 LINE (X(K) ,Y(K)) -(X(K+I) ,Y(K+I )) 1740 LINE (X(K) ,Y(K)) -(X(K+I+1),Y(K+I+1)) 1750 LINE (X(K+I),Y(K+I))-(X(K+1+I),Y(K+1+I)) 1760 NEXT K 1770 NEXT I 1780 RETURN 1790 ' 1800 ' PAINT 1810 FOR I=1 TO NDIM-1 1820 FOR K=FNMIN(I) TO FNMAXIM(I) 1830 X1=X(K) :Y1=Y(K) :Z1=Z(K) :X2=X(K+I):Y2=Y(K+I):Z2=Z(K+I) 1835 X3=X(K+I+1):Y3=Y(K+I+1):Z3=Z(K+I+1) 1840 GOSUB 1920 1850 IF K=FNMAXIM(I) THEN 1880 'next 1860 X1=X(K) :Y1=Y(K) :Z1=Z(K) :X2=X(K+I+1) :Y2=Y(K+I+1) :Z2=Z(K+I+1) 1865 X3=X(K+1):Y3=Y(K+1):Z3=Z(K+1) 1870 GOSUB 1920 1880 NEXT K 1890 NEXT I 1900 RETURN 1910 ' 1920 '*TRIANGLE 1930 X=(X1+X2+X3)/3:Y=(Y1+Y2+Y3)/3:Z=(Z1+Z2+Z3)/3 1940 S = ABS(X1*(Y2-Y3)+X2*(Y3-Y1)+X3*(Y1-Y2))/2:IF S<3 THEN 2060 1950 LINE (X1,Y1)-(X2,Y2),15 1960 LINE (X2,Y2)-(X3,Y3),15 1970 LINE (X3,Y3)-(X1,Y1),15 1980 ' brightness calc. 1990 DAX=X2-X1:DAY=Y2-Y1:DAZ=Z2-Z1:DBX=X3-X1:DBY=Y3-Y1:DBZ=Z3-Z1 2000 VX=DAY*DBZ-DAZ*DBY:VY=DAZ*DBX-DAX*DBZ:VZ=DAX*DBY-DAY*DBX 2010 VNRM=SQR(VX*VX+VY*VY+VZ*VZ):NX!=VX/VNRM:NY!=VY/VNRM:NZ!=VZ/VNRM 2020 BR=LX*NX+LY*NY+LZ*NZ:COL=INT(BR*PAL) 2030 IF COL<0 THEN COL=0 ELSE IF COL>PAL-1 THEN COL=PAL-1 2040 PAINT (X,Y),15,15 2050 PAINT (X,Y),COL,NOT 15:'時々ここでNO MEMORYエラーが出るが、その時は図形が複雑すぎるということで、re-runして 2060 RETURN 2990' 3000 ' *DEF_pattern 3010 RESTORE 3100 3020 FOR I=0 TO 8 3030 FOR K=1 TO 6 3040 READ D$ 3050 C$(I)=C$(I)+CHR$(VAL("&H"+D$) ) 3060 NEXT K 3070 NEXT I 3080 RETURN 3090 ' Tile Pattern Data 3100 DATA 00,00,00,00,00,00 3110 DATA 88,00,00,22,00,22 3120 DATA AA,00,00,55,00,55 3130 DATA 88,00,88,22,00,22 3140 DATA AA,00,AA,55,00,55 3150 DATA 77,00,77,DD,00,DD 3160 DATA FF,AA,FF,FF,55,FF 3170 DATA FF,77,FF,FF,DD,FF 3180 DATA FF,FF,FF,FF,FF,FF
X-BASIC for iOS V2.96のバグ
X-BASIC for iOS V2.96までで発見されたバグは、以下の通りです。
最後の1つは高速描画の弊害なので、今のところ解決手段が見つかってません。
上記のバグのため動かないサンプルがありました。
また、サンプル自体のバグも修正してあります。
・・・
V3.00では64ビット化に合わせてソース全体の見直しをしました(内部バッファー制御を一新しています)。またサンプルをもう一度全部実行しなおしていきました。SHARPのX-BASIC(/68) Ver2.0マニュアルも実家で発見したので、そこにあったサンプルも取り込みました。
その過程で多数のバグが発見されました。
すべてiOS版のみのバグです。
これで言語系のバグはほぼとれたのでは、と思います。まだ残ってましたのでV3.1で修正してます。
次バージョンではデバッグ系を強化したいと思ってます。
MZ-80K(SP-5030)レベルの簡易MMLも実装したいんだけど、出来るかどうか。
追伸:
X1-BASICからの移植をしやすいようにもしようかな思ってますが、 実家にあったはずのマニュアルが見当たりません。
「不要なのであげてもいいよ」という方がいらっしゃればお知らせください (PDFでも可)。
- E付き浮動小数点数数字をstr$()すると落ちることがある
- 文字列用usingの中に'.'があるとエラーが発生するか落ちる
- 文字列長が設定値−1文字までしか設定できない
- 長めの文字列にコード変換系関数を使った時、落ちることがある
- スプライトのパターン0を定義した時、画面左上に表示されてしまう(消せない)
- テキスト画面で属性付き表示をすると描画カスが残ることがある
- YES/NOを引数にする関数が、正しい値を受け取れてなかった(誤動作した)
- YES/NOをリターン値にする関数が、正しい値を返してなかった
- 実行時に0除算すると落ちる
- using "〜"の後ろに:なしに// または /*でコメントを記述した時usingフォーマットエラーになる
- 変数名がenum定数と同名の時にもエラーが発生しない
- 正のfloat値をprintした時、数値の前にスペースが入らない
- wait()中にBreakすると、次回RUN以後wait()がすぐ帰ってくるようになる
- motionGetRotation()/compassGetData()が正しい値を引数の変数に返さない
- loadFromURL()でエラーが発生時の処理がおかしい
- エディタで行番号とソースがずれる
- iOS8でアクションシート表示中に設定を押すと、以後一切の操作ができなくなってしまう
- 「編集」「リスト」切り替えすると、ソースコードの最後に空行が+1行されてしまう
- 編集中のプログラムをリストから削除して、再起動した時に「新規作成」と表示されない
- iOS8で、再起動時、前回選択していたソースを忘れることがある
- iOS8(iOS7でもなるかも)で外部キーボードモードの時、検索のキャンセルを押しても検索枠が消えない
- 同一グラフィックページに対するbitmapImgLoad()を短期間に呼び出すと、描画が遅れるまたは欠けることがある
最後の1つは高速描画の弊害なので、今のところ解決手段が見つかってません。
上記のバグのため動かないサンプルがありました。
また、サンプル自体のバグも修正してあります。
・・・
V3.00では64ビット化に合わせてソース全体の見直しをしました(内部バッファー制御を一新しています)。またサンプルをもう一度全部実行しなおしていきました。SHARPのX-BASIC(/68) Ver2.0マニュアルも実家で発見したので、そこにあったサンプルも取り込みました。
その過程で多数のバグが発見されました。
すべてiOS版のみのバグです。
次バージョンではデバッグ系を強化したいと思ってます。
MZ-80K(SP-5030)レベルの簡易MMLも実装したいんだけど、出来るかどうか。
追伸:
X1-BASICからの移植をしやすいようにもしようかな思ってますが、 実家にあったはずのマニュアルが見当たりません。
「不要なのであげてもいいよ」という方がいらっしゃればお知らせください (PDFでも可)。
2015年7月13日月曜日
最新の取説
V3.20の取説の在処を掲載しておきます。
このサポートブログの前の方にV2.00時代のがありますが、だいぶ変わってますので。
X-BASIC for iOS 概要
ステートメント&関数説明書
iOS依存関数
X68互換関数/便利関数/カード関数
音楽関数(ただし、これは未公開のV3.5用)
スプライトおよびBG画面について
フォント名一覧
X-BASIC/68との違い
なお、iPadでは「ほぼ」すべて内蔵ヘルプから参照できます。
2015年7月10日金曜日
[重要]progloaderの使い方;今後サンプルの公開はこれで行います
progloaderはV3.00以降に内蔵されているサンプルプログラムです。
実はこのサンプルは極めて重要な意味を持っています。
プログラム自体は簡単です。
出てきたリストから選択し、「ダウンロード」を押すと・・・
出てきたリストから選択し、「ダウンロード」を押すと・・・
その後progloaderを「終了」し、で閉じると、ダウンロードしたプログラムがプログラムリストで選択出来るようになります。
プログラムだけでなく、それに必要なデータファイルも入ります。
仕組みの詳細はあえて書きませんが「X-BASICのプログラムもデータと同じ」「.basという拡張子を持つデータがプログラム」ということです。
Zipファイルはこちら : XBprogloader.zip
(下記リストファイルのサンプルを見るためのものです。プログラムそのものは内蔵されています。)
・・・仕組み・・・
この仕組みは、progloaderだけでは成り立ちません。
このプログラムを活用する=ユーザー自身が自分のプログラム(とデータ)をダウンロードで入れ込みたい場合は、以下の準備が必要になります。
・プログラムがダウンロードできるサーバーを用意する
http(s)でプログラムがダウンロードできるように、どこかに置いておく必要があります。
・どのようなプログラムがあるかを記載したリストファイルを置く
リストファイルは以下の書式をもつUTF8のテキストファイルです。
プログラム名 zipファイル名
1行1プログラム分です。プログラム名はprogloader内で表示される名前で、zipファイル名は、それを選択した時にダウンロードされるzipファイルの名前です。X-BASICのプログラム選択で出てくる名前は、その中にある*.basのファイル名です。
それらの間は1つまたはそれ以上の半角スペースまたはタブで区切ります。
; で始まる行はコメントと見なされ、無視されます。
このリストファイルはサーバー側に置かれます。それはすなわち、progloaderを書き換えずとも、ダウンロードできるプログラムを増減できるということです。
・プログラムとデータを一緒に入れたzipファイルを置く
zipファイル内には通常*.basと必要なデータを入れておきます。
ディレクトリ構造付きでも構いません。その通りにX-BASIC for iOS内に展開されます。
なお、リストファイルとzipファイルは同じURLのフォルダ(?)に置きます。
・progloader.bas内にあるURLを書き換える
str baseURL="~"がそのURLです。
この説明を読んでも理解できない人は、使ってはいけません。
・・・注意・・・
これによって入れたプログラム本体は、プログラムリスト選択から「削除」出来ますが、
付随するデータは消されず、iOS内部に残り続けます=記憶容量を食います。
なので、別途プログラムを書いて自分で削除するか、内蔵サンプルのfiler.basを使って削除してください。
・・・念のため・・・
念の為に書いておきますと、X-BASIC'にはiOSのシステムをハッキングできるような関数は一切ありません。どのようなプログラムを書いても、そのような用途には使えません。
・・・実は・・・
実はこのプログラムはV2.96公開時に入れ込むつもりでした。いえ、仕組み的に(中で使われている関数)は入れられていましたが、progloader自体を作るのに実に1年以上かかってしまいました。
ちょいと色々ありすぎて、プログラムが組めない状況というか心境にあったからです。
V3.00の開発を始めた時には、Objective-Cどころかあらゆるプログラムをかけるかどうか解からないような状態でしたが、この開発を通じて何とか感を取り戻せたようです。気力もだいぶ回復し、見た目以上にV3.00は気合の入った出来とすることが出来ました。
外部からプログラムを入れる手段を用意出来たことで、X-BASIC'が、単なる学習ツールから、自分でちょっと使うプログラムならこれで書けるんじゃない?ってなぐらいにはなったのではないかと自画自賛しています。まあ、癖は強いと思いますが。
また、非力な内蔵エディタでは書きづらいプログラムも、MacやWindows上の自分の使い慣れたものが使えるようになるので、開発も楽になるでしょう。実際のところ、私自身もプログラムはXcodeや秀丸で書いてましたので。
となると、後はデバッグ機能をなんとかせんといかんところですが、それは「実用する人が増えたら」ということで。
まずは、ご意見ご感想お待ちしています。
・・・今後・・・
progloaderができたので、今後サンプルプログラムの公開をこれ経由で行います。
時々RUNすると、新しいプログラムが入っている事があります。
・・・ProgSaver・・・
最新のアーカイブにはprogSaver.basも含まれています。
これは、プログラムを圧縮して電子メールで送信するプログラムです。
自作プログラムを外部に保存する場合はこれを使ってください。
2015年5月28日木曜日
X-BASIC for iOS v3.00開発完了→発売中
X-BASIC for iOS v3.00の開発を開始しました。
わけあって、しばらくあらゆるプログラム開発から半年ほど離れていたので、リハビリを兼ねています。
今回は以下の予定です。
・64ビット環境対応
・よく使われる処理の内部関数化
メインは64ビット対応で、これが一番大変です。X-BASIC for iOSでは2つの点で引っかかります。
(1)データ読み書きの境界整合
X-BASIC for iOSは中間コードの管理方法がぺけ-BASICと同じで、ワークに対して.b/.w/.l単位での書き込みが混在しています(.bはワード境界整合させている)。ところがARMでは.w/.l単位の書き込みにおいて境界の制約があるのかそのままでは落ちてしまいます。なので、すべての書き込みを.w単位または.b単位に変換して行うように変更しようとしてます。もっといい方法があればいいのですが、思いつきません。
追記:
しかもこれ、シミュレーター上では発生しません。なぜなら、IntelCPUはどの境界からでもどのサイズでも書込みできてしまうからです。ARM CPUの実機でのみ発生するのです。だから、確認が極めて厄介なのです。
2015/06/03追記:
なんか、ARM実機でも落ちなくなってしました。OSレベルでトラップかけて対処されているのかもしれません。iOS6(32ビット)でも落ちないです。ひょっとしてこれはもう考えなくてもいいのかも。
(2)sizeof(long)が8バイトになってしまった
NSIntegerが64ビット環境下では8バイト=64ビットになるのは知ってましたが、まさかただのlongが8バイトに拡張されるとは思いませんでした。X-BASICは長い時間かけて開発した関係でintとlongがごっちゃになっている部分がものすごく多くあります。まあそれは型キャストかければ何とかなりますが、最大の問題はunionや構造体のサイズが変わってしまうことにあります。
X-BASIC for iOSはもともとアセンブラーで書かれていた処理をそのままCに直した部分も多いため、構造体のメンバーアクセスをメンバー名ではなくオフセットやサイズで直アクセスしている部分が多数存在します。このため、longやポインターを含む場合、全て変更が必要です。
また、ファイルのヘッダーを表す構造体は、メンバーサイズを変更してはいけません。X-BASIC for iOSはPIC他、多数のファイルフォーマットをサポートするため、その記述は注意が必要です。
さらに、定数LONG_MAXの値も変わっているため、それを参照している部分も修正が必要でした(これは盲点だった)。
(3)ポインターが8バイトになった
(2)とほとんど同じですが、従来の処理ではvoid *をunsigned longに代入して処理している部分がかなり多くあるので、数値用longとポインター用longに厳密に区別して、前者は4バイトのまま、後者は8バイトに拡張して処理を書き換える必要があります。
最初は(1)だけの問題だと思ってましたが、(2)(3)の方が重大な感じです。数も非常に多いし。果たして対応しきれるどうか。
2015/06/03現在、一応ひと通りの対応コードを書き、 プログラムの動作テスト中です。まだ動かないプログラムが存在するので、変更が抜けている部分がありそうです。それでも最初はあまりの変更の多さに「不可能ではないか」と思っていたので、動き始めたことは、気持ちを維持する上でも極めて大きな意義があります。
速度は、ワークアクセスの負荷が増えるため理屈上少し落ちるはずですが、多くはコンパイル時なので、実行中は分からない程度におさまってくれると思います。
・サンプルの追加
実用サンプルは1つだけ追加する予定です(テストは多数)。Appleに目をつけられると困るので詳細はまだ書けませんが、 あったらとても便利な機能です。あと、テスト的なものはいくつか追加されます。→結局2つ大物を追加。増えたので、次バージョンでは、内蔵サンプルも削除できるようにするか、リストから外すように出来るようにすると思う。
追伸:
SHARPのX-BASIC v2.0ユーザーリファレンスを公開できんもんでしょうか。なんとか了承が得られるといいのですが。まあ、for iOSでは使えない関数も多いのですが、やはりプロの書いた説明書はわかりやすいので。心当たりの方は教えていただけるとありがたいです(いえ、了解を取り付けていただけると感謝感激雨あられ)。手持ちの書籍版をPDF化したものはあるのですが、それをそのまま公開するとさすがにいかんと思うので。テキストで打ち込み直したらOK?
---------------------------
2015/06/26記述
開発を一応完了したのでV3.00の概要。
・64ビット環境対応;X-BASICのint自体は32ビットのままです
・iPhone6/Plus対応
・よく使われる処理を内部関数化;「X68互換関数」の実装(50以上!)
・他もちょっとだけ関数追加
・バグ取り(多数);関数、インタープリター部、エディター部
・エラーチェック強化
・取説の間違いを修正(文字列比較など)、旧バージョンに対する記述を削除
・SHIFT-JISで記述されたソースファイルを読み込んだときは自動的に強制SHIFT-JISモードになるようになるモードを追加
・サンプルのバグを修正、新関数対応。
・サンプル追加
X68互換関数は、X68とほぼ同じ動作をする関数群です。機種依存する関数は同名でも異なる動作をするものが多数でしたが、これを引数も含めほぼ同じにしています。関数名は違いますが。でも、X68上での動作のフローがわからない関数については推測で実装しているので完全に同じではないです。これはもう仕方ないということで。
思いの外大規模な変更になってしまいました。64ビット対応よりX68互換関数の追加が大きいです。さらに、バグもかなり直しました。よくもこんなに残ってたな、という感じです。サンプルプログラムは全部を再動作検証して全て書き換えました。
あとはアップルの審査が通るのを待つだけです。
お願いです。手元には64ビットの実機がありません。iPhone6や同plusもありません。なので、テストはシミュレーター上でしか行えていません。
インストールされた方で実機上で不具合が出る、という方は詳細な情報とともに、お知らせください。
---------------------------
2015/07/10記述
発売開始されました。
それに伴い、重要なサンプルの説明を公開しました。
わけあって、しばらくあらゆるプログラム開発から半年ほど離れていたので、リハビリを兼ねています。
今回は以下の予定です。
・64ビット環境対応
・よく使われる処理の内部関数化
メインは64ビット対応で、これが一番大変です。X-BASIC for iOSでは2つの点で引っかかります。
(1)データ読み書きの境界整合
X-BASIC for iOSは中間コードの管理方法がぺけ-BASICと同じで、ワークに対して.b/.w/.l単位での書き込みが混在しています(.bはワード境界整合させている)。ところがARMでは.w/.l単位の書き込みにおいて境界の制約があるのかそのままでは落ちてしまいます。なので、すべての書き込みを.w単位または.b単位に変換して行うように変更しようとしてます。もっといい方法があればいいのですが、思いつきません。
追記:
しかもこれ、シミュレーター上では発生しません。なぜなら、IntelCPUはどの境界からでもどのサイズでも書込みできてしまうからです。ARM CPUの実機でのみ発生するのです。だから、確認が極めて厄介なのです。
2015/06/03追記:
なんか、ARM実機でも落ちなくなってしました。OSレベルでトラップかけて対処されているのかもしれません。iOS6(32ビット)でも落ちないです。ひょっとしてこれはもう考えなくてもいいのかも。
(2)sizeof(long)が8バイトになってしまった
NSIntegerが64ビット環境下では8バイト=64ビットになるのは知ってましたが、まさかただのlongが8バイトに拡張されるとは思いませんでした。X-BASICは長い時間かけて開発した関係でintとlongがごっちゃになっている部分がものすごく多くあります。まあそれは型キャストかければ何とかなりますが、最大の問題はunionや構造体のサイズが変わってしまうことにあります。
X-BASIC for iOSはもともとアセンブラーで書かれていた処理をそのままCに直した部分も多いため、構造体のメンバーアクセスをメンバー名ではなくオフセットやサイズで直アクセスしている部分が多数存在します。このため、longやポインターを含む場合、全て変更が必要です。
また、ファイルのヘッダーを表す構造体は、メンバーサイズを変更してはいけません。X-BASIC for iOSはPIC他、多数のファイルフォーマットをサポートするため、その記述は注意が必要です。
さらに、定数LONG_MAXの値も変わっているため、それを参照している部分も修正が必要でした(これは盲点だった)。
(3)ポインターが8バイトになった
(2)とほとんど同じですが、従来の処理ではvoid *をunsigned longに代入して処理している部分がかなり多くあるので、数値用longとポインター用longに厳密に区別して、前者は4バイトのまま、後者は8バイトに拡張して処理を書き換える必要があります。
最初は(1)だけの問題だと思ってましたが、(2)(3)の方が重大な感じです。数も非常に多いし。果たして対応しきれるどうか。
2015/06/03現在、一応ひと通りの対応コードを書き、 プログラムの動作テスト中です。まだ動かないプログラムが存在するので、変更が抜けている部分がありそうです。それでも最初はあまりの変更の多さに「不可能ではないか」と思っていたので、動き始めたことは、気持ちを維持する上でも極めて大きな意義があります。
速度は、ワークアクセスの負荷が増えるため理屈上少し落ちるはずですが、多くはコンパイル時なので、実行中は分からない程度におさまってくれると思います。
・サンプルの追加
実用サンプルは1つだけ追加する予定です(テストは多数)。Appleに目をつけられると困るので詳細はまだ書けませんが、 あったらとても便利な機能です。あと、テスト的なものはいくつか追加されます。→結局2つ大物を追加。増えたので、次バージョンでは、内蔵サンプルも削除できるようにするか、リストから外すように出来るようにすると思う。
追伸:
SHARPのX-BASIC v2.0ユーザーリファレンスを公開できんもんでしょうか。なんとか了承が得られるといいのですが。まあ、for iOSでは使えない関数も多いのですが、やはりプロの書いた説明書はわかりやすいので。心当たりの方は教えていただけるとありがたいです(いえ、了解を取り付けていただけると感謝感激雨あられ)。手持ちの書籍版をPDF化したものはあるのですが、それをそのまま公開するとさすがにいかんと思うので。テキストで打ち込み直したらOK?
---------------------------
2015/06/26記述
開発を一応完了したのでV3.00の概要。
・64ビット環境対応;X-BASICのint自体は32ビットのままです
・iPhone6/Plus対応
・よく使われる処理を内部関数化;「X68互換関数」の実装(50以上!)
・他もちょっとだけ関数追加
・バグ取り(多数);関数、インタープリター部、エディター部
・エラーチェック強化
・取説の間違いを修正(文字列比較など)、旧バージョンに対する記述を削除
・SHIFT-JISで記述されたソースファイルを読み込んだときは自動的に強制SHIFT-JISモードになるようになるモードを追加
・サンプルのバグを修正、新関数対応。
・サンプル追加
X68互換関数は、X68とほぼ同じ動作をする関数群です。機種依存する関数は同名でも異なる動作をするものが多数でしたが、これを引数も含めほぼ同じにしています。関数名は違いますが。でも、X68上での動作のフローがわからない関数については推測で実装しているので完全に同じではないです。これはもう仕方ないということで。
あとはアップルの審査が通るのを待つだけです。
お願いです。手元には64ビットの実機がありません。iPhone6や同plusもありません。なので、テストはシミュレーター上でしか行えていません。
インストールされた方で実機上で不具合が出る、という方は詳細な情報とともに、お知らせください。
---------------------------
2015/07/10記述
発売開始されました。
それに伴い、重要なサンプルの説明を公開しました。
登録:
投稿 (Atom)