上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
--.--.-- -- l スポンサー広告 l top
昨日のソフトでXY座標をキー入力で制御する方法を思いついたので、早速導入してみました。

今日のソースは以下の通りです。昨日は普通に引数cの値によってX,Yを増減し、0または63(Yは0または31)で反対側に折り返す、というコードにしていたのですが、それではメモリが足りず悩んでいたところでした。
以下の方法でなんとかPCG領域の256byteにおさまるようになりました。

  ・X,Yの増減を配列変数で引き渡す。
  ・固定値-5を必ず引くことでX,Y増減値はを正の数で良しとする。
    (例えば10と入れると+5、0、5といれると0、と入れると‐5になります。)
  ・増減後にXは0x3f、Yは0x1fとのANDをとることで折り返し演算を簡単にする。

#include
#define VRAM_ADR 0x900
#define WORK_ADR 0x800

uint16_t stars(uint16_t c, uint8_t* m_p, uint8_t* f_p)
{
int16_t x,y,v,w,z,x0,y0,z0,i,j,k;
uint8_t* w_p = m_p + WORK_ADR;
uint8_t* v_p = m_p + VRAM_ADR;

//***** ERASE/MOVE/DISP STARS ************
for (i=0;i<19;i++) {
j=i*3;
x=w_p[j];y=w_p[j+1];z0=w_p[j+2];
x0=( (z0*(x-32)) >> 5)+32;
y0=( (z0*(y-16)) >> 5) + 20;
w=(y0/2)*32+(x0/2);
z= 1 <<( (x0&1)+((y0&1)<<1)) ;
k= v_p[w] | 0x80;
if ( (v_p[w]&0x70) ==0x00 ) {
if (c==1) {
v_p [w]= k & (0x8f - z) ;
}
if (c==2) {
v_p [w]= k | z ;
}
}
if (c>=3) {
z0+=3;if (z0>32) {z0=10;}
x=x+ w_p[90] - 5;
y=y+ w_p[91] - 5;
w_p[j] = x & 0x3f;
w_p[j+1] = y & 0x1f;
w_p[j+2] = z0;
}
}
return 0;
}


これによるマシン語プログラムは以下の通りです。
IJBIN2POKEの行番号を1、行ステップを1、1行当たり数を45に設定してぎりぎり1024バイトに収まるコードができました。

1 poke#700,#f0,#b5,#90,#22,#35,#4d,#12,#01,#87,#b0,#8a,#18,#80,#24,#4d,#19,#24,#01,#04,#92,#05,#95,#0b,#19,#1e,#78,#9a,#78,#5f,#78,#34,#1c,#00,#92,#20,#3c,#54,#43,#00,#9d,#3a,#1c,#10,#3a,#6a
2 poke#72d,#43,#52,#11,#14,#32,#12,#04,#64,#11,#12,#0c,#20,#34,#15,#04,#2d,#14,#24,#04,#03,#97,#24,#0c,#ef,#0f,#7f,#19,#25,#04,#7f,#10,#2d,#14,#02,#96,#7e,#01,#ef,#0f,#bc,#46,#65,#44,#6d,#10
3 poke#75a,#75,#19,#2d,#04,#04,#9e,#2d,#14,#75,#19,#2f,#78,#70,#26,#bc,#46,#37,#42,#14,#d1,#01,#27,#3a,#40,#ba,#40,#3c,#40,#a4,#18,#a7,#40,#62,#46,#80,#24,#14,#43,#01,#28,#04,#d1,#71,#22,#52
4 poke#787,#42,#d7,#1b,#3c,#40,#02,#e0,#02,#28,#02,#d1,#3c,#43,#2c,#70,#17,#e0,#02,#28,#15,#d9,#00,#9e,#03,#36,#20,#2e,#00,#dd,#0a,#26,#0e,#4a,#8a,#5c,#03,#9c,#05,#3a,#a2,#18,#0c,#4c,#0c,#5d
5 poke#7b4,#02,#9d,#05,#3c,#2c,#19,#3f,#25,#2c,#40,#1c,#70,#1f,#24,#22,#40,#5a,#70,#9e,#70,#05,#9e,#03,#33,#b3,#42,#a3,#d1,#00,#20,#07,#b0,#f0,#bc,#02,#bc,#08,#47,#c0,#46,#39,#08,#00,#00,#5b
6 poke#7e1,#08,#00,#00,#5a,#08,#00,#00


そしてスターラスターもどき。


動きは動画でどうぞ。


「スポンサードリンク」

style="display:block"
data-ad-client="ca-pub-0620260288102702"
data-ad-slot="9773401572"
data-ad-format="auto">



メインプログラムは以下の通りです。ほぼ1KB使いきりです。

2016/6/21 下のコードはichigojamの特殊キャラクタが文字化けしています。
お使いになる方は、このZIPファイルをダウンロード、解凍してできたmain20160621.txtをIJUtilities等のソフトでichigojamに転送してください。



5 CLV
10 CLS
20 FORI=0TO11:LC1+I,3+I:?CHR$(26):LC30-I,3+I:?CHR$(25):NEXT
30 LC11,15:?""
32 FORI=16TO21:LC11,I:?" ":NEXT
34 LC11,22:?"
5 LC15,18:?""
36 FORI=0TO2:LC2+I*3,18-I:?"===";:LC21+I*3,16+I:?"===";:NEXT
40 LC16,11:?"+"
100 X=16:Y=11:FORI=0TO29
120 POKE#800+I*3,RND(64),RND(32),10+RND(30)
130 NEXT
132 IFV=0GOSUB1000:V=1
135 POKE#800+90,5,5
200 A=USR(#700,1)
210 A=USR(#700,3)
220 A=USR(#700,2)
223 POKE#800+90,5,5
224 K=INKEY():IF K=32 GOTO 500
225 LCX,Y:?" ";:IF K=0:X=16:Y=11
226 IF K=28 Y=11:X=15:LCX,Y:POKE#800+90,10,5
227 IF K=29 Y=11:X=17:POKE#800+90,0,5
228 IF K=31 Y=12:X=16:POKE#800+90,5,0
229 IF K=30 Y=10:X=16:POKE#800+90,5,10
230 LCX,Y:?"+";:WAIT5
240 GOTO200
500 I=0
520 A=USR(#700,3)
530 A=USR(#700,2)
536 IF (I%8)=0 THEN FORJ=0TO19:POKE#800+J*3,RND(64),RND(32),10+RND(30):NEXT
540 I=I+1:IFI<100GOTO520
550 GOTO10
1000 PLAY"T300O4G8R8D8D2R8D4O5C4O4B4A8B8A8B8A2R4"
1005 IF SOUND()=1 GOTO 1005
1010 PLAY"T300O4G8R8D8D2R8D4O5C4O4B4A8B8A8B8O5C2R8C8.C8.C8.D2."
1020 RTN


メモリ制約回避は中々頭の体操になります。
2016.06.20 Mon l ICHIGOJAM l コメント (1) l top

コメント

No title
いまスマホで見てたら、メインプログラムの特殊キャラが消えてますね。
またfc2の文字化けでしょうか?

明日か明後日圧縮ファイルで再アップします。

2016.06.21 Tue l 見習職人. URL l 編集

コメントの投稿












上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。