2013年2月28日木曜日

SHIFT-JIS文字ほぼ全一覧表示(UTF8版)

X68000がサポートしていたSHIFT-JIS文字ほぼ全てを一覧表示します。
算術で作り出したSHIFT-JISコードを表示時にUTF8に変換しています。
強制SHIFT-JISモードをオフに設定して実行してください。
// UTF8版
/* SHIFT-JIS 全文字コード表示プログラム 
// テキスト画面がスクロールできないのでページ切り替え
    font("Migu 1M")
    int fzenhan:// YES=
    width(64,,fzenhan)
    print "fzenhan=";fzenhan
    cls()
    
    if isLocalizeJapan() then {
        setFunctionKey(0,"次へ",&h0d)
        setFunctionKey(1,"中断",&h1b)
        print "半角文字"
    } else {
        setFunctionKey(0,"Next",&h0d)
        setFunctionKey(1,"Break",&h1b)
        print "Half-Width Character"
    }
    print_code0(fzenhan)
    //
    displayFunctionKey(YES,0,1)
    //
    while YES
        if print_code(&h8100,&h9fff) then break
        if print_code(&he000,&hefff) then break
        print_head()
        break
    endwhile
    //
    // ファンクションキー表示は個数を変えても自動的に前の表示は消えないので、
    // ユーザーが消す必要がある(そうしないと表示が重なる)
    displayFunctionKey(NO,0,1)
    if isLocalizeJapan() then {
        setFunctionKey(0,"終了",&h0d)
    } else {
        setFunctionKey(0,"End",&h0d)
    }
    displayFunctionKey(YES,0,0)
    int ky
    repeat
        ky=inkey()
    until ky<>0
end

//--------------------------------

func print_head()
    if fzenhan then {
        print "-code-:-+0-+1-+2-+3-+4-+5-+6-+7-+8-+9-+A-+B-+C-+D-+E-+F-"
    } else {
        print "-code-:-0-1-2-3-4-5-6-7-8-9-A-B-C-D-E-F-"
    }
endfunc

func print_skip()
    print "      :                                                "
endfunc

func str hex4$(h;int)
    return (right$("0000"+hex$(h),4))
endfunc

func str hex2$(h;int)
    return (right$("00"+hex$(h),2))
endfunc

func printChr(h;int,l;int)
    print chr$((h shl 16)or l);
endfunc

func int print_code(st;int,ed;int)
/* 全角文字表示 
int i,li,hi
int j
    for i=st to ed
        hi=i / 256
        li=i mod 256
        if li=0 then {
            print_head()
            int ky
            int ts=time()
            int dt=0,t
            repeat
                ky=inkey()
                t=time()
                if t-ts>dt then { :/* 秒が変った
                    dt=dt+1
                    locate(40,0):print dt
                    beep2(0)
                }
            until ky<>0
            if ky=&h1b then return (YES)
            cls()
            if isLocalizeJapan() then {
                print "全角文字"
            } else {
                print "Double-Width character"
            }
            print_head()
        }
        if li<&h40 then continue:/* 下位8ビットが<$40の文字はない 
        
        /* アドレス表示 
        print " ";hex4$(i);" :";
        for j=0 to 16-1
            print " ";
            int c=(i+j) and &hff
            if c<&h40 or c=&h7f or c>=&hfd then { /* 未定義文字 
                if fzenhan then {
                    print "**";
                } else {
                    print "*";
                }
            } else {
                c=sjisToUtf8(i+j)
                print chr$(c);    /* 途中で桁上がりを起こさないことを前提にした処理 
            }
        next
        print
        i=i+16-1:/* 次のnext +1されるから
    next
    return (NO)
endfunc

func print_code0(fzenhan;int)
/* 半角文字表示 
int li
int j,c
    print_head()
    for li=&h20 to &he0-1
        /* 途中表示しないエリア 
        if li=&h80 then print_skip()
        if li>=&h80 and li<=&h9f then continue
        
        /* アドレス表示 
        print "  ";hex2$(li);"  :";
        /* 文字表示
        for j=0 to 16-1
            print " ";
            c=li+j
            if c=&h7f or c=&ha0 then c='*' else c=sjisToUtf8(c)
            print chr$(c);
            if fzenhan then print " ";:/* 全角=半角*2のフォントの時は後ろにスペースを入れる
        next
        print
        li=li+16-1:/* 次のnext +1されるから
    next
endfunc

Zipファイル :XBetc.zip

2013年2月27日水曜日

ビンゴゲーム

いわゆるビンゴゲーム。コンピューターと対戦します。
多くのタッチエリアを設定しています。
画面表示の関係上、iPadの縦画面専用です。
//--------------------------------------------------------------------------------
/* BINGO
// for X-BASIC for iOS v2.0
//--------------------------------------------------------------------------------

if deviceType()<>DEVICE_IPAD and deviceType()<>DEVICE_IPAD_SIMULATOR then {
    print localizedString("このプログラムはiPad専用です","This program only for iPad.")
    end
}
dim int A(5,11),B(12,2)
dim int keyAreaNo(5,5)
int d,L,T,E,F
int WX,WY
int sx,sy,ex,ey
int OPEND=100:// 定数
/*
srand2()
width(64)
getWidth(WX,WY)
setUpScroll(NO):// テキスト画面の上スクロールを止める (V2.0)
apage(GPAGE0)
vpage(B_TPAGE or B_GPAGE0 or B_GPAGE1,YES)
//display_title()

d=0
dim str menues(1)
str title
int e
repeat
    cls()
    apage(GPAGE1):wipe()
    apage(GPAGE0):wipe()
    gcolor(-TWHITE,0,0,255)
    symbol(128,2,"BINGO GAME","IPAGothic",48)
    gcolor(-THWHITE,0,0,255)
    symbol(129,3,"BINGO GAME","IPAGothic",48)
    gcolor(-THRED,0,0,255)
    box(13,64,748,614)
    tcolor(-THWHITE,0,0,255)
    shuffle():// 数字の設定
    field_print():// 数字表示&タッチエリア設定
    print_number(NO)
    /*
    if isLocalizeJapan() then {
        menues={"先手","後手"}
        title="順番選択"
    } else {
        menues={"First move","Passive move"}
        title="Moving order"
    }
    repeat
        L=selectMenu2(title,menues):// -1,0,1
    until L>=0:// -1=BREAK/outside menu touch
    L=L+1:// 0,1->1,2

    sub_cls()
    /*
    for e=0 to 12
        B(e,0)=0
        B(e,1)=0
        B(e,2)=0
    next
    E=0:F=0:T=0
    repeat
        T=T+1
        tcolor(-THWHITE,0,0,255)
        locate(6,17)
        if isLocalizeJapan() then {
            print"第";T;"手"
        } else {
            print"The";T;" hand"
        }
        repeat
            switch L
                case 1:
                    locate(11,19)
                    print localizedString("あなた:","You : ");
                    d=input_num()
                    L=2
                    break
                case 2:
                    locate(38,19)
                    print localizedString("コンピューター:","Computer : ");
                    d=com_num()
                    //beep()
                    L=1
                    break
            endswitch
            int cx=pos()
            int cy=csrlin()
            int ffind=check_num(d)
            if not ffind then {
                // 見つからなかった
                // 人間側のみありえる
                L=1
                beep()
                // 選択しなおし
            }
        until ffind
        locate(cx,cy):print d
    until (F>=5) or (E>=5)
    resetALlKeys():// タッチエリアの解除
    sub_cls()
    print_number(YES)
    hantei(E,F)
    locate(11,24)
    if isLocalizeJapan() then {
        print "御苦労さまでした"
        menues={"はい","いいえ"}
        title="もう一度しますか?"
    } else {
        print "Cheers for hard work was."
        menues={"YES","NO"}
        title="Try again ?"
    }
    L=selectMenu2(title,menues):// -1=stop,0=YES,1=NO
until L=1 or L=-1
end

//--------------------------------------------------------------------------------
// functions
//--------------------------------------------------------------------------------

func hantei(E;int,F;int)
/* 勝ち負け判定
    tcolor(-THYELLOW,0,0,255)
    locate(10,23)
    if isLocalizeJapan() then {
        print E;" 対";F;"で ";
    }
    if F<E then {
           print localizedString("あなたの勝ち","You win");
    } else {
        if E<F then {
            print localizedString("コンピューターの勝ち","Computer win");
        } else {
            print localizedString("引き分け","Draw");
        }
    }
    if not isLocalizeJapan() then {
        print " in the";E;"-for-";F
    }
endfunc
/*
func int input_num()
/* 人間の数字選択
int num
//    kbclr()
    // キー入力待ち
    while not kbhit()
    endwhile
    // エリアをタッチすると、数字がキーコードとして返ってくる
    num=inkey()
    return(num)
endfunc
/*
func int check_num(d;int)
/* 番号チェック&マスオープン
int h,x,y,ac,bb,i,j
    for h=1 to 2:// 両方を調べる
        // 数字からマス座標を得る
        int ffind=NO
        for i=1 to 5
            for j=1 to 5
                ac=A(i,j+(h-1)*6)
                if ac=d then {
                    x=i:y=j
                    ffind=YES
                    break
                }
            next
            if ffind then break
        next
        if not ffind then {
            // 見つからない
            locate(0,5):print "見つからない"
            return (NO)
        }
        //
        apage(GPAGE1)
        switch h
            case 1:gcolor(-THMAGENTA,0,0,200):break
            case 2:gcolor(-THGREEN  ,0,0,200):break
        endswitch
        calc_grid_gxy(x,y,h-1):// ->sx,sy,ex,ey
        fill(sx,sy,ex,ey)
        apage(GPAGE0)
        //
        A(x,y+(h-1)*6)=ac+OPEND:/* 開いたの印
        bb=0
        if x=y   then bb=B(12,h):B(12,h)=bb+1
        if x=6-y then bb=B(11,h):B(11,h)=bb+1
        bb=B(x,h)  :B(x  ,h)=bb+1
        bb=B(y+5,h):B(y+5,h)=bb+1
        x=0
        for i=1 to 12
            x=x+B(i,h)\5
        next
        if (h=1) and (E<x) then {
            locate(11,15)
            if isLocalizeJapan() then {
                print "あなた:";x;"列"
            } else {
                print "You :";x;" lines"
            }
            E=x
            beep2(7)
        } else {
            if (h=2)*(F<x) then {
                locate(38,15)
                if isLocalizeJapan() then {
                    print "コンピューター:";x;"列"
                } else {
                    print "Computer :";x;" lines"
                }
                F=x
                beep2(8)
            }
        }
    next
    // 見つかって処理した
    return (YES)
endfunc
/*
func int com_num()
/* コンピューターの番号考え
int i,j,m,bb,c
    m=0
    for i=1 to 5
        for j=1 to 5
            bb=0
            if A(i,j+6)<OPEND then {
                if i=j   then bb=   1+B(12,2)
                if i=6-j then bb=bb+1+B(11,2)
                bb=bb+2+B(i,2)+B(j+5,2)
                if bb>m then c=A(i,j+6):m=bb
            }
        next
    next
//    locate(0,26):print "com=";c
    return(c)
endfunc
/*
func sub_cls()
/* 画面一部クリア
    int y
    for y=16 to WY
        locate(0,y):print space$(WX);
    next
endfunc
/*
func shuffle()
/* マス内数字シャッフル
int i,j,l,h
int c,x,y
    for l=0 to 1:/* l=0:あなた , 1=コンピューター
        /* まずはマス内に順番に数字を入れる
        /* A(i,j) : j=1〜5:あなた , 6〜11:コンピューター
        h=0
        for i=1 to 5
            for j=1 to 5
                h=h+1
                A(i,j+l*6)=h
            next
        next
        /* マスを入れ替える
        for i=1 to 5
            for j=1 to 5
                x=rand() mod 5+1
                y=rand() mod 5+1+l*6
                c=A(i,j+l*6)
                A(i,j+l*6)=A(x,y)
                A(x,y)=c
            next
        next
    next
endfunc
/*
func print_number(mode;int)
/* マス内番号表示
// mode : NO=人側のみ開く , YES=コンピューター側を開く
int i,j,c
int x,y
    tcolor(-THWHITE,0,0,255)
    for i=1 to 5
        x=(i-1)*5
        for j=1 to 5
            y=j*2+2
            if not mode then {
                // 人側(Human)のみ開く
                c=A(i,j)
                if c>OPEND then c=c-OPEND:/* すでに開いているマスの時
                locate(x+ 7,y):print using "##";c
                locate(x+36,y):print "??"
            } else {
                // コンピューター側(Computer)を開く
                c=A(i,j+6)
                if c>OPEND then c=c-OPEND:/* すでに開いているマスの時
                locate(x+36,y):print using "##";c
            }
        next
    next
endfunc
/*
func field_print()
/* フィールド描画
// 先にshuffle()で数字を確定しておくこと
int l,i,j
    for l=0 to 1:/* l=0:あなた , 1=コンピューター
        if l=0 then {
            tcolor(-THCYAN,0,0,255)
            locate(11,14)
            print localizedString("あなたのマス目","Your grid")
        } else {
            tcolor(-THYELLOW,0,0,255)
            locate(36,14)
            print localizedString("コンピューターのマス目","  Computer grid  ")
        }
        // ます線描画
        gcolor(-THMAGENTA,0,0,255)
        for i=1 to 5
            for j=1 to 5
                calc_grid_gxy(i,j,l):// ->sx,sy,ex,ey
                box(sx,sy,ex,ey)
                if l=0 then {
                    // タッチエリアの設定
                    // 人間側のみ
                    // キーコードに数字を入れておく
                    keyAreaNo(i,j)=setTouchArea(sx,sy,(ex-sx),(ey-sy),A(i,j),YES)
                    // save touch area No into keyAreaNo()
                }
            next
        next
    next
    tcolor(-THWHITE,0,0,255)
endfunc
/*
func resetALlKeys()
// 全タッチアリアの解除(重要)
    int i,j
    for i=1 to 5
          for j=1 to 5
            removeTouchArea(keyAreaNo(i,j))
        next
    next
endfunc
/*
func calc_grid_gxy(i;int,j;int,l;int)
// マス目座標からグラフィック表示座標を得る
int x,y
    x=textX2Gx((i-1)*5+7)+l*340
    y=textY2Gy(j*2+2)
    // 以下リターン値(グローバル変数)
    ex=textX2Gx((i-1+1)*5+7)+l*340-12
    ey=textY2Gy((j+1)*2+2)-12
    sx=x-12
    sy=y-12
endfunc
/*
func display_title()
/* タイトル描画
int i,x
str s,s1
    wipe()
    lineWidth(2)
    gcolor(-THRED,0,0,255)
    box(61,4,448,128)
    gcolor(-THMAGENTA,0,0,200)
    fill(63,6,446,126)
    s="BINGO"
    for i=0 to 4
        x=i*70+90
        s1=utf8Mid$(s,i+1,1)
        gcolor(-TWHITE,0,0,255)
        symbol(x-11,16,s1,"Times New Roman",64)
        gcolor(-THWHITE,0,0,255)
        symbol(x-9 ,18,s1,"Times New Roman",64)
    next
    /*
    gcolor(-TGREEN,0,0,255)        :fill(112,180,400,320)
    //
    str copyright="Presented by AIG-SOFT"
    str forMachine="for X-BASIC or iOS"
    gcolor(-TWHITE,0,0,255)
    symbol(170,201,copyright,"IPAGothic",16)
    symbol(180,231,forMachine,"IPAGothic",16)
    gcolor(-THWHITE,0,0,255)
    symbol(169,200,copyright,"IPAGothic",16)
    symbol(179,230,forMachine,"IPAGothic",16)
    //
    gcolor(-THRED,0,0,255)
    box(109,178,403,324)
    hitKey()
endfunc
/*
func srand2()
/* 乱数初期化
int t
    t=val(right$(time$,2))+val(mid$(time$,4,2))
    srand(t*16)
endfunc
/*
func hitKey()
    setFunctionKey(0,localizedString("ここを押してください","Hit This Button"),'!')
    displayFunctionKey(YES,0,0)
    while inkey()=0
    endwhile
    cls()
    displayFunctionKey(NO,0,0)
endfunc

func str localizedString(js;str,es;str)
    if isLocalizeJapan() then return(js)
    return (es)
endfunc


//--------------------------------------------------------------------------------

Zipファイル :XBbingo.zip

2013年2月26日火曜日

電子メイル関数テスト

電子メイル関数のサンプルプログラムです。 別途pngファイルを用意しておいてください(添付ファイルを作るため)。
//------------------------------------------------
/* eMailSend() test
//------------------------------------------------

dim str fileList(256):// ()内は扱える最大ファイル数
int cnt
// ここをpng->jpegと変更してテスト
cnt=files(fileList,"","png",YES,FILES_FILE)
if isLocalizeJapan() then {
 print "該当ファイル数=";cnt
} else {
 print "Corresponding file number=";cnt
}
int i
for i=0 to cnt-1
 print i;":";fileList(i)
next

// (1)添付なし
if isLocalizeJapan() then {
 print "(1)添付なし"
 emailSend("件名1","本文1")
} else {
 print "(1)no attachment"
 emailSend("subject1","body1")
}
//hitKey()
// (2)そのまま添付
if isLocalizeJapan() then {
 print "(2)そのまま添付"
 emailSend("件名2","本文2(添付付き)",fileList,3)
} else {
 print "(2)attach each file"
 emailSend("subject2","body2(with attachment)",fileList,3)
}
//hitKey()
// (3)zip圧縮添付
if isLocalizeJapan() then {
 print "(3)zip圧縮添付"
 emailSend("件名3","本文3(zip添付付き)",fileList,10,"testzip.zip")
} else {
 print "(3)attach with zip archive"
 emailSend("subject3","body3(zip archive)",fileList,10,"testzip.zip")
}

if isLocalizeJapan() then {
 print "全送信終了"
} else {
 print "All send finish."
}

//------------------------------------------------
end
//------------------------------------------------
func hitKey()
 str exit$
 if isLocalizeJapan() then {
  exit$="次へ"
 } else {
  exit$="To Next"
 }
 setFunctionKey(0,exit$,'!')
 displayFunctionKey(YES,0,0)
 while inkey()=0
 endwhile
 cls()
 displayFunctionKey(NO,0,0)
endfunc

Zipファイル :XBtests.zip

2013年2月25日月曜日

電子コンパス関数テスト

電子コンパス関数のテストプログラムです。 iPod touchには電子コンパスはないので利用できません。 (これが電話以外のiPhoneとの違い。)
//----------------------------------------------------------------------------------------------
// compass test
//----------------------------------------------------------------------------------------------

print "version Motion=";versionXBiOSMotion$()

font("Cochin",6):// ファンクションキーのフォントを設定
setFunctionKey(0,"end"   ,'!')
setFunctionKey(1,"pause" ,'p')
setFunctionKey(2,"start" ,'s')
setFunctionKey(3,"clear" ,'c')
displayFunctionKey(YES,0,3)
kBackgroundAlpha(0.9)
font("IPAGothic")

if compassStart(10) then {
 print localizedString("方位取得は使えません","Can't use compass.")
 end
}

float degree,magnetic
int ky,cnt,i

while YES
 if not kbhit() then {
  i=0
  cnt=compassCount()
  if cnt>0 then locate(0,1):print "cnt=";cnt
  while cnt>0
   degree=compassGetData(magnetic)
   locate(0,2+i)
   if isLocalizeJapan() then {
    print using "極北からの角度=###.####,磁北からの角度=###.####";degree,magnetic
   } else {
    print using "true=###.####,magnetic=###.####";degree,magnetic
   }
   cnt=cnt-1
   i=i+1
   if kbhit() then break
  endwhile
 } else {
  ky=inkey()
  switch ky
   case 'p'
    compassPause(YES)
    print "Pause"
    break
   case 's'
    compassPause(NO)
    print "Start"
    break
   case 'c'
    cls()
    compassClear()
    break
   default:
    // 念のため
    beep()
    break
  endswitch
  if ky='!' then break
 }
endwhile
compassEnd()
end

//----------------------------------------------------------------------------------------------

func str localizedString(js;str,es;str)
 if isLocalizeJapan() then return(js)
 return (es)
endfunc

//----------------------------------------------------------------------------------------------

Zipファイル :XBtests.zip

2013年2月24日日曜日

音声関数テスト

音声関数のテストプログラムです。
最初にあるa_setPlayData()に、手持ちの音声ファイルを指定してください。
サンプル曲は満開製作所の「Muff&Huff」より拝借しています(自由に利用できる曲)。

// audio test

// ↓手持ちの音声ファイルを指定してください
// サンプルは満開製作所「Muff&Huff」より
int sno=a_setPlayData("EARTH SONG #1.mp3")
if (sno=-2) then {
 print "sound file not found."
 end
}
int wx
//
dim int touchNo(10) :// タッチエリア番号
int touchCnt  :// タッチエリア数

font("IPAGothic")
int fzenhan
int WX=64:if deviceType()<>1 then WX=48
int WY=width(WX,,fzenhan)
int xw=1:/* 全角1文字の桁数
if fzenhan then xw=2

 str exit$
 if isLocalizeJapan() then {
  exit$="中断"
 } else {
  exit$="exit"
 }
 int x=WX/2-18
 int y=WY/2
     //  012345678901234567890123456789
 locate(x,y+0):print "      ┏━┓"
 locate(x,y+1):print "      ┃8┃"
 locate(x,y+2):print "      ┗━┛"
 locate(x,y+3):print "┏━┓┏━┓┏━┓    ┏━━┓"
 locate(x,y+4):print "┃4┃┃?┃┃6┃    ┃";exit$;"┃"
 locate(x,y+5):print "┗━┛┗━┛┗━┛    ┗━━┛"
 locate(x,y+6):print "      ┏━┓"
 locate(x,y+7):print "      ┃2┃"
 locate(x,y+8):print "      ┗━┛"

 int i=0
 touchNo(inc(i))=setTouchArea(textX2Gx(x+ 6),textY2Gy(y  ),textX2Gx(xw*3),textY2Gy(3),'8',YES,  0,50,55,220)
 touchNo(inc(i))=setTouchArea(textX2Gx(x+ 6),textY2Gy(y+6),textX2Gx(xw*3),textY2Gy(3),'2',YES,  0,50,55,220)
 touchNo(inc(i))=setTouchArea(textX2Gx(x   ),textY2Gy(y+3),textX2Gx(xw*3),textY2Gy(3),'4',YES,  0,50,55,220)
 touchNo(inc(i))=setTouchArea(textX2Gx(x+12),textY2Gy(y+3),textX2Gx(xw*3),textY2Gy(3),'6',YES,  0,50,55,220)
 //
 touchNo(inc(i))=setTouchArea(textX2Gx(x+ 6),textY2Gy(y+3),textX2Gx(xw*3),textY2Gy(3),'?',YES,150,50, 5,120)
 touchNo(inc(i))=setTouchArea(textX2Gx(x+22),textY2Gy(y+3),textX2Gx(xw*4),textY2Gy(3),'!',YES,150, 5 ,5,120)
 touchCnt=i
 //

  keyRepeatTime(0,0):// リピート無し
 //
 setFunctionKey(0,exit$,'!')
 setFunctionKey(1,"V-UP",'u')
 setFunctionKey(2,"V-DN",'d')
 setFunctionKey(3,"SPD",'S')
 setFunctionKey(4,"LP=1",'1')
 setFunctionKey(5,"LP∞" ,'0')
 setFunctionKey(6,"LP=2",'2')
 setFunctionKey(7,"PAN",'c')
 setFunctionKey(8,"stop",'s')
 setFunctionKey(9,"cont",'C')

 setFunctionKeyBackgroundImage("funcBack.png")
 displayFunctionKeyAll(YES)

 int speed=0
 int pan=0
 str cs
 int dt=0,t
 int ts=time():/* 開始時間
 locate(20,1)
 a_play(sno)
 while YES
// while a_stat(sno)
  // キー入力待ちしながら時計を回す
  while (not kbhit())
   /* キー入力の無い間
   t=time()
   if t-ts>dt then { :/* 秒が変った
    dt=dt+1
    locate(20,0):print dt;
    beep2(0)
    locate(20,1)
   }
  endwhile
  // キー操作判定
  cs=inkey$()
  switch cs
   case "u":a_volume(sno,1.0):break
   case "d":a_volume(sno,0.05):break
   case "S":
    switch speed
     case 0:a_speed(sno,2.0):break
     case 1:a_speed(sno,0.5):break
     case 2:a_speed(sno,1.0):break
    endswitch
    speed=speed+1
    break
   case "1":
    a_loop(sno,1):print "loop=1"
    break
   case "2":
    a_loop(sno,2):print "loop=2"
    break
   case "0":
    a_loop(sno,0):print "loop=∞"
    break
   case "c":
    switch pan
     case 0:a_pan(sno,-1.0):inc(pan):break
     case 1:a_pan(sno, 0.0):inc(pan):break
     case 2:a_pan(sno, 1.0):pan=0:break
    endswitch
    break
   case "r"
    break
   case "s":a_stop(sno):break
   case "C":a_cont(sno):break
  endswitch
  print cs;
  if cs="!" then break
 endwhile
 a_end(sno)
 print "end"
end

func resetTouchArea()
// タッチエリアの解除
int i
 for i=0 to touchCnt
  removeTouchArea(touchNo(i))
 next
 touchCnt=0
endfunc
サンプル音声ファイル入り圧縮ファイル:XBaudioTest.zip

2013年2月16日土曜日

音声ファイルローダー

サポートしている音声ファイルを順次演奏します。
サンプル音声はZ-MUSIC v3から無断で借りています。
不都合があればご連絡ください。

// Sound player
// for X-BASIC for iOS v1.7 later

width(64)
//
vpriority(TPAGE,GPAGE0,GPAGE1,GPAGE2,GPAGE3)
vpage(B_TPAGE or B_GPAGE0 or B_GPAGE1 or B_GPAGE2 or B_GPAGE3,YES)
apage(GPAGE0)
//
// 全ファイルリストを得る
dim str fileList(256):// ()内は扱える最大ファイル数
int allcnt
int i,ret
str ext
//
// 拡張子(大文字小文字を区別するので注意)
// 正規表現
ext="PCM|pcm|wav|WAV|aiff|AIFF|M44|P16|M30":
allcnt=files(fileList,"",ext,YES,FILES_FILE,YES)
if allcnt<=0 then {
 locate(0,0)
 print localizedString("音声ファイルがありません":"Sound file not found.")
} else {
 int no
 for i=0 to allcnt-1
  locate(0,0):print fileList(i)
  str pext=pathExtension(fileList(i))
  strupr(pext)
  if pext="PCM" then {
   print "(ADPCM)"
   no=a_setPlayData(fileList(i),0)
  } else {
   no=a_setPlayData(fileList(i))
  }
  a_play(no)
  hitKey()
  a_end(no)
 next
}
end
//---------
func hitKey()
 setFunctionKey(0,localizedString("ここを押してください","Hit This Button"),'!')
 displayFunctionKey(YES,0,0)
 while inkey()=0
 endwhile
 cls()
 displayFunctionKey(NO,0,0)
endfunc
//---------
func str localizedString(js;str,es;str)
 if isLocalizeJapan() then return(js)
 return (es)
endfunc
//---------
音声サンプルを含む圧縮ファイルはこちら XBsoundloader.zip

2013年2月15日金曜日

しずくデモ

しずくが上から落ちてきて、いっぱいになったらまた最初から繰り返すデモです。
終了するには「×」を押してください。

/******************************************************************/
/* しずくデモ
/******************************************************************/
/* 内蔵フォントを使うので、全角文字もOK

/* これらは変数であって定数ではないので、グローバル配列の大きさ指定やcase値には使えない
int WX ://=(80/2)
int WY ://=24
int MAX =75  :/* 棚の本数   
int LNG =5  :/* 滴の最大長さ

/* 内部キャラクター
int WALL='#' :/* 外壁
int BALL='o' :/* 滴  
int TANA='=' :/* 棚 
int SPC =' ' :/* 空間

int dx,dy :/* 移動方向
int clng :/* 動作中ポインター
int retY :/* X-BASICレベルでは2つのリターン値を戻せないのでグローバル変数を経由する

dim int drpx(5)   :/* 移動x座標バッファー
dim int drpy(5)   :/* 移動y座標バッファー
dim char tvram(96,96) :/* 仮想VRAM / virtual video RAM
      :/* 機種によってサイズが可変なので、最大値で確保しておく

int wtt  :/* ウエイト

/******************************************************************/
/* メインルーチン
/******************************************************************/

