;********************************************
;*                FOREX(LCD)
;* CD FOREX(LCD)
;* HD61 FOREX(LCD).TXT /P
;*
;* 2025/10/21:Ver1.01 BUGFIX
;*
;********************************************

;このプログラムはFX-870Pと&H0000～&H0FFFにメモリを増設+32KB以上のRAMが搭載されたVX4しか動作しません。
;他の機種はライブラリで定数が使用されているためアセンブル時のエラーを回避するために残しているだけです。
PB1000:	EQU	1		;PB-1000
PB1000C:EQU	2		;PB-1000C
AI1000:	EQU	3		;AI-1000
FX870P:	EQU	4		;FX-870P+RP33(VX-4@64K/128K)
VX4:	EQU	5		;VX-4+RP33
VX3:	EQU	6		;VX-3(64K/128K)

FAST_LIB:EQU 0;SUPER GPRINT FAST+LCDC CONTROL DOTDS1分13秒;73
SUPER_GP:EQU 1;SUPER GPRINT+DOTDS;
NORMAL_G:EQU 2;NORMAL GPRINT+DOTDS 1分41秒;101

;*******************************************
;*              SETTING
;*******************************************
MODEL:EQU FX870P        ;FX-870Pしか動きません
USE_LIB:EQU FAST_LIB

START_STAGE:EQU 1

#if (MODEL=AI1000)
;-------------------------------
;機種依存(AI-1000 @Boot ROM化)
;-------------------------------
BASE:EQU &H1CD0

INTOP:	EQU	&H0000	;INTOP(中間言語バッファ)
EDTOP: EQU &H0100 ;文字表示用バッファ
LEDTP: EQU &H0201 ;LCD表示用バッファ
FDDBF:	EQU	INTOP	;FDD入出力バッファ

RXCNT:	EQU	&H08E0	;(RS-232C)
IOBUF:	EQU	&H0D9E	;INTOP(中間言語バッファ)を利用する
CALC:	EQU	&H0ADE	;CALC用バッファ
STAT:EQU	&H66EA	;STAT用データ

;IOCS(AI-1000 BootRom)
CLEME:EQU &H027B ;AI-1000R ;$0,$1:開始アドレス $2,$3:クリアするバイト数
DOTDS:EQU &H0D46 ;AI-1000R
CLEDB:EQU &H0D4C ;CLS(INTOP,EDTOP,LEDTPを0クリアする)
INKEY:EQU &H0C60 ;INKEY$処理
DOTMK:EQU &H0D52 ;文字ドットパターン作成い

IOCS:EQU &H0C56  ;BIOS CALL用
#endif
#if (MODEL=FX870P)|(MODEL=VX4)
;-------------------------------
;機種依存(FX-870P)
;-------------------------------
BASE:EQU &H1CD0

EDTOP: EQU &H113B ;文字表示用バッファ
LEDTP: EQU &H123C ;LCD表示用バッファ
FDDBF:	EQU	&H1793	;FDD入出力バッファ

;IOCS(FX-870P)
CLEME:EQU &H0157 ;870P ;$0,$1:開始アドレス $2,$3:クリアするバイト数
DOTDS:EQU &H930F ;870P
CLEDB:EQU &H9338 ;870P
INKEY:EQU &H191D ;870P
DOTMK:EQU &H9783 ;870P ;FX-870PではDOTMK+4でないと正常に動作しない

IOCS:EQU &H5321  ;BIOS CALL用
#endif
#if (MODEL=VX3)
;-------------------------------
;機種依存(VX-3)
;-------------------------------
;BASE:EQU &H6CD0
BASE:EQU &H1CD0
;BASE:EQU 0		; RR形式用

EDTOP: EQU &H6242 ;文字表示用バッファ
LEDTP: EQU &H6343 ;LCD表示用バッファ
FDDBF:	EQU	&H678C	;FDD入出力バッファ

;IOCS(VX-3)
CLEME:EQU &H01DF ;VX-3 ;$0,$1:開始アドレス $2,$3:クリアするバイト数
DOTDS:EQU &H1FD5 ;VX-3
CLEDB:EQU &H2035 ;VX-3
INKEY:EQU &H194E ;VX-3
DOTMK:EQU &H2477 ;VX-3ではDOTMK+4でないと正常に動作しない

IOCS:EQU &H5CA7  ;BIOS CALL用
#endif

LEDTP0:EQU LEDTP       ; &H123C ;870P
LEDTP1:EQU LEDTP+192   ; &H12FC ;870P
LEDTP2:EQU LEDTP+192*2 ; &H13BC ;870P
LEDTP3:EQU LEDTP+192*3 ; &H147C ;870P

EDTOP0:EQU EDTOP       ; &H113B ;870P
EDTOP1:EQU EDTOP+32    ; &H115B ;870P
EDTOP2:EQU EDTOP+32*2  ; &H117B ;870P
EDTOP3:EQU EDTOP+32*3  ; &H119B ;870P

ORG BASE
START START

GPRINT_XMAX:DB 136;GPRINTの描画範囲(0-191)この範囲を超えると描画されない
SGPRINT_XMAX:DB 136;GPRINTの描画範囲(0-191)この範囲を超えると描画されない
D_GPRINT_XMAX:EQU 144
MY_GUN_MAX:EQU 8
SPARK_MAX:EQU &H7 ;通常時敵が爆発した時の煙の数(&H1,&H3,&H7,&HF)
BOSS_CORE_NO:EQU 9

;********* MESSAGE SECTION
MES_PAUSE:DB " PAUSE  "
MES_SCORE:DB "S:"
MES_ZERO:DB "00"
MES_LIFE:DB "L:"

MES_LIFE_BAR:
#if (USE_LIB=FAST_LIB)
DB &H9E,&H9E,&H9E,&H9E,&H9E,&H9E
#else
DB &H2A,&H2A,&H2A,&H2A,&H2A,&H2A
#endif

MES_BOMB:DB "B:"
MES_BOMB_BAR:DB &HEC,&HEC,&HEC,&HEC,&HEC,&HEC,&HEC,&HEC
MES_STAGE:DB "STAGE"
MES_STAGE_NO:DB "1"
MES_STAGE_CLEAR:DB "STAGE CLEAR!"
MES_NEXT_STAGE:DB "TO THE NEXT STAGE!"
MES_DEF_ENEMY:DB "DEFEAT ALL ENEMIES!"
MES_CONGRA:DB "Congratulations!"
MES_GAME_OVER:DB " GAME OVER. "
MES_RETRY:DB " RETRY(Y/N) "
MES_NAME_BOSS1:DB " MOUTHE "
MES_NAME_BOSS2:DB "SQUIRRER"
MES_NAME_BOSS3:DB " BADGUR "
MES_NAME_BOSS4:DB "RACONDOG"
MES_NAME_BOSS5:DB "  OWRU  "
MES_RESULT:DB "RESULT"
MES_NOWSCORE:DB "YOUR SCORE:"
MES_NOWHISCORE:DB "HIGH SCORE:"
MES_HISCORE:DB "NEW HIGH SCORE!!"
MES_PUSH_A_KEY:DB "PUSH A KEY TO RETURN"
MES_MODE_GPR:DB " GPRINT ";8
MES_MODE_SGPR:DB " SUPER GPRINT ";14

;********* DATA SECTION
;FHIGTER DATA
MY_FIGHTER:
MY_X:DB 24 ;X
MY_Y:DB 20 ;Y
MY_LEN:DB 8 ;CHARACTOR LENGTH
LIFE:DB 6 ;LIFE
BOMB:DB 6 ;BOMB
MUTEKI_COUNTER:DB 0 ;無敵カウンタ

POWER_MAX:EQU 48
MUTEKI_MAX:EQU 64

;GUN
GUN_POINTER:DB 0
GUN_WAIT:DB 0
GUN_WAIT_MAX:EQU 4

;BOMB
BOMB_WAIT:DB 0
BOMB_BOSS_HIT:DB 0
BOMB_WAIT_MAX:EQU 30

;ENEMY
ENEMY_POINTER:DB 0

;MAP POINTER
MAP_READ_POINTER:DW 0

;SCROLL_COUNTER
SCROLL_COUNTER:DB 0

;SPARK_POINTER
SPARK_POINTER:DB 0

;INSERT OBJECT POINTER
INSERT_OBJ_PT:DB 0
INSERT_OBJ_DATA:
;(INSERT_OBJECT POINTER,INSERT_OBJECT ENEMY_No)×16
;メモリを節約したいのでJUDGE_LEFTの領域を共用
DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

SCORE:DW 0
;HIGH_SCORE:EQU &H1731

GLOBAL_COUNTER:DB 0

JUDGE_LC:EQU 64
JUDGE_CR:EQU 96
MAKE_JUDGE_SIZE:EQU 2;STRUCT SIZE JUDGE_LEFT,CENTER,RIGHT
JUDGE_LEFT_MATH:DB 0
JUDGE_CNTR_MATH:DB 0
JUDGE_RIGT_MATH:DB 0

;INSERT_OBJ_DATA:
JUDGE_LEFT:
;(ENEMY_POINTER,X_LENGTH)×16
DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
JUDGE_CENTER:
;(ENEMY_POINTER,X_LENGTH)×16
DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
JUDGE_RIGHT:
;(ENEMY_POINTER,X_LENGTH)×16
DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

;ITEM
ITEM_DATA:
ITEM_TYPE:DB 0;0:NO_ACTIVE 1:LIFE 2:BOMB
ITEM_X:DB 0
ITEM_Y:DB 0

;雑用に使うカウンタ、フラグ
EXTRA:
EXTRA_FLAG:DB 0
EXTRA_COUNTER:DB 0

;遷移管理
PHASE:DB 0
PHASE_COUNTER:DB 0
SECTION:DB 0
SECTION_COUNTER:DB 0

;ALERT関連
ALERT:
DISP_ALERT_FLG:DB 0;1:REAR 2:TOP OR BOTTOM
DISP_ALERT_CNT:DB 0

NOW_BOSS_FIGHT:DB 0
BOSS_DESTROY:DB 0

;******* STAGE INFOMATION
STAGE_END:EQU 5
STAGE_NO:DB 1
STAGE_INIT:DB 0,0
STAGE_MAP:DB 0,0
STAGE_MAP_CHARA:DB 0,0
INIT_DATA_STAGE:DB 0,0
ENEMY_MOVE_ADR:DB 0,0
ENEMY_DISP_ADR:DB 0,0
BOSS_INIT_ADR:DB 0,0
BOSS_PRE_ADR:DB 0,0
BOSS_MOVE_ADR:DB 0,0
BOSS_DISP_ADR:DB 0,0
;BOSSを構成するデータ(ENEMY_DATA_0～)の数、ボス破壊時に弾等を消去する際、ENEMY_DATA_0+BOSS_DATA_NUM以降のデータを消去する
BOSS_DATA_NUM:DB 0
BOSS_NAME:DB 0,0,0,0,0,0,0,0
;
BASE_SENARIO_PTR:DB 0,0 ;2BYTE
NOW_SENARIO:DB 0,0 ;2BYTE
SENARIO_POINTER:DB 0

;再描画フラグ(順番を変えるな)
REDRAW_SCORE:DB 0   ;$0
REDRAW_LIFE:DB 0    ;$1
REDRAW_BOMB:DB 0    ;$2

READY_START_FLAG:DB 0
GAME_OVER_FLAG:DB 0

;
CONT_MODE:DB 0

;WAIT
TITLE_WAIT:EQU 16
WAIT08:EQU 8
WAIT16:EQU 16
WAIT32:EQU 32
WAIT64:EQU 64

;************** PROGRAM SECTION

;*****************************
;*      SET STAGE DATA
;*****************************
SET_STAGE_DATA:
PRE IX,STAGE_NO
LD $0,(IX+$31)
SBC $0,1
JR Z,SET_STAGE1_DATA
SBC $0,2
JP Z,SET_STAGE2_DATA
SBC $0,3
JP Z,SET_STAGE3_DATA
SBC $0,4
JP Z,SET_STAGE4_DATA
JP SET_STAGE5_DATA

SET_STAGE1_DATA:
;STAGE1の初期化サブルーチンのアドレス
LDW $0,STAGE_1_INIT
PRE IX,STAGE_INIT
STW $0,(IX+$31)
;STAGE1のマップデータのアドレス
LDW $0,STAGE1_MAP
PRE IX,STAGE_MAP
STW $0,(IX+$31)
;STAGE1のマップに登場する背景キャラクタのデータのアドレス
LDW $0,STAGE1_MAP_CHARA
PRE IX,STAGE_MAP_CHARA
STW $0,(IX+$31)
;STAGE1に登場するの敵のキャラクタデータのアドレス
LDW $0,INIT_DATA_STAGE1
PRE IX,INIT_DATA_STAGE
STW $0,(IX+$31)
;STAGE1の敵の移動サブルーチンのアドレス
LDW $0,ST1_ENEMY_MOVE
PRE IX,ENEMY_MOVE_ADR
STW $0,(IX+$31)
;STAGE1の敵の表示サブルーチンのアドレス
LDW $0,ST1_ENEMY_DISP
PRE IX,ENEMY_DISP_ADR
STW $0,(IX+$31)
;BOSS1初期化サブルーチンのアドレス
LDW $0,BOSS1_INIT
PRE IX,BOSS_INIT_ADR
STW $0,(IX+$31)
;BOSS1登場時の動作サブルーチンのアドレス
LDW $0,BOSS1_PRE
PRE IX,BOSS_PRE_ADR
STW $0,(IX+$31)
;BOSS1移動サブルーチンのアドレス
LDW $0,MOVE_BOSS1
PRE IX,BOSS_MOVE_ADR
STW $0,(IX+$31)
;BOSS1表示サブルーチンのアドレス
LDW $0,DISP_BOSS1
PRE IX,BOSS_DISP_ADR
STW $0,(IX+$31)
;BOSS1の名前が格納されたアドレス
PRE IX,MES_NAME_BOSS1
LDM $0,(IX+$31),8
PRE IX,BOSS_NAME
STM $0,(IX+$31),8
;
;SUPER GPRINT DATA MAKE
CAL ST1_INIT_GRAPHIC
;
RTN

SET_STAGE2_DATA:
;STAGE2の初期化サブルーチンのアドレス
LDW $0,STAGE_2_INIT
PRE IX,STAGE_INIT
STW $0,(IX+$31)
;STAGE2のマップデータのアドレス
LDW $0,STAGE2_MAP
PRE IX,STAGE_MAP
STW $0,(IX+$31)
;STAGE2のマップに登場する背景キャラクタのデータのアドレス
LDW $0,STAGE2_MAP_CHARA
PRE IX,STAGE_MAP_CHARA
STW $0,(IX+$31)
;STAGE2に登場するの敵のキャラクタデータのアドレス
LDW $0,INIT_DATA_STAGE2
PRE IX,INIT_DATA_STAGE
STW $0,(IX+$31)
;STAGE2の敵の移動サブルーチンのアドレス
LDW $0,ST2_ENEMY_MOVE
PRE IX,ENEMY_MOVE_ADR
STW $0,(IX+$31)
;STAGE2の敵の表示サブルーチンのアドレス
LDW $0,ST2_ENEMY_DISP
PRE IX,ENEMY_DISP_ADR
STW $0,(IX+$31)
;BOSS2初期化サブルーチンのアドレス
LDW $0,BOSS2_INIT
PRE IX,BOSS_INIT_ADR
STW $0,(IX+$31)
;BOSS2登場時の動作サブルーチンのアドレス
LDW $0,BOSS2_PRE
PRE IX,BOSS_PRE_ADR
STW $0,(IX+$31)
;BOSS2移動サブルーチンのアドレス
LDW $0,MOVE_BOSS2
PRE IX,BOSS_MOVE_ADR
STW $0,(IX+$31)
;BOSS2表示サブルーチンのアドレス
LDW $0,DISP_BOSS2
PRE IX,BOSS_DISP_ADR
STW $0,(IX+$31)
;BOSS2の名前が格納されたアドレス
PRE IX,MES_NAME_BOSS2
LDM $0,(IX+$31),8
PRE IX,BOSS_NAME
STM $0,(IX+$31),8
;
;SUPER GPRINT DATA MAKE
CAL ST2_INIT_GRAPHIC
;
RTN

SET_STAGE3_DATA:
;STAGE3の初期化サブルーチンのアドレス
LDW $0,STAGE_3_INIT
PRE IX,STAGE_INIT
STW $0,(IX+$31)
;STAGE3のマップデータのアドレス
LDW $0,STAGE3_MAP
PRE IX,STAGE_MAP
STW $0,(IX+$31)
;STAGE3のマップに登場する背景キャラクタのデータのアドレス
LDW $0,STAGE3_MAP_CHARA
PRE IX,STAGE_MAP_CHARA
STW $0,(IX+$31)
;STAGE3に登場するの敵のキャラクタデータのアドレス
;2025/10/21:Ver1.01 BUGFIX
;LDW $0,INIT_DATA_STAGE5
LDW $0,INIT_DATA_STAGE3
PRE IX,INIT_DATA_STAGE
STW $0,(IX+$31)
;STAGE3の敵の移動サブルーチンのアドレス
LDW $0,ST3_ENEMY_MOVE
PRE IX,ENEMY_MOVE_ADR
STW $0,(IX+$31)
;STAGE3の敵の表示サブルーチンのアドレス
LDW $0,ST3_ENEMY_DISP
PRE IX,ENEMY_DISP_ADR
STW $0,(IX+$31)
;BOSS3初期化サブルーチンのアドレス
LDW $0,BOSS3_INIT
PRE IX,BOSS_INIT_ADR
STW $0,(IX+$31)
;BOSS3登場時の動作サブルーチンのアドレス
LDW $0,BOSS3_PRE
PRE IX,BOSS_PRE_ADR
STW $0,(IX+$31)
;BOSS3移動サブルーチンのアドレス
LDW $0,MOVE_BOSS3
PRE IX,BOSS_MOVE_ADR
STW $0,(IX+$31)
;BOSS3表示サブルーチンのアドレス
LDW $0,DISP_BOSS3
PRE IX,BOSS_DISP_ADR
STW $0,(IX+$31)
;BOSS3の名前が格納されたアドレス
PRE IX,MES_NAME_BOSS3
LDM $0,(IX+$31),8
PRE IX,BOSS_NAME
STM $0,(IX+$31),8
;
;SUPER GPRINT DATA MAKE
CAL ST3_INIT_GRAPHIC
;
RTN

