Skip to content
/ xnp2 Public

Xnp2 is a port for UNIX with X11 of "Neko Project II" PC-9801 emulator.

Notifications You must be signed in to change notification settings

nonakap/xnp2

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

28 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

// ---- 定義

  最適化の為のメモリ使用量の抑制
    MEMOPTIMIZE = 0~2

    CPUにより以下の数値をセットされることを期待している
      MEMOPTIMIZE未定義 … Celeron333A以降のセカンドキャッシュ有効機
      MEMOPTIMIZE = 0   … x86
      MEMOPTIMIZE = 1   … PowerPC等のデスクトップ用RISC
      MEMOPTIMIZE = 2   … StrongARM等の組み込み用RISC


  コンパイラの引き数・戻り値の最適化
    引き数・戻り値でint型以外を指定した場合に、最適化が有効に働かない
    コンパイラ向けの定義です。
    通常は common.h の物を使用します。
      REG8 … UINT8型 / (sizeof(REG8) != 1)の場合 上位ビットを0fillする事
      REG16 … UINT16型 / (sizeof(REG16) != 2)の場合 上位ビットを0fillする事
   いずれも値をセットする側が0fillし、参照側は0fillしたものと見なします。


  OSの言語の選択
    OSLANG_SJIS … Shift-JISの漢字コードを解釈する
    OSLANG_EUC  … EUCの漢字コードを解釈する

    OSLINEBREAK_CR   … MacOS   "\r"
    OSLINEBREAK_LF   … Unix    "\n"
    OSLINEBREAK_CRLF … Windows "\r\n"

      ※現在は以下のソースコード内で個別に設定しています。
        (Windowsが APIによって \r\nの場合と\nの場合があるので…)
        ・common/_memory.c
        ・debugsub.c
        ・statsave.c

    (milstr.h選択用)
    SUPPORT_ANK      … ANK文字列操作関数をリンクする
    SUPPORT_SJIS     … SJIS文字列操作関数をリンクする
    SUPPORT_EUC      … EUC文字列操作関数をリンクする

      ※現在milstr.hですべて定義されたままになっています。
        ver0.73でmilstr.hの定義を外し compiler.hで指定した物となります。


 CPUCORE_IA32
  IA32アーキテクチャを採用
   i386cを使用する場合の注意点
    ・CPU panic や警告表示時に msgbox() という API を使用します。
    compiler.h あたりで適当に定義してください。
   ・sigsetjmp(3), siglongjmp(3) が無いアーキテクチャは以下の define を
    compiler.h あたりに追加してください。
    ----------------------------------------------------------------------
        #define sigjmp_buf              jmp_buf
        #define sigsetjmp(env, mask)    setjmp(env)
        #define siglongjmp(env, val)    longjmp(env, val)
    ----------------------------------------------------------------------

  CPUSTRUC_MEMWAIT
   cpucore構造体にメモリウェイト値を移動する(vramop)

  CGWND_FONTPTR
   cgwindowにフォントポインタを持たせる
   現状、あまり意味を持ちません

 SUPPORT_CRT15KHZ
   水平走査15.98kHzをサポートする(DIPSW1-1)

 SUPPORT_CRT31KHZ
   水平走査31.47kHzをサポートする
   Fellowタイプはこれ

 SUPPORT_PC9821
   PC-9821拡張のサポート
   当然ですが 386必須です。
   また SUPPORT_CRT31KHZも必要です(ハイレゾBIOSを使用する為)

 SUPPORT_PC9861K
   PC-9861K(RS-232C拡張I/F)をサポート

 SUPPORT_IDEIO
   IDEの I/Oレベルでのサポート
   でも ATAのリード程度しかできない…

 SUPPORT_SASI
   SASI HDDをサポート
   定義がなければ常時IDEとして作動します。

 SUPPORT_SCSI
   SCSI HDDをサポート…全然動かない

 SUPPORT_S98
   S98ログを取得

 SUPPORT_WAVEREC
  Soundレベルで waveファイルの書き出し関数をサポート
  但し書き出し中は サウンド出力が止まるので ほぼデバグ用


// ---- screen

  PC-9801シリーズの画面サイズは標準で 641x400。
  VGAでは収まらないので 強制的にVGAに収める為に 画面横サイズは width + extend
とする。
  8 < width < 640
  8 < height < 480
  extend = 0 or 1

