A=SYSBEEP SYSBEEP=0 LOAD "(ファイル名)",0 SYSBEEP=A |
MEM$="" FOR I=1 TO 5 MEM$=MEM$+STR$ (H(I)) NEXT SAVE "MEM:HISCORE" |
MEM$="" FOR I=1 TO 5 MEM$=MEM$+RIGHT$ ("0000"+STR$ (H(I)),5) NEXT SAVE "MEM:HISCORE" |
LOAD "MEM:HISCORE" FOR I=1 TO 5 H(I)=VAL (MID$ (MEM$,I*5-5,5)) NEXT |
◎MEM$で数値をセーブする方法についてのまとめ
|
MEM$="" FOR I=1 TO 5 MEM$=MEM$+STR$ (H(I))+"/" NEXT SAVE "MEM:HISCORE" |
LOAD "MEM:HISCORE" A=-1 FOR I=1 TO 5 B=A+1 A=INSTR (B,MEM$,"/") H(I)=VAL (MID$ (MEM$,B,A-B)) NEXT |
MEM$="" FOR I=0 TO 9 MEM$=MEM$+CHR$ (P(I)) NEXT SAVE "MEM:SAVEDATA" |
LOAD "MEM:SAVEDATA" FOR I=0 TO 9 P(I)=ASC (MID$ (MEM$,I,1)) NEXT |
◎基本的な記録方法
プチコンは初代においてはグラフィック面が2面、mkIIにおいてはグラフィック面が4面使用できます。この中から使用していないグラフィック面にデータを記録することでグラフィック面(GRP:)経由でセーブを行うというものです。
プチコンのグラフィック面は256x192ドット256色で構成されています。1ドットには1バイト分の情報を入れることが可能になるため256x192バイト(=49152バイト=48KB)のデータを保存可能になります。そのため最大256文字(256バイト)となっているMEM$では一度に保存できる容量が小さすぎるという場合に有効活用できます。
グラフィック面に記録するためにはGPSETを使います。読み出しはGSPOITでできます。上記MEM$を使ったセーブ方法の冒頭部分で書いたように変数の内容はCLEARで消去されるのと同様にグラフィック面の情報もGCLSによってGPAGEで指定されたグラフィック面の情報は消去されてしまいます。mkIIに搭載されているACLS命令を使えばGPAGE 0、1両方のグラフィック面の情報が消去されます。(ページ2、3に関してのみACLSでは消去されない)
したがって、(ページ1のグラフィック面を保存する場合には)SAVE "GRP1:(ファイル名)"のようにグラフィック面の情報をセーブする必要があります。
具体的なセーブ、ロードの方法を書いていきます。
H(0)〜H(99)に1位から100位までのスコアが記録されているという場合には下記のようになります。(※セーブやロード後にGPAGE命令によって使用するGPAGE 0として使用するグラフィック面を元に戻すのを忘れないようにしてください。あと以下のサンプルはすべてそのままでも動作しますが、事前にGPAGE 1:GCLSをしているとセーブデータ公開時にQRコードの枚数を減らせるのでオススメです。)
《 リスト8 》 セーブ
GPAGE 1 FOR I=0 TO 99 A=H(I)/256 B=H(I)%256 GPSET I*2,0,A GPSET I*2+1,0,B NEXT SAVE "GRP1:SAVEDATA" |
GPAGE 1 LOAD "GRP1:SAVEDATA" FOR I=0 TO 99 A=GSPOIT (I*2,0) B=GSPOIT (I*2+1,0) H(I)=A*256+B NEXT |
GPAGE 1 FOR I=0 TO 999 A=H(I)/256 B=H(I)%256 GPSET (I*2)%256,I/128,A GPSET (I*2+1)%256,I/128,0,B NEXT SAVE "GRP1:SAVEDATA" |
GPAGE 1 LOAD "GRP1:SAVEDATA" FOR I=0 TO 999 A=GSPOIT ((I*2)%256,I/128) B=GSPOIT ((I*2+1)%256,I/128) H(I)=A*256+B NEXT |
GPAGE 1 A=0 FOR I=0 TO 99 FOR J=0 TO LEN (M$(I))-1 B=ASC (MID$ (M$(I),J,1)) GPSET A%256,A/256,B A=A+1 NEXT GPSET A%256,A/256,&H0D A=A+1 NEXT SAVE "GRP1:SAVEDATA" |
GPAGE 1 A=0 LOAD "GRP1:SAVEDATA" FOR I=0 TO 99 M$(I)="" @LOOP B=GSPOIT (A%256,A/256) A=A+1 IF B!=&H0D THEN M$(I)=M$(I)+CHR$ (B):GOTO @LOOP NEXT |
@RPREC GPAGE 1 GPSET 0,0,A/256 GPSET 1,0,A%256 GPSET A%256,A/256,B%256 A=A+1 GPAGE 0 RETURN |
@RPPLAY GPAGE 1 IF A>GSPOIT (0,0)*256+GSPOIT (1,0)THEN @RPEND B=GSPOIT (A%256,A/256) A=A+1 @RPEND GPAGE 0 RETURN |
@RPREC GPAGE 1,3,1 GPSET 0,0,_A/256 GPSET 1,0,_A%256 GPSET _A%256,_A/256,B%256 _A=_A+1 GPAGE 0 RETURN @RPPLAY GPAGE 1,3,1 IF _A>GSPOIT (0,0)*256+GSPOIT (1,0)THEN @RPEND B=GSPOIT (_A%256,_A/256) _A=_A+1 @RPEND GPAGE 0 RETURN |
《 「JUMPING ISLAND」のリプレイ記録・再生 改造方法 》 4行 ACLSをCLS:SPCLR:VISIBLE ,,,,1,1に変える 29行の末尾に_A=2を加える リプレイ記録時 41行のB=BUTTON()の直後にGOSUB @RPRECを加える リプレイ再生時 41行のB=BUTTON()の直後にGOSUB @RPPLAYを加える ※リプレイ記録を行っても処理落ちはしないので常時リプレイ記録状態にしても問題ありません。 再生する必要がある場合のみ再生用に変更すると良いです。 |
@RPREC GPAGE 1,3,1 IF !T THEN TX=255:TY=255 GPSET 0,0,_A/256 GPSET 1,0,_A%256 GPSET _A%256,_A/256,B%256 GPSET (_A+1)%256,(_A+1)/256,TX GPSET (_A+2)%256,(_A+2)/256,TY _A=_A+3 GPAGE 0 RETURN @RPPLAY GPAGE 1,3,1 IF _A>GSPOIT (0,0)*256+GSPOIT (1,0)THEN @RPEND B =GSPOIT (_A%256,_A/256) TX=GSPOIT ((_A+1)%256,(_A+1)/256) TY=GSPOIT ((_A+2)%256,(_A+2)/256) _A=_A+3 T=(TX+TY<510) @RPEND GPAGE 0 RETURN |