SET_STAGE4_DATA:
;STAGE4の初期化サブルーチンのアドレス
LDW $0,STAGE_4_INIT
PRE IX,STAGE_INIT
STW $0,(IX+$31)
;STAGE4のマップデータのアドレス
LDW $0,STAGE4_MAP
PRE IX,STAGE_MAP
STW $0,(IX+$31)
;STAGE4のマップに登場する背景キャラクタのデータのアドレス
LDW $0,STAGE4_MAP_CHARA
PRE IX,STAGE_MAP_CHARA
STW $0,(IX+$31)
;STAGE4に登場するの敵のキャラクタデータのアドレス
LDW $0,INIT_DATA_STAGE4
PRE IX,INIT_DATA_STAGE
STW $0,(IX+$31)
;STAGE4の敵の移動サブルーチンのアドレス
LDW $0,ST4_ENEMY_MOVE
PRE IX,ENEMY_MOVE_ADR
STW $0,(IX+$31)
;STAGE4の敵の表示サブルーチンのアドレス
LDW $0,ST4_ENEMY_DISP
PRE IX,ENEMY_DISP_ADR
STW $0,(IX+$31)
;BOSS4初期化サブルーチンのアドレス
LDW $0,BOSS4_INIT
PRE IX,BOSS_INIT_ADR
STW $0,(IX+$31)
;BOSS4登場時の動作サブルーチンのアドレス
LDW $0,BOSS4_PRE
PRE IX,BOSS_PRE_ADR
STW $0,(IX+$31)
;BOSS4移動サブルーチンのアドレス
LDW $0,MOVE_BOSS4
PRE IX,BOSS_MOVE_ADR
STW $0,(IX+$31)
;BOSS4表示サブルーチンのアドレス
LDW $0,DISP_BOSS4
PRE IX,BOSS_DISP_ADR
STW $0,(IX+$31)
;BOSS4の名前が格納されたアドレス
PRE IX,MES_NAME_BOSS4
LDM $0,(IX+$31),8
PRE IX,BOSS_NAME
STM $0,(IX+$31),8
;
;SUPER GPRINT DATA MAKE
CAL ST4_INIT_GRAPHIC
;
RTN

SET_STAGE5_DATA:
;STAGE5の初期化サブルーチンのアドレス
LDW $0,STAGE_5_INIT
PRE IX,STAGE_INIT
STW $0,(IX+$31)
;STAGE5のマップデータのアドレス
LDW $0,STAGE5_MAP
PRE IX,STAGE_MAP
STW $0,(IX+$31)
;STAGE5のマップに登場する背景キャラクタのデータのアドレス
LDW $0,STAGE5_MAP_CHARA
PRE IX,STAGE_MAP_CHARA
STW $0,(IX+$31)
;STAGE5に登場するの敵のキャラクタデータのアドレス
LDW $0,INIT_DATA_STAGE5
PRE IX,INIT_DATA_STAGE
STW $0,(IX+$31)
;STAGE5の敵の移動サブルーチンのアドレス
LDW $0,ST5_ENEMY_MOVE
PRE IX,ENEMY_MOVE_ADR
STW $0,(IX+$31)
;STAGE5の敵の表示サブルーチンのアドレス
LDW $0,ST5_ENEMY_DISP
PRE IX,ENEMY_DISP_ADR
STW $0,(IX+$31)
;BOSS5初期化サブルーチンのアドレス
LDW $0,BOSS5_INIT
PRE IX,BOSS_INIT_ADR
STW $0,(IX+$31)
;BOSS5登場時の動作サブルーチンのアドレス
LDW $0,BOSS5_PRE
PRE IX,BOSS_PRE_ADR
STW $0,(IX+$31)
;BOSS5移動サブルーチンのアドレス
LDW $0,MOVE_BOSS5
PRE IX,BOSS_MOVE_ADR
STW $0,(IX+$31)
;BOSS5表示サブルーチンのアドレス
LDW $0,DISP_BOSS5
PRE IX,BOSS_DISP_ADR
STW $0,(IX+$31)
;BOSS5の名前が格納されたアドレス
PRE IX,MES_NAME_BOSS5
LDM $0,(IX+$31),8
PRE IX,BOSS_NAME
STM $0,(IX+$31),8
;
;SUPER GPRINT DATA MAKE
CAL ST5_INIT_GRAPHIC
;
RTN

;**********************************
;*           GAME START
;**********************************
START:
;LOGO SKIP
;JR PROLOGUE
;JR TITLE

;FX-870P&VX-4のLOGO表示
CAL LOGO
LDW $0,512
CAL WAIT
CAL CLS
CAL DOTDS_FX
#if (USE_LIB=FAST_LIB)
;HD61700 POWERの表示
;CAL OPENING_TEXT
;LDW $0,1024
;CAL WAIT
;CAL CLS
;CAL DOTDS_FX
#else

#endif

PROLOGUE:
CAL PROLOGUE_DISP

;TITLEの表示
TITLE:
LDW $0,&HFF
CAL WAIT
CAL TITLE_DISP

;********** BOOT INIT *************
GAME_START_INIT:

;SCORE初期化
PRE IZ,SCORE
LDW $0,0
STW $0,(IZ+$31)

;STAGE関連の初期化
PRE IX,STAGE_NO
LD $8,START_STAGE
ST $8,(IX+$31)

;自機の初期化
;MY_INIT_DATAはGAME_INITで定義している。内容は以下のとおり
;MY_INIT_DATA:DB 24,20,8,6,6,0
PRE IX,MY_INIT_DATA
LDM $0,(IX+$31),6
PRE IX,MY_FIGHTER
STM $0,(IX+$31),6

;******* EVERY STAGE INIT *********
STAGE_START_INIT:

CAL GAME_INIT;変数、フラグの初期化

;READY_START表示フラグの初期化
PRE IX,READY_START_FLAG
ST $31,(IX+$31)

CAL WORK_AREA_CLEAR
;VRAM,LCDC RAM CLEAR
CAL CLS
;DOTDS_FXは左8ドットを空白にしてしまうのでここでは使えない
LDW $28,DOTDS
CAL IOCS_CAL
;
CAL SET_STAGE_DATA ;これを実行しないと各種サブルーチンのアドレス、データが紐つけられない
PRE IX,STAGE_INIT
LDW $28,(IX+$31)
CAL CAL_REG28
CAL INIT_BG
CAL INIT_SCROLL
CAL RS_WORK_CLEAR
CAL OBJECT_ARRAY_INI

CAL DISP_FOREX
CAL DISP_SCORE
CAL DISP_LIFE
CAL DISP_BOMB

;2025/10/21:Ver1.01 BUGFIX
;シナリオデータの初期化
LDW $0,0
LDW $2,0
LDW $4,0
PRE IX,BASE_SENARIO_PTR
STM $0,(IX+$31),5

JR MAIN_LOOP

;**********************************
;          CONTINUE処理
;**********************************
CONTINUE:

;GAME OVERフラグをOFF
PRE IX,GAME_OVER_FLAG
ST $31,(IX+$31)

;無敵状態にする
PRE IZ,MUTEKI_COUNTER
LD $0,MUTEKI_MAX
ST $0,(IZ+$31)

PRE IX,CONT_MODE
SBC (IX+$31),$31
JR Z,RETRY_PROC

CONTINUE_PROC:
;ボス戦中のコンティニューであればのボス戦の処理へ
PRE IX,NOW_BOSS_FIGHT
SBC (IX+$31),$31
JR Z,MAIN_LOOP;通常
JP BOSS_PHASE4;ボス戦でGAME_OVERになった時点から

RETRY_PROC:
JR STAGE_START_INIT

MAIN_LOOP:
CAL REDRAW_FLAG_OFF

;EH_JUDGEワークエリアの初期化
CAL INIT_JUDGE_DATA
;無敵状態をチェック
CAL CHECK_MUTEKI
;
;INSERT OBJECT DATA POINTER初期化
PRE IX,INSERT_OBJ_PT
ST $31,(IX+$31)
;
PRE IX,GUN_WAIT
SBC (IX+$31),$31
JR Z,GUN_NO_WAIT
SB (IX+$31),$30
GUN_NO_WAIT:
PRE IX,BOMB_WAIT
SBC (IX+$31),$31
JR Z,BOMB_NO_WAIT
SB (IX+$31),$30
JR NZ,BOMB_NO_WAIT
;BOMB WAITが0になったら、BOSS COREがBOMBに当たったフラグを下げる
PRE IX,BOMB_BOSS_HIT
ST $31,(IX+$31)
BOMB_NO_WAIT:

;
PRE IX,GLOBAL_COUNTER
LD $0,(IX+$31)
AN $0,$30 ;1
JR Z,NO_BG_SCROLL
;
CAL BG_SCROLL
;----- $28:EVENT NO(0:NOTHING &HFF:END=BOSS/EXIT)
SBC $28,&HFF
JP Z,BOSS_MAIN
;
NO_BG_SCROLL:
CAL INS_ENEMY
PRE IX,ENEMY_MOVE_ADR
LDW $28,(IX+$31)
CAL CAL_REG28
;

CAL MOVE_GUN

;GAME OVER CHECK
PRE IX,GAME_OVER_FLAG
SBC (IX+$31),$31
JR Z,END_GAMEOVER_CKN
;GAME OVER時の余韻の処理
PRE IX,EXTRA_COUNTER
SB (IX+$31),$30
JP Z,GAME_OVER
END_GAMEOVER_CKN:

CAL INSERT_OBJECT_ON

CAL MAKE_JUDGE_DATA
CAL JUDGE
;
PRE IX,MY_FIGHTER
LDW $10,(IX+$31)
CAL IN_KEY

NOT_ON_GAME:
;********* DISPLAY ROUTINE SECTION START
DISPLAY_SECTION:
;
CAL TRANS_MAP
;
CAL DISP_SPARK
;CAL ENEMY_DISP
PRE IX,ENEMY_DISP_ADR
LDW $28,(IX+$31)
CAL CAL_REG28
;
CAL DISP_FIGHTER
CAL DISP_GUN
CAL ITEM_PROC;この処理はREDRAW_CHECKの前に行う
CAL REDRAW_CHECK
CAL DISP_ALERT
CAL READY_START_DISP

#if (USE_LIB=FAST_LIB)
CAL @DOTDS
#else
CAL DOTDS_FX
#endif

;********* DISPLAY ROUTINE SECTION END

PRE IX,GLOBAL_COUNTER
AD (IX+$31),$30

JP MAIN_LOOP

;*********************************
;*        ALL GUN KILL
;*
;*USE:$0 - COUNTER
;*    IX
;*********************************
ALL_GUN_KILL:

LD $0,0

PRE IX,GUN_DATA

ALL_GUN_KILL_LP:
ST $31,(IX+$0)
AD $0,GUN_STRUCT
SBC $0,GUN_STRUCT*16
JR C,ALL_GUN_KILL_LP

RTN


;*********************************
;*        RESULT_DISP
;*
;*USE:
;*      $0-$11  MESSAGE LDM/STM WORK/BTOB PARA
;*      $23,$24 NOW SCORE
;*      $25,$26 NOW HIGH SCORE
;*      IX      INDEX WORK
;*      IZ      INDEX WORK
;*********************************
RESULT_DISP:

;CLS
CAL CLS
LDW $28,DOTDS
CAL IOCS_CAL

PRE IX,SCORE
LDW $23,(IX+$31);$23,$24:SCORE
PRE IX,HIGH_SCORE
LDW $25,(IX+$31);$25,$26,HI-SCORE

;"RESULT"表示
PRE IX,MES_RESULT
LD $10,14
LD $11,$31
LD $12,6
LDW $13,MES_RESULT
CAL D_TEXT

;"HIGH SCORE: "表示
LD $10,7
LD $11,$30
LD $12,11
LDW $13,MES_NOWHISCORE
CAL D_TEXT

LDW $8,$25 ;BTOB(2進数を10進数に変換するサブルーチンに値を設定)
LD $10,18;
LD $11,$30
CAL D_BTOB

;"0"表示
LD $10,23
LD $11,$30
LDW $13,MES_ZERO
CAL D_TEXT

;"YOUR SCORE: "表示
LD $10,7
LD $11,2
LD $12,11
LDW $13,MES_NOWSCORE
CAL D_TEXT

LDW $8,$23 ;BTOB(2進数を10進数に変換するサブルーチンに値を設定)
LD $10,18;BTOBで10進化した得点の表示位置設定
CAL D_BTOB

;"0"表示
LD $10,23
LD $11,2
LDW $13,MES_ZERO
CAL D_TEXT

SBCW $23,$25 ;今回の得点がハイスコアを上回ったら、ハイスコアを更新してハイスコアの表示をする
JR C,RESULT_DISP_WAIT
PRE IZ,HIGH_SCORE
STW $23,(IZ+$31)

LD $10,8
LD $11,3
LD $12,16
LDW $13,MES_HISCORE
CAL D_TEXT

RESULT_DISP_WAIT:

CAL HIT_ANYKEY
RTN

;***********************************
;*         ITEM処理
;***********************************
ITEM_PROC:
PRE IX,ITEM_DATA
LDM $9,(IX+$31),3
;ACTIVE FLAG=0なら戻る
SBC $9,$31
RTN Z
;X=X-1
SB (IX+$30),$30
JR C,KILL_ITEM

;ITEMの表示
LD $12,8
LDW $13,CHR_SUP_ITEM;CHR_SUP_BOMB;CHR_SUP_LIFE
CAL GPRINT

;GAME OVER中なら表示だけして戻る
PRE IX,GAME_OVER_FLAG
ADC (IX+$31),$31
RTN NZ

;GPRINTで$10,$11,IXが破壊されたので再度読み込む
PRE IX,ITEM_DATA
LDW $0,(IX+$30)

;自機とITEMの衝突判定
;ITEM
LD $2,$0
LD $3,$1
AD $2,8 ;ITEM_X+ITEM_LENGTH_X(8)
AD $3,8 ;ITEM_Y+ITEM_LENGTH_Y(8)
;自機
PRE IZ,MY_X
LDW $4,(IZ+$31)
LD $6,$4
LD $7,$5
AD $6,8
AD $7,8

;自機がITEMに当たらない条件
;IX2($2)<FX1($4)=$4-$2>=0
;IX1($0)>FX2($6)=$0-$6>=0
;IY2($3)<FY1($5)=$5-$3>=0
;IY1($1)>FY2($7)=$1-$7>=0

SBC $4,$2
RTN NC;範囲外
SBC $0,$6
RTN NC;範囲外
SBC $5,$3
RTN NC;範囲外
SBC $1,$7
RTN NC;範囲外

PRE IZ,LIFE
LDW $0,(IZ+$31);$0:LIFE $1:BOMB

LIFE_MAX_CHECK:
AD $0,$30
SBC $0,7
JR C,BOMB_MAX_CHECK
LD $0,6
BOMB_MAX_CHECK:
AD $1,$30
SBC $1,7
JR C,ITEM_MAX_CK_END
LD $1,6
ITEM_MAX_CK_END:

STW $0,(IZ+$31);$0:LIFE $1:BOMB

PRE IZ,REDRAW_LIFE
;REDRAW LIFE ON
ST $30,(IZ+$31)
;REDRAW BOMB ON
ST $30,(IZ+$30)

KILL_ITEM:
ST $31,(IX+$31)
RTN

;***********************************
;*      ステータス再描画フラグの初期化
;***********************************

REDRAW_FLAG_OFF:
;得点の再描画フラグをOFFにする
PRE IX,REDRAW_SCORE
ST $31,(IX+$31)
;LIFEの再描画フラグをOFFにする
PRE IX,REDRAW_LIFE
ST $31,(IX+$31)
;BOMBの再描画フラグをOFFにする
PRE IX,REDRAW_BOMB
ST $31,(IX+$31)
RTN

;***********************************
;*           自機の初期化
;***********************************

MY_INIT_DATA:DB 24,20,8,6,6,0

GAME_INIT:
;自機の初期化
PRE IX,MY_INIT_DATA
LDM $0,(IX+$31),2
PRE IX,MY_FIGHTER
STM $0,(IX+$31),2
;GUNの初期化
PRE IX,CHR_WHITE
LDM $0,(IX+$31),8
PRE IX,GUN_POINTER
STM $0,(IX+$31),2
;BOMBの初期化
PRE IX,BOMB_WAIT
ST $31,(IX+$31)
PRE IX,BOMB_BOSS_HIT
ST $31,(IX+$31)
;ENEMYの初期化
PRE IX,ENEMY_POINTER
ST $31,(IX+$31)
;ITEMの初期化
PRE IX,ITEM_DATA
ST $31,(IX+$31)
;MAPの初期化
PRE IX,MAP_READ_POINTER
STW $0,(IX+$31)
;SCROLL_COUNTERの初期化
PRE IX,SCROLL_COUNTER
ST $0,(IX+$31)
;SPARK_POINTERの初期化
PRE IX,SPARK_POINTER
ST $0,(IX+$31)
;GLOBAL_COUNTERの初期化
PRE IX,GLOBAL_COUNTER
ST $0,(IX+$31)
;JUDGE_LEFT,CENTER,RIGHT MATHの初期化
PRE IX,JUDGE_LEFT_MATH
STM $0,(IX+$31),3
;雑用に使うカウンタ、フラグの初期化
PRE IX,EXTRA
STW $0,(IX+$31)
;遷移管理の初期化
PRE IX,PHASE
STM $0,(IX+$31),4
;REAR_ALERT関連の初期化
PRE IX,ALERT
STW $0,(IX+$31)
;BOSS関連の初期化
PRE IX,NOW_BOSS_FIGHT
STW $0,(IX+$31)
;再描画フラグの初期化
PRE IX,REDRAW_SCORE
STM $0,(IX+$31),3
;GAME_OVER関連の初期化
PRE IX,GAME_OVER_FLAG
ST $0,(IX+$31)
RTN

;*********************************
;*    READY_START BUF CLEAR
;*********************************
RS_WORK_CLEAR:
LDW $0,BUF
LDW $2,42
LDW $28,CLEME
JP IOCS_CAL

;*********************************
;*          READY_START_DISP
;*********************************

BUF:DS 42
L_PHASE:EQU BUF+40              ;LOCAL PHASE
L_PHASE_COUNTER:EQU BUF+41      ;LOCAL PHASE COUNTER

READY_START_DISP:

PRE IX,READY_START_FLAG
SBC (IX+$31),$31
RTN NZ

;STAGE_NO生成
PRE IX,STAGE_NO
LD $0,(IX+$31)
AD $0,&H30
PRE IX,MES_STAGE_NO
ST $0,(IX+$31)
;STAGE+NO表示
LD $10,10
LD $11,1
LD $12,6
LDW $13,MES_STAGE
CAL TEXT

PRE IX,L_PHASE
LD $15,(IX+$31)

PRE IX,L_PHASE_COUNTER
LD $1,(IX+$31)

LD $2,$31 ;COUNTER

PRE IZ,BUF

