home *** CD-ROM | disk | FTP | other *** search
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <XSP2lib.H>
- #include <pcm8afnc.h>
- #include <sys/dos.h>
- #include <sys/iocs.h>
- #include "expl.h"
- #include "fxsp2lib.h"
-
-
- #define PCG_MAX 1024 /* スプライトPCGパターン最大使用数 */
- #define REF_MAX 1024 /* 複合スプライトリファレンスデータ最大使用数 */
- #define FRM_MAX 1024 /* 複合スプライトフレームデータ最大使用数 */
- #define RGB(r,g,b) ((g)<<11|(r)<<6|(b)<<1)
-
- static char pcg_alt[PCG_MAX + 1]; /* PCG配置管理テーブル */
- static char pcg_dat[PCG_MAX * 128]; /* PCGデータファイル読み込みバッファ */
- static XOBJ_FRM_DAT frm_dat[FRM_MAX]; /* フレームデータ */
- static XOBJ_REF_DAT ref_dat[REF_MAX]; /* リファレンスデータ */
- static int old_crtmod;
-
- extern int bomb_init0 (void);
- extern void bomb_move (void);
- extern void bomb_tini (void);
-
- extern int seq_init0 (void);
- extern void seq_init (void);
- extern void seq_move (void);
- extern void seq_tini (void);
-
- extern unsigned char seq_counter;
- int s_option = 0;
- unsigned char n_option = 0;
-
-
- void usage (void)
- {
- printf ("爆発パターン表示&作成 expl.x ver0.02\n"
- " programmed by Mitsuky <FreeSoftware>\n"
- "[option]\n"
- " -S数値 : 乱数のシードを指定\n"
- " -N : .obj ファイルを生成しない\n"
- );
- }
-
- /* 起動時のファイル読み込み */
- /* 読み込みに失敗した場合はいきなり終了するので注意 */
- int load_file (char *fname, void *ptr, size_t size, size_t n)
- {
- FILE *fp;
- int i;
-
- if ((fp = fopen (fname, "rb")) == NULL) {
- //fatal_error (ERROR_FILE, fname);
- }
- i = fread (ptr, size, n, fp);
- fclose (fp);
-
- return (i); /* 返り値は読み込みバイト数 */
- }
-
-
- void wait_vdisp (void)
- {
- int sp;
- sp = _iocs_b_super (0);
- while ((*(volatile unsigned char *) 0xe88001) & 0x10 == 0);
- while ((*(volatile unsigned char *) 0xe88001) & 0x10);
- _iocs_b_super (sp);
- }
-
-
-
- void init (void)
- {
- int i, sp;
- unsigned short *s, *d;
- unsigned short pal_dat[16 * 15]; /* パレットデータファイル読み込みバッファ */
- int sizeof_ref; /* 複合スプライトリファレンスデータ読み込み数 */
- unsigned short crtcdata[9] =
- {69, 6, 11 + 8, 59 - 8, 567, 5, 40, 552, 785};
- unsigned short textpalet[16] =
- {0, RGB (16, 16, 20), RGB (12, 12, 20), RGB (28, 28, 31), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
-
- old_crtmod = _iocs_crtmod (-1);
- _iocs_b_curoff ();
- wait_vdisp ();
- _iocs_crtmod (14); /* 256*256dot 31kHz 65536色 */
- _iocs_g_clr_on ();
- _iocs_b_curoff ();
- _iocs_ms_curof ();
- _iocs_skey_mod (0, 0, 0);
-
- //sp = _iocs_b_super (0);
- //*(unsigned short *) 0xe82600 &= 0xff80; /* 画面表示全オフ */
- //_iocs_b_super (sp);
-
-
- _iocs_sp_init ();
- _iocs_sp_on (); /* スプライト表示をON */
- _iocs_bgctrlst (0, 0, 0); /* BG0表示OFF */
- _iocs_bgctrlst (1, 1, 0); /* BG1表示OFF */
-
-
- /* 256x256 正方形モードを作る */
- sp = _iocs_b_super (0);
- *(unsigned short *) 0xe80028 = crtcdata[8];
- d = (unsigned short *) 0xe80002;
- for (i = 1; i < 8; i++)
- *d++ = crtcdata[i];
- *(unsigned short *) 0xe80000 = crtcdata[0];
-
- *(unsigned short *) 0xe8e006 |= 0b10; /* HRL ビット */
- *(unsigned short *) 0xeb080c = crtcdata[2] + 4;
- *(unsigned short *) 0xeb080a = crtcdata[0]; /* スプライト */
- *(unsigned short *) 0xeb080e = crtcdata[6];
-
- *(unsigned short *) 0xe82500 = 0b01001001001110; /* 優先順位 TX>SP>GR */
- _iocs_b_super (sp);
-
- load_file ("BOM.SP", pcg_dat, sizeof (char), 128 * PCG_MAX);
- #if 0
- load_file ("obj.xsp", pcg_dat + 256 * 128, sizeof (char), 128 * PCG_MAX);
- load_file ("obj.frm", frm_dat, sizeof (XOBJ_FRM_DAT), FRM_MAX);
- sizeof_ref = load_file ("obj.ref", ref_dat, sizeof (XOBJ_REF_DAT), REF_MAX);
- #endif
- load_file ("BOM01.PAL", pal_dat, 2, 16);
-
- #if 0
- /* FRM_DAT[].pt 補正 */
- for (i = 0; i < 256; i++)
- (short) frm_dat[i].pt += 256;
-
- /* REF_DAT[].ptr 補正 */
- for (i = 0; i < sizeof_ref; i++)
- (int) ref_dat[i].ptr += (int) (&frm_dat[0]);
- #endif
-
- /* パレットに転送 */
- sp = _iocs_b_super (0);
- s = (unsigned short *) 0xe82200;
- for (i = 0; i < 16; i++)
- *s++ = textpalet[i];
- d = pal_dat;
- for (i = 0; i < 15 * 16; i++)
- *s++ = *d++;
- _iocs_b_super (sp);
-
- {
- struct _lineptr lp;
- lp.x1 = 0;
- lp.y1 = 128;
- lp.x2 = 255;
- lp.y2 = 128;
- lp.color = 0xf800;
- lp.linestyle = 0xaaaa;
- _iocs_line (&lp);
- lp.x1 = 128;
- lp.y1 = 0;
- lp.x2 = 128;
- lp.y2 = 255;
- _iocs_line (&lp);
- }
-
- seq_init0 ();
- bomb_init0 ();
- #if 0
- enemy_init0 ();
- #endif
- _dos_breakck (2); /* BREAK チェックを殺す */
-
- xsp_on ();
- fxsp_on ();
- xsp_mode (2);
- xsp_pcgdat_set (pcg_dat, pcg_alt, sizeof (pcg_alt));
- xsp_objdat_set (ref_dat);
- pcm8a_vsyncint_on ();
-
- //sp = _iocs_b_super (0);
- //*(unsigned short *) 0xe82600 |= 0x007f; /* 画面表示オン */
- //_iocs_b_super (sp);
- }
-
-
- int tini (void)
- {
- int sp;
-
- pcm8a_vsyncint_off ();
- xsp_off ();
- fxsp_off ();
-
- bomb_tini ();
- wait_vdisp ();
-
- sp = _iocs_b_super (0);
- *(unsigned short *) 0xe8e006 &= 0xfffd; /* HRL ビット */
- _iocs_b_super (sp);
-
- _iocs_skey_mod (-1, 0, 0);
- _iocs_b_curon ();
- _iocs_crtmod (old_crtmod);
-
- return (0);
- }
-
-
-
- void game (void)
- {
- seq_init ();
-
- // do {
- for (;;) {
- //xsp_vsync (20);
- seq_move ();
- bomb_move ();
- fxsp_out ();
- if (!xsp_out ())
- break;
- }
- seq_counter = 0;
- // } while ((_iocs_ms_getdt ()& 0xff00) == 0);
- }
-
-
-
- int main (int argc, char *argv[])
- {
- int i;
- int slash_flag = 0;
- int fname_found_flag = 0; /* ファイル名が1つでもあったか */
-
- {
- char *temp;
-
- temp = getenv ("SLASH");
- if ((temp != NULL) && (*temp == '/')) {
- slash_flag = 1;
- }
- }
-
- for (i = 1; i < argc; i++) {
- if (('-' == *argv[i]) || ((slash_flag == 0) && ('/' == *argv[i]))) {
- switch (*(argv[i] + 1)) {
-
- case 's':
- case 'S':
- sscanf (argv[i] + 2, "%d", &s_option);
- break;
-
- case 'n':
- case 'N':
- n_option = !0;
- break;
-
- default:
- usage ();
- return (-1);
- }
- } else {
- fname_found_flag = 1;
- }
- }
-
- srand(s_option);
- #if 0
- if (fname_found_flag == 0) {
- usage ();
- return (-1);
- }
- #endif
- init ();
- game ();
-
- tini ();
-
- return (0);
- }
-