getWidth(WX,WY):// システムの設定したテキスト画面サイズを得る
setUpScroll(NO):// テキスト画面の上スクロールを止める (V2.0)
 WX=WX/2
MAX=(WX*WY/13)
int ts,t
/*int c
 srand2() /* 乱数初期化
 wtt=CalcWait()/100*8:/* ウエイト算出(8ms)
 repeat
  InitScreen() :/* 画面初期化
  if Cascades() then break:/* 滴移動
  beep()
  locate(8,7)
  if isLocalizeJapan() then {
   print "もう一度見ますか? ";
  } else {
   print "Watch again ?";
  }
 /* c='Y';
  ts =time()
  repeat:/* 15秒たったら自動的に再開する
   t=time()
  until t-ts>=15
 until NO :/*(c<>'Y' && c<>CR)
end

/******************************************************************/
/* 以下内部関数
/******************************************************************/

func InitScreen()
/* 初期画面作成
int i,j,x,y
 cls()
 print "  CASCADES"
 init_tvram()

 /* 外枠作成
 for y=1 to WY-2:/* 縦
  storexy(   0,y,WALL)
  storexy(WX-1,y,WALL)
 next
 for x=0 to WX-1:/* 横
  storexy(x,WY-1,WALL)
 next

 /* 棚作成
 for i=0 to MAX-1
  x=1+rand2(WX-2) :/* 両端を除く
  y=2+rand2(WY-3) :/* 一番上とその次と最下行を除く
  for j=0 to 3
   if (x+j>=WX-1) then break /* x-over
   if (scrn(x+j,y)=SPC) then storexy(x+j,y,TANA)
  next
 next
 // 全画面一気表示
 printScreenAll(1,WY-1)
endfunc

/******************************************************************/