;PHASEが奇数なら消去処理へ移行(奇数なら)
ANC $15,$30
JR NZ,READYSTART_ERASE

RS_PHASE2:;START DISP
PRE IX,CHR_READY
SBC $15,$31
JR Z,READY_START_LOOP
PRE IX,CHR_START
READY_START_LOOP:
LD $0,(IX+$2)
ST $0,(IZ+$2)
AD $2,$30
SBC $2,$1
JR C,READY_START_LOOP
JR RSD_DRAW

READYSTART_ERASE:
RS_ERASE_LOOP:
LDW $15,0
STW $15,(IZ+$1)

RSD_DRAW:
;READY START ERASEの表示
LD $10,58
LD $11,24
LD $12,40
LDW $13,BUF

PHU $1
CAL GPRINT
PPU $1

;カウンター加算及びフェーズ移行判定
AD $1,2
PRE IX,L_PHASE_COUNTER
ST $1,(IX+$31)
SBC $1,40;READY_START_MAX
JR NC,END_RSD_PHASE
RTN

END_RSD_PHASE:
PRE IX,L_PHASE_COUNTER
ST $31,(IX+$31)
PRE IX,L_PHASE
AD (IX+$31),$30
LD $0,(IX+$31)
SBC $0,4
RTN C
PRE IX,READY_START_FLAG
;READY START 表示終了
ST $30,(IX+$31)
RTN

;*********************************
;*          TITLE_DISP
;*********************************
TITLE_DISP:

PRE IX,TITLE_BMP
PRE IZ,LEDTP0
PRE IY,TITLE_BMP_END-1
BUP

#if (USE_LIB=FAST_LIB)
#endif
#if (USE_LIB=NORMAL_G)
LD $10,23
LD $11,0
LD $12,8
LDW $13,MES_MODE_GPR
CAL TEXT
#endif
#if (USE_LIB=SUPER_GP)
LD $10,17
LD $11,0
LD $12,14
LDW $13,MES_MODE_SGPR
CAL TEXT
#endif

;DOTDS_FXを左8ドットを空白にしてしまうのでTITLE表示には使えない
LDW $28,DOTDS
CAL IOCS_CAL

;EXTRA_FLAG = WAIT_COUNTER
;EXTRA_COUNTER = X INC COUNTER

;WORKを初期化
PRE IZ,EXTRA_FLAG
LD $0,TITLE_WAIT
STI $0,(IZ+$31)
ST $31,(IZ+$31)

TITLE_DISP_LOOP:

PRE IZ,EXTRA_FLAG
SB (IZ+$31),$30
JR NC,ANYKEY_NO_REV
LD $0,TITLE_WAIT
ST $0,(IZ+$31)

PRE IZ,EXTRA_COUNTER
LD $0,(IZ+$31)
AD $0,$30
SBC $0,46
JR C,NOT_OVER
LD $0,$30
NOT_OVER:
ST $0,(IZ+$31)

;HIT_SPC_KEYの反転表示処理
;反転
LD $10,$0
AD $10,70;X START POSITION
LD $11,32;Y
LD $12,1;LENGTH
LD $13,&H7F;PTN
LD $15,&H20;XR

#if (USE_LIB=FAST_LIB)
CAL D_CPRINT_FILL
#else
CAL CPRINT_FILL
;DOTDS_FXは左8ドットを空白にしてしまうのでTITLE表示には使えない
LDW $28,DOTDS
CAL IOCS_CAL
#endif

ANYKEY_NO_REV:

LDW $28,INKEY
CAL IOCS_CAL
SBC $17,$31
JR Z,TITLE_DISP_LOOP
LD $0,($15)
SBC $0,&H44;"D"
CAL Z,SET_CONT_MODE
SBC $0,&H64;"d"
CAL Z,SET_CONT_MODE
SBC $0,&H52;"R"
CAL Z,SET_RETRY_MODE
SBC $0,&H72;"r"
CAL Z,SET_RETRY_MODE
TITLE_SPCKEY_CK:
SBC $0,&H20
JR NZ,TITLE_DISP_LOOP

CAL CLS
CAL DOTDS_FX
RTN

SET_RETRY_MODE:
PRE IZ,CONT_MODE
ST $31,(IZ+$31);CONTINUE->RETRY
RTN

SET_CONT_MODE:
PRE IZ,CONT_MODE
ST $30,(IZ+$31);RETRY->CONTINUE
RTN

;*********************************
;*        OPENING_TEXT
;*********************************
MES_SGPRINT:DB "SUPER GPRINT & LCDC CONTROL";27
MES_DEMO:DB "DEMO PROGRAM";
MES_REDFOX3:DB "RED FOX3"
MES_FOREX:DB "FOREX"

OPENING_TEXT:

LD $10,2
LD $11,$31;0
LD $12,27
LDW $13,MES_SGPRINT
#if (USE_LIB=FAST_LIB)
CAL D_TEXT
#else
CAL TEXT
#endif

LD $10,10
LD $11,1;2
LD $12,12
LDW $13,MES_DEMO
#if (USE_LIB=FAST_LIB)
LD $15,&H80;NORM
CAL D_TEXT
#else
CAL TEXT
#endif

LD $10,12
LD $11,2
LD $12,8
LDW $13,MES_REDFOX3
#if (USE_LIB=FAST_LIB)
LD $15,&H80;NORM
CAL D_TEXT
#else
CAL TEXT
#endif

LD $10,13
LD $11,3
LD $12,5
LDW $13,MES_FOREX
#if (USE_LIB=FAST_LIB)
LD $15,&H80;NORM
CAL D_TEXT
#else
CAL TEXT
#endif

RTN

;************************************
;*         WAIT_ANYKEYBREAK
;*
;*PARA  $0,$1    WAIT_COUNT
;*USE   MANY
;************************************
WAIT_ANYKEYBREAK:

WAIT_AKB_LOOP:
PHUW $1
LDW $28,INKEY
CAL IOCS_CAL
PPUW $0
SBC $17,$31
RTN NZ
SBW $0,$30
JR NC,WAIT_AKB_LOOP
RTN

;************************************
;*             WAIT
;*
;*PARA  $0,$1    WAIT_COUNT
;*USE   MANY
;************************************
WAIT:

WAIT_LOOP:
PHUW $1
LDW $28,INKEY
CAL IOCS_CAL
PPUW $0
SBW $0,$30
JR NC,WAIT_LOOP
RTN

;*********************************
;*          LOGO
;*********************************

LOGO_DATA:DB 0,8,128,24,33

VX4_X:DB 0
VX4_Y:DB 8
FX870P_X:DB 128
FX870P_Y:DB 24

CNT:DB 33

LOGO:

;初期化
PRE IX,LOGO_DATA
LDM $0,(IX+$31),5
PRE IZ,VX4_X
STM $0,(IZ+$31),5

CAL FILL_BLACK

LOGO_LOOP:

PRE IX,VX4_X
LDW $10,(IX+$31)
LD $12,64
LDW $13,FV_LINE0
CAL CPRINT

PRE IX,VX4_X
LDW $10,(IX+$31)
AD $11,8
LD $12,64
LDW $13,FV_LINE1
CAL CPRINT

PRE IX,FX870P_X
LDW $10,(IX+$31)
LD $12,64
LDW $13,FV_LINE2
CAL CPRINT

PRE IX,FX870P_X
LDW $10,(IX+$31)
AD $11,8
LD $12,64
LDW $13,FV_LINE3
CAL CPRINT

CAL FILL_BLACK_SIDE

CAL DOTDS_FX

LDW $28,INKEY
CAL IOCS_CAL

PRE IX,VX4_X
LD $0,2
AD (IX+$31),$0;VX4_X
SB (IX+2),$0;FX870P_X
SB (IX+4),$30;CNT

JP NZ,LOGO_LOOP

RTN

;*********************************
;*          FILL BLACK
;*********************************

BLACK:DB &HFF,&HFF,&HFF,&HFF,&HFF,&HFF,&HFF,&HFF,&HFF

FILL_BLACK:

PRE IX,BLACK
LDM $0,(IX+$31),8

LD $19,96
LD $20,8
PRE IX,LEDTP0

FB_LOOP:
STIM $0,(IX+$31),8
SB $19,1
JR NZ,FB_LOOP

RTN

;*********************************
;*          FILL BLACK SIDE
;*********************************
FILL_BLACK_SIDE:

PRE IX,BLACK
LDM $0,(IX+$31),8

LD $19,$31

FBS_LOOP:
PRE IX,LEDTP0
PRE IZ,LEDTP0+128
STM $0,(IX+$19),8
STM $0,(IZ+$19),8

PRE IX,LEDTP1
PRE IZ,LEDTP1+128
STM $0,(IX+$19),8
STM $0,(IZ+$19),8

PRE IX,LEDTP2
PRE IZ,LEDTP2+128
STM $0,(IX+$19),8
STM $0,(IZ+$19),8

PRE IX,LEDTP3
PRE IZ,LEDTP3+128
STM $0,(IX+$19),8
STM $0,(IZ+$19),8

AD $19,8
SBC $19,64
JR NZ,FBS_LOOP

RTN

;*********************************
;*          REDRAW_CHECK
;*********************************

REDRAW_CHECK:
PRE IX,REDRAW_SCORE
LDM $0,(IX+$31),3
SBC $0,$31
JR Z,REDRAW_CK_LIFE
PHUW $2
CAL DISP_SCORE
PPUW $1

REDRAW_CK_LIFE:
SBC $1,$31
JR Z,REDRAW_CK_BOMB
PHU $2
CAL DISP_LIFE
PPU $2

REDRAW_CK_BOMB:
SBC $2,$31
RTN Z
JP DISP_BOMB

;*********************************
;*          DISP_ALERT
;*********************************
;2本線と合成するためのバッファ、2本線を引くので8の時9BYTE目にも書き込むので1BYTE多めに確保)
MASK_BUF:DB 0,0,0,0,0,0,0,0,0;9BYTE

DISP_ALERT:
;DISP_ALERT_FLG=0なら戻る
PRE IX,DISP_ALERT_FLG
LD $0,(IX+$31)
SBC $0,$31
RTN Z
SBC $0,$30
JR Z,REAR_ALART

TOP_BOTTOM_ALART:
SB (IX+$30),$30;ALERT_COUNTER
JR C,TB_ALERT_END

LD $0,(IX+$30)
AN $0,3
BIU $0
BIU $0
BIU $0
LD $1,$31

;上段表示
PHUW $1
LD $10,0
LD $11,8
LD $12,8
LDW $13,CHR_ARROW_T1
ADW $13,$0
#if (USE_LIB=FAST_LIB)
LD $15,&H80;NORM TRANS
CAL D_CPRINT
#else
CAL CPRINT
#endif
PPUW $0

;下段表示
LD $10,0
LD $11,32
LD $12,8
LDW $13,CHR_ARROW_B1
ADW $13,$0
#if (USE_LIB=FAST_LIB)
LD $15,&H80;NORM TRANS
JP D_CPRINT;RTN
#else
JP CPRINT;RTN
#endif
;END

TB_ALERT_END:
ST $31,(IX+$31);アラートフラグを消す
LD $0,16
ST $0,(IX+$30);アラートカウンタを初期化する

;上段と下段に表示したアラートを消す
LD $10,0;X
LD $11,8;Y
CAL ERASE_ALERT
LD $10,0;X
LD $11,32;Y
JP ERASE_ALERT
;END

REAR_ALART:
SB (IX+$30),$30;ALERT_COUNTER
JR C,REAR_ALERT_END

LD $0,(IX+$30)
AN $0,3
BIU $0;2
BIU $0;4
BIU $0;8
BIU $0;16
LD $1,$31

LDW $13,CHR_ARROW_REAR01
ADW $13,$0

;上段表示
PHUW $14
LD $10,0;X
LD $11,16;Y
LD $12,8;LENGTH
#if (USE_LIB=FAST_LIB)
LD $15,&H80;NORM TRANS
CAL D_CPRINT
#else
CAL CPRINT
#endif
PPUW $13

;下段表示
LD $10,0;X
LD $11,24;Y
LD $12,8;LENGTH
LDW $0,8
ADW $13,$0
#if (USE_LIB=FAST_LIB)
LD $15,&H80;NORM TRANS
JP D_CPRINT;RTN
#else
JP CPRINT;RTN
#endif
;END

REAR_ALERT_END:
ST $31,(IX+$31);アラートフラグを消す
LD $0,16
ST $0,(IX+$30);アラートカウンタを初期化する

;上段と下段に表示したアラートを消す
LD $10,0;X
LD $11,16;Y
CAL ERASE_ALERT

LD $10,0;X
LD $11,24;Y
;JP ERASE_ALERT

ERASE_ALERT:
LD $12,8;LENGTH
LDW $13,CHR_WHITE;BMP ADRESS
#if (USE_LIB=FAST_LIB)
LD $15,&H80;NORM TRANS
CAL D_CPRINT;RTN
#else
CAL CPRINT;RTN
#endif
RTN

;*********************************
;*          DISP_FOREX
;*********************************

DISP_FOREX:

PRE IX,GPRINT_XMAX
LD $0,(IX+$31)
LD $1,&HC0
ST $1,(IX+$31)

LD $10,140
LD $11,8
LD $12,48
LDW $13,CHR_GAME_TITLE
PHU $0
CAL D_GPRINT
PPU $0
PRE IX,GPRINT_XMAX
ST $0,(IX+$31)

RTN

;*********************************
;*          DISP_SCORE
;*********************************
DISP_SCORE:

; "S:"
LD $10,23
LD $11,1
LD $12,2
LDW $13,MES_SCORE
#if (USE_LIB=FAST_LIB)
LD $15,&H80;NORM
CAL D_TEXT
#else
CAL TEXT
#endif

PRE IZ,SCORE
LDW $8,(IZ+$31); 得点表示
#if (USE_LIB=FAST_LIB)
LD $10,25
LD $11,1
CAL D_BTOB
#else
PRE IZ,EDTOP1+25
CAL BTOB
#endif

; "0"
LD $10,30       ;X
LD $11,1        ;Y
LD $12,1        ;1WORD
LDW $13,MES_ZERO
#if (USE_LIB=FAST_LIB)
LD $15,&H80;NORM
CAL D_TEXT
#else
CAL TEXT
LD $10,56
LD $11,63
CAL @DOTMK
#endif
RTN

;*********************************
;*          DISP_LIFE
;*********************************
DISP_LIFE:

LD $2,2
#if (USE_LIB=FAST_LIB)
CAL D_CLS_LCD2
#else
CAL CLS_LCD2
#endif


; "L:"
LD $10,23
LD $11,2
LD $12,2;8
LDW $13,MES_LIFE
#if (USE_LIB=FAST_LIB)
LD $15,&H80;NORM
CAL D_TEXT
#else
CAL TEXT
#endif

;LIFE BAR
LD $10,25
LD $11,2    ;LINE2
PRE IX,LIFE
LD $12,(IX+$31)
LDW $13,MES_LIFE_BAR
#if (USE_LIB=FAST_LIB)
LD $15,&H80;NORM
CAL D_TEXT
#else
CAL TEXT
#endif

RTN

;*********************************
;*          DISP_BOMB
;*********************************
DISP_BOMB:

LD $2,3
#if (USE_LIB=FAST_LIB)
CAL D_CLS_LCD2
#else
CAL CLS_LCD2
#endif


; "B:"
LD $10,23
LD $11,3
PRE IX,BOMB
LD $12,2
LDW $13,MES_BOMB
#if (USE_LIB=FAST_LIB)
LD $15,&H80;NORM
CAL D_TEXT
#else
CAL TEXT
#endif

;BOMB BAR
LD $10,25
LD $11,3    ;LINE3
PRE IX,BOMB
LD $12,(IX+$31)
LDW $13,MES_BOMB_BAR
#if (USE_LIB=FAST_LIB)
LD $15,&H80;NORM
CAL D_TEXT
#else
CAL TEXT
#endif

RTN

CLS_LCD2:

;WRITE ADRESS CALC

;$2*64+$2*128+LEDTP0
LD $3,$31

;Y座標から書き込みアドレスの加算分
DIUW $2;*16
BIUW $2;*32
BIUW $2;*64
LDW $4,$2
BIUW $2;*128
ADW $2,$4;$2*128+$2*64

;X座標(143固定)を加算する
LDW $0,143
ADW $0,$2

;VRAMのトップアドレスを加算する
LDW $2,LEDTP0
ADW $0,$2
;

PRE IZ,$0

;WHITE DATA READ
PRE IX,CHR_WHITE
LDM $10,(IX+$31),6

LD $0,8
LD $3,$31

CLS_LCD2_LOOP:
STM $10,(IZ+$3),6
AD $3,6
SB $0,$30
RTN Z

JR CLS_LCD2_LOOP


;*********************************
;*          PROLOGUE_DISP
;*********************************

MES_PROLOGUE1:
DB &Hb3,&Hc1,&Had,&Hb3,&Hb7,&Hde,&Hc2,&Hc8,&Hca;9
DB &Hb3,&Hc1,&Had,&Hb3,&Hc9,&Hd3,&Hd8,&Hc4,&H20,&Hd6,&Hca,&Hde,&Hda,&Hd9;14
DB &Hce,&Hbc,&Hc3,&Hde,&H20,&Hcd,&Hb2,&Hdc,&Hc6;9
DB &Hb8,&Hd7,&Hbc,&Hc3,&H20,&Hb2,&Hcf,&Hbc,&Hc0,&Ha1;10

MES_PROLOGUE2:
DB &Hb1,&Hd9,&Hc4,&Hb7,&H20,&Hb3,&Hc1,&Had,&Hb3,&Hc8,&Hbd,&Hde,&Hd0,&H20,&Hd8,&Hbd;16
DB &Hb1,&Hc5,&Hb8,&Hde,&Hcf,&H20,&Hc0,&Hc7,&Hb7,&H20,&Hcc,&Hb8,&Hdb,&Hb3,&Hc0,&Hc1,&Hb6,&Hde;18
DB &Hc3,&Ha6,&Hb8,&Hd0,&H20,&Hb3,&Hc1,&Had,&Hb3,&Hc9,&Hd3,&Hd8,&Hc6;13
DB &Hbe,&Hd2,&Hc3,&H20,&Hb7,&Hcf,&Hbc,&Hc0,&Ha1;16

