簡易テキストエディタ for プチコン
コンソールとMEMの研究を兼ねて、簡易テキストエディタを作成した。
今回から、ソース変更時にすぐ保存できるようにするため、ソースの先頭に自分自身を保存するKEY定義を入れるようにした。
これで、ソースを変更したら、ファンクション3一発でセーブできる。
↓簡易テキストエディタの画面
MEM$を保存に使っている関係上、256バイトまでしか使えない仕様。
面倒なので、かなり直接数字を打ったコードとなっている。
ソースリスト:
KEY 3,"SAVE"+CHR$(34)+"TEDIT" 'PRG:TEDIT '┏━━━━━━┓ '┃ テキストエディタ ┃ '┗━━━━━━┛ '256バイトマデノテキストヲヘンシュウ 'ヘンスウヒョウ 'FN$ ゲンザイヘンシュウチュウノファイルメイ 'S X,Yノイチニアルモジコードヲホジ 'C カーソル 0^CBテントウ CB^CB*2ショウトウ 'X,Y カーソルイチ 'VX,VY カーソルイドウリョウ 'リストボックス ライブラリ ヨウ 'LST$() リスト 'LST リストギョウスウ 'WINX,WINY ウィンドウ ヒダリウエイチ 'WINW ウィンドウ ハバ CLEAR @DECLARE CB=5:'カーソルノブリンクソクド SF=5:'フレームマチジカン DIM LST$(21):'リスト FN$="" @INIT CLS:SPCLR:GCLS LOCATE 0,0 ?"テキストエディタ V0.10" LOCATE 0,1 ?"━━━━━━━━━╋━━━━━━━━━╋━━━━━━━━━╋━━"; LOCATE 0,10 ?"━━━━━━━━━╋━━━━━━━━━╋━━━━━━━━━╋━━"; LOCATE 0,11 ?"Y:BS L+Y:DEL X:INS" GOSUB @FNDISP DIM T$(256) X=0:Y=2:S=0:C=0 GOSUB @MEM2SCR S=CHKCHR(X,Y) VSYNC 10 @LOOPMAIN GOSUB @TINPUT GOSUB @CURINP GOSUB @CURDISP GOSUB @EDITCOM IF B AND 16 GOTO @FILEMODE VSYNC SF GOTO @LOOPMAIN @EXIT LOCATE 0,14 END @TINPUT K$=INKEY$() IF K$=="" GOTO @TINPUTX LOCATE X,Y:?K$; X=X+1 IF X>31 THEN X=0:Y=Y+1 IF Y>9 THEN X=31:Y=9 S=CHKCHR(X,Y) @TINPUTX RETURN @CURINP VX=0:VY=0 B=BUTTON() IF B AND 1 THEN VY=-1 IF B AND 2 THEN VY=1 IF B AND 4 THEN VX=-1 IF B AND 8 THEN VX=1 GOSUB @CURMOVE RETURN @CURMOVE IF VX==0 AND VY==0 GOTO @CURMOVEX LOCATE X,Y:?CHR$(S) X=X+VX:Y=Y+VY GOSUB @XYCHK S=CHKCHR(X,Y) C=0 @CURMOVEX RETURN @XYCHK IF X<0 AND Y<=2 THEN X=0 IF X<0 THEN X=31:Y=Y-1 IF X>31 AND Y>=9 THEN X=31 IF X>31 THEN X=0:Y=Y+1 IF Y>9 THEN Y=9 IF Y<2 THEN Y=2 RETURN @CURDISP LOCATE X,Y ?MID$("■"+CHR$(S),C>CB,1); C=C+1:IF C>=CB*2 THEN C=0 RETURN @EDITCOM ED=-1 IF B AND 128 THEN ED=0 IF (B AND 384)==384 THEN ED=1 IF B AND 64 THEN ED=2 ON ED GOSUB @BS,@DEL,@INS RETURN @BS VX=-1:GOSUB @CURMOVE GOSUB @DEL S=CHKCHR(X,Y) GOSUB @CURDISP RETURN @DEL LOCATE X,Y:?" " T=X+(Y-2)*32 FOR I=T TO 255 U=CHKCHR((I+1)%32,FLOOR((I+1)/32)+2) LOCATE I%32,FLOOR(I/32)+2 ?CHR$(U) NEXT LOCATE 31,9:?" "; RETURN @INS LOCATE X,Y:?CHR$(S) T=X+(Y-2)*32 FOR I=255 TO T+1 STEP -1 U=CHKCHR((I-1)%32,FLOOR((I-1)/32)+2) LOCATE I%32,FLOOR(I/32)+2 ?CHR$(U) NEXT LOCATE X,Y:?" "; S=CHKCHR(X,Y) RETURN @SCR2MEM MEM$="" FOR I=2 TO 9 FOR J=0 TO 31 MEM$=MEM$+CHR$(CHKCHR(J,I)) NEXT NEXT RETURN @MEM2SCR FOR I=0 TO 255 LOCATE I%32,FLOOR(I/32)+2 ?MID$(MEM$,I,1); NEXT RETURN '---------- ' ファイルモード '---------- @FILEMODE LST$(0)="SAVE" LST$(1)="LOAD" LST$(2)="CLEAR" LST$(3)="EXIT" LST=3 WINX=11:WINY=:WINW=6 LOCATE X,Y:?CHR$(S) GOSUB @SCR2MEM GOSUB @L_LSTBOX GOSUB @MEM2SCR ON RES GOTO @FSAVE,@FLOAD,@FCLEAR,@EXIT GOTO @LOOPMAIN @FSAVE GOSUB @FNCLR LOCATE 0,14:?FN$ LOCATE 0,13:INPUT "SAVE ファイルメイ";F$ IF F$=="" GOTO @FSAVEX GOSUB @SCR2MEM FN$=F$ SAVE"MEM:"+FN$ @FSAVEX GOSUB @FNDISP GOTO @LOOPMAIN @FLOAD GOSUB @FNCLR LOCATE 0,14:?FN$ LOCATE 0,13:INPUT "LOAD ファイルメイ";F$ IF F$=="" GOTO @FLOADX FN$=F$ LOAD"MEM:"+FN$ GOSUB @MEM2SCR S=CHKCHR(X,Y) @FLOADX GOSUB @FNDISP GOTO @LOOPMAIN @FCLEAR FOR I=2 TO 9 LOCATE 0,I FOR J=0 TO 31:?CHR$(0);:NEXT NEXT S=CHKCHR(X,Y) GOTO @LOOPMAIN @FNCLR LOCATE 0,13 FOR I=0 TO 63:?CHR(0);:NEXT RETURN @FNDISP GOSUB @FNCLR LOCATE 0,13:?"ファイルメイ: ";FN$ RETURN '+++++++++++++++++++ '+ リストボックス ライブラリ + '+++++++++++++++++++ 'ヒキスウ: ' LST$() リスト ' LST リストギョウスウ ' WINX,WINY ウィンドウ ヒダリウエイチ ' WINW ウィンドウ ハバ 'モドリチ: ' RES センタクケッカ(ミセンタク=-1) @L_LSTBOX LBY=0:RES=-1 IF LST>21 THEN LST=21 GOSUB @WINDISP:'ワクヲカク GOSUB @TXTDISP:'リストヒョウジ GOSUB @WAITBTN:'ABヲハナスマデマツ @LOOPLB LOCATE WINX+1,WINY+1+LBY:?" "; B=BUTTON() AND 3 LBY=LBY-(B==1)*(LBY>0)+(B==2)*(LBY<LST) LOCATE WINX+1,WINY+1+LBY:?"→"; B=BUTTON() IF B AND 16 GOTO @SELECTLB IF B AND 32 GOTO @EXITLB VSYNC 5 GOTO @LOOPLB @SELECTLB RES=LBY @EXITLB GOSUB @WINCLR RETURN @WAITBTN IF BUTTON() AND 48 GOTO @WAITBTN RETURN @WINDISP LOCATE WINX,WINY ?"┏";:FOR J=1 TO WINW:?"━";:NEXT:?"┓"; FOR I=1 TO LST+1 LOCATE WINX,WINY+I ?"┃";:FOR J=1 TO WINW:?" ";:NEXT:?"┃"; NEXT LOCATE WINX,WINY+I ?"┗";:FOR J=1 TO WINW:?"━";:NEXT:?"┛"; RETURN @WINCLR FOR I=0 TO LST+2 LOCATE WINX,WINY+I FOR J=0 TO WINW+1:?" ";:NEXT NEXT RETURN @TXTDISP FOR I=0 TO LST LOCATE WINX+2,WINY+1+I ?LST$(I); NEXT RETURN
コードが長くなってくると、PCに打ち込むのが疲れる。
なんとかならないものか...。