func int Cascades()
/* 滴処理
int x,y
//int ts=time():/* 開始時間
//int t,dt=0
 while CheckDropPoint()=0
  /* 開いているとき
  /* 初期位置設定
  x=SetFirstPoint()
  y=1
  repeat
   //t=time()
   //if t-ts>dt then { :/* 秒が変った
   // dt=dt+1
   // locate(30,0):print dt;
   //}
   //if inkey()=ESC then return(1)

   /* 移動&表示
   Drop(x,y)
   if clng=0 then break
   clng=clng-1
   x=drpx(clng)
   y=drpy(clng)
  until x=0 and y=0
 endwhile
 /* 最上行が開いていなかったら終わり
 return(0)
endfunc

/******************************************************************/

func int CheckDropPoint()
/* 最上行が開いているかどうかを調べる
int x
 for x=1 to WX-2
  if scrn(x,1)=SPC then return(0) :/* 開いている
 next
 return(1) :/* 開いていない
endfunc

/******************************************************************/

func int SetFirstPoint()
/* スタートポイント設定(最上行)
int i,x
 x=1+rand2(WX-2):/* 始点決定
 while scrn(x,1)<>SPC
  x=x+1
  if (x=WX-1) then x=1
 endwhile
 clng=LNG-1
 for i=0 to clng-1
  drpx(i)=0
  drpy(i)=0:/* 0=未記録の印
 next
 drpx(clng)=x
 drpy(clng)=1
 dx=0
 dy=1: /* 下へ
 return(x)
endfunc

/******************************************************************/