MES_PROLOGUE3:
DB &Hb6,&Hdd,&Hbe,&Hde,&Hdd,&Hc5,&H20,&Hb7,&Hbc,&Had,&Hb3,&H20,&Hc0,&Hde,&Haf,&Hc0,&Hc9,&Hc3,&Hde;19
DB &Hb1,&Haf,&Hc4,&Hb2,&Hb3,&Hcf,&Hc6,&H20,&Hbd,&Hb1,&Hc5,&H20,&Hd4;13
DB &Hb6,&Hb8,&Hbc,&Hc3,&Hb2,&Hc0,&H20,&Hbc,&Hae,&Hb8,&Hd8,&Hae,&Hb3,&Ha6;14
DB &Hd6,&Hba,&Hc4,&Hde,&Hd8,&H20,&Hbb,&Hda,&Hcf,&Hbc,&Hc0,&Ha1;12

MES_PROLOGUE4:
DB &Hb7,&Hc2,&Hc8,&Hc0,&Hc1,&Hca,&H20,&Hb2,&Hbf,&Hb2,&Hc3,&Hde;12
DB &Hca,&Hdd,&Hb9,&Hde,&Hb7,&Hc9,&H20,&Hc0,&Hb2,&Hbe,&Hb2,&Ha6,&H20,&Hc4,&Hc4,&Hc9,&Hb4;17
DB &Hb3,&Hc1,&Had,&Hb3,&Hc9,&Hd3,&Hd8,&Hc9,&H20,&Hc0,&Hde,&Haf,&Hb6,&Hdd;14
DB &Hbb,&Hb8,&Hbe,&Hdd,&Ha6,&H20,&Hb5,&Hba,&Hc5,&Hb3,&Hc9,&Hc3,&Hde,&H20,&Hb1,&Haf,&Hc0,&Ha1;18


PROLOGUE_DISP:
CAL CLS
CAL PROLOGUE_DISP1
CAL DOTDS_FX
LDW $0,&HFFF
CAL WAIT_ANYKEYBREAK
SBC $17,0
JP NZ,TITLE
CAL CLS
CAL PROLOGUE_DISP2
CAL DOTDS_FX
LDW $0,&HFFF
CAL WAIT_ANYKEYBREAK
SBC $17,0
JP NZ,TITLE
CAL CLS
CAL PROLOGUE_DISP3
CAL DOTDS_FX
LDW $0,&HFFF
CAL WAIT_ANYKEYBREAK
SBC $17,0
JP NZ,TITLE
CAL CLS
CAL PROLOGUE_DISP4
CAL DOTDS_FX
LDW $0,&HFFF
CAL WAIT_ANYKEYBREAK
;
RTN

PROLOGUE_DISP1:
;PROLOGUE BMP(1/4)表示
LD $10,30
LD $11,8
LD $12,32
LDW $13,PROLOGUE01_BMP;32*32
CAL CPRINT

LD $10,30
LD $11,16
LD $12,32
LDW $13,PROLOGUE01_BMP+32;32*32
CAL CPRINT

LD $10,30
LD $11,24
LD $12,32
LDW $13,PROLOGUE01_BMP+32+32;32*32
CAL CPRINT

LD $10,30
LD $11,32
LD $12,32
LDW $13,PROLOGUE01_BMP+32+32+32;32*32
CAL CPRINT

LD $10,14
LD $11,0
LD $12,9
LDW $13,MES_PROLOGUE1
CAL TEXT

LD $10,14
LD $11,1
LD $12,14
LDW $13,MES_PROLOGUE1+9
CAL TEXT

LD $10,14
LD $11,2
LD $12,9
LDW $13,MES_PROLOGUE1+9+14
CAL TEXT

LD $10,14
LD $11,3
LD $12,10
LDW $13,MES_PROLOGUE1+9+14+9
CAL TEXT
RTN

PROLOGUE_DISP2:
;PROLOGUE BMP(2/4)表示
LD $10,21
LD $11,8
LD $12,56
LDW $13,PROLOGUE02_BMP;56*32
CAL CPRINT

LD $10,21
LD $11,16
LD $12,56
LDW $13,PROLOGUE02_BMP+56;56*32
CAL CPRINT

LD $10,21
LD $11,24
LD $12,56
LDW $13,PROLOGUE02_BMP+56+56;56*32
CAL CPRINT

LD $10,21
LD $11,32
LD $12,56
LDW $13,PROLOGUE02_BMP+56+56+56;56*32
CAL CPRINT

LD $10,14
LD $11,0
LD $12,16
LDW $13,MES_PROLOGUE2
CAL TEXT

LD $10,14
LD $11,1
LD $12,18
LDW $13,MES_PROLOGUE2+16
CAL TEXT

LD $10,14
LD $11,2
LD $12,13
LDW $13,MES_PROLOGUE2+16+18
CAL TEXT

LD $10,14
LD $11,3
LD $12,9
LDW $13,MES_PROLOGUE2+16+18+13
CAL TEXT
RTN

PROLOGUE_DISP3:
;PROLOGUE BMP(3/4)表示
LD $10,10
LD $11,8
LD $12,56
LDW $13,PROLOGUE03_BMP;56*32
CAL CPRINT

LD $10,10
LD $11,16
LD $12,56
LDW $13,PROLOGUE03_BMP+56;56*32
CAL CPRINT

LD $10,10
LD $11,24
LD $12,56
LDW $13,PROLOGUE03_BMP+56+56;56*32
CAL CPRINT

LD $10,10
LD $11,32
LD $12,56
LDW $13,PROLOGUE03_BMP+56+56+56;56*32
CAL CPRINT

LD $10,12
LD $11,0
LD $12,19
LDW $13,MES_PROLOGUE3
CAL TEXT

LD $10,12
LD $11,1
LD $12,13
LDW $13,MES_PROLOGUE3+19
CAL TEXT

LD $10,12
LD $11,2
LD $12,14
LDW $13,MES_PROLOGUE3+19+13
CAL TEXT

LD $10,12
LD $11,3
LD $12,12
LDW $13,MES_PROLOGUE3+19+13+14
CAL TEXT
RTN

PROLOGUE_DISP4:
;PROLOGUE BMP(4/4)表示
LD $10,0
LD $11,8
LD $12,80
LDW $13,PROLOGUE04_BMP;80*32
CAL CPRINT

LD $10,0
LD $11,16
LD $12,80
LDW $13,PROLOGUE04_BMP+80;80*32
CAL CPRINT

LD $10,0
LD $11,24
LD $12,80
LDW $13,PROLOGUE04_BMP+80+80;80*32
CAL CPRINT

LD $10,0
LD $11,32
LD $12,80
LDW $13,PROLOGUE04_BMP+80+80+80;80*32
CAL CPRINT

LD $10,14
LD $11,0
LD $12,12
LDW $13,MES_PROLOGUE4
CAL TEXT

LD $10,14
LD $11,1
LD $12,17
LDW $13,MES_PROLOGUE4+12
CAL TEXT

LD $10,14
LD $11,2
LD $12,14
LDW $13,MES_PROLOGUE4+12+17
CAL TEXT

LD $10,14
LD $11,3
LD $12,18
LDW $13,MES_PROLOGUE4+12+17+14
CAL TEXT
RTN

;*********************************
;*          STAGE_CLEAR
;*********************************

MES_ED1:
DB &Hbd,&Hcd,&Hde,&Hc3,&Hc9,&H20,&Hc3,&Hb7,&Ha6,&H20,&Hb9,&Hde,&Hb7,&Hca,&H20,&Hbc,&Hc3;17
DB &Hb3,&Hc1,&Had,&Hb3,&Hc9,&H20,&Hd3,&Hd8,&Hc9,&H20,&Hcd,&Hb2,&Hdc,&Ha6;14
DB &Hc4,&Hd8,&Hd3,&Hc4,&Hde,&Hbd,&H20,&Hba,&Hc4,&Hb6,&Hde,&H20,&Hc3,&Hde,&Hb7,&Hc0,&Ha1;17

MES_ED2:
DB &Hbf,&Hbc,&Hc3,&H20,&Hb7,&Hc2,&Hc8,&Hc0,&Hc1,&Hca;10
DB &Hcd,&Hb2,&Hdc,&Hc5,&H20,&Hcb,&Hcb,&Hde,&Ha6;9
DB &Hc4,&Hd8,&Hd3,&Hc4,&Hde,&Hbc,&Hc0,&H20,&Hc9,&Hc3,&Hde;11
DB &Hb1,&Haf,&Hc0,&Ha1;4

STAGE_CLEAR:

PRE IX,STAGE_NO
LD $0,(IX+$31)
SBC $0,STAGE_END
JR Z,ENDING
AD (IX+$31),$30
JP STAGE_START_INIT

ENDING:

CAL CLS
;ENDING BMP(1/2)表示
LD $10,10
LD $11,8
LD $12,64
LDW $13,ENDING01_BMP;64*32
CAL CPRINT

LD $10,10
LD $11,16
LD $12,64
LDW $13,ENDING01_BMP+64;64*32
CAL CPRINT

LD $10,10
LD $11,24
LD $12,64
LDW $13,ENDING01_BMP+64+64;64*32
CAL CPRINT

LD $10,10
LD $11,32
LD $12,64
LDW $13,ENDING01_BMP+64+64+64;64*32
CAL CPRINT

LD $10,14
LD $11,0
LD $12,17
LDW $13,MES_ED1
CAL TEXT

LD $10,14
LD $11,1
LD $12,14
LDW $13,MES_ED1+17
CAL TEXT

LD $10,14
LD $11,2
LD $12,17
LDW $13,MES_ED1+17+14
CAL TEXT

CAL DOTDS_FX

LDW $0,&H2FF
CAL WAIT

CAL HIT_ANYKEY

CAL CLS

;ENDING BMP(2/2)表示
LD $10,30
LD $11,8
LD $12,56
LDW $13,ENDING02_BMP;56*32
CAL CPRINT

LD $10,30
LD $11,16
LD $12,56
LDW $13,ENDING02_BMP+56;56*32
CAL CPRINT

LD $10,30
LD $11,24
LD $12,56
LDW $13,ENDING02_BMP+56+56;56*32
CAL CPRINT

LD $10,30
LD $11,32
LD $12,56
LDW $13,ENDING02_BMP+56+56+56;56*32
CAL CPRINT

LD $10,18
LD $11,0
LD $12,10
LDW $13,MES_ED2
CAL TEXT

LD $10,18
LD $11,1
LD $12,9
LDW $13,MES_ED2+10
CAL TEXT

LD $10,18
LD $11,2
LD $12,11
LDW $13,MES_ED2+10+9
CAL TEXT

LD $10,18
LD $11,3
LD $12,4
LDW $13,MES_ED2+10+9+11
CAL TEXT

CAL DOTDS_FX

LDW $0,&H2FF
CAL WAIT

CAL HIT_ANYKEY

CAL CLS

;Congratulations!の表示
LD $10,8
LD $11,1
LD $12,16
LDW $13,MES_CONGRA
CAL TEXT
CAL DOTDS_FX

LDW $0,&H3FF
CAL WAIT

CAL HIT_ANYKEY

JP RESULT_PROC

;*********************************
;*          GAME OVER
;*********************************
GAME_OVER:

;GAME OVERの表示
LD $10,7
LD $11,1
LD $12,12
LDW $13,MES_GAME_OVER
#if (USE_LIB=FAST_LIB)
LD $15,&H80;NORM
CAL D_TEXT
#else
CAL TEXT
#endif

;RETRYの表示
LD $10,7
LD $11,2
LD $12,12
LDW $13,MES_RETRY
#if (USE_LIB=FAST_LIB)
LD $15,&H80;NORM
CAL D_TEXT
#else
CAL TEXT
CAL DOTDS_FX
#endif

RETRY_LOOP:
LDW $28,INKEY
CAL IOCS_CAL
SBC $17,$31
JR Z,RETRY_LOOP
LD $0,($15)
SBC $0,&H59;"Y"
JR Z,PRE_RETRY
SBC $0,&H79;"y"
JR Z,PRE_RETRY
SBC $0,&H4E;"N"
JR Z,RESULT_PROC
SBC $0,&H6E;"n"
JR Z,RESULT_PROC
JR RETRY_LOOP

RESULT_PROC:
CAL RESULT_DISP

CAL HIT_ANYKEY

LDW $0,&H1FF
CAL WAIT

JP TITLE

PRE_RETRY:
;SCORE初期化
PRE IZ,SCORE
LDW $0,0
STW $0,(IZ+$31)
;LIFEを復活
PRE IX,LIFE
LD $0,6
ST $0,(IX+$31)
;BOMBを復活
PRE IX,BOMB
ST $0,(IX+$31)
;
;STAGEの最初からやり直す場合(RETRY)
;JP STAGE_START_INIT
;その場から続ける場合(CONTINUE)
;SCORE,LIFE,BOMBを再描画
CAL DISP_SCORE
CAL DISP_LIFE
CAL DISP_BOMB
JP CONTINUE

;********************************************
;*              BOSS MAIN ROUTINE
;********************************************

BOSS_MAIN:

;BOSS COREのデータをENEMY_DATA00に読み込ませるためオブジェクト配列を初期化する
CAL OBJECT_ARRAY_INI

;CAL BOSSx INIT
PRE IX,BOSS_INIT_ADR
LDW $28,(IX+$31)
CAL CAL_REG28

;フラグ、カウンターの初期化
PRE IX,EXTRA_FLAG
ST $31,(IX+$31)
PRE IX,EXTRA_COUNTER
ST $31,(IX+$31)
PRE IX,PHASE
ST $31,(IX+$31)
PRE IX,PHASE_COUNTER
ST $31,(IX+$31)
PRE IX,SECTION
ST $31,(IX+$31)
PRE IX,SECTION_COUNTER
ST $31,(IX+$31)

BOSS_LOOP:
CAL TRANS_MAP
;
;EH_JUDGEワークエリアの初期化
CAL INIT_JUDGE_DATA
;無敵状態をチェック
CAL CHECK_MUTEKI
;
;INSERT OBJECT DATA POINTER初期化
PRE IX,INSERT_OBJ_PT
ST $31,(IX+$31)
;
PRE IX,GUN_WAIT
SB (IX+$31),$31
JR Z,BOSS_GUN_NO_WAIT
SB (IX+$31),$30
BOSS_GUN_NO_WAIT:
PRE IX,BOMB_WAIT
SB (IX+$31),$31
JR Z,BOSS_BOMB_NOWAIT
SB (IX+$31),$30
JR NZ,BOSS_BOMB_NOWAIT
;BOMB WAITが0になったら、BOSS COREがBOMBに当たったフラグを下げる
PRE IX,BOMB_BOSS_HIT
ST $31,(IX+$31)
BOSS_BOMB_NOWAIT:

;PHASE:0 -> から回し中
;PHASE:1 -> 自機が所定の位置へ移動中
;PHASE:2 -> BOSSが所定の位置へ移動中
;PHASE:3 -> から回し中
;PHASE:4 -> BOSS戦
;PHASE:5 -> BOSS撃破

PRE IX,PHASE
LD $0,(IX+$31)
SBC $0,4
JR Z,BOSS_PHASE4

SBC $0,$31
JR Z,BOSS_PHASE0
SBC $0,$30
JR Z,BOSS_PHASE1
SBC $0,2
JR Z,BOSS_PHASE2
SBC $0,3
JR Z,BOSS_PHASE3

BOSS_PHASE0:
;から回し中
PRE IX,PHASE
AD (IX+$30),$30 ;PHASE_COUNTER+=1
LD $1,(IX+$30) ;PHASE_COUNTER
SBC $1,64
JR NZ,BOSS_PHASE_END
ST $30,(IX+$31) ;PHASE:0->1
;2025/10/21:Ver1.01 BUGFIX
;ST $31,(IZ+$30) ;PHASE_COUNTER->0
ST $31,(IX+$30) ;PHASE_COUNTER->0
JR BOSS_PHASE_END

BOSS_PHASE1:
;自機が所定の位置に到着したら自動的にPHASE->2に変更
CAL FIGHTER_STB_POS
JR BOSS_PHASE_END

BOSS_PHASE2:
;BOSSxが所定の位置に到着したら自動的にPHASE->3に変更
PRE IX,BOSS_PRE_ADR
LDW $28,(IX+$31)
CAL CAL_REG28
JR BOSS_PHASE_END

BOSS_PHASE3:
;から回し中
PRE IX,PHASE
AD (IX+$30),$30 ;PHASE_COUNTER+=1
LD $1,(IX+$30) ;PHASE_COUNTER
SBC $1,64
JR NZ,BOSS_PHASE_END
LD $0,4
ST $0,(IX+$31) ;PHASE:3->4
;2025/10/21:Ver1.01 BUGFIX
;ST $31,(IZ+$30) ;PHASE_COUNTER->0
ST $31,(IX+$30) ;PHASE_COUNTER->0
JR BOSS_PHASE_END

BOSS_PHASE4:
;CAL MOVE_BOSSx
PRE IX,BOSS_MOVE_ADR
LDW $28,(IX+$31)
CAL CAL_REG28

;
;CAL KEY_CHECK
PRE IX,MY_FIGHTER
LDW $10,(IX+$31)

;GAME OVER CHECK
PRE IX,GAME_OVER_FLAG
SBC (IX+$31),$31
JR Z,END_GAMEOVER_CKB
;GAME OVER時の余韻の処理
PRE IX,EXTRA_COUNTER
SB (IX+$31),$30
JP Z,GAME_OVER
END_GAMEOVER_CKB:

CAL IN_KEY

BOSS_PHASE_END:

CAL MOVE_GUN

CAL INSERT_OBJECT_ON
CAL MAKE_JUDGE_DATA
CAL JUDGE

;********* DISPLAY ROUTINE SECTION START
CAL DISP_SPARK

;CAL DISP_BOSSx
PRE IX,BOSS_DISP_ADR
LDW $28,(IX+$31)
CAL CAL_REG28

;PHASEが4未満なら警告を表示する
PRE IX,PHASE
LD $0,(IX+$31)
SBC $0,4
JR NC,NO_WARNING
;
;BRK KEY SMAPLING
LDW $28,INKEY
CAL IOCS_CAL
;
CAL DISP_WARNING
NO_WARNING:

CAL DISP_FIGHTER
CAL DISP_GUN
CAL REDRAW_CHECK

#if (USE_LIB=FAST_LIB)
CAL @DOTDS
#else
CAL DOTDS_FX
#endif


;********* DISPLAY ROUTINE SECTION END

PRE IX,GLOBAL_COUNTER
AD (IX+$31),$30

JP BOSS_LOOP

;********************************************
;*             BOSS_DEFEAT
;*           ボス撃破の余韻の部分
;*           ここはJPで呼び出される
;********************************************
WIPE_PTN:
DB &H80,&HC0,&HE0,&HF0,&HF8,&HFC,&HFE,&HFF
DB &H7F,&H3F,&H1F,&H0F,&H07,&H03,&H01,&H00

BOSS_DEFEAT:

;EXTRAカウントの初期化
PRE IX,EXTRA_COUNTER
ST $31,(IX+$31)
PRE IX,PHASE
STW $30,(IX+$31);PHASE=1,PHASE_COUNTER=0

