REM 944BASIC '汎用ライブラリ' REM LIBINIT *LIBINIT GLIBVER=200611.0 REM ライブラリ内部で使用する変数、配列の初期化 DIM OPT(9) :REM 汎用的な引数の指定用 DIM RET(9) :REM 汎用的な返り値の指定用 DIM SPL_RET(99) :REM SPLIT用 REP_STR='' :REM REPLACEの返り値 DIM MN_ITEM(24) :REM S_MENU 表示用 REM 改行文字 CR=CHR(13) LF=CHR(10) CRLF=STRCAT(CR,LF) REM CALENDAR/HOLIDAY/ANNIVERSARY用 HOL_FILE="HOLIDAY.TXT" ANN_FILE="ANNIV.TXT" REM TODAY用 DIM WK_E(6)='Sun','Mon','Tue','Wed','Thu','Fri','Sat' DIM WK_J(6)='日','月','火','水','木','金','土' DIM MM_E(11)='Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec' DIM MM_J(11)='一月','二月','三月','四月','五月','六月','七月','八月','九月','十月','十一月','十二月' DIM MM_J2(11)='睦月','如月','弥生','卯月','皐月','水無月','文月','葉月','長月','神無月','霜月','師走' DIM CAL_DATE(1,31) :REM 日付の座標 DIM CAL_TMP(6) :REM 座標格納用一時配列 DIM CLK_DIAL(1,11) :REM 時計文字盤位置 DIM HOLIDAY(1,29) :REM 休祝日をファイルから読み込む DIM HOL_MONTH(31) :REM 指定した月の休祝日を格納 DIM HOLIDX(11) :REM 月ごとの休祝日の配列位置を格納 DIM HOLWIDX(11) :REM 第2月曜などの処理用 DIM ANNIV(1,99) :REM 記念日をファイルから読み込む DIM ANN_MONTH(31) :REM 指定した月の記念日を格納 DIM ANNIDX(11) :REM 月ごとの記念日の配列位置を格納 DIM ANNWIDX(11) :REM 第2月曜などの処理用 GOSUB *LOAD_HOLIDAY :REM HOLIDX に配列位置を格納 GOSUB *LOAD_ANNIV :REM ANNIDX に配列位置を格納 GOSUB *COLORSETTING :REM FG,BG,LNの色を設定 REM スプライト番号 CAL_SP=150 :REM 日付マスのスプライト開始番号 MN_SP=150 :REM メニューのスプライト開始番号 CP_SP=150 :REM カラーピッカーのスプライト開始番号 CLK_SP=251 :REM アナログ時計のスプライト番号 WTC_SP=252 :REM デジタル時計のスプライト番号 TD_SP=253 :REM TODAYのスプライト番号 REM アナログ時計サイズ調整 CLK_L=CLK_L-(INT(CLK_L/25))-1 RETURN *CALENDAR REM CAL_YMD 年月日(YYYYMMDD) REM CAL_X,CAL_Y 表示位置 REM CAL_FNT フォント・サイズ(0,1,2,3) REM CAL_WKS 曜日スタイル(0,1) REM CAL_WST 開始曜日(0=日、1=月) REM CAL_NAVI 1=ナビゲーション用に座標とスプライト定義 REM 内部変数 REM CAL_DATE(1,31) 日付の座標位置 REM 返り値 REM CAL_RET YYYYMMDD REM フォントサイズの決定 GOSUB *CAL_FONT REM 日付枠の大きさ IF CAL_HSP<=CAL_FW THEN CAL_HSP=CAL_FW+1 IF CAL_VSP<=CAL_FH THEN CAL_VSP=CAL_FH+1 REM 画面初期化 IFBLK CAL_TRANS=1 REM スプライトで透過する場合 COLORFG 0,0,0 COLORBG 0,0,0 ELSE COLORFG BGR,BGG,BGB COLORBG BGR,BGG,BGB ENDIF BOXFILL CAL_X-1,CAL_Y-1,CAL_X+CAL_HSP*7,CAL_Y+CAL_VSP*8 COLORFG FGR,FGG,FGB REM 指定日付をYYYY,MMなどの変数に分割 GY_DATE=CAL_YMD GOSUB *GETYYMMDD REM その月の休祝日データを設定 HOL_DATE=STRCAT(YYYY,MM) GOSUB *SETHOL REM 月の表示位置算出 REM CAL_TMP=STRCAT('- ',YYYY,'. ',MM_,'. -') L_T=STRCAT('- ',MM_,' -') L_I=LEN(L_T) L_I=L_I*(CAL_FW/2) L_I=(CAL_HSP*7-L_I)/2 GCURSOR CAL_X+L_I,CAL_Y PRINT L_T REM 曜日文字の決定 IFBLK CAL_WST=0 REM 日曜始まり IF CAL_WKS=0 THEN CAL_WDSP='SUMOTUWETHFRSA' ELSE CAL_WDSP='日月火水木金土' ELSE REM 月曜始まり IF CAL_WKS=0 THEN CAL_WDSP='MOTUWETHFRSASU' ELSE CAL_WDSP='月火水木金土日' ENDIF REM 曜日行の表示 FOR L_I=0 TO 6 IFBLK CAL_FNT=3 GCURSOR CAL_X+CAL_HSP*L_I+3,CAL_Y+CAL_VSP ELSE GCURSOR CAL_X+CAL_HSP*L_I+1,CAL_Y+CAL_VSP ENDIF L_T=MID(CAL_WDSP,L_I*2+1,2) PRINT L_T CAL_TMP(L_I)=CAL_X+CAL_HSP*L_I+1 NEXT L_I REM 月の末日の取得 CAL_MAX=GETMONTH(CAL_YMD) REM 月初の開始曜日 L_T=STRCAT(YYYY,MM,'01') CAL_WK=GETWEEK(L_T,0) REM 開始日が日曜日か月曜日か CAL_WK=CAL_WK-CAL_WST IF CAL_WK<0 THEN CAL_WK=6 REM ループ開始 CAL_ROW=CAL_Y+CAL_VSP*2 FOR L_I=1 TO CAL_MAX CAL_COL=(L_I-1+CAL_WK)%7 IF (CAL_COL=0)*(L_I>1) THEN CAL_ROW=CAL_ROW+CAL_VSP REM 座標確定 CAL_DATE(0,L_I)=CAL_TMP(CAL_COL) CAL_DATE(1,L_I)=CAL_ROW IFBLK CAL_NAVI=1 REM スプライト設定 SPRITE CAL_SP+L_I,CAL_SP+L_I,1,CAL_DATE(0,L_I)-1,CAL_DATE(1,L_I)-1,CAL_DATE(0,L_I)-1,CAL_DATE(1,L_I)-1,CAL_FW+1,CAL_FH+1 ENDIF REM 一桁数字はセンタリング IFBLK L_I<10 GCURSOR CAL_DATE(0,L_I)+1+CAL_FW/4,CAL_DATE(1,L_I) ELSE GCURSOR CAL_DATE(0,L_I),CAL_DATE(1,L_I) ENDIF REM 土日祝は色を変える IFBLK LEN(HOL_MONTH(L_I))<>0 COLORFG FGR_L,FGG_D,FGB_D ELSEIF CAL_COL=6-CAL_WST COLORFG FGR_D,FGG_D,FGB_L ELSEIF CAL_COL=0+(6*CAL_WST) COLORFG FGR_L,FGG_D,FGB_D ENDIF PRINT L_I COLORFG FGR,FGG,FGB NEXT L_I CAL_CUR=DD :REM 現在日付 GOSUB *CAL_BOX :REM 枠描画 RETURN *CALENAVI REM カレンダーの日付枠の移動 REM 実際には、各プログラムに合わせてカスタマイズが必要 REM 下記のカレンダー用の変数を使用 REM CAL_YMD 年月日(YYYYMMDD) REM CAL_X,CAL_Y 表示位置 REM CAL_FNT フォント・サイズ(0,1,2,3) REM CAL_WKS 曜日スタイル(0,1) REM CAL_WST 開始曜日(0=日、1=月) REM TODAY と連携する場合 REM TD_X=100:TD_Y=216 REM TD_W=40:TD_H=58 REM GOSUB *TODAY REM カレンダーのフォントサイズを取得 GOSUB *CAL_FONT REM 指定日付の枠表示 REM 枠のスタイル(0=実線1=凹2=凸) REM CAL_BX=0 CAL_CUR=DD :REM 現在日付 GOSUB *CAL_BOX :REM 枠描画 REM GOSUB *CAL_DISP REM キー/ペン待ち L_F=0 WHILE L_F=0 SYNC CAL_PX=PADONX CAL_PY=PADONY CAL_PA=PADONA CAL_PB=PADONB CAL_PC=PADONC CAL_PENX=PENX CAL_PENY=PENY CAL_SPS=SPSEARCH(CAL_PENX,CAL_PENY,CAL_SP,CAL_SP+31) IFBLK CAL_PX GOSUB *CAL_BOXERASE CAL_CUR=CAL_CUR+CAL_PX IFBLK CAL_CUR<1 GOSUB *CAL_PREV CAL_YMD=STRCAT(YYYY,MM,CAL_MAX) CAL_CUR=CAL_MAX GOSUB *CALENDAR ELSEIF CAL_CUR>CAL_MAX GOSUB *CAL_NEXT CAL_YMD=STRCAT(YYYY,MM,'01') CAL_CUR='01' GOSUB *CALENDAR ENDIF ELSEIF CAL_PY GOSUB *CAL_BOXERASE CAL_CUR=CAL_CUR+7*CAL_PY IFBLK CAL_CUR<1 GOSUB *CAL_PREV CAL_MAX=CAL_MAX+CAL_CUR CAL_YMD=L_T*100+CAL_MAX CAL_CUR=CAL_MAX GOSUB *CALENDAR ELSEIF CAL_CUR>CAL_MAX CAL_CUR=CAL_CUR-CAL_MAX GOSUB *CAL_NEXT CAL_YMD=L_T*100+CAL_CUR GOSUB *CALENDAR ENDIF ELSEIF (PEN)*(CAL_SPS>CAL_SP)*(CAL_SPS<=CAL_SP+31) IFBLK CAL_CUR<>CAL_SPS-CAL_SP GOSUB *CAL_BOXERASE CAL_CUR=CAL_SPS-CAL_SP ENDIF ELSEIF CAL_PA FOR L_I=CAL_SP+1 TO CAL_SP+31 SPRITE L_I,L_I,0 NEXT L_I CAL_CUR=STRCAT('0',CAL_CUR) CAL_CUR=RIGHT(CAL_CUR,2) CAL_RET=STRCAT(YYYY,MM,CAL_CUR) REM MESSAGE CAL_RET L_F=1 ELSEIF CAL_PB GOSUB *CAL_PREV CAL_YMD=STRCAT(YYYY,MM,CAL_MAX) IF CAL_CUR>CAL_MAX THEN CAL_CUR=CAL_MAX GOSUB *CALENDAR GOSUB *CAL_BOX ELSEIF CAL_PC GOSUB *CAL_NEXT CAL_YMD=STRCAT(YYYY,MM,'01') IF CAL_CUR>CAL_MAX THEN CAL_CUR=CAL_MAX GOSUB *CALENDAR GOSUB *CAL_BOX ENDIF GOSUB *CAL_BOX CAL_CUR=STRCAT('0',CAL_CUR) CAL_CUR=RIGHT(CAL_CUR,2) REM TODAYと連携する場合 REM TD_DATE=STRCAT(YYYY,MM,CAL_CUR) REM GOSUB *TODAY SYNC LOOP RETURN *CAL_PREV REM 先月 MM=MM-1 IF MM<1 THEN MM=12:YYYY=YYYY-1 MM=STRCAT('0',MM) MM=RIGHT(MM,2) L_T=YYYY*100+MM CAL_MAX=GETMONTH(L_T) RETURN *CAL_NEXT REM 来月 MM=MM+1 IF MM>12 THEN MM=1:YYYY=YYYY+1 MM=STRCAT('0',MM) MM=RIGHT(MM,2) L_T=YYYY*100+MM CAL_MAX=GETMONTH(L_T) RETURN *CAL_FONT REM カレンダーフォントサイズの決定 REM 変数MC_FWは全角時のフォント横幅 IFBLK CAL_FNT=1 CAL_FW=12:CAL_FH=12 FONT 64 ELSEIF CAL_FNT=2 CAL_FW=16:CAL_FH=16 FONT 96 ELSEIF CAL_FNT=3 CAL_FW=24:CAL_FH=18 FONT 112 ELSEIF CAL_FNT=0 CAL_FW=8:CAL_FH=9 FONT 48 ENDIF RETURN *CAL_BOX REM カレンダーの日付枠表示 IF CAL_FNT=3 THEN CAL_MRGN=2 ELSE CAL_MRGN=1 OPT(0)=CAL_DATE(0,CAL_CUR)-2 OPT(1)=CAL_DATE(1,CAL_CUR)-CAL_MRGN OPT(2)=CAL_DATE(0,CAL_CUR)+CAL_FW OPT(3)=CAL_DATE(1,CAL_CUR)+CAL_FH+2-CAL_MRGN IFBLK CAL_BX=1 REM 凹 GOSUB *CONCAVE ELSEIF CAL_BX=2 REM 凸 GOSUB *CONVEX ELSE REM 実線表示 COLORFG LNR,LNG,LNB BOX OPT(0),OPT(1),OPT(2),OPT(3) ENDIF RETURN *CAL_BOXERASE REM カレンダーの日付枠消去 COLORFG BGR,BGG,BGB IF CAL_FNT=3 THEN CAL_MRGN=2 ELSE CAL_MRGN=1 BOX CAL_DATE(0,CAL_CUR)-2,CAL_DATE(1,CAL_CUR)-CAL_MRGN,CAL_DATE(0,CAL_CUR)+CAL_FW,CAL_DATE(1,CAL_CUR)+CAL_FH+2-CAL_MRGN RETURN *LOAD_ANNIV REM ファイルから記念日データを読み込みFILESEARCH ANN_FILE,ANNIV IF STRCMP(ANNIV(0),ANN_FILE)<>0 THEN RETURN LOADCSV ANN_FILE,ANNIV ANN_MAX=(GETREADCNT/2)-1 FOR L_I=0 TO ANN_MAX L_M=MID(ANNIV(0,L_I),1,2) L_S=MID(ANNIV(0,L_I),3,1) L_A=ASC(L_S) IFBLK (L_A>=48)*(L_A<=57) REM 数字の場合 ANNIDX(L_M-1)=STRCAT(ANNIDX(L_M-1),L_I,':') ELSE REM アルファベットの場合 ANNWIDX(L_M-1)=STRCAT(ANNWIDX(L_M-1),L_I,':') ENDIF NEXT L_I RETURN *SETANN REM 指定した月の記念日を設定 REM 記念日を設定する月を決定 IFBLK ANN_DATE=0 L_D=DATE ANN_DATE=LEFT(L_D,6) ENDIF ANN_DATE=STRCAT(ANN_DATE,'01') L_M=MID(ANN_DATE,5,2) REM 配列初期化 FOR L_I=0 TO 31 ANN_MONTH(L_I)='' NEXT L_I REM その月の祝日をセット OPT(0)=LEFT(ANNIDX(L_M-1),LEN(ANNIDX(L_M-1))-1) OPT(1)=':' GOSUB *SPLIT IFBLK SPL_CNT<>0 FOR L_I=0 TO SPL_CNT-1 L_D=RIGHT(ANNIV(0,SPL_RET(L_I)),2) ANN_MONTH(L_D)=STR(ANNIV(1,SPL_RET(L_I))) NEXT L_I ENDIF L_W1=GETWEEK(ANN_DATE,0) OPT(0)=LEFT(ANNWIDX(L_M-1),LEN(ANNWIDX(L_M-1))-1) OPT(1)=':' GOSUB *SPLIT IFBLK SPL_CNT<>0 FOR L_I=0 TO SPL_CNT-1 L_D=MID(ANNIV(0,SPL_RET(L_I)),3,2) L_WNUM=RIGHT(ANNIV(0,SPL_RET(L_I)),1) GOSUB *GET_LW REM 第nW曜日が何日かを求める L_D=((8+L_W-L_W1)%7)+(7*(L_WNUM-1)) ANN_MONTH(L_D)=STR(ANNIV(1,SPL_RET(L_I))) NEXT L_I ENDIF RETURN *LOAD_HOLIDAY REM ファイルから休祝日データを読み込み FILESEARCH HOL_FILE,HOLIDAY IF STRCMP(HOLIDAY(0),HOL_FILE)<>0 THEN RETURN LOADCSV HOL_FILE,HOLIDAY HOL_MAX=(GETREADCNT/2)-1 FOR L_I=0 TO HOL_MAX L_M=MID(HOLIDAY(0,L_I),1,2) L_S=MID(HOLIDAY(0,L_I),3,1) L_A=ASC(L_S) IFBLK (L_A>=48)*(L_A<=57) REM 数字の場合 HOLIDX(L_M-1)=STRCAT(HOLIDX(L_M-1),L_I,':') ELSE REM アルファベットの場合 HOLWIDX(L_M-1)=STRCAT(HOLWIDX(L_M-1),L_I,':') ENDIF NEXT L_I RETURN *SETHOL REM 祝日を設定する月を決定 IFBLK HOL_DATE=0 L_D=DATE HOL_DATE=LEFT(L_D,6) ENDIF HOL_DATE=STRCAT(HOL_DATE,'01') L_M=MID(HOL_DATE,5,2) REM 配列初期化 FOR L_I=0 TO 31 HOL_MONTH(L_I)='' NEXT L_I REM その月の祝日をセット OPT(0)=LEFT(HOLIDX(L_M-1),LEN(HOLIDX(L_M-1))-1) OPT(1)=':' GOSUB *SPLIT IFBLK SPL_CNT<>0 FOR L_I=0 TO SPL_CNT-1 L_D=RIGHT(HOLIDAY(0,SPL_RET(L_I)),2) HOL_MONTH(L_D)=STR(HOLIDAY(1,SPL_RET(L_I))) IF GETWEEK(HOL_DATE+L_D-1)=0 THEN HOL_MONTH(L_D+1)='振替休日' NEXT L_I ENDIF L_W1=GETWEEK(HOL_DATE,0) OPT(0)=LEFT(HOLWIDX(L_M-1),LEN(HOLWIDX(L_M-1))-1) OPT(1)=':' GOSUB *SPLIT IFBLK SPL_CNT<>0 FOR L_I=0 TO SPL_CNT-1 L_D=MID(HOLIDAY(0,SPL_RET(L_I)),3,2) L_WNUM=RIGHT(HOLIDAY(0,SPL_RET(L_I)),1) GOSUB *GET_LW REM 第nW曜日が何日かを求める L_D=((8+L_W-L_W1)%7)+(7*(L_WNUM-1)) HOL_MONTH(L_D)=STR(HOLIDAY(1,SPL_RET(L_I))) NEXT L_I ENDIF RETURN *GET_L_W IFBLK STRCMP(L_D,'MO')=0 L_W=1 ELSEIF STRCMP(L_D,'TU')=0 L_W=2 ELSEIF STRCMP(L_D,'WE')=0 L_W=3 ELSEIF STRCMP(L_D,'TH')=0 L_W=4 ELSEIF STRCMP(L_D,'FR')=0 L_W=5 ELSEIF STRCMP(L_D,'SA')=0 L_W=6 ELSEIF STRCMP(L_D,'SU')=0 L_W=0 ENDIF RETURN *TODAY REM 日めくり風に日付を表示 COLORBG BGR_L,BGG_L,BGB OPT(0)=TD_X,TD_Y,TD_X+TD_W-1,TD_Y+TD_H-1,0,BGR_L,BGG_L,BGB GOSUB *FLAT REM 日付の設定 IFBLK TD_DATE GY_DATE=TD_DATE ELSE GY_DATE=0 ENDIF GOSUB *GETYYMMDD REM 休祝日/記念日の取得 HOL_DATE=STRCAT(YYYY,MM) GOSUB *SETHOL ANN_DATE=STRCAT(YYYY,MM) GOSUB *SETANN FONT 48 REM 年の表示 COLORFG LNR,LNG,LNB IFBLK STRCMP(TD_MMSTYLE,'E')=0 GCURSOR TD_X+2,TD_Y+2 PRINT YYYY ELSE GCURSOR TD_X+1,TD_Y+2 PRINT "平"; PRINT YJ ENDIF REM 月の表示 L_CMD=STRCAT('L_L=LEN(MM_',TD_MMSTYLE,'(MM-1))') COMMAND L_CMD L_L=L_L*4 GCURSOR TD_X+TD_W-2-L_L,TD_Y+2 L_CMD=STRCAT('PRINT MM_',TD_MMSTYLE,'(MM-1)') COMMAND L_CMD REM 土日、祝休日は色を変える IFBLK LEN(HOL_MONTH(DD))>0 COLORFG FGR_L,FGG_D,FGB_D REM 祝日の頭二文字を表示 L_T=INT((TD_H-49)/3)*2+TD_Y+28 IF (TD_H-49)%3=2 THEN L_T=L_T+1 GCURSOR TD_X+21,L_T L_T=INT((TD_W-21)/4) L_T=LEFT(HOL_MONTH(DD),L_T) PRINT L_T ELSEIF WK=6 COLORFG FGR_D,FGG_D,FGB_L ELSEIF WK=0 COLORFG FGR_L,FGG_D,FGB_D ELSE COLORFG FGR,FGG,FGB ENDIF REM 日付の表示 L_T=INT((TD_H-49)/3)+TD_Y+12 IF (TD_H-49)%3 THEN L_T=L_T+1 FONT 112 IFBLK DD_>9 GCURSOR TD_X+(TD_W-2)/2-11,L_T REM GCURSOR TD_X+(TD_W-2)/2-11,TD_Y+(TD_H/2)-15 ELSE GCURSOR TD_X+(TD_W-2)/2-5,L_T REM GCURSOR TD_X+(TD_W-2)/2-5,TD_Y+(TD_H/2)-15 ENDIF PRINT DD_ FONT 48 REM 曜日を表示 L_T=INT((TD_H-49)/3)*2+TD_Y+28 IF (TD_H-49)%3=2 THEN L_T=L_T+1 COLORFG LNR,LNG,LNB GCURSOR TD_X+3,L_T REM GCURSOR TD_X+2,TD_Y+(TD_H/2)+3 L_CMD=STRCAT('PRINT WK_',TD_WKSTYLE,'(WK)') COMMAND L_CMD REM 記念日がある場合は表示 IFBLK LEN(ANN_MONTH(DD))>0 COLORFG FGR_D,FGG_L,FGB_D GCURSOR TD_X+3,TD_Y+TD_H-12 REM GCURSOR TD_X+2,TD_Y+(TD_H/2)+14 L_L=INT((TD_W-4)/4) L_T=LEFT(ANN_MONTH(DD),L_L) PRINT L_T ENDIF RETURN *CLOCK REM アナログ時計の描画 REM IF GT_T=TIME THEN RETURN GT_T=TIME REM MN_NOW=INT((GT_T/100)%100) REM IF MN_NOW=MN0 THEN RETURN SETPAGE 2 REM マージン CLK_SZ=INT(CLK_L/25)+1 GOSUB *GETHHMNSS REM COLORFG BGR,BGG,BGB COLORFG 0,0,0 BOXFILL CLK_X-CLK_L-CLK_SZ,CLK_Y-CLK_L-CLK_SZ,CLK_X+CLK_L+CLK_SZ,CLK_Y+CLK_L+CLK_SZ+1 IFBLK CLK_INI=0 CLK_INI=1 GOSUB *CLK_INIT ENDIF REM 文字盤の数字部に四角形を描画 FOR L_I=0 TO 11 COLORFG BGR_L,BGG_L,BGB_L BOXFILL CLK_DIAL(0,L_I),CLK_DIAL(1,L_I),CLK_DIAL(0,L_I)+CLK_SZ,CLK_DIAL(1,L_I)+CLK_SZ COLORFG LNR,LNG,LNB BOXFILL CLK_DIAL(0,L_I),CLK_DIAL(1,L_I),CLK_DIAL(0,L_I)+CLK_SZ-1,CLK_DIAL(1,L_I)+CLK_SZ-1 NEXT L_I REM 短針 L_SN=(SINAG(HH*30)*CLK_L*0.55) L_CS=(COSAG(HH*30)*CLK_L*0.55) COLORFG LNR,LNG,LNB LINE CLK_X,CLK_Y-1,CLK_X+L_SN,CLK_Y-L_CS LINE CLK_X,CLK_Y+1,CLK_X+L_SN,CLK_Y-L_CS LINE CLK_X-1,CLK_Y,CLK_X+L_SN,CLK_Y-L_CS LINE CLK_X+1,CLK_Y,CLK_X+L_SN,CLK_Y-L_CS LINE CLK_X,CLK_Y,CLK_X+L_SN,CLK_Y-L_CS REM 長針 L_SN=(SINAG(MN*6)*CLK_L*0.8) L_CS=(COSAG(MN*6)*CLK_L*0.8) COLORFG LNR,LNG,LNB LINE CLK_X,CLK_Y-1,CLK_X+L_SN,CLK_Y-L_CS LINE CLK_X-1,CLK_Y,CLK_X+L_SN,CLK_Y-L_CS IFBLK CLK_L>40 LINE CLK_X,CLK_Y+1,CLK_X+L_SN,CLK_Y-L_CS LINE CLK_X+1,CLK_Y,CLK_X+L_SN,CLK_Y-L_CS ENDIF LINE CLK_X,CLK_Y,CLK_X+L_SN,CLK_Y-L_CS COLORFG LNR,LNG,LNB COLORBG 0,0,0 GOSUB *SET_BG SPRITE CLK_SP,CLK_SP,1,CLK_X-CLK_L-CLK_SZ,CLK_Y-CLK_L-CLK_SZ,CLK_X-CLK_L-CLK_SZ,CLK_Y-CLK_L-CLK_SZ,CLK_L*2+CLK_SZ*2+1,CLK_L*2+CLK_SZ*2+1 REFRESH CLK_X-CLK_L-CLK_SZ,CLK_Y-CLK_L-CLK_SZ,CLK_X-CLK_L-CLK_SZ,CLK_Y-CLK_L-CLK_SZ,CLK_L*2+CLK_SZ*2+1,CLK_L*2+CLK_SZ*2+1 SETPAGE 0 RETURN *CLK_INIT FOR L_H=0 TO 22 STEP 2 L_I=INT(L_H/2) CLK_DIAL(0,L_I)=CLK_X+INT(SINAG(L_H*15)*CLK_L)-1 CLK_DIAL(1,L_I)=CLK_Y-INT(COSAG(L_H*15)*CLK_L)-1 NEXT L_H RETURN *WATCH REM 普通の時計 HH:MM の形式で表示 REM 色、フォントはサブルーチンを呼び出す前に指定 GCURSOR OPT(0),OPT(1) GOSUB *GETHHMNSS L_T=STRCAT(HH0,':',MN0) PRINT L_T RETURN *GETHHMNSS REM 時刻数値(HHMNSS)を切り分け REM ゼロ詰めなどの処理も IF GT_T=0 THEN GT_T=TIME SS=GT_T%100 MN=(GT_T/100)%100+SS/60 HH=INT(GT_T/10000)+MN/60 SS_=SS:MN_=MN:HH_=HH MN0=INT((GT_T/100)%100) HH0=INT(GT_T/10000) SS0=STRCAT('0',SS) SS0=RIGHT(SS0,2) HH0=STRCAT('0',HH0) HH0=RIGHT(HH0,2) MN0=STRCAT('0',MN0) MN0=RIGHT(MN0,2) HH0=STRCAT('0',HH0) HH0=RIGHT(HH0,2) RETURN *GETYYMMDD REM 日付数値(YYYYMMNN)を各変数に切り分け REM ゼロ詰めなどの処理も IF GY_DATE=0 THEN GY_DATE=DATE YYYY=LEFT(GY_DATE,4) YY=MID(GY_DATE,3,2) YJ=YYYY-1988 MM=MID(GY_DATE,5,2) DD=MID(GY_DATE,7,2) MM0=STR(MM) DD0=STR(DD) MM_=MM+0 DD_=DD+0 WK=GETWEEK(GY_DATE,GY_WKS) RETURN *SPLIT REM デリミタ(デフォルトは",")で文字列を分割し REM 配列SPL_RETに格納。分割数はSPL_CNTに REM OPT(0)=文字列、OPT(1)=デリミタ(省略可) FOR L_I=0 TO 99 SPL_RET(L_I)='' NEXT L_I IF LEN(OPT(0))=0 THEN SPL_CNT=0:RETURN IFBLK LEN(OPT(1))=0 D=',' ELSE D=STR(OPT(1)) ENDIF S=STR(OPT(0)) C=INSTR(S,D) SPL_CNT=0 WHILE C<>0 L=LEN(S) B=MID(S,1,C-1) SPL_RET(SPL_CNT)=STR(B) SPL_CNT=SPL_CNT+1 S=MID(S,C+LEN(D),L-C) C=INSTR(S,D) LOOP SPL_RET(SPL_CNT)=STR(S) SPL_CNT=SPL_CNT+1 RETURN *REPLACE REM 文字列置換(REPLACE ALL) REM OPT(0)=変換対象、OPT(1)=置換前、OPT(2)=置換後 REM REP_STR=変換後の文字列 REM REP_CNT=変換個数 L_FLAG=0 REP_CNT=0 IFBLK INSTR(OPT(0),OPT(1))=0 REP_STR=STR(OPT(0)) L_FLAG=1 ELSEIF STRCMP(OPT(1),OPT(2))=0 REP_STR=STR(OPT(0)) L_FLAG=1 ENDIF IF L_FLAG=1 THEN RETURN L_T=STR(OPT(0)) L_FL=LEN(OPT(1)) L_SL=LEN(L_T) L_I=INSTR(L_T,OPT(1)) WHILE L_I<>0 REP_CNT=REP_CNT+1 IFBLK L_I=1 L_L='' ELSE L_L=LEFT(L_T,L_I-1) ENDIF L_R=MID(L_T,L_I+L_FL,L_SL-L_I-L_FL+1) L_T=STRCAT(L_L,OPT(2),L_R) L_I=INSTR(L_T,OPT(1)) L_SL=LEN(L_T) LOOP REP_STR=STR(L_T) RETURN *COLORSETTING REM RRGGBBを10進数に変換 REM 背景色 OPT(0)=STR(BGCOLOR) GOSUB *COLOR_EXTRACT BGR=RET(0):BGG=RET(1):BGB=RET(2) BGR_L=RET(3):BGG_L=RET(4):BGB_L=RET(5) BGR_D=RET(6):BGG_D=RET(7):BGB_D=RET(8) REM 文字色 OPT(0)=STR(FGCOLOR) GOSUB *COLOR_EXTRACT FGR=RET(0):FGG=RET(1):FGB=RET(2) FGR_L=RET(3):FGG_L=RET(4):FGB_L=RET(5) FGR_D=RET(6):FGG_D=RET(7):FGB_D=RET(8) REM 罫線色 OPT(0)=STR(LNCOLOR) GOSUB *COLOR_EXTRACT LNR=RET(0):LNG=RET(1):LNB=RET(2) LNR_L=RET(3):LNG_L=RET(4):LNB_L=RET(5) LNR_D=RET(6):LNG_D=RET(7):LNB_D=RET(8) RETURN *COLOR_EXTRACT REM RRGGBBを10進数に変換して個別の変数に REM OPT(0)=色文字列(FFFFFF) REM RET(0〜2)=R,G,B、RET(3〜5)=R_L,G_L,B_L、RET(6〜8)=R_D,G_D,B_D L_R=MID(OPT(0),1,2) L_G=MID(OPT(0),3,2) L_B=MID(OPT(0),5,2) L_R=HEXTODEC(L_R) L_G=HEXTODEC(L_G) L_B=HEXTODEC(L_B) IF L_R<207 THEN L_RL=L_R+48 ELSE L_RL=255 IF L_G<207 THEN L_GL=L_G+48 ELSE L_GL=255 IF L_B<207 THEN L_BL=L_B+48 ELSE L_BL=255 IF L_R>48 THEN L_RD=L_R-48 ELSE L_RD=0 IF L_G>48 THEN L_GD=L_G-48 ELSE L_GD=0 IF L_B>48 THEN L_BD=L_B-48 ELSE L_BD=0 RET(0)=L_R,L_G,L_B,L_RL,L_GL,L_BL,L_RD,L_GD,L_BD RETURN *CONVEX REM 凸表示 COLORFG BGR_L,BGG_L,BGB_L LINE OPT(0),OPT(1),OPT(2),OPT(1) LINE OPT(0),OPT(1),OPT(0),OPT(3) COLORFG BGR_D,BGG_D,BGB_D LINE OPT(0),OPT(3),OPT(2),OPT(3) LINE OPT(2),OPT(1),OPT(2),OPT(3) RETURN *CONCAVE REM 凹表示 COLORFG BGR_D,BGG_D,BGB_D LINE OPT(0),OPT(1),OPT(2),OPT(1) LINE OPT(0),OPT(1),OPT(0),OPT(3) COLORFG BGR_L,BGG_L,BGB_L LINE OPT(0),OPT(3),OPT(2),OPT(3) LINE OPT(2),OPT(1),OPT(2),OPT(3) RETURN *COLORPICKER REM 表示位置=CP_X,CP_Y 返り値=CP_R,CP_B,CP_G REM カラーピッカー COLORBG BGR,BGG,BGB COLORFG BGR,BGG,BGB CP_X=OPT(0) CP_Y=OPT(1) CP_DEFCOLOR=STR(OPT(2)) IF LEN(CP_DEFCOLOR)=0 THEN CP_DEFCOLOR='808080' BOXFILL CP_X,CP_Y,CP_X+190,CP_Y+80 COLORFG BGR_D,BGG_D,BGB_D BOX CP_X,CP_Y,CP_X+190,CP_Y+80 COLORFG LNR,LNG,LNB BOXCIRCLE CP_X,CP_Y,CP_X+189,CP_Y+79 REM DISP PLACE OPT(0)=CP_X+139,CP_Y+13,CP_X+158,CP_Y+32 GOSUB *CONCAVE REM CANCEL OPT(0)=CP_X+177,CP_Y+2,CP_X+186,CP_Y+11 GOSUB *CONVEX GCURSOR OPT(0)+1,OPT(1) FONT 48+1 PRINT '×' SPRITE 179,179,1,OPT(0),OPT(1),OPT(0),OPT(1),10,10 REM OK OPT(0)=CP_X+140,CP_Y+68,CP_X+185,CP_Y+77 GOSUB *CONVEX GCURSOR OPT(0)+12,OPT(1) FONT 48+1 PRINT 'O K' SPRITE 178,178,1,OPT(0),OPT(1),OPT(0),OPT(1),36,10 L_V=255 GOSUB *MAKEPICKER GOSUB *GRADATION L_X=CP_X+3 L_Y=CP_Y+3 CP_BTN=0 FOR L_V=32 TO 255 STEP 16 HSV 0,0,L_V BOXFILL L_X,L_Y,L_X+6,L_Y+6 OPT(0)=L_X-1,L_Y-1,L_X+7,L_Y+7 GOSUB *CONVEX SPRITE CP_SP+CP_BTN,CP_SP+CP_BTN,1,L_X,L_Y,L_X,L_Y,8,8 L_X=L_X+10 CP_BTN=CP_BTN+1 NEXT L_V CP_BTN=CP_BTN-1 GOSUB *CONCAVE L_F=0 SETPEN 0,L_X+1,L_Y-6 WHILE L_F=0 SYNC L_PX=PENX L_PY=PENY L_KY=INKEY L_PA=PADA L_SPS=SPSEARCH(L_PX,L_PY,CP_SP,179) IFBLK (PEN=2)+(L_KY<>0) IFBLK (L_SPS>=CP_SP)*(L_SPSMN_NUM THEN MN_ROW=MN_NUM REM フォントのサイズ MN_FSIZE=64-MN_FONT*16 FONT MN_FSIZE MN_FW=6-MN_FONT*2 MN_FH=16-MN_FONT*4 REM メニュー表示幅決定 IFBLK MN_COL=0 FOR L_I=0 TO MN_NUM L_L=LEN(MN_ITEM(L_I)) IF L_L>MN_COL THEN MN_COL=L_L NEXT L_I ENDIF IFBLK MN_FW*MN_COL+MN_X>239 MN_COL=INT((239-MN_X)/MN_FW)-1 ENDIF MN_W=MN_FW*MN_COL+7 REM メニュー表示高決定 IFBLK MN_ROW=0 MN_ROW=MN_NUM+1 ENDIF IFBLK MN_FH*MN_ROW+MN_Y>319 MN_ROW=INT((319-MN_Y)/MN_FH) ENDIF MN_H=(MN_ROW+2)*MN_FH+4 REM パネル描画 COLORFG BGR_D,BGG_D,BGB_D BOXFILL MN_X+1,MN_Y+1,MN_X+MN_W,MN_Y+MN_H COLORFG BGR,BGG,BGB BOXFILL MN_X,MN_Y,MN_X+MN_W-1,MN_Y+MN_H-1 COLORFG BGR_D,BGG_D,BGB_D BOX MN_X,MN_Y,MN_X+MN_W-1,MN_Y+MN_H-1 COLORFG LNR,LNG,LNB BOXCIRCLE MN_X,MN_Y,MN_X+MN_W-1,MN_Y+MN_H-1 REM タイトルとメニュー項目表示 COLORBG BGR,BGG,BGB COLORFG FGR,FGG,FGB GCURSOR MN_X+14,MN_Y+3 PRINT MN_TITLE COLORFG BGR_D,BGG_D,BGB_D GCURSOR MN_X+2,MN_Y+3 PRINT '゙|' SPRITE MN_SP+2+MN_ROW,MN_SP+2+MN_ROW,1, MN_X+2,MN_Y+3, MN_X+2,MN_Y+3, MN_FW+2,MN_FH FONT MN_FSIZE+1 COLORFG BGR_D,BGG_D,BGB_D GCURSOR MN_X+MN_W-15,MN_Y+2 PRINT '△' COLORFG BGR_L,BGG_L,BGB_L GCURSOR MN_X+MN_W-14,MN_Y+2 PRINT '△' SPRITE MN_SP+MN_ROW,MN_SP+MN_ROW,1, MN_X+MN_W-15,MN_Y+2, MN_X+MN_W-15,MN_Y+2, MN_FW+2,MN_FH COLORFG BGR_D,BGG_D,BGB_D GCURSOR MN_X+MN_W-15,MN_ROW*MN_FH+MN_Y+MN_FH+5 PRINT '▽' COLORFG BGR_L,BGG_L,BGB_L GCURSOR MN_X+MN_W-14,MN_ROW*MN_FH+MN_Y+MN_FH+5 PRINT '▽' SPRITE MN_SP+1+MN_ROW,MN_SP+1+MN_ROW,1, MN_X+MN_W-15,MN_ROW*MN_FH+MN_Y+MN_FH+5, MN_X+MN_W-15,MN_ROW*MN_FH+MN_Y+MN_FH+5, MN_FW+2,MN_FH COLORFG BGR_D,BGG_D,BGB_D LINE MN_X+3,MN_Y+MN_FH*(MN_ROW+1)+3,MN_X+MN_W-4,MN_Y+MN_FH*(MN_ROW+1)+3 COLORFG BGR_D,BGG_D,BGB_D LINE MN_X+3,MN_Y+MN_FH,MN_X+MN_W-4,MN_Y+MN_FH COLORBG BGR,BGG,BGB COLORFG FGR,FGG,FGB GCURSOR MN_X+6,MN_ROW*MN_FH+MN_Y+MN_FH+5 PRINT MN_FOOTER FONT MN_FSIZE COLORFG FGR,FGG,FGB REM 項目描画 IFBLK MN_DEFPOS+MN_ROW>MN_NUM MN_START=MN_NUM-MN_ROW ELSE MN_START=MN_DEFPOS ENDIF GOSUB *MN_LIST REM 選択ボックス表示 CUR_ITEM=MN_DEFPOS IFBLK MN_DEFPOS+MN_ROW>MN_NUM CUR_POS=MN_ROW-(MN_NUM-MN_DEFPOS) ELSE CUR_POS=0 ENDIF BOXCIRCLE MN_X+3,MN_Y+MN_FH+2+CUR_POS*MN_FH,MN_X+MN_W-4,MN_Y+MN_FH+1+(CUR_POS+1)*MN_FH GOSUB *MN_DRAW REM メインループ L_F=0 WHILE L_F=0 SYNC MN_KY=INKEY MN_PY=PADONY MN_PX=PADONX MN_SPNUM=SPSEARCH(PENX,PENY,MN_SP,MN_SP+2+MN_ROW) IFBLK MN_PY<0 GOSUB *MN_ERASE IFBLK CUR_POS=0 IFBLK CUR_ITEM<=0 CUR_ITEM=MN_NUM-1 MN_START=CUR_ITEM-MN_ROW+1 GOSUB *MN_LIST CUR_POS=MN_ROW-1 ELSE CUR_ITEM=CUR_ITEM-1 MN_START=CUR_ITEM GOSUB *MN_LIST ENDIF ELSE CUR_POS=CUR_POS-1 CUR_ITEM=CUR_ITEM-1 ENDIF GOSUB *MN_DRAW ELSEIF MN_PY>0 GOSUB *MN_ERASE IFBLK CUR_POS=MN_ROW-1 IFBLK CUR_ITEM>=MN_NUM-1 CUR_ITEM=0 CUR_POS=0 MN_START=0 GOSUB *MN_LIST ELSE CUR_ITEM=CUR_ITEM+1 MN_START=CUR_ITEM-MN_ROW+1 GOSUB *MN_LIST ENDIF ELSE CUR_POS=CUR_POS+1 CUR_ITEM=CUR_ITEM+1 ENDIF GOSUB *MN_DRAW ELSEIF (PADONB=1) GOSUB *MN_PGUP ELSEIF (PADONC=1) GOSUB *MN_PGDN ELSEIF (PEN<>0)*(PEN<>3)*(MN_SPNUM>=MN_SP)*(MN_SPNUM<=MN_SP+MN_ROW-1) REM ペンがタッチしているとき IFBLK (CUR_POS<>MN_SPNUM-MN_SP) GOSUB *MN_ERASE CUR_POS=MN_SPNUM-MN_SP CUR_ITEM=MN_START+CUR_POS GOSUB *MN_DRAW ENDIF ELSEIF (PEN=3)*(MN_SPNUM>=MN_SP)*(MN_SPNUM<=MN_SP+MN_ROW-1) REM ペンが離れたとき CUR_POS=MN_SPNUM-MN_SP CUR_ITEM=MN_START+CUR_POS L_F=1 ELSEIF PADONA REM 決定キー L_F=1 ELSEIF MN_KY=8 REM 後退キー L_F=1 CUR_ITEM=-1 ELSEIF (MN_PX=-1) REM ←キー L_F=1 CUR_ITEM=-1 ELSEIF (MN_SPNUM=MN_SP+1+MN_ROW) IF (PEN=1) THEN GOSUB *MN_PGDN ELSEIF (MN_SPNUM=MN_SP+MN_ROW) IF (PEN=1) THEN GOSUB *MN_PGUP ELSEIF (MN_SPNUM=MN_SP+2+MN_ROW) IF (PEN=1) THEN L_F=1:CUR_ITEM=-1 ENDIF LOOP SYNC FOR I=0 TO MN_ROW+3 SPRITE MN_SP+I,MN_SP+I,0 NEXT I GOSUB *SET_BG REM REFRESH 0,0,0,0,240,320 REFRESH MN_X,MN_Y,MN_X,MN_Y,MN_W+1,MN_H+1 REM 返り値 MN_RET=CUR_ITEM RETURN *MN_PGDN REM メニュー 1ページ下へ GOSUB *MN_ERASE IFBLK CUR_ITEM+MN_ROW+(MN_ROW-CUR_POS)>MN_NUM-1 IFBLK CUR_ITEM=MN_NUM-1 CUR_ITEM=0 CUR_POS=0 MN_START=0 GOSUB *MN_LIST ELSE IFBLK CUR_ITEM+MN_ROW>=MN_NUM-1 CUR_POS=MN_ROW-1 CUR_ITEM=MN_NUM-1 ELSE CUR_ITEM=MN_NUM-MN_ROW+CUR_POS ENDIF MN_START=MN_NUM-MN_ROW GOSUB *MN_LIST ENDIF ELSE MN_START=CUR_ITEM+MN_ROW-CUR_POS GOSUB *MN_LIST CUR_ITEM=CUR_ITEM+MN_ROW ENDIF GOSUB *MN_DRAW RETURN *MN_PGUP REM メニュー 1ページ上へ GOSUB *MN_ERASE IFBLK CUR_ITEM-MN_ROW-(MN_ROW-CUR_POS)<0 IFBLK CUR_ITEM>0 IFBLK CUR_ITEM-MN_ROW>=0 CUR_ITEM=CUR_POS ELSE CUR_POS=0 CUR_ITEM=0 ENDIF MN_START=0 GOSUB *MN_LIST ELSE CUR_ITEM=MN_NUM-1 CUR_POS=MN_ROW-1 MN_START=MN_NUM-MN_ROW GOSUB *MN_LIST ENDIF ELSE MN_START=CUR_ITEM-MN_ROW-CUR_POS IF MN_START<0 THEN MN_START=0 GOSUB *MN_LIST CUR_ITEM=CUR_ITEM-MN_ROW ENDIF GOSUB *MN_DRAW RETURN *MN_ERASE REM ボックス消す COLORBG BGR,BGG,BGB COLORFG BGR,BGG,BGB BOXFILL MN_X+2,MN_Y+MN_FH+2+CUR_POS*MN_FH,MN_X+MN_W-3,MN_Y+MN_FH+1+(CUR_POS+1)*MN_FH COLORFG FGR,FGG,FGB GCURSOR MN_X+4,CUR_POS*MN_FH+MN_Y+MN_FH+4 MN_PR=LEFT(MN_ITEM(CUR_POS),MN_COL) PRINT MN_PR COLORFG BGR,BGG,BGB BOXCIRCLE MN_X+2,MN_Y+MN_FH+2+CUR_POS*MN_FH,MN_X+MN_W-3,MN_Y+MN_FH+1+(CUR_POS+1)*MN_FH RETURN *MN_DRAW REM ボックス描く COLORBG BGR_D,BGG_D,BGB_D COLORFG BGR_D,BGG_D,BGB_D BOXFILL MN_X+2,MN_Y+MN_FH+2+CUR_POS*MN_FH,MN_X+MN_W-3,MN_Y+MN_FH+1+(CUR_POS+1)*MN_FH COLORFG FGR,FGG,FGB GCURSOR MN_X+4,(CUR_POS)*MN_FH+MN_Y+MN_FH+4 MN_PR=LEFT(MN_ITEM(CUR_POS),MN_COL) PRINT MN_PR COLORFG LNR,LNG,LNB BOXCIRCLE MN_X+2,MN_Y+MN_FH+2+CUR_POS*MN_FH,MN_X+MN_W-3,MN_Y+MN_FH+1+(CUR_POS+1)*MN_FH RETURN *MN_LIST REM MN_START 開始項目(0〜MN_NUM-1) COLORBG BGR,BGG,BGB COLORFG FGR,FGG,FGB FOR L_I=0 TO MN_ROW-1 CMD=STRCAT('MN_ITEM(L_I)=STR(',OPT(0),'(L_I+MN_START))') COMMAND CMD GCURSOR MN_X+4,L_I*MN_FH+MN_Y+MN_FH+4 SPRITE MN_SP+L_I,MN_SP+L_I,1, MN_X+3,MN_Y+MN_FH+2+L_I*MN_FH, MN_X+3,MN_Y+MN_FH+2+L_I*MN_FH,MN_W-1,MN_FH-2 MN_PR=LEFT(MN_ITEM(L_I),MN_COL) PRINT MN_PR NEXT L_I RETURN *FLAT IFBLK OPT(4)=0 REM PLAIN(SHADOW) COLORFG BGR_D,BGG_D,BGB_D BOX OPT(0)+1,OPT(1)+1,OPT(2),OPT(3) COLORFG OPT(5),OPT(6),OPT(7) BOXFILL OPT(0),OPT(1),OPT(2)-1,OPT(3)-1 ELSEIF OPT(4)=1 REM ROUND-BORDER(SHADOW) COLORFG LNR_D,LNG_D,LNB_D BOXCIRCLE OPT(0)+1,OPT(1)+1,OPT(2),OPT(3) COLORFG OPT(5),OPT(6),OPT(7) BOXFILL OPT(0),OPT(1),OPT(2)-1,OPT(3)-1 COLORFG LNR,LNG,LNB BOXCIRCLE OPT(0),OPT(1),OPT(2)-1,OPT(3)-1 COLORFG LNR,LNG,LNB PSET OPT(0),OPT(1) PSET OPT(0),OPT(3)-1 COLORFG LNR_D,LNG_D,LNB_D PSET OPT(2)-1,OPT(1) PSET OPT(2)-1,OPT(3)-1 ENDIF RETURN *SETWALLPAPER REM ディレクトリから画像のみ抽出 IF LEN(WALLPAPER)=0 THEN RETURN WP_NUM=0 WP_EXT=RIGHT(WALLPAPER,1) IFBLK STRCMP(WP_EXT,'\')<>0 WP_EXT=RIGHT(WALLPAPER,3) IFBLK STRCMP(WP_EXT,'JPG')=0 JPEG WALLPAPER,480,0 ELSEIF STRCMP(WP_EXT,'BMP')=0 BITMAP WALLPAPER,480,0 ENDIF SPRITE 255,255,1,0,0,480,0,240,320 SETPAGE 0 COLORBG 0,0,0 REFRESH 0,0,0,0,240,320 ELSE DIM WP_TMP(99) DIM WP_FILE(99) WP_DIR=STRCAT(WALLPAPER,'*.JPG') FILESEARCH WP_DIR,WP_TMP WP_NUM=GETREADCNT FOR L_I=0 TO WP_NUM WP_FILE(L_I)=STR(WP_TMP(L_I)) NEXT L_I WP_DIR=STRCAT(WALLPAPER,'*.BMP') FILESEARCH WP_DIR,WP_TMP WP_NUM=GETREADCNT L_T=0 FOR L_J=L_I TO L_I+WP_NUM WP_FILE(L_J)=STR(WP_TMP(L_T)) L_T=L_T+1 NEXT L_J WP_NUM=L_J WP_DIR=STR(WALLPAPER) IFBLK WP_RND=0 SORT WP_FILE,0,WP_NUM ELSE SHUFFLE WP_FILE,0,WP_NUM ENDIF WP_CNT=-1 ENDIF WP_OLD=SYSCNT+(WP_WAIT+1)*600 IFBLK WP_WAIT=0 WP_WAIT=1 GOSUB *WP_RND WP_WAIT=0 ENDIF RETURN *WP_RND REM 壁紙を選択して貼り付け REM 前回から一定時間経過→切り替え REM BMP限定。 REM JPG画像の場合、時計以外の要素は REM 再描画しないと白く抜けてしまう IF LEN(WALLPAPER)=0 THEN RETURN IF WP_WAIT=0 THEN RETURN L_T=RIGHT(WALLPAPER,1) IF STRCMP(L_T,'\')<>0 THEN RETURN L_S=SYSCNT IF ABS(L_S-WP_OLD)=WP_NUM WP_CNT=0 IF WP_RND=1 THEN SHUFFLE WP_FILE,0,WP_NUM ENDIF WP_IMG=STRCAT(WP_DIR,WP_FILE(WP_CNT)) EXT=RIGHT(WP_IMG,3) IFBLK STRCMP(EXT,'JPG')=0 JPEG WP_IMG,480,0 ELSEIF STRCMP(EXT,'BMP')=0 BITMAP WP_IMG,480,0 ENDIF SPRITE 255,255,1,0,0,480,0,240,320 COLORBG 8,8,8:CLS SETPAGE 0 COLORBG 0,0,0 REFRESH 0,0,0,0,240,320 WP_OLD=SYSCNT RETURN *SET_BG IFBLK LEN(WALLPAPER) COLORBG 0,0,0 ELSE COLORBG BGR,BGG,BGB ENDIF RETURN *CLEAR_OPT FOR L_I=0 TO 9 OPT(L_I)='' RET(L_I)='' NEXT L_I RETURN