Mark Wickens

;---------------------------------------------------------------
; Cosmic Fly 
; a publich domain game for the Casio PB-1000
; written by Gernot Fink <gernot.fink@munich.netsurf.de>
; published by Andreas Wichmann on 2000-03-03 on
; http://www.itkp.uni-bonn.de/~wichmann/pb1000.html
;---------------------------------------------------------------
; rewrited by BLUE on 2003-02-16 for the Casio FX-870P/VX-4
; rewrited by BLUE on 2003-11-30 for the Casio VX-3
;---------------------------------------------------------------
; Gernot Fink氏が作成し、Andreas Wichmann氏のHPにPDS扱いで
; 公開されているCosmic FlyをFX-870P/VX-4/VX-3に移植しました。
; オリジナル版はBASIC+マシン語構成で、固定アドレス(&h7000〜)から
; しか実行できなかったのですが、こちらはオールマシン語でかつ
; 好きなアドレスに再アセンブル可能なように書き換えています。
; 実行には1520バイト以上のマシン語エリアを確保して下さい。
; 移植時に少々改造していますが、GAME自体はほぼオリジナルの通りです。
;
; HD61R041で正常にアセンブルできるように,RCS:のJP ($2)をJP $2に変更。
;---------------------------------------------------------------
FX870P:	EQU	1		;FX-870P
VX4:	EQU	2		;VX-4
VX3:	EQU	3		;VX-3
;---------------------------------------------------------------
; 機種の設定
;---------------------------------------------------------------
MODEL:	EQU	VX3		;VX3を選択

#if (MODEL=FX870P)|(MODEL=VX4)
LEDTP:	EQU	&H123C		;LCD先頭アドレス
IOBUF:	EQU	&H19D5		;SAVE/LOAD用 I/Oバッファ
;
DOTDS:	EQU	&H930F		;LCD再表示
BEEP:	EQU	&H33B3		;BEEP音発生
CLS:	EQU	&H2ADF		;画面消去(PRINT CHR$(12)と同等)
CROFF:	EQU	&H032E		;カーソルOFF(KYIN時のカーソル表示をOFFにする)
KYIN:	EQU	&H03A4		;標準キー入力処理($0に入力されたキーコードが入る)
INKEY:	EQU	&H191D		;INKEY
BIOS2:	EQU	&H5323		;BIOS(BANK0)をコールしてBANK1に戻る時のスタック値
#if MODEL=FX870P
BASE:	EQU	0		;プログラム格納アドレス(FX-870P)
#else
BASE:	EQU	&H1CD0		;プログラム格納アドレス(FX-870P/VX-4)
#endif
#endif
#if MODEL=VX3
LEDTP:	EQU	&H6343		;LCD表示ドットバッファ
IOBUF:	EQU	&H69CE		;SAVE/LOAD用 I/Oバッファ
;
KYIN:	EQU	&H03D1	;標準キー入力処理($0に入力されたキーコードが入る)
CROFF:	EQU	&H1FAE	;カーソルON(KYIN時のカーソル表示をOFFにする)
DOTDS:	EQU	&H1FD5		;LCD画面表示
CLS:	EQU	&H31CF		;画面消去(PRINT CHR$(12)と同等)
INKEY:	EQU	&H194E		;INKEY$処理
BEEP:	EQU	&H3A8B		;BEEP0
BIOS2:	EQU	&H5CA9		;BIOS(BANK0)をコールしてBANK1に戻る時のスタック値
BASE:	EQU	&H6CD0		;プログラム格納アドレス
#endif

	ORG	BASE			;←各自の環境に合わせてリロケートしてください
	START	MAIN
;-----------------------------------------------------
; MAIN処理
; 入力:なし
; 出力:なし
;-----------------------------------------------------
MAIN:
	PRE	IX,LEDTP+192*4		;利用ワークエリア(192バイト)を待避する
	PRE	IY,LEDTP+192*5-1	;
	PRE	IZ,IOBUF		;待避先=IOBUF
	BUP				;

	LDW	$0,SCORE		;SCOREクリア
	STW	0,($0)			;

TOP:
	LDW	$0,SHIPNUM		;SHIP残機初期化
	ST	3,($0)			;(3機)
	CAL	SSH			;FLYデータ初期化

	CAL	DISPTITLE		;TITLE表示