;敵弾を消去する。管理テーブルが共用のためボスのパーツ数×16以降の領域のアクティブフラグをOFFにする
PRE IX,BOSS_DATA_NUM
LD $0,(IX+$31)
;$0を16倍する
DIU $0
PRE IZ,ENEMY_DATA
ENEMY_DATA_CLEAR:
ST $31,(IZ+$0)
AD $0,16
JR NC,ENEMY_DATA_CLEAR

;BOSS撃破時に加算された得点を表示
CAL REDRAW_CHECK

BOSS_DEFEAT_LOOP:

CAL REDRAW_FLAG_OFF

CAL TRANS_MAP

PRE IX,PHASE
LD $0,(IX+$31)

;STAGE CLEAR
PHU $0
SBC $0,3
CAL C,STAGE_CLEAR_DISP
PPU $0

;**********************************
;STAGE1では自機の高度を30以上にしない処理を行う
;***********************************
;削除
;PRE IX,STAGE_NO
;SBC (IX+$31),$30
;JR NZ,BOSS_DEF_CK_PH
;CAL MY_ALT_CHECK
;

BOSS_DEF_CK_PH:
SBC $0,1
JP Z,BOSS_DEFEAT_PH1;STOLL BOSS
SBC $0,2
JP Z,BOSS_DEFEAT_PH2;DISP MESSAGE
SBC $0,3
JP Z,BOSS_DEFEAT_PH3;FLY AWAY FIGHTER
SBC $0,4
JP Z,BOSS_DEFEAT_PH4;WIPE SCREEN
JP STAGE_CLEAR;JUMP STAGE_CLEAR
BOSS_DEF_PH_END:

PRE IX,GUN_WAIT
LD $0,(IX+$31)
SB $0,$30
JR C,S_BULLET_NO_WAIT
ST $0,(IX+$31)
S_BULLET_NO_WAIT:

CAL MOVE_GUN

;********* DISPLAY ROUTINE SECTION START

CAL DISP_SPARK
PRE IX,BOSS_DISP_ADR
LDW $28,(IX+$31)
CAL CAL_REG28
;
CAL DISP_FIGHTER
CAL DISP_GUN
CAL DISP_STOLL_SMOKE

#if (USE_LIB=FAST_LIB)
CAL @DOTDS
#else
CAL DOTDS_FX
#endif

CAL REDRAW_CHECK

;********* DISPLAY ROUTINE SECTION END

PRE IX,GLOBAL_COUNTER
AD (IX+$31),$30

JP BOSS_DEFEAT_LOOP

;***************************
;*     BOSS_DEFEAT
;*   STAGE_CLEAR_DISP
;***************************
STAGE_CLEAR_DISP:
;STAGE CLEARの表示
LD $10,6
LD $11,1
LD $12,12
LDW $13,MES_STAGE_CLEAR
#if (USE_LIB=FAST_LIB)
LD $15,&H80;NORM
CAL D_TEXT
#else
CAL TEXT
CAL DOTDS_FX
#endif
RTN

;***************************
;*     BOSS_DEFEAT
;*   GO TO NEXT STAGE DISP
;***************************
NEXT_STAGE_DISP:

LD $11,2;CPRINT Y

PRE IZ,STAGE_NO
LD $0,STAGE_END
SBC (IZ+$31),$0
JR Z,SET_ALL_ENEMY_DF

;STAGE CLEARの表示
LD $10,3
LD $12,18
LDW $13,MES_NEXT_STAGE
JR DISP_NEXT_STAGE

SET_ALL_ENEMY_DF:
LD $10,2
LD $12,19
LDW $13,MES_DEF_ENEMY

DISP_NEXT_STAGE:
#if (USE_LIB=FAST_LIB)
LD $15,&H80;NORM
CAL D_TEXT
#else
CAL TEXT
CAL DOTDS_FX
#endif

RTN

;***************************
;*    BOSS_DEFEAT_PH1
;*      STOLL BOSS
;***************************
BOSS_DEFEAT_PH1:

CAL IN_KEY

PRE IX,GLOBAL_COUNTER
LD $0,(IX+$31)
AN $0,&H03
JR NZ,BOSS_DEF_PH_END

;各ステージごとの処理
PRE IX,STAGE_NO
LD $0,(IX+$31)
SBC $0,1
CAL Z,BOSS_DEF_ST1
SBC $0,2
CAL Z,BOSS_DEF_ST2
SBC $0,3
CAL Z,BOSS_DEF_ST3
SBC $0,4
CAL Z,BOSS_DEF_ST4
SBC $0,5
CAL Z,BOSS_DEF_ST5

;$5=BOSS_DEF_STxの戻り値
SBC $5,$31
JP Z,BOSS_DEF_PH_END

PRE IX,PHASE
;PHASE=2
LD $0,2
ST $0,(IX+$31)
;SECTIONとSECTION_COUNTERはPHASE2でカウンター
;として利用するため、初期値の100を入れる
PRE IX,SECTION
LDW $0,50
STW $0,(IX+$31)
JP BOSS_DEF_PH_END

;***************************
;*    BOSS_DEFEAT_PH2
;*     DISP MESSAGE
;***************************
BOSS_DEFEAT_PH2:

CAL IN_KEY

CAL NEXT_STAGE_DISP

PRE IX,SECTION
SBW (IX+$31),$30
JP NZ,BOSS_DEFEAT_WAIT

END_BOSS_DEF_PH2:
PRE IX,PHASE
;PHASE=3
LD $0,3
ST $0,(IX+$31)
;SECTIONに自機のX,Y座標を保存する
PRE IX,MY_X
LDW $0,(IX+$31)
AD $1,4;Y座標を補正
PRE IX,SECTION
STW $0,(IX+$31)
CAL ALL_GUN_KILL
JP BOSS_DEF_PH_END

BOSS_DEFEAT_WAIT:

LD $0,12

BOSS_DEFWAIT_LP:
PHU $0
LD $10,0
LD $11,8
LD $12,8
LDW $13,CHR_WHITE
CAL GPRINT
PPU $0
SB $0,$30
JR NZ,BOSS_DEFWAIT_LP
JP BOSS_DEF_PH_END

;***************************
;*    BOSS_DEFEAT_PH3
;*   FLY AWAY FIGHTER
;***************************
BOSS_DEFEAT_PH3:

;自機のX座標+4
PRE IX,MY_X
LD $0,4
AD (IX+$31),$0
LD $28,(IX+$31)

;自機のX座標(MY_X)>148ならPHASE=3に移行
SBC $28,148
JR NC,END_BOSS_DEF_PH3

;PHASE3移行時に保存した自機の(X,Y)座標を読み込む
PRE IX,SECTION
LDW $10,(IX+$31)

;PHASE3移行時に保存した自機の(X,Y)から現在の自機の(X,Y)まで煙を描画する
BOSS_DEFEATPH3LP:

PHUW $11
LDW $13,@CHR_GUN
#if (USE_LIB=FAST_LIB)
CAL SGPRINT_4
#else
LD $12,8
CAL GPRINT
#endif
PPUW $10

AD $10,4
SBC $10,$28
JR C,BOSS_DEFEATPH3LP
JP BOSS_DEF_PH_END

END_BOSS_DEF_PH3:
PRE IX,PHASE
;PHASE=4
LD $0,4
ST $0,(IX+$31)
ST $31,(IX+$30);PHASE_COUNTER=0
JP BOSS_DEF_PH_END

;***************************
;*    BOSS_DEFEAT_PH4
;*     WIPE SCREEN
;***************************
BOSS_DEFEAT_PH4:

;MAKE_PTN & STORE
PRE IX,PHASE_COUNTER
LD $1,(IX+$31)

PRE IX,WIPE_PTN
LD $0,(IX+$1)
PHU $1
LD $15,&HA0;OR転送
CAL D_FILL_PTN
;WAIT
LDW $0,2048
BOSS_DEFPH4_LOOP:
SBW $0,$30
JR NC,BOSS_DEFPH4_LOOP

LDW $28,INKEY
CAL IOCS_CAL
PPU $1
AD $1,$30
;画面が真っ黒になったらBG画面をクリアする
SBC $1,7
JR NZ,BOSSDEFPH4_NOCLS
PHU $1
CAL BG_CLEAR
PPU $1
;
BOSSDEFPH4_NOCLS:
PRE IX,PHASE_COUNTER
ST $1,(IX+$31)
SBC $1,16
JP C,BOSS_DEF_PH_END
END_BOSS_DEF_PH4:
PRE IX,PHASE
;PHASE=5
LD $0,5
ST $0,(IX+$31)
ST $31,(IX+$30);PHASE_COUNTER=0
JP BOSS_DEF_PH_END

;***************************************
;*      DISP STOLL SMOKE
;***************************************

DSS_POINT_XY:DB 0,&HFD,8,8,&HFC,&HF8,12,0

DISP_STOLL_SMOKE:

PRE IX,GLOBAL_COUNTER
LD $0,(IX+$31)
ANC $0,&H01
RTN Z

AN $0,&H3
BIU $0
PRE IX,DSS_POINT_XY
LDW $2,(IX+$0)

PRE IX,ENEMY_DATA
LDW $10,(IX+$30)

SB $10,$2
SB $11,$3

PHUW $11
LD $12,16
LDW $13,BIG_SPARK
CAL GPRINT
PPUW $10
AD $11,8
LD $12,16
LDW $13,BIG_SPARK+16
CAL GPRINT

RTN

STOLL_SKIP:
STOLL_SMOKE0:
SBC $0,$31
JR NZ,STOLL_SMOKE1
LDW $13,CHR_SPARK1
JR STOLL_SMOKE_DISP
STOLL_SMOKE1:
SBC $0,$30
JR NZ,STOLL_SMOKE2
LDW $13,CHR_SPARK2
JR STOLL_SMOKE_DISP
STOLL_SMOKE2:
SBC $0,$30
JR NZ,STOLL_SMOKE3
LDW $13,CHR_SPARK3
JR STOLL_SMOKE_DISP
STOLL_SMOKE3:
LDW $13,CHR_SPARK4

STOLL_SMOKE_DISP:
LD $12,8
CAL GPRINT
RTN

;************************************
;*              JUDGE
;*             衝突判定
;************************************
JUDGE:
;GAME OVER中なら戻る
PRE IX,GAME_OVER_FLAG
SBC (IX+$31),$31
RTN NZ

CAL EH_JUDGE_BE ;高速衝突判定(自弾VS敵と敵弾)
CAL EH_JUDGE_FE ;高速衝突判定(自機VS敵と敵弾)
RTN

;************************************
;*          DISP_GUN
;*        MY GUN表示
;************************************
DISP_GUN:

LD $28,$31

DISP_GUN_LOOP:
PRE IX,GUN_DATA
LDM $9,(IX+$28),8
SBC $9,$31 ;0
JR Z,NEXT_GUN;PUT_MY_BULLET

PUT_MY_GUN:
SBC $9,$30
JR NZ,BOMB_DISP
LDW $13,@CHR_GUN
PHU $28
#if (USE_LIB=FAST_LIB)
CAL SGPRINT_4
#else
LD $12,8
CAL GPRINT
#endif
PPU $28
JR NEXT_GUN

BOMB_DISP:

;BOMBの飛ぶ方向に応じたキャラクタをセットする
SBC $9,3
JR Z,BOMB_DISP_R
LDW $13,SG_CHR_DATA01
JR END_BOMB_CHR_SET
BOMB_DISP_R:
LDW $13,SG_CHR_DATA02
END_BOMB_CHR_SET:
PHU $28
#if (USE_LIB=NORMAL_G)
CAL GPRINT
#endif
#if(USE_LIB=SUPER_GP)
CAL SGPRINT
#endif
#if(USE_LIB=FAST_LIB)
CAL SGPRINT_FAST
#endif
PPU $28

NEXT_GUN:
AD $28,GUN_STRUCT
SBC $28,GUN_STRUCT*MY_GUN_MAX
JR C,DISP_GUN_LOOP
RTN

;************************************
;*          WARNING 表示
;************************************
DISP_WARNING:
PRE IX,EXTRA
;8回目でないなら戻る
LD $0,(IX+$31) ;EXTRA_FLAG
LD $1,(IX+$30) ;EXTRA_COUNT
AD $1,$30
AN $1,&H07
ST $1,(IX+$30)
JR NZ,DISPLAY_WARNING
;7回目で点灯、消去フラグを反転する
INV $0
ST $0,(IX+$31)

DISPLAY_WARNING:
;点灯、消去を判定する。フラグが0なら戻る
SBC $0,$31
RTN Z

LD $10,40
LD $11,8
LD $12,64
LDW $13,CHR_WARNING0
CAL CPRINT

LD $10,40
LD $11,16
LD $12,64
LDW $13,CHR_WARNING1
CAL CPRINT

LD $10,40
LD $11,24
LD $12,64
LDW $13,CHR_WARNING2
CAL CPRINT

LD $10,40
LD $11,32
LD $12,64
LDW $13,CHR_WARNING3
CAL CPRINT

;BOSS NAME
LD $10,8
LD $11,2
LD $12,8
LDW $13,BOSS_NAME
;LD $15,&H80;NORM
;CAL D_TEXT
CAL TEXT

RTN

;************************************
;*   MOVE FIGHTER STANBY POSITION
;************************************

;BOSS1出現時に移動させる位置
STANDBY_X:EQU 16
STANDBY_Y:EQU 20

FIGHTER_STB_POS:

PRE IX,MY_FIGHTER
LDW $0,(IX+$31)

SBC $0,STANDBY_X
JR Z,Y_CHECK
JR C,MOVE_PLUS_X
SB $0,$30
JR END_MOVE_X
MOVE_PLUS_X:
AD $0,$30
END_MOVE_X:
ST $0,(IX+$31)
RTN

Y_CHECK:
SBC $1,STANDBY_Y
JR Z,NOW_ON_POSITION
JR C,MOVE_PLUS_Y
SB $1,$30
JR END_MOVE_Y
MOVE_PLUS_Y:
AD $1,$30
END_MOVE_Y:
ST $1,(IX+$30)
RTN

NOW_ON_POSITION:
PRE IX,PHASE
LD $0,2
ST $0,(IX+$31) ;PHASE1->2
ST $31,(IX+$30) ;PHASE_COUNTER->0
RTN

;******************************
;*          DISP_FIGHTER
;******************************

DISP_FIGHTER:
;GAME OVER中なら戻る
PRE IX,GAME_OVER_FLAG
SBC (IX+$31),$31
RTN NZ

PRE IX,MUTEKI_COUNTER
LD $0,(IX+$31)
SBC $0,$31
JR Z,FIGHTER_PUT
;無敵中でグローバルカウンタが偶数なら自機は表示しない
PRE IX,GLOBAL_COUNTER
LD $0,(IX+$31)
AN $0,&H01
RTN Z
FIGHTER_PUT:
PRE IX,MY_FIGHTER
LDM $10,(IX+$31),5
LDW $13,SG_CHR_DATA00;@CHR_FIGHTER ;DATA ADRESS
#if (USE_LIB=NORMAL_G)
CAL GPRINT
#endif
#if(USE_LIB=SUPER_GP)
CAL SGPRINT
#endif
#if(USE_LIB=FAST_LIB)
CAL SGPRINT_FAST
#endif
RTN

;******************************
;*     HIT_ANY_KEY
;******************************
HIT_ANYKEY:
HIT_ANYKEY_LOOP:
LDW $28,INKEY
CAL IOCS_CAL
SBC $17,$31
JR Z,HIT_ANYKEY_LOOP
RTN

;******************************
;*             IN_KEY(機種依存)
;*USE:
;*  $0    WORK
;*  $1    KEYスキャン用(IAレジスタ)
;*  $2    KEYスキャン用(KYレジスタ)
;*  $3    IAレジスタ退避用
;*  $10   MY_X
;*  $11   MY_Y
;*  IX    MY_X読み込み用インデックス
;*  IZ    ジャンプ、ステータス用インデックス
;******************************

IN_KEY:

;GAME OVER中なら戻る
PRE IX,GAME_OVER_FLAG
SBC (IX+$31),$31
RTN NZ

PRE IX,MY_FIGHTER
LDW $10,(IX+$31) ;X,Y

#if (MODEL=AI1000)
;IA退避
GST IA,$3
;"4”キー(左)
PST IA,8
GRE KY,$2
ANC $2,2                ;[4]キー？
JR NZ,SUB_LEFT          ;左

;"6”キー(右)
PST IA,9
GRE KY,$2
ANC $2,2                ;[6]右キー？
JR NZ,SUB_RIGHT         ;右

;"8”キー(上)
PST IA,&HB
GRE KY,$2
ANC $2,128              ;[8]上キー？
JR NZ,SUB_UP            ;上

;"2”キー(下)
PST IA,8
GRE KY,$2
ANC $2,4                ;[2]キー？
JR NZ,SUB_DOWN           ;下
JR END_MOVEKEY
#endif
#if (MODEL=FX870P)|(MODEL=VX4)|(MODEL=VX3)
GST IA,$3
;"4”キー(左)
LD $1,5                  ;5:FX-870P
PST IA,$1
GRE KY,$2
GRE KY,$2
SBC $2,4                ;4:BIT2 FX-870P
JR Z,SUB_LEFT           ;左

;"6”キー(右)
LD $1,7                 ;7:FX-870P
PST IA,$1
GRE KY,$2
GRE KY,$2
SBC $2,$30              ;1:BIT0 FX-870P
JR Z,SUB_RIGHT          ;右

;"8”キー(上)
LD $1,6                 ;6:FX-870P
PST IA,$1
GRE KY,$2
GRE KY,$2
SBC $2,2                ;1:BIT0 FX-870P
JR Z,SUB_UP             ;上

;"2”キー(下)
LD $1,8                 ;6:FX-870P
PST IA,$1
GRE KY,$2
GRE KY,$2
SBC $2,2                ;2:BIT1 FX-870P
JR Z,SUB_DOWN           ;下
JR END_MOVEKEY
#endif
SUB_LEFT:
SB $10,2
SBC $10,8
JR NC,END_MOVEKEY
LD $10,8
JR END_MOVEKEY

SUB_RIGHT:
AD $10,2
SBC $10,128
JR C,END_MOVEKEY
LD $10,128
JR END_MOVEKEY

SUB_UP:
SB $11,$30
SBC $11,4
JR NC,END_MOVEKEY
LD $11,4
JR END_MOVEKEY

SUB_DOWN:
AD $11,$30
SBC $11,34
JR C,END_MOVEKEY
LD $11,34

END_MOVEKEY:

STW $10,(IX+$31)