func Drop(x;int,y;int)
/* 移動&表示
int r,l
 while (YES)
  /* 表示
  printxy(x,y,BALL)
  TWait(wtt):/* ウエイト
  
  /* 下が開いている?
  if scrn(x,y+1)=SPC then {
   /* 無条件に下に落ちる
   dx=0
   dy=1
   x=Move(x,y)
   y=retY
   continue
  }
  
  /* 移動先チェック
  if scrn(x+dx,y+dy)=SPC then {
   /* 移動可能
   x=Move(x,y)
   y=retY
   continue
  }
  
  /* 移動先に移動できない時
  if (dy=1) then { :/* 下に落ちるはずだった時
   /* 左右チェック
   r=(scrn(x+1,y)=SPC):/* 右
   l=(scrn(x-1,y)=SPC):/* 左
   
   /* 動けるなら左右移動に変更
   dx=0
   if (r) then { :/* 右が開いている
    dx=1
   }
   if (l) then { :/* 左が開いている
    dx=-1
    if (r) then { :/* 右も開いている
     /* 左右どちらかを選ぶ
     if rand2(2)=1 then dx=1
    }
   }
   if dx<>0 then {:/* 動ける時
    dy=0
    x=Move(x,y)
    y=retY
    continue
   }
  }
  /* 動けないときはループ終了
  break
 endwhile
endfunc

/******************************************************************/

func int Move(x;int,y;int)
/* 移動&消し
int i
 if (drpy(0)<>0) then printxy(drpx(0),drpy(0),SPC):/* 前の場所を消す
 x=x+dx
 y=y+dy
 if (clng>=1) then {
  for i=1 to clng
   drpx(i-1)=drpx(i)
   drpy(i-1)=drpy(i)
  next
 }
 drpx(clng)=x
 drpy(clng)=y
 retY=y:/* 2つ目のリターン値はグローバル変数経由で返す
 return(x)
endfunc

/******************************************************************/
/* 仮想VRAMシステム
/******************************************************************/

func str printChar$(c;char)
/* 表示文字取得
str c$
 switch (c)
  case ' ': c$= " ":break :/* 消す  
  case 'o': c$= "●":break :/* しずく
  case '#': c$= "■":break :/* 外壁
  case '=': c$= "□":break :/* 棚
 endswitch
 return (c$)
endfunc

func printxy(x;int,y;int,c;char)
/* 文字表示
 /* 仮想VRAMに出力
 tvram(x,y)=c

 /* 座標変換
 locate(x*2,y)
 
 /* キャラクター変換して表示
 print printChar$(c);
endfunc

func storexy(x;int,y;int,c;char)
/* 仮想VRAMに出力
 tvram(x,y)=c
endfunc

func char scrn(x;int,y;int)
/* 仮想テキストVRAMを読み出す
 return(tvram(x,y))
endfunc

func printScreenAll(stY;int,edY;int)
/* 全画面一気表示
/* X-BASIC for iOSはテキスト画面表示が遅いので対策(V1.0時代の名残)
int x,y
str linestr
 for y=stY to edY
  linestr=""
  for x=0 to WX-1
   linestr=linestr+printChar$(tvram(x,y))
  next
  locate(0,y):print linestr;
 next
endfunc

func init_tvram()
/* 仮想テキストVRAM初期化
int x,y
 for y=0 to WY-1
  for x=0 to WX-1
   tvram(x,y)=SPC
  next
 next
endfunc

/******************************************************************/
/* 汎用関数
/******************************************************************/

func srand2()
/* rand()乱数を初期化する
int tm
 t=time()
 tm=tm and &h0fff
 tm=tm*16
 srand(tm)
endfunc

func int rand2(seed;int)
/* 0~seed-1の乱数発生
 return (rand() mod seed)
endfunc

/******************************************************************/

func int CalcWait()
/* ウエイト量算出
int tim,tm
int count
 /* 0クロックチェック
 tm=time()
 repeat
  tim=time()
 until tim-tm<>0
 count=0
 repeat
  tm=time()
  count=count+1
 until tm-tim<>0
 return(count):/* 1秒に必要なカウント数
endfunc

/******************************************************************/

func TWait(wt;int)
int i,tm
 for i=0 to wt-1
  tm=time()
 next
endfunc

/******************************************************************/

Zipファイル :XBetc.zip

2013年2月14日木曜日

各説明書へのリンク

X-BASIC for iOSの各説明書や資料へのリンクを、 ここにまとめておきます。

ここにある取説は最新版で、随時更新されています。
内蔵取説におかしな部分があった場合も、まずはこちらをご覧ください。
多分にわかりにくい部分はあろうかと思いますが、ご了承ください。
改善案、追記要望などありましたらコメントでお寄せください。

画像ローダー

X68000のPICおよびCUTファイルを含む、X-BASIC for iOSでサポートしている画像を順次表示します。

サンプルのPIC/CUTファイルは、今はなき電脳倶楽部146号から、(連絡先がわからないので)無断で借りています。
不都合があればご連絡ください。


// 画像ファイルの表示
width(64)
//
vpriority(TPAGE,GPAGE0,GPAGE1,GPAGE2,GPAGE3)
vpage(B_TPAGE or B_GPAGE0 or B_GPAGE1 or B_GPAGE2 or B_GPAGE3,YES)
apage(GPAGE0)
//
// 全ファイルリストを得る
dim str fileList(256):// ()内は扱える最大ファイル数
int allcnt
int i,ret
str ext
//
// 拡張子(大文字小文字を区別するので注意)
// 正規表現
ext="PIC|pic|PNG|png|JPG|jpg|CUT|cut":
allcnt=files(fileList,"",ext,YES,FILES_FILE,YES)
if allcnt<=0 then {
 locate(0,0)
 print localizedString("画像ファイルがありません":"Graphic file not found.")
} else {
 for i=0 to allcnt-1
  locate(0,0):print fileList(i)
  wipe()
  str pext=pathExtension(fileList(i))
  strupr(pext)
  switch pext
   case "PIC"
    ret=picLoader(128,128,fileList(i))
    if ret<>0 then {
     locate(0,1):print "Error=";ret
    }
    break
   case "CUT"
    ret=cutLoader(128,128,fileList(i))
    if ret<>0 then {
     locate(0,1):print "Error=";ret
    }
    break
   default:
    ret=imgLoad(128,128,0,0,fileList(i))
    break
  endswitch
  hitKey()
 next
}
end
//---------
func hitKey()
 setFunctionKey(0,localizedString("ここを押してください","Hit This Button"),'!')
 displayFunctionKey(YES,0,0)
 while inkey()=0
 endwhile
 cls()
 displayFunctionKey(NO,0,0)
endfunc
//---------
func str localizedString(js;str,es;str)
 if isLocalizeJapan() then return(js)
 return (es)
endfunc
//---------
画像サンプルおよびアニメーションや変形に対応した改良版を含む圧縮ファイルはこちら XBpicloader.zip

picLoader.bas

picLoaderSc.bas

2013年2月13日水曜日

簡易ファイラー

簡易ファイラーです。ファイルおよびディレクトリの一覧表示と削除ができます。

ユーザーがプログラムで作成したファイルは、プログラム内で削除しない限り内部に残り続けるので、不要なファイルを削除できるように作りました。

ただし、削除可能なのはユーザーが作成したプログラム以外のファイルだけです。
プログラムは、選択リスト上から削除できます。
画面の都合上、iPad縦画面専用です(手抜き)。

