読者です 読者をやめる 読者になる 読者になる

プチコンで遊ぼう! (はてなブログ版)

任天堂3DSのプチコンで遊ぼう! [twitter:@eida_s]

はてなダイアリーから移行しました。 はてなダイアリーのURLを開いても自動的にこちらにリダイレクトされますのでご了承ください。

簡易テキストエディタ 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に打ち込むのが疲れる。
なんとかならないものか...。