#if (MODEL=AI1000)
;"Q”キー(弾)
PST IA,2
GRE KY,$2
ANC $2,2                ;BIT1 AI-1000
JR NZ,SUB_GUN           ;GUN

;"W”キー(BOMB)
PST IA,2
GRE KY,$2
ANC $2,$30              ;BIT0 AI-1000
JR NZ,SUB_BOMB          ;BOMB

;"MENU”キー(中断)
PST IA,10
GRE KY,$2
ANC $3,64               ;64:BIT14 AI-1000
JR NZ,SUB_MODE
#endif
#if (MODEL=FX870P)|(MODEL=VX4)|(MODEL=VX3)
;"Q”キー(弾)
LD $1,4                 ;4:FX-870P
PST IA,$1
GRE KY,$2
GRE KY,$2
SBC $2,128              ;7:BIT1 FX-870P
JR Z,SUB_GUN            ;GUN

;"W”キー(BOMB)
LD $1,5                 ;5:FX-870P
PST IA,$1
GRE KY,$2
GRE KY,$2
SBC $2,128              ;7:BIT1 FX-870P
JR Z,SUB_BOMB           ;BOMB

;"MODE”キー(中断)
LD $1,3                  ;9:FX-870P
PST IA,$1
GRE KY,$2
GRE KY,$2
AN $3,64 ;KY14,15を読み込む場合、BIT8-13まではシステムが使用して値が不明なので必要な部分だけマスキングする
SBC $3,64               ;64:BIT14 FX-870P
JR Z,SUB_MODE
#endif

RTN

;******* "Q" KEY
SUB_GUN:
PRE IX,GUN_WAIT
LD $0,(IX+$31)
SBC $0,$31
RTN NZ
LD $0,$30 ;GUN
LD $1,$10 ;自機X
LD $2,$11 ;自機Y
LD $3,$30;GUN MODE
JP INSERT_GUN

SUB_BOMB:
PRE IX,BOMB_WAIT
SBC (IX+$31),$31
RTN NZ

;******* "W" KEY
LD $0,2   ;BOMB
LD $1,$10 ;自機X
LD $2,$11 ;自機Y
LD $3,2;BOMB MODE
JP INSERT_GUN

;******* MODE KEY
SUB_MODE:

PHUW $11
PHUW $13
PHUW $15

LD $10,10
LD $11,1
LD $12,8
LDW $13,MES_PAUSE
#if (USE_LIB=FAST_LIB)
LD $15,&H80;NORM
CAL D_TEXT
#else
CAL TEXT
#endif
;CAL TEXT

LD $10,2
LD $11,2
LD $12,20
LDW $13,MES_PUSH_A_KEY
#if (USE_LIB=FAST_LIB)
LD $15,&H80;NORM
CAL D_TEXT
#else
CAL TEXT
CAL DOTDS_FX
#endif

PPUW $14
PPUW $12
PPUW $10

BREAK_LOOP:
LDW $28,INKEY
CAL IOCS_CAL
SBC $17,$31
JR Z,BREAK_LOOP
LD $3,($15)
SBC $3,&H41  ; "A"キー
RTN Z
SBC $3,&H61  ; "a"キー
RTN Z
JR BREAK_LOOP

;******************************
;*       IN_KEY_STOP(機種依存)
;*          中断キーのみ判定
;*USE:
;*  $0    WORK
;*  $1    KEYスキャン用(IAレジスタ)
;*  $2    KEYスキャン用(KYレジスタ)
;*  $3    IAレジスタ退避用
;******************************

IN_KEY_STOP:

;IA退避
GST IA,$3

;"MODE”キー(中断)
LD $1,3                  ;9:FX-870P
PST IA,$1
GRE KY,$2
GRE KY,$2
AN $3,64 ;KY14,15を読み込む場合、BIT8-13まではシステムが使用して値が不明なので必要な部分だけマスキングする
SBC $3,64               ;64:BIT14 FX-870P
JP Z,SUB_MODE

RTN

;*********************************
;*        INSERT GUN
;*PARA:
;*      $0  TYPE(1:GUN 2:BOMB)
;*      $1  X
;*      $2  Y
;*      $3  MODE(0:GUN 1:BOMB)
;*USE:
;*      $17-$19 WORK
;*      IX
;*      IZ
;*********************************
INSERT_GUN:

SBC $3,2;BOMB MODE?
JR Z,BOMB_INSERT

;******** GUN INSERT ********
GUN_INSERT:
PRE IZ,GUN_POINTER
PRE IX,GUN_DATA

LD $19,(IZ+$31)
BIU $19             ;$19を8倍する
BIU $19
BIU $19

LD $18,(IX+$19)
SBC $18,$30
RTN Z

LD $17,(IZ+$31)
AD $17,$30          ;ADD POINTER
AN $17,&H07
ST $17,(IZ+$31)

AD $1,8 ;X座標を補正
AD $2,4 ;Y座標を補正
LD $3,4;X-LENGTH
LD $4,$30;Y-LENGTH
LD $7,$30;POWER
STM $0,(IX+$19),8
PRE IX,GUN_WAIT
LD $0,GUN_WAIT_MAX  ;GUN WAIT
ST $0,(IX+$31)
RTN

;******** BOMB INSERT ********
BOMB_INSERT:
;BOMBの残弾数が0なら戻る
PRE IX,BOMB
SBC (IX+$31),$31
RTN Z

;BOMBの弾数を減じる
SB (IX+$31),$30
;BOMB残弾数を再描画する
PRE IX,REDRAW_BOMB
ST $30,(IX+$31)

;        自機を(X,Y)とした時のBOMの初期値
;     1(X,Y-12)    *     *  5(X,Y-12)
; <-  2(X-4,Y-4) *  自機  *  6(X+4,Y-4) ->
;     3(X-4,Y+4) *       *  7(X+4,Y+4)
;     4(X,Y+12)    *    *   8(X,Y+12)
;

PRE IX,MY_FIGHTER
LDW $1,(IX+$31)

;GUN構造体(8BYTE)16個の内、0～7はGUN,8～15はBOMBで使用する予定だったが
;オブジェクトが増えて移動、描画、衝突判定に時間を要して遅くなったので0～7を使用
;発射中のGUNが消えるのは承知の上
PRE IZ,GUN_DATA
LD $3,8;X-LENGTH
LD $4,8;Y-LENGTH
LD $7,10;POWER

;BOMB1
LD $0,2;LEFT SIDE
;LD $1,$1
SB $2,12
STIM $0,(IZ+$31),8

BOMB5:
LD $0,3;RIGHT SIDE
STIM $0,(IZ+$31),8

BOMB8:
LD $0,3;RIGHT SIDE
AD $2,24
STIM $0,(IZ+$31),8

;BOMB4
LD $0,2;LEFT SIDE
STIM $0,(IZ+$31),8

;BOMB3
LD $0,2;LEFT SIDE
SB $1,4
SB $2,8
STIM $0,(IZ+$31),8

;BOMB2
LD $0,2;LEFT SIDE
SB $2,8
STIM $0,(IZ+$31),8

;BOMB6
LD $0,3;RIGHT SIDE
AD $1,8
STIM $0,(IZ+$31),8

;BOMB7
LD $0,3;RIGHT SIDE
AD $2,8
STM $0,(IZ+$31),8

;GUNとBOMBの発射禁止ウエイトをBOMBの長さに設定する。

LD $0,BOMB_WAIT_MAX
PRE IX,GUN_WAIT
ST $0,(IX+$31)
PRE IX,BOMB_WAIT
ST $0,(IX+$31)

RTN


;*********************************
;*        MOVE GUN
;* $19,COUNTER
;*********************************
MOVE_GUN:

LD $28,$31
PRE IX,GUN_DATA

MOVE_GUN_LOOP:

LDW $9,(IX+$28)
SBC $9,$31 ;0
JR Z,NEXT_M_GUN

SBC $9,2
JR Z,BOMB_L_MOVE

AD $10,4
SBC $10,136
JR C,M_GUN_XY_SAVE
LD $9,$31 ;DELETE OBJECT
JR M_GUN_XY_SAVE

BOMB_L_MOVE:
SB $10,4
SBC $10,5
JR NC,M_GUN_XY_SAVE
LD $9,$31 ;DELETE OBJECT

M_GUN_XY_SAVE:
STW $9,(IX+$28)

NEXT_M_GUN:
AD $28,GUN_STRUCT
SBC $28,GUN_STRUCT*MY_GUN_MAX
JR C,MOVE_GUN_LOOP
RTN

;*********************************
;*        INS ENEMY
;*PARA:
;*  $28         EVENT NO
;*USE:
;*  $0          INSERT OBJECTの成功/不成功の戻り値
;*  $10         シナリオカウンター
;*  $11,$12     シナリオポインター
;*  $13,$14
;*  $17-$26     ENEMY DATA WORK
;*  $27         INSERT OBJECTでも破壊
;*  $29         INSERT OBJECTの成功時のポインター
;*  IX          (INSERT OBJECTでも破壊)
;*********************************

INS_ENEMY:

PRE IX,NOW_SENARIO
LDW $11,(IX+$31)
LDW $13,0
SBCW $11,$13
RTN Z

PRE IZ,SCROLL_COUNTER
LD $10,(IZ+$31)

INS_ENEMY_LOOP:
PRE IX,$11

LD $0,(IX+$31)
SBC $0,&HFF
RTN Z
SBC $0,$10
RTN NZ

LDIM $17,(IX+$30),8
LDM $25,(IX+$31),2

LDW $13,11;シナリオデータ数(1+8+2)
ADW $11,$13
PRE IX,NOW_SENARIO
STW $11,(IX+$31)

CAL INSERT_OBJECT

JR INS_ENEMY_LOOP

;**********************************
;*              CALDIR
;*      敵から見た自機の方向を算出
;*
;*PARAMETER
;* $24   MY_X
;* $25   MY_Y
;* $26   ENEMY_X
;* $27   ENEMY_Y
;*USE REGISTER
;* $19   SUB_X,SUB_Y WORK
;* $20   WORK($26:ENEMY_X)
;* $21   WORK($27:ENEMY_Y)
;* $22   WORK($24:MY_X)
;* $23   WORK($25:MY_Y)
;*RETURN CODE
;* $5    $1に敵弾発射方向（10キーの4786321）
;************************************
CALDIR:
LDW $20,$26;ENEMY_X
LDW $22,$24;MY_X

AD $20,4;ENEMY_X
AD $21,4;ENEMY_Y
AD $22,4;MY_X
AD $23,4;MY_Y

CALDIR_X_CHECK:
SB $22,$20; MY_X-ENEMY_X
JR NC,CALDIR_Y_CHECK
CMP $22

CALDIR_Y_CHECK:
;SB $22,$20;自機と敵のX座標の絶対値の差を算出

SB $23,$21; MY_Y-ENEMY_Y
JR NC,CALC_ANGLE
CMP $23

CALC_ANGLE:
;SB $23,$21;自機と敵のY標の絶対値の差を算出

SUB_X:
LD $19,$22
SB $19,$23
JR C,SUB_Y
SB $19,$23
JR C,SUB_Y
SB $19,$23
JR NC,DIR46

SUB_Y:
LD $19,$23
SB $19,$22
JR C,DIR7931
SB $19,$22
JR C,DIR7931
SBC $19,$22
JR NC,DIR82

DIR7931:
SBC $24,$26
JR NC,DIR93;x方向左向きの斜め処理へ

;x方向左向きの斜め
DIR71:
SBC $25,$27
JR NC,DIR1
DIR7:
LD $5,7
RTN
DIR1:
LD $5,$30;1
RTN

;x方向右向きの斜め
DIR93:
SBC $25,$27
JR NC,DIR3
DIR9:
LD $5,9
RTN
DIR3:
LD $5,3
RTN

DIR82:
SBC $25,$27
JR NC,DIR2
DIR8:
LD $5,8
RTN
DIR2:
LD $5,2
RTN

DIR46:
SBC $24,$26
JR NC,DIR6

DIR4:
LD $5,4
RTN
DIR6:
LD $5,6
RTN

;***********************************
;*          MOVE BULLET
;*PARA: $9-$11      BULLET_NO,X,Y
;*      IX          ENEMY INDEX
;*      $28         ENEMY INDEX COUNTER
;*USE:  $0          WORK
;*      $1          WORK
;***********************************

MOVE_BULLET:

LD $1,$28
AD $1,BULLET_DIR

LD $0,(IX+$1)

SBC $0,4
JR Z,BULLET_DIR4
SBC $0,7
JR Z,BULLET_DIR7
SBC $0,8
JR Z,BULLET_DIR8
SBC $0,9
JR Z,BULLET_DIR9
SBC $0,6
JR Z,BULLET_DIR6
SBC $0,3
JR Z,BULLET_DIR3
SBC $0,2
JR Z,BULLET_DIR2

BULLET_DIR1:
SB $10,2
AD $11,$30
JR BULLET_AREA_CK

BULLET_DIR4:
SB $10,3
JR BULLET_AREA_CK

BULLET_DIR7:
SB $10,2
SB $11,$30
JR BULLET_AREA_CK

BULLET_DIR8:
SB $11,$30
JR BULLET_AREA_CK

BULLET_DIR9:
AD $10,2
SB $11,$30
JR BULLET_AREA_CK

BULLET_DIR6:
AD $10,3
JR BULLET_AREA_CK

BULLET_DIR3:
AD $10,2
AD $11,$30
JR BULLET_AREA_CK

BULLET_DIR2:
AD $11,$30

BULLET_AREA_CK:
;X AREA
SBC $10,8
JP C,DELETE_OBJECT
SBC $10,128
JP NC,DELETE_OBJECT
;Y AREA
SBC $11,8
JP C,DELETE_OBJECT
SBC $11,38
JP NC,DELETE_OBJECT

;DATA SAVE & MAKE JUDGE DATA
STM $9,(IX+$28),3
RTN

;*********************************
;*        INSERT BULLET
;*PARA: $5      -   BULLET DIR
;*      $10     -   ENEMY_X
;*      $11     -   ENEMY_Y
;*USE:
;*      $17-$26 -   WORK
;*      $27     -   INSERT_OBJECT USE
;*      $29     -   INSERT_OBJECT USE
;*      IX      -   INSERT_OBJECT USE
;*********************************

BULLET_DATA:
DB 8,0,0,1,1,0,0,&H00,0,1

INSERT_BULLET:
PRE IX,BULLET_DATA
LDIM $17,(IX+$31),8
LD $18,$10
LD $19,$11
LD $22,$5
LDM $25,(IX+$31),2
JR INSERT_OBJECT

;*********************************
;*       OBJECT_ARRAY INIT
;*********************************
OBJECT_ARRAY_INI:
;OBJECT_ARRAY初期化
PRE IX,OBJECT_ARRAY
LD $0,15
LD $1,$31
OBJECT_ARRAY_INL:
ST $1,(IX+$0)
AD $1,16
SB $0,$30
JR NC,OBJECT_ARRAY_INL

;OBJECT_POINTER初期化
LD $0,&H0F
ST $0,(IX+16)
RTN

;*********************************
;*       INSERT OBJECT
;*PARAMETER:
;*  $17～$24,$25～$26 オブジェクトのパラメータ
;*  各ステージ開始前は必ず呼ぶこと
;*注意:このサブルーチンでは$9～$16は絶対使用禁止
;*
;*
;*　従来はENEMY STRUCTの範囲をループしてCHR NO=0
;*の場所にオブジェクトを挿入していたが、これだと検索に時間が
;*かかる。特に全部(16オブジェクトが使用中)の時には無駄な
;*検索処理が無視できなくなるほど大きくなる。
;*　これを防止するため、オブジェクトを挿入可能なスロットNO
;*をOBJECT_ARRAYに設定しておき、OBJECT_POINTERで
;*挿入可能なスロットの場所を明示する方法をとる方式にした。
;* OBJECT_POINTERが&H0Fの場合は全スロット空き、
;*&HFFの場合は全スロット使用中となる。
;*
;*挿入手順：
;* INSERT_OBJECTでOBJECT_POINTERが示す
;*OBJECT_ARRAYのスロットにオブジェクトを挿入して
;*OBJECT_POINTERを1減じる。
;*削除手順
;* DELETE_OBJECTでOBJECT_POINTERを1加算して、削除された
;*スロット番号の値をOBJECT_ARRAYに格納する。
;*
;*USE:
;*  $0          ワーク
;*  $1          ワーク
;*  $27         オブジェクト番号退避用
;*  $28         ワーク
;*  $29         WORK
;*  IX          ENEMY DATA ADRESS
;RTN CODE:
;*  $0          0:SUCCESS 1:ABNORMAL
;*  $29         OBJECT POINTER
;*********************************

OBJECT_ARRAY:
DB 240,224,208,192,176,160,144,128,112,96,80,64,48,32,16,0
OBJECT_POINTER:
DB 15

INSERT_OBJECT:
LD $0,$30;
LD $29,$31
PRE IX,ENEMY_DATA
;

PRE IZ,OBJECT_ARRAY
LD $1,(IZ+16);OBJECT_POINTER
SBC $1,&HFF;-1
RTN Z

LD $29,(IZ+$1)
LD $1,16
SB (IZ+$1),$30

LD $27,$17
LD $17,&HFF
STIM $17,(IX+$29),8
STM $25,(IX+$31),3
LD $17,$27;連続して同じキャラクタを登録する場合があるので、&HFFにしたキャラ番号を戻す

PRE IZ,INSERT_OBJ_PT
LD $0,(IZ+$31)
LD $27,2
AD (IZ+$31),$27;INSERT_OBJ_PT+=2
PRE IZ,INSERT_OBJ_DATA
PHU $28
;$28:CHARACTOR_No,$29:DATA POINTER
LD $28,$17
STW $28,(IZ+$0)
LD $0,$31
PPU $28
RTN

;*********************************
;*       DELETE OBJECT
;*PARAMETER:
;*  $28   ENEMY_DATA INDEX
;:USE:
;*  IZ    OBJECT_ARRAY ADRESS
;*********************************

DELETE_OBJECT:
PHUW $1;$0,$1
GRE IX,$0
PHUW $1;IX
PRE IX,ENEMY_DATA
PRE IZ,OBJECT_ARRAY
LD $0,16
AD (IZ+$0),$30
LD $1,(IZ+$0)
ST $28,(IZ+$1)
ST $31,(IX+$28) ;アクティブフラグを消す
PPUW $0;IX
PRE IX,$0
PPUW $0;$0,$1
RTN

;*********************************
;*       INSERT OBJECT ON
;* INSERT OBJECTを行ったオブジェクトを実体化する
;*********************************
INSERT_OBJECT_ON:

;INSERT_OBJ_PT=0なら新規追加オブジェクトが無いので戻る
PRE IX,INSERT_OBJ_PT
SBC (IX+$31),$31
RTN Z
;
LD $2,(IX+$31)
LD $3,2;2(固定値)
SB $2,$3
;
PRE IX,INSERT_OBJ_DATA
PRE IZ,ENEMY_DATA

INSOBJON_LOOP:

LDW $0,(IX+$2);$0:CHARACTOR_No,$1:DATA POINTER
ST $0,(IZ+$1)

SB $2,$3
JR NC,INSOBJON_LOOP
RTN



;*****************************
;IOCS_CAL(機種依存)
;PARAMETER
; $28,$29 CALL IOCS ADRESS
;*****************************
IOCS_CAL:
PST UA,&H54
JP IOCS
RTN

;*****************************
;CAL REG28
;PARAMETER
; $28,$29 CALL ADRESS(BANK1 ONLY)
;*****************************
CAL_REG28:
JP $28

;*********************************
;*       EXIT(DEBUG)
;*********************************
EXIT:
PST UA,&H54 ;**************(機種依存)
RTN

;*********************************
;*       WORK_AREA_CLEAR
;*********************************
WORK_AREA_CLEAR:

;RXCNT(ENEMY_DATA)
LDW $0,RXCNT;&H1559
LDW $2,&H0FF
LDW $28,CLEME
CAL IOCS_CAL

;FDDBF
LDW $0,FDDBF;&H1793
LDW $2,&H0FF
LDW $28,CLEME
CAL IOCS_CAL

;CALC(SCENARIO)
LDW $0,CALC;&H18D3
LDW $2,&H0FF
LDW $28,CLEME
CAL IOCS_CAL

;IOBUF(GUN_STRUCT,SPARK_STRUCT)
LDW $0,IOBUF;&H19D5
LDW $2,&H0FF
LDW $28,CLEME
CAL IOCS_CAL

;STAT_DATA(JUMP_TABLE_MOVE,JUMP_TABLE_DISP)

;
LDW $28,CLEDB
CAL IOCS_CAL
RTN


;*******************************
;*         INS SPARK
;*
;*PARA: $10     X
;*      $11     Y
;*USE:  $9      COUNTER
;*      $12     CHARACTOR LENGTH(8)
;*      $13     SPARK_POINTER MATH
;*      IX      SPARK_POINTER
;*      IZ      SPARK_DATA
;*******************************
INS_SPARK:
PRE IX,SPARK_POINTER
PRE IZ,SPARK_DATA
LD $13,(IX+$31)
AN $13,SPARK_MAX
LD $9,3
LD $12,8
STM $9,(IZ+$13),4
AD (IX+$31),$12
RTN

;*******************************
;*         DISP SPARK
;*
;*USE:  $9      COUNTER
;*      $12     CHARACTOR LENGTH(8)
;*      $13     SPARK_POINTER
;*******************************
DISP_SPARK:

PRE IX,SPARK_DATA
LD $28,$31

DISP_SPARK_LOOP:
;
PHU $28
;
LDM $9,(IX+$28),4
SBC $9,$31
JR Z,NEXT_SPARK

;SELECT SPARK GRAPHIC
SPARK_G01:
SBC $9,3
JR NZ,SPARK_G02
LDW $13,CHR_SPARK1
JR END_SELECT_SPARK
SPARK_G02:
SBC $9,2
JR NZ,SPARK_G03
LDW $13,CHR_SPARK2
JR END_SELECT_SPARK
SPARK_G03:
LDW $13,CHR_SPARK2

END_SELECT_SPARK:
PHU $9
CAL GPRINT
PPU $9
SB $9,$30
PRE IX,SPARK_DATA
ST $9,(IX+$28)

NEXT_SPARK:
;
PPU $28
;
AD $28,SPARK_STRUCT
SBC $28,SPARK_STRUCT*SPARK_MAX
JR C,DISP_SPARK_LOOP
RTN

;*******************************
;*      INIT_JUDGE_DATA
;*USE:  IX
;*******************************

INIT_JUDGE_DATA:
PRE IX,JUDGE_LEFT_MATH
STI $31,(IX+$31)
STI $31,(IX+$31)
ST $31,(IX+$31)
RTN

;*******************************
;*      MAKE_JUDGE_DATA
;*
;*PARA: $10 ENEMY_X
;*      $28 ENEMY POINTER
;*
;*USE:
;*      $0      ENEMY_X + ENEMY_X_LENGTH
;*      $1
;*      $2      WORK
;*      $8      2(固定)
;*      $9-$16  ENEMY DATA
;*      $20 -   LEFT,CENTER,RIGHT POINTER
;*      $21 -   0:LEFT 1:CENTER 2:RIGHT
;*      $22 -   ENEMY_X($10)-8
;*      $29     調整済みX-LENGTH
;*      IX  -   JUDGE AREA INDEX
;*      IZ  -   JUDGE AREA INDEX
;*******************************

MAKE_JUDGE_DATA:

LD $28,$31
LD $8,2

MAKE_JUDGE_LOOP:

PRE IX,ENEMY_DATA
LDM $9,(IX+$28),8

;***************************
;* キャラ番号<8は衝突判定対象外
;***************************
SBC $9,8
JP C,NEXT_MAKE_JUDGE

LD $0,$10
LD $29,$12

;X+X_LENGTH>&HFFなら長さ調節する
ADC $0,$29;$0:ENEMY_X $12:X-LENGTH
JR NC,MAKE_JUDGEXLENNC
LD $29,&HF8
JR MAKE_JUDGEXLENED
MAKE_JUDGEXLENNC:
AD $29,$0;X+X_LENGTH
MAKE_JUDGEXLENED:
;************************
;* JUDGE DATA SAVE AREA SELECT
;************************
SBC $10,JUDGE_LC
JR C,JUDGE_AREA_LEFT

SBC $10,JUDGE_CR
JR C,JUDGE_AREA_CNTR

;************************
;*      RIGHT
;************************
JUDGE_AREA_RIGHT:
LD $21,2;RIGHT
PRE IZ,JUDGE_RIGT_MATH
PRE IX,JUDGE_RIGHT
CAL SAVE_JUDGE_DATA
JR ACROSS_CHECK

;************************
;*      CENTER
;************************
JUDGE_AREA_CNTR:
LD $21,$30;CENTER
PRE IZ,JUDGE_CNTR_MATH
PRE IX,JUDGE_CENTER
CAL SAVE_JUDGE_DATA
;CENTERとRIGHTを跨いでいたらRIGHTにも登録
SBC $29,JUDGE_CR
JR C,ACROSS_CHECK
LD $21,2;RIGHT
PRE IZ,JUDGE_RIGT_MATH
PRE IX,JUDGE_RIGHT
CAL SAVE_JUDGE_DATA
LD $21,$30;CENTER
JR ACROSS_CHECK
;
;************************
;*      LEFT
;************************
JUDGE_AREA_LEFT:
LD $21,$31;LEFT
PRE IZ,JUDGE_LEFT_MATH
PRE IX,JUDGE_LEFT
CAL SAVE_JUDGE_DATA
;LEFTとCENTERを跨いでいたらCENTERにも登録
SBC $29,JUDGE_LC
JR C,NEXT_MAKE_JUDGE
LD $21,$30;CENTER
PRE IZ,JUDGE_CNTR_MATH
PRE IX,JUDGE_CENTER
CAL SAVE_JUDGE_DATA
LD $21,$31;LEFT
;CENTERとRIGHTを跨いでいたらRIGHTにも登録
SBC $29,JUDGE_CR
JR C,NEXT_MAKE_JUDGE
LD $21,2;RIGHT
PRE IZ,JUDGE_RIGT_MATH
PRE IX,JUDGE_RIGHT
CAL SAVE_JUDGE_DATA
;LD $21,$31;LEFT
;LEFTの場合は境界線の左側の判定は行わない
JR NEXT_MAKE_JUDGE

;ENEMYがCENTER,RIGHTにいて境界線(LC,RC)-8<ENEMY_X<境界線(LC,RC)
;の場合、左側(CENTERならLEFT,RIGHTならCENTER)にも登録

ACROSS_CHECK:

;ACROSS_CHECK(境界左側-8以内)判定用
LD $22,$10
SB $22,8

;LEFT?
SBC $21,$31
JR Z,NEXT_MAKE_JUDGE

;CENTER?
SBC $21,$30
JR Z,ACROSS_LC

ACROSS_RC:
SBC $22,JUDGE_CR
JR NC,NEXT_MAKE_JUDGE
PRE IZ,JUDGE_CNTR_MATH
PRE IX,JUDGE_CENTER
JR SAVE_JUDGE_DATA2

ACROSS_LC:
SBC $22,JUDGE_LC
JR NC,NEXT_MAKE_JUDGE
PRE IZ,JUDGE_LEFT_MATH
PRE IX,JUDGE_LEFT

SAVE_JUDGE_DATA2:
LD $20,(IZ+$31)
STW $28,(IX+$20)
AD (IZ+$31),$8

NEXT_MAKE_JUDGE:
AD $28,ENEMY_STRUCT
JP NC,MAKE_JUDGE_LOOP

RTN

SAVE_JUDGE_DATA:
LD $20,(IZ+$31)
STW $28,(IX+$20)
AD (IZ+$31),$8
RTN

;*******************************
;*                    EH_JUDGE_FE(自機と敵の衝突判定)
;*
;*USE:  $0-$7   WORK/FIGHTER:X,Y,LENGTH(8),POW,LIFE
;*      $8      2(固定)
;*      $9-$16  ENEMY:ACTIVE,X,Y,LENGTH_X,LENGTH_Y
;*      $17     敵を撃破した時のSCORE
;*      $18     DAMAGE(敵が自機に与えるダメージ)
;*      $19     COUNTER LOAD JUDGE_LEFT/CENTER/RIGHT MAX
;*      $20     ENEMY X+8
;*      $21     ENEMY Y+8
;*      $22     BULLET X+8
;*      $23     BULLET Y+8
;*      $24     ENEMY POINTER
;*      $25     計算済みX+X_LENGTH
;*      $26,$27 JUDGE_LOW/HIGH ADRESS
;*      $29     COUNTER LOAD JUDGE_LEFT/CENTER/RIGHT(ENEMY)
;*      IX
;*      IZ
;*******************************

EH_JUDGE_FE:

;無敵状態なら自機弾と敵の衝突判定は行わない
PRE IX,MUTEKI_COUNTER
LD $0,(IX+$31)  ;$0=WORK
SBC $0,$31      ;$0=WORK
RTN NZ

PRE IX,MY_FIGHTER
LDM $0,(IX+$31),5

;自機の衝突判定領域
; X+1< 命中 <X+(8-1):横は1ドット分は衝突無効
; Y+2< 命中 <Y+(8-2):縦は2ドット分は衝突無効
LD $22,$0
LD $23,$1
AD $0,1;X1=X+1
AD $1,2;Y1=Y+2
AD $22,7;X2=X+7
AD $23,6;Y2=Y+6

SBC $0,JUDGE_LC
JR C,@JUDGE_LEFT_AREA

SBC $0,JUDGE_CR
JR C,@JUDGE_CNTR_AREA

@JUDGE_RIGT_AREA:
PRE IZ,JUDGE_RIGT_MATH
LD $19,(IZ+$31)  ;JUDGE_LOW_MATH
LDW $26,JUDGE_RIGHT
JR @PREPARE_JLOOP_E

@JUDGE_CNTR_AREA:
PRE IZ,JUDGE_CNTR_MATH
LD $19,(IZ+$31)  ;JUDGE_HIGH_MATH
LDW $26,JUDGE_CENTER
JR @PREPARE_JLOOP_E

@JUDGE_LEFT_AREA:
PRE IZ,JUDGE_LEFT_MATH
LD $19,(IZ+$31)  ;JUDGE_LOW_MATH
LDW $26,JUDGE_LEFT

@PREPARE_JLOOP_E:

;エリアの敵が0なら次の自弾と敵との衝突判定
SBC $19,$31
RTN Z

LD $29,$31
LD $8,2

@EH_JUDGE_LOOP_E:

PRE IZ,ENEMY_DATA
PRE IX,$26

;$24=POINTER $25=計算済みX+X_LENGTH
LDW $24,(IX+$29)

LDIM $9,(IZ+$24),8
LDM $17,(IZ+$31),2

;EH_JUDGEの衝突処理で消された敵との重複当たり判定防止
SBC $9,$31
JR Z,@NEXT_JUDGE_E

LD $20,$25
LD $21,$11
AD $21,$13 ;ENEMY_Y+ENEMY_LENGTH_Y

;弾が敵に当たらない条件
;EX2($20)<FX1($0)=$0-$20>=0
;EX1($10)>FX2($22)=$10-$22>=0
;EY2($21)<FY1($1)=$1-$21>=0
;EY1($11)>FY2($23)=$11-$23>=0

SBC $0,$20
JR NC,@NEXT_JUDGE_E ;範囲外
SBC $10,$22
JR NC,@NEXT_JUDGE_E ;範囲外
SBC $1,$21
JR NC,@NEXT_JUDGE_E ;範囲外
SBC $11,$23
JR NC,@NEXT_JUDGE_E ;範囲外

;***************************
;*        HIT
;***************************

;自機のX,Yの位置で爆発を発生させる
LD $10,$0
SB $10,2
LD $11,$1
CAL INS_SPARK

;LIFEの再描画フラグをONにする
PRE IX,REDRAW_LIFE
ST $30,(IX+$31)

;自機のLIFEを減じる
PRE IX,LIFE
SB (IX+$31),$18
JR Z,PRE_GAME_OVER
JR C,PRE_GAME_OVER
JR SET_MUTEKI

;オーバーの処理へ移行
PRE_GAME_OVER:
;LIFE0表示
ST $31,(IX+$31);LIFEがマイナスになる場合があるのでLIFE=0にする
CAL DISP_LIFE
;スタック解放
;PPSW $0 ;EH_JUDGE_FEのスタック開放
;PPSW $0 ;COLLISION_DETECTのスタック開放

;GAME_OVER処理
PRE IX,GAME_OVER_FLAG
ST $30,(IX+$31)
PRE IX,EXTRA_COUNTER
LD $0,32
ST $0,(IX+$31)
RTN
;JP GAME_OVER

SET_MUTEKI:;無敵状態にする
PRE IZ,MUTEKI_COUNTER
LD $0,MUTEKI_MAX
ST $0,(IZ+$31)
RTN

@NEXT_JUDGE_E:
AD $29,$8;2(固定)
SBC $29,$19
JR C,@EH_JUDGE_LOOP_E

RTN

;*******************************
;*                    EH_JUDGE_BE(自機弾と敵の衝突判定)
;*
;*USE:  $0-$7   GUN:ACTIVE,X,Y,LENGTH
;*      $8
;*      $9-$16  ENEMY_DATA:ACTIVE,X,Y,LENGTH_X,LENGTH_Y....
;*      $17-$18 ENEMY_DATA:SCORE,DAMAGE
;*      $19     COUNTER LOAD JUDGE_LEFT/CENTER/RIGHT MAX
;*      $20     ENEMY X+8
;*      $21     ENEMY Y+8
;*      $22     GUN X+8
;*      $23     GUN Y+8
;*      $24     ENEMY POINTER
;*      $25     計算済みX+X_LENRTH
;*      $26,$27 JUDGE_LOW/HIGH ADRESS
;*      $28     BULLET POINTER
;*      $29     COUNTER LOAD JUDGE_LEFT/CENTER/RIGHT(ENEMY)
;*******************************

EH_JUDGE_BE:

LD $28,$31
LD $8,2

EH_JUDGE_LOOP_B:

PRE IX,GUN_DATA
LDM $0,(IX+$28),8
SBC $0,$31
JP Z,NEXT_JUDGE_B

LD $22,$1
LD $23,$2
AD $22,8;$3 ;GUN_X LENGTH=4,BOMB=8
AD $23,$4 ;GUN_Y LENRTH=1,BOMB=8

;自弾が敵弾をすり抜けることがあるので、自弾(GUN,BOMB)のY座標の命中範囲を±1広げる。
SB $2,$30
AD $23,$30
;

SBC $1,JUDGE_LC
JR C,JUDGE_LEFT_AREA

SBC $1,JUDGE_CR
JR C,JUDGE_CNTR_AREA

JUDGE_RIGT_AREA:
PRE IZ,JUDGE_RIGT_MATH
LD $19,(IZ+$31)
LDW $26,JUDGE_RIGHT
JR PREPARE_JLOOP_E

JUDGE_CNTR_AREA:
PRE IZ,JUDGE_CNTR_MATH
LD $19,(IZ+$31)
LDW $26,JUDGE_CENTER
JR PREPARE_JLOOP_E

JUDGE_LEFT_AREA:
PRE IZ,JUDGE_LEFT_MATH
LD $19,(IZ+$31)
LDW $26,JUDGE_LEFT

PREPARE_JLOOP_E:

;エリアの敵が0なら次の自弾と敵との衝突判定
SBC $19,$31
JR Z,NEXT_JUDGE_B

LD $29,$31

EH_JUDGE_LOOP_E:

PRE IZ,ENEMY_DATA
PRE IX,$26

LDW $24,(IX+$29);$24:POINTER $25:X+X-LENGTH

;ENEMY DATA LOAD
LDIM $9,(IZ+$24),8
LD $17,(IZ+$31)

LD $18,$31
;EH_JUDGEの衝突処理で消された敵との重複当たり判定防止
SBC $9,$31
JR Z,NEXT_JUDGE_E

LD $20,$25
LD $21,$11
AD $21,$13

;弾が敵に当たらない条件
;EX2($20)<BX1($1)=$1-$20>=0
;EX1($10)>BX2($22)=$10-$22>=0
;EY2($21)<BY1($2)=$2-$21>=0
;EY1($11)>BY2($23)=$11-$23>=0

SBC $1,$20
JR NC,NEXT_JUDGE_E ;範囲外
SBC $10,$22
JR NC,NEXT_JUDGE_E ;範囲外
SBC $2,$21
JR NC,NEXT_JUDGE_E ;範囲外
SBC $11,$23
JR NC,NEXT_JUDGE_E ;範囲外

;***************************
;*        HIT
;***************************

;得点の再描画フラグをONにする
PRE IX,REDRAW_SCORE
ST $30,(IX+$31)

;自弾の種類がBOMBならBOMBの処理へ
SBC $0,$30
JR NZ,BOMB_HIT
;敵に当たった自弾のアクティブフラグを消去
PRE IX,GUN_DATA
ST $31,(IX+$28)
JR NO_BOSS_CORE

BOMB_HIT:

SBC $9,9;BOSS CORE NO
JR NZ,NO_BOSS_CORE