LOOP:
	CAL	INIT			;初期化
	CAL	GAME			;GAME処理
	JR	Z,BASIC			;BRK入力でBASICに戻る

	CAL	@BEEP			;SHIP破壊音(BEEP)
	CAL	@BEEP			;

	PRE	IZ,SHIPNUM		;SHIP残機更新
	SB	(IZ+$31),$30		;-1
	JR	NZ,LOOP			;

	PRE	IZ,SCORE		;SCORE/HISCORE取り出し
	LDIW	$0,(IZ+$31)		;(SCORE)
	LDW	$2,(IZ+$31)		;(HISCORE)
	SBCW	$2,$0			;HISCORE < SCORE ?
	JR	NC,MAIN0		;
	STW	$0,(IZ+$31)		;HISCORE更新
MAIN0:
	CAL	RELOAD			;ワークエリア情報復帰
	CAL	STATUS			;HI,SC,SHIP表示
	CAL	OVER			;GAMEOVER処理
	JR	Z,TOP			;SPC入力で再ゲーム

BASIC:
	CAL	RELOAD			;ワークエリア情報復帰
	PST	UA,&H54			;BASICに戻る
	RTN				;(BANK0)

;-----------------------------------------------------
;ワークエリア情報復帰
;-----------------------------------------------------
RELOAD:
	PRE	IZ,LEDTP+192*4		;利用ワークエリア(192バイト)を復帰する
	PRE	IX,IOBUF		;待避データ格納先=IOBUF
	PRE	IY,IOBUF+191		;
	BUP				;
	RTN				;

;-----------------------------------------------------
;画面及びワークエリア初期化
;-----------------------------------------------------
INIT:
	CAL	@CLS			;CLS

	PRE	IX,BOMBWK		;BOMB WORKクリア
	XRW	$0,$0			;
	LD	$2,8			;
WKCLR:	STIW	$0,(IX+$31)		;
	SB	$2,$30			;
	JR	NZ,WKCLR		;
	CAL	STATUS			;HI,SC,SHIP表示
	RTN

;-----------------------------------------------------
; SCORE/HI-SOCRE/残機数 表示
;-----------------------------------------------------
STATUS:	PRE	IZ,LEDTP+192+126	;HI-SC表示
	LDW	$0,HI			;
	OR	$3,$30			;
	CAL	PRINT			;
	LDW	$0,HISCORE		;HISCORE表示
	LDW	$0,($0)			;
	PRE	IZ,LEDTP+&H161		;
	CAL	NUM			;

	PRE	IZ,LEDTP+(192*2)+126	;SC表示
	LDW	$0,SC			;
	CAL	PRINT			;
	LDW	$0,SCORE		;SCORE表示
	LDW	$0,($0)			;
	PRE	IZ,LEDTP+&H221		;
	CAL	NUM			;

	PRE	IZ,LEDTP+(192*3)+126	;SHIP表示
	LDW	$0,SH			;
	CAL	PRINT			;

	LDW	$0,SHIPNUM		;SHIP残機数取り出し
	LD	$20,($0)		;
	AN	$20,$20			;残機ゼロなら空白を表示
	JR	Z,STR0			;
	PRE	IX,SHIPCHR		;SHIP表示データセット
STR:
	LDM	$0,(IX+$31),6		;SHIP表示
	STIM	$0,(IZ+$31),6		;
	SB	$20,$30			;
	JR	NZ,STR			;
	RTN
STR0:
	XRM	$0,$0,6			;表示パターンクリア
	STIM	$0,(IZ+$31),6		;空白表示
	RTN

;-----------------------------------------------------
; TITLE画面
;-----------------------------------------------------
DISPTITLE:
	CAL	@CLS			;CLS

	PRE	IZ,LEDTP		;TITLE1表示
	LDW	$0,TITLE1		;
	OR	$3,$30			;
	CAL	PRINT			;
	PRE	IZ,LEDTP+192		;TITLE2表示
	LDW	$0,TITLE2		;
	CAL	PRINT			;
	PRE	IZ,LEDTP+(192*2)	;TITLE3表示
	LDW	$0,TITLE3		;
	CAL	PRINT			;
	PRE	IZ,LEDTP+(192*3)	;TITLE4表示
	LDW	$0,TITLE4		;
	CAL	PRINT			;

	CAL	STATUS			;HI,SC,SHIP表示

	CAL	@BEEP			;BEEP

	CAL	@DOTDS			;DISPLAY LCD

	LDW	$0,SCORE		;SCOREクリア
	STW	0,($0)			;

