home *** CD-ROM | disk | FTP | other *** search
- /* 男は一本槍 */
-
- /* main.c */
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <ctype.h>
- #include <sys/dos.h>
- #include <sys/iocs.h>
- #include "XSP2lib.H"
-
-
- #define GLOBAL_DEFINE /* グローバル変数を確保する */
- #include "main.h"
-
- static int old_crtmod;
-
- #define PCG_MAX 256 /* パターンデータの個数 */
- #define FRM_MAX 256 /* フレームデータの個数 */
- #define REF_MAX 256 /* リファレンスデータの個数 */
-
- static char pcg_alt[PCG_MAX + 1]; /* PCG配置管理テーブル */
- static char pcg_dat[PCG_MAX * 128]; /* PCGデータファイル読み込みバッファ */
- static XOBJ_REF_DAT ref_dat[REF_MAX]; /* リファレンスデータ */
- static XOBJ_FRM_DAT frm_dat[FRM_MAX]; /* フレームデータ */
-
- static unsigned short pal_dat[16][15]; /* パレットデータ */
-
-
-
- void usage (void)
- {
- printf (
- "縦スクロールシューティング・一本槍 IPPON.X ver0.02\n"
- " programmed by Mitsuky <FreeSoftware>\n"
- "自機を表示して終了するだけ\n"
- );
- }
-
-
-
- /* 終了時に1度だけ呼ばれる・エラーだったら返ってこない */
- void Tini (void)
- {
- int sp;
-
- switch (error_level) {
- case ERROR_NON:
- xsp_off ();
- /* 画面モードを元に戻す */
- sp = _iocs_b_super (0);
- *(unsigned short *) 0xe8e006 &= 0xfffd; /* HRL ビットを元に戻す */
- _iocs_b_super (sp);
- _iocs_crtmod (old_crtmod);
- _dos_kflushio (0xff); /* キーバッファをクリア */
- /* break が無い事に注意 */
-
- case ERROR_FILE:
- _iocs_tgusemd (1, 0);
- /* break が無い事に注意 */
- case ERROR_GUSEMD:
- _iocs_tgusemd (0, 0);
- /* break が無い事に注意 */
- case ERROR_TUSEMD:
- /* break が無い事に注意 */
- default:
- break;
- }
-
- if (error_level != ERROR_NON) {
- /* エラーが発生した場合 */
- puts (error_message);
- exit (-1); /* 終了する */
- }
- }
-
-
-
- /* 起動時に1度だけ呼ばれる */
- static void Init (void)
- {
- int sp;
- int i, j, r;
- static unsigned short crtcdata[9] =
- {69, 6, 11 + 8, 59 - 8, 567, 5, 40, 552, 0x0111};
- unsigned short *d;
- FILE *fp;
-
- error_message = NULL;
-
- /* テキスト画面の使用状況をチェック */
- error_level = ERROR_TUSEMD;
- if (_iocs_tgusemd (1, -1) == 2) {
- error_message = "テキスト VRAM が使用中です";
- Tini ();
- }
- /* グラフィック画面の使用状況をチェック */
- error_level = ERROR_GUSEMD;
- if (_iocs_tgusemd (0, -1)) {
- error_message = "グラフィック VRAM が使用中です";
- Tini ();
- }
- _iocs_tgusemd (0, 2);
- _iocs_tgusemd (1, 2);
-
-
- /* 各種ファイル読み込み */
- error_level = ERROR_FILE;
- /* pcg_dat にパターンデータを読み込む */
- fp = fopen ("PLAYER.XSP", "rb");
- if (fp == NULL) {
- error_message = "PLAYER.XSP が読めません";
- Tini ();
- }
- fread (pcg_dat, sizeof (char), PCG_MAX * 128, fp);
- fclose (fp);
-
- /* frm_dat にフレームデータを読み込む */
- fp = fopen ("PLAYER.FRM", "rb");
- if (fp == NULL) {
- error_message = "PLAYER.FRM が読めません";
- Tini ();
- }
- fread (frm_dat, sizeof (XOBJ_FRM_DAT), FRM_MAX, fp);
- fclose (fp);
-
- /* ref_dat にリファレンスデータを読み込む */
- fp = fopen ("PLAYER.REF", "rb");
- if (fp == NULL) {
- error_message = "PLAYER.REF が読めません";
- Tini ();
- }
- r = fread (ref_dat, sizeof (XOBJ_REF_DAT), REF_MAX, fp);
- fclose (fp);
-
- /* REF_DAT[].ptr 補正 */
- for (i = 0; i < r; i++)
- (int) ref_dat[i].ptr += (int) frm_dat;
-
-
- /* pal_dat に一旦パレットデータを読み込む */
- fp = fopen ("PLAYER.PAL", "rb");
- if (fp == NULL) {
- error_message = "PLAYER.PAL が読めません";
- Tini ();
- }
- fread (pal_dat, sizeof (unsigned short), 16 * 15, fp);
- fclose (fp);
-
- error_level = ERROR_NON; /* エラーなし */
-
- /* XSP 関連の初期化 */
- xsp_on ();
- xsp_mode (3);
- /* パターンデータを定義 */
- xsp_pcgdat_set (pcg_dat, pcg_alt, sizeof (pcg_alt));
- xsp_objdat_set (ref_dat);
-
-
- /* 画面モードの初期化 */
- /* 256x256ドット 31kHz 256色モードに */
- old_crtmod = _iocs_crtmod (-1); /* 前の CRTMOD を保存 */
- _iocs_crtmod (10); /* 256x256dot 31kHz 256色 */
- _iocs_g_clr_on (); /* 一応 */
- _iocs_sp_init (); /* スプライトの初期化 */
- _iocs_sp_on ();
-
- /* 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 int *) 0xe80018 = *(unsigned int *) 0xe8001c
- = *(unsigned int *) 0xe80020 = *(unsigned int *) 0xe80024
- = (0 << 16) + 0; /* グラフィック画面の座標 */
-
- *(unsigned short *) 0xe82500 = 0b01001001001110; /* 優先順位 TX>SP>GR */
- _iocs_b_super (sp);
-
- /* パレットデータを定義 */
- /* (1パレットブロック=16色) × (15ブロックぶん) 定義する */
- {
- unsigned short *p = (unsigned short *) pal_dat;
- for (i = 1; i < 15; i++)
- for (j = 0; j < 16; j++)
- _iocs_spalet (0x80000000 | j, i, *p++);
- }
- }
-
-
-
- /* ゲーム本体 */
- static void Game (void)
- {
- int j;
- int a_button;
-
- printf ("ジョイスティックの [A] ボタンを押すと終了します\n");
-
- /* [A] ボタンが押されるまでループ */
- do {
- j = _iocs_joyget (0); /* ジョイスティック0番 */
- /* [A] ボタンが押されたか? */
- if ((j & 0b00100000) == 0)
- a_button = !0; /* 押された */
- else
- a_button = 0; /* 押されていない */
- xobj_set (80 + 32 * 2, 144, 2, 0x073f); /* 自機を表示 */
-
- xsp_out (); /* 表示 */
- } while (a_button == 0);
- }
-
-
-
- int main (int argc, char *argv[])
- {
- if (argc != 1) {
- usage ();
- return (-1);
- }
- Init ();
- Game ();
- Tini ();
-
- return (0);
- }
-