PRE IZ,BOMB_BOSS_HIT
SBC (IZ+$31),$31
JP NZ,NEXT_JUDGE_E
ST $30,(IZ+$31);BOSS COREがBOMBに当たったフラフを立てる

NO_BOSS_CORE:

CAL GUN_HIT

NEXT_JUDGE_E:
AD $29,$8;$8=2(固定)
SBC $29,$19
JR C,EH_JUDGE_LOOP_E

NEXT_JUDGE_B:
AD $28,GUN_STRUCT
SBC $28,GUN_STRUCT*MY_GUN_MAX
JP C,EH_JUDGE_LOOP_B

RTN

;***********************************
;*          GUN_HIT
;*
;*      自弾が敵に当たった処理
;*
;*PARA:
;*      $9-$18  ENEMY DATA(ACTIVE,X,Y...SCORE,DAMAGE)
;*      $24     ENEMY POINTER
;*USE:
;*      IZ - ENEMY_DATA
;***********************************

GUN_HIT:
PRE IZ,ENEMY_DATA
;敵のLIFEを減じる
SB $16,$7
STM $9,(IZ+$24),8
JR NC,PUT_SPARK
;破壊した敵がボスのコアであればクリア処理へ
;PRE IX,NOW_BOSS_FIGHT
;SBC (IX+$31),$31
;JR Z,BREAK_NO_BOSS
SBC $9,BOSS_CORE_NO;アクティブフラグの値が9ならボスのコア
JR NZ,BREAK_NO_BOSS
LDW $0,100 ;ボスの破壊得点をセット
PRE IZ,SCORE
ADW (IZ+$31),$0 ;スコアを100点加算する
PPSW $0 ;GUN_HITのスタック開放
PPSW $0 ;JUDGE_BEのスタック開放
PPSW $0 ;JUDGEのスタック開放
JP BOSS_DEFEAT

;敵を消去
BREAK_NO_BOSS:
PHU $28
LD $28,$24
CAL DELETE_OBJECT;IZ破壊
PPU $28
;得点を加算
PRE IZ,SCORE
LD $18,$31
ADW (IZ+$31),$17
;次弾のX,Y-4の位置で爆発を発生させる
PUT_SPARK:
LD $10,$1
;SB $10,2
LD $11,$2
SB $11,4
CAL INS_SPARK

RTN

;******************
;*    BG_CLEAR
;******************
BG_CLEAR:
LDW $0,VIDEO_BUF;BG_START ADRESS
LDW $2,&HC0+&HC0+&HC0+&HC0;BG AREA SIZE
LDW $28,CLEME
CAL IOCS_CAL
RTN

;******************
;* BG_INITで呼び出す
;******************
@PUT_MAP:

BIU $15
BIU $15
BIU $15

PRE IX,STAGE_MAP_CHARA
LDW $0,(IX+$31)
PRE IX,$0
LDM $0,(IX+$15),8
PRE IZ,$18
STM $0,(IZ+$31),8

RTN

;******************
;* BG_INITで呼び出す
;******************
PUT_MAP:

PRE IX,$20
LD $15,(IX+$0);31)

BIU $15
BIU $15
BIU $15

PRE IZ,STAGE_MAP_CHARA
LDW $0,(IZ+$31)
PRE IX,$0

LDM $0,(IX+$15),8
PRE IZ,$18
STM $0,(IZ+$31),8

RTN

;*******************************
;*         CHECK MUTEKI
;*　　　　無敵カウンターを減じる
;*USE:  IZ
;*******************************
CHECK_MUTEKI:
;無敵カウンタを減じる
PRE IZ,MUTEKI_COUNTER
SBC (IZ+$31),$31
RTN Z
SB (IZ+$31),$30
RTN

;*******************************
;*       INIT_BG_SCROLL
;*      　カウンタの初期化
;*******************************

INIT_SCROLL:
PRE IX,MAP_READ_POINTER
PRE IZ,STAGE_MAP
LDW $0,(IZ+$31)
STW $0,(IX+$31)
RTN

;*******************************
;*          INIT_BG
;*
;*　ゲーム開始時に表示する背景を描画する
;*
;*USE:
;* $18,$19 仮想VRAMアドレス
;* $20,$21 MAP(シナリオ)データアドレス
;* $22,$23 キャラデータアドレス「
;* $24,$25 Y INC WORK(192)
;* $26,$27 MAP(シナリオ) INC WORK(5)
;* $28,$29 X INC WORK(8)
;*******************************
INIT_BG:

LDW $24,192
LDW $26,5
LDW $28,8

;LINE0
LDW $18,VIDEO_BUF+8
PRE IX,$18
PRE IZ,INIT_DATA_STAGE
LDW $20,(IZ+$31)
PHUW $21
PRE IZ,$20
CAL INIT_BG_X
PPUW $20

;LINE1
LDW $18,VIDEO_BUF+8+&HC0
PRE IX,$18
;LDW $20,INIT_DATA_STAGE1+1
ADW $20,$30
PHUW $21
PRE IZ,$20
CAL INIT_BG_X
PPUW $20

;LINE2
LDW $18,VIDEO_BUF+8+&HC0+&HC0
PRE IX,$18
;LDW $20,INIT_DATA_STAGE1+1+1
ADW $20,$30
PHUW $21
PRE IZ,$20
CAL INIT_BG_X
PPUW $20

;LINE3
LDW $18,VIDEO_BUF+8+&HC0+&HC0+&HC0
PRE IX,$18
;LDW $20,INIT_DATA_STAGE1+1+1+1
ADW $20,$30
PRE IZ,$20
CAL INIT_BG_X
RTN

INIT_BG_X:

LD $11,17 ;COUNTER=17

INIT_BG_LOOP_X:

LD $0,$31
CAL PUT_MAP

ADW $18,$28 ;VRAM+8
ADW $20,$26 ;MAP(シナリオ)+5

SB $11,$30
JR NZ,INIT_BG_LOOP_X
RTN

;*******************************
;*          BG_SCROLL
;*USE:
;*      $0,$1       MAP_READ_POINTER
;*      $2          SCROLL_COUNTER
;*******************************

BG_SCROLL:
SCROOL_LINE0:
PRE IX,VIDEO_BUF+9
PRE IZ,VIDEO_BUF+8
PRE IY,VIDEO_BUF+9+135
BUP

SCROOL_LINE1:
PRE IX,VIDEO_BUF+&HC0+9
PRE IZ,VIDEO_BUF+&HC0+8
PRE IY,VIDEO_BUF+&HC0+9+135
BUP

SCROOL_LINE2:
PRE IX,VIDEO_BUF+&HC0+&HC0+9
PRE IZ,VIDEO_BUF+&HC0+&HC0+8
PRE IY,VIDEO_BUF+&HC0+&HC0+9+135
BUP

SCROOL_LINE3:
PRE IX,VIDEO_BUF+&HC0+&HC0+&HC0+9
PRE IZ,VIDEO_BUF+&HC0+&HC0+&HC0+8
PRE IY,VIDEO_BUF+&HC0+&HC0+&HC0+9+135
BUP

PRE IX,SCROLL_COUNTER
LD $0,(IX+$31)
AD $0,$30
AN $0,&H07
ST $0,(IX+$31)
RTN NZ

PRE IX,MAP_READ_POINTER
LDW $20,(IX+$31)
PRE IZ,$20
LDM $24,(IZ+$31),5

PUT_MAP_ALL:
PUT_MAP_LINE0:
LDW $18,VIDEO_BUF+8+128
LD $15,$24
CAL @PUT_MAP

PUT_MAP_LINE1:
LDW $18,VIDEO_BUF+8+&HC0+128
LD $15,$25
CAL @PUT_MAP

PUT_MAP_LINE2:
LDW $18,VIDEO_BUF+8+&HC0+&HC0+128
LD $15,$26
CAL @PUT_MAP

PUT_MAP_LINE3:
LDW $18,VIDEO_BUF+8+&HC0+&HC0+&HC0+128
LD $15,$27
CAL @PUT_MAP

SENARIO_DATA:
;$28=EVENT NO
;WRITE SENARIO PROCESS

;シナリオポインター初期化
PRE IX,SENARIO_POINTER
ST $31,(IX+$31)

;REAR_ALERTコード確認
SBC $28,&HF0
JR NZ,CHECK_TBA_CODE
;REAR_ALERT表示フラグの設定、カウンタの初期化
PRE IX,ALERT
LDW $0,&H2001;FLAG=1(REAR),COUNT=32
STW $0,(IX+$31)
;異なるアラートが連続で表示された場合、以前のアラートが消去されないので
;予防のために別のアラート領域を消去する
LD $10,0;X
LD $11,8;Y
CAL ERASE_ALERT
LD $10,0;X
LD $11,32;Y
CAL ERASE_ALERT

;TOP OR BOTTOM ALERTコード確認
CHECK_TBA_CODE:
SBC $28,&HF1
JR NZ,CHECK_ITEM_CODE
;REAR_ALERT表示フラグの設定、カウンタの初期化
PRE IX,ALERT
LDW $0,&H2002;FLAG=2(TOP OR BOTTOM),COUNT=32
STW $0,(IX+$31)
;異なるアラートが連続で表示された場合、以前のアラートが消去されないので
;予防のために別のアラート領域を消去する
LD $10,0;X
LD $11,16;Y
CAL ERASE_ALERT
LD $10,0;X
LD $11,24;Y
CAL ERASE_ALERT

;ITEM出現コード確認
CHECK_ITEM_CODE:
SBC $28,&HF2
JR NZ,CHECK_BOSS_CODE
;ITEM出現フラグの設定、座標の初期化
PRE IX,ITEM_DATA
ST $30,(IX+$31)
LDW $0,&H1490;X=144,Y=20
STW $0,(IX+$30)

;ボス出現(終了)コード確認
CHECK_BOSS_CODE:
SBC $28,&HFF
RTN Z

;敵出現確認
SBC $28,$31
JR NZ,ENEMY_ENTRY
;ENEMY NO ENTRY
PRE IX,NOW_SENARIO
ST $31,(IX+$31)
ST $31,(IX+$30)
JR END_ENTRY_PROC

ENEMY_ENTRY:
LDW $26,SCENARIO
BIU $28
LD $29,$31
ADW $26,$28

PRE IX,$26
LDW $26,(IX+$31)

PRE IX,NOW_SENARIO
STW $26,(IX+$31)

END_ENTRY_PROC:
PRE IX,MAP_READ_POINTER
LDW $0,5
ADW $20,$0
STW $20,(IX+$31)

RTN

;*******************************
;*          DOTDS FX
;*******************************
DOTDS_FX:
LDW $28,DOTDS
CAL IOCS_CAL

PRE IX,CHR_WHITE
LDM $0,(IX+$31),8
PRE IZ,LEDTP0
STM $0,(IZ+$31),8
PRE IZ,LEDTP1
STM $0,(IZ+$31),8
PRE IZ,LEDTP2
STM $0,(IZ+$31),8
PRE IZ,LEDTP3
STM $0,(IZ+$31),8

RTN

;*******************************
;*          TRANS MAP
;*******************************

TRANS_START:EQU 8
TRANS_LEN:EQU 128

TRANS_MAP:

;LINE0
PRE IY,VIDEO_BUF+TRANS_START
PRE IX,VIDEO_BUF+TRANS_START+TRANS_LEN
PRE IZ,LEDTP3+TRANS_START+TRANS_LEN
BDN
;LINE1
PRE IY,&HC0+VIDEO_BUF+TRANS_START
PRE IX,&HC0+VIDEO_BUF+TRANS_START+TRANS_LEN
PRE IZ,LEDTP2+TRANS_START+TRANS_LEN
BDN
;LINE2
PRE IY,&HC0+&HC0+VIDEO_BUF+TRANS_START
PRE IX,&HC0+&HC0+VIDEO_BUF+TRANS_START+TRANS_LEN
PRE IZ,LEDTP1+TRANS_START+TRANS_LEN
BDN
;LINE3
PRE IY,&HC0+&HC0+&HC0+VIDEO_BUF+TRANS_START
PRE IX,&HC0+&HC0+&HC0+VIDEO_BUF+TRANS_START+TRANS_LEN
PRE IZ,LEDTP0+TRANS_START+TRANS_LEN
BDN

RTN

;******************************
;* 部分クリア
;******************************
CLS_L23:
PRE IX,CHR_WHITE
LDM $0,(IX+$31),8
PRE IX,LEDTP2
PRE IZ,LEDTP3
LD $10,192-8

CLS_L23_LOOP:
STM $0,(IX+$10),8
STM $0,(IZ+$10),8
SB $10,8
SBC $10,144
RTN C
JR CLS_L23_LOOP

;******************************
;* DOTDS互換
;******************************
;LCD Parameter
; LCD1:$9 ,$10,$11
; LCD2:$12,$13,$14

@DOTDS:

DISPLCD:
        LD      $9,&H82         ;Select LCD1
        LD      $10,16          ;Set LCD1 X Address = 24(48/2),$10
        LD      $11,$31         ;Set LCD1 Y Address = 16,0

        LD      $12,&H92        ;Select LCD2
        LD      $13,$31         ;Set LCD2 X Address = 0
        LD      $14,$31         ;Set LCD2 Y Address = 0,0

        PRE     IX,LEDTP0+8     ;Set LEDTP Address
        LD      $8,4            ;Set LCD line( = 4 )
LOOP:
        PPO     &HDF            ;Set LCD (Select command register)
        STLM    $9,3            ;Set LCD1 Parameter

        PPO     &HDE            ;Set LCD (Select data ram)
        CAL     DISPL           ;LEDTP --> LCD( 72 byte )

        PPO     &HDF            ;Set LCD (Select command register)
        STLM    $12,3           ;Set LCD2 Parameter

        PPO     &HDE            ;Set LCD (Select data ram)
        CAL     DISPR           ;LEDTP --> LCD( 48 byte )

        LDD     $0,(IX+8*8)     ;Set IX next line.(IX=IX+64)
        AD      $11,$30         ;Y Line +1
        AD      $14,$30         ;Y Line +1

        SB      $8,$30          ;finished ?
        JR      NZ,LOOP         ;

        RTN                     ;

;----------------------------------
; INPUT : IX -- LCDTP pointer
;----------------------------------
DISPL:
        LDIM    $0,(IX+$31),8   ;Read bit data ( 8byte )
        STLM    $0,8            ;Display LCD ( 8byte )

        LDIM    $0,(IX+$31),8   ;Read bit data ( 8byte )
        STLM    $0,8            ;Display LCD ( 8byte )

        LDIM    $0,(IX+$31),8   ;Read bit data ( 8byte )
        STLM    $0,8            ;Display LCD ( 8byte )

        LDIM    $0,(IX+$31),8   ;Read bit data ( 8byte )
        STLM    $0,8            ;Display LCD ( 8byte )

        LDIM    $0,(IX+$31),8   ;Read bit data ( 8byte )
        STLM    $0,8            ;Display LCD ( 8byte )

        LDIM    $0,(IX+$31),8   ;Read bit data ( 8byte )
        STLM    $0,8            ;Display LCD ( 8byte )
DISPR:
        LDIM    $0,(IX+$31),8   ;Read bit data ( 8byte )
        STLM    $0,8            ;Display LCD ( 8byte )

        LDIM    $0,(IX+$31),8   ;Read bit data ( 8byte )
        STLM    $0,8            ;Display LCD ( 8byte )

        LDIM    $0,(IX+$31),8   ;Read bit data ( 8byte )
        STLM    $0,8            ;Display LCD ( 8byte )

        LDIM    $0,(IX+$31),8   ;Read bit data ( 8byte )
        STLM    $0,8            ;Display LCD ( 8byte )

        LDIM    $0,(IX+$31),8   ;Read bit data ( 8byte )
        STLM    $0,8            ;Display LCD ( 8byte )

        RTN

#if (USE_LIB=FAST_LIB)

#else

;*********************************
;            BIN TO BCD
;PARAMETER
; $8,$9   BINARY DATA
; IZ      PUT BCD START ADRESS(EDTOP)
;USE
; $20     BCD CHR
; $21,$22 10000,1000,100,10,1
; $23     NUMBER OF DIGIT COUNTER
;**********************************

BTOB:

LD $23,$31;0 ;PUT MATH LOCATE
;PRE IZ,EDTOP1+27

LDW $21,10000
CAL CONV
LDW $21,1000
CAL CONV
LDW $21,100
CAL CONV
LDW $21,10
CAL CONV
LDW $21,$30
CAL CONV
RTN

CONV:
LD $20,&H30 ;CHR CODE "0"

LPCNV:
SBCW $8,$21
JP C,CONVE
SBW $8,$21
AD $20,$30
JP LPCNV

CONVE:
ST $20,(IZ+$23)
AD $23,$30
RTN

#endif

#include (STAGE_NO1.TXT)
#include (STAGE_NO2.TXT)
#include (STAGE_NO3.TXT)
#include (STAGE_NO4.TXT)
#include (STAGE_NO5.TXT)
#include (RESOURCE.TXT)
#include (GRAPHIC.TXT)
#include (D_GRAPHIC.TXT)

#if (MODEL=VX3)|(MODEL=VX4)|(MODEL=AI1000)
VIDEO_BUF:     DS 1151 ; 0
VIDEO_BUF_END: DS 1    ; &H047F
SG_CHR_DATA00: DS 128  ; &H0480
SG_CHR_DATA01: DS 128  ; &H0500
SG_CHR_DATA02: DS 128  ; &H0580
SG_CHR_DATA03: DS 128  ; &H0600
SG_CHR_DATA04: DS 128  ; &H0680
SG_CHR_DATA05: DS 128  ; &H0700
SG_CHR_DATA06: DS 128  ; &H0780
SG_CHR_DATA07: DS 128  ; &H0800
SG_CHR_DATA08: DS 128  ; &H0880
SG_CHR_DATA09: DS 128  ; &H0900
SG_CHR_DATA10: DS 128  ; &H0980
SG_CHR_DATA11: DS 128  ; &H0A00
SG_CHR_DATA12: DS 128  ; &H0A80
SG_CHR_DATA13: DS 128  ; &H0B00
SG_CHR_DATA14: DS 128  ; &H0B80
SG_CHR_DATA15: DS 128  ; &H0C00
SG_CHR_DATA16: DS 128  ; &H0C80
SG_CHR_DATA17: DS 128  ; &H0D00
SG_CHR_DATA18: DS 128  ; &H0D80
SG_CHR_DATA19: DS 128  ; &H0E00
SG_CHR_DATA20: DS 128  ; &H0E80
SG_CHR_DATA21: DS 128  ; &H0F00
SG_CHR_DATA22: DS 127  ; &H0F80
SG_CHR_DATA_END:  DS 1 ; 
#endif

;****************** ROC DATA ****************