;-----------------------------------------------------
; [EXE]キー入力待ち
;-----------------------------------------------------
KEYWAIT:
#if 0
	LDW	$2,INKEY		;INKEY$実行
	CAL	RCS			;
	SBC	$17,$31			;
	JR	Z,KEYWAIT		;

	LDW	$0,($15)		;[EXE]入力まで待つ
#else
	LDW	$2,CROFF		;カーソル表示OFF
	CAL	RCS			;

	LDW	$2,KYIN			;KYINを実行
	CAL	RCS			;
#endif
	SBC	$0,&H0D			;
	JR	NZ,KEYWAIT		;
	RTN

;-----------------------------------------------------
; GAME OVER処理
;-----------------------------------------------------
OVER:
	PRE	IZ,LEDTP+200		;GAME OVER表示
	LDW	$0,GAMEOVER		;
	OR	$3,$30			;
	CAL	PRINT			;
	PRE	IZ,LEDTP+(192*2)+24	;KEY TITLE表示
	LDW	$0,KEYTITLE		;
	CAL	PRINT			;

	CAL	@DOTDS			;DISPLAY LCD

	CAL	KEYWAIT			;[EXE]入力まで待つ
	RTN

;-----------------------------------------------------
; ゲームメイン処理
;-----------------------------------------------------
GAME:
;	XRW	$19,$19			;ワーク初期化
	LD	$22,$31			;SCORE表示要求フラグ初期化

	GPO	$0			;BEEP用データ取り出し
	AN	$0,127			;
	OR	$0,64			;
	PST	PD,$0			;中くらいの音量を設定

	LDW	$27,&H2C00		;SHIP位置 初期値セット
	XRW	$24,$24			;
;	PST	IA,&H3D			;KEYスキャンコード設定(乱数用)
L1:	CAL	SHT			;音だし処理
	SB	$29,$30			;
	JR	NZ,L1			;
	LD	$29,90			;・IV(MIN70)

	CAL	KEY			;KEY 入力
	RTN	Z			;BRKにて終了

	AD	$17,$30			;FLY処理は2スキャンに一回実行
	ANC	$17,$30			;
	JR	Z,LO2			;
	CAL	FLY			;FLY 移動
LO2:	CAL	SHIP			;SHIP 移動

	ANC	$17,$30			;画面更新要求あり ?
	JR	Z,LO1			;NO --> LO1

	CAL	@DOTDS			;DISPLAY LCD

	AN	$22,$22			;SCORE表示要求あり
	JR	Z,LO1			;NO --> LO1

	LDW	$0,SCORE		;SCORE 取り出し
	LDW	$0,($0)			;
	PRE	IZ,LEDTP+&H221		;SCOER表示アドレス設定
	CAL	NUM			;SCORE表示
	LD	$22,$31			;

LO1:	SBC	$28,255			;SHIP破壊
	JR	NZ,L1			;NO --> LO1
	OR	$0,$30			;
	RTN

;-----------------------------------------------------
; KEY入力処理
;-----------------------------------------------------
KEY:	PST	IA,5			;KEYスキャンコード設定
	CAL	SCAN			;
	SBC	$0,&H04			;左[4]
	JR	NZ,K1			;
	SBC	$28,$31			;座標0なら処理終了
	JR	Z,K1			;
	SB	$28,2			;

K1:	PST	IA,7			;KEYスキャンコード設定
	CAL	SCAN			;
	SBC	$0,&H1			;右[6]
	JR	NZ,K2			;
	SBC	$28,100			;
	JR	Z,K2			;
	AD	$28,2			;

K2:	PST	IA,9			;KEYスキャンコード設定
	CAL	SCAN			;
	SBC	$0,&H04			;SHOT[0]
	JR	NZ,K3			;
	ANC	$25,255			;
	JR	NZ,K3			;
	LD	$27,$30			;