typedef struct {
	BYTE	*ptr;		// VRAMポインタ
	int		xalign;		// x方向オフセット
	int		yalign;		// y方向オフセット
	int		width;		// 横幅
	int		height;		// 縦幅
	UINT	bpp;		// スクリーン色ビット
	int		extend;		// 幅拡張
} SCRNSURF;

  サーフェスサイズは (width + extern) x height。


const SCRNSURF *scrnmng_surflock(void);
  画面描画開始

void scrnmng_surfunlock(const SCRNSURF *surf);
  画面描画終了(このタイミングで描画)


void scrnmng_setwidth(int posx, int width)
void scrnmng_setextend(int extend)
void scrnmng_setheight(int posy, int height)
  描画サイズの変更
  ウィンドウサイズの変更する
  フルスクリーン中であれば 表示領域を変更。
  SCRNSURFではこの値を返すようにする
  posx, widthは 8の倍数

BOOL scrnmng_isfullscreen(void) … NP2コアでは未使用
  フルスクリーン状態の取得
    return: 非0でフルスクリーン

BOOL scrnmng_haveextend(void)
  横幅状態の取得
    return: 非0で 横幅拡張サポート

UINT scrnmng_getbpp(void)
  スクリーン色ビット数の取得
    return: ビット数(8/16/24/32)

void scrnmng_palchanged(void)
  パレット更新の通知(8bitスクリーンサポート時のみ)

RGB16 scrnmng_makepal16(RGB32 pal32)
  RGB32から 16bit色を作成する。(16bitスクリーンサポート時のみ)



// ---- sound

NP2のサウンドデータは sound.cの以下の関数より取得
  const SINT32 *sound_pcmlock(void)
  void sound_pcmunlock(const SINT32 *hdl)


SOUND_CRITICAL  セマフォを入れる(see sndcsec.c)
SOUNDRESERVE    予約バッファのサイズ(ミリ秒)
  サウンドを割り込み処理する場合の指定。
  割り込みの最大延滞時間をSOUNDRESERVEで指定。
  (Win9xの場合、自前でリングバッファを見張るので 割り込み無し・指定時間通りに
  サウンドライトが来るので、この処理は不要だった)


UINT soundmng_create(UINT rate, UINT ms)
  サウンドストリームの確保
    input:  rate    サンプリングレート(11025/22050/44100)
            ms      サンプリングバッファサイズ(ミリ秒)
    return: 獲得したバッファのサンプリング数

            msに従う必要はない(SDLとかバッファサイズが限定されるので)
            NP2のサウンドバッファ操作は 返り値のみを利用しています。


void soundmng_destroy(void)
  サウンドストリームの終了

void soundmng_reset(void)
  サウンドストリームのリセット

void soundmng_play(void)
  サウンドストリームの再生

void soundmng_stop(void)
  サウンドストリームの停止

void soundmng_sync(void)
  サウンドストリームのコールバック

void soundmng_setreverse(BOOL reverse)
  サウンドストリームの出力反転設定
    input:  reverse 非0で左右反転

BOOL soundmng_pcmplay(UINT num, BOOL loop)
  PCM再生
    input:  num     PCM番号
            loop    非0でループ

void soundmng_pcmstop(UINT num)
  PCM停止
    input:  num     PCM番号



// ---- mouse

BYTE mousemng_getstat(SINT16 *x, SINT16 *y, int clear)
  マウスの状態取得
    input:  clear   非0で 状態を取得後にカウンタをリセットする
    output: *x      clearからのx方向カウント
            *y      clearからのy方向カウント
    return: bit7    左ボタンの状態 (0:押下)
            bit5    右ボタンの状態 (0:押下)



// ---- serial/parallel/midi

COMMNG commng_create(UINT device)
  シリアルオープン
    input:  デバイス番号
    return: ハンドル (失敗時NULL)


void commng_destroy(COMMNG hdl)
  シリアルクローズ
    input:  ハンドル (失敗時NULL)



// ---- joy stick

BYTE joymng_getstat(void)
  ジョイスティックの状態取得

    return: bit0    上ボタンの状態 (0:押下)
            bit1    下ボタンの状態
            bit2    左ボタンの状態
            bit3    右ボタンの状態
            bit4    連射ボタン1の状態
            bit5    連射ボタン2の状態
            bit6    ボタン1の状態
            bit7    ボタン2の状態


// ----

void sysmng_update(UINT bitmap)
  状態が変化した場合にコールされる。

void sysmng_cpureset(void)
  リセット時にコールされる



void taskmng_exit(void)
  システムを終了する。