上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
--.--.-- -- l スポンサー広告 l top
最近少し早く帰れるようになったので趣味の方のプログラムがはかどります。

ichigojamマシン語活用でわかってきたことを応用して、汎用的に使えるマシン語3Dルーチンを作ってみました。

BASIC領域をあまり消費せずに高速で3D風表示ができますので、シューティングゲーム等にも使えると思います。
実は昔のPC8001用3Dゲーム「OLION」というのを意識して作ってみました。

あまりメジャーじゃなかった感じだし、正直やってみてあまり面白くはなかった(^^; ような記憶ですが、
最初に画面を見た時の「おお3Dだ!」という感動だけは覚えています。

■概要
  18個までの文字をX,Y,Z座標指定で3D空間に配置してコールすることで文字を2D変換して表示できます。
  以下のような表示ができます。




■使い方
  下の「マシン語書き込みプログラム」を実行します。これにより、#700-#82Fの空間にルーチンが格納されます。
  配列変数[24]-[99]に配列4個一文字で文字コードとX,Y,Z座標を
   [24] = 文字コードです。ichigojamの固定キャラクタ番号を#01-#FFで指定します。
       #00で指定するとその文字および以下XYZは無視されます。
   [25] = x座標を -32~+32で入れます。
   [26] = Y座標を -32~+32で入れます。
   [27] = Z座標を 0~100くらいで入れます。0が最遠で数字が大きいほど近くなります。
   以下同様に[24+N*4]~[24+N*4+3]に表示したい文字情報を入れます。
    (Nは0以上18以下です。これで配列[100]までを使い切ります。)
   
   その後CLSで画面消去したのちにA=USR(#700,0)でコールすると各文字を3D-2D変換して表示します。

■制限
  プログラムのお尻が配列領域まではみ出しています。このため配列[0]~[23]は使用・書き換え禁止です。
  書き換えてコールすると暴走します。CLVも使用できません。

■マシン語書き込みプログラム
  以下をロードして実行します。


1 poke#700,240,181,144,32,70,76,143,176,0,1,12,146,8,24,131,34,12,25,18,1,5,144,9,148,139,24,25,136,157,136,201,4,9,12,90,136,6,149,216,136,0,41,7,209,9
2 poke#72d,159,8,51,187,66,242,209,15,176,240,188,2,188,8,71,0,4,18,4,0,20,18,20,4,50,132,70,96,70,80,67,53,78,10,144,8,34,72,28,12,156,9,4,9,20
3 poke#75a,97,92,6,157,0,4,0,12,1,144,3,145,48,4,41,4,9,20,0,20,64,24,7,28,96,70,120,67,64,17,4,4,36,12,33,28,23,49,9,4,9,12,2,145,1
4 poke#787,33,140,67,200,37,36,5,109,4,100,25,103,70,1,64,36,12,127,66,73,0,7,148,11,151,10,152,8,145,8,33,68,17,37,28,31,53,45,4,45,12,62,45,33,216
5 poke#7b4,2,157,46,45,30,216,37,4,7,159,45,20,109,16,125,25,45,4,5,159,45,20,125,25,0,149,45,120,4,149,4,159,112,37,47,66,14,209,3,157,1,39,61,64,60
6 poke#7e1,64,8,159,60,67,165,64,128,39,44,28,127,66,4,157,60,67,0,159,44,67,60,112,3,156,1,57,11,157,100,8,9,4,3,148,9,12,64,25,0,41,204,209,113,28
7 poke#80e,1,58,14,4,18,4,54,12,18,12,0,209,135,231,1,153,152,231,200,8,0,0,252,255,0,0


■サンプルソフト
  動きは動画でご確認ください。



10 CLS
20 FORI=6TO24:J=I*4:[J]=0:[J+1]=I*6-50:[J+2]=I*2-20:[J+3]=0:NEXT
30 [24]=#49:[28]=#63:[32]=#68:[36]=#69:[40]=#67:[44]=#6F:[48]=#6A:[52]=#61:[56]=#6D
40 T=50:GOSUB1000
50 FORI=6TO24:J=I*4:[J]=0:NEXT
60 [24]=#33:[25]=10:[26]=5:[27]=10:[28]=#44:[29]=16:[30]=5:[31]=10
70 [32]=#33:[33]=-16:[34]=-5:[35]=40:[36]=#44:[37]=-10:[38]=-5:[39]=40
75 [40]=#33:[41]=-16:[42]=10:[43]=0:[44]=#44:[45]=-10:[46]=10:[47]=0
80 T=100:GOSUB 1000
90 FORI=6TO24:J=I*4:[J]=0:NEXT
100 FORI=6TO10:J=I*4:[J]=#FF:[J+1]=RND(32)-16:[J+2]=RND(32)-16:[J+3]=RND(10)*4:NEXT
110 T=200:GOSUB 1000
200 FORI=6TO24:J=I*4:[J]=0:NEXT
210 FORI=6TO10:J=I*4:[J]=#F1:[J+1]=RND(32)-16:[J+2]=RND(32)-16:[J+3]=RND(10)*4:NEXT
220 T=200:GOSUB 1000
230 GOTO 20
1000 FORI=0TO T
1010 FORJ=0TO9:K=J*4+24:[K+3]=[K+3]+1
1012 IF [K]=#F1 [K+1]=[K+1]+RND(3)-1
1015 IF[K+3]>60 [K+3]=0
1016 NEXT
1020 CLS
1030 A=USR(#700,0)
1050 NEXT
1060 RTN


■3Dルーチンソースコード
  以下をコンパイルしてマシン語書き込みプログラムを生成しています。
  何やってるのかできるだけわかるようにコメントつけました。

  できれば#700~#7FFに収めようと努力したのですができませんでした。
  範囲チェックを外せば入るのですが、暴走が恐ろしくてできません。


2016/06/29PM8追記:1行目の#includeの次は全角の<>で挟まれていますが、
         半角の<と>に置き換えてください。
         FC2ブログは半角の<と>で挟まれているとおかしな文字化けをするみたいです。
2016/06/30AM6追記:ソースコード誤り訂正。
    誤:#define WORK_ADR 0x0830 → 正:#define WORK_ADR 0x0800



#include <stdint.h>
#define VRAM_ADR 0x0900
#define WORK_ADR 0x0800

uint16_t stars(uint16_t c, uint8_t* m_p, uint8_t* f_p)
{
int16_t x,y,z,w,ca,x0,y0,x1,y1,i;
uint8_t c0,c1;
//********** 実アドレスゲット *********
int16_t* w_p = m_p + WORK_ADR; //******** 変数領域
uint8_t* v_p = m_p + VRAM_ADR; //******** VRAM領域

i = 24;
while(i<100) { //**** 文字数分LOOP
//******************** ca:キャラクタデータアドレス, X,Y,Z:3次元座標 *******************
ca = w_p[i++]*8; x = w_p[i++]; y = w_p[i++]; z =w_p[i++];
//********************* 一文字 8x8 DOT表示ループ **********************************************
if (ca !=0) { //***** キャラクタ00の場合は何もしない
for (y0=-4;y0<4;y0++) { //*** キャラクタ縦8行分LOOP **********************
c0 = f_p[ca++]; //*** キャラクタデータ1行分を取り出す**************
for (x0=-4;x0<4;x0++) { //*** キャラクタ横8桁分LOOP **********************
x1 =((x-x0)*z)>>5; //*** X座標を3D-2D変換
y1 = ((y+y0)*z)>>5; //*** Y座標を3D-2D変換
w=((y1&0xfffe) <<4) + (x1>>1) + 384+16; //*** 変換した座標に対応するVRAMアドレス計算
c1= ( (c0&1) <<( ( ( x1&1) | (y1&1)<<1) ) ) | 0x80; //*********** セミグラフィックキャラ計算
//**** VRAM領域内で空白またはセミグラフィックキャラなら書き込み
if ((x1>-32)&&(x1<32)&&(y1>-24)&&(y1<24)&&((v_p[w]&0x70)==0) ) {v_p[w] |= c1;}
c0 >>= 1; //***** 次のPIXELを計算
}
}
}
}
}




それではまたです。
2016.06.28 Tue l ICHIGOJAM l コメント (0) l top

コメント

コメントの投稿












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