K3:	PST	IA,1			;KEYスキャンコード設定
	CAL	SCAN			;
	SBC	$0,&H80			;BRK以外ならノンゼロ状態でリターン
	RTN	NZ			;
	XR	$0,$0			;BRKを押されたらゼロフラグを立てる
	RTN

;-----------------------------------------------------
; キースキャン処理
;-----------------------------------------------------
SCAN:	GRE	KY,$0			;キー入力(1)
	GRE	KY,$1			;キー入力(2)
	SBC	$0,$1			;(1)=(2)ならば、入力データを信用する。
	JR	NZ,SCAN			;
	RTN

;-----------------------------------------------------
; SHIP移動/ミサイル制御
;-----------------------------------------------------
SHIP:	SBC	$28,255			;SHIP破壊されたら、処理終了
	RTN	Z
	PRE	IX,LEDTP+&H23E		;LCD表示アドレス設定
	LDI	$0,(IX+$28)
	ANC	$27,7
	JR	Z,SH2
	XRC	$23,255
	JR	Z,SH2
	GRE	IX,$24
SH2:	PRE	IZ,SHIPG		;SHIP描画データアドレスセット
	LD	$0,13
SH1:	LD	$1,(IZ+$0)
	LD	$9,(IX+$0)
	AN	$9,248
	OR	$1,$9
	ST	$1,(IX+$0)
	SB	$0,$30
	JR	NZ,SH1
	LDW	$0,LEDTP-2
	SBCW	$24,$0
	JR	C,SH5
	LD	$0,255
	PRE	IX,$24
	LD	$2,(IX+7)
	SBC	$2,7
	JR	Z,SH8
	ANC	$2,255
SH8:	ST	$0,(IX+7)
	JR	NZ,TR
	SBC	$2,7
	LDW	$0,192
	ST	$1,(IX+199)
	SBW	$24,$0,JR SH4
SH5:	ANC	$25,255
	JR	Z,SH6
	PRE	IX,$24
	LD	$0,$31
	ST	$0,(IX+199)
SH6:	LD	$25,$31
SH4:	RTN

;-----------------------------------------------------
; FLY破壊処理
;-----------------------------------------------------
TR:	LD	$23,255			;FLY破壊セット
	LDW	$16,$30
	LD	$22,$30			;SCORE更新要求セット

	LDW	$2,SCORE		;SCORE取り出し
	LDW	$0,($2)			;
	ADBW	$0,$16			;SCORE増加(+1)
	STW	$0,($2)			;SCORE更新

	LD	$25,$31			;
	ST	$25,(IX+199)		;
	LD	$27,5			;
	GRE	IX,$19			;FLY画面アドレス保存
	PRE	IZ,CRASHG		;爆発用データセット
CLEX:	LD	$0,12
T1:	LDI	$1,(IZ+$31)		;FLY爆発パターン表示
	STI	$1,(IX+$31)		;
	LD	$1,(IZ+11)		;
	ST	$1,(IX+191)		;
	SB	$0,$30
	JR	NZ,T1
	RTN

;-----------------------------------------------------
; 音だし
;-----------------------------------------------------
SHT:	GPO	$2			;現在のポート状態を読み出す
	LDW	$0,4
	ANC	$27,255			;通常の音だし
	JR	Z,W2
	SBW	$26,$0
	SBC	$23,255			;FLY爆発音 ?
	JR	Z,W4
	ANC	$26,$23
	JR	Z,W1
W4:	XR	$2,192			;ポート反転(音出し)
	PST	PD,$2
W1:	RTN

W2:	LD	$23,&H21
	ANC	$20,255
	JR	Z,NC1
	PRE	IZ,SHIPWK		;0パターンを描画する(&H739E)
	PRE	IX,$19			;FLY画面アドレスセット
	CAL	CLEX
	LD	$20,$31
NC1:	RTN

;-----------------------------------------------------
; FLY移動/BOMB制御
;-----------------------------------------------------
FLY:	LD	$13,8			;FLY機数読み込み(MAX8)
	LDW	$14,FLYDAT		;FLYデータエリアポインタ設定
	LD	$12,$31			;
Y1:	LDW	$2,($14)
	CAL	SHAPE			;FLY消去
	ADW	$14,$30			;FLYワークアドレス更新
	ADW	$14,$30
	SB	$13,$30			;FLY機数が無くなるまで繰り返し
	JR	NZ,Y1