//------------------------------------------------
/* ファイルの一覧表示と削除を行うプログラム
/*  サンプルのようでいて、実は実用プログラムである
/* File list display and delete program
/* This is sample program and this is practical program actually.
//------------------------------------------------
// for X-BASIC for iOS v2.1

// 初期化 / initialize
font("IPAGothic")
int fzenhan
int WX=64:if deviceType()<>1 then WX=48
int WY=width(WX,,fzenhan)
int xw=1:/* 全角1文字の桁数 / zenkaku 1 character columus
if fzenhan then xw=2

// タッチキー位置 / touch key area
int tx=WX-20:// <WX/2にすること
int ty=3
//
// 画面作成 / screen make
int lns=20:// 表示行数 / display lines
if lns>=WY-2 then lns=WY-2
makeScreen()
//
// 全ファイルリストを得る / get all file list
dim str fileList(256):// ()内は扱える最大ファイル数
int allcnt
str ext="":// 全ファイルを示す拡張子 / extension for all files
//
// 初期ファイル検索 / initial file search
int top:// 表示している先頭行要素番号:fileList(top)
  // 表示範囲は(top)〜(top+lns-1)
int cur:// カーソル位置:0〜lns-1
searchFiles(ext)
tcolor(-THWHITE,0,0,255)
int page=0
int fafterMessage=NO
//
repeat
 int top0=top,cur0=cur
 int fdel=NO
 str ext0=ext
 //
 int ky=inkey()
 switch ky
  // カーソル移動 / cursor move
  case '8'
   // カーソル上 / cursor up
   if fafterMessage then messageDisp("")
   if cur=0 then {
    if top>0 then top=top-1
   } else {
    cur=cur-1
   }
   break
  case '2'
   // カーソル下 / cursor down
   if fafterMessage then messageDisp("")
   if cur=lns-1 then {
    if top+lns<allcnt then top=top+1
   } else {
    if top+cur<allcnt-1 then cur=cur+1
   }
   break
  // ページ単位移動 / page move
  case '4'
   // 前ページ / prev. page
   if fafterMessage then messageDisp("")
   if allcnt>lns then {
    // ページ切り替えが可能なとき / When paging is enabled
    top=top-(lns-1):// 1行残す / left 1 line
    if top<0 then top=0 else page=page-1
   }
   break
  case '6'
   // 次ページ / next page
   if fafterMessage then messageDisp("")
   if allcnt>lns then {
    // ページ切り替えが可能なとき / When paging is enabled
    top=top+(lns-1):// 1行残す / left 1 line
    if top+lns>allcnt then {
     top=allcnt-lns
    } else {
     page=page+1
    }
   }
   break

  // 削除 / delete
  case 'd'
   if fafterMessage then messageDisp("")
   allcnt=allcnt-1
   str fname=fileList(top+cur)
   int ret
   str title$,errmes$
   dim str mn$(1)
   if isLocalizeJapan() then {
    mn$(0)="いいえ"
    mn$(1)="はい"
   } else {
    mn$(0)="NO"
    mn$(1)="YES"
   }
   if fname[strlen(fname)-1]='/' then {
    // ディレクトリだったとき
    if isLocalizeJapan() then {
     title$="このディレクトリを削除しますか?"
     errmes$="削除できません(空でない)"
    } else {
     title$="Delete this directory ?"
     errmes$="Can't delete(Not empty)"
    }
    if selectMenu(title$,mn$)=1 then {
     // ただし、空ディレクトリでないと削除できない
     if rmdir(fname)=0 then {
      fdel=YES:// 表示も変更が必要
     } else {
      messageDisp(errmes$+":"+fname)
     }
    }
   } else {
    // ファイルだった時
    if isLocalizeJapan() then {
     title$="このファイルを削除しますか?"+chr$(DISP_CTRL_LF)+fname
     errmes$="削除できません"
    } else {
     title$="Delete this file ?"
     errmes$="Can't delete"
    }
    if pathExtension(fname)="bas" then {
     // .basファイルは消せないようにしておく(プログラムを削除するのはプログラム選択メニューから)
     // Disable to delete .bas file (if you will do, do in program select menu)
     messageDisp(errmes$+"(.bas):"+fname)
     break
    }
    if selectMenu(title$,mn$)=1 then {
     if fdelete(fname)=0 then {
      fdel=YES:// 表示も変更が必要
     } else {
      messageDisp(errmes$+":"+fname)
     }
    }
   }
   break

  // 拡張子変更 / change extension
  case 'j'
   if fafterMessage then messageDisp("")
   ext="jpg"
   break
  case 'p'
   if fafterMessage then messageDisp("")
   ext="png"
   break
  case 'a'
   if fafterMessage then messageDisp("")
   ext=""
   break

  default
   break
 endswitch
 if ext<>ext0 or fdel=YES then {
  // 拡張子変更 / extension changed
  // またはファイルの数が変わった / Or the number of files is changed
  // ファイルの再検索をするが、このページの先頭は変更しなくても良い
  int top1=top
  int cur1=cur
  searchFiles(ext)
  if top1+cur1>=allcnt then {
   if cur1>0 then cur=cur1-1:// 一番後ろを消したときは、1つ上に上げる。でもそれが最上行を消すものなら、前ページに移動する・・・のは大変なので、最初から表示しなおし
  } else {
   // 新しいページにまだ収まるとき
   top=top1
   cur=cur1
  }
  // ページは変わらないけど、再表示は必要
  printList()
 }
 if top<>top0 then {
  // ページが変わる / page changed
  printList()
  fdel=NO
 } else {
  if cur<>cur0 then {
   // カーソル位置が変わった / cursor moved
   printList1(cur0) // 元の位置を反転解除 / non-reverse old position
   printList1(cur)  // 新しい位置を反転 / revese new position
  }
 }
until ky='!'
end

//------------------------------------------------
// 関数 / functions
//------------------------------------------------

func printKeys(x;int,y;int)
     //  012345678901 *2
 locate(x,y+0):print "┏━┓┏━┓┏━┓┏━┓"
 locate(x,y+1):print "┃←┃┃↑┃┃↓┃┃→┃"
 locate(x,y+2):print "┗━┛┗━┛┗━┛┗━┛"
endfunc

func makeScreen()
 // タッチキー / touch key
 dim int touchNo(10) :// タッチエリア番号 / touch area number
 int touchallcnt  :// タッチエリア数   / the number of touch area
 //
 int x=0
 int y=1+lns+1
 printKeys(x,y)

 int i=0
 touchNo(inc(i))=setTouchArea(textX2Gx(x+ 0),textY2Gy(y),textX2Gx(xw*3),textY2Gy(3),'4',YES,  125,0,5,100)
 touchNo(inc(i))=setTouchArea(textX2Gx(x+ 6),textY2Gy(y),textX2Gx(xw*3),textY2Gy(3),'8',YES,  125,0,5,100)
 touchNo(inc(i))=setTouchArea(textX2Gx(x+12),textY2Gy(y),textX2Gx(xw*3),textY2Gy(3),'2',YES,  125,0,5,100)
 touchNo(inc(i))=setTouchArea(textX2Gx(x+18),textY2Gy(y),textX2Gx(xw*3),textY2Gy(3),'6',YES,  125,0,5,100)
 touchallcnt=i

 // ファンクションキー / fucntion key
 str exit$,ext$,prev$,next$,del$
 if isLocalizeJapan() then {
  exit$="終了"
  ext$="全て"
  prev$="前頁"
  next$="後頁"
  del$="削除"
 } else {
  exit$="exit"
  ext$="all"
  prev$="Prev"
  next$="Next"
  del$="Del"
 }
 setFunctionKey(0,prev$,'4')
 setFunctionKey(1,next$,'6')
 setFunctionKey(2,"   ",'?')
 setFunctionKey(3,del$ ,'d')
 setFunctionKey(4,"   ",'?')
 setFunctionKey(5,"jpg",'j')
 setFunctionKey(6,"png",'p')
 setFunctionKey(7,ext$ ,'a')
 setFunctionKey(8,"   ",'?')
 setFunctionKey(9,exit$,'!')

 setFunctionKeyBackgroundImage("funcBack.png")
 displayFunctionKeyAll(YES,YES):// v2.0
endfunc

func messageDisp(mes;str)
 locate(0,lns+1)
 if len(mes)=0 then {
  print chr$(DISP_CTRL_CLEARLINE) 
  fafterMessage=NO:// メッセージ表示してない / Message is not displaying
 } else {
  print mes
  fafterMessage=YES:// メッセージ表示中 / Now message is displaying
 }
endfunc

//------------------------------------------------

func printList1(i;int)
// 1行表示 / 1line display
 locate(0,1+i)
 if i=cur then tatrb(ATRB_REVERSE):// 選択行 / selected line
 if top+i<allcnt then {
  print using "###:";top+i;
  print fileList(top+i);
 // print lastPathComponent(fileList(top+i));
  if i=cur then tatrb(ATRB_NORMAL)
 }
 print chr$(DISP_CTRL_CLEARLINE):// 行末まで消す / clear to end of line
endfunc

func printList()
// 画面内表示 / display in screen
 int i
 int max=lns
 for i=0 to max-1
  printList1(i)
 next
 locate(WX-10,0):print "page=";page
endfunc

func searchFiles(ext;str)
 // 新しく表示し直すので各種ポインターをリセット
 top=0 :// 表示している先頭行要素番号:fileList(top)
    // 表示範囲は(top)〜(top+lns-1)
 cur=0 :// カーソル位置:0〜lns-1
 //
 allcnt=files(fileList,"",ext,YES,FILES_ALL)
 cls()
 printKeys(0,1+lns+1)
 //
 locate(0,0)
 if isLocalizeJapan() then {
  print "拡張子=";ext,,
  print "ファイル数=";allcnt
 } else {
  print "extension=";ext,,
  print allcnt;" files"
 }
 printList()
endfunc

//------------------------------------------------


Zipファイル :XBetc.zip

2013年2月12日火曜日

V1.71公開

X-BASIC for iOS V1.71がようやく公開の運びとなりました。

V1.71での変更点は以下の通りです。

・a_setPlayData()でX68000のADPCM/M44/P16ファイルをサポート
・pic_load()/cut_load()関数を追加
・files()に正規表現式を使えるようにした
・取説の間違いを修正
・(プログラム実行開始時を含む)cls()直後のprint表示が抜けることがあるバグを修正(V1.6のみ)
・ビットマップ関数に座標チェックを追加
・ビットマップ関数にline/box/fill/circle/paint/get/put関数を追加
・エラー番号とメッセージが一致してなかったのを修正
・エラー行が、実際にエラーの発生した行と一致しないことがあるのを修正
・キー表示画面の優先順位が一番高くなっていなかったのを修正
・小バグ修正
・BASICプログラムのインポート機能を削除(ZIP経由も不可);アップルの審査指摘による

最後の点については少し補足しておきます。

V1.60ではメールなどを経由したBASICプログラムのインポート機能がありましたが、
この点が今回の審査で引っかかってしまいました。
「いかなる形式であれ、実行ファイルを外部から入れてはいけない」 という基準に
反するというのが理由でした。実行ファイルとは単独で実行できる物だけで無く、
BASICのような、そのアプリが無ければ働かないスクリプトのような物も含まれるのだそうです。これは、単独のインポートはもちろん、ZIPに入れてのインポートもだめです。
今回も「ZIPに.basが入っていたら、それは展開しない様にプログラムした」と
説明をしてようやく審査にとおったくらいです。

ということで、どうしてもその機能を残しておくことが出来ませんでした。
なお、音声や画像などのデータに関しては問題なしと言うことですので、
従来通りインポート可能です。

ハノイの塔

短いプログラムを1つ。
これはハノイの塔です。
その解法を表示します。

再帰呼び出しのサンプルとしてよく使われます。
「ハノイの塔」がなんたるかについてはこちらで↓でどうぞ。
https://ja.wikipedia.org/wiki/%E3%83%8F%E3%83%8E%E3%82%A4%E3%81%AE%E5%A1%94

/* ハノイの塔 for X68
// Oh!X 1988/5 p54
int n
str a="A",b="B",c="C"
while 1
    input "n(0=end)=" , n
    if n=0 then break
    hanoi( n , a ,c , b)
    print
endwhile
end
func hanoi(n;int,a;str,c;str,b;str)
     if n>0 then {
         hanoi(n-1,a,b,c)
         print a; "->" ; c; ",";
         hanoi(n-1,b,c,a)
     }
endfunc

2013年2月11日月曜日

エラトステネスのふるい

いわゆる「エラトステネスのふるい」です。
10000までの素数を求めます。

int fscroll=YES:// YES=scroll(V2.00以降専用) / NO=page
if isLocalizeJapan() then {
    print "エラトステネスのふるい(〜10000)"
} else {
    print "Sieve of Eratosthenes(to 10000)"
}
print "start:";time$
//
int i,p
int max=10000
dim nt(10000):/* 確保時の初期値は0=NO
for i=2 to max/2
   nt(i*2)=YES
next
p=3
while p*p<=max
   for i=p to max/p
      nt(i*p)=YES
      i=i+1:/* step2
   next
   p=p+1
   while nt(p):p=p+1:endwhile
endwhile
int cnt=0
for i=2 to max
    if nt(i)=0 then {
        print i,
        if not fscroll then {
            inc(cnt)
            if cnt>=30*8 then {
                // スクロールできないので一定数ごとに画面クリアして継続
                hitKey()
                cls()
                cnt=0
            }
        }
    }
next
print
print "end:";time$
end
//---------
func hitKey()
    setFunctionKey(0,localizedString("ここを押してください","Hit This Button"),'!')
    displayFunctionKey(YES,0,0)
    while inkey()=0
    endwhile
    cls()
    displayFunctionKey(NO,0,0)
endfunc
//---------
func str localizedString(js;str,es;str)
    if isLocalizeJapan() then return(js)
    return (es)
endfunc
//---------

Zipファイル :XBetc.zip

2013年2月10日日曜日

タートルグラフィックス

いわゆるタートルグラフィックスを実行します。

// グラフィック画面初期化
//
width(64)
vpriority(TPAGE,GPAGE0,GPAGE1,GPAGE2,GPAGE3)
vpage(B_TPAGE or B_GPAGE0 or B_GPAGE1 or B_GPAGE2 or B_GPAGE3,YES)
apage(GPAGE0)
tborder(4,&hffd700ff):// gold
gborder(2,&h008080ff):// teal
//
// Oh!X 1988/5 p58
// Turtle Graphic - コッホ曲線
int n
input "n(<=8)=";n
// 理論上はいくつでもいけるが、描画上はこれがほぼ限界
if n>8 then n=8
locate(0,2):print "n=";n
set(64,64)
right(90)
pencolor(rgb(255,255,255,255))
Koch(n,200*(n+3))
//
print time$
wait(5)
print time$
//hitKey()
wipe()
//
// Oh!X 1988/5 p57
// Turtle Graphic - Triangle
float turtle_x,turtle_y,turtle_arg
int turtle_color
int i ,j,k,x,y,length
x=64
for k=0 to 4: // 横個数
    y=128
    for j = 0 to 4: // 縦個数
        tcolor(CTHWHITE)
        locate(0,5):print "k,j=";k,j
        set(x,y)
        right(rnd()*360)
        int h=rnd()*360
        int s=rnd()*256
        //locate(0,10):print "h=";h;"/s=";s
        pencolor(hsv(h,s,255,255))
        for i=1 to 20
            length=5*i
            forward(length)
            right(120)
            forward(length)
            right(120)
            forward(length)
            right(140)
        next
        y=y+128
    next
    x=x+128
next
end

//---------

func Koch(n;int,length;float)
    if n>0 then {
        Koch(n-1,length/4#)
        right(-45)
        Koch(n-1,length/4#)
        right(90)
        Koch(n-1,length/4#)
        right(-45)
        Koch(n-1,length/4#)
    } else {
        forward(length)
    }
endfunc

//---------

func set(x;float,y;float)
//    tcolor(&hcc6633ff)
     locate(0,0):print "x,y=";x,y
    turtle_x=x
    turtle_y=y
turtle_arg=2#*pi()
endfunc

//---------

func forward(length;float)
    float x,y
    x=turtle_x
    y=turtle_y
    turtle_x=turtle_x+cos( turtle_arg ) *length
    turtle_y=turtle_y-sin( turtle_arg ) *length
    gcolor(turtle_color)
    line(x,y, turtle_x,turtle_y)
endfunc

//---------

func right(arg;float)
    turtle_arg = turtle_arg-arg/180#*pi()
endfunc
//
func pencolor(col;int)
     locate(0,1)
    print "color=&h";right$("00000000"+hex$(col),8);
    int r,g,b,alpha
    splitRGB(col,r,g,b,alpha)
    print using "/r=###/g=###/b=###";r;g;b
    turtle_color=col
endfunc

//---------

func hitKey()
    setFunctionKey(0,localizedString("ここを押してください","Hit This Button"),'!')
    displayFunctionKey(YES,0,0)
    while inkey()=0
    endwhile
    cls()
    displayFunctionKey(NO,0,0)
endfunc

//---------

func str localizedString(js;str,es;str)
    if isLocalizeJapan() then return(js)
    return (es)
endfunc

//---------


Zipファイル :XBetc.zip

2013年2月9日土曜日

酔歩

酔歩、英語ではramdomwalkといいます。
酔っ払いの足取りをシミュレーションするものです(^_^;)

行番号が付いてたり付いてなかったりしますが、これは「行番号削除」のテストも兼ねているからです。X-BASIC for iOSでは行番号は、全て自動的に取り払われます。

10 /*
20 /* 酔歩
30 /* http://d.hatena.ne.jp/x68000forever/ から 移植
width(0)
int wx,wy
getWidth(wx,wy)
vpage(B_TPAGE or B_GPAGE0,YES)
width(32)
cls():wipe()
randomise(time())
50 int ix0,iy0,iscl
60 float d,ox,oy,xg,yg,x,y,t,r=0.05#
70 /*
80 ix0=wx/2
90 iy0=wy/2
100 iscl=wx/4
110 /*
120 x=0:xg=ix0
130 y=0:yg=iy0
140 /*
150 while xg>0 and xg<wx and yg>0 and yg<wy
160 /*
170 d=rnd()
    locate(0,0):print d;" ";
180 t=pi(d*2)
190 /*
200 x=x+r*cos(t)
210 y=y+r*sin(t)
220 /*
230 ox=xg:xg=ix0+iscl*x
240 oy=yg:yg=iy0+iscl*y
250 /*
gcolor(191*d*(256/32),(rand() mod (256-64))+64,(rand() mod (256-32))+32,220)
260 line(ox,oy,xg,yg)
270 /*
280 endwhile
290 end
//
1000 // 実は行番号有りテスト(行番号は全て削除される。ただし、先頭行に行番号がないとだめ)
2000 // line numbers test (line numbers remove all.)

Zipファイル :XBetc.zip

2013年2月8日金曜日

宣伝漫画




情報編ブログにも載せたけど、サポートページも載せておきます。

・・・2013/04/11追記
円安が進んだので、多分もうすぐ値上げされます。
(アプリの価格はドル単位で決めるので。)
これはアップルの行うことなので、作者としてはどうしようもありません。
ということで、購入するなら、今がチャンス!

自己平方根フラクタル図形描画(ビットマップ描画型)

自己平方根フラクタル図形を描きます。
こちらは一旦ビットマップ上に図形を作画して完成後に実画面に表示します。
こうすることで、わずか40秒で描画します(iPad3)。

また、他のビットマップ関数のテストも兼ねています。

参考文献:Oh!X 1988 3月号 X68000BASIC入門 中森章

// 自己平方根フラクタル図形描画
// ビットマップ利用型
// fdirect=NO
// +タイル貼り付け
// +ビットマップ関数テスト
// for X-BASIC for iOS v2.0

width(64)
//
vpriority(TPAGE,GPAGE0,GPAGE1,GPAGE2,GPAGE3)
vpage(B_TPAGE+B_GPAGE0+B_GPAGE1+B_GPAGE2+B_GPAGE3,YES)
apage(GPAGE0)
//
int wx=512,wy=512
if YES then {://------------------------------------
bitmapOpen(wx,wy)
drawFractal(wx,wy,0)
bitmapImgLoad(128,128,wx,wy):// ここのwx,wyはfloat変換される
bitmapClose()
//
hitKey()
wipe()
wx=128
wy=128
dim int getAry(128*128)
//int size1
//int youso=sizeofArray(getAry,size1)
//print "要素数=";youso;"/1要素サイズ=";size1
bitmapOpen(wx,wy)
drawFractal(wx,wy,5)
bitmapTileImgLoad(128.0,128.0,512.0,512.0)
bitmapGet(0,0,64,64,getAry)
bitmapClose()
//
hitKey()
wipe()
wx=512:wy=512
bitmapOpen(wx,wy)
int i,sx,sy,ex,ey,col,h,s
for i=0 to 10
 h=rnd()*360
 s=rnd()*256
 col=hsv(h,s,255,255)
 //
 sx=rand() mod wx
 ex=rand() mod wx
 sy=rand() mod wy
 ey=rand() mod wy
 bitmapLine(sx,sy,ex,ey,col)
 //
 sx=rand() mod wx
 ex=rand() mod wx
 sy=rand() mod wy
 ey=rand() mod wy
 bitmapBox(sx,sy,ex,ey,col)
 //
 sx=rand() mod wx
 ex=rand() mod wx
 sy=rand() mod wy
 ey=rand() mod wy
 bitmapFill(sx,sy,ex,ey,col)
 //
 sx=rand() mod wx
 sy=rand() mod wy
 ex=rand() mod 100+1:// 半径
 locate(0,i):print "x,y,r=";sx,sy,ex
 bitmapCircle(sx,sy,ex,col)
 bitmapPaint(sx,sy,col)
next
bitmapPut(200,200,200+64,200+64,getAry)
bitmapImgLoad(128,128,wx,wy):// ここのwx,wyはfloat変換される
bitmapClose()
//
hitKey()
}://------------------------------------
if YES then {://------------------------------------
// bitmapImageFile()のテスト
// 存在する画像ファイル名を記述すること
wipe()
wx=512:wy=512
bitmapOpen(wx,wy)
//
bitmapImageFile("IMG1.JPG",10,10,256,256)
bitmapImgLoad(128,128,wx,wy):// ここのwx,wyはfloat変換される
hitKey()
//
bitmapImageFile("IMG2.PIC")
bitmapImgLoad(128,128,wx,wy):// ここのwx,wyはfloat変換される
hitKey()
//
bitmapImageFile("GAROU.CUT")
bitmapImgLoad(128,128,wx,wy):// ここのwx,wyはfloat変換される
//
bitmapClose()
}://------------------------------------
//
end
//---------
func drawFractal(wx;int,wy;int,ty;int)
 locate(0,ty+0):print "wx*wy=";wx;"*";wy
 locate(0,ty+1):print "start=";time$
 //
 int MAXREP=50
 int MAXDOT=wx
 int MAXCOL=255
 float remin=-0.5#
 float remax= 0.5#
 float immin=-0.5#
 float immax= 0.5#
 float recon=-0.04#
 float imcon=-0.695#
 int rep,ix,iy
 float x,y,re,im,dx,dy
 //
 dx=(remax-remin)/MAXDOT
 dy=(immax-immin)/MAXDOT
 //
 for iy=0 to MAXDOT-1
  locate(0,ty+2):print "line=";iy
  for ix=0 to MAXDOT-1
   x=remin+ix*dx
   y=immin+iy*dy
   for rep=0 to MAXREP
    re=x*x-y*y+recon
    im=2#*x*y+imcon
    if ((re*re+im*im)>4#) then break
    x=re:y=im
   next
   int c=(rep mod MAXCOL)*4
   bitmapPset(ix,iy,c,c,c,255)
   //gcolor(c,c,c,255)
   //pset(ix,iy)
  next
 next
 locate(0,ty+2):print "end=";time$
endfunc
//---------
func hitKey()
 setFunctionKey(0,localizedString("ここを押してください","Hit This Button"),'!')
 displayFunctionKey(YES,0,0)
 while inkey()=0
 endwhile
 cls()
 displayFunctionKey(NO,0,0)
endfunc
//---------
func str localizedString(js;str,es;str)
 if isLocalizeJapan() then return(js)
 return (es)
endfunc
//---------
Zipファイル :XBetc.zip
完成後の画像はこれです(グレースケールです)。

自己平方根フラクタル図形描画(直描画型)

自己平方根フラクタル図形を描きます。

V1.6では画面描画が大幅に高速化されたので、たった105秒で描画できます(iPad3)。
ちなみに、この512*512サイズで、V1.5のiPad3で1時間25分、10MHzのぺけ-BASICでは3時間半かかりました。X-BASIC/68では6時間くらいかかるそうです。

参考文献:Oh!X 1988 3月号 X68000BASIC入門 中森章

// 自己平方根フラクタル図形描画
// pset()利用型
int wx,wy
width(0)
getWidth(wx,wy):/* グラフィック幅を得る
width(64)
// same as X68000 size
if wx>=512 then wx=512
if wy>=512 then wy=512
//
locate(0,0):print "wx*wy=";wx;"*";wy
locate(0,1):print "start=";time$
vpriority(TPAGE,GPAGE0,GPAGE1,GPAGE2,GPAGE3)
vpage(B_TPAGE or B_GPAGE0 or B_GPAGE1 or B_GPAGE2 or B_GPAGE3,YES)
apage(GPAGE0)
int MAXREP=50
int MAXDOT=wx
int MAXCOL=255
float remin=-0.5#
float remax= 0.5#
float immin=-0.5#
float immax= 0.5#
float recon=-0.04#
float imcon=-0.695#
int rep,ix,iy
float x,y,re,im,dx,dy
//
dx=(remax-remin)/MAXDOT
dy=(immax-immin)/MAXDOT
/*
for iy=0 to MAXDOT-1
    locate(0,2):print "line=";iy
    for ix=0 to MAXDOT-1
        x=remin+ix*dx
        y=immin+iy*dy
        for rep=0 to MAXREP
            re=x*x-y*y+recon
            im=2#*x*y+imcon
            if ((re*re+im*im)>4#) then break
            x=re:y=im
        next
        int c=(rep mod MAXCOL)*4
        gcolor(c,c,c,255)
        pset(ix,iy)
    next
next
locate(0,2):print "end=";time$
//
end

Zipファイル :XBetc.zip

「X-BASIC for iOS」の次バージョンの開発状況(V2.0まで)

「X-BASIC for iOS」の次バージョンの開発状況などをお知らせします。

ご要望や報告は、この記事にコメントを付けて下さい。

・・・

バージョン1.60(公開済み)

・指定時間待ち関数
・テキストおよびグラフィック色の合成RGBでの指定
・pset()
・bitmap関数群
・picLoader
   X68での事実上標準画像フォーマットであった.PICを表示出来る
・cutLoader
   電脳倶楽部で使われていたCUTファイルを表示出来る
・最新取説への更新
・いくつかのバグ修正
 エラー発生行番号がずれる/キーリピートが止まらなくなることがある/bingo.basのバグ他
・描画高速化(50倍位)


バージョン1.71(公開済み)
・PCM/M44/M30/P16音声ファイルサポート
 a_play()で直接再生可能
・files()で正規表現を使えるようにした
・(プログラム実行開始時を含む)cls()直後のprint表示が抜けることがあるのを修正

・ビットマップにline/box/fill/circle/paint/get/put関数を追加
・エラー番号とメッセージが一致していないのを修正
・エラー表示発生行が実発生行と一致しないことがあるのを修正
・キー表示画面の優先順位が一番高くないのを修正

バージョン1.71→発売中・プログラムのインポート機能を削除
 単独ファイルだけでなく、ZIP内も禁止。
 テキストでのコピー&ペーストしか仕方ない様子。このことも取説には書けない。なんてこったい。
・Xcode4.6コンパイラのバグを回避するコードを実装

・・・

バージョン1.80(未公開)
・プログラムリストの印刷
・実行画面表示でファンクションキーやタッチエリアも表示できるようにする

・画面ハードコピー関数
・実行画面表示で、キー表示も再現するようにした
・beep2(13)の音が正しくなかったのを修正
・keysns()を追加

・・・

V2.00での変更点(審査中)
・スプライト&BG関数追加
・iPod touch/iPhoneの縦画面でファンクションキーを2段表示できるようにした
・osVersion()で返してくる値がおかしいことがあるのを修正
・小数点表示をX-BASIC/68とほぼ同じにした
・usingで小数桁なしにfloatを表示した時に四捨五入されないのを修正
・keyRepeatTime()での設定がおかしいのを修正
・3.5インチデバイス(iPod touch4やiPhone4など)で画面下部が少し切れていたのを修正
・tborder()が直後のprintまで実表示されないのを修正
・bitmapImageFile()追加
・float配列を使うと落ちることがあるのを修正
・circle()でのstartAngle/endAngle指定が効いてなかったのを修正
・プログラムの選択を繰り返すと落ちることがあるのを修正
・bitmap関数を通常グラフィック関数と同じ領域で使えるようにした
・テキスト画面でスクロールをできるようにした
・小バグ修正
・サンプルBASICプログラムの不具合を修正
・取説の間違いを多数修正

・・・

その他状況
・FM音源:ym2151.cのソースは手に入れたけど、現状目処立たず。 FM音源エミュレーターの理屈は理解したつもりなんだけど。
 ちゅうか、MMLの処理のほうが面倒かも。

・・・2013/03/13追記

iOS向けアプリの開発を本業とすることを休止するを決定しました。
理由は単純で、「利益が全く出ない」事にあります。
今後サポートおよびバージョンアップ版開発は趣味で行う事になります。

なお、開発費回収のため、アプリの価格については維持されます。

・・・2013/04/17追記
V1.80の開発再開&終了、V2.00を開発開始しました。
ただし、本業ではないので、時間はかかると思います。

現在デバッグ中ですが、調べるべき項目が多くて難航しています。

時計

まずは簡単な時計です。グラフィック4ページを活かすことで、重ね合わせをほとんど意識することなく処理できています。

//----------------------------------------------------------------------------------------------
// 時計 / clock
//----------------------------------------------------------------------------------------------
// メイン / Main
int hour,min,sec
int hour0=-1,min0=-1,sec0=-1
int cx,cy,x,y
int wx,wy
width(0)
getWidth(wx,wy)
width(64,20)
switch deviceType()
    case 2:
    case 3:
    case 4:
        width(32,30)
endswitch
tcolor(-THWHITE,0,0,255)
cx=wx/2
cy=wy/2
//
vpriority(TPAGE,GPAGE2,GPAGE1,GPAGE0,GPAGE3)
vpage(B_TPAGE or B_GPAGE0 or B_GPAGE1 or B_GPAGE2 or B_GPAGE3,YES)
int gx=300,gy=400
int r=gx/2
//
setExitKey()
while (inkey()<>'!')
    getTime()
    if hour0<>hour then {
        // hour
        setBackGround(hour)
//        apage(GPAGE0):wipe()
//        gborder(3,-TGREEN,0,0,255)
//        lineWidth(6)
//        gcolor(-THRED,0,0,235)
//        calc_endPoint(r*2/3,hour,12)
//        line(cx,cy,x,y)
        hour0=hour
    }
    if min0<>min then {
        // min
        apage(GPAGE1):wipe()
        lineWidth(4)
        gcolor(-THMAGENTA,0,0,255)
        calc_endPoint(r,min,60)
        line(cx,cy,x,y)
        min0=min
        //
        // hour
        apage(GPAGE0):wipe()
        gborder(3,-TGREEN,0,0,255)
        lineWidth(6)
        gcolor(-THRED,0,0,235)
        calc_endPoint(r*2/3,hour*(60/12)+(min/12),60)
        // 60分割して1時間で60/12動かす
        // 60分で60/12動かす=1分で60/12/16=1/12動かす
        line(cx,cy,x,y)
    }
    if sec0<>sec then {
        locate(1,1):print using "%%:%%:%%",hour,min,sec
        // sec
        apage(GPAGE2):wipe()
        lineWidth(2)
        gcolor(-THYELLOW,0,0,255)
        calc_endPoint(r,sec,60)
        line(cx,cy,x,y)
        sec0=sec
    }
endwhile
end
//----------------------------------------------------------------------------------------------
// 関数 / Functions
//----------------------------------------------------------------------------------------------
func calc_endPoint(r;int,t;int,interval;int)
// r:半径 t:時間 interval:目盛りの間隔
    float cof = pi(2) / interval
    x = int( r * sin(cof * t)) + cx
    y = int(-r * cos(cof * t)) + cy
endfunc
func getTime()
    str tm$=time$
    hour=val(left$(tm$,2))
    min =val(mid$(tm$,4,2))
    sec =val(right$(tm$,2))
endfunc
func setBackGround(hour;int)
    str backGroundFname
    backGroundFname="girl4.jpg"
    if hour>= 0 and hour< 6 then backGroundFname="girl1.png"
    if hour>= 6 and hour<12 then backGroundFname="girl2.jpg"
    if hour>=12 and hour<18 then backGroundFname="girl3.png"
    apage(GPAGE3)
    wipe()
    imgLoad((wx-gx)/2,(wy-gy)/2,gx,gy,backGroundFname)
    //
    gcolor(-TCYAN,0,0,200)
    //circle(cx,cy,10,0,pi(2),NO,YES)
    circle(cx,cy,10,,,NO,YES):// V1.6
    blend(BlendModeXOR)
    //circle(cx,cy, 5,0,pi(2),NO,YES)
    circle(cx,cy, 5,,,NO,YES):// v1.6
    blend(BlendModeNormal)
endfunc
//----------------------------------------------------------------------------------------------
func setExitKey()
    str exit$
    if isLocalizeJapan() then {
        exit$="中断"
    } else {
        exit$="exit"
    }
    setFunctionKey(0,exit$,'!')
    displayFunctionKey(YES,0,0)
    kBackgroundAlpha(0.7)
endfunc
//--------------------------------------------------------------------------------------------


圧縮ファイル:XBclock.zip(画像ファイル入りなのでインポートが必要)

2013年2月7日木曜日

紹介記事

X-BASIC for iOSが「Appliv」および「日刊Appliv」にて紹介されました。

宜しければご覧ください。

まあ、ここを見ている人はすでに購入していただいた方だとは思いますがm(_ _)m。

サンプルプログラムについて

ここではX-BASIC for iOSのサンプルプログラムも公開します。

一部のサンプルは、内蔵されていたものそのものです。

・・・2013/09/09変更・・・
今日発表した".bcファイル展開ツール"を使えば、簡単にサンプルをインポートできるようになりました。ただし、その".bcファイル展開ツール"自体は、以下の従来の方法で入れる必要があります。

・・・

各プログラムは、ちょっと面倒ですが、以下の方法で入れてください。
  1. ここのサイトをSafariなどブラウザで開く
  2. プログラム本体を(テキストとして)コピーする
  3. X-BASIC for iOSを起動する
  4. プログラムの「新規作成」を選択する
  5. エディター上でペーストする
  6. 名前を付けて保存する。
  7. 一部プログラムはデータが必要なので、その場合はZipファイルもインポートする
Zipのインポートの仕方に以下の通りです(取説からの抜粋)。


// 他アプリケーションからのデータファイルのインポートの仕方

X-BASIC for iOSは、ファイルを出力(エクスポート)する機能を持つ他のアプリケーションから、
wavやaiffなど音声系個別ファイルまたはzipファイルの内容をインポートできます。
JPEGやPNGなど画像系個別ファイルは、「iOSの制約により」zipファイルにしてインポートしなければなりません。

重要:
V1.6までにあった.basプログラムのインポート機能は、アップルの指摘により削除せざるを得なくなりました。
ZIPファイルに入れてもインポート出来ません。
あしからず、ご了承ください。


zipの場合は、その中に含まれる全てのファイルを自動的に展開してインポートします。
zipにはパスワードをかけてはいけません(パスワード付きzipは展開できません)。

ディレクトリ付きzipの場合、ユーザー領域にそのディレクトリを作って格納します。
ディレクトリは、基本的には1階層だけにしてください。
深い階層のディレクトリは、アクセス出来なくなる可能性があります。

    「例」  test1.zip-test1.wav,test1.png,...   ディレクトリなし
            test2.zip-test2/test2.wav           ディレクトリあり
                            test2.png
                            ...

ディレクトリ内のファイルのアクセスにはディレクトリ名を含めた指定が必要になります。
(X-BASIC for iOSにはカレントディレクトリという概念はありません。あえて言うなら、
ルートが常にカレントです。)
    「例」fopen("test2/test2.png","r")  正しい
          fopen("test2.png","r")        正しくない

インポート時、すでに同名のファイルが存在する場合、自動的にファイル名が変更されます。
注意してください。
「例」iOSのメールからインポートする場合
  1. 音声系個別ファイルまたは.zipファイルを添付したメールを、X-BASIC for iOSが入っているiOSデバイスで受信します。
  2. その添付ファイルのアイコンを長押します。
  3. すると、ファイルを対応するアプリケーションに渡すためのポップアップが開きます。

    注意: 添付ファイルは、実際にそれをタップしないとデバイスへ保存されないことがあります (これはiOSメールの仕様です)。
    添付ファイルの枠が点線なら未ダウンロード状態で、実線ならダウンロード済みです。
    X-BASICへ渡す場合はダウンロード済みの状態にしなければいけません。
  4. 「X-BASICで開く」をタップする。
これでインポートは完了します。


V1.7審査時にプログラムファイルのインポート機能を禁止されてしまい、やむを得ずこんな方法になってしまいました。 アップルは、BASICのソースも含め、いかなる形式の実行ファイルもインポートを許さない方針のようです(データは可能)。 BASICソースなんて、アプリの上でしか動かないスクリプトのようなものなのになぁ。

・・・

サンプルプログラムは、ほぼすべて日英どちらの環境でも正常動作します。
ただし、プログラム中のコメントは日本語のみの物もあります。

すべてのサンプルはiPadには対応していますが、iPod touchやiPhoneには、画面の大きさの関係で対応していないものも多数あります。画面の縦縦方向はすべてのプログラムで対応していますが、横方向は一部だけです。

サンプルは、基本的に最新公開バージョンでしか動作を保証しません。

いずれのサンプルもX-BASIC for iOSに特化してますので、X-BASIC/68やぺけ-BASICでは動作しません。まあ、試す人はいないと思いますが、念のため。


なお、リストを公開しているプログラムも、その後バージョンアップや修正が加えられた物もあります。よほど変更が大きくかつ重要でない限り、(ものすごく手間がかかるので)ここでの公開分は修正しません。お手数ですが、リンク先のZipに入った最新版を入手してください。

X-BASIC for iOSサポートページ開設

ここは、X-BASIC for iOSのサポートページ用ブログです。

X-BASIC for iOSのサポートに関する情報を掲載します。
  • サンプルプログラム
  • 使い方
  • バグ情報
  • アップデート情報
同時に、コメントを付けていただくことにより、ご質問にもお答えします。

なお、開発もサポートも1個人がやっておりますので、返答が遅れることも多分にあると思いますが、あしからず、ご了承ください。

・・・

最初のうちは記事の内容がころころ変化することがあると思います。
都合の良いやり方を見つけるまでの過渡的状態ですので、
ご了承ください。