REM 944BASIC '和時計 (β)' REM 表示モード REM 0-シンプル,1-十二支,2-フル DISPMODE=0 REM 表示位置(シンプルモード) DISPX=200: DISPY=200 REM 十二支が定時法かどうか(未使用) TEIJI=1 REM 子が11時から始まるか(未使用) BACKSHIFT=1 REM デバグ用フラグ DEBUG=0 DIM OFFSET(2)=164,90,0 SCREEN 240+OFFSET(DISPMODE)-DISPX,DISPY,200-OFFSET(DISPMODE),114 EVENT 100,999,1 GOSUB *INIT GOSUB *SETSPRITE D=DATE GOSUB *GETTODAY DFLG=0 GOSUB *DAYDIVISION GOSUB *GETTOKI REM メインループ *LOOP SYNC BOX 0,0,199-OFFSET(DISPMODE),113: BOX 1,1,198-OFFSET(DISPMODE),112 NOWOLD=NOW DOLD=DDIV REM 今日の日付を取得 D=DATE GOSUB *GETTODAY REM 現在時刻の昼夜を判定 REM 現在時刻が日の出前ならDを前日に DFLG=0 GOSUB *DAYDIVISION IF DFLG=(-1) THEN D=D-1: GOSUB *GETTODAY:DFLG=0 IFBLK (DDIV<>DOLD) REM 配列TOKIに区切りの時刻を格納 GOSUB *GETTOKI ENDIF GOSUB *GETNOW K=INKEY P=PEN REM 現在時刻を取得 IFBLK (TOLD<>T)+(P<>0) TOLD=T HH=INT(T/100):MM=T%100 IFBLK (NOWOLD<>NOW)+(P<>0)+(MM%100=0)+(MM%30=0) GOSUB *PUTSPRITE REFRESH 2,2,2,2,200-OFFSET(DISPMODE)-4,114-4 IF DISPMODE=2 THEN GOSUB *DRAWCIRCLE TOLD=T ENDIF ENDIF IFBLK DISPMODE<>2 BG B, 0,0, 200-OFFSET(DISPMODE),114, 0,0, 48,48, 268,269, 320,320 REFRESH 2,2,2,2,200-OFFSET(DISPMODE)-4,114-4 ENDIF IF K=26623 THEN GOSUB *CHANGEDISP IF K=26367 THEN GOSUB *DISPMES IF K=1023 THEN GOSUB *DEBMES GOTO *LOOP END *GETTODAY REM 日付から二十四節気の区分を確定 DDIV=(-1) FOR I=0 TO 23 DTMP=STRCAT(SUN(0,I),SUN(1,I),SUN(2,I)) TMP=GETDATEDIF(D,DTMP) IF TMP>=0 THEN DDIV=I-1:I=23 NEXT I IF DDIV=(-1) THEN DDIV=23 REM 時刻の数値ゼロ詰め FOR I=4 TO 7 NTMP=SUN(I,DDIV): GOSUB *NULLSUPPLY SUN(I,DDIV)=STR(NTMP) NEXT I REM 日の出(00:00から何分後か) HINODE=STRCAT(SUN(4,DDIV),SUN(5,DDIV)) HINODE_MIN=SUN(4,DDIV)*60+SUN(5,DDIV) REM 日の入(00:00から何分後か) HINOIRI=STRCAT(SUN(6,DDIV),SUN(7,DDIV)) HINOIRI_MIN=SUN(6,DDIV)*60+SUN(7,DDIV) RETURN REM 現時刻が前日の夜/昼/夜のどこに属するかを判定 *DAYDIVISION REM 現在時刻が日の出前なら前日の日の出日の入り情報に T=INT(TIME/100) IF DDIV<>0 THEN DTMP=DDIV-1 ELSE DTMP=23 DTMP=STRCAT(SUN(0,DTMP),SUN(1,DTMP),SUN(2,DTMP)) DTMP2=GETDATE(D,(-1)) IFBLK (THINODE) DFLG=0 ELSEIF (T>IRITMP) DFLG=1 ELSE DFLG=0 ENDIF RETURN *GETTOKI REM 昼と夜の長さ(分)を算出 REM 昼と夜の長さ(分) HIRU=HINOIRI_MIN-HINODE_MIN YORU=(24*60)-HIRU REM 昼/夜の半ときを求める HIRUTOKI=INT(HIRU/12) YORUTOKI=INT(YORU/12) REM 6で割ったあまり HIRUMOD=HIRU%12 YORUMOD=YORU%12 FOR I=0 TO 11 REM 昼の一刻を順に加算 TOKI(I)=HINODE_MIN+HIRUTOKI*I REM 余りはばらして各刻に加える IF HIRUMOD>=0 THEN TOKI(I)=TOKI(I)+I:HIRUMOD=HIRUMOD-1:HIRUADD=I ELSE TOKI(I)=TOKI(I)+HIRUADD REM 時刻形式で刻の区切りを配列に格納 HTMP=INT(TOKI(I)/60) MTMP=TOKI(I)%60 REM 1桁の場合0を加える NTMP=HTMP:GOSUB *NULLSUPPLY HTMP=STR(NTMP) NTMP=MTMP:GOSUB *NULLSUPPLY MTMP=STR(NTMP) TOKI(I)=STRCAT(HTMP,MTMP) REM 夜の一刻を順に加算 TOKI(I+12)=HINOIRI_MIN+YORUTOKI*I REM 余りはばらして各刻に加える IF YORUMOD>=0 THEN TOKI(I+12)=TOKI(I+12)+I:YORUMOD=YORUMOD-1:YORUADD=I ELSE TOKI(I+12)=TOKI(I+12)+YORUADD REM 時刻形式で刻の区切りを配列に格納 HTMP=INT(TOKI(I+12)/60) IF HTMP>24 THEN HTMP=HTMP-24 MTMP=TOKI(I+12)%60 REM 1桁の場合0を加える NTMP=HTMP:GOSUB *NULLSUPPLY HTMP=STR(NTMP) NTMP=MTMP:GOSUB *NULLSUPPLY MTMP=STR(NTMP) TOKI(I+12)=STRCAT(HTMP,MTMP) REM 日付の変わり目 IF TOKI(I+12-1)>TOKI(I+12) THEN DCHANGE=I+12-1 NEXT I IFBLK DEBUG=1 FONT 48:LOCATE 0,0 FOR I=0 TO 23 PRINT TOKI(I) NEXT I KEYWAIT ENDIF RETURN *GETNOW REM 現在がどの区分かを判定 FOR I=0 TO 22 IFBLK (T>=TOKI(I))*(T=TOKI(I+1)) REM 現在時刻がTOKI(22)より大きい場合 NOW=23 ELSEIF (T>=TOKI(I))*(T>TOKI(I+1))*(TOKI(I)>TOKI(I+1)) NOW=I I=22 ELSE REM 現在時刻がどの区切りにもあて REM はまらない場合->日付の変わり目 NOW=DCHANGE ENDIF NEXT I RETURN REM 輪を表示 *DRAWCIRCLE COLORFG 16,16,16 X0=48:Y0=47 SC=29:MC=45 FONT 48+1 FOR H=0 TO 22 STEP 2 REM デバッグ用時刻表示 G=H-6 IF G<0 THEN G=24+G IFBLK DEBUG=1 HHH=LEFT(TOKI(G),2) MMM=MID(TOKI(G),3,2) TH=STRCAT(HHH,':',MMM) X=X0+SINAG(H*15)*MC-6 Y=Y0-(COSAG(H*15))*MC+6 COLORFG 192,192,192 GCURSOR X,Y PRINT TH ENDIF REM 十二支表示 COLORFG 16,16,16 X=X0+SINAG(H*15)*SC Y=Y0-(COSAG(H*15))*SC+5 GCURSOR X,Y IFBLK (HH=H)+(HH=H-1)+((H=0)*(HH=23)) COLORFG 192,192,192 BOXFILL X-1,Y-1,X+8,Y+9 COLORFG 16,16,16 ENDIF PRINT JUUNISI(H/2) X=X0+SINAG(H*15)*MC Y=Y0-(COSAG(H*15))*MC SUU=LEFT(KAZOE(G),2) TU=MID(KAZOE(G),3,2) IF (G=NOW)+(G=NOW-1) THEN COLORFG 192,192,192:BOXFILL X-1,Y-1,X+8,Y+19:COLORFG 16,16,16 GCURSOR X,Y PRINT SUU GCURSOR X,Y+10 PRINT TU IF (G=NOW-1) THEN COLORFG 192,192,192:X=X0+SINAG((H+1)*15)*(MC-6):Y=Y0-(COSAG((H+1)*15))*(MC-6)+5:GCURSOR X,Y:PRINT '半':COLORFG 16,16,16 NEXT H REM CIRCLE 130,204,60,60 CIRCLE X0+2,Y0+9,MC-9,MC-9 CIRCLE X0+2,Y0+9,SC-6,SC-6 LINE X0-SC+6+2,Y0+9,X0+SC-6+2,Y0+9 GCURSOR X0-1,Y0+12: PRINT '昼' COLORFG 255,255,255:COLORBG 16,16,16 GCURSOR X0-1,Y0-3: FONT 48:PRINT '夜' COLORFG 16,16,16 FONT 64 REM SPRITE 250,250,1, 18,4, 24,320, 120,120 SETPAGE 0 COLORFG 0,0,0:COLORBG 255,255,255 RETURN REM 数値が1桁なら0詰め *NULLSUPPLY IF LEN(NTMP)=1 THEN NTMP=STRCAT('0',NTMP) RETURN *SETSPRITE REM スプライト定義 SETPAGE 2 BITMAP "KALWADK0.BMP" 0,0 BG B, 0,0, 200-OFFSET(DISPMODE),114, 0,0, 48,48, 268,269, 320,320 REM 十二支 SPRITE 200,200,0, 0,0, 3,2, 67,79 SPRITE 201,201,0, 0,0, 75,7, 66,77 SPRITE 202,202,0, 0,0, 149,8, 85,73 SPRITE 203,203,0, 0,0, 240,4, 77,73 SPRITE 204,204,0, 0,0, 0,86, 85,75 SPRITE 205,205,0, 0,0, 85,83, 68,81 SPRITE 206,206,0, 0,0, 152,101,103,55 SPRITE 207,207,0, 0,0, 259,87, 59,77 SPRITE 208,208,0, 0,0, 1,177, 112,56 SPRITE 209,209,0, 0,0, 113,167, 90,72 SPRITE 210,210,0, 0,0, 203,166, 72,72 SPRITE 211,211,0, 0,0, 2,235, 102,56 REM 数え FOR I=0 TO 5 SPRITE 4+I,4+I,0, 0,0, 104+I*27,241, 28,29 NEXT I REM ツ SPRITE 10,10,0, 0,0, 104+6*27,241, 28,28 REM 半 SPRITE 11,11,0, 0,0, 104+7*27,241, 27,28 REM 干支(漢字) FOR I=0 TO 11 SPRITE 100+I,100+I,0, 0,0, 2+I*21,294, 21,22 NEXT I REM 一ツ、二ツ FOR I=1 TO 5 SPRITE 120+I,120+I,0, 0,0, 109+(I-1)*21,271, 21,20 NEXT I RETURN *PUTSPRITE REM 数えのスプライトを配置 FOR J=4 TO 11 SPRITE J,J,0 NEXT J FOR I=1 TO LEN(KAZOE(NOW))-2 STEP 2 P=MID(KAZOE(NOW),I,2) SPX=168-OFFSET(DISPMODE):SPY=10+(I-1)*14 IFBLK STRCMP(P,'四')=0 SPRITE 4,4,1, SPX,SPY ELSEIF STRCMP(P,'五')=0 SPRITE 5,5,1, SPX,SPY ELSEIF STRCMP(P,'六')=0 SPRITE 6,6,1, SPX,SPY ELSEIF STRCMP(P,'七')=0 SPRITE 7,7,1, SPX,SPY ELSEIF STRCMP(P,'八')=0 SPRITE 8,8,1, SPX,SPY ELSEIF STRCMP(P,'九')=0 SPRITE 9,9,1, SPX,SPY ELSEIF STRCMP(P,'ツ')=0 SPRITE 10,10,1, SPX,SPY ELSEIF STRCMP(P,'半')=0 SPRITE 11,11,1, SPX,SPY ENDIF NEXT I FOR J=0 TO 11 SPRITE 100+J,100+J,0 SPRITE 200+J,200+J,0 NEXT J REM 十二支のときを表示 REM FONT 64 REM GCURSOR 142,38 REM PRINT JUUNISI(NOW/2) HHH=HH+1 IF HHH>=24 THEN HHH=0 SPRITE 100+(HHH/2),100+(HHH/2),1,SPP(0,HHH/2)-OFFSET(DISPMODE),SPP(1,HHH/2) REM 一ツ、二ツ・・・ FOR I=1 TO 4 SPRITE 120+I,120+I,0 NEXT I IFBLK (HHH%2=0)*(MM<30) SPRITE 121,121,1,SPP(0,HHH/2)-OFFSET(DISPMODE),SPP(1,HHH/2)+18 ELSEIF (HHH%2=0)*(MM>=30) SPRITE 122,122,1,SPP(0,HHH/2)-OFFSET(DISPMODE),SPP(1,HHH/2)+18 ELSEIF (HHH%2=1)*(MM<30) SPRITE 123,123,1,SPP(0,HHH/2)-OFFSET(DISPMODE),SPP(1,HHH/2)+18 ELSEIF (HHH%2=1)*(MM>=30) SPRITE 124,124,1,SPP(0,HHH/2)-OFFSET(DISPMODE),SPP(1,HHH/2)+18 ENDIF SPRITE 125,125,1,SPP(0,HHH/2)-OFFSET(DISPMODE),SPP(1,HHH/2)+34 REM 絵のすぷらいと IFBLK DISPMODE=0 SPRITE 200+(HHH/2),200+(HHH/2),0 ELSE SPRITE 200+(HHH/2),200+(HHH/2),1,SPP(2,HHH/2)-OFFSET(DISPMODE),SPP(3,HHH/2) ENDIF BG B, 0,0, 240,320, 0,0, 48,48, 268,269, 320,320 RETURN *CHANGEDISP DISPMODE=DISPMODE+1 IF DISPMODE>2 THEN DISPMODE=0 SCREEN 240+OFFSET(DISPMODE)-DISPX,DISPY,200-OFFSET(DISPMODE),114 SYNC GOSUB *PUTSPRITE REFRESH 0,0,0,0,200-OFFSET(DISPMODE),114 IF DISPMODE=2 THEN GOSUB *DRAWCIRCLE COLORBG 255,255,255 RETURN *INIT REM 日の出日の入りファイル読み込み REM SETDIRECTORY 'F1:\944BASIC\' DIM SUN(7,24) LOADCSV 'KALWADK0.CSV',SUN REM 刻の区切りを格納する配列 DIM TOKI(23) REM 昼夜の状態 DFLG=0: REM DFLG -1=前夜,0=昼,1=夜 REM 十二支 DIM JUUNISI(11)='子','丑','寅','卯','辰','巳','午','未','申','酉','戌','亥' REM 夜明けから始まるので明け六ツから DIM KAZOE(23)='六ツ','六ツ半','五ツ','五ツ半','四ツ','四ツ半','九ツ','九ツ半','八ツ','八ツ半','七ツ','七ツ半','六ツ','六ツ半','五ツ','五ツ半','四ツ','四ツ半','九ツ','九ツ半','八ツ','八ツ半','七ツ','七ツ半' REM 時計表示用 DIM K(9)='〇','一','二','三','四','五','六','七','八','九' REM その他 DIM D(5) CR=CHR(13) REM BG用配列 DIM B(0,0)=0 REM スプライト表示位置 DIM SPP(5,11) SPP(0,0)=130,58,104,6 SPP(0,1)=98,10,111,35 SPP(0,2)=123,59,103,4 SPP(0,3)=123,59,100,1 SPP(0,4)=109,4,99,36 SPP(0,5)=104,46,114,27 SPP(0,6)=116,14,74,56 SPP(0,7)=146,52,93,16 SPP(0,8)=124,24,90,54 SPP(0,9)=129,14,89,37 SPP(0,10)=122,58,98,1 SPP(0,11)=102,13,95,56 RETURN REM 現在時刻を表示 *DISPMES MM=INT(DATE/100)%100 DD=DATE%100 H2=INT(TIME/10000)%100 M2=INT(TIME/100)%100 DDIV2=DDIV+1 IF DDIV2>=25 THEN DDIV=0 NOW2=NOW+1 IF NOW2>=24 THEN NOW2=0 MES=STRCAT(MM,'月',DD,'日 (',SUN(3,DDIV),'〜',SUN(3,DDIV2),')',CR) MES=STRCAT(MES,'日の出:',SUN(4,DDIV),':',SUN(5,DDIV),'頃、日の入:',SUN(6,DDIV),':',SUN(7,DDIV),'頃',CR,CR) MES=STRCAT(MES,'現在時刻:',H2,'時',M2,'分',CR,CR) LTK=LEFT(TOKI(NOW),2):RTK=RIGHT(TOKI(NOW),2) MES=STRCAT(MES,KAZOE(NOW),' … ',LTK,':',RTK,'〜') LTK=LEFT(TOKI(NOW2),2):RTK=RIGHT(TOKI(NOW2),2) MES=STRCAT(MES,LTK,':',RTK,'',CR) H3=H2+1 IF H3>=24 THEN H3=0 N=INT(H3/2) IFBLK (H3%2=0)*(M2<30) KAZ='一ツ' ELSEIF (H3%2=0)*(M2>=30) KAZ='二ツ' ELSEIF (H3%2=1)*(M2<30) KAZ='三ツ' ELSEIF (H3%2=1)*(M2>=30) KAZ='四ツ' ENDIF IF M2<30 THEN M3=STRCAT(H2,':00〜',H3,':30') ELSE M3=STRCAT(H2,':30〜',H3,':00') MES=STRCAT(MES,'(',JUUNISI(N),KAZ,' … ',M3,')',CR,'※ 十二支の"とき"は、23時から「子」',CR,'  が始まるものとして、定時法で算出') MESSAGE MES RETURN *DEBMES IF DEBUG=0 THEN RETURN MES='' FOR TMP=0 TO 23 MES=STRCAT(MES,TOKI(TMP),'-') NEXT MES=STRCAT(MES,'HIRU=',HIRU,CR,'HIRUTOKI=',HIRUTOKI) MES=STRCAT(MES,'YORU=',YORU,CR,'YORUTOKI=',YORUTOKI) MESSAGE MES RETURN