;	CAL	BOMB
	CAL	BOMB			;BOMB処理

	LD	$13,8			;FLY機数読み込み
	LDW	$14,FLYDAT		;FLYデータエリアポインタ設定 &HC0
	LD	$10,$31

Y2:	PRE	IX,$14			;IX = FLYデータエリアポインタ

	GRE	KY,$0			;KEYレジスタを乱数の種とする
	LD	$0,$31			;

	LD	$11,(IX+$31)		;$11 = FLY座標
	SBC	$28,$11			;
	JR	C,NORE			;

	LD	$0,2			;$0 = 2

NORE:	GST	TM,$11			;$11 = (TM xor FLYカウンタ値) and 5
	XR	$11,$13			;
	AN	$11,5			;
	JR	Z,ZIEL			;
	LD	$0,$1			;$0 = $1(KEYコード)

ZIEL:	AN	$0,2			;BIT<1>取り出し(0 or 2)
	LD	$1,(IX+$31)		;$1 = FLY座標
	XRC	$1,255			;FLY 破壊されている?
	JR	Z,Y3			;次のFLY処理へ

	LD	$10,$30			;$10 = 1
	SBC	$1,100			;FLY座標 < 100 ?
	JR	NC,Y4			;
	AD	(IX+$31),$0		;FLY座標更新+2(または0)

Y4:	LD	$0,$30			;$0 = 1
	ANC	$1,255			;FLY画面端($1 = 255) ?
	JR	Z,Y5			;YES --> Y5
	SB	(IX+$31),$0		;FLY座標更新-2(または0)

Y5:	LD	$1,(IX+$30)		;$1 = FLYステータス
	ANC	$1,255			;FLY破壊
	JR	Z,B3			;
	SB	(IX+$30),$0		;

B3:	GST	TM,$0			;$0 = TMレジスタ
	XR	$0,$8			;
	AN	$0,$30			;
	BIU	$0			;
	LD	$1,(IX+$30)		;$1 = FLYステータス
	SBC	$1,15			;$1 > 15
	JR	NC,B2			;
	AD	(IX+$30),$0		;
B2:	LDW	$2,($14)		;
	LD	$12,255			;
	CAL	SHAPE			;

Y3:	ADW	$14,$30			;FLYワークアドレス更新
	ADW	$14,$30			;

	SB	$13,$30			;FLYカウント -1
	JR	NZ,Y2

	ANC	$10,$30			;FLY残機なし
	JR	Z,SSH			;FLYワークデータを初期化する
	RTN

;-----------------------------------------------------
; FLY座標初期化
;-----------------------------------------------------
SSH:	PRE	IX,FLYDAT		;FLYワーク先頭ポインタ設定
	LD	$10,16			;ワークバイト数=16

SSH1:	LD	$0,(IX+16)		;1バイト転送
	STI	$0,(IX+$31)		;

	SB	$10,$30			;転送終了
	JR	NZ,SSH1
	RTN

;-----------------------------------------------------
; FLY表示処理
;-----------------------------------------------------
SHAPE:	LD	$9,$31			;$9 = 0

	XRC	$2,255			;処理要求あり
	JR	Z,NOSH			;

	LD	$0,$3			;$0 = FLYステータス(Y座標)
	AN	$0,7			;マスク(07h)

	AN	$2,127			;FLY X座標マスク(7fh)
	LD	$1,$3			;$1 = FLYステータス
	PRE	IX,LEDTP-1		;LCD画面先頭座標セット(&H6200)

S1:	ANC	$1,&H18			;ステータス BIT<4>=0 and BIT<0>=0 ?
	JR	Z,S2			;

	LDI	$4,(IX+191)		;画面座標更新(IX=IX+192)
	SB	$1,8,JR S1		;ステータス更新(-8)

S2:	LDI	$4,(IX+$2)		;FLY表示
	PRE	IZ,FLYG			;
	LD	$4,5
S3:	LD	$6,(IZ+$4)
	LD	$5,$31
	LD	$8,$0

	XRC	$12,$31
	JR	Z,S5

S4:	ANC	$8,7
	JR	Z,S5
	BIDW	$6
	SB	$8,$30,JR S4

S5:	LD	$8,(IX+$31)		;
	XR	$8,$6			;
	AN	$8,$12			;
	ST	$8,(IX+$31)		;
	LD	$8,(IX+192)		;

	SBC	$8,&HAA
	JR	NZ,SHA1

	LD	$12,15			;FLY破壊セット
	LD	$9,255			;
	ST	$9,($14)		;

SHA1:	XR	$8,$5
	AN	$8,$12

	ST	$8,(IX+192)
	LDI	$8,(IX+$31)

	SB	$4,$30
	JR	NZ,S3
NOSH:	RTN

;-----------------------------------------------------
; BOMB処理
;-----------------------------------------------------
BOMB:	LDW	$0,BOMBWK		;FLYDATA+&H20;&H73E0
	AD	$21,$30			;FLYカウント更新
	LD	$2,8			;BOMB個数(MAX15)

B1:	LDW	$6,($0)			;BOMB座標読み込み
	ANC	$6,255			;画面端で無ければ、描画処理(B9)へ
	JR	NZ,B9			;

	LDW	$3,FLYDAT		;FLY座標取り込み(&H73C0)
	LD	$5,$21			;FLYカウント値を代入
	AD	$21,$30			;+1(カウント更新)
	AN	$5,7			;$5 = $5 MOD 7
	BIU	$5			;*2
	OR	$3,$5			;&H73C0+(0,2,4,..,14)
	LDW	$3,($3)			;FLY座標読み込み

	SBC	$3,255			;FLY破壊なら、次のBOMB処理へ
	JR	Z,B8			;

	OR	$3,$30			;$3 = $3 or 1
	STW	$3,($0)			;ワークアリア内容更新
	LDW	$6,$3			;更新した座標を与える

B9:	LD	$3,$7			;BOMB表示処理
	PRE	IX,LEDTP-1		;&H6200
	LDI	$8,(IX+$6)		;BOMB座標データ読み込み
	LD	$6,128			;

B4:	AN	$3,7			;
	JR	Z,B12			;
	BID	$6			;
	SB	$3,$30,JR B4		;

B12:	SBC	$7,30			;
	JR	NZ,B6			;

	LD	$6,7			;BOMB発射音
	CAL	SB			;

B6:	AN	$7,&H18			;
	JR	Z,B7			;

	LDI	$3,(IX+191)
	SB	$7,8,JR B6

B7:	ST	$6,(IX+2)
	AN	$6,127
	JR	NZ,B10
	ST	$6,(IX-190)
B10:	LDW	$6,($0)
	AD	$7,$30
	STW	$6,($0)
	SBC	$7,32
	JR	C,B8
	LD	$3,$31
	ST	$3,(IX+2)

	SB	$6,$28			;SHIP破壊?
	SB	$6,9			;
	JR	NC,B11			;NO-->B11
	LD	$28,255			;SHIP破壊セット

B11:	XRW	$6,$6			;BOMBワーク消滅
	STW	$6,($0)			;

B8:	ADW	$0,$30			;ワークアドレス更新
	ADW	$0,$30			;

	SB	$2,$30			;BOMB数 -1
	JP	NC,B1
	RTN

;-----------------------------------------------------
; BOMB用音だし処理
;-----------------------------------------------------
SB:	LD	$12,3			;音出し処理
SB1:	GPO	$13			;
	XR	$13,192			;音の状態を反転する
	PST	PD,$13			;
	SB	$12,$30			;設定された回数分、繰り返す
	JR	NZ,SB1			;
	RTN

;-----------------------------------------------------
; SCORE表示
; BANK2先頭にあるFONTデータを使って得点を表示する
; 入力 IZ=LCD表示開始アドレス
;-----------------------------------------------------
NUM:
	GST	UA,$2			;BANK保存
	PST	UA,&H65			;BANK 2設定(IX)
	LD	$3,4			;表示桁設定(5桁)
LL:	
	PRE	IX,&H10*6		;数字FONTアドレス先頭指定
	LD	$4,$1			;最上位桁取り出し
	AN	$4,&HF0			;

	BID	$4			;フォントアドレス計算
	LD	$5,$4			;
	BID	$5			;
	BID	$5			;
	SB	$4,$5			;

	LDM	$5,(IX+$4),6		;フォント表示
	STIM	$5,(IZ+$31),6		;

	DIUW	$0			;桁下げ
	SB	$3,$30			;
	JR	NC,LL			;

	PST	UA,$2			;BANKを元に戻す
	RTN

;-----------------------------------------------------
; PRINT 処理
; IZから始まるLCD画面上に($0)で指定された文字列を表示する。
; 入力:$0,$1=指定文字列ポインタ
;       $3=文字反転(0以外:NORMAL、0:反転)
;       IZ= LCD表示ポインタ
; 破壊されるレジスタ IZ,IX,$0〜$8
;-----------------------------------------------------
PRINT:
PRL:
	LD	$4,($0)			;1文字取り出し
	AN	$4,$4			;NULLなら終了
	JR	Z,PREND			;

	SB	$4,&H20			;キャラクタコード補正

	LD	$5,$31			;フォントアドレス計算
	BIUW	$4			;*2(2倍)
	LDW	$6,$4			;
	BIUW	$6			;*2(4倍)
	ADW	$4,$6			;(6倍を作成)
	PRE	IX,$4			;FONTアドレス指定

	GST	UA,$2			;BANK保存
	PST	UA,&H65			;BANK 2設定(IX)
	LDM	$4,(IX+$31),6		;FONT読み込み
	PST	UA,$2			;BANKを元に戻す

	STIM	$4,(IZ+$31),6		;FONT表示

	ADW	$0,$30			;文字列ポインタ更新
	JR	PRL			;
PREND:
	RTN

;-----------------------------------------------------
; CLS
;-----------------------------------------------------
@CLS:
	LDW	$2,CLS			;CLS
	JR	RCS			;

;-----------------------------------------------------
; BEEP発生
;-----------------------------------------------------
@BEEP:
	LDW	$2,BEEP			;BEEP
	JR	RCS			;

;-----------------------------------------------------
; LCD再表示
;-----------------------------------------------------
@DOTDS:
	LDW	$2,DOTDS		;DISPLAY LCD

;-----------------------------------------------------
; BIOSルーチン呼び出し処理
;-----------------------------------------------------
RCS:	LDW	$0,BIOS2
	PHSW	$1
	PST	UA,&H54
	JP	$2

;-----------------------------------------------------
; ワーク/変数
;-----------------------------------------------------
SHIPNUM:DB	0			;SHIP残機数ワーク
SCORE:	DW	0			;SCOREデータ
HISCORE:DW	0			;HI-SCOREデータ

;-----------------------------------------------------
; 表示文字列
;-----------------------------------------------------
TITLE1:	DB	"## Cosmic Fly ##",0
TITLE2:	DB	"Key Function",0
TITLE3:	DB	"Left[4] Right[6]",0
TITLE4:	DB	"Shot[0] Start[EXE]",0
GAMEOVER:DB	"** GAME OVER **",0
KEYTITLE:DB	"PUSH [EXE]",0
HI:	DB	"HI-SC:",0
SC:	DB	"SCORE:",0
SH:	DB	"SHIP :",0
SHIPCHR:DB	&H04,&H0C,&H1C,&H0C,&H04,&H00	;SHIPキャラクタ

;-----------------------------------------------------
; FLY & BOMB用表示データ/ワークエリア
;-----------------------------------------------------
;16バイトアライン上にデータを格納する必要がある
GDATA:	ORG	(GDATA+16)#&HFFF0
SHIPG:	DB	0,0,0,&H01,&H03,&H03,&H03,&H07,&H03,&H03,&H03,&H01,&H00
FLYG:	DB	0,&HC0,&HD0,&H20,&HD0,&HC0,&H00,&H00,&H00
CRASHG:	DB	&H51,&H0A,&HA5,&H8F,&H46,&HAA,&H49,&HAA,&H8F,&HA5,&H0A,&H51
	DB	&H8A,&H50,&HA5,&HF2,&H4E,&HAA,&H4B,&HAA,&HF2,&HA5,&H50,&H8A
SHIPWK:	DB	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	DS	10
FLYDAT:	DB	&H00,&H01,&H18,&H03,&H38,&H07,&H58,&H03
	DB	&H00,&H11,&H18,&H12,&H38,&H13,&H58,&H14
	DB	&H00,&H01,&H18,&H03,&H38,&H07,&H58,&H03
	DB	&H00,&H10,&H18,&H10,&H38,&H10,&H58,&H10
BOMBWK:	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